genish.js
Version:
55 lines (36 loc) • 1.32 kB
JavaScript
const gen = require( './gen.js' ),
data = require( './data.js' ),
poke = require( './poke.js' ),
peek = require( './peek.js' ),
sub = require( './sub.js' ),
wrap = require( './wrap.js' ),
accum= require( './accum.js'),
memo = require( './memo.js' )
const proto = {
basename:'delay',
gen() {
let inputs = gen.getInputs( this )
gen.memo[ this.name ] = inputs[0]
return inputs[0]
},
}
const defaults = { size: 512, interp:'none' }
module.exports = ( in1, taps, properties ) => {
const ugen = Object.create( proto )
let writeIdx, readIdx, delaydata
if( Array.isArray( taps ) === false ) taps = [ taps ]
const props = Object.assign( {}, defaults, properties )
const maxTapSize = Math.max( ...taps )
if( props.size < maxTapSize ) props.size = maxTapSize
delaydata = data( props.size )
ugen.inputs = []
writeIdx = accum( 1, 0, { max:props.size, min:0 })
for( let i = 0; i < taps.length; i++ ) {
ugen.inputs[ i ] = peek( delaydata, wrap( sub( writeIdx, taps[i] ), 0, props.size ),{ mode:'samples', interp:props.interp })
}
ugen.outputs = ugen.inputs // XXX ugh, Ugh, UGH! but i guess it works.
poke( delaydata, in1, writeIdx )
ugen.name = `${ugen.basename}${gen.getUID()}`
return ugen
}