-
Notifications
You must be signed in to change notification settings - Fork 9
/
index.js
99 lines (86 loc) · 2.53 KB
/
index.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
"use strict";
export default function(event){
function MIDIMessage (event){
this._event = event;
this._data = event.data;
this.receivedTime = event.receivedTime;
if (this._data && this._data.length < 2){
console.warn("Illegal MIDI message of length", this._data.length);
return;
}
this._messageCode = event.data[0] & 0xf0;
this.channel = (event.data[0] & 0x0f)+1;
switch(this._messageCode){
// Note Off
case 0x80:
this.messageType = "noteoff";
this.key = event.data[1] & 0x7F;
this.velocity = event.data[2] & 0x7F;
break;
// Note On
case 0x90:
this.messageType = "noteon";
this.key = event.data[1] & 0x7F;
this.velocity = event.data[2] & 0x7F;
break;
// Polyphonic Key Pressure
case 0xA0:
this.messageType = "keypressure";
this.key = event.data[1] & 0x7F;
this.pressure = event.data[2] & 0x7F;
break;
// Control Change
case 0xB0:
this.messageType = "controlchange";
this.controllerNumber = event.data[1] & 0x7F;
this.controllerValue = event.data[2] & 0x7F;
if (this.controllerNumber === 120 && this.controllerValue === 0){
this.channelModeMessage = "allsoundoff";
}
else if (this.controllerNumber === 121){
this.channelModeMessage = "resetallcontrollers";
}
else if (this.controllerNumber === 122){
if (this.controllerValue === 0){
this.channelModeMessage = "localcontroloff";
}else{
this.channelModeMessage = "localcontrolon";
}
}
else if (this.controllerNumber === 123 && this.controllerValue === 0){
this.channelModeMessage = "allnotesoff";
}
else if (this.controllerNumber === 124 && this.controllerValue === 0){
this.channelModeMessage = "omnimodeoff";
}
else if (this.controllerNumber === 125 && this.controllerValue === 0){
this.channelModeMessage = "omnimodeon";
}
else if (this.controllerNumber === 126){
this.channelModeMessage = "monomodeon";
}
else if (this.controllerNumber === 127){
this.channelModeMessage = "polymodeon";
}
break;
// Program Change
case 0xC0:
this.messageType = "programchange";
this.program = event.data[1];
break;
// Channel Pressure
case 0xD0:
this.messageType = "channelpressure";
this.pressure = event.data[1] & 0x7F;
break;
// Pitch Bend Change
case 0xE0:
this.messageType = "pitchbendchange";
var msb = event.data[2] & 0x7F;
var lsb = event.data[1] & 0x7F;
this.pitchBend = (msb << 7) + lsb;
break;
}
}
return new MIDIMessage(event);
}