UNPKG

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
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 }