From 2d034b6369fda9470b6d4b1a227e987031f98cfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20St=C3=A4ck?= Date: Sun, 23 Jun 2019 09:55:51 +0200 Subject: [PATCH 1/5] C++ify midi.ino, change to appropriate datatypes --- NuEVI/{midi.ino => midi.cpp} | 34 ++++++++++++++++++---------------- NuEVI/midi.h | 25 ++++++++++++++++--------- 2 files changed, 34 insertions(+), 25 deletions(-) rename NuEVI/{midi.ino => midi.cpp} (75%) diff --git a/NuEVI/midi.ino b/NuEVI/midi.cpp similarity index 75% rename from NuEVI/midi.ino rename to NuEVI/midi.cpp index 65c64c7..75a36ca 100644 --- a/NuEVI/midi.ino +++ b/NuEVI/midi.cpp @@ -1,10 +1,12 @@ +#include + #include "midi.h" #include "hardware.h" int midiChannel; -void midiSetChannel(byte channel) { +void midiSetChannel(uint8_t channel) { midiChannel = constrain(channel, 1, 16); } @@ -13,35 +15,35 @@ byte midiGetChannel() { } -void midiSendProgramChange(int patch) { +void midiSendProgramChange(uint8_t patch) { usbMIDI.sendProgramChange(patch-1, midiChannel); dinMIDIsendProgramChange(patch-1, midiChannel-1); } -void midiSendControlChange(int ccParam, int ccValue) { +void midiSendControlChange(uint8_t ccParam, uint8_t ccValue) { usbMIDI.sendControlChange(ccParam, ccValue, midiChannel); dinMIDIsendControlChange(ccParam, ccValue, midiChannel - 1); } -void midiSendNoteOn(byte note, int velocity) { +void midiSendNoteOn(uint8_t note, uint8_t velocity) { usbMIDI.sendNoteOn(note, velocity, midiChannel); dinMIDIsendNoteOn(note, velocity, midiChannel - 1); } -void midiSendNoteOff(byte note) { +void midiSendNoteOff(uint8_t note) { //Always send velocity 0 on note off to avoid confusing some synthesizers usbMIDI.sendNoteOn(note, 0, midiChannel); dinMIDIsendNoteOn(note, 0, midiChannel - 1); } -void midiSendAfterTouch(byte value) { +void midiSendAfterTouch(uint8_t value) { usbMIDI.sendAfterTouch(value, midiChannel); dinMIDIsendAfterTouch(value, midiChannel - 1); } -void midiSendPitchBend(int value) { +void midiSendPitchBend(uint16_t value) { #if defined(NEWTEENSYDUINO) usbMIDI.sendPitchBend(value-8192, midiChannel); // newer teensyduino "pitchBend-8192" older just "pitchBend"... strange thing to change #else @@ -70,7 +72,7 @@ void midiPanic() { // all notes off } } -void midiInitialize(byte channel) { +void midiInitialize(uint8_t channel) { MIDI_SERIAL.begin(31250); // start serial with midi baudrate 31250 MIDI_SERIAL.flush(); midiSetChannel(channel); @@ -81,7 +83,7 @@ void midiInitialize(byte channel) { //Serial midi functions // Send a three byte din midi message -void midiSend3B(byte midistatus, byte data1, byte data2) { +void midiSend3B(uint8_t midistatus, uint8_t data1, uint8_t data2) { MIDI_SERIAL.write(midistatus); MIDI_SERIAL.write(data1); MIDI_SERIAL.write(data2); @@ -90,7 +92,7 @@ void midiSend3B(byte midistatus, byte data1, byte data2) { //************************************************************** // Send a two byte din midi message -void midiSend2B(byte midistatus, byte data) { +void midiSend2B(uint8_t midistatus, uint8_t data) { MIDI_SERIAL.write(midistatus); MIDI_SERIAL.write(data); } @@ -98,7 +100,7 @@ void midiSend2B(byte midistatus, byte data) { //************************************************************** // Send din pitchbend -void dinMIDIsendPitchBend(int pb, byte ch) { +void dinMIDIsendPitchBend(uint16_t pb, uint8_t ch) { int pitchLSB = pb & 0x007F; int pitchMSB = (pb >>7) & 0x007F; midiSend3B((0xE0 | ch), pitchLSB, pitchMSB); @@ -107,34 +109,34 @@ void dinMIDIsendPitchBend(int pb, byte ch) { //************************************************************** // Send din control change -void dinMIDIsendControlChange(byte ccNumber, int cc, byte ch) { +void dinMIDIsendControlChange(uint8_t ccNumber, uint8_t cc, uint8_t ch) { midiSend3B((0xB0 | ch), ccNumber, cc); } //************************************************************** // Send din note on -void dinMIDIsendNoteOn(byte note, int vel, byte ch) { +void dinMIDIsendNoteOn(uint8_t note, uint8_t vel, uint8_t ch) { midiSend3B((0x90 | ch), note, vel); } //************************************************************** // Send din note off -void dinMIDIsendNoteOff(byte note, int vel, byte ch) { +void dinMIDIsendNoteOff(uint8_t note, uint8_t vel, uint8_t ch) { midiSend3B((0x80 | ch), note, vel); } //************************************************************** // Send din aftertouch -void dinMIDIsendAfterTouch(byte value, byte ch) { +void dinMIDIsendAfterTouch(uint8_t value, uint8_t ch) { midiSend2B((0xD0 | ch), value); } //************************************************************** // Send din program change -void dinMIDIsendProgramChange(byte value, byte ch) { +void dinMIDIsendProgramChange(uint8_t value, uint8_t ch) { midiSend2B((0xC0 | ch), value); } diff --git a/NuEVI/midi.h b/NuEVI/midi.h index 5af5f28..4d915cf 100644 --- a/NuEVI/midi.h +++ b/NuEVI/midi.h @@ -6,20 +6,27 @@ #define USE_MIDI_SERIAL //Set / get current midi channel -void midiSetChannel(byte channel); -byte midiGetChannel(); +void midiSetChannel(uint8_t channel); +uint8_t midiGetChannel(); -void midiSendProgramChange(int patch); -void midiSendControlChange(int ccParam, int ccValue); -void midiSendNoteOn(byte note, int velocity); -void midiSendNoteOff(byte note); -void midiSendAfterTouch(byte value); -void midiSendPitchBend(int value); +void midiSendProgramChange(uint8_t patch); +void midiSendControlChange(uint8_t ccParam, uint8_t ccValue); +void midiSendNoteOn(uint8_t note, uint8_t velocity); +void midiSendNoteOff(uint8_t note); +void midiSendAfterTouch(uint8_t value); +void midiSendPitchBend(uint16_t value); void midiDiscardInput(void); void midiReset(); // reset controllers void midiPanic(); // turn all notes off -void midiInitialize(byte channel=1); +void midiInitialize(uint8_t channel=1); + +void dinMIDIsendControlChange(uint8_t ccNumber, uint8_t cc, uint8_t ch); +void dinMIDIsendNoteOn(uint8_t note, uint8_t vel, uint8_t ch); +void dinMIDIsendNoteOff(uint8_t note, uint8_t vel, uint8_t ch); +void dinMIDIsendAfterTouch(uint8_t value, uint8_t ch); +void dinMIDIsendProgramChange(uint8_t value, uint8_t ch); +void dinMIDIsendPitchBend(uint16_t pb, uint8_t ch); #endif From 25a31d8df87023419ba9d14e13dc86e9b86db150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Fri, 14 Jun 2019 22:16:47 +0200 Subject: [PATCH 2/5] Write new factor constants even if old version was < 24 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This bug would probably never happen in real life, and could be fix by holding down menu and enter buttons at startup. But a bug is a bug. The only reason I found this bug is that the simulator didn’t initialise EEPROM to 0xff, and even after I did that it crashed, because a version of 0xffff wasn't handled. --- NuEVI/NuEVI.ino | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/NuEVI/NuEVI.ino b/NuEVI/NuEVI.ino index 55dc219..e4de329 100644 --- a/NuEVI/NuEVI.ino +++ b/NuEVI/NuEVI.ino @@ -263,7 +263,9 @@ void setup() { // if stored settings are not for current version, or Enter+Menu are pressed at startup, they are replaced by factory settings - if (((readSetting(VERSION_ADDR) != VERSION) && (readSetting(VERSION_ADDR) < 24)) || (!digitalRead(ePin) && !digitalRead(mPin))) { + uint16_t settingsVersion = readSetting(VERSION_ADDR); + + if (((settingsVersion != VERSION) && (settingsVersion < 24)) || (!digitalRead(ePin) && !digitalRead(mPin)) || (settingsVersion == 0xffffu)) { writeSetting(VERSION_ADDR,VERSION); writeSetting(BREATH_THR_ADDR,BREATH_THR_FACTORY); writeSetting(BREATH_MAX_ADDR,BREATH_MAX_FACTORY); @@ -280,8 +282,8 @@ void setup() { writeSetting(EXTRAC_MAX_ADDR,EXTRAC_MAX_FACTORY); writeSetting(CTOUCH_THR_ADDR,CTOUCH_THR_FACTORY); } - - if ((readSetting(VERSION_ADDR) != VERSION) || (!digitalRead(ePin) && !digitalRead(mPin))) { + + if ((settingsVersion != VERSION) || (!digitalRead(ePin) && !digitalRead(mPin))) { writeSetting(VERSION_ADDR,VERSION); writeSetting(TRANSP_ADDR,TRANSP_FACTORY); From 3d38f50d9883e268e450a069644273b43c094a41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20St=C3=A4ck?= Date: Sun, 23 Jun 2019 14:30:32 +0200 Subject: [PATCH 3/5] Add deeper simulation of USB midi --- simulation/Makefile | 5 +-- simulation/include/Arduino.h | 20 ++++++++++++ simulation/src/nuevisim.cpp | 3 +- simulation/src/simmidi.cpp | 56 --------------------------------- simulation/src/simserial.cpp | 12 +++++++ simulation/src/simusbmidi.cpp | 59 +++++++++++++++++++++++++++++++++++ 6 files changed, 96 insertions(+), 59 deletions(-) delete mode 100644 simulation/src/simmidi.cpp create mode 100644 simulation/src/simusbmidi.cpp diff --git a/simulation/Makefile b/simulation/Makefile index b2983cd..2766a89 100644 --- a/simulation/Makefile +++ b/simulation/Makefile @@ -12,7 +12,7 @@ else endif -CXXFLAGS= $(CFLAGS) -std=c++14 +CXXFLAGS= $(CFLAGS) -std=c++14 -Wno-unused-parameter LIBS=-framework SDL2 -lc++ -lc -framework OpenGL LDFLAGS=-macosx_version_min 10.9 -rpath @executable_path/../Frameworks @@ -32,8 +32,9 @@ CXXFILES= ../NuEVI/menu.cpp \ src/Print.cpp \ src/simserial.cpp \ src/simwire.cpp \ - src/simmidi.cpp \ + src/simusbmidi.cpp \ src/filters.cpp \ + ../NuEVI/midi.cpp \ src/Adafruit_GFX_sim.cpp \ src/Adafruit_SSD1306_sim.cpp \ src/Adafruit_MPR121_sim.cpp \ diff --git a/simulation/include/Arduino.h b/simulation/include/Arduino.h index 6b63b2c..7212d25 100644 --- a/simulation/include/Arduino.h +++ b/simulation/include/Arduino.h @@ -67,9 +67,29 @@ public: void println(const char* str); void print(const char* str); void print(uint32_t intValue); + void write(const uint8_t str); + void flush(); + +}; + +class SimUsbMidi +{ +public: + void sendNoteOff(uint8_t note, uint8_t velocity, uint8_t channel, uint8_t cable=0); + void sendNoteOn(uint8_t note, uint8_t velocity, uint8_t channel, uint8_t cable=0); + void sendPolyPressure(uint8_t note, uint8_t pressure, uint8_t channel, uint8_t cable=0); + void sendAfterTouchPoly(uint8_t note, uint8_t pressure, uint8_t channel, uint8_t cable=0); + void sendControlChange(uint8_t control, uint8_t value, uint8_t channel, uint8_t cable=0); + void sendProgramChange(uint8_t program, uint8_t channel, uint8_t cable=0); + void sendAfterTouch(uint8_t pressure, uint8_t channel, uint8_t cable=0); + void sendPitchBend(int value, uint8_t channel, uint8_t cable=0); + void sendSysEx(uint16_t length, const uint8_t *data, bool hasTerm=false, uint8_t cable=0); + bool read(uint8_t channel=0); }; extern SimSerial Serial; +extern SimSerial Serial3; //Used for MIDI serial putput with default hardware +extern SimUsbMidi usbMIDI; //extern void putString(int row, int col, int color, const char* msg, const FONT_INFO fontInfo); diff --git a/simulation/src/nuevisim.cpp b/simulation/src/nuevisim.cpp index 8982c7c..13c2915 100644 --- a/simulation/src/nuevisim.cpp +++ b/simulation/src/nuevisim.cpp @@ -26,7 +26,8 @@ extern Adafruit_SSD1306 display; extern Adafruit_MPR121 touchSensor; SimWire Wire; SimSerial Serial; - +SimSerial Serial3; //Midi +SimUsbMidi usbMIDI; static const int scale = 3; diff --git a/simulation/src/simmidi.cpp b/simulation/src/simmidi.cpp deleted file mode 100644 index 74b45cb..0000000 --- a/simulation/src/simmidi.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include -#include "midi.h" - -void midiSetChannel(byte __attribute__((unused)) channel){} - -byte midiGetChannel(){ return 1; } - -void midiSendProgramChange(int __attribute__((unused)) patch) -{ - -} - -void midiSendControlChange(int __attribute__((unused)) ccParam, int __attribute__((unused)) ccValue) -{ - -} - -void midiSendNoteOn(byte __attribute__((unused)) note, int __attribute__((unused)) velocity) -{ - -} - -void midiSendNoteOff(byte __attribute__((unused)) note) -{ - -} - -void midiSendAfterTouch(byte __attribute__((unused)) value) -{ - -} - -void midiSendPitchBend(int __attribute__((unused)) value) -{ - -} - -void midiDiscardInput() -{ - -} - -void midiReset() -{ - -} - -void midiPanic() -{ - // turn all notes off -} - -void midiInitialize(byte __attribute__((unused)) channel) -{ - -} \ No newline at end of file diff --git a/simulation/src/simserial.cpp b/simulation/src/simserial.cpp index 65e3bd7..0ffd36e 100644 --- a/simulation/src/simserial.cpp +++ b/simulation/src/simserial.cpp @@ -41,3 +41,15 @@ void SimSerial::println(const char *str) printf( "[Serial::println] %s\n", str ); } +//Used to send serial midi +void SimSerial::write(const uint8_t str) +{ + +} + + +void SimSerial::flush() +{ + +} + diff --git a/simulation/src/simusbmidi.cpp b/simulation/src/simusbmidi.cpp new file mode 100644 index 0000000..6de480e --- /dev/null +++ b/simulation/src/simusbmidi.cpp @@ -0,0 +1,59 @@ +#include +#include + + +#include "Arduino.h" + +/************************************* + * Stub simulation of Teensy usbMidi + */ + + +void SimUsbMidi::sendNoteOff(uint8_t note, uint8_t velocity, uint8_t channel, uint8_t cable) +{ + printf( "[usbMIDI::noteOff] note %03d vel %03d ch %02d\n", note, velocity, channel); +} + +void SimUsbMidi::sendNoteOn(uint8_t note, uint8_t velocity, uint8_t channel, uint8_t cable) +{ + printf( "[usbMIDI::noteOn] note %03d vel %03d ch %02d\n", note, velocity, channel); +} + +void SimUsbMidi::sendPolyPressure(uint8_t note, uint8_t pressure, uint8_t channel, uint8_t cable) +{ + printf( "[usbMIDI::polyPressure] note %03d p %03d ch %02d\n", note, pressure, channel); +} + +void SimUsbMidi::sendAfterTouchPoly(uint8_t note, uint8_t pressure, uint8_t channel, uint8_t cable) +{ + printf( "[usbMIDI::afterTouchPoly] note %03d p %03d ch %02d\n", note, pressure, channel); +} + +void SimUsbMidi::sendControlChange(uint8_t control, uint8_t value, uint8_t channel, uint8_t cable) +{ + printf( "[usbMIDI::controlChange] cc %03d val %03d ch %02d\n", control, value, channel); +} + +void SimUsbMidi::sendProgramChange(uint8_t program, uint8_t channel, uint8_t cable) +{ + printf( "[usbMIDI::programChange] prg %03d ch %02d\n", program, channel); +} + +void SimUsbMidi::sendAfterTouch(uint8_t pressure, uint8_t channel, uint8_t cable) +{ + printf( "[usbMIDI::afterTouch] p %03d ch %02d\n", pressure, channel); +} + +void SimUsbMidi::sendPitchBend(int value, uint8_t channel, uint8_t cable) +{ + printf( "[usbMIDI::pitchBend] pb %05d ch %02d\n", value, channel); +} + +void SimUsbMidi::sendSysEx(uint16_t length, const uint8_t *data, bool hasTerm, uint8_t cable) +{ +} + +bool SimUsbMidi::read(uint8_t channel) { + return false; +} + From 2332f37ecaa51043a7982b3cafe0a09ffaa097c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20St=C3=A4ck?= Date: Sun, 23 Jun 2019 14:51:31 +0200 Subject: [PATCH 4/5] Advanced unusage of parameters --- simulation/Makefile | 2 +- simulation/src/simserial.cpp | 2 +- simulation/src/simusbmidi.cpp | 21 +++++++++++---------- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/simulation/Makefile b/simulation/Makefile index 2766a89..d960a6c 100644 --- a/simulation/Makefile +++ b/simulation/Makefile @@ -12,7 +12,7 @@ else endif -CXXFLAGS= $(CFLAGS) -std=c++14 -Wno-unused-parameter +CXXFLAGS= $(CFLAGS) -std=c++14 LIBS=-framework SDL2 -lc++ -lc -framework OpenGL LDFLAGS=-macosx_version_min 10.9 -rpath @executable_path/../Frameworks diff --git a/simulation/src/simserial.cpp b/simulation/src/simserial.cpp index 0ffd36e..60a7f92 100644 --- a/simulation/src/simserial.cpp +++ b/simulation/src/simserial.cpp @@ -42,7 +42,7 @@ void SimSerial::println(const char *str) } //Used to send serial midi -void SimSerial::write(const uint8_t str) +void SimSerial::write(const uint8_t __unused str) { } diff --git a/simulation/src/simusbmidi.cpp b/simulation/src/simusbmidi.cpp index 6de480e..42d1aa1 100644 --- a/simulation/src/simusbmidi.cpp +++ b/simulation/src/simusbmidi.cpp @@ -9,51 +9,52 @@ */ -void SimUsbMidi::sendNoteOff(uint8_t note, uint8_t velocity, uint8_t channel, uint8_t cable) +void SimUsbMidi::sendNoteOff(uint8_t note, uint8_t velocity, uint8_t channel, uint8_t __unused cable) { printf( "[usbMIDI::noteOff] note %03d vel %03d ch %02d\n", note, velocity, channel); } -void SimUsbMidi::sendNoteOn(uint8_t note, uint8_t velocity, uint8_t channel, uint8_t cable) +void SimUsbMidi::sendNoteOn(uint8_t note, uint8_t velocity, uint8_t channel, uint8_t __unused cable) { printf( "[usbMIDI::noteOn] note %03d vel %03d ch %02d\n", note, velocity, channel); } -void SimUsbMidi::sendPolyPressure(uint8_t note, uint8_t pressure, uint8_t channel, uint8_t cable) +void SimUsbMidi::sendPolyPressure(uint8_t note, uint8_t pressure, uint8_t channel, uint8_t __unused cable) { printf( "[usbMIDI::polyPressure] note %03d p %03d ch %02d\n", note, pressure, channel); } -void SimUsbMidi::sendAfterTouchPoly(uint8_t note, uint8_t pressure, uint8_t channel, uint8_t cable) +void SimUsbMidi::sendAfterTouchPoly(uint8_t note, uint8_t pressure, uint8_t channel, uint8_t __unused cable) { printf( "[usbMIDI::afterTouchPoly] note %03d p %03d ch %02d\n", note, pressure, channel); } -void SimUsbMidi::sendControlChange(uint8_t control, uint8_t value, uint8_t channel, uint8_t cable) +void SimUsbMidi::sendControlChange(uint8_t control, uint8_t value, uint8_t channel, uint8_t __unused cable) { printf( "[usbMIDI::controlChange] cc %03d val %03d ch %02d\n", control, value, channel); } -void SimUsbMidi::sendProgramChange(uint8_t program, uint8_t channel, uint8_t cable) +void SimUsbMidi::sendProgramChange(uint8_t program, uint8_t channel, uint8_t __unused cable) { printf( "[usbMIDI::programChange] prg %03d ch %02d\n", program, channel); } -void SimUsbMidi::sendAfterTouch(uint8_t pressure, uint8_t channel, uint8_t cable) +void SimUsbMidi::sendAfterTouch(uint8_t pressure, uint8_t channel, uint8_t __unused cable) { printf( "[usbMIDI::afterTouch] p %03d ch %02d\n", pressure, channel); } -void SimUsbMidi::sendPitchBend(int value, uint8_t channel, uint8_t cable) +void SimUsbMidi::sendPitchBend(int value, uint8_t channel, uint8_t __unused cable) { printf( "[usbMIDI::pitchBend] pb %05d ch %02d\n", value, channel); } -void SimUsbMidi::sendSysEx(uint16_t length, const uint8_t *data, bool hasTerm, uint8_t cable) +void SimUsbMidi::sendSysEx(uint16_t length, const uint8_t __unused *data, bool __unused hasTerm, uint8_t __unused cable) { + printf( "[usbMIDI::sysEx] len %d\n", length); } -bool SimUsbMidi::read(uint8_t channel) { +bool SimUsbMidi::read(uint8_t __unused channel) { return false; } From 3d0e2cf71943ce25cc05266a76d228985fb240b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20St=C3=A4ck?= Date: Sun, 23 Jun 2019 15:58:54 +0200 Subject: [PATCH 5/5] Let imgui submodule be untracked without whining --- .gitmodules | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitmodules b/.gitmodules index 309d0be..e0a3620 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "simulation/imgui"] path = simulation/imgui url = https://github.com/ocornut/imgui.git + ignore = untracked