Signed-off-by: falkTX <falktx@falktx.com>pull/491/head
@@ -553,6 +553,12 @@ START_NAMESPACE_DISTRHO | |||||
*/ | */ | ||||
#define DISTRHO_PLUGIN_WANT_LATENCY 1 | #define DISTRHO_PLUGIN_WANT_LATENCY 1 | ||||
/** | |||||
Whether the plugin wants MPE for MIDI input and/or output. | |||||
@note Only AU and CLAP formats implement this at the moment | |||||
*/ | |||||
#define DISTRHO_PLUGIN_WANT_MIDI_AS_MPE 0 | |||||
/** | /** | ||||
Whether the plugin wants MIDI input.@n | Whether the plugin wants MIDI input.@n | ||||
This is automatically enabled if @ref DISTRHO_PLUGIN_IS_SYNTH is true. | This is automatically enabled if @ref DISTRHO_PLUGIN_IS_SYNTH is true. | ||||
@@ -565,12 +571,6 @@ START_NAMESPACE_DISTRHO | |||||
*/ | */ | ||||
#define DISTRHO_PLUGIN_WANT_MIDI_OUTPUT 1 | #define DISTRHO_PLUGIN_WANT_MIDI_OUTPUT 1 | ||||
/** | |||||
Whether the plugin uses MIDI MPE for MIDI input and MIDI output. | |||||
@note Only CLAP implements this macro at the moment | |||||
*/ | |||||
#define DISTRHO_PLUGIN_MIDI_MPE 0 | |||||
/** | /** | ||||
Whether the plugin wants to change its own parameter inputs.@n | Whether the plugin wants to change its own parameter inputs.@n | ||||
Not all hosts or plugin formats support this, | Not all hosts or plugin formats support this, | ||||
@@ -686,6 +686,17 @@ public: | |||||
outWritable = true; | outWritable = true; | ||||
return noErr; | return noErr; | ||||
case kAudioUnitProperty_SupportsMPE: | |||||
DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); | |||||
DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); | |||||
#if DISTRHO_PLUGIN_WANT_MIDI_AS_MPE | |||||
outDataSize = sizeof(UInt32); | |||||
outWritable = false; | |||||
return noErr; | |||||
#else | |||||
return kAudioUnitErr_InvalidProperty; | |||||
#endif | |||||
case kAudioUnitProperty_CocoaUI: | case kAudioUnitProperty_CocoaUI: | ||||
DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); | DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); | ||||
DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); | DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); | ||||
@@ -1055,6 +1066,12 @@ public: | |||||
} | } | ||||
return noErr; | return noErr; | ||||
#if DISTRHO_PLUGIN_WANT_MIDI_AS_MPE | |||||
case kAudioUnitProperty_SupportsMPE: | |||||
*static_cast<UInt32*>(outData) = 1; | |||||
return noErr; | |||||
#endif | |||||
#if DISTRHO_PLUGIN_HAS_UI | #if DISTRHO_PLUGIN_HAS_UI | ||||
case kAudioUnitProperty_CocoaUI: | case kAudioUnitProperty_CocoaUI: | ||||
{ | { | ||||
@@ -67,12 +67,6 @@ | |||||
# define DPF_CLAP_TIMER_INTERVAL 16 /* ~60 fps */ | # define DPF_CLAP_TIMER_INTERVAL 16 /* ~60 fps */ | ||||
#endif | #endif | ||||
#if defined(DISTRHO_PLUGIN_MIDI_MPE) && DISTRHO_PLUGIN_MIDI_MPE | |||||
# define DPF_CLAP_NOTE_DIALECT CLAP_NOTE_DIALECT_MIDI_MPE | |||||
#else | |||||
# define DPF_CLAP_NOTE_DIALECT CLAP_NOTE_DIALECT_MIDI | |||||
#endif | |||||
START_NAMESPACE_DISTRHO | START_NAMESPACE_DISTRHO | ||||
// -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- | ||||
@@ -2290,23 +2284,33 @@ static bool CLAP_ABI clap_plugin_note_ports_get(const clap_plugin_t*, uint32_t, | |||||
{ | { | ||||
if (is_input) | if (is_input) | ||||
{ | { | ||||
#if DISTRHO_PLUGIN_WANT_MIDI_INPUT | |||||
#if DISTRHO_PLUGIN_WANT_MIDI_INPUT | |||||
info->id = 0; | info->id = 0; | ||||
info->supported_dialects = DPF_CLAP_NOTE_DIALECT; | |||||
info->preferred_dialect = DPF_CLAP_NOTE_DIALECT; | |||||
#if DISTRHO_PLUGIN_WANT_MIDI_AS_MPE | |||||
info->supported_dialects = CLAP_NOTE_DIALECT_MIDI | CLAP_NOTE_DIALECT_MIDI_MPE; | |||||
info->preferred_dialect = CLAP_NOTE_DIALECT_MIDI_MPE; | |||||
#else | |||||
info->supported_dialects = CLAP_NOTE_DIALECT_MIDI; | |||||
info->preferred_dialect = CLAP_NOTE_DIALECT_MIDI; | |||||
#endif | |||||
std::strcpy(info->name, "Event/MIDI Input"); | std::strcpy(info->name, "Event/MIDI Input"); | ||||
return true; | return true; | ||||
#endif | |||||
#endif | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT | |||||
#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT | |||||
info->id = 0; | info->id = 0; | ||||
info->supported_dialects = DPF_CLAP_NOTE_DIALECT; | |||||
info->preferred_dialect = DPF_CLAP_NOTE_DIALECT; | |||||
#if DISTRHO_PLUGIN_WANT_MIDI_AS_MPE | |||||
info->supported_dialects = CLAP_NOTE_DIALECT_MIDI | CLAP_NOTE_DIALECT_MIDI_MPE; | |||||
info->preferred_dialect = CLAP_NOTE_DIALECT_MIDI_MPE; | |||||
#else | |||||
info->supported_dialects = CLAP_NOTE_DIALECT_MIDI; | |||||
info->preferred_dialect = CLAP_NOTE_DIALECT_MIDI; | |||||
#endif | |||||
std::strcpy(info->name, "Event/MIDI Output"); | std::strcpy(info->name, "Event/MIDI Output"); | ||||
return true; | return true; | ||||
#endif | |||||
#endif | |||||
} | } | ||||
return false; | return false; | ||||
@@ -65,6 +65,10 @@ | |||||
# define DISTRHO_PLUGIN_WANT_LATENCY 0 | # define DISTRHO_PLUGIN_WANT_LATENCY 0 | ||||
#endif | #endif | ||||
#ifndef DISTRHO_PLUGIN_WANT_MIDI_AS_MPE | |||||
# define DISTRHO_PLUGIN_WANT_MIDI_AS_MPE 0 | |||||
#endif | |||||
#ifndef DISTRHO_PLUGIN_WANT_MIDI_OUTPUT | #ifndef DISTRHO_PLUGIN_WANT_MIDI_OUTPUT | ||||
# define DISTRHO_PLUGIN_WANT_MIDI_OUTPUT 0 | # define DISTRHO_PLUGIN_WANT_MIDI_OUTPUT 0 | ||||
#endif | #endif | ||||
@@ -178,6 +182,13 @@ | |||||
# error Synths need audio output to work! | # error Synths need audio output to work! | ||||
#endif | #endif | ||||
// -------------------------------------------------------------------------------------------------------------------- | |||||
// Test if MIDI as MPE enabled where it doesn't make sense | |||||
#if DISTRHO_PLUGIN_WANT_MIDI_AS_MPE && ! (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_MIDI_OUTPUT) | |||||
# error MIDI as MPE needs MIDI input or output to work! | |||||
#endif | |||||
// -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- | ||||
// Enable MIDI input if synth, test if midi-input disabled when synth | // Enable MIDI input if synth, test if midi-input disabled when synth | ||||