Skip to content

Commit 1c2eac7

Browse files
committed
update demo [ci skip]
1 parent b52c0bb commit 1c2eac7

16 files changed

+132
-22
lines changed

demo/assets/sound/a11wlk01.wav

210 KB
Binary file not shown.

demo/assets/sound/amen.wav

600 KB
Binary file not shown.

demo/assets/sound/hihat1.wav

11.1 KB
Binary file not shown.

demo/assets/sound/hihat2.wav

126 KB
Binary file not shown.

demo/assets/sound/kick.wav

21.8 KB
Binary file not shown.

demo/assets/sound/snare.wav

12.1 KB
Binary file not shown.

demo/assets/sound/tom1.wav

31.6 KB
Binary file not shown.

demo/assets/sound/tom2.wav

23.6 KB
Binary file not shown.

demo/index.html

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<script src="//cdnjs.cloudflare.com/ajax/libs/codemirror/5.13.4/codemirror.min.js"></script>
1111
<script src="//cdnjs.cloudflare.com/ajax/libs/codemirror/5.13.4/mode/javascript/javascript.min.js"></script>
1212
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/1.0.21/vue.min.js"></script>
13+
<script src="//mohayonao.github.io/web-audio-scheduler/build/web-audio-scheduler.min.js"></script>
1314
<script src="../build/web-audio-engine.js"></script>
1415
<style>
1516
.btn { width: 100px; outline: none !important }
@@ -189,7 +190,11 @@ <h1>web-audio-engine :: demo</h1>
189190
context = audioContext;
190191
}
191192

192-
var util = { end: vue.stop.bind(vue), fetchAudioBuffer: fetchAudioBuffer.bind(null, context) };
193+
var util = {};
194+
195+
util.WebAudioScheduler = window.WebAudioScheduler;
196+
util.fetchAudioBuffer = fetchAudioBuffer.bind(null, context);
197+
util.end = vue.stop.bind(vue);
193198

