gibberish-dsp
Version:
Gibberish is designed to be an optimized API for audio synthesis using per-sample techniques.
86 lines (65 loc) • 2.24 kB
JavaScript
const g = require( 'genish.js' ),
effect = require( './effect.js' )
module.exports = function( Gibberish ) {
const Vibrato = inputProps => {
const props = Object.assign( {}, Vibrato.defaults, effect.defaults, inputProps ),
vibrato = Object.create( effect )
let out
vibrato.__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 = 44100,
feedbackCoeff = g.in( 'feedback' ),
modAmount = g.in( 'amount' ),
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 readIdx = g.wrap(
g.add(
g.sub( writeIdx, offset ),
g.mul( g.cycle( frequency ), g.sub( offset, 1 ) )
),
0,
delayLength
)
const leftInput = isStereo ? g.mul( input[0], inputGain ) : g.mul( input, inputGain )
const delayedOutL = g.peek( delayBufferL, readIdx, { interp:'linear', mode:'samples' })
g.poke( delayBufferL, g.add( leftInput, g.mul( delayedOutL, feedbackCoeff ) ), writeIdx )
const left = delayedOutL
if( isStereo === true ) {
const rightInput = g.mul( input[1], inputGain )
const delayBufferR = g.data( delayLength )
const delayedOutR = g.peek( delayBufferR, readIdx, { interp:'linear', mode:'samples' })
g.poke( delayBufferR, g.add( rightInput, mul( delayedOutR, feedbackCoeff ) ), writeIdx )
const right = delayedOutR
vibrato.graph = [ left, right ]
}else{
vibrato.graph = left
}
}
vibrato.__createGraph()
vibrato.__requiresRecompilation = [ 'input' ]
out = Gibberish.factory(
vibrato,
vibrato.graph,
[ 'fx', 'vibrato' ],
props
)
return out
}
Vibrato.defaults = {
input:0,
feedback:.01,
amount:.5,
frequency:4
}
return Vibrato
}