Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
midi.h@0:943dfa56009a, 2020-11-07 (annotated)
- Committer:
- Suzutomo
- Date:
- Sat Nov 07 13:40:03 2020 +0000
- Revision:
- 0:943dfa56009a
first?
Who changed what in which revision?
User | Revision | Line number | New 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 | } |