-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsketch.js
103 lines (69 loc) · 2.04 KB
/
sketch.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
var dirty = false;
function midiSuccess(midiAccess) {
let inputs = midiAccess.inputs.values();
let hasInputDevice = false;
for (let input = inputs.next(); input && !input.done; input = inputs.next()) {
console.log(input);
input.value.onmidimessage = handleMidiInputEvent;
hasInputDevice = true;
}
if (!hasInputDevice) {
console.warn("No MIDI input devices found.");
}
}
function midiFail(message) {
console.log(message);
}
function handleMidiInputEvent(event) {
let message = event.data;
if (message[0] == 0x90) {
//Key pressed (or sometimes released; see below)
let key = message[1];
// Some midi controllers send a 0x90 with a volume of 0, instead of 0x80, to stop a note playing
keyDown[key] = message[2] > 0;
dirty = true;
}
if (message[0] == 0x80) {
//Key released
let key = message[1];
keyDown[key] = false;
dirty = true;
}
}
function setup() {
colorMode(HSB);
navigator.requestMIDIAccess().then(midiSuccess, midiFail);
createCanvas(windowWidth, windowHeight);
noFill();
strokeWeight(2);
keyDown = [];
for (let i = 0; i < 127; ++i) {
keyDown[i] = false;
}
dirty = true;
}
function draw() {
if (!dirty) return;
background(0, 0, 0);
let amplitude = height / 8;
let centerY = height / 2;
for (let k = 0; k < 127; ++k) {
if (!keyDown[k]) continue;
let col = map(k % 12, 0, 12, 0, 360);
stroke(col, 100, 100);
let period = 15 * PI * (2 ** ((k - 60) / 12.0));
beginShape();
vertex(0, centerY - amplitude);
for (let x = 1; x < width; x += 1) {
let theta = map(x, 0, width, PI/2, period + PI/2);
let y = centerY - amplitude * sin(theta);
bezierVertex(x, y, x, y - 1, x, y);
}
endShape();
}
dirty = false;
}
function windowResized() {
resizeCanvas(windowWidth, windowHeight);
dirty = true;
}