UNPKG

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