KAMUI USB HOST MIDI-CV Example based on Peter Barrett's BlueUSB

Dependencies:   TextLCD mbed

Committer:
radiojunkbox
Date:
Fri May 11 15:31:59 2012 +0000
Revision:
0:3b4e3e2ec6a5
Rev. 0.1 alfa

Who changed what in which revision?

UserRevisionLine numberNew contents of line
radiojunkbox 0:3b4e3e2ec6a5 1 //-------------------------------------------------------------
radiojunkbox 0:3b4e3e2ec6a5 2 // file : midi_parser.c
radiojunkbox 0:3b4e3e2ec6a5 3 // Copyright (C) 2012 RJB RadioJunkBox
radiojunkbox 0:3b4e3e2ec6a5 4 // Released under the MIT License: http://mbed.org/license/mit
radiojunkbox 0:3b4e3e2ec6a5 5 //-------------------------------------------------------------
radiojunkbox 0:3b4e3e2ec6a5 6
radiojunkbox 0:3b4e3e2ec6a5 7 #include "mbed.h"
radiojunkbox 0:3b4e3e2ec6a5 8 #include "midi_parser.h"
radiojunkbox 0:3b4e3e2ec6a5 9
radiojunkbox 0:3b4e3e2ec6a5 10 //-------------------------------------------------------------
radiojunkbox 0:3b4e3e2ec6a5 11 // MIDI Parser
radiojunkbox 0:3b4e3e2ec6a5 12
radiojunkbox 0:3b4e3e2ec6a5 13 void MIDI_Parser(unsigned char mididata)
radiojunkbox 0:3b4e3e2ec6a5 14 {
radiojunkbox 0:3b4e3e2ec6a5 15 RxByte = mididata;
radiojunkbox 0:3b4e3e2ec6a5 16
radiojunkbox 0:3b4e3e2ec6a5 17 if(MIDI_SystemMessage()) {
radiojunkbox 0:3b4e3e2ec6a5 18 MIDI_ChannelMessage();
radiojunkbox 0:3b4e3e2ec6a5 19 }
radiojunkbox 0:3b4e3e2ec6a5 20 }
radiojunkbox 0:3b4e3e2ec6a5 21
radiojunkbox 0:3b4e3e2ec6a5 22 //-------------------------------------------------------------
radiojunkbox 0:3b4e3e2ec6a5 23 // MIDI System Meassage
radiojunkbox 0:3b4e3e2ec6a5 24
radiojunkbox 0:3b4e3e2ec6a5 25 int MIDI_SystemMessage(void)
radiojunkbox 0:3b4e3e2ec6a5 26 {
radiojunkbox 0:3b4e3e2ec6a5 27 if(SysEx){
radiojunkbox 0:3b4e3e2ec6a5 28 if(RxByte == MIDI_EndSysEx){
radiojunkbox 0:3b4e3e2ec6a5 29 SysEx = FALSE;
radiojunkbox 0:3b4e3e2ec6a5 30 }
radiojunkbox 0:3b4e3e2ec6a5 31 }
radiojunkbox 0:3b4e3e2ec6a5 32 else{
radiojunkbox 0:3b4e3e2ec6a5 33 if(RxByte < 0xF8){
radiojunkbox 0:3b4e3e2ec6a5 34 if(RxByte > 0x7F){
radiojunkbox 0:3b4e3e2ec6a5 35 if(RxByte == MIDI_StartSysEx){
radiojunkbox 0:3b4e3e2ec6a5 36 SysEx = TRUE;
radiojunkbox 0:3b4e3e2ec6a5 37 }
radiojunkbox 0:3b4e3e2ec6a5 38 else{
radiojunkbox 0:3b4e3e2ec6a5 39 MidiCh = RxByte & 0x0F;
radiojunkbox 0:3b4e3e2ec6a5 40 }
radiojunkbox 0:3b4e3e2ec6a5 41 PC = 0;
radiojunkbox 0:3b4e3e2ec6a5 42 }
radiojunkbox 0:3b4e3e2ec6a5 43 else{
radiojunkbox 0:3b4e3e2ec6a5 44 MByte[PC & 0x01] = RxByte;
radiojunkbox 0:3b4e3e2ec6a5 45 }
radiojunkbox 0:3b4e3e2ec6a5 46 return TRUE;
radiojunkbox 0:3b4e3e2ec6a5 47 }
radiojunkbox 0:3b4e3e2ec6a5 48 else {
radiojunkbox 0:3b4e3e2ec6a5 49 MIDI_SystemRealtimeMessage();
radiojunkbox 0:3b4e3e2ec6a5 50 }
radiojunkbox 0:3b4e3e2ec6a5 51 }
radiojunkbox 0:3b4e3e2ec6a5 52 return FALSE;
radiojunkbox 0:3b4e3e2ec6a5 53 }
radiojunkbox 0:3b4e3e2ec6a5 54
radiojunkbox 0:3b4e3e2ec6a5 55 //-------------------------------------------------------------
radiojunkbox 0:3b4e3e2ec6a5 56 // MIDI System Realtime Message
radiojunkbox 0:3b4e3e2ec6a5 57
radiojunkbox 0:3b4e3e2ec6a5 58 void MIDI_SystemRealtimeMessage(void)
radiojunkbox 0:3b4e3e2ec6a5 59 {
radiojunkbox 0:3b4e3e2ec6a5 60 switch(RxByte) {
radiojunkbox 0:3b4e3e2ec6a5 61 case MIDI_TimingClock:
radiojunkbox 0:3b4e3e2ec6a5 62 gMIDISYNC_CLK |= 0x01;
radiojunkbox 0:3b4e3e2ec6a5 63 break;
radiojunkbox 0:3b4e3e2ec6a5 64 case MIDI_Start:
radiojunkbox 0:3b4e3e2ec6a5 65 gMIDISYNC_RUN = 0x01;
radiojunkbox 0:3b4e3e2ec6a5 66 break;
radiojunkbox 0:3b4e3e2ec6a5 67 case MIDI_Continue:
radiojunkbox 0:3b4e3e2ec6a5 68 gMIDISYNC_RUN = 0x01;
radiojunkbox 0:3b4e3e2ec6a5 69 break;
radiojunkbox 0:3b4e3e2ec6a5 70 case MIDI_Stop:
radiojunkbox 0:3b4e3e2ec6a5 71 gMIDISYNC_RUN = 0x00;
radiojunkbox 0:3b4e3e2ec6a5 72 break;
radiojunkbox 0:3b4e3e2ec6a5 73 case MIDI_ActiveSensing:
radiojunkbox 0:3b4e3e2ec6a5 74 break;
radiojunkbox 0:3b4e3e2ec6a5 75 case MIDI_SystemReset:
radiojunkbox 0:3b4e3e2ec6a5 76 break;
radiojunkbox 0:3b4e3e2ec6a5 77 }
radiojunkbox 0:3b4e3e2ec6a5 78 }
radiojunkbox 0:3b4e3e2ec6a5 79
radiojunkbox 0:3b4e3e2ec6a5 80 //-------------------------------------------------------------
radiojunkbox 0:3b4e3e2ec6a5 81 // MIDI Channel Message
radiojunkbox 0:3b4e3e2ec6a5 82
radiojunkbox 0:3b4e3e2ec6a5 83 void MIDI_ChannelMessage(void)
radiojunkbox 0:3b4e3e2ec6a5 84 {
radiojunkbox 0:3b4e3e2ec6a5 85 switch(PC){
radiojunkbox 0:3b4e3e2ec6a5 86 case 0:
radiojunkbox 0:3b4e3e2ec6a5 87 switch(RxByte & 0xF0){
radiojunkbox 0:3b4e3e2ec6a5 88 case MIDI_NoteOff:
radiojunkbox 0:3b4e3e2ec6a5 89 PC = 2;
radiojunkbox 0:3b4e3e2ec6a5 90 break;
radiojunkbox 0:3b4e3e2ec6a5 91 case MIDI_NoteOn:
radiojunkbox 0:3b4e3e2ec6a5 92 PC = 4;
radiojunkbox 0:3b4e3e2ec6a5 93 break;
radiojunkbox 0:3b4e3e2ec6a5 94 case MIDI_PolykeyPressure:
radiojunkbox 0:3b4e3e2ec6a5 95 PC = 6;
radiojunkbox 0:3b4e3e2ec6a5 96 break;
radiojunkbox 0:3b4e3e2ec6a5 97 case MIDI_ProgramChange:
radiojunkbox 0:3b4e3e2ec6a5 98 PC = 8;
radiojunkbox 0:3b4e3e2ec6a5 99 break;
radiojunkbox 0:3b4e3e2ec6a5 100 case MIDI_ControlChange:
radiojunkbox 0:3b4e3e2ec6a5 101 PC = 10;
radiojunkbox 0:3b4e3e2ec6a5 102 break;
radiojunkbox 0:3b4e3e2ec6a5 103 case MIDI_ChannelPressure:
radiojunkbox 0:3b4e3e2ec6a5 104 PC = 12;
radiojunkbox 0:3b4e3e2ec6a5 105 break;
radiojunkbox 0:3b4e3e2ec6a5 106 case MIDI_PitchBend:
radiojunkbox 0:3b4e3e2ec6a5 107 PC = 14;
radiojunkbox 0:3b4e3e2ec6a5 108 break;
radiojunkbox 0:3b4e3e2ec6a5 109 } break;
radiojunkbox 0:3b4e3e2ec6a5 110
radiojunkbox 0:3b4e3e2ec6a5 111 // Note OFF
radiojunkbox 0:3b4e3e2ec6a5 112 case 2:
radiojunkbox 0:3b4e3e2ec6a5 113 PC = 3;
radiojunkbox 0:3b4e3e2ec6a5 114 break;
radiojunkbox 0:3b4e3e2ec6a5 115 case 3:
radiojunkbox 0:3b4e3e2ec6a5 116 PC = 2;
radiojunkbox 0:3b4e3e2ec6a5 117 NoteOFF();
radiojunkbox 0:3b4e3e2ec6a5 118 break;
radiojunkbox 0:3b4e3e2ec6a5 119
radiojunkbox 0:3b4e3e2ec6a5 120 // Note ON
radiojunkbox 0:3b4e3e2ec6a5 121 case 4:
radiojunkbox 0:3b4e3e2ec6a5 122 PC = 5;
radiojunkbox 0:3b4e3e2ec6a5 123 break;
radiojunkbox 0:3b4e3e2ec6a5 124 case 5:
radiojunkbox 0:3b4e3e2ec6a5 125 PC = 4;
radiojunkbox 0:3b4e3e2ec6a5 126 if( MByte[1] == 0){
radiojunkbox 0:3b4e3e2ec6a5 127 NoteOFF();
radiojunkbox 0:3b4e3e2ec6a5 128 }
radiojunkbox 0:3b4e3e2ec6a5 129 else{
radiojunkbox 0:3b4e3e2ec6a5 130 NoteON();
radiojunkbox 0:3b4e3e2ec6a5 131 }
radiojunkbox 0:3b4e3e2ec6a5 132 break;
radiojunkbox 0:3b4e3e2ec6a5 133
radiojunkbox 0:3b4e3e2ec6a5 134 // Polyphonic Key Pressure
radiojunkbox 0:3b4e3e2ec6a5 135 case 6:
radiojunkbox 0:3b4e3e2ec6a5 136 PC = 7;
radiojunkbox 0:3b4e3e2ec6a5 137 break;
radiojunkbox 0:3b4e3e2ec6a5 138 case 7:
radiojunkbox 0:3b4e3e2ec6a5 139 PC = 6;
radiojunkbox 0:3b4e3e2ec6a5 140 break;
radiojunkbox 0:3b4e3e2ec6a5 141
radiojunkbox 0:3b4e3e2ec6a5 142 // Program Change
radiojunkbox 0:3b4e3e2ec6a5 143 case 8:
radiojunkbox 0:3b4e3e2ec6a5 144 break;
radiojunkbox 0:3b4e3e2ec6a5 145
radiojunkbox 0:3b4e3e2ec6a5 146 // Control Change
radiojunkbox 0:3b4e3e2ec6a5 147 case 10: PC = 11; break;
radiojunkbox 0:3b4e3e2ec6a5 148 case 11:
radiojunkbox 0:3b4e3e2ec6a5 149 switch(MByte[0]) {
radiojunkbox 0:3b4e3e2ec6a5 150 case MIDI_CC_Moduration:
radiojunkbox 0:3b4e3e2ec6a5 151 gModWheelBuf[MidiCh] = MByte[1] >> 2;
radiojunkbox 0:3b4e3e2ec6a5 152 break;
radiojunkbox 0:3b4e3e2ec6a5 153 case MIDI_CC_DataEntry:
radiojunkbox 0:3b4e3e2ec6a5 154 break;
radiojunkbox 0:3b4e3e2ec6a5 155 case MIDI_CC_RPN_LSB:
radiojunkbox 0:3b4e3e2ec6a5 156 break;
radiojunkbox 0:3b4e3e2ec6a5 157 case MIDI_CC_RPN_MSB:
radiojunkbox 0:3b4e3e2ec6a5 158 break;
radiojunkbox 0:3b4e3e2ec6a5 159 case MIDI_MM_AllSoundOff:
radiojunkbox 0:3b4e3e2ec6a5 160 break;
radiojunkbox 0:3b4e3e2ec6a5 161 case MIDI_MM_ResetAllControl:
radiojunkbox 0:3b4e3e2ec6a5 162 break;
radiojunkbox 0:3b4e3e2ec6a5 163 case MIDI_MM_AllNoteOff:
radiojunkbox 0:3b4e3e2ec6a5 164 break;
radiojunkbox 0:3b4e3e2ec6a5 165 }
radiojunkbox 0:3b4e3e2ec6a5 166 break;
radiojunkbox 0:3b4e3e2ec6a5 167
radiojunkbox 0:3b4e3e2ec6a5 168 // Channel Pressure
radiojunkbox 0:3b4e3e2ec6a5 169 case 12:
radiojunkbox 0:3b4e3e2ec6a5 170 break;
radiojunkbox 0:3b4e3e2ec6a5 171
radiojunkbox 0:3b4e3e2ec6a5 172 // Pitch Bend
radiojunkbox 0:3b4e3e2ec6a5 173 case 14:
radiojunkbox 0:3b4e3e2ec6a5 174 PC = 15;
radiojunkbox 0:3b4e3e2ec6a5 175 break;
radiojunkbox 0:3b4e3e2ec6a5 176
radiojunkbox 0:3b4e3e2ec6a5 177 case 15:
radiojunkbox 0:3b4e3e2ec6a5 178 PC = 14;
radiojunkbox 0:3b4e3e2ec6a5 179 gPitchBendBuf[MidiCh] = (MByte[1] << 1) | (MByte[0] >> 6);
radiojunkbox 0:3b4e3e2ec6a5 180 break;
radiojunkbox 0:3b4e3e2ec6a5 181
radiojunkbox 0:3b4e3e2ec6a5 182 default:
radiojunkbox 0:3b4e3e2ec6a5 183 break;
radiojunkbox 0:3b4e3e2ec6a5 184 }
radiojunkbox 0:3b4e3e2ec6a5 185 }
radiojunkbox 0:3b4e3e2ec6a5 186
radiojunkbox 0:3b4e3e2ec6a5 187 //-------------------------------------------------------------
radiojunkbox 0:3b4e3e2ec6a5 188 // Note ON Message Processing
radiojunkbox 0:3b4e3e2ec6a5 189
radiojunkbox 0:3b4e3e2ec6a5 190 void NoteON(void)
radiojunkbox 0:3b4e3e2ec6a5 191 {
radiojunkbox 0:3b4e3e2ec6a5 192 unsigned char i;
radiojunkbox 0:3b4e3e2ec6a5 193 unsigned char h = 0; // higheest note
radiojunkbox 0:3b4e3e2ec6a5 194
radiojunkbox 0:3b4e3e2ec6a5 195 // ignore note if registed buffer
radiojunkbox 0:3b4e3e2ec6a5 196 for(i = 0; i < NoteCnt[MidiCh]; i++) {
radiojunkbox 0:3b4e3e2ec6a5 197 if(NoteBuf[MidiCh][i] == MByte[0]) {
radiojunkbox 0:3b4e3e2ec6a5 198 return;
radiojunkbox 0:3b4e3e2ec6a5 199 }
radiojunkbox 0:3b4e3e2ec6a5 200 }
radiojunkbox 0:3b4e3e2ec6a5 201
radiojunkbox 0:3b4e3e2ec6a5 202 // full note buffer?
radiojunkbox 0:3b4e3e2ec6a5 203 if(NoteCnt[MidiCh] == MAX_NOTE_CNT) {
radiojunkbox 0:3b4e3e2ec6a5 204 for(i = 0; i < (MAX_NOTE_CNT - 1); i++) {
radiojunkbox 0:3b4e3e2ec6a5 205 NoteBuf[MidiCh][i] = NoteBuf[MidiCh][i+1];
radiojunkbox 0:3b4e3e2ec6a5 206 }
radiojunkbox 0:3b4e3e2ec6a5 207 NoteBuf[MidiCh][MAX_NOTE_CNT - 1] = MByte[0];
radiojunkbox 0:3b4e3e2ec6a5 208 }
radiojunkbox 0:3b4e3e2ec6a5 209 else {
radiojunkbox 0:3b4e3e2ec6a5 210 NoteBuf[MidiCh][NoteCnt[MidiCh]] = MByte[0];
radiojunkbox 0:3b4e3e2ec6a5 211 NoteCnt[MidiCh]++;
radiojunkbox 0:3b4e3e2ec6a5 212 }
radiojunkbox 0:3b4e3e2ec6a5 213
radiojunkbox 0:3b4e3e2ec6a5 214 // set highest note
radiojunkbox 0:3b4e3e2ec6a5 215 for(i = 0; i < NoteCnt[MidiCh]; i++) {
radiojunkbox 0:3b4e3e2ec6a5 216 if(h < NoteBuf[MidiCh][i]) {
radiojunkbox 0:3b4e3e2ec6a5 217 h = NoteBuf[MidiCh][i];
radiojunkbox 0:3b4e3e2ec6a5 218 }
radiojunkbox 0:3b4e3e2ec6a5 219 }
radiojunkbox 0:3b4e3e2ec6a5 220 gPlayNoteBuf[MidiCh] = h;
radiojunkbox 0:3b4e3e2ec6a5 221 gGateBuf[MidiCh] = ON;
radiojunkbox 0:3b4e3e2ec6a5 222 }
radiojunkbox 0:3b4e3e2ec6a5 223
radiojunkbox 0:3b4e3e2ec6a5 224 //-------------------------------------------------------------
radiojunkbox 0:3b4e3e2ec6a5 225 // Note OFF Message Processing
radiojunkbox 0:3b4e3e2ec6a5 226
radiojunkbox 0:3b4e3e2ec6a5 227 void NoteOFF(void)
radiojunkbox 0:3b4e3e2ec6a5 228 {
radiojunkbox 0:3b4e3e2ec6a5 229 unsigned char i;
radiojunkbox 0:3b4e3e2ec6a5 230 unsigned char h = 0; // highest note
radiojunkbox 0:3b4e3e2ec6a5 231 int flg = FALSE;
radiojunkbox 0:3b4e3e2ec6a5 232
radiojunkbox 0:3b4e3e2ec6a5 233 // Delete Note If Registed Buffer
radiojunkbox 0:3b4e3e2ec6a5 234 for(i = 0; i < NoteCnt[MidiCh]; i++) {
radiojunkbox 0:3b4e3e2ec6a5 235 if(flg) {
radiojunkbox 0:3b4e3e2ec6a5 236 NoteBuf[MidiCh][i-1] = NoteBuf[MidiCh][i];
radiojunkbox 0:3b4e3e2ec6a5 237 }
radiojunkbox 0:3b4e3e2ec6a5 238 if(NoteBuf[MidiCh][i] == MByte[0]) {
radiojunkbox 0:3b4e3e2ec6a5 239 flg = TRUE;
radiojunkbox 0:3b4e3e2ec6a5 240 }
radiojunkbox 0:3b4e3e2ec6a5 241 }
radiojunkbox 0:3b4e3e2ec6a5 242 if(flg) NoteCnt[MidiCh]--;
radiojunkbox 0:3b4e3e2ec6a5 243
radiojunkbox 0:3b4e3e2ec6a5 244 if(NoteCnt[MidiCh] == 0) {
radiojunkbox 0:3b4e3e2ec6a5 245 // Empty Buffer then Gate OFF
radiojunkbox 0:3b4e3e2ec6a5 246 gGateBuf[MidiCh] = OFF;
radiojunkbox 0:3b4e3e2ec6a5 247 }
radiojunkbox 0:3b4e3e2ec6a5 248 else {
radiojunkbox 0:3b4e3e2ec6a5 249 // Highest Note
radiojunkbox 0:3b4e3e2ec6a5 250 for(i = 0; i < NoteCnt[MidiCh]; i++) {
radiojunkbox 0:3b4e3e2ec6a5 251 if( h < NoteBuf[MidiCh][i]) {
radiojunkbox 0:3b4e3e2ec6a5 252 h = NoteBuf[MidiCh][i];
radiojunkbox 0:3b4e3e2ec6a5 253 }
radiojunkbox 0:3b4e3e2ec6a5 254 }
radiojunkbox 0:3b4e3e2ec6a5 255 gPlayNoteBuf[MidiCh] = h;
radiojunkbox 0:3b4e3e2ec6a5 256 }
radiojunkbox 0:3b4e3e2ec6a5 257 }
radiojunkbox 0:3b4e3e2ec6a5 258