Hello,
I'm trying to build a small midi interface with a teensy 3.6 card, and the following electric druid circuit: https://electricdruid.net/wp-content/uploads/2016/04/MIDISchematic-3.jpg
I upload the example code teensy3x3, (my goal, in the long run, is to make an interface with at least 2 inputs and 2 outputs, but I'm already testing with 1 in 1 out).
Everything works, but I would like to have this operation: IN1 -> USB, USB -> OUT1 or for now, I have IN1 -> USB + IN1 -> OUT1, USB -> OUT1.
I tried to change the numbers of the virtual cables but it doesn't work...
Here is the code:
```cpp
/* 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, 3);
} 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, 4);
} 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, 5);
} 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;
case 3:
break;
case 4:
break;
case 5:
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
}
}