194199
(composeFn(context, util) || Promise.resolve()).then(function() {
195200
context.resume();
@@ -210,7 +215,7 @@ <h1>web-audio-engine :: demo</h1>
210215
isPlaying: false,
211216
engine: "web-audio-engine",
212217
selected: "sines",
213-
list: [ "sines", "filter", "delay" ]
218+
list: [ "metronome", "sines", "filter", "delay", "drum" ]
214219
},
215220
methods: {
216221
run: function() {

demo/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@
6262
},
6363
"dependencies": {
6464
"optionator": "^0.8.1",
65-
"tickable-timer": "^1.0.0"
65+
"tickable-timer": "^1.0.0",
66+
"web-audio-scheduler": "^1.0.1"
6667
},
6768
"license": "MIT",
6869
"main": "demo.js",

demo/runner/runInRenderingAudioContext.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
const wae = require("../..");
44
const fs = require("fs");
55
const tickable = require("tickable-timer");
6+
const WebAudioScheduler = require("web-audio-scheduler");
67
const timerAPI = require("../util/timerAPI");
78
const consoleAPI = require("../util/consoleAPI");
89
const createContextOptions = require("../util/createContextOptions");
@@ -13,6 +14,7 @@ function runInRenderingAudioContext(func, opts) {
1314
const context = new AudioContext(createContextOptions(opts));
1415
const util = {};
1516

17+
util.WebAudioScheduler = WebAudioScheduler;
1618
util.fetchAudioBuffer = fetchAudioBuffer.bind(null, context);
1719
util.end = () => { opts.isEnded = true };
1820

demo/runner/runInStreamAudioContext.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"use strict";
22

33
const wae = require("../..");
4+
const WebAudioScheduler = require("web-audio-scheduler");
45
const timerAPI = require("../util/timerAPI");
56
const consoleAPI = require("../util/consoleAPI");
67
const createContextOptions = require("../util/createContextOptions");
@@ -11,6 +12,7 @@ function runInStreamAudioContext(func, opts) {
1112
const context = new AudioContext(createContextOptions(opts));
1213
const util = {};
1314

15+
util.WebAudioScheduler = WebAudioScheduler;
1416
util.fetchAudioBuffer = fetchAudioBuffer.bind(null, context);
1517
util.end = () => { process.exit(0) };
1618

demo/sources/delay.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ module.exports = function(context, util) {
1010
function synth(midi) {
1111
var osc = context.createOscillator();
1212
var amp = context.createGain();
13-
var delay = context.createDelay(0.25);
13+
var delay = context.createDelay(0.1);
1414
var out = context.createGain();
1515
var t0 = context.currentTime;
1616
var t1 = t0 + 0.125;
@@ -26,7 +26,7 @@ module.exports = function(context, util) {
2626
amp.connect(out);
2727
amp.connect(delay);
2828

29-
delay.delayTime.value = 0.0625;
29+
delay.delayTime.value = 0.09375;
3030
delay.connect(out);
3131

3232
return out;
@@ -41,22 +41,25 @@ module.exports = function(context, util) {
4141
input.connect(delay);
4242
input.connect(output);
4343

44-
delay.delayTime.value = 0.25;
44+
delay.delayTime.value = 0.125;
4545
delay.connect(feedback);
4646

4747
feedback.gain.value = 0.925;
4848
feedback.connect(input);
4949

50-
return { input: input, output: output };
50+
return { input: input, output: output, feedback: feedback.gain };
5151
}
5252

5353
var efx = createFeedbackDelay();
5454

5555
function compose() {
5656
var midi = sample([ 64, 65, 65, 69, 72, 76 ]) + 12;
5757
var duration = sample([ 2, 2, 3, 4 ]);
58+
var feedback = sample([ 0.4, 0.6, 0.8, 0.9, 0.975 ]);
5859
var nextTime = (duration * 1000) * Math.random();
5960

61+
efx.feedback.setTargetAtTime(feedback, context.currentTime, 1);
62+
6063
synth(midi, duration).connect(efx.input);
6164

6265
setTimeout(compose, nextTime);

demo/sources/drum.js

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
module.exports = function(context, util) {
2+
var sched = new util.WebAudioScheduler({ context: context });
3+
4+
function sample(list) {
5+
return list[(Math.random() * list.length)|0];
6+
}
7+
8+
function coin(ratio) {
9+
return Math.random() < ratio;
10+
}
11+
12+
return util.fetchAudioBuffer([ "kick.wav", "snare.wav", "hihat1.wav" ]).then(function(instruments) {
13+
function shot(e) {
14+
var inst = instruments[e.args.inst % instruments.length];
15+
var t0 = e.playbackTime;
16+
var t1 = t0 + inst.duration * e.args.duration;
17+
var bufSrc = context.createBufferSource();
18+
var gain = context.createGain();
19+
20+
bufSrc.buffer = inst;
21+
bufSrc.start(t0);
22+
bufSrc.stop(t1);
23+
bufSrc.connect(gain);
24+
25+
gain.gain.setValueAtTime(0.4 * e.args.amp, t0);
26+
gain.gain.linearRampToValueAtTime(0, t1);
27+
gain.connect(context.destination);
28+
}
29+
30+
function drum(e) {
31+
var t0;
32+
33+
for (var i = 0; i < 16; i++) {
34+
var t0 = e.playbackTime + i * 0.125;
35+
36+
// kick
37+
if (i === 0) {
38+
sched.insert(t0, shot, { inst: 0, amp: 1.0, duration: 1.00 });
39+
} else if (i % 4 === 0 && coin(0.25)) {
40+
sched.insert(t0, shot, { inst: 0, amp: 0.8, duration: 0.60 });
41+
} else if (i % 2 === 0 && coin(0.15)) {
42+
sched.insert(t0, shot, { inst: 0, amp: 0.6, duration: 0.40 });
43+
} else if (coin(0.05)) {
44+
sched.insert(t0, shot, { inst: 0, amp: 0.2, duration: 0.10 });
45+
}
46+
47+
// snare
48+
if (i % 8 === 4 && coin(0.95)) {
49+
sched.insert(t0, shot, { inst: 1, amp: 1.0, duration: 1.00 });
50+
} else if (i % 4 === 0 && coin(0.1)) {
51+
sched.insert(t0, shot, { inst: 1, amp: 0.6, duration: 0.50 });
52+
} else if (i % 4 === 3 && coin(0.1)) {
53+
sched.insert(t0, shot, { inst: 1, amp: 0.6, duration: 0.75 });
54+
} else if (coin(0.1)) {
55+
sched.insert(t0, shot, { inst: 1, amp: 0.2, duration: 0.10 });
56+
}
57+
58+
// hihat
59+
if (i % 4 === 0) {
60+
sched.insert(e.playbackTime + i * 0.125, shot, { inst: 2, amp: 0.40, duration: 1.00 });
61+
} else if (i % 2 === 0 && coin(0.5)) {
62+
sched.insert(e.playbackTime + i * 0.125, shot, { inst: 2, amp: 0.10, duration: 1.00 });
63+
} else if (coin(0.25)) {
64+
sched.insert(e.playbackTime + i * 0.125, shot, { inst: 2, amp: 0.10, duration: 0.10 });
65+
} else if (coin(0.25)) {
66+
sched.insert(e.playbackTime + i * 0.125, shot, { inst: 2, amp: 0.20, duration: 0.25 });
67+
} else if (coin(0.8)) {
68+
sched.insert(e.playbackTime + i * 0.125, shot, { inst: 2, amp: 0.05, duration: 0.85 });
69+
}
70+
}
71+
72+
sched.insert(e.playbackTime + 2.000, drum);
73+
}
74+
75+
sched.start(drum);
76+
});
77+
};

demo/sources/filter.js

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ module.exports = function(context, util) {
99

1010
function synth(midi, duration) {
1111
var filter = context.createBiquadFilter();
12-
var pan = context.createStereoPanner();
1312
var gain = context.createGain();
1413
var t0 = context.currentTime;
1514
var t1 = t0 + duration;
@@ -28,24 +27,16 @@ module.exports = function(context, util) {
2827
});
2928
});
3029

31-
var curveLength = sample([ 4, 24, 24, 32, 32, 32, 48, 128 ]);
32-
var freqCurve = new Float32Array(curveLength).map(function() {
33-
return freq * sample([ 0.25, 0.5, 1, 2, 2, 4, 4, 4, 6, 6, 8 ]);
34-
});
30+
var cutoff1 = freq * sample([ 0.25, 0.5, 1, 2, 2, 4, 4, 4, 6, 6, 8 ]);
31+
var cutoff2 = freq * sample([ 0.25, 0.5, 1, 2, 2, 4, 4, 4, 6, 6, 8 ]);
3532

3633
filter.type = "bandpass";
37-
filter.frequency.setValueCurveAtTime(freqCurve, t0, t1 - t0);
34+
filter.frequency.setValueAtTime(cutoff1, t0);
35+
filter.frequency.exponentialRampToValueAtTime(cutoff2, t1);
3836
filter.Q.value = 4;
39-
filter.connect(pan);
40-
41-
var panCurve = new Float32Array(curveLength * 8).map(function() {
42-
return sample([ -0.6, -0.4, +0.4, +0.6 ]);
43-
});
44-
45-
pan.pan.setValueCurveAtTime(panCurve, t0, t1 - t0);
46-
pan.connect(gain);
37+
filter.connect(gain);
4738

48-
gain.gain.setValueAtTime(0.125, t0);
39+
gain.gain.setValueAtTime(0.1, t0);
4940
gain.gain.linearRampToValueAtTime(0, t1);
5041
gain.connect(context.destination);
5142
}

demo/sources/metronome.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
module.exports = function(context, util) {
2+
var sched = new util.WebAudioScheduler({ context: context });
3+
4+
function metronome(e) {
5+
sched.insert(e.playbackTime + 0.000, ticktack, { frequency: 880, amp: 1.0, duration: 1.00 });
6+
sched.insert(e.playbackTime + 0.500, ticktack, { frequency: 440, amp: 0.4, duration: 0.25 });
7+
sched.insert(e.playbackTime + 1.000, ticktack, { frequency: 440, amp: 0.5, duration: 0.25 });
8+
sched.insert(e.playbackTime + 1.500, ticktack, { frequency: 440, amp: 0.4, duration: 0.25 });
9+
sched.insert(e.playbackTime + 2.000, metronome);
10+
}
11+
12+
function ticktack(e) {
13+
var t0 = e.playbackTime;
14+
var t1 = t0 + e.args.duration;
15+
var osc = context.createOscillator();
16+
var amp = context.createGain();
17+
18+
osc.frequency.value = e.args.frequency;
19+
osc.start(t0);
20+
osc.stop(t1);
21+
osc.connect(amp);
22+
23+
amp.gain.setValueAtTime(0.5 * e.args.amp, t0);
24+
amp.gain.exponentialRampToValueAtTime(1e-6, t1);
25+
amp.connect(context.destination);
26+
}
27+
28+
sched.start(metronome);
29+
};

0 commit comments

Comments
 (0)