Hello,
I am converting keyboards from an church organ, using 3 Arduino Mega (one for each keyboard) and it's working very well so far. I use it for the software sampler Hauptwerk.
I am using loopMidi and Hairless MIDI for creating virtual MIDI ports.
Well, I wanted to add some LCDs for displaying informations about the current instrument, settings etc and I have some troubles how to write the program.
I want to use at least 3 - better 4 - displays as MIDI OUT, but I receive only MIDI IN signals.
I try to implement the SysEx from Hauptwerk.
I am sure that my code is wrong, perhaps you know what to change?
Here is my code so far:
#include <LiquidCrystal_I2C.h>
#include <WireData.h>
#include <MIDI.h>
#if defined(USBCON)
#include <midi_UsbTransport.h>
#define BACKLIGHT_PIN 13
static const unsigned sUsbTransportBufferSize = 16;
typedef midi::UsbTransport UsbTransport;
UsbTransport sUsbTransport;
MIDI_CREATE_INSTANCE(UsbTransport, sUsbTransport, MIDI);
#else // No USB available, fallback to Serial
MIDI_CREATE_DEFAULT_INSTANCE();
#endif
LiquidCrystal_I2C lcd(0x26, 16, 2);
LiquidCrystal_I2C lcd2(0x27, 16, 2);
const byte MIDI_SYSEX=7; //code for SysEx
const byte ID_HAUPTWERK=0x7D; //ID for the Hauptwerk program
int midiType=0;
int data1=0;
int data2=0;
String hwline1="";
String hwline2="";
void setup() {
lcdinit();
lcdclear();
lcdbacklight(125);
updateDisplay();
}
void lcdinit(){
Serial.begin(9600);
delay(800);
// Set display 16x2
Serial.write(5);
Serial.write(2);
Serial.write(16);
Serial.write(0x26);
}
void lcdpos(byte row,byte column) {
Serial.write(2);
Serial.write(row);
Serial.write(column);
Serial.write(0x26);
}
void lcdclear(){
// Clear Display
Serial.write(4);
Serial.write(0x26);
}
void lcdbacklight(byte brightness) {
// Set backlight on
Serial.write(7);
Serial.write(brightness);
Serial.write(0x26);
}
void lcdstring(String what){
Serial.write(1);
Serial.print(what);
Serial.write(0x26);
}
void lcdchar(byte what){
Serial.write(10);
Serial.write(what);
Serial.write(0x26);
}
void loop(){
if (MIDI.read()) {
midiType=MIDI.getType();
data1=MIDI.getData1();
data2=MIDI.getData2();
//we are interested in SysEx messages
if ((midiType == MIDI_SYSEX) && (data1 < 80)) {
//this is a SysEx message and will fit in our array
byte * sysexmessage=MIDI.getSysExArray();
hwline1="";
hwline2="";
if ((sysexmessage[1]==ID_HAUPTWERK) && (data1 > 24)) {
//this is from Hauptwerk
for (int x=6; x<(22); x++){
//step through sysex message
byte c=sysexmessage[x];
hwline1 = hwline1 + char(c);
}
for (int x=22; x<(37); x++){
//step through sysex message
byte c=sysexmessage[x];
hwline2 = hwline2 + char(c);
}
updateDisplay();
}
}
}
}
void updateDisplay() {
lcdpos(1,1);
lcdstring(hwline1);
lcdpos(2,1);
lcdstring(hwline2);
}