Suzu Tomo / Mbed OS 2020_ChristmasLED

Dependencies:   WS2812B_SPI

Revision:
0:943dfa56009a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/midi.h	Sat Nov 07 13:40:03 2020 +0000
@@ -0,0 +1,175 @@
+#include "AsyncSerial.h"
+
+#include <vector>
+#include <string>
+
+
+AsyncSerial ms(PA_0,PA_1,31250,500);
+//RawSerial ms(PA_0,PA_1,31250);
+
+DigitalOut clockLed_(D10);
+DigitalOut RhythmLED(D11);
+DigitalOut active(D12);
+
+volatile bool doRhythm = false;
+
+volatile int memory = 0;
+
+volatile int barClock = 0;
+volatile int beat = 4;
+
+
+const string notesName[12] = {"C ","C#","D ","D#","E ","F ","F#","G ","G#","A ","A#","B "};
+
+std::vector<char> dataByte;
+
+void MidiTh()
+{
+    if(ms.readable()) {
+        int data = ms.read();
+
+// RealTime Message ------------------------------------------------------------
+        if (data == 0xF8) { // Clock
+            barClock++;
+            if (barClock % (24 * beat) == 13) clockLed_ = 0;
+
+        } else if (data == 0xFA) { // RhythmStart
+            clockLed_ = RhythmLED = doRhythm = 1;
+            barClock =  0;
+
+        } else if (data == 0xFC) { // RhythmStop
+            RhythmLED = doRhythm = 0;
+            
+        } else if (data >= 0xF8) {
+
+// Channel Message -------------------------------------------------------------
+        } else {
+            //printf("\n\r%d..",data);
+            if (data >= 0x80 && data != 0xF7) {
+                dataByte.clear();
+                dataByte.push_back(data);
+
+            } else {
+                if ((dataByte[0] & 0xF0) == 0x90) { // NoteOFF
+                    dataByte.push_back(data);
+
+                    if (dataByte.size() == 3) {
+                        string nName = notesName[dataByte[1] % 12];
+                        int nOctave = ((int)(dataByte[1] / 12) - 2);
+
+                        //printf("%2dch Note ",(dataByte[0] & 0x0F) + 1);
+                        //if (dataByte[2] == 0) printf("OFF : %s%d\r\n",nName.c_str(),nOctave);
+                        //else printf(" ON : %s%d , Velocity : %3d\r\n",nName.c_str(),nOctave,dataByte[2]);
+                        dataByte.erase(dataByte.begin() + 1,dataByte.end());
+                        //isStatusByte = false;
+
+                        /*if (velocity == 0x00) {
+                        if (ch == 1) {
+                            LEDlight_uk[Key % 12] = false;
+                            flag_uk = true;
+                        } else if (ch == 2) {
+                            LEDlight_lk[Key % 12] = false;
+                            flag_lk = true;
+                        } else if (ch == 3) {
+                            LEDlight_pk[Key % 12] = false;
+                            flag_pk = true;
+                        }
+                        LEDwrite();
+                        } else {
+                            printf("%dch Note ON : %d InitialTouch : %d\n\r",ch,key,velocity);
+                            if (ch == 1) LEDlight_uk[Key % 12] = flag_uk = true;
+                            else if (ch == 2) LEDlight_lk[Key % 12] = flag_lk = true;
+                            else if (ch == 3) LEDlight_pk[Key % 12] = flag_pk = true;
+                            LEDw*/
+                    }
+                } else if ((dataByte[0] & 0xF0) == 0xB0) { // ExpressionPedal & VA AfterTouch
+                    dataByte.push_back(data);
+
+                    if (dataByte.size() == 3) {
+                        //printf("%2dch ",(dataByte[0] & 0x0F) + 1);
+                        if (dataByte[1] == 0x04) ;//printf("SecondExpression : %3d\r\n",dataByte[2] - (0x7F >> 1));
+                        else if (dataByte[1] == 0x0B) {
+                            //printf("Expression : %3d\r\n",dataByte[2]);
+                            if (doRhythm) {
+                                //uk.setII(dataByte[2]);
+                                //uk.write();
+                            }
+                        } else if (dataByte[1] == 0x10) ;//printf("VA AfterTouch : %3d\r\n",dataByte[2]);
+                        dataByte.erase(dataByte.begin() + 1,dataByte.end());
+                    }
+
+                } else if ((dataByte[0] & 0xF0) == 0xC0) { // Memory
+                    dataByte.push_back(data);
+                    memory = dataByte[1] + 1;
+                    //printf("Memory : %2d\r\n",memory);
+                    dataByte.erase(dataByte.begin() + 1,dataByte.end());
+
+                } else if ((dataByte[0] & 0xF0) == 0xD0) { // AfterTouch
+                    dataByte.push_back(data);
+
+                    //printf("%2dch ",(dataByte[0] & 0x0F) + 1);
+                    //printf("AfterTouch : %3d\r\n",dataByte[1]);
+                    dataByte.erase(dataByte.begin() + 1,dataByte.end());
+
+                } else if ((dataByte[0] & 0xF0) == 0xE0) { // PitchBend
+                    dataByte.push_back(data);
+
+                    if (dataByte.size() == 3) {
+                        //printf("%2dch ",(dataByte[0] & 0x0F) + 1);
+                        //printf("PitchBend : %5d\r\n",(dataByte[1] | (dataByte[2] << 7)) - 0x1FFF);
+                        dataByte.erase(dataByte.begin() + 1,dataByte.end());
+                    }
+// Exclusive Message -----------------------------------------------------------
+                } else if (dataByte[0] == 0xF0) {
+                    dataByte.push_back(data);
+                    if (data == 0xF7) {
+                        if (dataByte[1] == 0x43) {
+                            if (dataByte[2] == 0x70) {
+                                if (dataByte[3] == 0x53) printf("Model : ELS-02(Electone STAGEA 02Series Standerd)\r\n");
+                                else if (dataByte[3] == 0x54) printf("Model : ELS-02C(Electone STAGEA 02Series Custom)\r\n");
+                                else if (dataByte[3] == 0x55) printf("Model : ELS-02X(Electone STAGEA 02Series Professional)\r\n");
+                                else if (dataByte[3] == 0x70) {
+                                    if (dataByte[4] == 0x78) { // Per signal
+                                        static int clock_m = 0;
+                                        if (barClock - clock_m < 0) clock_m = 0;
+                                        beat = (barClock - clock_m) / 24;
+                                        clock_m = barClock;
+                                        clockLed_ = 1;
+                                        //printf("C %d\r\n",clock_);
+                                        //clock_ = 0;
+                                        //if (doRhythm) count = 0;
+                                    }
+                                }
+                            }
+                        }
+                        dataByte.erase(dataByte.begin() + 1,dataByte.end());
+                    }
+
+                } else { // Other
+                    printf("able %d\r\n", ms.read());
+                }
+
+            }
+        }
+    }
+}
+
+void ModelReq()
+{
+    //F0, 43, 70, 70, 30, F7
+    uint8_t sd[6] = {0xF0,0x43,0x70,0x70,0x30,0xF7};
+    ms.write(sd,6);
+
+}
+
+void Start()
+{
+    ms.write(0xFA);
+}
+
+void MDRStart()
+{
+    uint8_t sd[7] = {0xF0,0x43,0x70,0x70,0x70,0x01,0xF7};
+    ms.write(sd,7);
+
+}
\ No newline at end of file