createInstance: function(name){ var instance = Soundbank(audioContext) var ditty = Ditty(clock) var exclude = {} instance.on('change', function(data){ exclude['144/' + data.id] = data.exclude }) instance.looper = MidiLooper(clock.getCurrentPosition, {exclude: exclude}) instance.name = name // feedback loop ditty.pipe(instance).pipe(instance.looper).pipe(ditty) // connect to output instance.connect(audioContext.destination) // stream to interfaces streams.forEach(function(stream){ connectInstance(instance, stream) }) instances[name] = instance return instance },
module.exports = function(midiGrabber){ var repeater = Ditty() var release = null var downNotes = [] var repeatLength = 1 repeater.setLength = function(value){ repeatLength = value refresh() } repeater.start = function(length){ if (!release){ release = midiGrabber.grab(function(data){ if (data[2]) down(data) else up(data) }) } if (length){ repeater.setLength(length) } } repeater.stop = function(){ if (release){ release() release = null } } function down(data){ downNotes.push(data) refresh() } function up(data){ downNotes = downNotes.filter(function(note){ return !(note[0] == data[0] && note[1] == data[1]) }) refresh() } function refresh(){ repeater.setNotes(downNotes.map(function(data){ return { key: data[0] + '/' + data[1], on: data, off: [data[0], data[1], 0], position: 0, length: repeatLength/2 } }), repeatLength) } return repeater }
function createInstance(audioContext, output, midiStream){ var instance = Soundbank(audioContext) instance.playback = Playback(instance) var scheduler = audioContext.scheduler var ditty = Ditty(scheduler) midiStream.on('error', function(err){ console.log(err) }) var exclude = {} var noRepeat = {} var loopTransforms = {} instance.on('refresh', function(data){ var overrideTransform = !!data.loopTransform exclude['144/' + data.id] = data.exclude noRepeat['144/' + data.id] = data.noRepeat || overrideTransform loopTransforms['144/' + data.id] = data.loopTransform }) instance.looper = MidiLooper(scheduler.getCurrentPosition, { exclude: exclude, noRepeat: noRepeat, loopTransforms: loopTransforms }) // controller instance.controller = Launchpad(midiStream, instance.looper) instance.quantizer = Quantizer(scheduler.getCurrentPosition) scheduler.pipe(instance.controller).pipe(instance.quantizer).pipe(instance.playback) // sampler instance.sampler = SoundRecorder(instance.controller, instance) // feedback loop ditty.pipe(instance.playback).pipe(instance.looper).pipe(ditty) // connect to output instance.connect(output) return instance }
function addRemoteInstance(){ var instance = Soundbank(window.context.audio) instance.playback = Playback(instance) var scheduler = window.context.audio.scheduler var ditty = Ditty(scheduler) // feedback loop ditty.pipe(instance.playback) instance.loop = ditty // connect our remote output to the original audio context instance.connect(window.context.outputFromRemote) window.context.remoteInstances.push(instance) return instance }