-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathparams.js
66 lines (58 loc) · 1.94 KB
/
params.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
window.Params = {
init: function(canvas) {
var draw = canvas.getContext('2d'),
audio = new AudioContext(),
startTime = audio.currentTime,
osc = audio.createOscillator(),
analyser = audio.createAnalyser(),
data = new Float32Array(analyser.frequencyBinCount),
gainNode = audio.createGain();
duration = 3,
param = gainNode.gain;
osc.connect(gainNode);
gainNode.connect(analyser);
analyser.connect(audio.destination);
osc.start();
param.setValueAtTime(1, audio.currentTime);
param.linearRampToValueAtTime(0.01, audio.currentTime + duration / 2);
param.setValueAtTime(0.01, audio.currentTime + duration / 2);
param.exponentialRampToValueAtTime(1, audio.currentTime + duration);
var toCoords = function(e) {
var canvasRect = canvas.getClientRects()[0];
return {
s: ((e.x - canvasRect.left) / canvasRect.width) * duration,
v: ((e.y - canvasRect.top) / canvasRect.height)
};
};
canvas.onmousemove = function(e) {
var coords = toCoords(e);
s.innerText = coords.s;
v.innerText = coords.v;
};
canvas.onclick = function(e) {
toCoords(e)
};
draw.strokeStyle = 'red';
draw.textBaseline = 'bottom';
draw.strokeText('0s',0,1 * canvas.height);
draw.textAlign = 'end';
draw.strokeText(duration + 's', canvas.width, 1 * canvas.height);
draw.text
draw.strokeStyle = 'black';
draw.moveTo(0, param.value * canvas.height);
draw.beginPath();
var loop = function(){
analyser.getFloatTimeDomainData(data);
draw.lineTo(
((audio.currentTime - startTime) / duration) * canvas.width,
(1 - Math.max.apply(null,data)) * canvas.height
);
draw.stroke();
if(audio.currentTime > startTime + duration)
osc.stop();
else
requestAnimationFrame(loop);
};
requestAnimationFrame(loop);
}
};