#include #include #include #include "MIDIUSB.h" #define debug true //MCP23017 I2C addresses 0,1,2,3 and 4 INPUT_MCP23017 input_MCP23017_0; INPUT_MCP23017 input_MCP23017_1; INPUT_MCP23017 input_MCP23017_2; INPUT_MCP23017 input_MCP23017_3; INPUT_MCP23017 input_MCP23017_4; //three 74HC4051 on analog pins A1,A2,A3; select on digital pins 7,8,9 INPUT_74HC4051 input_4051_A1; INPUT_74HC4051 input_4051_A2; INPUT_74HC4051 input_4051_A3; int channel = 0; int velocity = 120; const uint8_t NO_PINS = 0b00000000; void setup() { #ifdef debug Serial.begin(9600); #endif //initialize MCP23017s input_MCP23017_0.begin(0,digitalCallback); input_MCP23017_1.begin(1,digitalCallback); input_MCP23017_2.begin(2,digitalCallback); input_MCP23017_3.begin(3,digitalCallback); input_MCP23017_4.begin(4,digitalCallback); //initialize 74HC4051s input_4051_A1.begin(A1,7,8,9,analogCallback); input_4051_A1.setPins(0b00001000); input_4051_A2.begin(A2,7,8,9,analogCallback); input_4051_A2.setPins(NO_PINS); input_4051_A3.begin(A3,7,8,9,analogCallback); input_4051_A3.setPins(NO_PINS); } void loop() { //loop MCP23017s for callbacks input_MCP23017_0.loop(); input_MCP23017_1.loop(); input_MCP23017_2.loop(); input_MCP23017_3.loop(); input_MCP23017_4.loop(); //loop 74HC4051s for callback input_4051_A1.loop(); input_4051_A2.loop(); input_4051_A3.loop(); MidiUSB.flush(); } //callback for analog, sends CC message with unique controller id void analogCallback(int id, int pin, int value) { #ifdef debug Serial.print("analog"); Serial.print("\tid\t"); Serial.print(id-A0); Serial.print("\tpin\t"); Serial.print(pin); Serial.print("\tvalue\t"); Serial.println(value); #endif midiEventPacket_t event = {0x0B, 0xB0 | channel, ((id-A0) * 8 + pin), value}; MidiUSB.sendMIDI(event); } //default callback for buttons, sends note-on/off message with unique note value void digitalCallback(int id, int pin, int value) { #ifdef debug Serial.print("digital"); Serial.print("\tid\t"); Serial.print(id); Serial.print("\tpin\t"); Serial.print(pin); Serial.print("\tvalue\t"); Serial.println(value); #endif if (value == HIGH) { midiEventPacket_t noteOn = {0x09, 0x90 | channel, (id * 16 + pin), velocity}; MidiUSB.sendMIDI(noteOn); } else { midiEventPacket_t noteOff = {0x08, 0x80 | channel, (id * 16 + pin), 0}; MidiUSB.sendMIDI(noteOff); } }