Schedule a looped sequence of Web Audio events using bopper clock source.
You can pipe the output through soundbank-trigger if you want to use with soundbank.
BREAKING CHANGES: The API has changed significantly in the version 2 release. Now supports multiple loop channels with differing lengths.
Install via npm
$ npm install ditty
var Ditty = require('ditty')
var ditty = Ditty()
Creates a realtime-transform stream. Pipe in schedule events and stream out the looped events added to the input schedule.time
.
var Bopper = require('bopper')
var audioContext = new AudioContext()
var scheduler = Bopper(audioContext)
schedule.pipe(ditty).on('data', function(data){
// data: id, event (start or stop), time, position, args
if (data.event == 'start'){
noteOn(data.id, data.time)
} else if (data.event == 'stop'){
noteOff(data.id, data.time)
}
})
Input:
{
from: 0,
to: 1.0,
time: audioContext.currentTime,
beatLength: tempo / 60
}
Output:
{
id: 'C',
position: 0.5, // preserved from ditty.set
event: 'start', // or 'stop' for the off note
time: schedule.time + delta
}
Schedule a set of start/stop events
for the given id
. This will override any loop already set on this id
.
events
is an array of arrays:
[
[beatPosition, length, args...],
[beatPosition, length, args...],
...
]
// schedule a C -> F -> G -> F midi sequence
ditty.set(60, [ // midi C
[0, 0.9], [1, 0.9]
], 8)
ditty.set(65, [ // midi F
[2.0, 0.9], [3.0, 0.9], [5.5, 0.4], [6.5, 0.4], [7.0, 0.4], [7.5, 0.4],
], 8)
ditty.set(67, [ // midi G
[4.0, 0.4], [5.0, 0.4]
], 8)
Returns the event sequence as set
.
Returns the loopLength
as specified for set
.
Returns an array of objects describing the state of all loops.
Push a loop descriptor in to restore the state of the given loop at descriptor.id
.
Whenever a loop is updated, the 'change'
event is emitted with the new loop descriptor (id
, events
, length
).
To run the example npm install && npm install --global beefy
then beefy example.js
and navigate to http://localhost:9966/