Dependencies:   mbed

Committer:
Midimetric
Date:
Tue Jun 07 13:32:20 2011 +0000
Revision:
0:71d791204057
Version 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Midimetric 0:71d791204057 1 #ifndef MIDI_H
Midimetric 0:71d791204057 2 #define MIDI_H
Midimetric 0:71d791204057 3
Midimetric 0:71d791204057 4 #include <vector>
Midimetric 0:71d791204057 5
Midimetric 0:71d791204057 6 #ifndef BYTE
Midimetric 0:71d791204057 7 #define BYTE
Midimetric 0:71d791204057 8 typedef unsigned char byte;
Midimetric 0:71d791204057 9 #endif
Midimetric 0:71d791204057 10
Midimetric 0:71d791204057 11 #ifndef WORD
Midimetric 0:71d791204057 12 #define WORD
Midimetric 0:71d791204057 13 typedef unsigned short word;
Midimetric 0:71d791204057 14 #endif
Midimetric 0:71d791204057 15
Midimetric 0:71d791204057 16 // unused midi code serves as defining 'Not A Known Value':
Midimetric 0:71d791204057 17 #define NAKN 253
Midimetric 0:71d791204057 18
Midimetric 0:71d791204057 19 // out of 14bit range value serves as defining 'Not A Known Word':
Midimetric 0:71d791204057 20 #define NAKW 0x5000
Midimetric 0:71d791204057 21
Midimetric 0:71d791204057 22 // generic:
Midimetric 0:71d791204057 23 #define NONE 0
Midimetric 0:71d791204057 24
Midimetric 0:71d791204057 25 // values for member 'next':
Midimetric 0:71d791204057 26 #define VALA 1
Midimetric 0:71d791204057 27 #define VALB 2
Midimetric 0:71d791204057 28 #define MSB 3
Midimetric 0:71d791204057 29 #define LSB 4
Midimetric 0:71d791204057 30 #define PAIR 5
Midimetric 0:71d791204057 31 #define ITEM 6
Midimetric 0:71d791204057 32 #define MSB2 7
Midimetric 0:71d791204057 33 #define LSB2 8
Midimetric 0:71d791204057 34
Midimetric 0:71d791204057 35 // values for member 'type':
Midimetric 0:71d791204057 36 // channel message:
Midimetric 0:71d791204057 37 #define NOTE 1
Midimetric 0:71d791204057 38 #define POLA 2
Midimetric 0:71d791204057 39 #define CTRL 3
Midimetric 0:71d791204057 40 #define PROG 4
Midimetric 0:71d791204057 41 #define BANK 5
Midimetric 0:71d791204057 42 #define DATA 6
Midimetric 0:71d791204057 43 #define INCR 7
Midimetric 0:71d791204057 44 #define DECR 8
Midimetric 0:71d791204057 45 #define RPN_ 9
Midimetric 0:71d791204057 46 #define NRPN 10
Midimetric 0:71d791204057 47 #define MONA 11
Midimetric 0:71d791204057 48 #define BEND 12
Midimetric 0:71d791204057 49 // no channel message:
Midimetric 0:71d791204057 50 #define SYSX 13
Midimetric 0:71d791204057 51 #define TCOD 14
Midimetric 0:71d791204057 52 #define SPOS 15
Midimetric 0:71d791204057 53 #define SSEL 16
Midimetric 0:71d791204057 54 #define TUNE 17
Midimetric 0:71d791204057 55 #define CLOK 18
Midimetric 0:71d791204057 56 #define STAR 19
Midimetric 0:71d791204057 57 #define CONT 20
Midimetric 0:71d791204057 58 #define STOP 21
Midimetric 0:71d791204057 59 #define SENS 22
Midimetric 0:71d791204057 60 #define RSET 23
Midimetric 0:71d791204057 61
Midimetric 0:71d791204057 62 ///////////////////////////////////////////////////////////////////////////////
Midimetric 0:71d791204057 63 // base class for all Messages
Midimetric 0:71d791204057 64 //_____________________________________________________________________________
Midimetric 0:71d791204057 65 class MidiM
Midimetric 0:71d791204057 66 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 67 public:
Midimetric 0:71d791204057 68 byte Command;
Midimetric 0:71d791204057 69 byte Type;
Midimetric 0:71d791204057 70 byte Channel;
Midimetric 0:71d791204057 71 byte Next; // expected type of next inconming byte
Midimetric 0:71d791204057 72 byte ValA; // data
Midimetric 0:71d791204057 73 byte ValB; // data
Midimetric 0:71d791204057 74 vector<byte> Raw;
Midimetric 0:71d791204057 75
Midimetric 0:71d791204057 76 MidiM( byte type ) : Command(0), Type( type ), Channel( NAKN ), Next(NONE), ValA(NAKN), ValB(NAKN) {}
Midimetric 0:71d791204057 77 MidiM( byte type, byte ch ) : Command(0), Type( type ), Channel( ch ), Next(NONE), ValA(NAKN), ValB(NAKN) {}
Midimetric 0:71d791204057 78 virtual ~MidiM(){}
Midimetric 0:71d791204057 79
Midimetric 0:71d791204057 80 virtual bool Append( byte b) { Raw.push_back(b); return true; }
Midimetric 0:71d791204057 81
Midimetric 0:71d791204057 82 virtual byte ValCount() { return 0; }
Midimetric 0:71d791204057 83
Midimetric 0:71d791204057 84 short Get14()
Midimetric 0:71d791204057 85 {
Midimetric 0:71d791204057 86 return ( ValA == NAKN ? 0 : ValA << 7 ) + ( ValB == NAKN ? 0 : ValB );
Midimetric 0:71d791204057 87 }
Midimetric 0:71d791204057 88 void Set14( short v )
Midimetric 0:71d791204057 89 {
Midimetric 0:71d791204057 90 ValA = ( v >> 7 ) & 127;
Midimetric 0:71d791204057 91 ValB = v & 127;
Midimetric 0:71d791204057 92 Next = NONE;
Midimetric 0:71d791204057 93 }
Midimetric 0:71d791204057 94 };
Midimetric 0:71d791204057 95 //_____________________________________________________________________________
Midimetric 0:71d791204057 96 class MidiTune : public MidiM
Midimetric 0:71d791204057 97 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 98 public:
Midimetric 0:71d791204057 99 MidiTune() : MidiM( TUNE ) { Raw.push_back( Command = 0xF6 ); }
Midimetric 0:71d791204057 100 virtual ~MidiTune(){}
Midimetric 0:71d791204057 101 // virtual void Send( Serial &s ) { s.putc( 0xF6 ); }
Midimetric 0:71d791204057 102 };
Midimetric 0:71d791204057 103 //_____________________________________________________________________________
Midimetric 0:71d791204057 104 class MidiClock : public MidiM
Midimetric 0:71d791204057 105 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 106 public:
Midimetric 0:71d791204057 107 MidiClock() : MidiM( CLOK ) { Raw.push_back( Command = 0xF8 ); }
Midimetric 0:71d791204057 108 virtual ~MidiClock(){}
Midimetric 0:71d791204057 109 // virtual void Send( Serial &s ) { s.putc( 0xF8 ); }
Midimetric 0:71d791204057 110 };
Midimetric 0:71d791204057 111 //_____________________________________________________________________________
Midimetric 0:71d791204057 112 class MidiStart : public MidiM
Midimetric 0:71d791204057 113 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 114 public:
Midimetric 0:71d791204057 115 MidiStart() : MidiM( STAR ) { Raw.push_back( Command = 0xFA ); }
Midimetric 0:71d791204057 116 virtual ~MidiStart(){}
Midimetric 0:71d791204057 117 // virtual void Send( Serial &s ) { s.putc( 0xFA ); }
Midimetric 0:71d791204057 118 };
Midimetric 0:71d791204057 119 //_____________________________________________________________________________
Midimetric 0:71d791204057 120 class MidiContinue : public MidiM
Midimetric 0:71d791204057 121 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 122 public:
Midimetric 0:71d791204057 123 MidiContinue() : MidiM( CONT ) { Raw.push_back( Command = 0xFB ); }
Midimetric 0:71d791204057 124 virtual ~MidiContinue(){}
Midimetric 0:71d791204057 125 // virtual void Send( Serial &s ) { s.putc( 0xFB ); }
Midimetric 0:71d791204057 126 };
Midimetric 0:71d791204057 127 //_____________________________________________________________________________
Midimetric 0:71d791204057 128 class MidiStop : public MidiM
Midimetric 0:71d791204057 129 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 130 public:
Midimetric 0:71d791204057 131 MidiStop() : MidiM( STOP ) { Raw.push_back( Command = 0xFC ); }
Midimetric 0:71d791204057 132 virtual ~MidiStop(){}
Midimetric 0:71d791204057 133 // virtual void Send( Serial &s ) { s.putc( 0xFC ); }
Midimetric 0:71d791204057 134 };
Midimetric 0:71d791204057 135 //_____________________________________________________________________________
Midimetric 0:71d791204057 136 class MidiSensing : public MidiM
Midimetric 0:71d791204057 137 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 138 public:
Midimetric 0:71d791204057 139 MidiSensing() : MidiM( SENS ) { Raw.push_back( Command = 0xFE ); }
Midimetric 0:71d791204057 140 virtual ~MidiSensing(){}
Midimetric 0:71d791204057 141 // virtual void Send( Serial &s ) { s.putc( 0xFE ); }
Midimetric 0:71d791204057 142 };
Midimetric 0:71d791204057 143 //_____________________________________________________________________________
Midimetric 0:71d791204057 144 class MidiReset : public MidiM
Midimetric 0:71d791204057 145 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 146 public:
Midimetric 0:71d791204057 147 MidiReset() : MidiM( RSET ) { Raw.push_back( Command = 0xFF ); }
Midimetric 0:71d791204057 148 virtual ~MidiReset(){}
Midimetric 0:71d791204057 149 // virtual void Send( Serial &s ) { s.putc( 0xFF ); }
Midimetric 0:71d791204057 150 };
Midimetric 0:71d791204057 151
Midimetric 0:71d791204057 152 ///////////////////////////////////////////////////////////////////////////////
Midimetric 0:71d791204057 153 // base class & derived classes for all Messages having 1 byte of data
Midimetric 0:71d791204057 154 //_____________________________________________________________________________
Midimetric 0:71d791204057 155 class MidiM1 : public MidiM
Midimetric 0:71d791204057 156 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 157 public:
Midimetric 0:71d791204057 158 MidiM1( byte type, byte ch ) : MidiM( type, ch ) { Next = VALA; }
Midimetric 0:71d791204057 159 MidiM1( byte type, byte ch, byte v ) : MidiM( type, ch ) { Next = NONE; ValA = v; }
Midimetric 0:71d791204057 160 virtual ~MidiM1(){}
Midimetric 0:71d791204057 161 virtual bool Append( byte b )
Midimetric 0:71d791204057 162 {
Midimetric 0:71d791204057 163 Raw.push_back(b);
Midimetric 0:71d791204057 164 if( b > 127 || Next == NONE ) return false;
Midimetric 0:71d791204057 165 Next = NONE; ValA = b; return true;
Midimetric 0:71d791204057 166 }
Midimetric 0:71d791204057 167 virtual byte ValCount() { return 1; }
Midimetric 0:71d791204057 168 };
Midimetric 0:71d791204057 169 //_____________________________________________________________________________
Midimetric 0:71d791204057 170 class MidiSelect : public MidiM1
Midimetric 0:71d791204057 171 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 172 public:
Midimetric 0:71d791204057 173 MidiSelect() : MidiM1( SSEL, NAKN ) { Raw.push_back( Command = 0xF3 ); }
Midimetric 0:71d791204057 174 MidiSelect( byte v ) : MidiM1( SSEL, NAKN, v ) { Raw.push_back( Command = 0xF3 ); }
Midimetric 0:71d791204057 175 virtual ~MidiSelect(){}
Midimetric 0:71d791204057 176 // virtual void Send( Serial &s ) { s.putc( 0xF3 ); s.putc( ValA ); }
Midimetric 0:71d791204057 177 };
Midimetric 0:71d791204057 178 //_____________________________________________________________________________
Midimetric 0:71d791204057 179 class MidiTimeCode : public MidiM1
Midimetric 0:71d791204057 180 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 181 public:
Midimetric 0:71d791204057 182 MidiTimeCode() : MidiM1( TCOD, NAKN ) { Raw.push_back( Command = 0xF1 ); }
Midimetric 0:71d791204057 183 MidiTimeCode( byte v ) : MidiM1( TCOD, NAKN, v ) { Raw.push_back( Command = 0xF1 ); }
Midimetric 0:71d791204057 184 virtual ~MidiTimeCode(){}
Midimetric 0:71d791204057 185 // virtual void Send( Serial &s ) { s.putc( 0xF1 ); s.putc( ValA ); }
Midimetric 0:71d791204057 186 };
Midimetric 0:71d791204057 187 //_____________________________________________________________________________
Midimetric 0:71d791204057 188 class MidiProgram : public MidiM1
Midimetric 0:71d791204057 189 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 190 public:
Midimetric 0:71d791204057 191 MidiProgram( byte ch ) : MidiM1( PROG, ch ) { Raw.push_back( ( Command = 0xC0 ) + ch ); }
Midimetric 0:71d791204057 192 MidiProgram( byte ch, byte v ) : MidiM1( PROG, ch, v ){ Raw.push_back( ( Command = 0xC0 ) + ch ); }
Midimetric 0:71d791204057 193 virtual ~MidiProgram(){}
Midimetric 0:71d791204057 194 // virtual void Send( Serial &s ){ s.putc( 0xC0 + Channel ); s.putc( ValA ); }
Midimetric 0:71d791204057 195 };
Midimetric 0:71d791204057 196 //_____________________________________________________________________________
Midimetric 0:71d791204057 197 class MidiMonoAft : public MidiM1
Midimetric 0:71d791204057 198 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 199 public:
Midimetric 0:71d791204057 200 MidiMonoAft( byte ch ) : MidiM1( MONA, ch ) { Raw.push_back( ( Command = 0xD0 ) + ch ); }
Midimetric 0:71d791204057 201 MidiMonoAft( byte ch, byte v ) : MidiM1( MONA, ch, v ){ Raw.push_back( ( Command = 0xD0 ) + ch ); }
Midimetric 0:71d791204057 202 virtual ~MidiMonoAft(){}
Midimetric 0:71d791204057 203 // virtual void Send( Serial &s ){ s.putc( 0xD0 + Channel ); s.putc( ValA ); }
Midimetric 0:71d791204057 204 };
Midimetric 0:71d791204057 205
Midimetric 0:71d791204057 206 ///////////////////////////////////////////////////////////////////////////////
Midimetric 0:71d791204057 207 // base class & derived classes for all Messages having 2 byte of data
Midimetric 0:71d791204057 208 //_____________________________________________________________________________
Midimetric 0:71d791204057 209 class MidiM2 : public MidiM
Midimetric 0:71d791204057 210 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 211 public:
Midimetric 0:71d791204057 212 MidiM2(byte type,byte ch) : MidiM(type,ch){ Next = VALA; }
Midimetric 0:71d791204057 213 MidiM2(byte type,byte ch,byte v) : MidiM(type,ch){Next=VALB;ValA=v;}
Midimetric 0:71d791204057 214 MidiM2(byte type,byte ch,byte v,byte w): MidiM(type,ch){Next=NONE;ValA=v;ValB=w;}
Midimetric 0:71d791204057 215 virtual ~MidiM2(){}
Midimetric 0:71d791204057 216 virtual byte ValCount() { return 2; }
Midimetric 0:71d791204057 217
Midimetric 0:71d791204057 218 virtual bool Append( byte b )
Midimetric 0:71d791204057 219 {
Midimetric 0:71d791204057 220 Raw.push_back(b);
Midimetric 0:71d791204057 221 if( b > 127 || Next == NONE ) return false;
Midimetric 0:71d791204057 222 if( Next == VALA ) { ValA = b; Next = VALB; }
Midimetric 0:71d791204057 223 else { ValB = b; Next = NONE; }
Midimetric 0:71d791204057 224 return true;
Midimetric 0:71d791204057 225 }
Midimetric 0:71d791204057 226 };
Midimetric 0:71d791204057 227 //_____________________________________________________________________________
Midimetric 0:71d791204057 228 class MidiPosition : public MidiM2
Midimetric 0:71d791204057 229 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 230 public:
Midimetric 0:71d791204057 231 MidiPosition() : MidiM2( SPOS, NAKN ) { Raw.push_back( Command = 0xF3 ); }
Midimetric 0:71d791204057 232 MidiPosition( byte v ) : MidiM2( SPOS, NAKN, v ) { Raw.push_back( Command = 0xF3 ); }
Midimetric 0:71d791204057 233 MidiPosition( byte v, byte w ) : MidiM2( SPOS, NAKN, v, w ) { Command = 0xF3; }
Midimetric 0:71d791204057 234 virtual ~MidiPosition(){}
Midimetric 0:71d791204057 235 // virtual void Send( Serial &s ){ s.putc(0xF3); s.putc(ValA); s.putc(ValB); }
Midimetric 0:71d791204057 236 };
Midimetric 0:71d791204057 237 //_____________________________________________________________________________
Midimetric 0:71d791204057 238 class MidiNoteOn : public MidiM2
Midimetric 0:71d791204057 239 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 240 public:
Midimetric 0:71d791204057 241 MidiNoteOn( byte ch ) : MidiM2( NOTE, ch ) { Raw.push_back( ( Command = 0x90 ) + ch ); }
Midimetric 0:71d791204057 242 MidiNoteOn( byte ch, byte v ): MidiM2( NOTE, ch, v ) { Raw.push_back( ( Command = 0x90 ) + ch ); }
Midimetric 0:71d791204057 243 MidiNoteOn( byte ch, byte v, byte w ) : MidiM2( NOTE, ch, v, w ) { Command = 0x90; }
Midimetric 0:71d791204057 244 virtual ~MidiNoteOn(){}
Midimetric 0:71d791204057 245 /* virtual void Send( Serial &s )
Midimetric 0:71d791204057 246 {
Midimetric 0:71d791204057 247 s.putc( 0x90 + Channel ); s.putc( ValA ); s.putc( ValB );
Midimetric 0:71d791204057 248 }*/
Midimetric 0:71d791204057 249 };
Midimetric 0:71d791204057 250 //_____________________________________________________________________________
Midimetric 0:71d791204057 251 class MidiNoteOff : public MidiM2
Midimetric 0:71d791204057 252 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 253 public:
Midimetric 0:71d791204057 254 MidiNoteOff( byte ch ) : MidiM2( NOTE, ch ) { Raw.push_back( ( Command = 0x80 ) + ch ); }
Midimetric 0:71d791204057 255 MidiNoteOff( byte ch, byte v ): MidiM2( NOTE, ch, v ) { Raw.push_back( ( Command = 0x80 ) + ch ); }
Midimetric 0:71d791204057 256 MidiNoteOff( byte ch, byte v, byte w ): MidiM2( NOTE, ch, v, w ) { Command = 0x80; }
Midimetric 0:71d791204057 257 virtual ~MidiNoteOff(){}
Midimetric 0:71d791204057 258 /* virtual void Send( Serial &s )
Midimetric 0:71d791204057 259 {
Midimetric 0:71d791204057 260 s.putc( 0x80 + Channel ); s.putc( ValA ); s.putc( ValB );
Midimetric 0:71d791204057 261 }*/
Midimetric 0:71d791204057 262 };
Midimetric 0:71d791204057 263 //_____________________________________________________________________________
Midimetric 0:71d791204057 264 class MidiPolyAft : public MidiM2
Midimetric 0:71d791204057 265 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 266 public:
Midimetric 0:71d791204057 267 MidiPolyAft( byte ch ) : MidiM2( POLA, ch ) { Raw.push_back( ( Command = 0xA0 ) + ch ); }
Midimetric 0:71d791204057 268 MidiPolyAft( byte ch, byte v ): MidiM2( POLA, ch, v ) { Raw.push_back( ( Command = 0xA0 ) + ch ); }
Midimetric 0:71d791204057 269 MidiPolyAft( byte ch, byte v, byte w ): MidiM2( POLA, ch, v, w ) { Command = 0xA0; }
Midimetric 0:71d791204057 270 virtual ~MidiPolyAft(){}
Midimetric 0:71d791204057 271 /* virtual void Send( Serial &s )
Midimetric 0:71d791204057 272 {
Midimetric 0:71d791204057 273 s.putc( 0xA0 + Channel ); s.putc( ValA ); s.putc( ValB );
Midimetric 0:71d791204057 274 }*/
Midimetric 0:71d791204057 275 };
Midimetric 0:71d791204057 276 //_____________________________________________________________________________
Midimetric 0:71d791204057 277 class MidiBend : public MidiM2
Midimetric 0:71d791204057 278 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 279 public:
Midimetric 0:71d791204057 280 MidiBend( byte ch ) : MidiM2( BEND, ch ) { Raw.push_back( ( Command = 0xE0 ) + ch ); }
Midimetric 0:71d791204057 281 MidiBend( byte ch, byte v ) : MidiM2( BEND, ch, v ) { Raw.push_back( ( Command = 0xE0 ) + ch ); }
Midimetric 0:71d791204057 282 MidiBend( byte ch, byte v, byte w ): MidiM2( BEND, ch, v, w ) { Command = 0xE0; }
Midimetric 0:71d791204057 283 virtual ~MidiBend(){}
Midimetric 0:71d791204057 284 /* virtual void Send( Serial &s )
Midimetric 0:71d791204057 285 {
Midimetric 0:71d791204057 286 s.putc( 0xE0 + Channel ); s.putc( ValA ); s.putc( ValB );
Midimetric 0:71d791204057 287 }*/
Midimetric 0:71d791204057 288 };
Midimetric 0:71d791204057 289 //_____________________________________________________________________________
Midimetric 0:71d791204057 290 class MidiControl : public MidiM2
Midimetric 0:71d791204057 291 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 292 public:
Midimetric 0:71d791204057 293 MidiControl( byte ch ) : MidiM2( CTRL, ch ) { Raw.push_back( ( Command = 0xB0 ) + ch ); }
Midimetric 0:71d791204057 294 MidiControl( byte ch, byte v ): MidiM2( CTRL, ch, v ) { Raw.push_back( ( Command = 0xB0 ) + ch ); }
Midimetric 0:71d791204057 295 MidiControl( byte ch, byte v, byte w ): MidiM2( CTRL, ch, v, w ) { Command = 0xB0; }
Midimetric 0:71d791204057 296 virtual ~MidiControl(){}
Midimetric 0:71d791204057 297 /* virtual void Send( Serial &s )
Midimetric 0:71d791204057 298 {
Midimetric 0:71d791204057 299 byte c = 0xB0 + Channel;
Midimetric 0:71d791204057 300 switch( Type ) {
Midimetric 0:71d791204057 301 case CTRL : s.putc( c ); s.putc(ValA ); s.putc( ValB ); break;
Midimetric 0:71d791204057 302 case BANK : if( ValA != NAKN ) s.putc( c ); s.putc( 0 ); s.putc( ValA );
Midimetric 0:71d791204057 303 if( ValB != NAKN ) s.putc( c ); s.putc( 32 ); s.putc( ValB ); break;
Midimetric 0:71d791204057 304 case DATA : if( ValA != NAKN ) s.putc( c ); s.putc( 6 ); s.putc( ValA );
Midimetric 0:71d791204057 305 if( ValB != NAKN ) s.putc( c ); s.putc( 38 ); s.putc( ValB ); break;
Midimetric 0:71d791204057 306 case INCR : s.putc( c ); s.putc( 96 ); break;
Midimetric 0:71d791204057 307 case DECR : s.putc( c ); s.putc( 97 ); break;
Midimetric 0:71d791204057 308 case NRPN : if( ValA != NAKN ) s.putc( c ); s.putc( 99 ); s.putc( ValA );
Midimetric 0:71d791204057 309 if( ValB != NAKN ) s.putc( c ); s.putc( 98 ); s.putc( ValB ); break;
Midimetric 0:71d791204057 310 case RPN_ : if( ValA != NAKN ) s.putc( c ); s.putc( 101 ); s.putc( ValA );
Midimetric 0:71d791204057 311 if( ValB != NAKN ) s.putc( c ); s.putc( 100 ); s.putc( ValB ); break;
Midimetric 0:71d791204057 312 }
Midimetric 0:71d791204057 313 }*/
Midimetric 0:71d791204057 314 virtual bool Append( byte b )
Midimetric 0:71d791204057 315 {
Midimetric 0:71d791204057 316 Raw.push_back(b);
Midimetric 0:71d791204057 317 switch( Next ) {
Midimetric 0:71d791204057 318 case VALA:
Midimetric 0:71d791204057 319 if( HasBank || HasData )
Midimetric 0:71d791204057 320 switch( b ) {
Midimetric 0:71d791204057 321 case 0: if( HasBank ) { Next=MSB; Type=BANK; }
Midimetric 0:71d791204057 322 else { Next=VALB; ValA=b; } return true;
Midimetric 0:71d791204057 323
Midimetric 0:71d791204057 324 case 32: if( HasBank ) { Next=LSB; Type=BANK; }
Midimetric 0:71d791204057 325 else { Next=VALB; ValA=b; } return true;
Midimetric 0:71d791204057 326
Midimetric 0:71d791204057 327 case 6: if( HasData ) { Next=MSB; Type=DATA; }
Midimetric 0:71d791204057 328 else { Next=VALB; ValA=b; } return true;
Midimetric 0:71d791204057 329
Midimetric 0:71d791204057 330 case 38: if( HasData ) { Next=LSB; Type=DATA; }
Midimetric 0:71d791204057 331 else { Next=VALB; ValA=b; } return true;
Midimetric 0:71d791204057 332
Midimetric 0:71d791204057 333 case 96: if( HasData ) { Next=NONE; Type=INCR; }
Midimetric 0:71d791204057 334 else { Next=VALB; ValA=b; } return true;
Midimetric 0:71d791204057 335
Midimetric 0:71d791204057 336 case 97: if( HasData ) { Next=NONE; Type=DECR; }
Midimetric 0:71d791204057 337 else { Next=VALB; ValA=b; } return true;
Midimetric 0:71d791204057 338
Midimetric 0:71d791204057 339 case 98: if( HasData ) { Next=LSB; Type=NRPN; }
Midimetric 0:71d791204057 340 else { Next=VALB; ValA=b; } return true;
Midimetric 0:71d791204057 341
Midimetric 0:71d791204057 342 case 99: if( HasData ) { Next=MSB; Type=NRPN; }
Midimetric 0:71d791204057 343 else { Next=VALB; ValA=b; } return true;
Midimetric 0:71d791204057 344
Midimetric 0:71d791204057 345 case 100: if( HasData ) { Next=LSB; Type=NRPN; }
Midimetric 0:71d791204057 346 else { Next=VALB; ValA=b; } return true;
Midimetric 0:71d791204057 347
Midimetric 0:71d791204057 348 case 101: if( HasData ) { Next=MSB; Type=NRPN; }
Midimetric 0:71d791204057 349 else { Next=VALB; ValA=b; } return true;
Midimetric 0:71d791204057 350
Midimetric 0:71d791204057 351 default: Next = VALB; ValA = b; return true;
Midimetric 0:71d791204057 352 }
Midimetric 0:71d791204057 353 else{
Midimetric 0:71d791204057 354 Next = VALB;
Midimetric 0:71d791204057 355 ValA = b;
Midimetric 0:71d791204057 356 return true;
Midimetric 0:71d791204057 357 }
Midimetric 0:71d791204057 358 case VALB: Next = NONE; ValB = b; return true;
Midimetric 0:71d791204057 359 case MSB: Next = PAIR; ValA = b; return true; // wait for 0xB*
Midimetric 0:71d791204057 360 case LSB: Next = PAIR; ValB = b; return true; // wait for 0xB*
Midimetric 0:71d791204057 361 case MSB2: Next = NONE; ValA = b; return true;
Midimetric 0:71d791204057 362 case LSB2: Next = NONE; ValB = b; return true;
Midimetric 0:71d791204057 363 case PAIR: Next = ITEM; return true; // 0xB*
Midimetric 0:71d791204057 364 case ITEM:
Midimetric 0:71d791204057 365 switch( Type ) {
Midimetric 0:71d791204057 366 case BANK: if( b!= 0 && b!= 32 ){ Next = NONE; return false; }
Midimetric 0:71d791204057 367 Next = b == 0 ? MSB2 : LSB2; return true;
Midimetric 0:71d791204057 368 case DATA: if( b!= 6 && b!= 38 ){ Next = NONE; return false; }
Midimetric 0:71d791204057 369 Next = b == 6 ? MSB2 : LSB2; return true;
Midimetric 0:71d791204057 370 case NRPN: if( b!= 98 && b!= 99 ){ Next = NONE; return false; }
Midimetric 0:71d791204057 371 Next = b == 99 ? MSB2 : LSB2; return true;
Midimetric 0:71d791204057 372 case RPN_: if( b!=100 && b!=101 ){ Next = NONE; return false; }
Midimetric 0:71d791204057 373 Next = b ==101 ? MSB2 : LSB2; return true;
Midimetric 0:71d791204057 374 }
Midimetric 0:71d791204057 375 }
Midimetric 0:71d791204057 376 return false;
Midimetric 0:71d791204057 377 }
Midimetric 0:71d791204057 378
Midimetric 0:71d791204057 379 };
Midimetric 0:71d791204057 380
Midimetric 0:71d791204057 381 //_____________________________________________________________________________
Midimetric 0:71d791204057 382 class MidiX : public MidiM2 // class for SysEx message
Midimetric 0:71d791204057 383 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 384 public:
Midimetric 0:71d791204057 385 MidiX() : MidiM2( SYSX, NAKN ){ Raw.push_back( Command = 0xF0 ); }
Midimetric 0:71d791204057 386 virtual ~MidiX(){}
Midimetric 0:71d791204057 387 virtual bool Append( byte b )
Midimetric 0:71d791204057 388 {
Midimetric 0:71d791204057 389 Raw.push_back(b);
Midimetric 0:71d791204057 390 if( b==0xF7 )
Midimetric 0:71d791204057 391 Next = NONE;
Midimetric 0:71d791204057 392 return true;
Midimetric 0:71d791204057 393 }
Midimetric 0:71d791204057 394 };
Midimetric 0:71d791204057 395
Midimetric 0:71d791204057 396 //_____________________________________________________________________________
Midimetric 0:71d791204057 397 MidiM* MidiCreateMessage( byte command )
Midimetric 0:71d791204057 398 {//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Midimetric 0:71d791204057 399 if( command >= 0xF0 )
Midimetric 0:71d791204057 400 switch( command ) {
Midimetric 0:71d791204057 401 case 0xF0: return new MidiX();
Midimetric 0:71d791204057 402 case 0xF1: return new MidiTimeCode();
Midimetric 0:71d791204057 403 case 0xF2: return new MidiPosition();
Midimetric 0:71d791204057 404 case 0xF3: return new MidiSelect();
Midimetric 0:71d791204057 405 case 0xF6: return new MidiTune();
Midimetric 0:71d791204057 406 case 0xF8: return new MidiClock();
Midimetric 0:71d791204057 407 case 0xFA: return new MidiStart();
Midimetric 0:71d791204057 408 case 0xFB: return new MidiContinue();
Midimetric 0:71d791204057 409 case 0xFC: return new MidiStop();
Midimetric 0:71d791204057 410 case 0xFE: return new MidiSensing();
Midimetric 0:71d791204057 411 case 0xFF: return new MidiReset();
Midimetric 0:71d791204057 412 }
Midimetric 0:71d791204057 413 else switch( command >> 4 ) {
Midimetric 0:71d791204057 414 case 0x8: return new MidiNoteOff( command & 15 );
Midimetric 0:71d791204057 415 case 0x9: return new MidiNoteOn ( command & 15 );
Midimetric 0:71d791204057 416 case 0xA: return new MidiPolyAft( command & 15 );
Midimetric 0:71d791204057 417 case 0xB: return new MidiControl( command & 15 );
Midimetric 0:71d791204057 418 case 0xC: return new MidiProgram( command & 15 );
Midimetric 0:71d791204057 419 case 0xD: return new MidiMonoAft( command & 15 );
Midimetric 0:71d791204057 420 case 0xE: return new MidiBend ( command & 15 );
Midimetric 0:71d791204057 421
Midimetric 0:71d791204057 422 }
Midimetric 0:71d791204057 423 return new MidiM( NONE );
Midimetric 0:71d791204057 424 }
Midimetric 0:71d791204057 425
Midimetric 0:71d791204057 426 #undef VALA
Midimetric 0:71d791204057 427 #undef VALB
Midimetric 0:71d791204057 428 #undef MSB
Midimetric 0:71d791204057 429 #undef LSB
Midimetric 0:71d791204057 430 #undef PAIR
Midimetric 0:71d791204057 431 #undef ITEM
Midimetric 0:71d791204057 432 #undef MSB2
Midimetric 0:71d791204057 433 #undef LSB2
Midimetric 0:71d791204057 434
Midimetric 0:71d791204057 435 #endif