Bernard Escaillas
/
MidiTee
midi.h@0:71d791204057, 2011-06-07 (annotated)
- Committer:
- Midimetric
- Date:
- Tue Jun 07 13:32:20 2011 +0000
- Revision:
- 0:71d791204057
Version 1.0
Who changed what in which revision?
User | Revision | Line number | New 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 |