
#midi translator box, for @dj_dad_shirt easy octave up action, or other transposing/channel filtering kinda stuff that may arise, programmable via usb. Swipe through the post below to see video of it in action, and pictures of the guts. More custom tech work like this at woz.lol
Above is a picture of the way it was mounted, which wasn’t in the post.
Script works with Arduino Uno using the normal midi shield, but in my case I used a Spark Fun Pro Micro, and pins 0/1.
// midi translator by woz.lol for Terbo Ted
#include <MIDI.h>
#define buttonpin 20
#define led1 19
#define led2 18
MIDI_CREATE_DEFAULT_INSTANCE() ;
int transpose = 12; // this sets the default to be transpose up one octave (12 semitones)
int lastnote;
int chan;
bool mode; // one octave up or two octaves up mode setting
void setup() {
MIDI.setHandleNoteOn(handleNoteOn);
MIDI.setHandleNoteOff(handleNoteOff);
MIDI.begin(MIDI_CHANNEL_OMNI) ;
MIDI.turnThruOff();
pinMode(buttonpin, INPUT_PULLUP); // when this pin is grounded it's activated
pinMode(led1, OUTPUT); // led pins
pinMode(led2, OUTPUT); // led is bi-color, red one polarity, green the other
digitalWrite(led2, HIGH);
digitalWrite(led1, LOW);
}
void loop() {
doMidi();
if (!digitalRead(buttonpin)) { // triggered when false, false when button pushed
MIDI.sendNoteOff(lastnote, 0, chan);
delay(6);
if (mode) {
mode = false;
digitalWrite(led2, HIGH);
digitalWrite(led1, LOW);
} else {
mode = true;
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
}
while (!digitalRead(buttonpin)) { //debounce
delay(1);
}
}
}
void MidiSendAsIs() //Send MIDI to out and blink once if debug is enabled
{
MIDI.send(MIDI.getType(),
MIDI.getData1(),
MIDI.getData2(),
MIDI.getChannel());
}
void handleNoteOff(byte channel, byte pitch, byte velocity) {
MIDI.send(MIDI.getType(),
pitch + transpose + (mode * 12),
MIDI.getData2(),
MIDI.getChannel());
if (mode) {
digitalWrite(led2, LOW);
} else {
digitalWrite(led1, LOW);
}
}
void handleNoteOn(byte channel, byte pitch, byte velocity) {
lastnote = pitch + transpose + (mode * 12); // if mode is true, we go up another octave
MIDI.send(MIDI.getType(),
lastnote,
MIDI.getData2(),
MIDI.getChannel());
chan = channel;
if (mode) {
digitalWrite(led2, HIGH);
} else {
digitalWrite(led1, HIGH);
}
}
void doMidi() {
if (MIDI.read()) // Is there a MIDI message incoming ?
{
switch (MIDI.getType())
{
case midi::NoteOn : {} // notes are handled elsewhere by the interrupt
break;
case midi::NoteOff : {}
break;
default: {
MidiSendAsIs();
}
break;
}
}
}