-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathvisualizer.js
69 lines (56 loc) · 1.62 KB
/
visualizer.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
67
68
69
const CAN = document.getElementById("CAN");
const CTX = CAN.getContext('2d');
function resize_can(){
CAN.width = CAN.offsetWidth;
CAN.height = CAN.offsetHeight;
}
resize_can();
window.addEventListener("resize", resize_can);
var SEG_COLORS = [
'yellow','blue','red','cyan','green','magenta'
];
function draw(ens, barP){
CTX.clearRect(0,0, CAN.width, CAN.height);
ens.forEach(seg=>{
//beats
for(var i=0, n=seg.voices.length; i<n; i++){
var v = seg.voices[i];
CTX.fillStyle = SEG_COLORS[i];
draw_beats(
v._interval,
v._subdivide,
seg._repeat,
seg._start / ens._length * CAN.width,
CAN.height / n * (0.5+i) |0,
seg.looplength / ens._length * CAN.width);
}
//segment separator line
CTX.fillStyle = "gray";
CTX.fillRect(seg._start / ens._length * CAN.width -1 |0, 0, 2, CAN.height);
//repetition dots
for(var i=1; i<seg._repeat; i++){
const x = (seg._start + (seg._end - seg._start) * i )/ ens._length * CAN.width -1 |0;
CTX.strokeStyle = "white";
CTX.lineWidth = 2;
CTX.beginPath();
CTX.setLineDash([6, 10]);
CTX.moveTo(x, 0);
CTX.lineTo(x, CAN.height);
CTX.stroke();
}
});
CTX.fillStyle = 'white';
CTX.fillRect(CAN.width * barP |0, 0, 2, CAN.height);
}
function draw_beats(interval, subdivide, repeat, x, y, W){
W = W || CAN.width;
var d = W * interval / subdivide;
var n = Math.ceil(W / d);
var N = n * repeat;
var hh = CAN.height * 0.05 |0;
var w = 5;
for(var i=0; i<N; i++){
CTX.globalAlpha = i < n ? 1 : 0.4;
CTX.fillRect(i*d +x |0, y-hh, w, i % subdivide == 0 ? hh*2 : hh*0.5);
}
}