/
Interface_3x3.ino
147 lines (124 loc) · 4.44 KB
/
Interface_3x3.ino
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/* Create a "class compliant " USB to 3 MIDI IN and 3 MIDI OUT interface.
MIDI receive (6N138 optocoupler) input circuit and series resistor
outputs need to be connected to Serial1, Serial2 and Serial3.
You must select MIDIx4 from the "Tools > USB Type" menu
This example code is in the public domain.
*/
#include <MIDI.h>
// Create the Serial MIDI ports
MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI1);
MIDI_CREATE_INSTANCE(HardwareSerial, Serial2, MIDI2);
MIDI_CREATE_INSTANCE(HardwareSerial, Serial3, MIDI3);
// A variable to know how long the LED has been turned on
elapsedMillis ledOnMillis;
void setup() {
Serial.begin(115200);
pinMode(13, OUTPUT); // LED pin
digitalWrite(13, LOW);
MIDI1.begin(MIDI_CHANNEL_OMNI);
MIDI2.begin(MIDI_CHANNEL_OMNI);
MIDI3.begin(MIDI_CHANNEL_OMNI);
}
void loop() {
bool activity = false;
if (MIDI1.read()) {
// get a MIDI IN1 (Serial) message
byte type = MIDI1.getType();
byte channel = MIDI1.getChannel();
byte data1 = MIDI1.getData1();
byte data2 = MIDI1.getData2();
// forward the message to USB MIDI virtual cable #0
if (type != midi::SystemExclusive) {
// Normal messages, simply give the data to the usbMIDI.send()
usbMIDI.send(type, data1, data2, channel, 0);
} else {
// SysEx messages are special. The message length is given in data1 & data2
unsigned int SysExLength = data1 + data2 * 256;
usbMIDI.sendSysEx(SysExLength, MIDI1.getSysExArray(), true, 0);
}
activity = true;
}
if (MIDI2.read()) {
// get a MIDI IN2 (Serial) message
byte type = MIDI2.getType();
byte channel = MIDI2.getChannel();
byte data1 = MIDI2.getData1();
byte data2 = MIDI2.getData2();
// forward the message to USB MIDI virtual cable #1
if (type != midi::SystemExclusive) {
// Normal messages, simply give the data to the usbMIDI.send()
usbMIDI.send(type, data1, data2, channel, 1);
} else {
// SysEx messages are special. The message length is given in data1 & data2
unsigned int SysExLength = data1 + data2 * 256;
usbMIDI.sendSysEx(SysExLength, MIDI1.getSysExArray(), true, 1);
}
activity = true;
}
if (MIDI3.read()) {
// get a MIDI IN1 (Serial) message
byte type = MIDI3.getType();
byte channel = MIDI3.getChannel();
byte data1 = MIDI3.getData1();
byte data2 = MIDI3.getData2();
// forward the message to USB MIDI virtual cable #0
if (type != midi::SystemExclusive) {
// Normal messages, simply give the data to the usbMIDI.send()
usbMIDI.send(type, data1, data2, channel, 2);
} else {
// SysEx messages are special. The message length is given in data1 & data2
unsigned int SysExLength = data1 + data2 * 256;
usbMIDI.sendSysEx(SysExLength, MIDI1.getSysExArray(), true, 2);
}
activity = true;
}
if (usbMIDI.read()) {
// get the USB MIDI message, defined by these 5 numbers (except SysEX)
byte type = usbMIDI.getType();
byte channel = usbMIDI.getChannel();
byte data1 = usbMIDI.getData1();
byte data2 = usbMIDI.getData2();
byte cable = usbMIDI.getCable();
// forward this message to 1 of the 3 Serial MIDI OUT ports
if (type != usbMIDI.SystemExclusive) {
// Normal messages, first we must convert usbMIDI's type (an ordinary
// byte) to the MIDI library's special MidiType.
midi::MidiType mtype = (midi::MidiType)type;
// Then simply give the data to the MIDI library send()
switch (cable) {
case 0:
MIDI1.send(mtype, data1, data2, channel);
break;
case 1:
MIDI2.send(mtype, data1, data2, channel);
break;
case 2:
MIDI3.send(mtype, data1, data2, channel);
break;
}
} else {
// SysEx messages are special. The message length is given in data1 & data2
unsigned int SysExLength = data1 + data2 * 256;
switch (cable) {
case 0:
MIDI1.sendSysEx(SysExLength, usbMIDI.getSysExArray(), true);
break;
case 1:
MIDI2.sendSysEx(SysExLength, usbMIDI.getSysExArray(), true);
break;
case 2:
MIDI3.sendSysEx(SysExLength, usbMIDI.getSysExArray(), true);
break;
}
}
activity = true;
}
// blink the LED when any activity has happened
if (activity) {
digitalWriteFast(13, HIGH); // LED on
ledOnMillis = 0;
}
if (ledOnMillis > 15) {
digitalWriteFast(13, LOW); // LED off
}
}