-
Notifications
You must be signed in to change notification settings - Fork 1
/
example.js
64 lines (54 loc) · 1.33 KB
/
example.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
master = new AudioContext
var jsynth = require('jsynth')
var nvelope = require('nvelope')
var jigger = require('jigger')
var generator = new jigger()
var oscillators = require('oscillators');
var sync = require('jsynth-sync') // jsynth-sync
var bpm = 66
var timer = sync(bpm, master.sampleRate)
var generators = [];
var beatmath = require('beatmath')
var onbeat = beatmath(24, [5,11,17,23])
unswing = false
var t0 = timer.on(1/4, function(ti, b, off, swing){
if(unswing){
swing(0)
unswing = false
}
var x = onbeat(b)
if(x){
if(x == 5) {
swing(3/16)
}
else if(x == 4) {
onbeat = beatmath(12, [5,11, 17, 23])
swing(5/8)
}
else if(x == 11) {
swing(1/2)
}
else{
swing(4/5)
}
unswing = true
}
var attack = [[0,0], [0,1], [1,1]]
var release = [[0,1], [0,0], [1, 0]]
var y = x == 5 ? 1/4 : 1/2
var durations = [.02, bpm / 60 * y ]
var amod = {}
amod.curves = [attack, release];
amod.durations = durations;
var mod = nvelope(amod.curves, amod.durations);
var synth = function(t){
return oscillators.sine(t, b % 2 == 0 ? (y == 11 ? 54 * 4/5:54):54 * 2) * mod(t - ti)
}
generator.set(ti, synth, amod)
})
var synth = function(t, s, i){
timer.tick.call(timer, t)
return generator.tick(t, s, i)
}
dsp = jsynth(master, synth)
dsp.connect(master.destination)