Wwise SDK 2015.1.9
_ak_midi_types_8h_source
Version
menu_open
link
include/AK/SoundEngine/Common/AkMidiTypes.h
Go to the documentation of this file.00001 00002 // 00003 // Copyright (c) 2006 Audiokinetic Inc. / All Rights Reserved 00004 // 00006 00007 // AkMidiTypes.h 00008 00011 00012 #ifndef _AK_MIDI_TYPES_H_ 00013 #define _AK_MIDI_TYPES_H_ 00014 00015 // Include standard types 00016 #include <AK/SoundEngine/Common/AkTypes.h> 00017 00018 //----------------------------------------------------------------------------- 00019 // Types. 00020 //----------------------------------------------------------------------------- 00021 00022 typedef AkUInt8 AkMidiChannelNo; 00023 typedef AkUInt8 AkMidiNoteNo; 00024 00025 00026 //----------------------------------------------------------------------------- 00027 // Constants. 00028 //----------------------------------------------------------------------------- 00029 00030 // Invalid values 00031 static const AkMidiChannelNo AK_INVALID_MIDI_CHANNEL = (AkMidiChannelNo)-1; 00032 static const AkMidiNoteNo AK_INVALID_MIDI_NOTE = (AkUInt8)-1; 00033 00034 // List of event types 00035 #define AK_MIDI_EVENT_TYPE_INVALID 0x00 00036 #define AK_MIDI_EVENT_TYPE_NOTE_OFF 0x80 00037 #define AK_MIDI_EVENT_TYPE_NOTE_ON 0x90 00038 #define AK_MIDI_EVENT_TYPE_NOTE_AFTERTOUCH 0xa0 00039 #define AK_MIDI_EVENT_TYPE_CONTROLLER 0xb0 00040 #define AK_MIDI_EVENT_TYPE_PROGRAM_CHANGE 0xc0 00041 #define AK_MIDI_EVENT_TYPE_CHANNEL_AFTERTOUCH 0xd0 00042 #define AK_MIDI_EVENT_TYPE_PITCH_BEND 0xe0 00043 #define AK_MIDI_EVENT_TYPE_SYSEX 0xf0 00044 #define AK_MIDI_EVENT_TYPE_ESCAPE 0xf7 00045 #define AK_MIDI_EVENT_TYPE_META 0xff 00046 00047 // Macros to convert 32-bit MIDI event to 8-bit components 00048 #define AK_MIDI_EVENT_GET_TYPE( in_dwEvent ) (AkUInt8)((in_dwEvent >> 0) & 0xf0) 00049 #define AK_MIDI_EVENT_GET_CHANNEL( in_dwEvent ) (AkUInt8)((in_dwEvent >> 0) & 0x0f) 00050 #define AK_MIDI_EVENT_GET_PARAM1( in_dwEvent ) (AkUInt8)(in_dwEvent >> 8) 00051 #define AK_MIDI_EVENT_GET_PARAM2( in_dwEvent ) (AkUInt8)(in_dwEvent >> 16) 00052 00053 // List of Continuous Controller (cc) values 00054 #define AK_MIDI_CC_BANK_SELECT_COARSE 0 00055 #define AK_MIDI_CC_MOD_WHEEL_COARSE 1 00056 #define AK_MIDI_CC_BREATH_CTRL_COARSE 2 00057 #define AK_MIDI_CC_CTRL_3_COARSE 3 00058 #define AK_MIDI_CC_FOOT_PEDAL_COARSE 4 00059 #define AK_MIDI_CC_PORTAMENTO_COARSE 5 00060 #define AK_MIDI_CC_DATA_ENTRY_COARSE 6 00061 #define AK_MIDI_CC_VOLUME_COARSE 7 00062 #define AK_MIDI_CC_BALANCE_COARSE 8 00063 #define AK_MIDI_CC_CTRL_9_COARSE 9 00064 #define AK_MIDI_CC_PAN_POSITION_COARSE 10 00065 #define AK_MIDI_CC_EXPRESSION_COARSE 11 00066 #define AK_MIDI_CC_EFFECT_CTRL_1_COARSE 12 00067 #define AK_MIDI_CC_EFFECT_CTRL_2_COARSE 13 00068 #define AK_MIDI_CC_CTRL_14_COARSE 14 00069 #define AK_MIDI_CC_CTRL_15_COARSE 15 00070 #define AK_MIDI_CC_GEN_SLIDER_1 16 00071 #define AK_MIDI_CC_GEN_SLIDER_2 17 00072 #define AK_MIDI_CC_GEN_SLIDER_3 18 00073 #define AK_MIDI_CC_GEN_SLIDER_4 19 00074 #define AK_MIDI_CC_CTRL_20_COARSE 20 00075 #define AK_MIDI_CC_CTRL_21_COARSE 21 00076 #define AK_MIDI_CC_CTRL_22_COARSE 22 00077 #define AK_MIDI_CC_CTRL_23_COARSE 23 00078 #define AK_MIDI_CC_CTRL_24_COARSE 24 00079 #define AK_MIDI_CC_CTRL_25_COARSE 25 00080 #define AK_MIDI_CC_CTRL_26_COARSE 26 00081 #define AK_MIDI_CC_CTRL_27_COARSE 27 00082 #define AK_MIDI_CC_CTRL_28_COARSE 28 00083 #define AK_MIDI_CC_CTRL_29_COARSE 29 00084 #define AK_MIDI_CC_CTRL_30_COARSE 30 00085 #define AK_MIDI_CC_CTRL_31_COARSE 31 00086 #define AK_MIDI_CC_BANK_SELECT_FINE 32 00087 #define AK_MIDI_CC_MOD_WHEEL_FINE 33 00088 #define AK_MIDI_CC_BREATH_CTRL_FINE 34 00089 #define AK_MIDI_CC_CTRL_3_FINE 35 00090 #define AK_MIDI_CC_FOOT_PEDAL_FINE 36 00091 #define AK_MIDI_CC_PORTAMENTO_FINE 37 00092 #define AK_MIDI_CC_DATA_ENTRY_FINE 38 00093 #define AK_MIDI_CC_VOLUME_FINE 39 00094 #define AK_MIDI_CC_BALANCE_FINE 40 00095 #define AK_MIDI_CC_CTRL_9_FINE 41 00096 #define AK_MIDI_CC_PAN_POSITION_FINE 42 00097 #define AK_MIDI_CC_EXPRESSION_FINE 43 00098 #define AK_MIDI_CC_EFFECT_CTRL_1_FINE 44 00099 #define AK_MIDI_CC_EFFECT_CTRL_2_FINE 45 00100 #define AK_MIDI_CC_CTRL_14_FINE 46 00101 #define AK_MIDI_CC_CTRL_15_FINE 47 00102 00103 #define AK_MIDI_CC_CTRL_20_FINE 52 00104 #define AK_MIDI_CC_CTRL_21_FINE 53 00105 #define AK_MIDI_CC_CTRL_22_FINE 54 00106 #define AK_MIDI_CC_CTRL_23_FINE 55 00107 #define AK_MIDI_CC_CTRL_24_FINE 56 00108 #define AK_MIDI_CC_CTRL_25_FINE 57 00109 #define AK_MIDI_CC_CTRL_26_FINE 58 00110 #define AK_MIDI_CC_CTRL_27_FINE 59 00111 #define AK_MIDI_CC_CTRL_28_FINE 60 00112 #define AK_MIDI_CC_CTRL_29_FINE 61 00113 #define AK_MIDI_CC_CTRL_30_FINE 62 00114 #define AK_MIDI_CC_CTRL_31_FINE 63 00115 00116 #define AK_MIDI_CC_HOLD_PEDAL 64 00117 #define AK_MIDI_CC_PORTAMENTO_ON_OFF 65 00118 #define AK_MIDI_CC_SUSTENUTO_PEDAL 66 00119 #define AK_MIDI_CC_SOFT_PEDAL 67 00120 #define AK_MIDI_CC_LEGATO_PEDAL 68 00121 #define AK_MIDI_CC_HOLD_PEDAL_2 69 00122 00123 #define AK_MIDI_CC_SOUND_VARIATION 70 00124 #define AK_MIDI_CC_SOUND_TIMBRE 71 00125 #define AK_MIDI_CC_SOUND_RELEASE_TIME 72 00126 #define AK_MIDI_CC_SOUND_ATTACK_TIME 73 00127 #define AK_MIDI_CC_SOUND_BRIGHTNESS 74 00128 #define AK_MIDI_CC_SOUND_CTRL_6 75 00129 #define AK_MIDI_CC_SOUND_CTRL_7 76 00130 #define AK_MIDI_CC_SOUND_CTRL_8 77 00131 #define AK_MIDI_CC_SOUND_CTRL_9 78 00132 #define AK_MIDI_CC_SOUND_CTRL_10 79 00133 00134 #define AK_MIDI_CC_GENERAL_BUTTON_1 80 00135 #define AK_MIDI_CC_GENERAL_BUTTON_2 81 00136 #define AK_MIDI_CC_GENERAL_BUTTON_3 82 00137 #define AK_MIDI_CC_GENERAL_BUTTON_4 83 00138 00139 #define AK_MIDI_CC_REVERB_LEVEL 91 00140 #define AK_MIDI_CC_TREMOLO_LEVEL 92 00141 #define AK_MIDI_CC_CHORUS_LEVEL 93 00142 #define AK_MIDI_CC_CELESTE_LEVEL 94 00143 #define AK_MIDI_CC_PHASER_LEVEL 95 00144 #define AK_MIDI_CC_DATA_BUTTON_P1 96 00145 #define AK_MIDI_CC_DATA_BUTTON_M1 97 00146 00147 #define AK_MIDI_CC_NON_REGISTER_COARSE 98 00148 #define AK_MIDI_CC_NON_REGISTER_FINE 99 00149 00150 #define AK_MIDI_CC_ALL_SOUND_OFF 120 00151 #define AK_MIDI_CC_ALL_CONTROLLERS_OFF 121 00152 #define AK_MIDI_CC_LOCAL_KEYBOARD 122 00153 #define AK_MIDI_CC_ALL_NOTES_OFF 123 00154 #define AK_MIDI_CC_OMNI_MODE_OFF 124 00155 #define AK_MIDI_CC_OMNI_MODE_ON 125 00156 #define AK_MIDI_CC_OMNI_MONOPHONIC_ON 126 00157 #define AK_MIDI_CC_OMNI_POLYPHONIC_ON 127 00158 00159 00160 00161 struct AkMidiNoteChannelPair 00162 { 00163 AkMidiNoteChannelPair(): note(AK_INVALID_MIDI_NOTE), channel(AK_INVALID_MIDI_CHANNEL) {} 00164 00165 bool operator == ( const AkMidiNoteChannelPair& in_rhs ) const { return note == in_rhs.note && channel == in_rhs.channel; } 00166 bool operator < ( const AkMidiNoteChannelPair& in_rhs ) const { return channel < in_rhs.channel || (channel == in_rhs.channel && note < in_rhs.note ); } 00167 bool operator > ( const AkMidiNoteChannelPair& in_rhs ) const { return channel > in_rhs.channel || (channel == in_rhs.channel && note > in_rhs.note ); } 00168 00169 bool IsChannelValid() const { return channel != AK_INVALID_MIDI_CHANNEL; } 00170 bool IsNoteValid() const { return note != AK_INVALID_MIDI_NOTE; } 00171 00172 AkMidiNoteNo note; 00173 AkMidiChannelNo channel; 00174 }; 00175 00176 struct AkMidiEvent 00177 { 00178 inline AkMidiEvent() 00179 : byType( AK_MIDI_EVENT_TYPE_INVALID ) 00180 , byChan( AK_INVALID_MIDI_CHANNEL ) 00181 {} 00182 00183 inline bool IsValid() const { return byType != AK_MIDI_EVENT_TYPE_INVALID; } 00184 inline void MakeInvalid() { *this = AkMidiEvent(); } 00185 00186 inline bool IsTypeOk() const { return ( (byType & 0x80) == 0x80 ) && ( (byType & 0xf0) != 0xf0 ); } 00187 00188 inline bool IsSameChannel ( const AkMidiEvent& in_other ) const 00189 { 00190 return byChan == in_other.byChan; 00191 } 00192 00193 inline bool IsNoteEvent () const 00194 { 00195 return byType == AK_MIDI_EVENT_TYPE_NOTE_ON || 00196 byType == AK_MIDI_EVENT_TYPE_NOTE_OFF || 00197 byType == AK_MIDI_EVENT_TYPE_NOTE_AFTERTOUCH; 00198 } 00199 00200 inline bool IsCcEvent() const 00201 { 00202 return byType == AK_MIDI_EVENT_TYPE_CONTROLLER; 00203 } 00204 00205 inline bool IsSameCc( const AkMidiEvent& in_other ) const 00206 { 00207 return IsCcEvent() && in_other.IsCcEvent() && 00208 Cc.byCc == in_other.Cc.byCc; 00209 } 00210 00211 inline bool IsSameNote ( const AkMidiEvent& in_other ) const 00212 { 00213 return IsNoteEvent() && in_other.IsNoteEvent() && 00214 NoteOnOff.byNote == in_other.NoteOnOff.byNote; 00215 } 00216 00217 inline bool IsSameChannelAndNote ( const AkMidiEvent& in_other ) const 00218 { 00219 return IsSameChannel( in_other ) && IsSameNote( in_other ); 00220 } 00221 00222 inline bool IsNoteOn() const 00223 { 00224 return ( byType == AK_MIDI_EVENT_TYPE_NOTE_ON && NoteOnOff.byVelocity > 0 ); 00225 } 00226 00227 inline bool IsNoteOff() const 00228 { 00229 return byType == AK_MIDI_EVENT_TYPE_NOTE_OFF || 00230 (byType == AK_MIDI_EVENT_TYPE_NOTE_ON && NoteOnOff.byVelocity == 0 ); 00231 } 00232 00233 inline bool IsNoteOnOff() const 00234 { 00235 return IsNoteOn() || IsNoteOff(); 00236 } 00237 00238 bool IsPitchBend() const 00239 { 00240 return byType == AK_MIDI_EVENT_TYPE_PITCH_BEND; 00241 } 00242 00243 inline AkMidiNoteChannelPair GetNoteAndChannel() const 00244 { 00245 AkMidiNoteChannelPair noteAndCh; 00246 noteAndCh.channel = byChan; 00247 noteAndCh.note = IsNoteEvent() ? NoteOnOff.byNote : AK_INVALID_MIDI_NOTE; 00248 return noteAndCh; 00249 } 00250 00251 inline void MakeSustainPedalOff( AkUInt32 in_uChan ) 00252 { 00253 byType = AK_MIDI_EVENT_TYPE_CONTROLLER; 00254 byChan = (AkUInt8)in_uChan; 00255 Cc.byCc = AK_MIDI_CC_HOLD_PEDAL; 00256 Cc.byValue = 0; 00257 } 00258 00259 inline void MakeNoteOn() 00260 { 00261 byType = AK_MIDI_EVENT_TYPE_NOTE_ON; 00262 NoteOnOff.byVelocity = 0; 00263 } 00264 00265 inline void MakeNoteOff() 00266 { 00267 byType = AK_MIDI_EVENT_TYPE_NOTE_OFF; 00268 NoteOnOff.byVelocity = 0; 00269 } 00270 00271 inline void SetNoteNumber( const AkMidiNoteNo in_note ) 00272 { 00273 AKASSERT( IsNoteOnOff() ); 00274 NoteOnOff.byNote = in_note; 00275 } 00276 00277 inline AkMidiNoteNo GetNoteNumber() const 00278 { 00279 AKASSERT( IsNoteOnOff() ); 00280 return (AkMidiNoteNo)NoteOnOff.byNote; 00281 } 00282 00283 AkUInt8 byType; // (Ak_MIDI_EVENT_TYPE_) 00284 AkMidiChannelNo byChan; 00285 00286 struct tGen 00287 { 00288 AkUInt8 byParam1; 00289 AkUInt8 byParam2; 00290 }; 00291 struct tNoteOnOff 00292 { 00293 AkMidiNoteNo byNote; 00294 AkUInt8 byVelocity; 00295 }; 00296 struct tCc 00297 { 00298 AkUInt8 byCc; 00299 AkUInt8 byValue; 00300 }; 00301 struct tPitchBend 00302 { 00303 AkUInt8 byValueLsb; 00304 AkUInt8 byValueMsb; 00305 }; 00306 struct tNoteAftertouch 00307 { 00308 AkUInt8 byNote; 00309 AkUInt8 byValue; 00310 }; 00311 struct tChanAftertouch 00312 { 00313 AkUInt8 byValue; 00314 }; 00315 struct tProgramChange 00316 { 00317 AkUInt8 byProgramNum; 00318 }; 00319 00320 union 00321 { 00322 tGen Gen; 00323 tCc Cc; 00324 tNoteOnOff NoteOnOff; 00325 tPitchBend PitchBend; 00326 tNoteAftertouch NoteAftertouch; 00327 tChanAftertouch ChanAftertouch; 00328 tProgramChange ProgramChange; 00329 }; 00330 }; 00331 00332 #endif //_AK_MIDI_TYPES_H_
Was this page helpful?
Need Support?
Questions? Problems? Need more info? Contact us, and we can help!
Visit our Support pageTell us about your project. We're here to help.
Register your project and we'll help you get started with no strings attached!
Get started with Wwise