gibberish-dsp
Version:
Gibberish is designed to be an optimized API for audio synthesis using per-sample techniques.
90 lines (66 loc) • 2.29 kB
JavaScript
let g = require( 'genish.js' ),
proto = require( './effect.js' )
module.exports = function( Gibberish ) {
let Flanger = inputProps => {
let props = Object.assign( { delayLength:44100 }, Flanger.defaults, proto.defaults, inputProps ),
flanger = Object.create( proto ),
out
flanger.__createGraph = function() {
let isStereo = false
if( out === undefined ) {
isStereo = typeof props.input.isStereo !== 'undefined' ? props.input.isStereo : false
}else{
isStereo = out.input.isStereo
out.isStereo = isStereo
}
const input = g.in( 'input' ),
inputGain = g.in( 'inputGain' ),
delayLength = props.delayLength,
feedbackCoeff = g.in( 'feedback' ),
modAmount = g.in( 'offset' ),
frequency = g.in( 'frequency' ),
delayBufferL = g.data( delayLength )
const writeIdx = g.accum( 1,0, { min:0, max:delayLength, interp:'none', mode:'samples' })
const offset = g.mul( modAmount, 500 )
const mod = props.mod === undefined ? g.cycle( frequency ) : props.mod
const readIdx = g.wrap(
g.add(
g.sub( writeIdx, offset ),
mod//g.mul( mod, g.sub( offset, 1 ) )
),
0,
delayLength
)
const leftInput = isStereo ? input[0] : input
const delayedOutL = g.peek( delayBufferL, readIdx, { interp:'linear', mode:'samples' })
g.poke( delayBufferL, g.add( leftInput, g.mul( delayedOutL, feedbackCoeff ) ), writeIdx )
const left = g.add( leftInput, delayedOutL )
if( isStereo === true ) {
const rightInput = input[1]
const delayBufferR = g.data( delayLength )
let delayedOutR = g.peek( delayBufferR, readIdx, { interp:'linear', mode:'samples' })
g.poke( delayBufferR, g.add( rightInput, g.mul( delayedOutR, feedbackCoeff ) ), writeIdx )
const right = g.add( rightInput, delayedOutR )
flanger.graph = [ left, right ]
}else{
flanger.graph = left
}
}
flanger.__createGraph()
flanger.__requiresRecompilation = [ 'input' ]
out = Gibberish.factory(
flanger,
flanger.graph,
['fx','flanger'],
props
)
return out
}
Flanger.defaults = {
input:0,
feedback:.81,
offset:.125,
frequency:1
}
return Flanger
}