00001
00002
00003
00004
00005
00006
00007
00008
00010 #ifdef __AVR_ATmega644P__
00011 #undef UART
00012 #define UART Serial1
00013 #else
00014
00015 #undef UART
00016 #define UART Serial
00017 #endif
00018
00019
00020
00021 #include <inttypes.h>
00022 #include <stdlib.h>
00023 #include "WConstants.h"
00024 #include "MIDI.h"
00025
00026 #include "HardwareSerial.h"
00027 #define Channel_Refused 0
00028
00030 MIDI_Class MIDI;
00031
00032
00034 MIDI_Class::MIDI_Class() { }
00038 MIDI_Class::~MIDI_Class() { }
00039
00040
00046 void MIDI_Class::begin(byte inChannel) {
00047
00048 UART.begin(MIDI_rate);
00049 delMsg();
00050 sysex_ID = MANUFACTURER_ID_H;
00051 mInputChannel = inChannel;
00052 mThruActivated = true;
00053 mFilterMode = MIDI_FILTER_FULL;
00054 mRunningStatus_TX = Channel_Refused;
00055 mRunningStatus_RX = Channel_Refused;
00056 return;
00057 }
00058
00060 byte MIDI_Class::genctrl(byte canal, byte type) {
00061 byte result = 128;
00062 result += ((type & 0x07)<<4) & 0x70;
00063 result += ((canal-1) & 0x0F);
00064 return result;
00065 }
00066
00067
00074 void MIDI_Class::send(byte type, byte data1, byte data2, byte channel) {
00075
00076 data1 &= 0x7F;
00077 data2 &= 0x7F;
00078 if (channel >= MIDI_CHANNEL_OFF) {
00079 mRunningStatus_TX = Channel_Refused;
00080 return;
00081 }
00082 if (mRunningStatus_TX == genctrl(channel,type)) {
00083
00084 if (type == PC || type == ATCanal) {
00085 UART.print(data1, BYTE);
00086 }
00087 else if (type == SysEx) {
00088
00089 }
00090 else {
00091 UART.print(data1, BYTE);
00092 UART.print(data2, BYTE);
00093 }
00094 }
00095 else {
00096
00097 if (type == PC || type == ATCanal) {
00098 UART.print(genctrl(channel,type), BYTE);
00099 UART.print(data1, BYTE);
00100 }
00101 else if (type == SysEx) {
00102 UART.print(genctrl(channel,type));
00103 }
00104 else {
00105 UART.print(genctrl(channel,type), BYTE);
00106 UART.print(data1, BYTE);
00107 UART.print(data2, BYTE);
00108 }
00109 mRunningStatus_TX = genctrl(channel,type);
00110 }
00111 return;
00112 }
00113
00115 void MIDI_Class::sendNoteOn(byte NoteNumber,byte Velocity,byte Channel) { send(NoteOn,NoteNumber,Velocity,Channel); }
00117 void MIDI_Class::sendNoteOff(byte NoteNumber,byte Velocity,byte Channel) { send(NoteOff,NoteNumber,Velocity,Channel); }
00119 void MIDI_Class::sendProgramChange(byte ProgramNumber,byte Channel) { send(PC,ProgramNumber,0,Channel); }
00121 void MIDI_Class::sendControlChange(byte ControlNumber, byte ControlValue,byte Channel) { send(CC,ControlNumber,ControlValue,Channel); }
00123 void MIDI_Class::sendPolyPressure(byte NoteNumber,byte Pressure,byte Channel) { send(ATPoly,NoteNumber,Pressure,Channel); }
00125 void MIDI_Class::sendAfterTouch(byte Pressure,byte Channel) { send(ATCanal,Pressure,0,Channel); }
00131 void MIDI_Class::sendSysEx(byte length, byte * array) {
00132 UART.print(0xF0,BYTE);
00133 for (byte i=0;i<length;i++) UART.print(array[i],BYTE);
00134 UART.print(0xF7,BYTE);
00135 }
00136
00138 byte MIDI_Class::getType() { return mMessage.type; }
00140 byte MIDI_Class::getChannel() { return mMessage.channel; }
00142 byte MIDI_Class::getData1() { return mMessage.data1; }
00144 byte MIDI_Class::getData2() { return mMessage.data2; }
00146 byte * MIDI_Class::getSysExArray() { return mMessage.sysex_array; }
00148 bool MIDI_Class::check() { return mMessage.OK; }
00149
00150
00152 void MIDI_Class::delMsg() {
00153 setChannel(0);
00154 setType(0);
00155 setData1(0);
00156 setData2(0);
00157 setStatus(false);
00158 delSysEx();
00159 return;
00160 }
00161 void MIDI_Class::delSysEx() {
00162 for (int i=0;i<MIDI_SYSEX_ARRAY_SIZE;i++) mMessage.sysex_array[i] = 0;
00163 }
00165 void MIDI_Class::setDeviceID(byte sysID) { sysex_ID = sysID; }
00170 void MIDI_Class::setInputChannel(byte channel) { mInputChannel = channel; }
00177 void MIDI_Class::setFilter(byte filter) { mFilterMode = filter; }
00178
00180 void MIDI_Class::turnThruOn() { mThruActivated = true; }
00182 void MIDI_Class::turnThruOff() { mThruActivated = false; }
00184 void MIDI_Class::turnThru(bool val) { mThruActivated = val; }
00185
00186
00187 void MIDI_Class::setType(byte type) { mMessage.type = type; }
00188 void MIDI_Class::setChannel(byte channel) { mMessage.channel = channel; }
00189 void MIDI_Class::setData1(byte D) { mMessage.data1 = D; }
00190 void MIDI_Class::setData2(byte D) { mMessage.data2 = D; }
00191 void MIDI_Class::setStatus(bool ok) { mMessage.OK = ok; }
00192
00193
00194 bool MIDI_Class::parse(byte inChannelFilter) {
00195 if (inChannelFilter >= MIDI_CHANNEL_OFF) return false;
00196 byte tStatus=0,tChannel=0,tType=0,tData1=0,tData2=0;
00197 delMsg();
00198 if (UART.available() == 128) { UART.flush(); };
00199 if (UART.available() > 0) {
00200 tStatus = UART.read();
00201 if (tStatus > 127) {
00202 tChannel = (tStatus&0x0F)+1;
00203 tType = ((tStatus&0x70)>>4)&0x07;
00204 if (tChannel == inChannelFilter || inChannelFilter == MIDI_CHANNEL_OMNI || tType == SysEx) {
00205 if (tType == PC || tType == ATCanal) {
00206
00207 if(UART.available() > 0) {
00208 tData1 = UART.read();
00209 if (tData1 < 128) {
00210
00211 setChannel(tChannel);
00212 setType(tType);
00213 setData1(tData1);
00214 setData2(0);
00215 setStatus(true);
00216 mRunningStatus_RX = tStatus;
00217 }
00218 }
00219 else {
00220
00221 mRunningStatus_RX = tStatus;
00222 return false;
00223 }
00224 }
00225 else if (tType == SysEx) {
00226 mMessage.sysex_array[0] = tStatus;
00227 unsigned length;
00228 for (length=1;length<MIDI_SYSEX_ARRAY_SIZE;length++) {
00229 while(!UART.available()) {};
00230 tData1 = UART.read();
00231 mMessage.sysex_array[length] = tData1;
00232 if (tData1 == 0xF7) {
00233 length++;
00234 break;
00235 }
00236 }
00237 for (unsigned i=0;i<length;i++) { Serial.print(mMessage.sysex_array[i],HEX); Serial << " "; }
00238 setType(SysEx);
00239 setData1(length);
00240 setStatus(true);
00241 mRunningStatus_RX = Channel_Refused;
00242 }
00243 else {
00244
00245 if(UART.available() > 0) {
00246 tData1 = UART.read();
00247 if (tData1 < 128) {
00248
00249 while(!UART.available()) {};
00250 if(UART.available() > 0) {
00251 tData2 = UART.read();
00252 if (tData2 < 128) {
00253
00254 setChannel(tChannel);
00255 setType(tType);
00256 setData1(tData1);
00257 setData2(tData2);
00258 setStatus(true);
00259 mRunningStatus_RX = tStatus;
00260 }
00261 }
00262 }
00263 else {
00264
00265 return false;
00266 }
00267 }
00268 else {
00269
00270 mRunningStatus_RX = tStatus;
00271 return false;
00272 }
00273 }
00274 }
00275 else {
00276
00277 mRunningStatus_RX = Channel_Refused;
00278 return false;
00279 }
00280 }
00281 else {
00282
00283
00284 if (mRunningStatus_RX == Channel_Refused) {
00285 return false;
00286 }
00287 else {
00288 tChannel = (mRunningStatus_RX&0x0F)+1;
00289 tType = ((mRunningStatus_RX&0x70)>>4)&0x07;
00290 if (tType == PC || tType == ATCanal) {
00291
00292 setChannel(tChannel);
00293 setType(tType);
00294 setData1(tStatus);
00295 setData2(0);
00296 setStatus(true);
00297 }
00298 else if (tType == SysEx) {
00299
00300 mRunningStatus_RX = Channel_Refused;
00301 }
00302 else {
00303
00304 while(!UART.available()) {};
00305 if(UART.available() > 0) {
00306 tData2 = UART.read();
00307 if (tData2 < 128) {
00308
00309 setChannel(tChannel);
00310 setType(tType);
00311 setData1(tStatus);
00312 setData2(tData2);
00313 setStatus(true);
00314 }
00315 }
00316 }
00317 }
00318 }
00319 }
00320 else return false;
00321 return check();
00322 }
00323
00324
00330 bool MIDI_Class::read() {
00331 return read(mInputChannel);
00332 }
00334 bool MIDI_Class::read(byte channel) {
00335 if (parse(MIDI_CHANNEL_OMNI)) {
00336 if (channel >= MIDI_CHANNEL_OFF && getType() != SysEx) {
00337 delMsg();
00338 return false;
00339 }
00340 if (mThruActivated) filter(channel);
00341 if (getChannel() == channel || channel == MIDI_CHANNEL_OMNI || getType() == SysEx) return true;
00342 else {
00343 delMsg();
00344 return false;
00345 }
00346 }
00347 else return false;
00348 }
00349
00350 void MIDI_Class::filter(byte channel) {
00351
00352 switch (mFilterMode) {
00353 case MIDI_FILTER_FULL:
00354
00355 send(getType(),getData1(),getData2(),getChannel());
00356 break;
00357 case MIDI_FILTER_CANAL:
00358
00359 if (channel >= MIDI_CHANNEL_OFF) return;
00360 if (getChannel() == channel || channel == MIDI_CHANNEL_OMNI) send(getType(),getData1(),getData2(),getChannel());
00361 break;
00362 case MIDI_FILTER_ANTICANAL:
00363
00364 if (channel == MIDI_CHANNEL_OMNI) return;
00365 if (getChannel() != channel || channel >= MIDI_CHANNEL_OFF) send(getType(),getData1(),getData2(),getChannel());
00366 break;
00367 default:
00368 break;
00369 }
00370 return;
00371 }
00372
00373
00374
00375
00376
00377