178 lines
4.9 KiB
C++
178 lines
4.9 KiB
C++
/*
|
|
* MIDIMacros.h
|
|
* ------------
|
|
* Purpose: Helper functions / classes for MIDI Macro functionality.
|
|
* Notes : (currently none)
|
|
* Authors: OpenMPT Devs
|
|
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
|
|
*/
|
|
|
|
|
|
#pragma once
|
|
|
|
#include "BuildSettings.h"
|
|
|
|
OPENMPT_NAMESPACE_BEGIN
|
|
|
|
enum
|
|
{
|
|
NUM_MACROS = 16, // number of parametered macros
|
|
MACRO_LENGTH = 32, // max number of chars per macro
|
|
};
|
|
|
|
OPENMPT_NAMESPACE_END
|
|
|
|
#ifdef MODPLUG_TRACKER
|
|
#include "plugins/PluginStructs.h"
|
|
#endif // MODPLUG_TRACKER
|
|
|
|
OPENMPT_NAMESPACE_BEGIN
|
|
|
|
// Parametered macro presets
|
|
enum ParameteredMacro
|
|
{
|
|
kSFxUnused = 0,
|
|
kSFxCutoff, // Z00 - Z7F controls resonant filter cutoff
|
|
kSFxReso, // Z00 - Z7F controls resonant filter resonance
|
|
kSFxFltMode, // Z00 - Z7F controls resonant filter mode (lowpass / highpass)
|
|
kSFxDryWet, // Z00 - Z7F controls plugin Dry / Wet ratio
|
|
kSFxPlugParam, // Z00 - Z7F controls a plugin parameter
|
|
kSFxCC, // Z00 - Z7F controls MIDI CC
|
|
kSFxChannelAT, // Z00 - Z7F controls Channel Aftertouch
|
|
kSFxPolyAT, // Z00 - Z7F controls Poly Aftertouch
|
|
kSFxPitch, // Z00 - Z7F controls Pitch Bend
|
|
kSFxProgChange, // Z00 - Z7F controls MIDI Program Change
|
|
kSFxCustom,
|
|
|
|
kSFxMax
|
|
};
|
|
|
|
|
|
// Fixed macro presets
|
|
enum FixedMacro
|
|
{
|
|
kZxxUnused = 0,
|
|
kZxxReso4Bit, // Z80 - Z8F controls resonant filter resonance
|
|
kZxxReso7Bit, // Z80 - ZFF controls resonant filter resonance
|
|
kZxxCutoff, // Z80 - ZFF controls resonant filter cutoff
|
|
kZxxFltMode, // Z80 - ZFF controls resonant filter mode (lowpass / highpass)
|
|
kZxxResoFltMode, // Z80 - Z9F controls resonance + filter mode
|
|
kZxxChannelAT, // Z80 - ZFF controls Channel Aftertouch
|
|
kZxxPolyAT, // Z80 - ZFF controls Poly Aftertouch
|
|
kZxxPitch, // Z80 - ZFF controls Pitch Bend
|
|
kZxxProgChange, // Z80 - ZFF controls MIDI Program Change
|
|
kZxxCustom,
|
|
|
|
kZxxMax
|
|
};
|
|
|
|
|
|
// Global macro types
|
|
enum
|
|
{
|
|
MIDIOUT_START = 0,
|
|
MIDIOUT_STOP,
|
|
MIDIOUT_TICK,
|
|
MIDIOUT_NOTEON,
|
|
MIDIOUT_NOTEOFF,
|
|
MIDIOUT_VOLUME,
|
|
MIDIOUT_PAN,
|
|
MIDIOUT_BANKSEL,
|
|
MIDIOUT_PROGRAM,
|
|
};
|
|
|
|
|
|
struct MIDIMacroConfigData
|
|
{
|
|
typedef char Macro[MACRO_LENGTH];
|
|
// encoding is ASCII
|
|
Macro szMidiGlb[9]; // Global MIDI macros
|
|
Macro szMidiSFXExt[16]; // Parametric MIDI macros
|
|
Macro szMidiZXXExt[128]; // Fixed MIDI macros
|
|
|
|
Macro *begin() { return std::begin(szMidiGlb); }
|
|
const Macro *begin() const { return std::begin(szMidiGlb); }
|
|
Macro *end() { return std::end(szMidiZXXExt); }
|
|
const Macro *end() const { return std::end(szMidiZXXExt); }
|
|
};
|
|
|
|
MPT_BINARY_STRUCT(MIDIMacroConfigData, 4896) // this is directly written to files, so the size must be correct!
|
|
|
|
class MIDIMacroConfig : public MIDIMacroConfigData
|
|
{
|
|
|
|
public:
|
|
|
|
MIDIMacroConfig() { Reset(); }
|
|
|
|
// Get macro type from a macro string
|
|
ParameteredMacro GetParameteredMacroType(uint32 macroIndex) const;
|
|
FixedMacro GetFixedMacroType() const;
|
|
|
|
// Create a new macro
|
|
protected:
|
|
void CreateParameteredMacro(Macro ¶meteredMacro, ParameteredMacro macroType, int subType) const;
|
|
public:
|
|
void CreateParameteredMacro(uint32 macroIndex, ParameteredMacro macroType, int subType = 0)
|
|
{
|
|
CreateParameteredMacro(szMidiSFXExt[macroIndex], macroType, subType);
|
|
}
|
|
std::string CreateParameteredMacro(ParameteredMacro macroType, int subType = 0) const;
|
|
|
|
protected:
|
|
void CreateFixedMacro(Macro (&fixedMacros)[128], FixedMacro macroType) const;
|
|
public:
|
|
void CreateFixedMacro(FixedMacro macroType)
|
|
{
|
|
CreateFixedMacro(szMidiZXXExt, macroType);
|
|
}
|
|
|
|
#ifdef MODPLUG_TRACKER
|
|
|
|
bool operator== (const MIDIMacroConfig &other) const;
|
|
bool operator!= (const MIDIMacroConfig &other) const { return !(*this == other); }
|
|
|
|
// Translate macro type or macro string to macro name
|
|
CString GetParameteredMacroName(uint32 macroIndex, IMixPlugin *plugin = nullptr) const;
|
|
CString GetParameteredMacroName(ParameteredMacro macroType) const;
|
|
CString GetFixedMacroName(FixedMacro macroType) const;
|
|
|
|
// Extract information from a parametered macro string.
|
|
int MacroToPlugParam(uint32 macroIndex) const;
|
|
int MacroToMidiCC(uint32 macroIndex) const;
|
|
|
|
// Check if any macro can automate a given plugin parameter
|
|
int FindMacroForParam(PlugParamIndex param) const;
|
|
|
|
#endif // MODPLUG_TRACKER
|
|
|
|
// Check if a given set of macros is the default IT macro set.
|
|
bool IsMacroDefaultSetupUsed() const;
|
|
|
|
// Reset MIDI macro config to default values.
|
|
void Reset();
|
|
|
|
// Clear all Zxx macros so that they do nothing.
|
|
void ClearZxxMacros();
|
|
|
|
// Sanitize all macro config strings.
|
|
void Sanitize();
|
|
|
|
// Fix old-format (not conforming to IT's MIDI macro definitions) MIDI config strings.
|
|
void UpgradeMacros();
|
|
|
|
protected:
|
|
|
|
// Helper function for FixMacroFormat()
|
|
void UpgradeMacroString(Macro ¯o) const;
|
|
|
|
// Remove blanks and other unwanted characters from macro strings for internal usage.
|
|
std::string GetSafeMacro(const Macro ¯o) const;
|
|
|
|
};
|
|
|
|
static_assert(sizeof(MIDIMacroConfig) == sizeof(MIDIMacroConfigData)); // this is directly written to files, so the size must be correct!
|
|
|
|
|
|
OPENMPT_NAMESPACE_END
|