Suzu Tomo / Mbed OS 2020_ChristmasLED

Dependencies:   WS2812B_SPI

Committer:
Suzutomo
Date:
Sat Nov 07 13:40:03 2020 +0000
Revision:
0:943dfa56009a
first?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Suzutomo 0:943dfa56009a 1 #include "AsyncSerial.h"
Suzutomo 0:943dfa56009a 2
Suzutomo 0:943dfa56009a 3 #include <vector>
Suzutomo 0:943dfa56009a 4 #include <string>
Suzutomo 0:943dfa56009a 5
Suzutomo 0:943dfa56009a 6
Suzutomo 0:943dfa56009a 7 AsyncSerial ms(PA_0,PA_1,31250,500);
Suzutomo 0:943dfa56009a 8 //RawSerial ms(PA_0,PA_1,31250);
Suzutomo 0:943dfa56009a 9
Suzutomo 0:943dfa56009a 10 DigitalOut clockLed_(D10);
Suzutomo 0:943dfa56009a 11 DigitalOut RhythmLED(D11);
Suzutomo 0:943dfa56009a 12 DigitalOut active(D12);
Suzutomo 0:943dfa56009a 13
Suzutomo 0:943dfa56009a 14 volatile bool doRhythm = false;
Suzutomo 0:943dfa56009a 15
Suzutomo 0:943dfa56009a 16 volatile int memory = 0;
Suzutomo 0:943dfa56009a 17
Suzutomo 0:943dfa56009a 18 volatile int barClock = 0;
Suzutomo 0:943dfa56009a 19 volatile int beat = 4;
Suzutomo 0:943dfa56009a 20
Suzutomo 0:943dfa56009a 21
Suzutomo 0:943dfa56009a 22 const string notesName[12] = {"C ","C#","D ","D#","E ","F ","F#","G ","G#","A ","A#","B "};
Suzutomo 0:943dfa56009a 23
Suzutomo 0:943dfa56009a 24 std::vector<char> dataByte;
Suzutomo 0:943dfa56009a 25
Suzutomo 0:943dfa56009a 26 void MidiTh()
Suzutomo 0:943dfa56009a 27 {
Suzutomo 0:943dfa56009a 28 if(ms.readable()) {
Suzutomo 0:943dfa56009a 29 int data = ms.read();
Suzutomo 0:943dfa56009a 30
Suzutomo 0:943dfa56009a 31 // RealTime Message ------------------------------------------------------------
Suzutomo 0:943dfa56009a 32 if (data == 0xF8) { // Clock
Suzutomo 0:943dfa56009a 33 barClock++;
Suzutomo 0:943dfa56009a 34 if (barClock % (24 * beat) == 13) clockLed_ = 0;
Suzutomo 0:943dfa56009a 35
Suzutomo 0:943dfa56009a 36 } else if (data == 0xFA) { // RhythmStart
Suzutomo 0:943dfa56009a 37 clockLed_ = RhythmLED = doRhythm = 1;
Suzutomo 0:943dfa56009a 38 barClock = 0;
Suzutomo 0:943dfa56009a 39
Suzutomo 0:943dfa56009a 40 } else if (data == 0xFC) { // RhythmStop
Suzutomo 0:943dfa56009a 41 RhythmLED = doRhythm = 0;
Suzutomo 0:943dfa56009a 42
Suzutomo 0:943dfa56009a 43 } else if (data >= 0xF8) {
Suzutomo 0:943dfa56009a 44
Suzutomo 0:943dfa56009a 45 // Channel Message -------------------------------------------------------------
Suzutomo 0:943dfa56009a 46 } else {
Suzutomo 0:943dfa56009a 47 //printf("\n\r%d..",data);
Suzutomo 0:943dfa56009a 48 if (data >= 0x80 && data != 0xF7) {
Suzutomo 0:943dfa56009a 49 dataByte.clear();
Suzutomo 0:943dfa56009a 50 dataByte.push_back(data);
Suzutomo 0:943dfa56009a 51
Suzutomo 0:943dfa56009a 52 } else {
Suzutomo 0:943dfa56009a 53 if ((dataByte[0] & 0xF0) == 0x90) { // NoteOFF
Suzutomo 0:943dfa56009a 54 dataByte.push_back(data);
Suzutomo 0:943dfa56009a 55
Suzutomo 0:943dfa56009a 56 if (dataByte.size() == 3) {
Suzutomo 0:943dfa56009a 57 string nName = notesName[dataByte[1] % 12];
Suzutomo 0:943dfa56009a 58 int nOctave = ((int)(dataByte[1] / 12) - 2);
Suzutomo 0:943dfa56009a 59
Suzutomo 0:943dfa56009a 60 //printf("%2dch Note ",(dataByte[0] & 0x0F) + 1);
Suzutomo 0:943dfa56009a 61 //if (dataByte[2] == 0) printf("OFF : %s%d\r\n",nName.c_str(),nOctave);
Suzutomo 0:943dfa56009a 62 //else printf(" ON : %s%d , Velocity : %3d\r\n",nName.c_str(),nOctave,dataByte[2]);
Suzutomo 0:943dfa56009a 63 dataByte.erase(dataByte.begin() + 1,dataByte.end());
Suzutomo 0:943dfa56009a 64 //isStatusByte = false;
Suzutomo 0:943dfa56009a 65
Suzutomo 0:943dfa56009a 66 /*if (velocity == 0x00) {
Suzutomo 0:943dfa56009a 67 if (ch == 1) {
Suzutomo 0:943dfa56009a 68 LEDlight_uk[Key % 12] = false;
Suzutomo 0:943dfa56009a 69 flag_uk = true;
Suzutomo 0:943dfa56009a 70 } else if (ch == 2) {
Suzutomo 0:943dfa56009a 71 LEDlight_lk[Key % 12] = false;
Suzutomo 0:943dfa56009a 72 flag_lk = true;
Suzutomo 0:943dfa56009a 73 } else if (ch == 3) {
Suzutomo 0:943dfa56009a 74 LEDlight_pk[Key % 12] = false;
Suzutomo 0:943dfa56009a 75 flag_pk = true;
Suzutomo 0:943dfa56009a 76 }
Suzutomo 0:943dfa56009a 77 LEDwrite();
Suzutomo 0:943dfa56009a 78 } else {
Suzutomo 0:943dfa56009a 79 printf("%dch Note ON : %d InitialTouch : %d\n\r",ch,key,velocity);
Suzutomo 0:943dfa56009a 80 if (ch == 1) LEDlight_uk[Key % 12] = flag_uk = true;
Suzutomo 0:943dfa56009a 81 else if (ch == 2) LEDlight_lk[Key % 12] = flag_lk = true;
Suzutomo 0:943dfa56009a 82 else if (ch == 3) LEDlight_pk[Key % 12] = flag_pk = true;
Suzutomo 0:943dfa56009a 83 LEDw*/
Suzutomo 0:943dfa56009a 84 }
Suzutomo 0:943dfa56009a 85 } else if ((dataByte[0] & 0xF0) == 0xB0) { // ExpressionPedal & VA AfterTouch
Suzutomo 0:943dfa56009a 86 dataByte.push_back(data);
Suzutomo 0:943dfa56009a 87
Suzutomo 0:943dfa56009a 88 if (dataByte.size() == 3) {
Suzutomo 0:943dfa56009a 89 //printf("%2dch ",(dataByte[0] & 0x0F) + 1);
Suzutomo 0:943dfa56009a 90 if (dataByte[1] == 0x04) ;//printf("SecondExpression : %3d\r\n",dataByte[2] - (0x7F >> 1));
Suzutomo 0:943dfa56009a 91 else if (dataByte[1] == 0x0B) {
Suzutomo 0:943dfa56009a 92 //printf("Expression : %3d\r\n",dataByte[2]);
Suzutomo 0:943dfa56009a 93 if (doRhythm) {
Suzutomo 0:943dfa56009a 94 //uk.setII(dataByte[2]);
Suzutomo 0:943dfa56009a 95 //uk.write();
Suzutomo 0:943dfa56009a 96 }
Suzutomo 0:943dfa56009a 97 } else if (dataByte[1] == 0x10) ;//printf("VA AfterTouch : %3d\r\n",dataByte[2]);
Suzutomo 0:943dfa56009a 98 dataByte.erase(dataByte.begin() + 1,dataByte.end());
Suzutomo 0:943dfa56009a 99 }
Suzutomo 0:943dfa56009a 100
Suzutomo 0:943dfa56009a 101 } else if ((dataByte[0] & 0xF0) == 0xC0) { // Memory
Suzutomo 0:943dfa56009a 102 dataByte.push_back(data);
Suzutomo 0:943dfa56009a 103 memory = dataByte[1] + 1;
Suzutomo 0:943dfa56009a 104 //printf("Memory : %2d\r\n",memory);
Suzutomo 0:943dfa56009a 105 dataByte.erase(dataByte.begin() + 1,dataByte.end());
Suzutomo 0:943dfa56009a 106
Suzutomo 0:943dfa56009a 107 } else if ((dataByte[0] & 0xF0) == 0xD0) { // AfterTouch
Suzutomo 0:943dfa56009a 108 dataByte.push_back(data);
Suzutomo 0:943dfa56009a 109
Suzutomo 0:943dfa56009a 110 //printf("%2dch ",(dataByte[0] & 0x0F) + 1);
Suzutomo 0:943dfa56009a 111 //printf("AfterTouch : %3d\r\n",dataByte[1]);
Suzutomo 0:943dfa56009a 112 dataByte.erase(dataByte.begin() + 1,dataByte.end());
Suzutomo 0:943dfa56009a 113
Suzutomo 0:943dfa56009a 114 } else if ((dataByte[0] & 0xF0) == 0xE0) { // PitchBend
Suzutomo 0:943dfa56009a 115 dataByte.push_back(data);
Suzutomo 0:943dfa56009a 116
Suzutomo 0:943dfa56009a 117 if (dataByte.size() == 3) {
Suzutomo 0:943dfa56009a 118 //printf("%2dch ",(dataByte[0] & 0x0F) + 1);
Suzutomo 0:943dfa56009a 119 //printf("PitchBend : %5d\r\n",(dataByte[1] | (dataByte[2] << 7)) - 0x1FFF);
Suzutomo 0:943dfa56009a 120 dataByte.erase(dataByte.begin() + 1,dataByte.end());
Suzutomo 0:943dfa56009a 121 }
Suzutomo 0:943dfa56009a 122 // Exclusive Message -----------------------------------------------------------
Suzutomo 0:943dfa56009a 123 } else if (dataByte[0] == 0xF0) {
Suzutomo 0:943dfa56009a 124 dataByte.push_back(data);
Suzutomo 0:943dfa56009a 125 if (data == 0xF7) {
Suzutomo 0:943dfa56009a 126 if (dataByte[1] == 0x43) {
Suzutomo 0:943dfa56009a 127 if (dataByte[2] == 0x70) {
Suzutomo 0:943dfa56009a 128 if (dataByte[3] == 0x53) printf("Model : ELS-02(Electone STAGEA 02Series Standerd)\r\n");
Suzutomo 0:943dfa56009a 129 else if (dataByte[3] == 0x54) printf("Model : ELS-02C(Electone STAGEA 02Series Custom)\r\n");
Suzutomo 0:943dfa56009a 130 else if (dataByte[3] == 0x55) printf("Model : ELS-02X(Electone STAGEA 02Series Professional)\r\n");
Suzutomo 0:943dfa56009a 131 else if (dataByte[3] == 0x70) {
Suzutomo 0:943dfa56009a 132 if (dataByte[4] == 0x78) { // Per signal
Suzutomo 0:943dfa56009a 133 static int clock_m = 0;
Suzutomo 0:943dfa56009a 134 if (barClock - clock_m < 0) clock_m = 0;
Suzutomo 0:943dfa56009a 135 beat = (barClock - clock_m) / 24;
Suzutomo 0:943dfa56009a 136 clock_m = barClock;
Suzutomo 0:943dfa56009a 137 clockLed_ = 1;
Suzutomo 0:943dfa56009a 138 //printf("C %d\r\n",clock_);
Suzutomo 0:943dfa56009a 139 //clock_ = 0;
Suzutomo 0:943dfa56009a 140 //if (doRhythm) count = 0;
Suzutomo 0:943dfa56009a 141 }
Suzutomo 0:943dfa56009a 142 }
Suzutomo 0:943dfa56009a 143 }
Suzutomo 0:943dfa56009a 144 }
Suzutomo 0:943dfa56009a 145 dataByte.erase(dataByte.begin() + 1,dataByte.end());
Suzutomo 0:943dfa56009a 146 }
Suzutomo 0:943dfa56009a 147
Suzutomo 0:943dfa56009a 148 } else { // Other
Suzutomo 0:943dfa56009a 149 printf("able %d\r\n", ms.read());
Suzutomo 0:943dfa56009a 150 }
Suzutomo 0:943dfa56009a 151
Suzutomo 0:943dfa56009a 152 }
Suzutomo 0:943dfa56009a 153 }
Suzutomo 0:943dfa56009a 154 }
Suzutomo 0:943dfa56009a 155 }
Suzutomo 0:943dfa56009a 156
Suzutomo 0:943dfa56009a 157 void ModelReq()
Suzutomo 0:943dfa56009a 158 {
Suzutomo 0:943dfa56009a 159 //F0, 43, 70, 70, 30, F7
Suzutomo 0:943dfa56009a 160 uint8_t sd[6] = {0xF0,0x43,0x70,0x70,0x30,0xF7};
Suzutomo 0:943dfa56009a 161 ms.write(sd,6);
Suzutomo 0:943dfa56009a 162
Suzutomo 0:943dfa56009a 163 }
Suzutomo 0:943dfa56009a 164
Suzutomo 0:943dfa56009a 165 void Start()
Suzutomo 0:943dfa56009a 166 {
Suzutomo 0:943dfa56009a 167 ms.write(0xFA);
Suzutomo 0:943dfa56009a 168 }
Suzutomo 0:943dfa56009a 169
Suzutomo 0:943dfa56009a 170 void MDRStart()
Suzutomo 0:943dfa56009a 171 {
Suzutomo 0:943dfa56009a 172 uint8_t sd[7] = {0xF0,0x43,0x70,0x70,0x70,0x01,0xF7};
Suzutomo 0:943dfa56009a 173 ms.write(sd,7);
Suzutomo 0:943dfa56009a 174
Suzutomo 0:943dfa56009a 175 }