@plotdb/sfx 0.0.0-stage → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js ADDED
@@ -0,0 +1,3417 @@
1
+ (function(){
2
+ (function(){
3
+ var SR, S, ctx, bus, isBuffer, peaks, voice, mediaVoice, stopVoice, jitter, currentMusic, stopTimeline, startTimeline, hook, NOTES, rng, make, coef, biquad, biquadTv, noise, env, pan, synth, place, partial, fadeOut, wander, glideOsc, COMB, ALLPASS, reverb, glide, grain, pick, bubble, SURFACE, pink, formantVoice, mix, ease, bar, CHORDS, string, metal, ring, gauss, KIT, VEL, parseScore, TWINKLE, resample, wrap, k, PARAMS, name, spec, v, SEMI, NAMES, transpose;
4
+ if (typeof window !== 'undefined' && window.sfx) {
5
+ return;
6
+ }
7
+ SR = 48000;
8
+ S = {
9
+ buffers: {},
10
+ urls: {},
11
+ items: [],
12
+ voices: [],
13
+ errors: [],
14
+ external: false,
15
+ playing: false,
16
+ rate: 1
17
+ };
18
+ ctx = null;
19
+ S.ctx = function(){
20
+ var AC, i$, ref$, len$, b;
21
+ if (ctx) {
22
+ return ctx;
23
+ }
24
+ AC = window.AudioContext || window.webkitAudioContext;
25
+ ctx = new AC();
26
+ S.master = ctx.createGain();
27
+ S.master.connect(ctx.destination);
28
+ S.buses = {};
29
+ for (i$ = 0, len$ = (ref$ = ['music', 'sfx', 'voice']).length; i$ < len$; ++i$) {
30
+ b = ref$[i$];
31
+ S.buses[b] = ctx.createGain();
32
+ S.buses[b].connect(S.master);
33
+ }
34
+ return ctx;
35
+ };
36
+ bus = function(name){
37
+ S.ctx();
38
+ return S.buses[name] || S.buses.sfx;
39
+ };
40
+ S.resume = function(){
41
+ var c;
42
+ c = S.ctx();
43
+ if (c.state === 'suspended') {
44
+ return c.resume();
45
+ } else {
46
+ return Promise.resolve();
47
+ }
48
+ };
49
+ S.volume = function(name, v, dur){
50
+ var g, now;
51
+ dur == null && (dur = 0.2);
52
+ S.ctx();
53
+ g = name === 'master'
54
+ ? S.master
55
+ : S.buses[name];
56
+ if (!g) {
57
+ return;
58
+ }
59
+ now = ctx.currentTime;
60
+ g.gain.cancelScheduledValues(now);
61
+ g.gain.setValueAtTime(g.gain.value, now);
62
+ return g.gain.linearRampToValueAtTime(v, now + Math.max(0.01, dur));
63
+ };
64
+ isBuffer = function(v){
65
+ return !!(v && typeof v === 'object' && typeof v.getChannelData === 'function' && v.sampleRate);
66
+ };
67
+ S.pending = 0;
68
+ S.load = function(map){
69
+ map == null && (map = {});
70
+ S.pending += Object.keys(map).length;
71
+ return Promise.all(Object.keys(map).map(function(name){
72
+ var v, p;
73
+ v = map[name];
74
+ p = isBuffer(v)
75
+ ? Promise.resolve(v)
76
+ : v && v.then
77
+ ? v
78
+ : fetch(v).then(function(r){
79
+ if (!r.ok) {
80
+ throw new Error(v + ": HTTP " + r.status);
81
+ }
82
+ return r.arrayBuffer();
83
+ }).then(function(ab){
84
+ return new Promise(function(res, rej){
85
+ return S.ctx().decodeAudioData(ab, res, rej);
86
+ });
87
+ });
88
+ if (typeof v === 'string') {
89
+ S.urls[name] = v;
90
+ }
91
+ return p.then(function(buf){
92
+ return S.buffers[name] = buf;
93
+ })['catch'](function(e){
94
+ return S.errors.push("load " + name + ": " + (e.message || e));
95
+ })['finally'](function(){
96
+ return S.pending--;
97
+ });
98
+ })).then(function(){
99
+ return S.buffers;
100
+ });
101
+ };
102
+ peaks = new WeakMap();
103
+ S.peak = function(buf){
104
+ var d, w, env, max, i$, to$, i, s, j$, to1$, j;
105
+ if (peaks.has(buf)) {
106
+ return peaks.get(buf);
107
+ }
108
+ d = buf.getChannelData(0);
109
+ w = Math.max(1, Math.round(buf.sampleRate * 0.003));
110
+ env = new Float32Array(Math.ceil(d.length / w));
111
+ max = 0;
112
+ for (i$ = 0, to$ = env.length; i$ < to$; ++i$) {
113
+ i = i$;
114
+ s = 0;
115
+ for (j$ = i * w, to1$ = Math.min(d.length, (i + 1) * w); j$ < to1$; ++j$) {
116
+ j = j$;
117
+ s += d[j] * d[j];
118
+ }
119
+ env[i] = Math.sqrt(s / w);
120
+ if (env[i] > max) {
121
+ max = env[i];
122
+ }
123
+ }
124
+ i = 0;
125
+ while (i < env.length - 1 && env[i] < max * 0.8) {
126
+ i++;
127
+ }
128
+ while (i < env.length - 1 && env[i + 1] > env[i]) {
129
+ i++;
130
+ }
131
+ peaks.set(buf, i * w / buf.sampleRate);
132
+ return peaks.get(buf);
133
+ };
134
+ voice = function(name, opt){
135
+ var buf, c, src, g, when_, level, offset, end, v;
136
+ opt == null && (opt = {});
137
+ buf = isBuffer(name)
138
+ ? name
139
+ : S.buffers[name];
140
+ if (!buf) {
141
+ S.errors.push("unknown sound: " + name);
142
+ return null;
143
+ }
144
+ c = S.ctx();
145
+ src = c.createBufferSource();
146
+ src.buffer = buf;
147
+ src.loop = !!opt.loop;
148
+ src.playbackRate.value = opt.rate || 1;
149
+ g = c.createGain();
150
+ src.connect(g);
151
+ g.connect(bus(opt.bus || 'sfx'));
152
+ when_ = opt.when || c.currentTime;
153
+ level = opt.gain != null ? opt.gain : 1;
154
+ if (opt.fadeIn) {
155
+ g.gain.setValueAtTime(0, when_);
156
+ g.gain.linearRampToValueAtTime(level, when_ + opt.fadeIn);
157
+ } else {
158
+ g.gain.setValueAtTime(level, when_);
159
+ }
160
+ offset = opt.offset || 0;
161
+ if (opt.duration != null) {
162
+ end = when_ + opt.duration;
163
+ if (opt.fadeOut) {
164
+ g.gain.setValueAtTime(level, Math.max(when_, end - opt.fadeOut));
165
+ g.gain.linearRampToValueAtTime(0, end);
166
+ }
167
+ src.start(when_, offset, src.loop
168
+ ? undefined
169
+ : opt.duration * (opt.rate || 1));
170
+ if (src.loop) {
171
+ src.stop(end);
172
+ }
173
+ } else {
174
+ src.start(when_, offset);
175
+ }
176
+ v = {
177
+ name: name,
178
+ src: src,
179
+ gain: g,
180
+ level: level,
181
+ ended: false
182
+ };
183
+ src.onended = function(){
184
+ v.ended = true;
185
+ return S.voices = S.voices.filter(function(x){
186
+ return x !== v;
187
+ });
188
+ };
189
+ S.voices.push(v);
190
+ return v;
191
+ };
192
+ mediaVoice = function(name, opt){
193
+ var c, a, g, when_, level, end, v, go, delay;
194
+ opt == null && (opt = {});
195
+ c = S.ctx();
196
+ a = new Audio();
197
+ a.crossOrigin = 'anonymous';
198
+ a.preload = 'auto';
199
+ a.preservesPitch = true;
200
+ a.loop = !!opt.loop;
201
+ a.src = S.urls[name];
202
+ a.playbackRate = opt.rate || 1;
203
+ g = c.createGain();
204
+ c.createMediaElementSource(a).connect(g);
205
+ g.connect(bus(opt.bus || 'music'));
206
+ when_ = opt.when || c.currentTime;
207
+ level = opt.gain != null ? opt.gain : 1;
208
+ if (opt.fadeIn) {
209
+ g.gain.setValueAtTime(0, when_);
210
+ g.gain.linearRampToValueAtTime(level, when_ + opt.fadeIn);
211
+ } else {
212
+ g.gain.setValueAtTime(level, when_);
213
+ }
214
+ if (opt.duration != null && opt.fadeOut) {
215
+ end = when_ + opt.duration;
216
+ g.gain.setValueAtTime(level, Math.max(when_, end - opt.fadeOut));
217
+ g.gain.linearRampToValueAtTime(0, end);
218
+ }
219
+ v = {
220
+ name: name,
221
+ media: a,
222
+ gain: g,
223
+ level: level,
224
+ ended: false,
225
+ timers: []
226
+ };
227
+ go = function(){
228
+ var seekThenPlay;
229
+ if (v.ended) {
230
+ return;
231
+ }
232
+ seekThenPlay = function(){
233
+ a.currentTime = opt.offset || 0;
234
+ return a.play()['catch'](function(){});
235
+ };
236
+ if (a.readyState >= 1) {
237
+ return seekThenPlay();
238
+ } else {
239
+ return a.addEventListener('loadedmetadata', seekThenPlay, {
240
+ once: true
241
+ });
242
+ }
243
+ };
244
+ delay = Math.max(0, when_ - c.currentTime);
245
+ v.timers.push(setTimeout(go, delay * 1000));
246
+ if (opt.duration != null) {
247
+ v.timers.push(setTimeout(function(){
248
+ return stopVoice(v, 0.02);
249
+ }, (delay + opt.duration) * 1000));
250
+ }
251
+ a.onended = function(){
252
+ v.ended = true;
253
+ return S.voices = S.voices.filter(function(x){
254
+ return x !== v;
255
+ });
256
+ };
257
+ S.voices.push(v);
258
+ return v;
259
+ };
260
+ stopVoice = function(v, fade){
261
+ var now, i$, ref$, len$, h, e;
262
+ fade == null && (fade = 0.05);
263
+ if (!v || v.ended) {
264
+ return;
265
+ }
266
+ now = ctx.currentTime;
267
+ v.gain.gain.cancelScheduledValues(now);
268
+ v.gain.gain.setValueAtTime(v.gain.gain.value, now);
269
+ v.gain.gain.linearRampToValueAtTime(0, now + fade);
270
+ if (v.media) {
271
+ for (i$ = 0, len$ = (ref$ = v.timers).length; i$ < len$; ++i$) {
272
+ h = ref$[i$];
273
+ clearTimeout(h);
274
+ }
275
+ v.ended = true;
276
+ setTimeout(function(){
277
+ v.media.pause();
278
+ v.media.removeAttribute('src');
279
+ return v.media.load();
280
+ }, (fade + 0.02) * 1000);
281
+ S.voices = S.voices.filter(function(x){
282
+ return x !== v;
283
+ });
284
+ return;
285
+ }
286
+ try {
287
+ return v.src.stop(now + fade + 0.01);
288
+ } catch (e$) {
289
+ return e = e$;
290
+ }
291
+ };
292
+ jitter = function(vary, h1, h2){
293
+ return {
294
+ rate: Math.pow(2, (h1 * 2 - 1) * vary / 12),
295
+ gain: 1 - vary * 0.3 * h2
296
+ };
297
+ };
298
+ S.play = function(name, opt){
299
+ var j, ref$, v;
300
+ opt == null && (opt = {});
301
+ S.resume();
302
+ if (Array.isArray(name)) {
303
+ name = name[Math.floor(Math.random() * name.length)];
304
+ }
305
+ if (opt.vary) {
306
+ j = jitter(opt.vary, Math.random(), Math.random());
307
+ opt = (ref$ = import$({}, opt), ref$.rate = (opt.rate || 1) * j.rate, ref$.gain = (opt.gain != null ? opt.gain : 1) * j.gain, ref$);
308
+ }
309
+ v = voice(name, opt);
310
+ if (!v) {
311
+ return null;
312
+ }
313
+ v.manual = true;
314
+ return {
315
+ stop: function(fade){
316
+ return stopVoice(v, fade);
317
+ },
318
+ fade: function(to, dur){
319
+ var now;
320
+ dur == null && (dur = 0.5);
321
+ now = ctx.currentTime;
322
+ v.gain.gain.cancelScheduledValues(now);
323
+ v.gain.gain.setValueAtTime(v.gain.gain.value, now);
324
+ return v.gain.gain.linearRampToValueAtTime(to, now + dur);
325
+ },
326
+ voice: v
327
+ };
328
+ };
329
+ S.stop = function(name, opt){
330
+ var i$, ref$, len$, v, results$ = [];
331
+ opt == null && (opt = {});
332
+ for (i$ = 0, len$ = (ref$ = S.voices).length; i$ < len$; ++i$) {
333
+ v = ref$[i$];
334
+ if (v.manual && (!name || v.name === name)) {
335
+ results$.push(stopVoice(v, opt.fade || 0.05));
336
+ }
337
+ }
338
+ return results$;
339
+ };
340
+ currentMusic = null;
341
+ S.music = function(name, opt){
342
+ var fade;
343
+ opt == null && (opt = {});
344
+ fade = opt.fade != null ? opt.fade : 1;
345
+ if (currentMusic) {
346
+ currentMusic.stop(fade);
347
+ }
348
+ currentMusic = null;
349
+ if (!name) {
350
+ return null;
351
+ }
352
+ currentMusic = S.play(name, import$({
353
+ loop: true,
354
+ bus: 'music',
355
+ fadeIn: fade
356
+ }, opt));
357
+ return currentMusic;
358
+ };
359
+ S.timeline = function(items){
360
+ items == null && (items = []);
361
+ S.items = items.map(function(it, k){
362
+ var h, j;
363
+ it = import$({}, it);
364
+ if (Array.isArray(it.sound) || it.vary) {
365
+ h = rng(((k + 1) * 2654435761 ^ Math.round((it.t || 0) * 1000) * 40503) >>> 0);
366
+ h();
367
+ if (Array.isArray(it.sound)) {
368
+ it.sound = it.sound[Math.floor(h() * it.sound.length)];
369
+ }
370
+ if (it.vary) {
371
+ j = jitter(it.vary, h(), h());
372
+ it.rate = (it.rate || 1) * j.rate;
373
+ it.gain = (it.gain != null ? it.gain : 1) * j.gain;
374
+ }
375
+ }
376
+ return it;
377
+ });
378
+ if (S.playing) {
379
+ S.transport({
380
+ playing: true,
381
+ t: S.t || 0,
382
+ force: true
383
+ });
384
+ }
385
+ return S;
386
+ };
387
+ S.cues = function(cues, opt){
388
+ cues == null && (cues = []);
389
+ opt == null && (opt = {});
390
+ return S.timeline(cues.map(function(c){
391
+ return import$({
392
+ t: c.t,
393
+ sound: c.sfx || c.sound,
394
+ gain: c.gain
395
+ }, opt);
396
+ }));
397
+ };
398
+ stopTimeline = function(){
399
+ var i$, ref$, len$, v, results$ = [];
400
+ for (i$ = 0, len$ = (ref$ = S.voices).length; i$ < len$; ++i$) {
401
+ v = ref$[i$];
402
+ if (!v.manual) {
403
+ results$.push(stopVoice(v, 0.03));
404
+ }
405
+ }
406
+ return results$;
407
+ };
408
+ startTimeline = function(t0){
409
+ var c, now, R, i$, ref$, len$, it, buf, b, lead, start, len, skip, opt, ref1$, results$ = [];
410
+ c = S.ctx();
411
+ now = c.currentTime + 0.02;
412
+ R = S.rate || 1;
413
+ for (i$ = 0, len$ = (ref$ = S.items).length; i$ < len$; ++i$) {
414
+ it = ref$[i$];
415
+ buf = S.buffers[it.sound];
416
+ if (!buf) {
417
+ continue;
418
+ }
419
+ b = it.bus || 'sfx';
420
+ lead = (it.align || (b === 'sfx' ? 'peak' : 'start')) === 'peak' ? S.peak(buf) : 0;
421
+ start = it.t - lead;
422
+ len = it.loop
423
+ ? (it.until != null ? it.until : 1e9) - start
424
+ : it.duration || buf.duration / (it.rate || 1);
425
+ if (start + len <= t0) {
426
+ continue;
427
+ }
428
+ skip = Math.max(0, t0 - start);
429
+ opt = (ref1$ = import$({}, it), ref1$.bus = b, ref1$.when = now + Math.max(0, start - t0) / R, ref1$.duration = (len - skip) / R, ref1$.rate = (it.rate || 1) * R, ref1$);
430
+ opt.offset = (it.offset || 0) + (it.loop
431
+ ? skip % buf.duration
432
+ : skip * (it.rate || 1));
433
+ if (skip > 0 && it.fadeIn) {
434
+ opt.fadeIn = 0;
435
+ }
436
+ if (R !== 1 && (b === 'voice' || b === 'music') && S.urls[it.sound]) {
437
+ results$.push(mediaVoice(it.sound, opt));
438
+ } else {
439
+ results$.push(voice(buf, opt));
440
+ }
441
+ }
442
+ return results$;
443
+ };
444
+ S.transport = function(arg$){
445
+ var ref$, playing, t, ref1$, force, from, rate, was;
446
+ ref$ = arg$ != null
447
+ ? arg$
448
+ : {}, playing = ref$.playing, t = (ref1$ = ref$.t) != null ? ref1$ : 0, force = ref$.force, from = ref$.from, rate = ref$.rate;
449
+ if (from && from !== 'player') {
450
+ S.external = true;
451
+ }
452
+ if (rate != null && +rate > 0 && +rate !== S.rate) {
453
+ S.rate = +rate;
454
+ force = true;
455
+ }
456
+ was = S.playing;
457
+ S.playing = !!playing;
458
+ S.t = t;
459
+ S.tAt = (ctx && ctx.currentTime) || 0;
460
+ if (!playing) {
461
+ return stopTimeline();
462
+ }
463
+ S.resume();
464
+ if (was && !force) {
465
+ return;
466
+ }
467
+ stopTimeline();
468
+ return startTimeline(t);
469
+ };
470
+ hook = function(L){
471
+ var P, play, seek;
472
+ if (!L || !L.player || L.player.__sound) {
473
+ return;
474
+ }
475
+ P = L.player.prototype;
476
+ play = P.play;
477
+ seek = P.seek;
478
+ P.play = function(go){
479
+ var r;
480
+ go == null && (go = true);
481
+ r = play.apply(this, arguments);
482
+ if (!S.external) {
483
+ S.transport({
484
+ playing: this.playing,
485
+ t: this.t
486
+ });
487
+ }
488
+ return r;
489
+ };
490
+ P.seek = function(t){
491
+ var last, r;
492
+ last = this.t;
493
+ r = seek.apply(this, arguments);
494
+ if (!S.external && this.started) {
495
+ if (this.playing && (this.t < last - 0.01 || this.t - last > 0.3)) {
496
+ S.transport({
497
+ playing: true,
498
+ t: this.t,
499
+ force: true
500
+ });
501
+ }
502
+ if (!this.playing && S.playing) {
503
+ S.transport({
504
+ playing: false,
505
+ t: this.t
506
+ });
507
+ }
508
+ }
509
+ return r;
510
+ };
511
+ return L.player.__sound = true;
512
+ };
513
+ if (window.lotion) {
514
+ hook(window.lotion);
515
+ } else {
516
+ document.addEventListener('DOMContentLoaded', function(){
517
+ return hook(window.lotion);
518
+ });
519
+ }
520
+ S.render = function(duration, opt){
521
+ var sr, oc, i$, ref$, len$, it, buf, b, lead, start, src, g, level, at, len;
522
+ opt == null && (opt = {});
523
+ sr = opt.sampleRate || SR;
524
+ oc = new OfflineAudioContext(2, Math.ceil(duration * sr), sr);
525
+ for (i$ = 0, len$ = (ref$ = S.items).length; i$ < len$; ++i$) {
526
+ it = ref$[i$];
527
+ buf = S.buffers[it.sound];
528
+ if (!buf) {
529
+ continue;
530
+ }
531
+ b = it.bus || 'sfx';
532
+ lead = (it.align || (b === 'sfx' ? 'peak' : 'start')) === 'peak' ? S.peak(buf) : 0;
533
+ start = it.t - lead;
534
+ src = oc.createBufferSource();
535
+ src.buffer = buf;
536
+ src.loop = !!it.loop;
537
+ src.playbackRate.value = it.rate || 1;
538
+ g = oc.createGain();
539
+ level = it.gain != null ? it.gain : 1;
540
+ g.gain.value = level;
541
+ src.connect(g);
542
+ g.connect(oc.destination);
543
+ at = Math.max(0, start);
544
+ if (it.fadeIn) {
545
+ g.gain.setValueAtTime(0, at);
546
+ g.gain.linearRampToValueAtTime(level, at + it.fadeIn);
547
+ }
548
+ len = it.loop
549
+ ? (it.until != null ? it.until : duration) - start
550
+ : it.duration || buf.duration / (it.rate || 1);
551
+ if (it.fadeOut) {
552
+ g.gain.setValueAtTime(level, Math.max(at, start + len - it.fadeOut));
553
+ g.gain.linearRampToValueAtTime(0, start + len);
554
+ }
555
+ src.start(at, (it.offset || 0) + Math.max(0, -start));
556
+ src.stop(start + len);
557
+ }
558
+ return oc.startRendering();
559
+ };
560
+ S.wav = function(buf){
561
+ var ch, n, dv, w, data, res$, i$, c, o, i, j$, v;
562
+ ch = buf.numberOfChannels;
563
+ n = buf.length;
564
+ dv = new DataView(new ArrayBuffer(44 + n * ch * 2));
565
+ w = function(o, s){
566
+ var i$, to$, i, results$ = [];
567
+ for (i$ = 0, to$ = s.length; i$ < to$; ++i$) {
568
+ i = i$;
569
+ results$.push(dv.setUint8(o + i, s.charCodeAt(i)));
570
+ }
571
+ return results$;
572
+ };
573
+ w(0, 'RIFF');
574
+ dv.setUint32(4, 36 + n * ch * 2, true);
575
+ w(8, 'WAVE');
576
+ w(12, 'fmt ');
577
+ dv.setUint32(16, 16, true);
578
+ dv.setUint16(20, 1, true);
579
+ dv.setUint16(22, ch, true);
580
+ dv.setUint32(24, buf.sampleRate, true);
581
+ dv.setUint32(28, buf.sampleRate * ch * 2, true);
582
+ dv.setUint16(32, ch * 2, true);
583
+ dv.setUint16(34, 16, true);
584
+ w(36, 'data');
585
+ dv.setUint32(40, n * ch * 2, true);
586
+ res$ = [];
587
+ for (i$ = 0; i$ < ch; ++i$) {
588
+ c = i$;
589
+ res$.push(buf.getChannelData(c));
590
+ }
591
+ data = res$;
592
+ o = 44;
593
+ for (i$ = 0; i$ < n; ++i$) {
594
+ i = i$;
595
+ for (j$ = 0; j$ < ch; ++j$) {
596
+ c = j$;
597
+ v = Math.max(-1, Math.min(1, data[c][i]));
598
+ dv.setInt16(o, v < 0
599
+ ? v * 0x8000
600
+ : v * 0x7fff, true);
601
+ o += 2;
602
+ }
603
+ }
604
+ return new Blob([dv], {
605
+ type: 'audio/wav'
606
+ });
607
+ };
608
+ S.report = function(){
609
+ return {
610
+ loaded: Object.keys(S.buffers).map(function(k){
611
+ return {
612
+ name: k,
613
+ duration: +S.buffers[k].duration.toFixed(2),
614
+ peak: +S.peak(S.buffers[k]).toFixed(3)
615
+ };
616
+ }),
617
+ timeline: S.items.length,
618
+ playing: S.playing,
619
+ context: ctx ? ctx.state : null,
620
+ errors: S.errors.slice(-10)
621
+ };
622
+ };
623
+ NOTES = {
624
+ C: -9,
625
+ D: -7,
626
+ E: -5,
627
+ F: -4,
628
+ G: -2,
629
+ A: 0,
630
+ B: 2
631
+ };
632
+ S.freq = function(n){
633
+ var m, semi;
634
+ if (typeof n === 'number') {
635
+ return n;
636
+ }
637
+ m = /^([A-G])(#|b)?(-?\d)$/.exec(n);
638
+ if (!m) {
639
+ return 440;
640
+ }
641
+ semi = NOTES[m[1]] + (m[2] === '#'
642
+ ? 1
643
+ : m[2] === 'b' ? -1 : 0) + (+m[3] - 4) * 12;
644
+ return 440 * Math.pow(2, semi / 12);
645
+ };
646
+ rng = function(seed){
647
+ var s;
648
+ seed == null && (seed = 1);
649
+ s = seed >>> 0 || 1;
650
+ return function(){
651
+ s = s * 1664525 + 1013904223 >>> 0;
652
+ return s / 4294967296;
653
+ };
654
+ };
655
+ make = function(dur, fn, opt){
656
+ var n, L, R, max, i$, i, k, buf;
657
+ opt == null && (opt = {});
658
+ n = Math.max(1, Math.round(dur * SR));
659
+ L = new Float32Array(n);
660
+ R = new Float32Array(n);
661
+ fn(L, R, n);
662
+ max = 0;
663
+ for (i$ = 0; i$ < n; ++i$) {
664
+ i = i$;
665
+ max = Math.max(max, Math.abs(L[i]), Math.abs(R[i]));
666
+ }
667
+ k = max > 0 ? (opt.peak || 0.9) / max : 1;
668
+ buf = new AudioBuffer({
669
+ length: n,
670
+ sampleRate: SR,
671
+ numberOfChannels: 2
672
+ });
673
+ for (i$ = 0; i$ < n; ++i$) {
674
+ i = i$;
675
+ L[i] *= k;
676
+ R[i] *= k;
677
+ }
678
+ buf.copyToChannel(L, 0);
679
+ buf.copyToChannel(R, 1);
680
+ return buf;
681
+ };
682
+ coef = function(type, f, q){
683
+ var w, cs, al;
684
+ w = 2 * Math.PI * Math.min(f, SR * 0.49) / SR;
685
+ cs = Math.cos(w);
686
+ al = Math.sin(w) / (2 * q);
687
+ switch (type) {
688
+ case 'lp':
689
+ return [(1 - cs) / 2, 1 - cs, (1 - cs) / 2, 1 + al, -2 * cs, 1 - al];
690
+ case 'hp':
691
+ return [(1 + cs) / 2, -(1 + cs), (1 + cs) / 2, 1 + al, -2 * cs, 1 - al];
692
+ default:
693
+ return [al, 0, -al, 1 + al, -2 * cs, 1 - al];
694
+ }
695
+ };
696
+ biquad = function(d, type, f, q){
697
+ var ref$, b0, b1, b2, a0, a1, a2, x1, x2, y1, y2, i$, to$, i, x, y;
698
+ q == null && (q = 0.707);
699
+ ref$ = coef(type, f, q), b0 = ref$[0], b1 = ref$[1], b2 = ref$[2], a0 = ref$[3], a1 = ref$[4], a2 = ref$[5];
700
+ x1 = x2 = y1 = y2 = 0;
701
+ for (i$ = 0, to$ = d.length; i$ < to$; ++i$) {
702
+ i = i$;
703
+ x = d[i];
704
+ y = (b0 * x + b1 * x1 + b2 * x2 - a1 * y1 - a2 * y2) / a0;
705
+ x2 = x1;
706
+ x1 = x;
707
+ y2 = y1;
708
+ y1 = y;
709
+ d[i] = y;
710
+ }
711
+ return d;
712
+ };
713
+ biquadTv = function(d, type, fc, q){
714
+ var n, x1, x2, y1, y2, i$, s, ref$, b0, b1, b2, a0, a1, a2, j$, to$, i, x, y;
715
+ q == null && (q = 0.707);
716
+ n = d.length;
717
+ x1 = x2 = y1 = y2 = 0;
718
+ for (i$ = 0; i$ < n; i$ += 32) {
719
+ s = i$;
720
+ ref$ = coef(type, fc(s / n), q), b0 = ref$[0], b1 = ref$[1], b2 = ref$[2], a0 = ref$[3], a1 = ref$[4], a2 = ref$[5];
721
+ for (j$ = s, to$ = Math.min(n, s + 32); j$ < to$; ++j$) {
722
+ i = j$;
723
+ x = d[i];
724
+ y = (b0 * x + b1 * x1 + b2 * x2 - a1 * y1 - a2 * y2) / a0;
725
+ x2 = x1;
726
+ x1 = x;
727
+ y2 = y1;
728
+ y1 = y;
729
+ d[i] = y;
730
+ }
731
+ }
732
+ return d;
733
+ };
734
+ noise = function(n, r){
735
+ var d, i$, i;
736
+ d = new Float32Array(n);
737
+ for (i$ = 0; i$ < n; ++i$) {
738
+ i = i$;
739
+ d[i] = r() * 2 - 1;
740
+ }
741
+ return d;
742
+ };
743
+ env = function(t, a, d){
744
+ if (t < a) {
745
+ return t / a;
746
+ } else {
747
+ return Math.exp(-(t - a) / d);
748
+ }
749
+ };
750
+ pan = function(L, R, src, p, gain){
751
+ var gl, gr, i$, to$, i, results$ = [];
752
+ p == null && (p = 0);
753
+ gain == null && (gain = 1);
754
+ gl = Math.cos((p + 1) * Math.PI / 4) * gain;
755
+ gr = Math.sin((p + 1) * Math.PI / 4) * gain;
756
+ for (i$ = 0, to$ = src.length; i$ < to$; ++i$) {
757
+ i = i$;
758
+ L[i] += src[i] * gl;
759
+ results$.push(R[i] += src[i] * gr);
760
+ }
761
+ return results$;
762
+ };
763
+ synth = S.synth = {};
764
+ synth.click = function(o){
765
+ o == null && (o = {});
766
+ return make(0.05, function(L, R, n){
767
+ var r, nz, d, i$, i, t;
768
+ r = rng(o.seed || 7);
769
+ nz = biquad(noise(n, r), 'hp', 2500);
770
+ d = new Float32Array(n);
771
+ for (i$ = 0; i$ < n; ++i$) {
772
+ i = i$;
773
+ t = i / SR;
774
+ d[i] = nz[i] * env(t, 0.0005, 0.004) + 0.5 * Math.sin(2 * Math.PI * (o.freq || 2000) * t) * env(t, 0.0005, 0.012);
775
+ }
776
+ return pan(L, R, d, o.pan);
777
+ });
778
+ };
779
+ synth.tick = function(o){
780
+ o == null && (o = {});
781
+ return make(0.06, function(L, R, n){
782
+ var f, d, i$, i, t;
783
+ f = S.freq(o.note || o.freq || 1800);
784
+ d = new Float32Array(n);
785
+ for (i$ = 0; i$ < n; ++i$) {
786
+ i = i$;
787
+ t = i / SR;
788
+ d[i] = Math.sin(2 * Math.PI * f * t) * env(t, 0.001, 0.018);
789
+ }
790
+ return pan(L, R, d, o.pan);
791
+ });
792
+ };
793
+ synth.pop = function(o){
794
+ o == null && (o = {});
795
+ return make(0.15, function(L, R, n){
796
+ var f0, f1, d, ph, i$, i, t, f;
797
+ f0 = o.from || 380;
798
+ f1 = o.to || 900;
799
+ d = new Float32Array(n);
800
+ ph = 0;
801
+ for (i$ = 0; i$ < n; ++i$) {
802
+ i = i$;
803
+ t = i / SR;
804
+ f = f0 + (f1 - f0) * Math.min(1, t / 0.03);
805
+ ph += 2 * Math.PI * f / SR;
806
+ d[i] = Math.sin(ph) * env(t, 0.002, 0.04);
807
+ }
808
+ return pan(L, R, d, o.pan);
809
+ });
810
+ };
811
+ synth.toggle = function(o){
812
+ o == null && (o = {});
813
+ return make(0.12, function(L, R, n){
814
+ var d, i$, i, t;
815
+ d = new Float32Array(n);
816
+ for (i$ = 0; i$ < n; ++i$) {
817
+ i = i$;
818
+ t = i / SR;
819
+ d[i] = Math.sin(2 * Math.PI * 1500 * t) * env(t, 0.001, 0.012) + (t > 0.05 ? Math.sin(2 * Math.PI * 2200 * (t - 0.05)) * env(t - 0.05, 0.001, 0.015) : 0);
820
+ }
821
+ return pan(L, R, d, o.pan);
822
+ });
823
+ };
824
+ synth.chime = function(o){
825
+ var f, dur;
826
+ o == null && (o = {});
827
+ f = S.freq(o.note || 'E6');
828
+ dur = o.dur || 1.4;
829
+ return make(dur, function(L, R, n){
830
+ var d, i$, i, t;
831
+ d = new Float32Array(n);
832
+ for (i$ = 0; i$ < n; ++i$) {
833
+ i = i$;
834
+ t = i / SR;
835
+ d[i] = (Math.sin(2 * Math.PI * f * t) + 0.5 * Math.sin(2 * Math.PI * f * 2.01 * t) * Math.exp(-t * 2) + 0.25 * Math.sin(2 * Math.PI * f * 3.02 * t) * Math.exp(-t * 4)) * env(t, 0.003, dur / 4);
836
+ }
837
+ return pan(L, R, d, o.pan);
838
+ });
839
+ };
840
+ synth.success = function(o){
841
+ o == null && (o = {});
842
+ return make(0.9, function(L, R, n){
843
+ var d, i$, ref$, len$, ref1$, at, note, f, j$, i, t;
844
+ d = new Float32Array(n);
845
+ for (i$ = 0, len$ = (ref$ = [[0, 'C6'], [0.09, 'E6'], [0.18, 'G6']]).length; i$ < len$; ++i$) {
846
+ ref1$ = ref$[i$], at = ref1$[0], note = ref1$[1];
847
+ f = S.freq(note);
848
+ for (j$ = Math.round(at * SR); j$ < n; ++j$) {
849
+ i = j$;
850
+ t = i / SR - at;
851
+ d[i] += (Math.sin(2 * Math.PI * f * t) + 0.4 * Math.sin(2 * Math.PI * f * 2.01 * t)) * env(t, 0.003, 0.25);
852
+ }
853
+ }
854
+ return pan(L, R, d, o.pan);
855
+ });
856
+ };
857
+ synth.notify = function(o){
858
+ o == null && (o = {});
859
+ return make(0.7, function(L, R, n){
860
+ var d, i$, ref$, len$, ref1$, at, note, f, j$, i, t;
861
+ d = new Float32Array(n);
862
+ for (i$ = 0, len$ = (ref$ = [[0, 'A5'], [0.12, 'E6']]).length; i$ < len$; ++i$) {
863
+ ref1$ = ref$[i$], at = ref1$[0], note = ref1$[1];
864
+ f = S.freq(note);
865
+ for (j$ = Math.round(at * SR); j$ < n; ++j$) {
866
+ i = j$;
867
+ t = i / SR - at;
868
+ d[i] += Math.sin(2 * Math.PI * f * t) * env(t, 0.004, 0.18);
869
+ }
870
+ }
871
+ return pan(L, R, d, o.pan);
872
+ });
873
+ };
874
+ synth.whoosh = function(o){
875
+ var dur, f0, f1, f2, at, q;
876
+ o == null && (o = {});
877
+ dur = o.dur || 0.7;
878
+ f0 = o.from || 400;
879
+ f1 = o.peak || 2600;
880
+ f2 = o.to || 600;
881
+ at = o.at || 0.45;
882
+ q = o.q || 1.2;
883
+ return make(dur, function(L, R, n){
884
+ var r, d, i$, i, v, results$ = [];
885
+ r = rng(o.seed || 3);
886
+ d = biquadTv(noise(n, r), 'bp', function(u){
887
+ if (u < at) {
888
+ return f0 + (f1 - f0) * (u / at);
889
+ } else {
890
+ return f1 + (f2 - f1) * ((u - at) / (1 - at));
891
+ }
892
+ }, q);
893
+ for (i$ = 0; i$ < n; ++i$) {
894
+ i = i$;
895
+ v = i / n;
896
+ d[i] *= v < at
897
+ ? Math.sin(Math.PI / 2 * v / at)
898
+ : Math.cos(Math.PI / 2 * (v - at) / (1 - at));
899
+ }
900
+ for (i$ = 0; i$ < n; ++i$) {
901
+ i = i$;
902
+ L[i] = d[i] * (1 - i / n * 0.6);
903
+ results$.push(R[i] = d[i] * (0.4 + i / n * 0.6));
904
+ }
905
+ return results$;
906
+ });
907
+ };
908
+ synth.type = function(o){
909
+ o == null && (o = {});
910
+ return synth.click({
911
+ freq: 1200 + 600 * rng(o.seed || 11)(),
912
+ seed: o.seed
913
+ });
914
+ };
915
+ synth.thump = function(o){
916
+ o == null && (o = {});
917
+ return make(0.35, function(L, R, n){
918
+ var r, nz, d, ph, i$, i, t;
919
+ r = rng(o.seed || 5);
920
+ nz = biquad(noise(n, r), 'bp', 1800, 0.8);
921
+ d = new Float32Array(n);
922
+ ph = 0;
923
+ for (i$ = 0; i$ < n; ++i$) {
924
+ i = i$;
925
+ t = i / SR;
926
+ ph += 2 * Math.PI * (70 + 60 * Math.exp(-t / 0.04)) / SR;
927
+ d[i] = Math.sin(ph) * env(t, 0.002, 0.09) + 0.35 * nz[i] * env(t, 0.001, 0.03);
928
+ }
929
+ return pan(L, R, d, o.pan);
930
+ });
931
+ };
932
+ synth.pluck = function(o){
933
+ var f, dur, bright, slide;
934
+ o == null && (o = {});
935
+ f = S.freq(o.note || 'A3');
936
+ dur = o.dur || 2.5;
937
+ bright = o.bright != null ? o.bright : 0.6;
938
+ slide = o.slide != null ? o.slide : 0.6;
939
+ return make(dur, function(L, R, n){
940
+ var r, period, size, buf, i$, to$, k, j$, i, d, line, decay, p, j, j0, fr, a, b;
941
+ r = rng(o.seed || 13);
942
+ period = SR / f;
943
+ size = Math.ceil(period * 2) + 4;
944
+ buf = noise(size, r);
945
+ for (i$ = 0, to$ = Math.round((1 - bright) * 4); i$ < to$; ++i$) {
946
+ k = i$;
947
+ for (j$ = 1; j$ < size; ++j$) {
948
+ i = j$;
949
+ buf[i] = (buf[i] + buf[i - 1]) / 2;
950
+ }
951
+ }
952
+ d = new Float32Array(n);
953
+ line = new Float32Array(n + size);
954
+ for (i$ = 0; i$ < size; ++i$) {
955
+ i = i$;
956
+ line[i] = buf[i];
957
+ }
958
+ decay = Math.pow(0.996, 220 / f);
959
+ for (i$ = size, to$ = n + size; i$ < to$; ++i$) {
960
+ k = i$;
961
+ p = period * Math.pow(2, slide * Math.exp(-(k - size) / SR / 0.09) / 12);
962
+ j = k - p;
963
+ j0 = Math.floor(j);
964
+ fr = j - j0;
965
+ a = line[j0] * (1 - fr) + line[j0 + 1] * fr;
966
+ b = line[j0 - 1] * (1 - fr) + line[j0] * fr;
967
+ line[k] = decay * (a + b) / 2;
968
+ d[k - size] = line[k];
969
+ }
970
+ for (i$ = 0; i$ < n; ++i$) {
971
+ i = i$;
972
+ d[i] *= Math.min(1, (n - i) / (0.3 * SR));
973
+ }
974
+ return pan(L, R, d, o.pan);
975
+ });
976
+ };
977
+ synth.drone = function(o){
978
+ var notes, dur, att, rel;
979
+ o == null && (o = {});
980
+ notes = (o.notes || ['A1', 'E2', 'A2']).map(S.freq);
981
+ dur = o.dur || 8;
982
+ att = o.attack || 1.5;
983
+ rel = o.release || 2;
984
+ return make(dur, function(L, R, n){
985
+ var i$, ref$, len$, k, f, d, j$, i, t, a, results$ = [];
986
+ for (i$ = 0, len$ = (ref$ = notes).length; i$ < len$; ++i$) {
987
+ k = i$;
988
+ f = ref$[i$];
989
+ d = new Float32Array(n);
990
+ for (j$ = 0; j$ < n; ++j$) {
991
+ i = j$;
992
+ t = i / SR;
993
+ a = Math.min(1, t / att, (dur - t) / rel);
994
+ d[i] = (Math.sin(2 * Math.PI * f * t) + 0.3 * Math.sin(2 * Math.PI * f * 1.003 * 2 * t)) * a;
995
+ }
996
+ results$.push(pan(L, R, d, (k - (notes.length - 1) / 2) * 0.4, 1 / notes.length));
997
+ }
998
+ return results$;
999
+ });
1000
+ };
1001
+ synth.wind = function(o){
1002
+ var dur;
1003
+ o == null && (o = {});
1004
+ dur = o.dur || 6;
1005
+ return make(dur, function(L, R, n){
1006
+ var r, d, lag, i$, i, t, a, results$ = [];
1007
+ r = rng(o.seed || 17);
1008
+ d = biquad(biquad(noise(n, r), 'hp', 150), 'lp', o.cutoff || 900);
1009
+ lag = 2400;
1010
+ for (i$ = 0; i$ < n; ++i$) {
1011
+ i = i$;
1012
+ t = i / SR;
1013
+ a = (0.6 + 0.4 * Math.sin(2 * Math.PI * 0.13 * t) * Math.sin(2 * Math.PI * 0.071 * t + 1)) * Math.min(1, t, dur - t);
1014
+ L[i] = d[i] * a;
1015
+ results$.push(R[i] = d[(i + lag) % n] * a);
1016
+ }
1017
+ return results$;
1018
+ });
1019
+ };
1020
+ synth.rain = function(o){
1021
+ var dur, density;
1022
+ o == null && (o = {});
1023
+ dur = o.dur || 6;
1024
+ density = o.density || 0.02;
1025
+ return make(dur, function(L, R, n){
1026
+ var r, bed, grains, i$, i, a, results$ = [];
1027
+ r = rng(o.seed || 19);
1028
+ bed = biquad(noise(n, r), 'bp', 4000, 0.5);
1029
+ grains = new Float32Array(n);
1030
+ for (i$ = 0; i$ < n; ++i$) {
1031
+ i = i$;
1032
+ if (r() < density * 0.05) {
1033
+ grains[i] = r() * 2 - 1;
1034
+ }
1035
+ }
1036
+ grains = biquad(biquad(grains, 'hp', 2500), 'lp', 9000);
1037
+ for (i$ = 0; i$ < n; ++i$) {
1038
+ i = i$;
1039
+ a = Math.min(1, i / SR, (n - i) / SR);
1040
+ L[i] = (bed[i] * 0.15 + grains[i] * 3) * a;
1041
+ results$.push(R[i] = (bed[(i + 1200) % n] * 0.15 + grains[(i + 777) % n] * 3) * a);
1042
+ }
1043
+ return results$;
1044
+ });
1045
+ };
1046
+ synth.buzz = function(o){
1047
+ var dur, f;
1048
+ o == null && (o = {});
1049
+ dur = o.dur || 1.5;
1050
+ f = S.freq(o.freq || 220);
1051
+ return make(dur, function(L, R, n){
1052
+ var d, ph, i$, i, t, ff, saw;
1053
+ d = new Float32Array(n);
1054
+ ph = 0;
1055
+ for (i$ = 0; i$ < n; ++i$) {
1056
+ i = i$;
1057
+ t = i / SR;
1058
+ ff = f * (1 + 0.03 * Math.sin(2 * Math.PI * 5.3 * t) + 0.015 * Math.sin(2 * Math.PI * 1.7 * t));
1059
+ ph += ff / SR;
1060
+ saw = 2 * (ph - Math.floor(ph + 0.5));
1061
+ d[i] = saw * (0.75 + 0.25 * Math.sin(2 * Math.PI * ff * 0.5 * t)) * Math.min(1, t / 0.08, (dur - t) / 0.15);
1062
+ }
1063
+ biquad(d, 'lp', 2200);
1064
+ biquad(d, 'bp', f * 3, 0.6);
1065
+ return pan(L, R, d, o.pan);
1066
+ });
1067
+ };
1068
+ synth.swell = function(o){
1069
+ var dur;
1070
+ o == null && (o = {});
1071
+ dur = o.dur || 2;
1072
+ return make(dur, function(L, R, n){
1073
+ var r, d, i$, i, u, results$ = [];
1074
+ r = rng(o.seed || 23);
1075
+ d = biquadTv(noise(n, r), 'bp', function(u){
1076
+ return 300 + 3000 * u * u;
1077
+ }, 0.9);
1078
+ for (i$ = 0; i$ < n; ++i$) {
1079
+ i = i$;
1080
+ u = i / n;
1081
+ results$.push(L[i] = R[i] = d[i] * u * u);
1082
+ }
1083
+ return results$;
1084
+ });
1085
+ };
1086
+ synth.melody = function(o){
1087
+ var seq, rel, dur, inst, voices;
1088
+ o == null && (o = {});
1089
+ seq = o.notes || [];
1090
+ rel = o.release != null ? o.release : 0.8;
1091
+ dur = o.dur || Math.max.apply(Math, seq.map(function(x){
1092
+ return x[0] + (x[2] || 1.5);
1093
+ })) + 1;
1094
+ inst = o.instrument || 'pluck';
1095
+ if (!synth[inst]) {
1096
+ inst = 'pluck';
1097
+ }
1098
+ voices = seq.map(function(x, k){
1099
+ var opt;
1100
+ opt = inst === 'pluck'
1101
+ ? {
1102
+ bright: o.bright,
1103
+ slide: o.slide
1104
+ }
1105
+ : {};
1106
+ return [
1107
+ x, synth[inst](import$({
1108
+ note: x[1],
1109
+ dur: (x[2] || 1.5) + rel,
1110
+ seed: 31 + k
1111
+ }, opt))
1112
+ ];
1113
+ });
1114
+ return make(dur, function(L, R, n){
1115
+ var i$, ref$, len$, ref1$, ref2$, t, note, d, vel, b, results$ = [];
1116
+ for (i$ = 0, len$ = (ref$ = voices).length; i$ < len$; ++i$) {
1117
+ ref1$ = ref$[i$], ref2$ = ref1$[0], t = ref2$[0], note = ref2$[1], d = ref2$[2], vel = ref2$[3], b = ref1$[1];
1118
+ results$.push(place(L, R, b, t, vel || 0.8));
1119
+ }
1120
+ return results$;
1121
+ });
1122
+ };
1123
+ place = function(L, R, b, t, g){
1124
+ var l, r_, o0, i$, to$, i, results$ = [];
1125
+ g == null && (g = 1);
1126
+ l = b.getChannelData(0);
1127
+ r_ = b.getChannelData(1);
1128
+ o0 = Math.round(t * SR);
1129
+ for (i$ = Math.max(0, -o0), to$ = Math.min(l.length, L.length - o0); i$ < to$; ++i$) {
1130
+ i = i$;
1131
+ L[o0 + i] += l[i] * g;
1132
+ results$.push(R[o0 + i] += r_[i] * g);
1133
+ }
1134
+ return results$;
1135
+ };
1136
+ partial = function(d, at, f, amp, dec, att){
1137
+ var o0, w, i$, to$, i, k, t, a;
1138
+ att == null && (att = 0.001);
1139
+ if (f >= SR * 0.45) {
1140
+ return d;
1141
+ }
1142
+ o0 = Math.round(at * SR);
1143
+ w = 2 * Math.PI * f / SR;
1144
+ for (i$ = Math.max(0, o0), to$ = d.length; i$ < to$; ++i$) {
1145
+ i = i$;
1146
+ k = i - o0;
1147
+ t = k / SR;
1148
+ a = amp * env(t, att, dec);
1149
+ if (t > att && a < 1e-5) {
1150
+ break;
1151
+ }
1152
+ d[i] += a * Math.sin(w * k);
1153
+ }
1154
+ return d;
1155
+ };
1156
+ fadeOut = function(d, sec){
1157
+ var m, i$, i;
1158
+ sec == null && (sec = 0.02);
1159
+ m = Math.min(d.length, Math.round(sec * SR));
1160
+ for (i$ = 0; i$ < m; ++i$) {
1161
+ i = i$;
1162
+ d[d.length - 1 - i] *= i / m;
1163
+ }
1164
+ return d;
1165
+ };
1166
+ wander = function(n, every, r){
1167
+ var step, pts, res$, i$, to$, k, d, i, u;
1168
+ step = Math.max(1, Math.round(every * SR));
1169
+ res$ = [];
1170
+ for (i$ = 0, to$ = Math.ceil(n / step) + 1; i$ <= to$; ++i$) {
1171
+ k = i$;
1172
+ res$.push(r());
1173
+ }
1174
+ pts = res$;
1175
+ d = new Float32Array(n);
1176
+ for (i$ = 0; i$ < n; ++i$) {
1177
+ i = i$;
1178
+ k = Math.floor(i / step);
1179
+ u = (i % step) / step;
1180
+ d[i] = pts[k] * (1 - u) + pts[k + 1] * u;
1181
+ }
1182
+ return d;
1183
+ };
1184
+ glideOsc = function(n, f0, f1, harm){
1185
+ var d, ph, i$, i, j$, len$, k, a;
1186
+ harm == null && (harm = [1]);
1187
+ d = new Float32Array(n);
1188
+ ph = 0;
1189
+ for (i$ = 0; i$ < n; ++i$) {
1190
+ i = i$;
1191
+ ph += 2 * Math.PI * f0 * Math.pow(f1 / f0, i / n) / SR;
1192
+ for (j$ = 0, len$ = harm.length; j$ < len$; ++j$) {
1193
+ k = j$;
1194
+ a = harm[j$];
1195
+ d[i] += a * Math.sin(ph * (k + 1));
1196
+ }
1197
+ }
1198
+ return d;
1199
+ };
1200
+ COMB = [1116, 1188, 1277, 1356, 1422, 1491, 1557, 1617];
1201
+ ALLPASS = [556, 441, 341, 225];
1202
+ reverb = function(buf, mix, room){
1203
+ var k, src, m;
1204
+ mix == null && (mix = 0.3);
1205
+ room == null && (room = 0.5);
1206
+ k = SR / 44100;
1207
+ src = [buf.getChannelData(0), buf.getChannelData(1)];
1208
+ m = buf.length;
1209
+ return make(buf.duration + 0.4 + room * 3, function(L, R, n){
1210
+ var fb, damp, input, i$, to$, i, ref$, len$, ch, out, lresult$, wet, j$, ref1$, len1$, c, len, line, idx, filt, k$, y, b, v, dry, results$ = [];
1211
+ fb = 0.7 + 0.27 * room;
1212
+ damp = 0.3;
1213
+ input = new Float32Array(n);
1214
+ for (i$ = 0, to$ = m; i$ < to$; ++i$) {
1215
+ i = i$;
1216
+ input[i] = (src[0][i] + src[1][i]) * 0.015;
1217
+ }
1218
+ for (i$ = 0, len$ = (ref$ = [L, R]).length; i$ < len$; ++i$) {
1219
+ ch = i$;
1220
+ out = ref$[i$];
1221
+ lresult$ = [];
1222
+ wet = new Float32Array(n);
1223
+ for (j$ = 0, len1$ = (ref1$ = COMB).length; j$ < len1$; ++j$) {
1224
+ c = ref1$[j$];
1225
+ len = Math.round((c + ch * 23) * k);
1226
+ line = new Float32Array(len);
1227
+ idx = 0;
1228
+ filt = 0;
1229
+ for (k$ = 0; k$ < n; ++k$) {
1230
+ i = k$;
1231
+ y = line[idx];
1232
+ filt = y * (1 - damp) + filt * damp;
1233
+ line[idx] = input[i] + filt * fb;
1234
+ idx = (idx + 1) % len;
1235
+ wet[i] += y;
1236
+ }
1237
+ }
1238
+ for (j$ = 0, len1$ = (ref1$ = ALLPASS).length; j$ < len1$; ++j$) {
1239
+ c = ref1$[j$];
1240
+ len = Math.round((c + ch * 23) * k);
1241
+ line = new Float32Array(len);
1242
+ idx = 0;
1243
+ for (k$ = 0; k$ < n; ++k$) {
1244
+ i = k$;
1245
+ b = line[idx];
1246
+ v = wet[i];
1247
+ line[idx] = v + b * 0.5;
1248
+ wet[i] = b - v;
1249
+ idx = (idx + 1) % len;
1250
+ }
1251
+ }
1252
+ dry = src[ch];
1253
+ for (j$ = 0; j$ < n; ++j$) {
1254
+ i = j$;
1255
+ lresult$.push(out[i] = (i < m ? dry[i] * (1 - mix * 0.5) : 0) + wet[i] * mix * 3);
1256
+ }
1257
+ results$.push(lresult$);
1258
+ }
1259
+ return results$;
1260
+ });
1261
+ };
1262
+ S.reverb = function(buf, o){
1263
+ o == null && (o = {});
1264
+ return reverb(buf, o.mix != null ? o.mix : 0.3, o.room != null ? o.room : 0.5);
1265
+ };
1266
+ synth.slide = function(o){
1267
+ var dur, f0, f1, q, dir;
1268
+ o == null && (o = {});
1269
+ dur = o.dur || 0.3;
1270
+ f0 = o.from || 900;
1271
+ f1 = o.to || 2600;
1272
+ q = o.q || 0.9;
1273
+ dir = o.dir != null ? o.dir : 1;
1274
+ return make(dur, function(L, R, n){
1275
+ var d, i$, i, u, a, p, results$ = [];
1276
+ d = biquadTv(noise(n, rng(o.seed || 37)), 'bp', function(u){
1277
+ return f0 * Math.pow(f1 / f0, u);
1278
+ }, q);
1279
+ for (i$ = 0; i$ < n; ++i$) {
1280
+ i = i$;
1281
+ u = i / n;
1282
+ a = u < 0.25
1283
+ ? Math.sin(Math.PI / 2 * u / 0.25)
1284
+ : Math.pow(Math.cos(Math.PI / 2 * (u - 0.25) / 0.75), 2);
1285
+ p = (u * 2 - 1) * 0.6 * dir;
1286
+ L[i] = d[i] * a * Math.cos((p + 1) * Math.PI / 4);
1287
+ results$.push(R[i] = d[i] * a * Math.sin((p + 1) * Math.PI / 4));
1288
+ }
1289
+ return results$;
1290
+ });
1291
+ };
1292
+ glide = function(o, d0, d1){
1293
+ var dur, f0, f1;
1294
+ dur = o.dur || 0.6;
1295
+ f0 = S.freq(o.from || d0);
1296
+ f1 = S.freq(o.to || d1);
1297
+ return make(dur, function(L, R, n){
1298
+ var d, i$, i, t;
1299
+ d = glideOsc(n, f0, f1, [1, 0.25, 0.08]);
1300
+ for (i$ = 0; i$ < n; ++i$) {
1301
+ i = i$;
1302
+ t = i / SR;
1303
+ d[i] *= Math.min(1, t / 0.02) * Math.min(1, (dur - t) / (dur * 0.35));
1304
+ }
1305
+ return pan(L, R, d, o.pan);
1306
+ });
1307
+ };
1308
+ synth.rise = function(o){
1309
+ o == null && (o = {});
1310
+ return glide(o, 300, 900);
1311
+ };
1312
+ synth.fall = function(o){
1313
+ o == null && (o = {});
1314
+ return glide(o, 900, 250);
1315
+ };
1316
+ synth.count = function(o){
1317
+ var cnt, dur, f, climb, ease;
1318
+ o == null && (o = {});
1319
+ cnt = Math.max(2, o.n || 12);
1320
+ dur = o.dur || 1.2;
1321
+ f = S.freq(o.note || 'C6');
1322
+ climb = o.climb != null ? o.climb : 7;
1323
+ ease = (function(){
1324
+ switch (o.ease) {
1325
+ case 'in':
1326
+ return function(u){
1327
+ return u * u;
1328
+ };
1329
+ case 'linear':
1330
+ return function(u){
1331
+ return u;
1332
+ };
1333
+ default:
1334
+ return function(u){
1335
+ return 1 - (1 - u) * (1 - u);
1336
+ };
1337
+ }
1338
+ }());
1339
+ return make(dur + 0.2, function(L, R, n){
1340
+ var d, i$, to$, k, u, last, ff;
1341
+ d = new Float32Array(n);
1342
+ for (i$ = 0, to$ = cnt; i$ < to$; ++i$) {
1343
+ k = i$;
1344
+ u = k / (cnt - 1);
1345
+ last = k === cnt - 1;
1346
+ ff = f * Math.pow(2, climb * u / 12);
1347
+ partial(d, dur * ease(u), ff, last ? 1 : 0.6, last ? 0.09 : 0.02);
1348
+ if (last) {
1349
+ partial(d, dur, ff * 2, 0.3, 0.06);
1350
+ }
1351
+ }
1352
+ return pan(L, R, d, o.pan);
1353
+ });
1354
+ };
1355
+ synth.snap = function(o){
1356
+ o == null && (o = {});
1357
+ return make(0.1, function(L, R, n){
1358
+ var nz, d, i$, i, t;
1359
+ nz = biquad(noise(n, rng(o.seed || 41)), 'lp', 6000);
1360
+ d = new Float32Array(n);
1361
+ for (i$ = 0; i$ < n; ++i$) {
1362
+ i = i$;
1363
+ t = i / SR;
1364
+ d[i] = 0.8 * nz[i] * env(t, 0.0003, 0.002) + 0.6 * Math.sin(2 * Math.PI * 1400 * t) * env(t, 0.0005, 0.01) + Math.sin(2 * Math.PI * 160 * t) * env(t, 0.001, 0.025);
1365
+ }
1366
+ return pan(L, R, d, o.pan);
1367
+ });
1368
+ };
1369
+ synth.draw = function(o){
1370
+ var dur, rough;
1371
+ o == null && (o = {});
1372
+ dur = o.dur || 1;
1373
+ rough = o.rough != null ? o.rough : 0.5;
1374
+ return make(dur, function(L, R, n){
1375
+ var r, d, speed, grain, i$, i, t, g;
1376
+ r = rng(o.seed || 43);
1377
+ d = biquad(biquad(noise(n, r), 'bp', o.pitch || 2500, 0.8), 'hp', 600);
1378
+ speed = wander(n, 0.06, r);
1379
+ grain = wander(n, 0.004, r);
1380
+ for (i$ = 0; i$ < n; ++i$) {
1381
+ i = i$;
1382
+ t = i / SR;
1383
+ g = grain[i] * grain[i];
1384
+ d[i] *= (0.3 + 0.7 * speed[i]) * (1 - rough + rough * g * 2) * Math.min(1, t / 0.03, (dur - t) / 0.05);
1385
+ }
1386
+ return pan(L, R, d, o.pan);
1387
+ });
1388
+ };
1389
+ synth.glitch = function(o){
1390
+ var dur;
1391
+ o == null && (o = {});
1392
+ dur = o.dur || 0.5;
1393
+ return make(dur, function(L, R, n){
1394
+ var r, i, len, kind, f, hold, p, gl, gr, v, i$, to$, j, t, x, results$ = [];
1395
+ r = rng(o.seed || 47);
1396
+ i = 0;
1397
+ while (i < n) {
1398
+ len = Math.round((0.015 + 0.05 * r()) * SR);
1399
+ kind = r();
1400
+ f = 100 + 1900 * r() * r();
1401
+ hold = 1 + Math.floor(r() * 40);
1402
+ p = r() * 1.6 - 0.8;
1403
+ gl = Math.cos((p + 1) * Math.PI / 4);
1404
+ gr = Math.sin((p + 1) * Math.PI / 4);
1405
+ v = 0;
1406
+ for (i$ = i, to$ = Math.min(n, i + len); i$ < to$; ++i$) {
1407
+ j = i$;
1408
+ t = (j - i) / SR;
1409
+ x = kind < 0.4
1410
+ ? Math.sin(2 * Math.PI * f * t) > 0
1411
+ ? 0.6
1412
+ : -0.6
1413
+ : kind < 0.8 ? (j - i) % hold === 0 ? v = r() * 2 - 1 : v : 0;
1414
+ L[j] = x * gl;
1415
+ R[j] = x * gr;
1416
+ }
1417
+ results$.push(i += len);
1418
+ }
1419
+ return results$;
1420
+ });
1421
+ };
1422
+ synth.reveal = function(o){
1423
+ var notes, gap;
1424
+ o == null && (o = {});
1425
+ notes = (o.notes || ['C6', 'E6', 'G6', 'C7', 'E7']).map(S.freq);
1426
+ gap = o.gap != null ? o.gap : 0.06;
1427
+ return make(1.6, function(L, R, n){
1428
+ var d, i$, ref$, len$, k, f, sh, i, t;
1429
+ d = new Float32Array(n);
1430
+ for (i$ = 0, len$ = (ref$ = notes).length; i$ < len$; ++i$) {
1431
+ k = i$;
1432
+ f = ref$[i$];
1433
+ partial(d, k * gap, f, 1, 0.5);
1434
+ partial(d, k * gap, f * 2.76, 0.25, 0.15);
1435
+ }
1436
+ sh = biquad(noise(n, rng(o.seed || 53)), 'hp', 6000);
1437
+ for (i$ = 0; i$ < n; ++i$) {
1438
+ i = i$;
1439
+ t = i / SR;
1440
+ d[i] += sh[i] * 0.12 * env(t, 0.25, 0.3);
1441
+ }
1442
+ return pan(L, R, d, o.pan);
1443
+ });
1444
+ };
1445
+ synth.reveal.reverb = 0.35;
1446
+ synth.error = function(o){
1447
+ var notes;
1448
+ o == null && (o = {});
1449
+ notes = [S.freq(o.from || 'B3'), S.freq(o.to || 'F3')];
1450
+ return make(0.5, function(L, R, n){
1451
+ var d, i$, ref$, len$, k, f, j$, h;
1452
+ d = new Float32Array(n);
1453
+ for (i$ = 0, len$ = (ref$ = notes).length; i$ < len$; ++i$) {
1454
+ k = i$;
1455
+ f = ref$[i$];
1456
+ for (j$ = 1; j$ <= 7; j$ += 2) {
1457
+ h = j$;
1458
+ partial(d, k * 0.16, f * h, 1 / h, 0.12, 0.005);
1459
+ }
1460
+ }
1461
+ fadeOut(biquad(d, 'lp', 2000));
1462
+ return pan(L, R, d, o.pan);
1463
+ });
1464
+ };
1465
+ synth.tension = function(o){
1466
+ var dur, f;
1467
+ o == null && (o = {});
1468
+ dur = o.dur || 6;
1469
+ f = S.freq(o.note || 'A2');
1470
+ return make(dur, function(L, R, n){
1471
+ var i$, ref$, len$, k, ratio, d, ph, tp, j$, i, t, u, results$ = [];
1472
+ for (i$ = 0, len$ = (ref$ = [1, Math.pow(2, 1 / 12), Math.pow(2, 6 / 12), 2]).length; i$ < len$; ++i$) {
1473
+ k = i$;
1474
+ ratio = ref$[i$];
1475
+ d = new Float32Array(n);
1476
+ ph = 0;
1477
+ tp = 0;
1478
+ for (j$ = 0; j$ < n; ++j$) {
1479
+ i = j$;
1480
+ t = i / SR;
1481
+ u = t / dur;
1482
+ tp += 2 * Math.PI * (3 + 5 * u) / SR;
1483
+ ph += 2 * Math.PI * f * ratio / SR;
1484
+ d[i] = (Math.sin(ph) + 0.3 * Math.sin(ph * 2) + 0.15 * Math.sin(ph * 3)) * (1 - 0.35 * (0.5 + 0.5 * Math.sin(tp + k))) * Math.pow(u, 1.5) * Math.min(1, (dur - t) / 0.3);
1485
+ }
1486
+ results$.push(pan(L, R, d, (k - 1.5) * 0.4, 0.5));
1487
+ }
1488
+ return results$;
1489
+ });
1490
+ };
1491
+ synth.heartbeat = function(o){
1492
+ var dur, period;
1493
+ o == null && (o = {});
1494
+ dur = o.dur || 4;
1495
+ period = 60 / (o.bpm || 70);
1496
+ return make(dur, function(L, R, n){
1497
+ var d, t, i$, ref$, len$, ref1$, at, f0, f1, a, m, o0, b, j$, to$, i;
1498
+ d = new Float32Array(n);
1499
+ t = 0.05;
1500
+ while (t < dur - 0.2) {
1501
+ for (i$ = 0, len$ = (ref$ = [[0, 75, 45, 1], [Math.min(0.3, period * 0.35), 85, 55, 0.7]]).length; i$ < len$; ++i$) {
1502
+ ref1$ = ref$[i$], at = ref1$[0], f0 = ref1$[1], f1 = ref1$[2], a = ref1$[3];
1503
+ m = Math.round(0.25 * SR);
1504
+ o0 = Math.round((t + at) * SR);
1505
+ b = glideOsc(m, f0, f1);
1506
+ for (j$ = 0, to$ = Math.min(m, n - o0); j$ < to$; ++j$) {
1507
+ i = j$;
1508
+ d[o0 + i] += b[i] * a * env(i / SR, 0.008, 0.06);
1509
+ }
1510
+ }
1511
+ t += period;
1512
+ }
1513
+ return pan(L, R, biquad(d, 'lp', 300), o.pan);
1514
+ });
1515
+ };
1516
+ synth.clock = function(o){
1517
+ var dur, period;
1518
+ o == null && (o = {});
1519
+ dur = o.dur || 4;
1520
+ period = 60 / (o.bpm || 60);
1521
+ return make(dur, function(L, R, n){
1522
+ var d, nz, k, t, f, o0, i$, to$, i;
1523
+ d = new Float32Array(n);
1524
+ nz = biquad(noise(n, rng(o.seed || 59)), 'hp', 2000);
1525
+ k = 0;
1526
+ t = 0.02;
1527
+ while (t < dur - 0.05) {
1528
+ f = k % 2 ? 2400 : 3200;
1529
+ partial(d, t, f, 0.6, 0.012);
1530
+ partial(d, t, f * 1.5, 0.3, 0.006);
1531
+ o0 = Math.round(t * SR);
1532
+ for (i$ = 0, to$ = Math.min(Math.round(0.002 * SR), n - o0); i$ < to$; ++i$) {
1533
+ i = i$;
1534
+ d[o0 + i] += nz[o0 + i] * 0.8;
1535
+ }
1536
+ t += period;
1537
+ k++;
1538
+ }
1539
+ return pan(L, R, d, o.pan);
1540
+ });
1541
+ };
1542
+ grain = function(L, R, r, at, len, fc, q, amp, p){
1543
+ var m, g, o0, gl, gr, i$, to$, i, e, results$ = [];
1544
+ p == null && (p = 0);
1545
+ m = Math.max(4, Math.round(len * SR));
1546
+ g = noise(m, r);
1547
+ biquad(g, 'bp', fc, q);
1548
+ o0 = Math.round(at * SR);
1549
+ gl = Math.cos((p + 1) * Math.PI / 4) * amp;
1550
+ gr = Math.sin((p + 1) * Math.PI / 4) * amp;
1551
+ for (i$ = 0, to$ = Math.min(m, L.length - o0); i$ < to$; ++i$) {
1552
+ i = i$;
1553
+ e = Math.exp(-4 * i / m) * Math.min(1, i / 8);
1554
+ L[o0 + i] += g[i] * e * gl;
1555
+ results$.push(R[o0 + i] += g[i] * e * gr);
1556
+ }
1557
+ return results$;
1558
+ };
1559
+ pick = function(r, w){
1560
+ var i$, k, u;
1561
+ for (i$ = 0; i$ < 50; ++i$) {
1562
+ k = i$;
1563
+ u = r();
1564
+ if (r() < w(u)) {
1565
+ return u;
1566
+ }
1567
+ }
1568
+ return r();
1569
+ };
1570
+ synth.paper = function(o){
1571
+ var dur, crisp, flutter, lift, land;
1572
+ o == null && (o = {});
1573
+ dur = o.dur || 1.2;
1574
+ crisp = o.crisp != null ? o.crisp : 1;
1575
+ flutter = o.flutter != null ? o.flutter : 0.6;
1576
+ lift = dur * 0.2;
1577
+ land = dur * 0.8;
1578
+ return make(dur, function(L, R, n){
1579
+ var r, flip, fl, fl2, i$, ref$, len$, c, ch, p, sl, j$, i, t, shake, a, s, d, to$, k, results$ = [];
1580
+ r = rng(o.seed || 61);
1581
+ flip = function(t){
1582
+ if (t < lift * 0.5 || t > land + 0.02) {
1583
+ return 0;
1584
+ } else {
1585
+ return Math.pow(Math.min(1, (t - lift * 0.5) / (land - lift * 0.5)), 0.7);
1586
+ }
1587
+ };
1588
+ fl = wander(n, 0.035, r);
1589
+ fl2 = wander(n, 0.09, r);
1590
+ for (i$ = 0, len$ = (ref$ = [L, R]).length; i$ < len$; ++i$) {
1591
+ c = i$;
1592
+ ch = ref$[i$];
1593
+ p = pink(n, r);
1594
+ sl = biquad(noise(n, r), 'bp', 4000, 0.7);
1595
+ for (j$ = 0; j$ < n; ++j$) {
1596
+ i = j$;
1597
+ t = i / SR;
1598
+ shake = 1 - flutter + flutter * (fl[i] * 0.7 + fl2[i] * 0.6);
1599
+ a = flip(t) * shake;
1600
+ s = t < lift
1601
+ ? Math.sin(Math.PI / 2 * t / lift) * 0.25
1602
+ : t < land ? 0.25 * Math.max(0, 1 - (t - lift) / lift) : 0;
1603
+ d = t >= land ? env(t - land, 0.006, 0.07) * 1.1 + 0.25 * Math.max(0, 1 - (t - land) / (dur - land)) : 0;
1604
+ ch[i] = p[i] * (a * 0.8 + d) + sl[i] * s;
1605
+ }
1606
+ }
1607
+ for (i$ = 0, to$ = Math.round(50 * dur * crisp); i$ < to$; ++i$) {
1608
+ k = i$;
1609
+ t = lift * 0.5 + (land - lift * 0.5) * pick(r, fn$);
1610
+ grain(L, R, r, t, 0.0002 + 0.0008 * r(), 1500 * Math.pow(5, r()), 0.5, (0.1 + r() * r()) * 8, r() * 0.6 - 0.3);
1611
+ }
1612
+ for (i$ = 0, len$ = (ref$ = [L, R]).length; i$ < len$; ++i$) {
1613
+ ch = ref$[i$];
1614
+ biquad(ch, 'hp', 150);
1615
+ biquad(ch, 'lp', 7500, 0.6);
1616
+ results$.push(fadeOut(ch, 0.05));
1617
+ }
1618
+ return results$;
1619
+ function fn$(u){
1620
+ return 0.3 + 0.7 * u;
1621
+ }
1622
+ });
1623
+ };
1624
+ bubble = function(L, R, at, radius, amp, rise, p, damp){
1625
+ var f0, d, m, o0, gl, gr, ph, i$, i, t, v, results$ = [];
1626
+ damp == null && (damp = 1);
1627
+ f0 = 3000 / radius;
1628
+ d = (0.043 * f0 + 0.0014 * Math.pow(f0, 1.5)) * damp;
1629
+ m = Math.min(Math.round(6 / d * SR), L.length - Math.round(at * SR));
1630
+ o0 = Math.round(at * SR);
1631
+ gl = Math.cos((p + 1) * Math.PI / 4) * amp;
1632
+ gr = Math.sin((p + 1) * Math.PI / 4) * amp;
1633
+ ph = 0;
1634
+ for (i$ = 0; i$ < m; ++i$) {
1635
+ i = i$;
1636
+ t = i / SR;
1637
+ ph += 2 * Math.PI * f0 * (1 + rise * d * t) / SR;
1638
+ v = Math.sin(ph) * Math.exp(-d * t) * Math.min(1, i / 24);
1639
+ L[o0 + i] += v * gl;
1640
+ results$.push(R[o0 + i] += v * gr);
1641
+ }
1642
+ return results$;
1643
+ };
1644
+ synth.water = function(o){
1645
+ var cnt, rise, size, dur;
1646
+ o == null && (o = {});
1647
+ cnt = o.n || 1;
1648
+ rise = o.rise != null
1649
+ ? o.rise
1650
+ : cnt === 1 ? 0.05 : 0.1;
1651
+ size = o.size || (o.freq
1652
+ ? 3000 / S.freq(o.freq)
1653
+ : cnt === 1 ? 3 : 2.5);
1654
+ dur = o.dur || (cnt === 1
1655
+ ? 0.4
1656
+ : Math.max(1, cnt * 0.04));
1657
+ return make(dur, function(L, R, n){
1658
+ var r, i$, to$, k, radius, at, results$ = [];
1659
+ r = rng(o.seed || 67);
1660
+ if (cnt === 1) {
1661
+ grain(L, R, r, 0.005, 0.001, 3000, 0.8, 0.25);
1662
+ bubble(L, R, 0.007, size, 1, rise, 0, 0.4);
1663
+ bubble(L, R, 0.012, size * 0.4, 0.12, rise, 0.1);
1664
+ return;
1665
+ }
1666
+ for (i$ = 0, to$ = cnt; i$ < to$; ++i$) {
1667
+ k = i$;
1668
+ radius = size * (0.25 + 1.75 * Math.pow(r(), 2.5));
1669
+ at = r() * (dur - 0.1);
1670
+ results$.push(bubble(L, R, at, radius, Math.pow(radius / size, 0.7) * (0.3 + 0.7 * r()), rise * (0.5 + r()), r() * 1.4 - 0.7));
1671
+ }
1672
+ return results$;
1673
+ });
1674
+ };
1675
+ synth.fire = function(o){
1676
+ var dur, density;
1677
+ o == null && (o = {});
1678
+ dur = o.dur || 6;
1679
+ density = o.density != null ? o.density : 1;
1680
+ return make(dur, function(L, R, n){
1681
+ var r, bed, hiss, sw, i$, i, a, cnt, k, lresult$, at, amp, len, p, gl, gr, j$, v, results$ = [];
1682
+ r = rng(o.seed || 71);
1683
+ bed = biquad(noise(n, r), 'lp', 300);
1684
+ hiss = biquad(noise(n, r), 'hp', 3000);
1685
+ sw = wander(n, 0.25, r);
1686
+ for (i$ = 0; i$ < n; ++i$) {
1687
+ i = i$;
1688
+ a = (0.4 + 0.6 * sw[i]) * Math.min(1, i / SR / 0.3, (n - i) / SR / 0.3);
1689
+ L[i] = R[i] = (bed[i] * 0.5 + hiss[i] * 0.04) * a;
1690
+ }
1691
+ cnt = Math.round(dur * 10 * density);
1692
+ for (i$ = 0; i$ < cnt; ++i$) {
1693
+ k = i$;
1694
+ lresult$ = [];
1695
+ at = Math.round(r() * (n - 0.01 * SR));
1696
+ amp = r() * r() * 1.5;
1697
+ len = Math.round((0.0005 + 0.003 * r()) * SR);
1698
+ p = r() * 1.6 - 0.8;
1699
+ gl = Math.cos((p + 1) * Math.PI / 4);
1700
+ gr = Math.sin((p + 1) * Math.PI / 4);
1701
+ for (j$ = 0; j$ < len; ++j$) {
1702
+ i = j$;
1703
+ v = (r() * 2 - 1) * amp * (1 - i / len);
1704
+ L[at + i] += v * gl;
1705
+ lresult$.push(R[at + i] += v * gr);
1706
+ }
1707
+ results$.push(lresult$);
1708
+ }
1709
+ return results$;
1710
+ });
1711
+ };
1712
+ SURFACE = {
1713
+ wood: {
1714
+ thud: 1,
1715
+ tones: [140, 380, 620],
1716
+ click: [[2200, 1.2, 0.012, 0.5]]
1717
+ },
1718
+ concrete: {
1719
+ thud: 0.04,
1720
+ tones: [],
1721
+ click: [[700, 0.8, 0.003, 1.6], [2600, 1.2, 0.002, 0.15]],
1722
+ scuff: 0.06
1723
+ },
1724
+ gravel: {
1725
+ thud: 0.45,
1726
+ grains: 90,
1727
+ band: [1200, 6000],
1728
+ len: [0.0004, 0.002],
1729
+ q: 1.5
1730
+ },
1731
+ snow: {
1732
+ thud: 0.35,
1733
+ grains: 70,
1734
+ band: [500, 2200],
1735
+ len: [0.002, 0.007],
1736
+ q: 0.8
1737
+ },
1738
+ grass: {
1739
+ thud: 0.25,
1740
+ grains: 90,
1741
+ band: [2500, 8000],
1742
+ len: [0.0005, 0.003],
1743
+ q: 1.2
1744
+ }
1745
+ };
1746
+ synth.steps = function(o){
1747
+ var run, cnt, pace, sf;
1748
+ o == null && (o = {});
1749
+ run = o.gait === 'run';
1750
+ cnt = o.n || 4;
1751
+ pace = o.pace || (run ? 0.3 : 0.5);
1752
+ sf = SURFACE[o.surface] || SURFACE.wood;
1753
+ return make(cnt * pace + 0.35, function(L, R, n){
1754
+ var r, lp, i$, to$, k, lresult$, T, w, p, gl, gr, toe, j$, ref$, len$, ref1$, at, a, o0, m, d, k$, i, t, len1$, f, ref2$, fc, q, dec, amp, c, l$, sc, s, to1$, e, j, f0, f1, l0, l1, results$ = [];
1755
+ r = rng(o.seed || 73);
1756
+ lp = biquad(noise(n, r), 'lp', 260);
1757
+ for (i$ = 0, to$ = cnt; i$ < to$; ++i$) {
1758
+ k = i$;
1759
+ lresult$ = [];
1760
+ T = 0.02 + k * pace + (r() - 0.5) * (run ? 0.01 : 0.02);
1761
+ w = (run ? 1.15 : 0.85) + 0.3 * r();
1762
+ p = k % 2
1763
+ ? 0.12
1764
+ : -0.12;
1765
+ gl = Math.cos((p + 1) * Math.PI / 4);
1766
+ gr = Math.sin((p + 1) * Math.PI / 4);
1767
+ toe = run
1768
+ ? 0.025 + 0.015 * r()
1769
+ : 0.09 + 0.04 * r();
1770
+ for (j$ = 0, len$ = (ref$ = run
1771
+ ? [[0, w * 0.8], [toe, w]]
1772
+ : [[0, w], [toe, w * 0.55]]).length; j$ < len$; ++j$) {
1773
+ ref1$ = ref$[j$], at = ref1$[0], a = ref1$[1];
1774
+ o0 = Math.round((T + at) * SR);
1775
+ m = Math.min(Math.round(0.15 * SR), n - o0);
1776
+ d = new Float32Array(m);
1777
+ for (k$ = 0; k$ < m; ++k$) {
1778
+ i = k$;
1779
+ t = i / SR;
1780
+ d[i] = lp[o0 + i] * 2.5 * sf.thud * env(t, 0.003, 0.025) + 0.5 * sf.thud * Math.sin(2 * Math.PI * (75 + 20 * a) * t) * env(t, 0.002, 0.03);
1781
+ }
1782
+ for (k$ = 0, len1$ = (ref1$ = sf.tones || []).length; k$ < len1$; ++k$) {
1783
+ f = ref1$[k$];
1784
+ partial(d, 0, f * (0.95 + 0.1 * r()), 0.12, 0.035);
1785
+ }
1786
+ for (k$ = 0, len1$ = (ref1$ = sf.click || []).length; k$ < len1$; ++k$) {
1787
+ ref2$ = ref1$[k$], fc = ref2$[0], q = ref2$[1], dec = ref2$[2], amp = ref2$[3];
1788
+ c = biquad(noise(m, r), 'bp', fc * (0.85 + 0.3 * r()), q);
1789
+ for (l$ = 0; l$ < m; ++l$) {
1790
+ i = l$;
1791
+ d[i] += c[i] * amp * env(i / SR, 0.0004, dec);
1792
+ }
1793
+ }
1794
+ for (k$ = 0; k$ < m; ++k$) {
1795
+ i = k$;
1796
+ L[o0 + i] += d[i] * a * gl;
1797
+ R[o0 + i] += d[i] * a * gr;
1798
+ }
1799
+ }
1800
+ sc = (sf.scuff || 0.1) * (run ? 2.5 : 1);
1801
+ if (sf.scuff || run) {
1802
+ o0 = Math.round((T + (run ? toe + 0.03 : 0.02)) * SR);
1803
+ s = biquad(noise(Math.round((run ? 0.07 : 0.12) * SR), r), 'bp', 2800, 0.8);
1804
+ for (j$ = 0, to1$ = Math.min(s.length, n - o0); j$ < to1$; ++j$) {
1805
+ i = j$;
1806
+ e = Math.sin(Math.PI * i / s.length) * sc * w * 0.3;
1807
+ L[o0 + i] += s[i] * e * gl;
1808
+ R[o0 + i] += s[i] * e * gr;
1809
+ }
1810
+ }
1811
+ if (sf.grains) {
1812
+ for (j$ = 0, to1$ = Math.round(sf.grains * w); j$ < to1$; ++j$) {
1813
+ j = j$;
1814
+ at = r() < 0.6
1815
+ ? 0.07 * Math.pow(r(), 1.5)
1816
+ : toe + 0.09 * Math.pow(r(), 1.5);
1817
+ ref$ = sf.band, f0 = ref$[0], f1 = ref$[1];
1818
+ ref$ = sf.len, l0 = ref$[0], l1 = ref$[1];
1819
+ lresult$.push(grain(L, R, r, T + at, l0 + (l1 - l0) * r(), f0 * Math.pow(f1 / f0, r()), sf.q, (0.15 + r() * r()) * 0.8 * w, p + r() * 0.3 - 0.15));
1820
+ }
1821
+ }
1822
+ results$.push(lresult$);
1823
+ }
1824
+ return results$;
1825
+ });
1826
+ };
1827
+ synth.bell = function(o){
1828
+ var f, dur;
1829
+ o == null && (o = {});
1830
+ f = S.freq(o.note || 'C5');
1831
+ dur = o.dur || 5;
1832
+ return make(dur, function(L, R, n){
1833
+ var d, i$, ref$, len$, ref1$, ratio, amp, dec;
1834
+ d = new Float32Array(n);
1835
+ for (i$ = 0, len$ = (ref$ = [[0.5, 0.5, 1], [1, 1, 0.7], [1.2, 0.55, 0.5], [1.5, 0.35, 0.4], [2, 0.6, 0.35], [2.51, 0.25, 0.25], [2.66, 0.2, 0.22], [3.01, 0.18, 0.18], [4.17, 0.1, 0.12], [5.43, 0.06, 0.08]]).length; i$ < len$; ++i$) {
1836
+ ref1$ = ref$[i$], ratio = ref1$[0], amp = ref1$[1], dec = ref1$[2];
1837
+ partial(d, 0, f * ratio, amp, dec * dur * 0.45, 0.002);
1838
+ partial(d, 0, f * ratio * 1.0015, amp * 0.5, dec * dur * 0.45, 0.002);
1839
+ }
1840
+ return pan(L, R, fadeOut(d, 0.1), o.pan);
1841
+ });
1842
+ };
1843
+ synth.bell.reverb = 0.2;
1844
+ pink = function(n, r){
1845
+ var d, b0, b1, b2, b3, b4, b5, b6, i$, i, w;
1846
+ d = new Float32Array(n);
1847
+ b0 = b1 = b2 = b3 = b4 = b5 = b6 = 0;
1848
+ for (i$ = 0; i$ < n; ++i$) {
1849
+ i = i$;
1850
+ w = r() * 2 - 1;
1851
+ b0 = 0.99886 * b0 + w * 0.0555179;
1852
+ b1 = 0.99332 * b1 + w * 0.0750759;
1853
+ b2 = 0.969 * b2 + w * 0.153852;
1854
+ b3 = 0.8665 * b3 + w * 0.3104856;
1855
+ b4 = 0.55 * b4 + w * 0.5329522;
1856
+ b5 = -0.7616 * b5 - w * 0.016898;
1857
+ d[i] = (b0 + b1 + b2 + b3 + b4 + b5 + b6 + w * 0.5362) * 0.11;
1858
+ b6 = w * 0.115926;
1859
+ }
1860
+ return d;
1861
+ };
1862
+ synth.thunder = function(o){
1863
+ var dur, dist, near;
1864
+ o == null && (o = {});
1865
+ dur = o.dur || 6;
1866
+ dist = o.dist != null ? o.dist : 0.5;
1867
+ near = 1 - dist;
1868
+ return make(dur, function(L, R, n){
1869
+ var r, t0, cracks, k, rolls, res$, i$, ca, ra, i, t, j$, len$, ref$, at, g, fo, lpf, ch, p, b, to$, results$ = [];
1870
+ r = rng(o.seed || 79);
1871
+ t0 = 0.02 + dist * 0.4;
1872
+ cracks = [[t0, 1]].concat((function(){
1873
+ var i$, to$, results$ = [];
1874
+ for (i$ = 0, to$ = Math.round(2 + 5 * near); i$ < to$; ++i$) {
1875
+ k = i$;
1876
+ results$.push([t0 + 0.7 * Math.pow(r(), 1.5), 0.4 + 0.6 * r()]);
1877
+ }
1878
+ return results$;
1879
+ }()));
1880
+ res$ = [];
1881
+ for (i$ = 0; i$ < 5; ++i$) {
1882
+ k = i$;
1883
+ res$.push([t0 + 0.3 + r() * dur * 0.5, 0.3 + 0.7 * r()]);
1884
+ }
1885
+ rolls = res$;
1886
+ ca = new Float32Array(n);
1887
+ ra = new Float32Array(n);
1888
+ for (i$ = 0; i$ < n; ++i$) {
1889
+ i = i$;
1890
+ t = i / SR;
1891
+ for (j$ = 0, len$ = cracks.length; j$ < len$; ++j$) {
1892
+ ref$ = cracks[j$], at = ref$[0], g = ref$[1];
1893
+ if (t > at) {
1894
+ ca[i] += g * env(t - at, 0.004, 0.1 + 0.25 * dist);
1895
+ }
1896
+ }
1897
+ for (j$ = 0, len$ = rolls.length; j$ < len$; ++j$) {
1898
+ ref$ = rolls[j$], at = ref$[0], g = ref$[1];
1899
+ if (t > at) {
1900
+ ra[i] += g * env(t - at, 0.15 + 0.4 * dist, 0.7 + dist);
1901
+ }
1902
+ }
1903
+ fo = Math.min(1, (dur - t) / 0.6);
1904
+ ca[i] *= fo;
1905
+ ra[i] *= fo;
1906
+ }
1907
+ lpf = 400 + 11000 * near * near;
1908
+ for (i$ = 0, len$ = (ref$ = [L, R]).length; i$ < len$; ++i$) {
1909
+ ch = ref$[i$];
1910
+ p = biquad(biquad(pink(n, r), 'lp', lpf), 'hp', 30);
1911
+ b = biquad(biquad(noise(n, r), 'lp', 140), 'lp', 140);
1912
+ for (j$ = 0; j$ < n; ++j$) {
1913
+ i = j$;
1914
+ ch[i] = p[i] * (ca[i] * (0.4 + 0.6 * near) + ra[i] * 0.8 * near) + b[i] * ra[i] * (0.6 + 0.4 * dist) * 3 + b[i] * ca[i] * 2;
1915
+ }
1916
+ }
1917
+ for (i$ = 0, to$ = Math.round(300 * near * near); i$ < to$; ++i$) {
1918
+ k = i$;
1919
+ at = t0 + 1.2 * Math.pow(r(), 2);
1920
+ results$.push(grain(L, R, r, at, 0.0003 + 0.002 * r(), 800 + 5000 * r(), 1, (0.1 + r() * r()) * near * 0.8, r() * 1.4 - 0.7));
1921
+ }
1922
+ return results$;
1923
+ });
1924
+ };
1925
+ synth.fingersnap = function(o){
1926
+ o == null && (o = {});
1927
+ return make(0.12, function(L, R, n){
1928
+ var r, tone, d, nz, crack, res, i$, i, t;
1929
+ r = rng(o.seed || 137);
1930
+ tone = o.tone || 3200;
1931
+ d = new Float32Array(n);
1932
+ nz = noise(n, r);
1933
+ crack = biquad(Float32Array.from(nz), 'hp', 5000);
1934
+ res = biquad(Float32Array.from(nz), 'bp', tone, 5);
1935
+ for (i$ = 0; i$ < n; ++i$) {
1936
+ i = i$;
1937
+ t = i / SR;
1938
+ d[i] = crack[i] * 2.5 * env(t, 0.0001, 0.0015) + res[i] * 2.2 * env(t, 0.0002, 0.0025);
1939
+ }
1940
+ partial(d, 0, tone * 1.1, 0.12, 0.004);
1941
+ partial(d, 0.0005, 200 + 30 * r(), 0.02, 0.008, 0.001);
1942
+ return pan(L, R, d, o.pan);
1943
+ });
1944
+ };
1945
+ formantVoice = function(n, r, size, track){
1946
+ var src, ph, jit, tr, i$, s, i, p, f0, v, K, j$, k, a, j, y1, y2, F, B, rr, c, b, k$, to$, y;
1947
+ src = new Float32Array(n);
1948
+ ph = 0;
1949
+ jit = 0;
1950
+ tr = [];
1951
+ for (i$ = 0; i$ < n; i$ += 32) {
1952
+ s = i$;
1953
+ tr.push(track(s / n));
1954
+ }
1955
+ for (i$ = 0; i$ < n; ++i$) {
1956
+ i = i$;
1957
+ p = tr[i >> 5];
1958
+ jit = jit * 0.999 + (r() - 0.5) * 0.002;
1959
+ f0 = p.f0 * (1 + 0.006 * Math.sin(2 * Math.PI * 5.2 * i / SR) + jit);
1960
+ ph += f0 / SR;
1961
+ ph -= Math.floor(ph);
1962
+ v = 0;
1963
+ if (p.voice > 0) {
1964
+ K = Math.min(40, Math.floor(5000 / f0));
1965
+ for (j$ = 1; j$ <= K; ++j$) {
1966
+ k = j$;
1967
+ v += Math.sin(2 * Math.PI * k * ph) / k;
1968
+ }
1969
+ }
1970
+ a = (r() * 2 - 1) * p.asp * (p.voice > 0 ? 0.6 + 0.4 * Math.sin(2 * Math.PI * ph) : 1);
1971
+ src[i] = (v * p.voice * 0.35 + a) * p.amp;
1972
+ }
1973
+ for (i$ = 0; i$ < 4; ++i$) {
1974
+ j = i$;
1975
+ y1 = y2 = 0;
1976
+ for (j$ = 0; j$ < n; j$ += 32) {
1977
+ s = j$;
1978
+ F = tr[s >> 5].F[j] * size;
1979
+ B = 60 + F * 0.06;
1980
+ rr = Math.exp(-Math.PI * B / SR);
1981
+ c = -rr * rr;
1982
+ b = 2 * rr * Math.cos(2 * Math.PI * F / SR);
1983
+ a = 1 - b - c;
1984
+ for (k$ = s, to$ = Math.min(n, s + 32); k$ < to$; ++k$) {
1985
+ i = k$;
1986
+ y = a * src[i] + b * y1 + c * y2;
1987
+ y2 = y1;
1988
+ y1 = y;
1989
+ src[i] = y;
1990
+ }
1991
+ }
1992
+ }
1993
+ return src;
1994
+ };
1995
+ mix = function(a, b, u){
1996
+ return a + (b - a) * u;
1997
+ };
1998
+ ease = function(u){
1999
+ return u * u * (3 - 2 * u);
2000
+ };
2001
+ synth.huh = function(o){
2002
+ var dur, f0, rise, size, h;
2003
+ o == null && (o = {});
2004
+ dur = o.dur || 0.45;
2005
+ f0 = o.pitch || 200;
2006
+ rise = o.rise || 1.9;
2007
+ size = o.size || 1;
2008
+ h = 0.08 / dur;
2009
+ return make(dur, function(L, R, n){
2010
+ var r, d;
2011
+ r = rng(o.seed || 151);
2012
+ d = formantVoice(n, r, size, function(u){
2013
+ var v, w, amp;
2014
+ v = Math.max(0, Math.min(1, (u - h) / 0.08));
2015
+ w = Math.max(0, (u - h) / (1 - h));
2016
+ amp = Math.min(1, u / 0.06) * (u > 0.75 ? Math.max(0, 1 - (u - 0.75) / 0.25) : 1);
2017
+ return {
2018
+ f0: f0 * mix(1, rise, Math.pow(w, 1.6)),
2019
+ voice: v,
2020
+ asp: 0.35 * (1 - v) + 0.06,
2021
+ amp: amp,
2022
+ F: [mix(700, 850, v), 1250, 2700, 3600]
2023
+ };
2024
+ });
2025
+ fadeOut(d, 0.03);
2026
+ return pan(L, R, d, o.pan);
2027
+ });
2028
+ };
2029
+ synth.yay = function(o){
2030
+ var dur, f0, size;
2031
+ o == null && (o = {});
2032
+ dur = o.dur || 0.5;
2033
+ f0 = o.pitch || 300;
2034
+ size = o.size || 1;
2035
+ return make(dur, function(L, R, n){
2036
+ var r, d;
2037
+ r = rng(o.seed || 157);
2038
+ d = formantVoice(n, r, size, function(u){
2039
+ var g, amp, pc;
2040
+ g = ease(Math.min(1, u / 0.25));
2041
+ amp = Math.min(1, u / 0.04) * (u > 0.7 ? Math.max(0, 1 - (u - 0.7) / 0.3) : 1);
2042
+ pc = u < 0.35
2043
+ ? mix(0.88, 1.12, ease(u / 0.35))
2044
+ : mix(1.12, 0.85, ease((u - 0.35) / 0.65));
2045
+ return {
2046
+ f0: f0 * pc,
2047
+ voice: 1,
2048
+ asp: 0.05,
2049
+ amp: amp,
2050
+ F: [mix(320, 660, g), mix(2600, 1850, g), mix(3200, 2650, g), 3800]
2051
+ };
2052
+ });
2053
+ fadeOut(d, 0.03);
2054
+ return pan(L, R, d, o.pan);
2055
+ });
2056
+ };
2057
+ synth.correct = function(o){
2058
+ var arp, notes, gap;
2059
+ o == null && (o = {});
2060
+ arp = o.style === 'arp';
2061
+ notes = (o.notes || (arp
2062
+ ? ['C6', 'E6', 'G6', 'C7']
2063
+ : ['B5', 'G5'])).map(S.freq);
2064
+ gap = o.gap || (arp ? 0.07 : 0.2);
2065
+ return make(notes.length * gap + 1.1, function(L, R, n){
2066
+ var d, i$, ref$, len$, k, f, last, dec, sh, i;
2067
+ d = new Float32Array(n);
2068
+ for (i$ = 0, len$ = (ref$ = notes).length; i$ < len$; ++i$) {
2069
+ k = i$;
2070
+ f = ref$[i$];
2071
+ last = k === notes.length - 1;
2072
+ dec = last
2073
+ ? 0.45
2074
+ : arp ? 0.15 : 0.25;
2075
+ partial(d, k * gap, f, 1, dec, 0.002);
2076
+ partial(d, k * gap, f * 2, 0.25, dec * 0.4, 0.002);
2077
+ partial(d, k * gap, f * 3.01, 0.08, dec * 0.25, 0.002);
2078
+ }
2079
+ if (arp) {
2080
+ sh = biquad(noise(n, rng(o.seed || 163)), 'hp', 7000);
2081
+ for (i$ = 0; i$ < n; ++i$) {
2082
+ i = i$;
2083
+ d[i] += sh[i] * 0.08 * env(i / SR - notes.length * gap * 0.6, 0.1, 0.25) * (i / SR > notes.length * gap * 0.6 - 0.1 ? 1 : 0);
2084
+ }
2085
+ }
2086
+ return pan(L, R, fadeOut(d, 0.05), o.pan);
2087
+ });
2088
+ };
2089
+ synth.correct.reverb = 0.15;
2090
+ synth.wrong = function(o){
2091
+ var notes, f;
2092
+ o == null && (o = {});
2093
+ if (o.style === 'trombone') {
2094
+ notes = ['D4', 'C#4', 'C4', 'B3'].map(S.freq);
2095
+ return make(2.2, function(L, R, n){
2096
+ var d, ph, i$, i, t, k, lt, f, p, a, b2;
2097
+ d = new Float32Array(n);
2098
+ ph = 0;
2099
+ for (i$ = 0; i$ < n; ++i$) {
2100
+ i = i$;
2101
+ t = i / SR;
2102
+ k = Math.min(3, Math.floor(t / 0.42));
2103
+ lt = t - k * 0.42;
2104
+ f = notes[k] * (k === 3 ? 1 + 0.025 * Math.sin(2 * Math.PI * 5.5 * Math.max(0, lt - 0.15)) : 1) * (1 - 0.03 * Math.min(1, lt / 0.3));
2105
+ ph += f / SR;
2106
+ p = ph % 1;
2107
+ a = k < 3
2108
+ ? Math.min(1, lt / 0.04) * Math.max(0, 1 - Math.max(0, lt - 0.3) / 0.08)
2109
+ : Math.min(1, lt / 0.04) * Math.max(0, 1 - lt / 0.95);
2110
+ d[i] = (2 * p - 1) * a;
2111
+ }
2112
+ biquad(d, 'lp', 1400, 0.9);
2113
+ b2 = biquad(Float32Array.from(d), 'bp', 1200, 2);
2114
+ for (i$ = 0; i$ < n; ++i$) {
2115
+ i = i$;
2116
+ d[i] += b2[i] * 0.5;
2117
+ }
2118
+ return pan(L, R, fadeOut(d, 0.05), o.pan);
2119
+ });
2120
+ }
2121
+ f = o.pitch || 140;
2122
+ return make(0.75, function(L, R, n){
2123
+ var d, p1, p2, i$, i, t, a;
2124
+ d = new Float32Array(n);
2125
+ p1 = 0;
2126
+ p2 = 0;
2127
+ for (i$ = 0; i$ < n; ++i$) {
2128
+ i = i$;
2129
+ t = i / SR;
2130
+ a = t < 0.13
2131
+ ? Math.min(1, t / 0.005) * Math.min(1, (0.13 - t) / 0.01)
2132
+ : t > 0.19 ? Math.min(1, (t - 0.19) / 0.005) * Math.min(1, (0.72 - t) / 0.03) : 0;
2133
+ p1 += f / SR;
2134
+ p2 += f * 1.012 / SR;
2135
+ d[i] = ((p1 % 1 < 0.5
2136
+ ? 1
2137
+ : -1) + (p2 % 1 < 0.5
2138
+ ? 1
2139
+ : -1)) * 0.5 * Math.max(0, a);
2140
+ }
2141
+ biquad(d, 'lp', 2500);
2142
+ return pan(L, R, d, o.pan);
2143
+ });
2144
+ };
2145
+ bar = function(o, cfg){
2146
+ var f, dur, hard, base;
2147
+ f = S.freq(o.note || cfg.note);
2148
+ dur = o.dur || cfg.dur;
2149
+ hard = o.hard != null ? o.hard : 0.5;
2150
+ base = cfg.decay * Math.pow(S.freq(cfg.note) / f, 0.4);
2151
+ return make(dur, function(L, R, n){
2152
+ var d, i$, ref$, len$, k, ratio, depth, i, m, to$;
2153
+ d = new Float32Array(n);
2154
+ for (i$ = 0, len$ = (ref$ = cfg.ratios).length; i$ < len$; ++i$) {
2155
+ k = i$;
2156
+ ratio = ref$[i$];
2157
+ partial(d, 0, f * ratio, cfg.amps[k] * (k ? 0.3 + 1.4 * hard : 1), base / (1 + k * cfg.damp), 0.0015);
2158
+ }
2159
+ if (cfg.trem) {
2160
+ depth = o.trem != null ? o.trem : 0.35;
2161
+ for (i$ = 0; i$ < n; ++i$) {
2162
+ i = i$;
2163
+ d[i] *= 1 - depth * (0.5 + 0.5 * Math.sin(2 * Math.PI * 5.5 * i / SR));
2164
+ }
2165
+ }
2166
+ m = biquad(noise(Math.round(0.008 * SR), rng(o.seed || 83)), 'lp', 2000 + 6000 * hard);
2167
+ for (i$ = 0, to$ = m.length; i$ < to$; ++i$) {
2168
+ i = i$;
2169
+ d[i] += m[i] * 0.4 * hard * (1 - i / m.length);
2170
+ }
2171
+ return pan(L, R, fadeOut(d), o.pan);
2172
+ });
2173
+ };
2174
+ synth.marimba = function(o){
2175
+ o == null && (o = {});
2176
+ return bar(o, {
2177
+ note: 'C4',
2178
+ dur: 1.5,
2179
+ ratios: [1, 3.93, 9.24],
2180
+ amps: [1, 0.3, 0.1],
2181
+ decay: 0.45,
2182
+ damp: 2.5
2183
+ });
2184
+ };
2185
+ synth.xylophone = function(o){
2186
+ o == null && (o = {});
2187
+ return bar(o, {
2188
+ note: 'C5',
2189
+ dur: 0.8,
2190
+ ratios: [1, 3, 6.1],
2191
+ amps: [1, 0.5, 0.2],
2192
+ decay: 0.2,
2193
+ damp: 1.5
2194
+ });
2195
+ };
2196
+ synth.vibraphone = function(o){
2197
+ o == null && (o = {});
2198
+ return bar(o, {
2199
+ note: 'F4',
2200
+ dur: 3,
2201
+ ratios: [1, 4, 10],
2202
+ amps: [1, 0.25, 0.08],
2203
+ decay: 1.4,
2204
+ damp: 3,
2205
+ trem: true
2206
+ });
2207
+ };
2208
+ synth.glockenspiel = function(o){
2209
+ o == null && (o = {});
2210
+ return bar(o, {
2211
+ note: 'C6',
2212
+ dur: 2,
2213
+ ratios: [1, 2.76, 5.4, 8.93],
2214
+ amps: [1, 0.4, 0.2, 0.08],
2215
+ decay: 0.9,
2216
+ damp: 1.2
2217
+ });
2218
+ };
2219
+ CHORDS = {
2220
+ C: ['C3', 'E3', 'G3', 'C4', 'E4'],
2221
+ D: ['D3', 'A3', 'D4', 'F#4'],
2222
+ Dm: ['D3', 'A3', 'D4', 'F4'],
2223
+ E: ['E2', 'B2', 'E3', 'G#3', 'B3', 'E4'],
2224
+ Em: ['E2', 'B2', 'E3', 'G3', 'B3', 'E4'],
2225
+ F: ['F2', 'C3', 'F3', 'A3', 'C4', 'F4'],
2226
+ G: ['G2', 'B2', 'D3', 'G3', 'B3', 'G4'],
2227
+ A: ['A2', 'E3', 'A3', 'C#4', 'E4'],
2228
+ Am: ['A2', 'E3', 'A3', 'C4', 'E4']
2229
+ };
2230
+ string = function(f, n, o, r){
2231
+ var bright, mute, s, period, size, exc, p, i$, i, a, y, sustain, g, line, d, to$, k, j, j0, fr, a1, b1;
2232
+ bright = o.bright != null ? o.bright : 0.5;
2233
+ mute = o.mute || 0;
2234
+ s = 0.5 + 0.45 * bright * (1 - mute);
2235
+ period = SR / f - (1 - s);
2236
+ size = Math.ceil(period) + 3;
2237
+ exc = noise(size, r);
2238
+ p = Math.max(1, Math.round(period * (o.pos || 0.2)));
2239
+ for (i$ = size - 1; i$ >= p; --i$) {
2240
+ i = i$;
2241
+ exc[i] -= exc[i - p];
2242
+ }
2243
+ a = 0.15 + 0.8 * bright * (1 - mute * 0.7);
2244
+ y = 0;
2245
+ for (i$ = 0; i$ < size; ++i$) {
2246
+ i = i$;
2247
+ y = a * exc[i] + (1 - a) * y;
2248
+ exc[i] = y;
2249
+ }
2250
+ sustain = (o.sustain || 4) * (1 - 0.92 * mute);
2251
+ g = Math.pow(0.001, 1 / (f * sustain));
2252
+ line = new Float32Array(n + size);
2253
+ for (i$ = 0; i$ < size; ++i$) {
2254
+ i = i$;
2255
+ line[i] = exc[i];
2256
+ }
2257
+ d = new Float32Array(n);
2258
+ for (i$ = size, to$ = n + size; i$ < to$; ++i$) {
2259
+ k = i$;
2260
+ j = k - period;
2261
+ j0 = Math.floor(j);
2262
+ fr = j - j0;
2263
+ a1 = line[j0] * (1 - fr) + line[j0 + 1] * fr;
2264
+ b1 = line[j0 - 1] * (1 - fr) + line[j0] * fr;
2265
+ line[k] = g * (s * a1 + (1 - s) * b1);
2266
+ d[k - size] = line[k];
2267
+ }
2268
+ return d;
2269
+ };
2270
+ synth.guitar = function(o){
2271
+ var notes, dur, gap;
2272
+ o == null && (o = {});
2273
+ notes = o.notes || CHORDS[o.chord] || [o.note || 'E3'];
2274
+ if (o.dir === 'up') {
2275
+ notes = notes.slice().reverse();
2276
+ }
2277
+ dur = o.dur || 3;
2278
+ gap = o.strum != null ? o.strum : 0.03;
2279
+ return make(dur, function(L, R, n){
2280
+ var r, i$, ref$, len$, k, note, lresult$, at, d, body, body2, j$, to$, i, p, gl, gr, results$ = [];
2281
+ r = rng(o.seed || 89);
2282
+ for (i$ = 0, len$ = (ref$ = notes).length; i$ < len$; ++i$) {
2283
+ k = i$;
2284
+ note = ref$[i$];
2285
+ lresult$ = [];
2286
+ at = Math.round(k * gap * SR);
2287
+ d = string(S.freq(note), n - at, o, r);
2288
+ body = biquad(Float32Array.from(d), 'bp', 105, 1.5);
2289
+ body2 = biquad(Float32Array.from(d), 'bp', 220, 2);
2290
+ for (j$ = 0, to$ = d.length; j$ < to$; ++j$) {
2291
+ i = j$;
2292
+ d[i] = d[i] + body[i] * 0.6 + body2[i] * 0.3;
2293
+ }
2294
+ fadeOut(d, 0.05);
2295
+ p = (o.pan || 0) + (k / Math.max(1, notes.length - 1) - 0.5) * 0.3;
2296
+ gl = Math.cos((p + 1) * Math.PI / 4);
2297
+ gr = Math.sin((p + 1) * Math.PI / 4);
2298
+ for (j$ = 0, to$ = d.length; j$ < to$; ++j$) {
2299
+ i = j$;
2300
+ L[at + i] += d[i] * gl;
2301
+ lresult$.push(R[at + i] += d[i] * gr);
2302
+ }
2303
+ results$.push(lresult$);
2304
+ }
2305
+ return results$;
2306
+ });
2307
+ };
2308
+ synth.kick = function(o){
2309
+ var f1, dec, punch;
2310
+ o == null && (o = {});
2311
+ f1 = o.tune || 50;
2312
+ dec = o.decay || 0.3;
2313
+ punch = o.punch != null ? o.punch : 0.5;
2314
+ return make(dec * 2 + 0.05, function(L, R, n){
2315
+ var d, ph, ck, i$, i, t;
2316
+ d = new Float32Array(n);
2317
+ ph = 0;
2318
+ ck = biquad(noise(n, rng(o.seed || 97)), 'lp', 4000);
2319
+ for (i$ = 0; i$ < n; ++i$) {
2320
+ i = i$;
2321
+ t = i / SR;
2322
+ ph += 2 * Math.PI * (f1 + f1 * 2 * Math.exp(-t / 0.03)) / SR;
2323
+ d[i] = Math.tanh((Math.sin(ph) * env(t, 0.001, dec) + ck[i] * punch * 0.6 * env(t, 0.0002, 0.003)) * (1 + 2 * punch));
2324
+ }
2325
+ return pan(L, R, fadeOut(d), o.pan);
2326
+ });
2327
+ };
2328
+ synth.snare = function(o){
2329
+ var f, dec, snappy;
2330
+ o == null && (o = {});
2331
+ f = o.tune || 180;
2332
+ dec = o.decay || 0.15;
2333
+ snappy = o.snappy != null ? o.snappy : 0.6;
2334
+ return make(dec * 2 + 0.05, function(L, R, n){
2335
+ var d, nz, i$, i;
2336
+ d = new Float32Array(n);
2337
+ partial(d, 0, f, 0.8, 0.05);
2338
+ partial(d, 0, f * 1.83, 0.4, 0.035);
2339
+ nz = biquad(biquad(noise(n, rng(o.seed || 101)), 'hp', 1200), 'lp', 9000);
2340
+ for (i$ = 0; i$ < n; ++i$) {
2341
+ i = i$;
2342
+ d[i] += nz[i] * snappy * 1.2 * env(i / SR, 0.001, dec * 0.8);
2343
+ }
2344
+ return pan(L, R, fadeOut(d), o.pan);
2345
+ });
2346
+ };
2347
+ metal = function(n, scale){
2348
+ var d, i$, ref$, len$, f, w, ph, j$, i;
2349
+ scale == null && (scale = 1);
2350
+ d = new Float32Array(n);
2351
+ for (i$ = 0, len$ = (ref$ = [205.3, 304.4, 369.6, 522.7, 540, 800]).length; i$ < len$; ++i$) {
2352
+ f = ref$[i$];
2353
+ w = f * scale / SR;
2354
+ ph = 0;
2355
+ for (j$ = 0; j$ < n; ++j$) {
2356
+ i = j$;
2357
+ ph += w;
2358
+ d[i] += ph % 1 < 0.5
2359
+ ? 1
2360
+ : -1;
2361
+ }
2362
+ }
2363
+ return d;
2364
+ };
2365
+ synth.hihat = function(o){
2366
+ var open, dec;
2367
+ o == null && (o = {});
2368
+ open = o.open || 0;
2369
+ dec = 0.04 + open * 0.5;
2370
+ return make(dec * 2.5 + 0.02, function(L, R, n){
2371
+ var m, nz, d, i$, i;
2372
+ m = metal(n, o.tune || 1);
2373
+ nz = noise(n, rng(o.seed || 103));
2374
+ d = new Float32Array(n);
2375
+ for (i$ = 0; i$ < n; ++i$) {
2376
+ i = i$;
2377
+ d[i] = m[i] * 0.15 + nz[i] * 0.5;
2378
+ }
2379
+ biquad(biquad(d, 'hp', 7000), 'bp', 10000, 0.8);
2380
+ for (i$ = 0; i$ < n; ++i$) {
2381
+ i = i$;
2382
+ d[i] *= env(i / SR, 0.0008, dec);
2383
+ }
2384
+ return pan(L, R, fadeOut(d), o.pan);
2385
+ });
2386
+ };
2387
+ synth.tom = function(o){
2388
+ var f, dec;
2389
+ o == null && (o = {});
2390
+ f = S.freq(o.note || 'A2');
2391
+ dec = o.decay || 0.35;
2392
+ return make(dec * 2 + 0.05, function(L, R, n){
2393
+ var d, ph, nz, i$, i, t;
2394
+ d = new Float32Array(n);
2395
+ ph = 0;
2396
+ nz = biquad(noise(n, rng(o.seed || 107)), 'bp', f * 4, 1);
2397
+ for (i$ = 0; i$ < n; ++i$) {
2398
+ i = i$;
2399
+ t = i / SR;
2400
+ ph += 2 * Math.PI * f * (1 + 0.5 * Math.exp(-t / 0.04)) / SR;
2401
+ d[i] = Math.sin(ph) * env(t, 0.002, dec) + nz[i] * 0.3 * env(t, 0.001, 0.02);
2402
+ }
2403
+ return pan(L, R, fadeOut(d), o.pan);
2404
+ });
2405
+ };
2406
+ synth.clap = function(o){
2407
+ var dec;
2408
+ o == null && (o = {});
2409
+ dec = o.decay || 0.12;
2410
+ return make(dec * 2.5 + 0.06, function(L, R, n){
2411
+ var nz, d, i$, i, t, a, j$, ref$, len$, at;
2412
+ nz = biquad(noise(n, rng(o.seed || 109)), 'bp', 1100, 1.2);
2413
+ d = new Float32Array(n);
2414
+ for (i$ = 0; i$ < n; ++i$) {
2415
+ i = i$;
2416
+ t = i / SR;
2417
+ a = 0;
2418
+ for (j$ = 0, len$ = (ref$ = [0, 0.011, 0.022]).length; j$ < len$; ++j$) {
2419
+ at = ref$[j$];
2420
+ if (t >= at) {
2421
+ a += env(t - at, 0.0005, 0.006);
2422
+ }
2423
+ }
2424
+ if (t >= 0.031) {
2425
+ a += env(t - 0.031, 0.001, dec);
2426
+ }
2427
+ d[i] = nz[i] * a;
2428
+ }
2429
+ L.set(d);
2430
+ return R.set(biquad(Float32Array.from(d), 'bp', 1300, 1.5));
2431
+ });
2432
+ };
2433
+ ring = function(d, at, f, a, tau, att){
2434
+ var o0, g, w, c, s, x, y, A, an, i$, to$, i, k, t, results$ = [];
2435
+ att == null && (att = 0.0005);
2436
+ if (f >= SR * 0.45) {
2437
+ return;
2438
+ }
2439
+ o0 = Math.round(at * SR);
2440
+ g = Math.exp(-1 / (tau * SR));
2441
+ w = 2 * Math.PI * f / SR;
2442
+ c = Math.cos(w);
2443
+ s = Math.sin(w);
2444
+ x = 1;
2445
+ y = 0;
2446
+ A = a;
2447
+ an = Math.max(1, Math.round(att * SR));
2448
+ for (i$ = o0, to$ = d.length; i$ < to$; ++i$) {
2449
+ i = i$;
2450
+ k = i - o0;
2451
+ d[i] += y * A * (k < an ? k / an : 1);
2452
+ t = x * c - y * s;
2453
+ y = x * s + y * c;
2454
+ x = t;
2455
+ A *= g;
2456
+ if (A < 1e-5) {
2457
+ break;
2458
+ }
2459
+ }
2460
+ return results$;
2461
+ };
2462
+ gauss = function(r){
2463
+ return Math.sqrt(-2 * Math.log(r() + 1e-12)) * Math.cos(2 * Math.PI * r());
2464
+ };
2465
+ synth.crash = function(o){
2466
+ var dec, tune;
2467
+ o == null && (o = {});
2468
+ dec = o.decay || 1;
2469
+ tune = o.tune || 1;
2470
+ return make(2.4 * dec + 0.1, function(L, R, n){
2471
+ var r, i$, ref$, len$, ch, j$, k, f, nz, sh, i, t, results$ = [];
2472
+ r = rng(o.seed || 113);
2473
+ for (i$ = 0, len$ = (ref$ = [L, R]).length; i$ < len$; ++i$) {
2474
+ ch = ref$[i$];
2475
+ for (j$ = 0; j$ < 260; ++j$) {
2476
+ k = j$;
2477
+ f = Math.max(1200, Math.min(14000, 4200 * Math.pow(2, 0.55 * gauss(r)))) * tune;
2478
+ ring(ch, 0, f, (0.4 + r()) / 16, 0.3 * dec * Math.pow(f / 4200 / tune, -0.8) * (0.6 + 0.8 * r()), 0.002 + 0.07 * r() * Math.min(1, f / 4200 / tune));
2479
+ }
2480
+ for (j$ = 0; j$ < 30; ++j$) {
2481
+ k = j$;
2482
+ ring(ch, 0, 350 * tune * Math.pow(3, r()), (0.3 + r()) / 14, 0.5 * dec * (0.6 + 0.8 * r()), 0.003);
2483
+ }
2484
+ nz = biquad(noise(n, r), 'lp', 9000);
2485
+ sh = biquad(noise(n, r), 'bp', 4200 * tune, 0.8);
2486
+ for (j$ = 0; j$ < n; ++j$) {
2487
+ i = j$;
2488
+ t = i / SR;
2489
+ ch[i] += nz[i] * 0.4 * env(t, 0.0005, 0.008) + sh[i] * 0.1 * env(t, 0.03, 0.3 * dec);
2490
+ }
2491
+ biquad(ch, 'hp', 250);
2492
+ results$.push(fadeOut(ch, 0.1));
2493
+ }
2494
+ return results$;
2495
+ });
2496
+ };
2497
+ synth.ride = function(o){
2498
+ var dec, tune, bell;
2499
+ o == null && (o = {});
2500
+ dec = o.decay || 1;
2501
+ tune = o.tune || 1;
2502
+ bell = o.bell || 0;
2503
+ return make(4 * dec + 0.1, function(L, R, n){
2504
+ var r, st, i$, ref$, len$, ch, j$, to$, i, k, f, sh, results$ = [];
2505
+ r = rng(o.seed || 127);
2506
+ st = biquad(noise(n, r), 'bp', 4800 * tune, 0.7);
2507
+ for (i$ = 0, len$ = (ref$ = [L, R]).length; i$ < len$; ++i$) {
2508
+ ch = ref$[i$];
2509
+ for (j$ = 0, to$ = Math.round(0.05 * SR); j$ < to$; ++j$) {
2510
+ i = j$;
2511
+ ch[i] += st[i] * 0.9 * env(i / SR, 0.0003, 0.006);
2512
+ }
2513
+ for (j$ = 0; j$ < 40; ++j$) {
2514
+ k = j$;
2515
+ ring(ch, 0, (5000 + 4000 * r()) * tune, 0.04, 0.015 + 0.03 * r());
2516
+ }
2517
+ for (j$ = 0; j$ < 180; ++j$) {
2518
+ k = j$;
2519
+ f = Math.max(700, Math.min(10000, 2600 * Math.pow(2, 0.55 * gauss(r)))) * tune;
2520
+ ring(ch, 0, f, (0.4 + r()) / 80, 0.9 * dec * Math.pow(f / 2600 / tune, -0.3) * (0.6 + 0.8 * r()), 0.001);
2521
+ }
2522
+ sh = biquad(noise(n, r), 'bp', 3000 * tune, 0.7);
2523
+ for (j$ = 0; j$ < n; ++j$) {
2524
+ i = j$;
2525
+ ch[i] += sh[i] * 0.05 * env(i / SR, 0.002, 0.35 * dec);
2526
+ }
2527
+ if (bell) {
2528
+ for (j$ = 0; j$ < 14; ++j$) {
2529
+ k = j$;
2530
+ f = 2800 * tune * Math.pow(2, 0.4 * gauss(r));
2531
+ ring(ch, 0, f, bell * (0.5 + r()) / 6, 0.5 * dec * (0.6 + 0.8 * r()), 0.001);
2532
+ }
2533
+ }
2534
+ biquad(ch, 'hp', 400);
2535
+ results$.push(fadeOut(ch, 0.1));
2536
+ }
2537
+ return results$;
2538
+ });
2539
+ };
2540
+ KIT = {
2541
+ kick: ['kick', {}, 1],
2542
+ snare: ['snare', {}, 0.9],
2543
+ hihat: ['hihat', {}, 0.45],
2544
+ ohat: [
2545
+ 'hihat', {
2546
+ open: 0.6
2547
+ }, 0.45
2548
+ ],
2549
+ tom: ['tom', {}, 0.8],
2550
+ ltom: [
2551
+ 'tom', {
2552
+ note: 'E2'
2553
+ }, 0.8
2554
+ ],
2555
+ htom: [
2556
+ 'tom', {
2557
+ note: 'D3'
2558
+ }, 0.8
2559
+ ],
2560
+ clap: ['clap', {}, 0.8],
2561
+ crash: ['crash', {}, 0.55],
2562
+ ride: ['ride', {}, 0.4]
2563
+ };
2564
+ VEL = {
2565
+ X: 1,
2566
+ x: 0.75,
2567
+ o: 0.4
2568
+ };
2569
+ synth.beat = function(o){
2570
+ var step, bars, swing, pat, hits, steps, tail, name, def, ref$, str, opt, kind, base, g, b, s, total;
2571
+ o == null && (o = {});
2572
+ step = 60 / (o.bpm || 100) / 4;
2573
+ bars = o.bars || 1;
2574
+ swing = o.swing || 0;
2575
+ pat = o.pattern || {
2576
+ kick: 'x...x...x...x...',
2577
+ snare: '....x.......x...',
2578
+ hihat: 'x.x.x.x.x.x.x.x.'
2579
+ };
2580
+ hits = [];
2581
+ steps = 0;
2582
+ tail = 0;
2583
+ for (name in pat) {
2584
+ def = pat[name];
2585
+ ref$ = Array.isArray(def)
2586
+ ? def
2587
+ : [def], str = ref$[0], opt = ref$[1];
2588
+ opt = opt || {};
2589
+ ref$ = KIT[name] || [name, {}, 0.8], kind = ref$[0], base = ref$[1], g = ref$[2];
2590
+ if (!synth[kind]) {
2591
+ continue;
2592
+ }
2593
+ b = synth[kind](import$(import$({}, base), opt));
2594
+ tail = Math.max(tail, b.duration);
2595
+ s = (str || '').replace(/[\s|]/g, '');
2596
+ steps = Math.max(steps, s.length);
2597
+ hits.push({
2598
+ b: b,
2599
+ s: s,
2600
+ g: opt.gain != null ? opt.gain : g
2601
+ });
2602
+ }
2603
+ total = steps * bars;
2604
+ return make(Math.max(0.1, total * step + tail), function(L, R, n){
2605
+ var i$, ref$, len$, ref1$, b, s, g, lresult$, j$, to$, k, v, results$ = [];
2606
+ for (i$ = 0, len$ = (ref$ = hits).length; i$ < len$; ++i$) {
2607
+ ref1$ = ref$[i$], b = ref1$.b, s = ref1$.s, g = ref1$.g;
2608
+ lresult$ = [];
2609
+ for (j$ = 0, to$ = total; j$ < to$; ++j$) {
2610
+ k = j$;
2611
+ v = VEL[s[k % steps]];
2612
+ if (!v) {
2613
+ continue;
2614
+ }
2615
+ lresult$.push(place(L, R, b, k * step + (k % 2 ? swing * step * 0.5 : 0), v * g));
2616
+ }
2617
+ results$.push(lresult$);
2618
+ }
2619
+ return results$;
2620
+ });
2621
+ };
2622
+ synth.sweep = function(o){
2623
+ var dur, f0, f1, att, rel, fu;
2624
+ o == null && (o = {});
2625
+ dur = o.dur || 1;
2626
+ f0 = S.freq(o.from || 200);
2627
+ f1 = S.freq(o.to || 2000);
2628
+ att = o.attack != null ? o.attack : 0.01;
2629
+ rel = o.release != null ? o.release : 0.1;
2630
+ fu = o.curve === 'lin'
2631
+ ? function(u){
2632
+ return f0 + (f1 - f0) * u;
2633
+ }
2634
+ : function(u){
2635
+ return f0 * Math.pow(f1 / f0, u);
2636
+ };
2637
+ return make(dur, function(L, R, n){
2638
+ var d, x, ph, i, p, i$, t;
2639
+ d = o.wave === 'noise'
2640
+ ? biquadTv(noise(n, rng(o.seed || 131)), 'bp', fu, o.q || 2)
2641
+ : (x = new Float32Array(n), ph = 0, (function(){
2642
+ var i$, to$, results$ = [];
2643
+ for (i$ = 0, to$ = n; i$ < to$; ++i$) {
2644
+ i = i$;
2645
+ ph += fu(i / n) / SR;
2646
+ p = ph % 1;
2647
+ results$.push(x[i] = (fn$()));
2648
+ }
2649
+ return results$;
2650
+ function fn$(){
2651
+ switch (o.wave) {
2652
+ case 'square':
2653
+ if (p < 0.5) {
2654
+ return 0.6;
2655
+ } else {
2656
+ return -0.6;
2657
+ }
2658
+ case 'saw':
2659
+ return (2 * p - 1) * 0.6;
2660
+ case 'triangle':
2661
+ return 1 - 4 * Math.abs(p - 0.5);
2662
+ default:
2663
+ return Math.sin(2 * Math.PI * p);
2664
+ }
2665
+ }
2666
+ }()), x);
2667
+ for (i$ = 0; i$ < n; ++i$) {
2668
+ i = i$;
2669
+ t = i / SR;
2670
+ d[i] *= Math.min(1, t / Math.max(0.001, att), (dur - t) / Math.max(0.001, rel));
2671
+ }
2672
+ return pan(L, R, d, o.pan);
2673
+ });
2674
+ };
2675
+ parseScore = function(text){
2676
+ var beats, out, i$, ref$, len$, tok, m, b, notes, ref1$, j$, len1$, nm;
2677
+ text == null && (text = '');
2678
+ beats = 1;
2679
+ out = [];
2680
+ for (i$ = 0, len$ = (ref$ = text.split(/\s+/)).length; i$ < len$; ++i$) {
2681
+ tok = ref$[i$];
2682
+ if (tok && tok !== '|') {
2683
+ m = /^([^\/]+?)(?:\/(\d+))?(\.*)$/.exec(tok);
2684
+ if (!m) {
2685
+ throw new Error("看不懂的樂譜: " + tok);
2686
+ }
2687
+ if (m[2]) {
2688
+ beats = 4 / +m[2];
2689
+ }
2690
+ b = beats * (m[3].length === 1
2691
+ ? 1.5
2692
+ : m[3].length >= 2 ? 1.75 : 1);
2693
+ notes = (ref1$ = m[1]) === '-' || ref1$ === 'r' || ref1$ === 'R'
2694
+ ? []
2695
+ : m[1].split('+');
2696
+ for (j$ = 0, len1$ = notes.length; j$ < len1$; ++j$) {
2697
+ nm = notes[j$];
2698
+ if (!/^[A-G](#|b)?-?\d$/.test(nm)) {
2699
+ throw new Error("看不懂的音名: " + nm);
2700
+ }
2701
+ }
2702
+ out.push({
2703
+ notes: notes,
2704
+ beats: b
2705
+ });
2706
+ }
2707
+ }
2708
+ return out;
2709
+ };
2710
+ S.score = function(text, o){
2711
+ var spb, t, out, i$, ref$, len$, x, j$, ref1$, len1$, nm;
2712
+ o == null && (o = {});
2713
+ spb = 60 / (o.bpm || 100);
2714
+ t = 0;
2715
+ out = [];
2716
+ for (i$ = 0, len$ = (ref$ = parseScore(text)).length; i$ < len$; ++i$) {
2717
+ x = ref$[i$];
2718
+ for (j$ = 0, len1$ = (ref1$ = x.notes).length; j$ < len1$; ++j$) {
2719
+ nm = ref1$[j$];
2720
+ out.push([+(t * spb).toFixed(4), nm, +(x.beats * spb * 0.92).toFixed(4)]);
2721
+ }
2722
+ t += x.beats;
2723
+ }
2724
+ return out;
2725
+ };
2726
+ S.score.parse = parseScore;
2727
+ S.score.duration = function(text, o){
2728
+ o == null && (o = {});
2729
+ return parseScore(text).reduce(function(a, x){
2730
+ return a + x.beats;
2731
+ }, 0) * 60 / (o.bpm || 100);
2732
+ };
2733
+ TWINKLE = 'C4/4 C4 G4 G4 | A4 A4 G4/2 | F4/4 F4 E4 E4 | D4 D4 C4/2';
2734
+ synth.score = function(o){
2735
+ var text, notes, total, inst, rel, pitched, src, base, cache;
2736
+ o == null && (o = {});
2737
+ text = o.score || TWINKLE;
2738
+ notes = S.score(text, {
2739
+ bpm: o.bpm
2740
+ });
2741
+ total = S.score.duration(text, {
2742
+ bpm: o.bpm
2743
+ });
2744
+ inst = o.instrument || 'pluck';
2745
+ rel = o.release != null ? o.release : 0.1;
2746
+ pitched = typeof inst === 'string' && S.params[inst] && S.params[inst].some(function(p){
2747
+ return p.k === 'note';
2748
+ });
2749
+ if (pitched) {
2750
+ return synth.melody({
2751
+ notes: notes,
2752
+ instrument: inst,
2753
+ release: rel,
2754
+ dur: total + rel + 1
2755
+ });
2756
+ }
2757
+ src = isBuffer(inst)
2758
+ ? inst
2759
+ : synth[inst]
2760
+ ? synth[inst]({})
2761
+ : synth.pluck({});
2762
+ base = S.freq(o.base || 'C4');
2763
+ cache = {};
2764
+ return make(total + src.duration * 2 + 0.1, function(L, R, n){
2765
+ var i$, ref$, len$, ref1$, t, nm, ratio, results$ = [];
2766
+ for (i$ = 0, len$ = (ref$ = notes).length; i$ < len$; ++i$) {
2767
+ ref1$ = ref$[i$], t = ref1$[0], nm = ref1$[1];
2768
+ ratio = S.freq(nm) / base;
2769
+ cache[nm] == null && (cache[nm] = resample(src, ratio, 1));
2770
+ results$.push(place(L, R, cache[nm], t, 0.8));
2771
+ }
2772
+ return results$;
2773
+ });
2774
+ };
2775
+ resample = function(buf, rate, gain){
2776
+ var src, m, n, out, i$, ch, d, x, j$, i, p, j, f;
2777
+ src = [buf.getChannelData(0), buf.getChannelData(1)];
2778
+ m = buf.length;
2779
+ n = Math.max(1, Math.round(m / rate));
2780
+ out = new AudioBuffer({
2781
+ length: n,
2782
+ sampleRate: SR,
2783
+ numberOfChannels: 2
2784
+ });
2785
+ for (i$ = 0; i$ < 2; ++i$) {
2786
+ ch = i$;
2787
+ d = new Float32Array(n);
2788
+ x = src[ch];
2789
+ for (j$ = 0; j$ < n; ++j$) {
2790
+ i = j$;
2791
+ p = i * rate;
2792
+ j = Math.floor(p);
2793
+ f = p - j;
2794
+ d[i] = ((x[j] || 0) * (1 - f) + (x[j + 1] || 0) * f) * gain;
2795
+ }
2796
+ out.copyToChannel(d, ch);
2797
+ }
2798
+ return out;
2799
+ };
2800
+ wrap = function(fn){
2801
+ return function(o){
2802
+ var v, j, b, ref$, mix;
2803
+ o == null && (o = {});
2804
+ if (o.vary) {
2805
+ v = rng((o.seed || 1) * 7919 + 13);
2806
+ j = jitter(o.vary, v(), v());
2807
+ b = fn((ref$ = import$({}, o), ref$.seed = (o.seed || 1) * 1009 + 1 + Math.floor(v() * 1e5), ref$));
2808
+ b = resample(b, j.rate, j.gain);
2809
+ } else {
2810
+ b = fn(o);
2811
+ }
2812
+ mix = o.reverb != null
2813
+ ? o.reverb
2814
+ : fn.reverb || 0;
2815
+ if (mix > 0) {
2816
+ return reverb(b, mix, o.room != null ? o.room : 0.5);
2817
+ } else {
2818
+ return b;
2819
+ }
2820
+ };
2821
+ };
2822
+ for (k in synth) {
2823
+ synth[k] = wrap(synth[k]);
2824
+ }
2825
+ S.variants = function(name, opt, count){
2826
+ var i$, k, ref$, results$ = [];
2827
+ opt == null && (opt = {});
2828
+ count == null && (count = 4);
2829
+ for (i$ = 0; i$ < count; ++i$) {
2830
+ k = i$;
2831
+ results$.push(synth[name]((ref$ = import$({
2832
+ vary: 0.5
2833
+ }, opt), ref$.seed = (opt.seed || 0) + k + 1, ref$)));
2834
+ }
2835
+ return results$;
2836
+ };
2837
+ PARAMS = {
2838
+ click: {
2839
+ freq: [500, 5000, 10, 2000],
2840
+ seed: [1, 99, 1, 7],
2841
+ pan: [-1, 1, 0.05, 0]
2842
+ },
2843
+ tick: {
2844
+ note: {
2845
+ note: null,
2846
+ hint: "1800 Hz"
2847
+ },
2848
+ pan: [-1, 1, 0.05, 0]
2849
+ },
2850
+ pop: {
2851
+ from: [100, 2000, 10, 380],
2852
+ to: [100, 3000, 10, 900],
2853
+ pan: [-1, 1, 0.05, 0]
2854
+ },
2855
+ toggle: {
2856
+ pan: [-1, 1, 0.05, 0]
2857
+ },
2858
+ type: {
2859
+ seed: [1, 99, 1, 11]
2860
+ },
2861
+ thump: {
2862
+ seed: [1, 99, 1, 5],
2863
+ pan: [-1, 1, 0.05, 0]
2864
+ },
2865
+ snap: {
2866
+ seed: [1, 99, 1, 41],
2867
+ pan: [-1, 1, 0.05, 0]
2868
+ },
2869
+ chime: {
2870
+ note: {
2871
+ note: "E6"
2872
+ },
2873
+ dur: [0.3, 4, 0.1, 1.4],
2874
+ pan: [-1, 1, 0.05, 0],
2875
+ reverb: [0, 1, 0.05, 0],
2876
+ room: [0, 1, 0.05, 0.5]
2877
+ },
2878
+ success: {
2879
+ pan: [-1, 1, 0.05, 0],
2880
+ reverb: [0, 1, 0.05, 0],
2881
+ room: [0, 1, 0.05, 0.5]
2882
+ },
2883
+ notify: {
2884
+ pan: [-1, 1, 0.05, 0],
2885
+ reverb: [0, 1, 0.05, 0],
2886
+ room: [0, 1, 0.05, 0.5]
2887
+ },
2888
+ error: {
2889
+ from: {
2890
+ note: "B3"
2891
+ },
2892
+ to: {
2893
+ note: "F3"
2894
+ },
2895
+ pan: [-1, 1, 0.05, 0]
2896
+ },
2897
+ correct: {
2898
+ style: {
2899
+ options: ["pingpong", "arp"],
2900
+ def: "pingpong"
2901
+ },
2902
+ notes: {
2903
+ json: null
2904
+ },
2905
+ gap: [0.03, 0.4, 0.01, 0.2],
2906
+ pan: [-1, 1, 0.05, 0],
2907
+ reverb: [0, 1, 0.05, 0.15],
2908
+ room: [0, 1, 0.05, 0.5]
2909
+ },
2910
+ wrong: {
2911
+ style: {
2912
+ options: ["buzzer", "trombone"],
2913
+ def: "buzzer"
2914
+ },
2915
+ pitch: [60, 400, 1, 140],
2916
+ pan: [-1, 1, 0.05, 0]
2917
+ },
2918
+ reveal: {
2919
+ notes: {
2920
+ json: ["C6", "E6", "G6", "C7", "E7"]
2921
+ },
2922
+ gap: [0.02, 0.2, 0.01, 0.06],
2923
+ seed: [1, 99, 1, 53],
2924
+ pan: [-1, 1, 0.05, 0],
2925
+ reverb: [0, 1, 0.05, 0.35],
2926
+ room: [0, 1, 0.05, 0.5]
2927
+ },
2928
+ whoosh: {
2929
+ dur: [0.1, 2, 0.05, 0.7],
2930
+ from: [50, 5000, 10, 400],
2931
+ peak: [50, 6000, 10, 2600],
2932
+ to: [50, 5000, 10, 600],
2933
+ at: [0.05, 0.95, 0.01, 0.45],
2934
+ q: [0.3, 6, 0.1, 1.2],
2935
+ seed: [1, 99, 1, 3]
2936
+ },
2937
+ swell: {
2938
+ dur: [0.5, 6, 0.1, 2],
2939
+ seed: [1, 99, 1, 23]
2940
+ },
2941
+ slide: {
2942
+ dur: [0.1, 1, 0.05, 0.3],
2943
+ from: [100, 6000, 10, 900],
2944
+ to: [100, 6000, 10, 2600],
2945
+ q: [0.3, 4, 0.1, 0.9],
2946
+ dir: [-1, 1, 0.1, 1],
2947
+ seed: [1, 99, 1, 37]
2948
+ },
2949
+ rise: {
2950
+ from: {
2951
+ note: null,
2952
+ hint: "300 Hz"
2953
+ },
2954
+ to: {
2955
+ note: null,
2956
+ hint: "900 Hz"
2957
+ },
2958
+ dur: [0.1, 3, 0.05, 0.6],
2959
+ pan: [-1, 1, 0.05, 0]
2960
+ },
2961
+ fall: {
2962
+ from: {
2963
+ note: null,
2964
+ hint: "900 Hz"
2965
+ },
2966
+ to: {
2967
+ note: null,
2968
+ hint: "250 Hz"
2969
+ },
2970
+ dur: [0.1, 3, 0.05, 0.6],
2971
+ pan: [-1, 1, 0.05, 0]
2972
+ },
2973
+ count: {
2974
+ n: [2, 40, 1, 12],
2975
+ dur: [0.2, 4, 0.1, 1.2],
2976
+ ease: {
2977
+ options: ["out", "in", "linear"],
2978
+ def: "out"
2979
+ },
2980
+ climb: [0, 24, 1, 7],
2981
+ note: {
2982
+ note: "C6"
2983
+ },
2984
+ pan: [-1, 1, 0.05, 0]
2985
+ },
2986
+ draw: {
2987
+ dur: [0.2, 4, 0.1, 1],
2988
+ rough: [0, 1, 0.05, 0.5],
2989
+ pitch: [500, 8000, 50, 2500],
2990
+ seed: [1, 99, 1, 43],
2991
+ pan: [-1, 1, 0.05, 0]
2992
+ },
2993
+ glitch: {
2994
+ dur: [0.1, 2, 0.05, 0.5],
2995
+ seed: [1, 99, 1, 47]
2996
+ },
2997
+ sweep: {
2998
+ wave: {
2999
+ options: ["sine", "triangle", "square", "saw", "noise"],
3000
+ def: "sine"
3001
+ },
3002
+ curve: {
3003
+ options: ["exp", "lin"],
3004
+ def: "exp"
3005
+ },
3006
+ from: {
3007
+ note: null,
3008
+ hint: "200 Hz"
3009
+ },
3010
+ to: {
3011
+ note: null,
3012
+ hint: "2000 Hz"
3013
+ },
3014
+ dur: [0.1, 4, 0.05, 1],
3015
+ q: [0.3, 10, 0.1, 2],
3016
+ attack: [0, 1, 0.01, 0.01],
3017
+ release: [0, 2, 0.01, 0.1],
3018
+ pan: [-1, 1, 0.05, 0]
3019
+ },
3020
+ tension: {
3021
+ note: {
3022
+ note: "A2"
3023
+ },
3024
+ dur: [1, 12, 0.5, 6]
3025
+ },
3026
+ heartbeat: {
3027
+ bpm: [40, 180, 1, 70],
3028
+ dur: [1, 10, 0.5, 4],
3029
+ pan: [-1, 1, 0.05, 0]
3030
+ },
3031
+ clock: {
3032
+ bpm: [30, 240, 1, 60],
3033
+ dur: [1, 10, 0.5, 4],
3034
+ seed: [1, 99, 1, 59],
3035
+ pan: [-1, 1, 0.05, 0]
3036
+ },
3037
+ fingersnap: {
3038
+ tone: [2000, 5000, 10, 3200],
3039
+ seed: [1, 99, 1, 137],
3040
+ pan: [-1, 1, 0.05, 0]
3041
+ },
3042
+ huh: {
3043
+ pitch: [80, 400, 1, 200],
3044
+ rise: [1, 3, 0.05, 1.9],
3045
+ dur: [0.2, 1, 0.01, 0.45],
3046
+ size: [0.8, 1.3, 0.01, 1],
3047
+ seed: [1, 99, 1, 151]
3048
+ },
3049
+ yay: {
3050
+ pitch: [100, 500, 1, 300],
3051
+ dur: [0.2, 1.2, 0.01, 0.5],
3052
+ size: [0.8, 1.3, 0.01, 1],
3053
+ seed: [1, 99, 1, 157]
3054
+ },
3055
+ paper: {
3056
+ dur: [0.4, 2.5, 0.05, 1.2],
3057
+ crisp: [0, 3, 0.1, 1],
3058
+ flutter: [0, 1, 0.05, 0.6],
3059
+ seed: [1, 99, 1, 61]
3060
+ },
3061
+ water: {
3062
+ n: [1, 300, 1, 1],
3063
+ size: [0.5, 10, 0.1, 3],
3064
+ rise: [0, 1, 0.05, 0.05],
3065
+ dur: [0.2, 10, 0.1, 0.4],
3066
+ seed: [1, 99, 1, 67]
3067
+ },
3068
+ fire: {
3069
+ dur: [1, 10, 0.5, 6],
3070
+ density: [0, 4, 0.1, 1],
3071
+ seed: [1, 99, 1, 71]
3072
+ },
3073
+ steps: {
3074
+ surface: {
3075
+ options: ["wood", "concrete", "gravel", "snow", "grass"],
3076
+ def: "wood"
3077
+ },
3078
+ gait: {
3079
+ options: ["walk", "run"],
3080
+ def: "walk"
3081
+ },
3082
+ n: [1, 12, 1, 4],
3083
+ pace: [0.2, 1.2, 0.05, 0.5],
3084
+ seed: [1, 99, 1, 73]
3085
+ },
3086
+ bell: {
3087
+ note: {
3088
+ note: "C5"
3089
+ },
3090
+ dur: [1, 10, 0.5, 5],
3091
+ pan: [-1, 1, 0.05, 0],
3092
+ reverb: [0, 1, 0.05, 0.2],
3093
+ room: [0, 1, 0.05, 0.5]
3094
+ },
3095
+ thunder: {
3096
+ dur: [2, 12, 0.5, 6],
3097
+ dist: [0, 1, 0.05, 0.5],
3098
+ seed: [1, 99, 1, 79]
3099
+ },
3100
+ wind: {
3101
+ dur: [1, 10, 0.5, 6],
3102
+ cutoff: [200, 3000, 10, 900],
3103
+ seed: [1, 99, 1, 17]
3104
+ },
3105
+ rain: {
3106
+ dur: [1, 10, 0.5, 6],
3107
+ density: [0.002, 0.2, 0.002, 0.02],
3108
+ seed: [1, 99, 1, 19]
3109
+ },
3110
+ buzz: {
3111
+ dur: [0.2, 4, 0.1, 1.5],
3112
+ freq: [80, 600, 1, 220],
3113
+ pan: [-1, 1, 0.05, 0]
3114
+ },
3115
+ pluck: {
3116
+ note: {
3117
+ note: "A3"
3118
+ },
3119
+ dur: [0.3, 5, 0.1, 2.5],
3120
+ bright: [0, 1, 0.05, 0.6],
3121
+ slide: [0, 3, 0.1, 0.6],
3122
+ seed: [1, 99, 1, 13],
3123
+ pan: [-1, 1, 0.05, 0],
3124
+ reverb: [0, 1, 0.05, 0],
3125
+ room: [0, 1, 0.05, 0.5]
3126
+ },
3127
+ guitar: {
3128
+ note: {
3129
+ note: "E3"
3130
+ },
3131
+ chord: {
3132
+ options: ["", "C", "D", "Dm", "E", "Em", "F", "G", "A", "Am"],
3133
+ def: ""
3134
+ },
3135
+ notes: {
3136
+ json: null
3137
+ },
3138
+ dir: {
3139
+ options: ["down", "up"],
3140
+ def: "down"
3141
+ },
3142
+ strum: [0, 0.1, 0.005, 0.03],
3143
+ dur: [0.5, 6, 0.1, 3],
3144
+ bright: [0, 1, 0.05, 0.5],
3145
+ pos: [0.05, 0.5, 0.01, 0.2],
3146
+ mute: [0, 1, 0.05, 0],
3147
+ seed: [1, 99, 1, 89],
3148
+ pan: [-1, 1, 0.05, 0],
3149
+ reverb: [0, 1, 0.05, 0],
3150
+ room: [0, 1, 0.05, 0.5]
3151
+ },
3152
+ marimba: {
3153
+ note: {
3154
+ note: "C4"
3155
+ },
3156
+ dur: [0.3, 4, 0.1, 1.5],
3157
+ hard: [0, 1, 0.05, 0.5],
3158
+ pan: [-1, 1, 0.05, 0],
3159
+ reverb: [0, 1, 0.05, 0],
3160
+ room: [0, 1, 0.05, 0.5]
3161
+ },
3162
+ xylophone: {
3163
+ note: {
3164
+ note: "C5"
3165
+ },
3166
+ dur: [0.2, 3, 0.1, 0.8],
3167
+ hard: [0, 1, 0.05, 0.5],
3168
+ pan: [-1, 1, 0.05, 0],
3169
+ reverb: [0, 1, 0.05, 0],
3170
+ room: [0, 1, 0.05, 0.5]
3171
+ },
3172
+ vibraphone: {
3173
+ note: {
3174
+ note: "F4"
3175
+ },
3176
+ dur: [0.5, 6, 0.1, 3],
3177
+ trem: [0, 1, 0.05, 0.35],
3178
+ hard: [0, 1, 0.05, 0.5],
3179
+ pan: [-1, 1, 0.05, 0],
3180
+ reverb: [0, 1, 0.05, 0],
3181
+ room: [0, 1, 0.05, 0.5]
3182
+ },
3183
+ glockenspiel: {
3184
+ note: {
3185
+ note: "C6"
3186
+ },
3187
+ dur: [0.3, 4, 0.1, 2],
3188
+ hard: [0, 1, 0.05, 0.5],
3189
+ pan: [-1, 1, 0.05, 0],
3190
+ reverb: [0, 1, 0.05, 0],
3191
+ room: [0, 1, 0.05, 0.5]
3192
+ },
3193
+ score: {
3194
+ score: {
3195
+ text: "C4/4 C4 G4 G4 | A4 A4 G4/2 | F4/4 F4 E4 E4 | D4 D4 C4/2"
3196
+ },
3197
+ instrument: {
3198
+ options: ["pluck", "marimba", "xylophone", "vibraphone", "glockenspiel", "guitar", "chime", "bell", "pop", "tick", "kick", "tom", "water"],
3199
+ def: "pluck"
3200
+ },
3201
+ bpm: [40, 240, 1, 100],
3202
+ base: {
3203
+ note: "C4"
3204
+ },
3205
+ release: [0.02, 2, 0.01, 0.1]
3206
+ },
3207
+ melody: {
3208
+ notes: {
3209
+ json: [[0, "A3"], [0.4, "C4"], [0.8, "E4"], [1.2, "A4", 2]]
3210
+ },
3211
+ instrument: {
3212
+ options: ["pluck", "marimba", "xylophone", "vibraphone", "glockenspiel", "guitar", "chime", "bell"],
3213
+ def: "pluck"
3214
+ },
3215
+ release: [0.02, 2, 0.01, 0.8],
3216
+ bright: [0, 1, 0.05, 0.6],
3217
+ slide: [0, 3, 0.1, 0.6],
3218
+ reverb: [0, 1, 0.05, 0],
3219
+ room: [0, 1, 0.05, 0.5]
3220
+ },
3221
+ drone: {
3222
+ notes: {
3223
+ json: ["A1", "E2", "A2"]
3224
+ },
3225
+ dur: [1, 12, 0.5, 8],
3226
+ attack: [0.1, 4, 0.1, 1.5],
3227
+ release: [0.1, 4, 0.1, 2]
3228
+ },
3229
+ kick: {
3230
+ tune: [30, 120, 1, 50],
3231
+ decay: [0.05, 1, 0.01, 0.3],
3232
+ punch: [0, 1, 0.05, 0.5],
3233
+ pan: [-1, 1, 0.05, 0]
3234
+ },
3235
+ snare: {
3236
+ tune: [100, 400, 1, 180],
3237
+ decay: [0.05, 0.5, 0.01, 0.15],
3238
+ snappy: [0, 1, 0.05, 0.6],
3239
+ seed: [1, 99, 1, 101],
3240
+ pan: [-1, 1, 0.05, 0]
3241
+ },
3242
+ hihat: {
3243
+ open: [0, 1, 0.05, 0],
3244
+ tune: [0.5, 2, 0.05, 1],
3245
+ seed: [1, 99, 1, 103],
3246
+ pan: [-1, 1, 0.05, 0]
3247
+ },
3248
+ tom: {
3249
+ note: {
3250
+ note: "A2"
3251
+ },
3252
+ decay: [0.1, 1, 0.01, 0.35],
3253
+ seed: [1, 99, 1, 107],
3254
+ pan: [-1, 1, 0.05, 0]
3255
+ },
3256
+ clap: {
3257
+ decay: [0.03, 0.5, 0.01, 0.12],
3258
+ seed: [1, 99, 1, 109]
3259
+ },
3260
+ crash: {
3261
+ decay: [0.3, 3, 0.05, 1],
3262
+ tune: [0.5, 2, 0.05, 1],
3263
+ seed: [1, 99, 1, 113]
3264
+ },
3265
+ ride: {
3266
+ decay: [0.3, 3, 0.05, 1],
3267
+ bell: [0, 1, 0.05, 0],
3268
+ tune: [0.5, 2, 0.05, 1],
3269
+ seed: [1, 99, 1, 127]
3270
+ },
3271
+ beat: {
3272
+ pattern: {
3273
+ json: {
3274
+ "kick": "x.......x.x.....",
3275
+ "snare": "....x.......x...",
3276
+ "hihat": "x.x.x.x.x.x.x.x."
3277
+ }
3278
+ },
3279
+ bpm: [50, 200, 1, 100],
3280
+ bars: [1, 8, 1, 1],
3281
+ swing: [0, 1, 0.05, 0],
3282
+ reverb: [0, 1, 0.05, 0],
3283
+ room: [0, 1, 0.05, 0.5]
3284
+ }
3285
+ };
3286
+ S.params = {};
3287
+ for (name in PARAMS) {
3288
+ spec = PARAMS[name];
3289
+ S.params[name] = (fn$());
3290
+ }
3291
+ SEMI = {
3292
+ C: 0,
3293
+ D: 2,
3294
+ E: 4,
3295
+ F: 5,
3296
+ G: 7,
3297
+ A: 9,
3298
+ B: 11
3299
+ };
3300
+ NAMES = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'];
3301
+ transpose = function(note, semi){
3302
+ var m, midi;
3303
+ if (typeof note === 'number') {
3304
+ return Math.round(note * Math.pow(2, semi / 12));
3305
+ }
3306
+ m = /^([A-G])(#|b)?(-?\d)$/.exec(note);
3307
+ if (!m) {
3308
+ return note;
3309
+ }
3310
+ midi = 12 * (+m[3] + 1) + SEMI[m[1]] + (m[2] === '#'
3311
+ ? 1
3312
+ : m[2] === 'b' ? -1 : 0) + semi;
3313
+ return NAMES[(midi % 12 + 12) % 12] + (Math.floor(midi / 12) - 1);
3314
+ };
3315
+ S.mutate = function(name, opt, cfg){
3316
+ var amount, r, out, i$, ref$, len$, p, ref1$, cur, v, semi;
3317
+ opt == null && (opt = {});
3318
+ cfg == null && (cfg = {});
3319
+ amount = cfg.amount != null ? cfg.amount : 0.5;
3320
+ r = cfg.seed != null
3321
+ ? rng(cfg.seed)
3322
+ : Math.random;
3323
+ out = import$({}, opt);
3324
+ for (i$ = 0, len$ = (ref$ = S.params[name] || []).length; i$ < len$; ++i$) {
3325
+ p = ref$[i$];
3326
+ if ((ref1$ = p.k) !== 'seed' && ref1$ !== 'pan' && ref1$ !== 'reverb' && ref1$ !== 'room' && ref1$ !== 'vary') {
3327
+ cur = opt[p.k] != null
3328
+ ? opt[p.k]
3329
+ : p.def;
3330
+ switch (p.type) {
3331
+ case 'range':
3332
+ v = cur + gauss(r) * amount * (p.max - p.min) * 0.15;
3333
+ v = +(Math.round(Math.max(p.min, Math.min(p.max, v)) / p.step) * p.step).toFixed(4);
3334
+ if (v === p.def) {
3335
+ delete out[p.k];
3336
+ } else {
3337
+ out[p.k] = v;
3338
+ }
3339
+ break;
3340
+ case 'select':
3341
+ if (r() < amount * 2) {
3342
+ out[p.k] = p.options[Math.floor(r() * p.options.length)];
3343
+ }
3344
+ if (out[p.k] === p.def) {
3345
+ delete out[p.k];
3346
+ }
3347
+ break;
3348
+ case 'note':
3349
+ semi = Math.round(gauss(r) * amount * 2);
3350
+ if (cur != null && semi) {
3351
+ out[p.k] = transpose(cur, semi);
3352
+ }
3353
+ }
3354
+ }
3355
+ }
3356
+ out.seed = 1 + Math.floor(r() * 99);
3357
+ if (amount > 0) {
3358
+ out.vary = +(amount * 0.5).toFixed(2);
3359
+ }
3360
+ return out;
3361
+ };
3362
+ if (typeof module !== 'undefined' && module.exports) {
3363
+ module.exports = S;
3364
+ }
3365
+ if (typeof window !== 'undefined') {
3366
+ return window.sfx = S;
3367
+ }
3368
+ function fn$(){
3369
+ var ref$, results$ = [];
3370
+ for (k in ref$ = spec) {
3371
+ v = ref$[k];
3372
+ if (Array.isArray(v)) {
3373
+ results$.push({
3374
+ k: k,
3375
+ type: 'range',
3376
+ min: v[0],
3377
+ max: v[1],
3378
+ step: v[2],
3379
+ def: v[3]
3380
+ });
3381
+ } else if (v.options) {
3382
+ results$.push({
3383
+ k: k,
3384
+ type: 'select',
3385
+ options: v.options,
3386
+ def: v.def
3387
+ });
3388
+ } else if ('note' in v) {
3389
+ results$.push({
3390
+ k: k,
3391
+ type: 'note',
3392
+ def: v.note,
3393
+ hint: v.hint
3394
+ });
3395
+ } else if ('text' in v) {
3396
+ results$.push({
3397
+ k: k,
3398
+ type: 'text',
3399
+ def: v.text
3400
+ });
3401
+ } else {
3402
+ results$.push({
3403
+ k: k,
3404
+ type: 'json',
3405
+ def: v.json
3406
+ });
3407
+ }
3408
+ }
3409
+ return results$;
3410
+ }
3411
+ })();
3412
+ function import$(obj, src){
3413
+ var own = {}.hasOwnProperty;
3414
+ for (var key in src) if (own.call(src, key)) obj[key] = src[key];
3415
+ return obj;
3416
+ }
3417
+ }).call(this);