[{"id":"main.cpp_includeDef1","type":"IncludeDef","name":"<MIDI.h>","comment":"","x":410,"y":20,"z":"14f24e29.494642","bgColor":"#DDFFBB","wires":[]},{"id":"main.cpp_Synth1","type":"Synth","name":"synth","x":410,"y":70,"z":"14f24e29.494642","bgColor":"#CCFFCC","wires":[]},{"id":"main.cpp_vars1","type":"Variables","name":"global variables & function forward declarations","comment":"const int ledPin = 13;\r\nint ledState = LOW; // ledState used to set the LED\r\nunsigned long previousMillis = 0; // will store last time LED was updated\r\nunsigned long currentMillis = 0;\r\nunsigned long currentInterval = 0;\r\nunsigned long ledBlinkOnInterval = 100;\r\nunsigned long ledBlinkOffInterval = 2000;\r\n\r\n#define btnInEnablePin 9\r\n#define btnSustainPin 23\r\n#define btnSostenutoPin 22\r\n#define btnSoftPedalPin 21\r\nuint8_t btnSustain = 0;\r\nuint8_t btnSostenuto = 0;\r\nuint8_t btnSoftPedal = 0;\r\nuint8_t btnSustainWasPressed = 0;\r\nuint8_t btnSostenutoWasPressed = 0;\r\nuint8_t btnSoftPedalWasPressed = 0;\r\n\r\n#define btnNextInstrumentPin 20\r\nuint8_t btnNextInstrument = 0;\r\nuint8_t btnNextInstrumentWasPressed = 0;\r\n\r\n#define KEYBOARD_NOTE_SHIFT_CORRECTION 21//-12\r\n\r\nvoid uartMidi_NoteOn(byte channel, byte note, byte velocity);\r\nvoid uartMidi_NoteOff(byte channel, byte note, byte velocity);\r\nvoid uartMidi_ControlChange(byte channel, byte control, byte value);\r\nvoid uartMidi_PitchBend(byte channel, int value);\r\n\r\nvoid usbMidi_NoteOn(byte channel, byte note, byte velocity);\r\nvoid usbMidi_NoteOff(byte channel, byte note, byte velocity);\r\nvoid usbMidi_ControlChange(byte channel, byte control, byte value);\r\nvoid usbMidi_PitchBend(byte channel, int value);\r\n\r\nvoid blinkLedTask(void);\r\nvoid btnInputProcessTask(void);\r\n\r\n","x":410,"y":120,"z":"14f24e29.494642","bgColor":"#DDFFBB","wires":[]},{"id":"main.cpp_vars2","type":"Variables","name":"MIDI_CREATE_INSTANCE","comment":"MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI);","x":410,"y":170,"z":"14f24e29.494642","bgColor":"#DDFFBB","wires":[]},{"id":"main.cpp_code2","type":"Function","name":"setup() function","comment":"\r\n// Arduino setup() function\r\nvoid setup()\r\n{\r\n AudioMemory(96);\r\n\r\n MIDI.begin();\r\n MIDI.setHandleNoteOn(uartMidi_NoteOn);\r\n MIDI.setHandleNoteOff(uartMidi_NoteOff);\r\n MIDI.setHandleControlChange(uartMidi_ControlChange);\r\n MIDI.setHandlePitchBend(uartMidi_PitchBend);\r\n\r\n usbMIDI.setHandleNoteOn(usbMidi_NoteOn);\r\n usbMIDI.setHandleNoteOff(usbMidi_NoteOff);\r\n usbMIDI.setHandleControlChange(usbMidi_ControlChange);\r\n usbMIDI.setHandlePitchChange(usbMidi_PitchBend);\r\n\r\n synth.begin();\r\n\r\n pinMode(btnSustainPin, INPUT);\r\n pinMode(btnSostenutoPin, INPUT);\r\n pinMode(btnSoftPedalPin, INPUT);\r\n pinMode(btnNextInstrumentPin, INPUT);\r\n\r\n pinMode(btnInEnablePin, OUTPUT);\r\n digitalWrite(btnInEnablePin, LOW);\r\n\r\n pinMode(ledPin, OUTPUT);\r\n digitalWrite(ledPin, LOW);\r\n\r\n btnSustainWasPressed = 0;\r\n btnSoftPedalWasPressed = 0;\r\n btnSostenutoWasPressed = 0;\r\n btnNextInstrumentWasPressed = 0;\r\n \r\n}\r\n","x":410,"y":220,"z":"14f24e29.494642","bgColor":"#DDFFBB","wires":[]},{"id":"main.cpp_code3","type":"Function","name":"loop() function","comment":"\r\n// Arduino loop() function\r\nvoid loop()\r\n{\r\n usbMIDI.read();\r\n MIDI.read();\r\n\r\n btnInputProcessTask();\r\n \r\n blinkLedTask();\r\n}","x":410,"y":270,"z":"14f24e29.494642","bgColor":"#DDFFBB","wires":[]},{"id":"main.cpp_code4","type":"Function","name":"uartMidi handler functions","comment":"\r\n// uartMidi handler functions\r\nvoid uartMidi_NoteOn(byte channel, byte note, byte velocity) {\r\n note += KEYBOARD_NOTE_SHIFT_CORRECTION;\r\n velocity = 127 - velocity;\r\n synth.noteOn(note, velocity);\r\n usbMIDI.sendNoteOn(note, velocity, channel, 0);\r\n}\r\n\r\nvoid uartMidi_NoteOff(byte channel, byte note, byte velocity) {\r\n note += KEYBOARD_NOTE_SHIFT_CORRECTION;\r\n velocity = 127 - velocity;\r\n synth.noteOff(note);\r\n usbMIDI.sendNoteOff(note, velocity, channel, 0);\r\n}\r\n\r\nvoid uartMidi_ControlChange(byte channel, byte control, byte value) {\r\n usbMIDI.sendControlChange(control, value, channel, 0x00);\r\n}\r\n\r\nvoid uartMidi_PitchBend(byte channel, int value) {\r\n usbMIDI.sendPitchBend(value, channel, 0x00);\r\n}","x":410,"y":320,"z":"14f24e29.494642","bgColor":"#DDFFBB","wires":[]},{"id":"main.cpp_code5","type":"Function","name":"usbMidi handler functions","comment":"\r\n// usbMidi handler functions\r\nvoid usbMidi_NoteOn(byte channel, byte note, byte velocity) {\r\n synth.noteOn(note, velocity);\r\n}\r\n\r\nvoid usbMidi_NoteOff(byte channel, byte note, byte velocity) {\r\n synth.noteOff(note); \r\n}\r\n\r\nvoid usbMidi_PitchBend(byte channel, int value) {\r\n \r\n}\r\n\r\nvoid usbMidi_ControlChange(byte channel, byte control, byte value) {\r\n switch (control) { // cases 20-31,102-119 is undefined in midi spec\r\n case 64:\r\n if (value == 0)\r\n synth.deactivateSustain();\r\n else if (value == 127)\r\n synth.activateSustain();\r\n break;\r\n case 0:\r\n synth.set_InstrumentByIndex(value);\r\n break;\r\n case 20: // OSC A waveform select\r\n synth.set_OSC_A_waveform(value);\r\n break;\r\n case 21: // OSC B waveform select\r\n synth.set_OSC_B_waveform(value);\r\n break;\r\n case 22: // OSC C waveform select\r\n synth.set_OSC_C_waveform(value);\r\n break;\r\n\r\n case 23:\r\n synth.set_OSC_A_pulseWidth(value);\r\n break;\r\n case 24:\r\n synth.set_OSC_B_pulseWidth(value);\r\n break;\r\n case 25:\r\n synth.set_OSC_C_pulseWidth(value);\r\n break;\r\n\r\n case 26:\r\n synth.set_OSC_A_phase(value);\r\n break;\r\n case 27:\r\n synth.set_OSC_B_phase(value);\r\n break;\r\n case 28:\r\n synth.set_OSC_C_phase(value);\r\n break;\r\n\r\n case 29:\r\n synth.set_OSC_A_amplitude(value);\r\n break;\r\n case 30:\r\n synth.set_OSC_B_amplitude(value);\r\n break;\r\n case 31:\r\n synth.set_OSC_C_amplitude(value);\r\n break;\r\n case 32: //(\"LSB for Control 0 (Bank Select)\" @ midi spec.)\r\n synth.set_OSC_D_amplitude(value);\r\n break;\r\n\r\n case 33: \r\n synth.set_mixVoices_gains(value);\r\n break;\r\n \r\n case 100:\r\n synth.set_envelope_delay(value);\r\n break;\r\n case 101:\r\n synth.set_envelope_attack(value);\r\n break;\r\n case 102:\r\n synth.set_envelope_hold(value);\r\n break;\r\n case 103:\r\n synth.set_envelope_decay(value);\r\n break;\r\n case 104:\r\n synth.set_envelope_sustain(value);\r\n break;\r\n case 105:\r\n synth.set_envelope_release(value);\r\n break;\r\n \r\n case 108:\r\n synth.set_OSC_A_freqMult(value);\r\n break;\r\n case 109:\r\n synth.set_OSC_B_freqMult(value);\r\n break;\r\n case 110:\r\n synth.set_OSC_C_freqMult(value);\r\n break;\r\n\r\n case 115: // set wavetable as primary (Piano mode)\r\n synth.SetWaveTable_As_Primary();\r\n break;\r\n case 116:\r\n synth.SetWaveForm_As_Primary();\r\n break;\r\n \r\n case 117: // EEPROM read settings\r\n synth.EEPROM_ReadSettings();\r\n break;\r\n case 118: // EEPROM save settings\r\n synth.EEPROM_SaveSettings();\r\n break;\r\n\r\n case 119: // get all values\r\n synth.sendAllSettings();\r\n break;\r\n }\r\n}","x":410,"y":370,"z":"14f24e29.494642","bgColor":"#DDFFBB","wires":[]},{"id":"main.cpp_code6","type":"Function","name":"btnInputProcessTask() function","comment":"\r\n// btnInputProcessTask() function\r\nvoid btnInputProcessTask(void)\r\n{\r\n btnSustain = digitalRead(btnSustainPin);\r\n btnSostenuto = digitalRead(btnSostenutoPin);\r\n btnSoftPedal = digitalRead(btnSoftPedalPin);\r\n btnNextInstrument = digitalRead(btnNextInstrumentPin);\r\n\r\n // Sustain pedal\r\n if ((btnSustain == LOW) && (btnSustainWasPressed == 0))\r\n {\r\n btnSustainWasPressed = 1;\r\n usbMIDI.sendControlChange(0x40, 0x7F, 0x00);\r\n synth.activateSustain();\r\n\r\n uint16_t memory_used = AudioMemoryUsageMax();\r\n uint16_t cpu_used = AudioProcessorUsageMax();\r\n uint8_t data[11];\r\n data[0] = 0x30 + memory_used/10000;\r\n data[1] = 0x30 + memory_used%10000/1000;\r\n data[2] = 0x30 + memory_used%10000%1000/100;\r\n data[3] = 0x30 + memory_used%10000%1000%100/10;\r\n data[4] = 0x30 + memory_used%10000%1000%100%10;\r\n data[5] = ':';\r\n data[6] = 0x30 + cpu_used/10000;\r\n data[7] = 0x30 + cpu_used%10000/1000;\r\n data[8] = 0x30 + cpu_used%10000%1000/100;\r\n data[9] = 0x30 + cpu_used%10000%1000%100/10;\r\n data[10] = 0x30 + cpu_used%10000%1000%100%10;\r\n usbMIDI.sendSysEx(11, data);\r\n }\r\n else if ((btnSustain == HIGH) && (btnSustainWasPressed == 1))\r\n {\r\n btnSustainWasPressed = 0;\r\n usbMIDI.sendControlChange(0x40, 0x00, 0x00);\r\n synth.deactivateSustain();\r\n }\r\n // Sostenuto Pedal\r\n if ((btnSostenuto == LOW) && (btnSostenutoWasPressed == 0))\r\n {\r\n btnSostenutoWasPressed = 1;\r\n usbMIDI.sendControlChange(0x42, 0x7F, 0x00);\r\n }\r\n else if ((btnSostenuto == HIGH) && (btnSostenutoWasPressed == 1))\r\n {\r\n btnSostenutoWasPressed = 0;\r\n usbMIDI.sendControlChange(0x42, 0x00, 0x00);\r\n }\r\n // Soft Pedal\r\n if ((btnSoftPedal == LOW) && (btnSoftPedalWasPressed == 0))\r\n {\r\n btnSoftPedalWasPressed = 1;\r\n usbMIDI.sendControlChange(0x43, 0x7F, 0x00);\r\n }\r\n else if ((btnSoftPedal == HIGH) && (btnSoftPedalWasPressed == 1))\r\n {\r\n btnSoftPedalWasPressed = 0;\r\n usbMIDI.sendControlChange(0x43, 0x00, 0x00);\r\n }\r\n // Next Instrument button\r\n if ((btnNextInstrument == LOW) && (btnNextInstrumentWasPressed == 0))\r\n {\r\n btnNextInstrumentWasPressed = 1;\r\n if (synth.currentWTinstrument == (InstrumentCount - 1)) synth.currentWTinstrument = 0;\r\n else synth.currentWTinstrument++;\r\n synth.set_InstrumentByIndex(synth.currentWTinstrument);\r\n usbMIDI.sendControlChange(0, synth.currentWTinstrument, 0x00);\r\n }\r\n else if ((btnNextInstrument == HIGH) && (btnNextInstrumentWasPressed == 1))\r\n {\r\n btnNextInstrumentWasPressed = 0;\r\n }\r\n}","x":410,"y":410,"z":"14f24e29.494642","bgColor":"#DDFFBB","wires":[]},{"id":"main.cpp_code1","type":"Function","name":"blinkLedTask() function","comment":"\r\n// blinkLedTask() function\r\nvoid blinkLedTask(void)\r\n{\r\n currentMillis = millis();\r\n currentInterval = currentMillis - previousMillis;\r\n \r\n if (ledState == LOW)\r\n {\r\n if (currentInterval > ledBlinkOffInterval)\r\n {\r\n previousMillis = currentMillis;\r\n ledState = HIGH;\r\n digitalWrite(ledPin, HIGH);\r\n }\r\n }\r\n else\r\n {\r\n if (currentInterval > ledBlinkOnInterval)\r\n {\r\n previousMillis = currentMillis;\r\n ledState = LOW;\r\n digitalWrite(ledPin, LOW);\r\n }\r\n }\r\n}","x":410,"y":470,"z":"14f24e29.494642","bgColor":"#DDFFBB","wires":[]}
]