KAMUI MIDI-CV Example

Dependencies:   TextLCD mbed

Committer:
radiojunkbox
Date:
Sat May 05 11:35:41 2012 +0000
Revision:
0:25a282f1141a
Rev. 1.0

Who changed what in which revision?

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