gibberish-dsp
Version:
Gibberish is designed to be an optimized API for audio synthesis using per-sample techniques.
64 lines (49 loc) • 1.57 kB
JavaScript
let g = require( 'genish.js' ),
effect = require( './effect.js' )
module.exports = function( Gibberish ) {
let RingMod = inputProps => {
let props = Object.assign( {}, RingMod.defaults, effect.defaults, inputProps ),
ringMod = Object.create( effect ),
out
ringMod.__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' ),
frequency = g.in( 'frequency' ),
gain = g.in( 'gain' ),
mix = g.in( 'mix' )
const leftInput = isStereo ? g.mul( input[0], inputGain ) : g.mul( input, inputGain ),
sine = g.mul( g.cycle( frequency ), gain )
const left = g.add( g.mul( leftInput, g.sub( 1, mix )), g.mul( g.mul( leftInput, sine ), mix ) )
if( isStereo === true ) {
const rightInput = g.mul( input[1], inputGain ),
right = g.add( g.mul( rightInput, g.sub( 1, mix )), g.mul( g.mul( rightInput, sine ), mix ) )
ringMod.graph = [ left, right ]
}else{
ringMod.graph = left
}
}
ringMod.__createGraph()
ringMod.__requiresRecompilation = [ 'input' ]
out = Gibberish.factory(
ringMod,
ringMod.graph,
[ 'fx','ringMod'],
props
)
return out
}
RingMod.defaults = {
input:0,
frequency:220,
gain: 1,
mix:1
}
return RingMod
}