winamp/Src/external_dependencies/openmpt-trunk/soundlib/MIDIEvents.cpp
2024-09-24 14:54:57 +02:00

264 lines
5.5 KiB
C++

/*
* MIDIEvents.cpp
* --------------
* Purpose: MIDI event handling, event lists, ...
* Notes : (currently none)
* Authors: OpenMPT Devs
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
*/
#include "stdafx.h"
#include "MIDIEvents.h"
OPENMPT_NAMESPACE_BEGIN
namespace MIDIEvents
{
// Build a generic MIDI event
uint32 Event(EventType eventType, uint8 midiChannel, uint8 dataByte1, uint8 dataByte2)
{
return (eventType << 4) | (midiChannel & 0x0F) | (dataByte1 << 8) | (dataByte2 << 16);
}
// Build a MIDI CC event
uint32 CC(MidiCC midiCC, uint8 midiChannel, uint8 param)
{
return Event(evControllerChange, midiChannel, static_cast<uint8>(midiCC), param);
}
// Build a MIDI Pitchbend event
uint32 PitchBend(uint8 midiChannel, uint16 bendAmount)
{
return Event(evPitchBend, midiChannel, static_cast<uint8>(bendAmount & 0x7F), static_cast<uint8>(bendAmount >> 7));
}
// Build a MIDI Program Change event
uint32 ProgramChange(uint8 midiChannel, uint8 program)
{
return Event(evProgramChange, midiChannel, program, 0);
}
// Build a MIDI Note Off event
uint32 NoteOff(uint8 midiChannel, uint8 note, uint8 velocity)
{
return Event(evNoteOff, midiChannel, note, velocity);
}
// Build a MIDI Note On event
uint32 NoteOn(uint8 midiChannel, uint8 note, uint8 velocity)
{
return Event(evNoteOn, midiChannel, note, velocity);
}
// Build a MIDI System Event
uint8 System(SystemEvent eventType)
{
return static_cast<uint8>((evSystem << 4) | eventType);
}
// Get MIDI channel from a MIDI event
uint8 GetChannelFromEvent(uint32 midiMsg)
{
return static_cast<uint8>((midiMsg & 0xF));
}
// Get MIDI Event type from a MIDI event
EventType GetTypeFromEvent(uint32 midiMsg)
{
return static_cast<EventType>(((midiMsg >> 4) & 0xF));
}
// Get first data byte from a MIDI event
uint8 GetDataByte1FromEvent(uint32 midiMsg)
{
return static_cast<uint8>(((midiMsg >> 8) & 0xFF));
}
// Get second data byte from a MIDI event
uint8 GetDataByte2FromEvent(uint32 midiMsg)
{
return static_cast<uint8>(((midiMsg >> 16) & 0xFF));
}
// Get the length of a MIDI event in bytes
uint8 GetEventLength(uint8 firstByte)
{
uint8 msgSize = 3;
switch(firstByte & 0xF0)
{
case 0xC0:
case 0xD0:
msgSize = 2;
break;
case 0xF0:
switch(firstByte)
{
case 0xF1:
case 0xF3:
msgSize = 2;
break;
case 0xF2:
msgSize = 3;
break;
default:
msgSize = 1;
break;
}
break;
}
return msgSize;
}
// MIDI CC Names
const char* const MidiCCNames[MIDICC_end + 1] =
{
"BankSelect [Coarse]", //0
"ModulationWheel [Coarse]", //1
"Breathcontroller [Coarse]", //2
"", //3
"FootPedal [Coarse]", //4
"PortamentoTime [Coarse]", //5
"DataEntry [Coarse]", //6
"Volume [Coarse]", //7
"Balance [Coarse]", //8
"", //9
"Panposition [Coarse]", //10
"Expression [Coarse]", //11
"EffectControl1 [Coarse]", //12
"EffectControl2 [Coarse]", //13
"", //14
"", //15
"GeneralPurposeSlider1", //16
"GeneralPurposeSlider2", //17
"GeneralPurposeSlider3", //18
"GeneralPurposeSlider4", //19
"", //20
"", //21
"", //22
"", //23
"", //24
"", //25
"", //26
"", //27
"", //28
"", //29
"", //30
"", //31
"BankSelect [Fine]", //32
"ModulationWheel [Fine]", //33
"Breathcontroller [Fine]", //34
"", //35
"FootPedal [Fine]", //36
"PortamentoTime [Fine]", //37
"DataEntry [Fine]", //38
"Volume [Fine]", //39
"Balance [Fine]", //40
"", //41
"Panposition [Fine]", //42
"Expression [Fine]", //43
"EffectControl1 [Fine]", //44
"EffectControl2 [Fine]", //45
"", //46
"", //47
"", //48
"", //49
"", //50
"", //51
"", //52
"", //53
"", //54
"", //55
"", //56
"", //57
"", //58
"", //59
"", //60
"", //61
"", //62
"", //63
"HoldPedal [OnOff]", //64
"Portamento [OnOff]", //65
"SustenutoPedal [OnOff]", //66
"SoftPedal [OnOff]", //67
"LegatoPedal [OnOff]", //68
"Hold2Pedal [OnOff]", //69
"SoundVariation", //70
"SoundTimbre", //71
"SoundReleaseTime", //72
"SoundAttackTime", //73
"SoundBrightness", //74
"SoundControl6", //75
"SoundControl7", //76
"SoundControl8", //77
"SoundControl9", //78
"SoundControl10", //79
"GeneralPurposeButton1 [OnOff]",//80
"GeneralPurposeButton2 [OnOff]",//81
"GeneralPurposeButton3 [OnOff]",//82
"GeneralPurposeButton4 [OnOff]",//83
"", //84
"", //85
"", //86
"", //87
"", //88
"", //89
"", //90
"EffectsLevel", //91
"TremoloLevel", //92
"ChorusLevel", //93
"CelesteLevel", //94
"PhaserLevel", //95
"DataButtonIncrement", //96
"DataButtonDecrement", //97
"NonRegisteredParameter [Fine]",//98
"NonRegisteredParameter [Coarse]",//99
"RegisteredParameter [Fine]", //100
"RegisteredParameter [Coarse]", //101
"", //102
"", //103
"", //104
"", //105
"", //106
"", //107
"", //108
"", //109
"", //110
"", //111
"", //112
"", //113
"", //114
"", //115
"", //116
"", //117
"", //118
"", //119
"AllSoundOff", //120
"AllControllersOff", //121
"LocalKeyboard [OnOff]", //122
"AllNotesOff", //123
"OmniModeOff", //124
"OmniModeOn", //125
"MonoOperation", //126
"PolyOperation", //127
};
} // End namespace
OPENMPT_NAMESPACE_END