| @@ -5,17 +5,19 @@ It allows developers to create plugins with custom UIs using a simple C++ API.<b | |||||
| The framework facilitates exporting various different plugin formats from the same code-base.<br/> | The framework facilitates exporting various different plugin formats from the same code-base.<br/> | ||||
| DPF can build for LADSPA, DSSI, LV2 and VST formats.<br/> | DPF can build for LADSPA, DSSI, LV2 and VST formats.<br/> | ||||
| LADSPA, DSSI and VST implementations are complete, LV2 at ~95% completion.<br/> | |||||
| All current plugin format implementations are complete.<br/> | |||||
| A JACK/Standalone mode is also available, allowing you to quickly test plugins.<br/> | A JACK/Standalone mode is also available, allowing you to quickly test plugins.<br/> | ||||
| Plugin DSP and UI communication is done via key-value string pairs.<br/> | Plugin DSP and UI communication is done via key-value string pairs.<br/> | ||||
| You send messages from the UI to the DSP side, which is automatically saved in the host when required.<br/> | You send messages from the UI to the DSP side, which is automatically saved in the host when required.<br/> | ||||
| (You can also store state internally if needed, but this breaks DSSI compatibility).<br/> | |||||
| Getting time information from the host is possible.<br/> | Getting time information from the host is possible.<br/> | ||||
| It uses the same format as the JACK Transport API, making porting some code easier.<br/> | It uses the same format as the JACK Transport API, making porting some code easier.<br/> | ||||
| List of plugins made with DPF:<br/> | List of plugins made with DPF:<br/> | ||||
| - [DISTRHO Kars](https://github.com/DISTRHO/Kars) | |||||
| - [DISTRHO Mini-Series](https://github.com/DISTRHO/Mini-Series) | - [DISTRHO Mini-Series](https://github.com/DISTRHO/Mini-Series) | ||||
| - [DISTRHO MVerb](https://github.com/DISTRHO/MVerb) | - [DISTRHO MVerb](https://github.com/DISTRHO/MVerb) | ||||
| - [DISTRHO Nekobi](https://github.com/DISTRHO/Nekobi) | - [DISTRHO Nekobi](https://github.com/DISTRHO/Nekobi) | ||||
| @@ -549,26 +549,39 @@ protected: | |||||
| */ | */ | ||||
| virtual const char* getLabel() const = 0; | virtual const char* getLabel() const = 0; | ||||
| /** | |||||
| Get an extensive comment/description about the plugin.@n | |||||
| Optional, returns nothing by default. | |||||
| */ | |||||
| virtual const char* getDescription() const { return ""; } | |||||
| /** | /** | ||||
| Get the plugin author/maker. | Get the plugin author/maker. | ||||
| */ | */ | ||||
| virtual const char* getMaker() const = 0; | virtual const char* getMaker() const = 0; | ||||
| /** | /** | ||||
| Get the plugin license name (a single line of text).@n | |||||
| Get the plugin homepage.@n | |||||
| Optional, returns nothing by default. | |||||
| */ | |||||
| virtual const char* getHomePage() const { return ""; } | |||||
| /** | |||||
| Get the plugin license (a single line of text or a URL).@n | |||||
| For commercial plugins this should return some short copyright information. | For commercial plugins this should return some short copyright information. | ||||
| */ | */ | ||||
| virtual const char* getLicense() const = 0; | virtual const char* getLicense() const = 0; | ||||
| /** | /** | ||||
| Get the plugin version, in hexadecimal.@n | |||||
| TODO format to be defined | |||||
| Get the plugin version, in hexadecimal. | |||||
| @see d_version() | |||||
| */ | */ | ||||
| virtual uint32_t getVersion() const = 0; | virtual uint32_t getVersion() const = 0; | ||||
| /** | /** | ||||
| Get the plugin unique Id.@n | Get the plugin unique Id.@n | ||||
| This value is used by LADSPA, DSSI and VST plugin formats. | This value is used by LADSPA, DSSI and VST plugin formats. | ||||
| @see d_cconst() | |||||
| */ | */ | ||||
| virtual int64_t getUniqueId() const = 0; | virtual int64_t getUniqueId() const = 0; | ||||
| @@ -631,6 +644,16 @@ protected: | |||||
| virtual void loadProgram(uint32_t index) = 0; | virtual void loadProgram(uint32_t index) = 0; | ||||
| #endif | #endif | ||||
| #if DISTRHO_PLUGIN_WANT_FULL_STATE | |||||
| /** | |||||
| Get the value of an internal state.@n | |||||
| The host may call this function from any non-realtime context.@n | |||||
| Must be implemented by your plugin class if DISTRHO_PLUGIN_WANT_PROGRAMS or DISTRHO_PLUGIN_WANT_FULL_STATE is enabled. | |||||
| @note The use of this function breaks compatibility with the DSSI format. | |||||
| */ | |||||
| virtual String getState(const char* key) const = 0; | |||||
| #endif | |||||
| #if DISTRHO_PLUGIN_WANT_STATE | #if DISTRHO_PLUGIN_WANT_STATE | ||||
| /** | /** | ||||
| Change an internal state @a key to @a value.@n | Change an internal state @a key to @a value.@n | ||||
| @@ -62,6 +62,15 @@ int64_t d_cconst(const uint8_t a, const uint8_t b, const uint8_t c, const uint8_ | |||||
| return (a << 24) | (b << 16) | (c << 8) | (d << 0); | return (a << 24) | (b << 16) | (c << 8) | (d << 0); | ||||
| } | } | ||||
| /* | |||||
| * Return an hexadecimal representation of a MAJ.MIN.MICRO version number. | |||||
| */ | |||||
| static inline | |||||
| uint32_t d_version(const uint8_t major, const uint8_t minor, const uint8_t micro) noexcept | |||||
| { | |||||
| return (major << 16) | (minor << 8) | (micro << 0); | |||||
| } | |||||
| /* | /* | ||||
| * Dummy function. | * Dummy function. | ||||
| */ | */ | ||||
| @@ -73,6 +73,10 @@ | |||||
| # define DISTRHO_PLUGIN_WANT_STATE 0 | # define DISTRHO_PLUGIN_WANT_STATE 0 | ||||
| #endif | #endif | ||||
| #ifndef DISTRHO_PLUGIN_WANT_FULL_STATE | |||||
| # define DISTRHO_PLUGIN_WANT_FULL_STATE 0 | |||||
| #endif | |||||
| #ifndef DISTRHO_PLUGIN_WANT_TIMEPOS | #ifndef DISTRHO_PLUGIN_WANT_TIMEPOS | ||||
| # define DISTRHO_PLUGIN_WANT_TIMEPOS 0 | # define DISTRHO_PLUGIN_WANT_TIMEPOS 0 | ||||
| #endif | #endif | ||||
| @@ -104,6 +108,14 @@ | |||||
| # error Synths need MIDI input to work! | # error Synths need MIDI input to work! | ||||
| #endif | #endif | ||||
| // ----------------------------------------------------------------------- | |||||
| // Enable full state if plugin exports presets | |||||
| #if DISTRHO_PLUGIN_WANT_PROGRAMS && DISTRHO_PLUGIN_WANT_STATE | |||||
| # undef DISTRHO_PLUGIN_WANT_FULL_STATE | |||||
| # define DISTRHO_PLUGIN_WANT_FULL_STATE 1 | |||||
| #endif | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // Disable UI if DGL is not available | // Disable UI if DGL is not available | ||||
| @@ -196,6 +196,13 @@ public: | |||||
| return fPlugin->getLabel(); | return fPlugin->getLabel(); | ||||
| } | } | ||||
| const char* getDescription() const noexcept | |||||
| { | |||||
| DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, ""); | |||||
| return fPlugin->getDescription(); | |||||
| } | |||||
| const char* getMaker() const noexcept | const char* getMaker() const noexcept | ||||
| { | { | ||||
| DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, ""); | DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, ""); | ||||
| @@ -203,6 +210,13 @@ public: | |||||
| return fPlugin->getMaker(); | return fPlugin->getMaker(); | ||||
| } | } | ||||
| const char* getHomePage() const noexcept | |||||
| { | |||||
| DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, ""); | |||||
| return fPlugin->getHomePage(); | |||||
| } | |||||
| const char* getLicense() const noexcept | const char* getLicense() const noexcept | ||||
| { | { | ||||
| DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, ""); | DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, ""); | ||||
| @@ -371,6 +385,16 @@ public: | |||||
| return fData->stateDefValues[index]; | return fData->stateDefValues[index]; | ||||
| } | } | ||||
| # if DISTRHO_PLUGIN_WANT_FULL_STATE | |||||
| String getState(const char* key) const | |||||
| { | |||||
| DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, sFallbackString); | |||||
| DISTRHO_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0', sFallbackString); | |||||
| return fPlugin->getState(key); | |||||
| } | |||||
| # endif | |||||
| void setState(const char* const key, const char* const value) | void setState(const char* const key, const char* const value) | ||||
| { | { | ||||
| DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); | DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); | ||||
| @@ -40,6 +40,10 @@ | |||||
| # error DISTRHO_PLUGIN_URI undefined! | # error DISTRHO_PLUGIN_URI undefined! | ||||
| #endif | #endif | ||||
| #ifndef DISTRHO_PLUGIN_LV2_STATE_PREFIX | |||||
| # define DISTRHO_PLUGIN_LV2_STATE_PREFIX "urn:distrho:" | |||||
| #endif | |||||
| #define DISTRHO_LV2_USE_EVENTS_IN (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_TIMEPOS || (DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI)) | #define DISTRHO_LV2_USE_EVENTS_IN (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_TIMEPOS || (DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI)) | ||||
| #define DISTRHO_LV2_USE_EVENTS_OUT (DISTRHO_PLUGIN_WANT_MIDI_OUTPUT || (DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI)) | #define DISTRHO_LV2_USE_EVENTS_OUT (DISTRHO_PLUGIN_WANT_MIDI_OUTPUT || (DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI)) | ||||
| @@ -739,6 +743,15 @@ public: | |||||
| if (fPortControls[i] != nullptr) | if (fPortControls[i] != nullptr) | ||||
| *fPortControls[i] = fLastControlValues[i]; | *fPortControls[i] = fLastControlValues[i]; | ||||
| } | } | ||||
| # if DISTRHO_PLUGIN_WANT_FULL_STATE | |||||
| // Update state | |||||
| for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) | |||||
| { | |||||
| const String& key = cit->first; | |||||
| fStateMap[key] = fPlugin.getState(key); | |||||
| } | |||||
| # endif | |||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -747,12 +760,21 @@ public: | |||||
| #if DISTRHO_PLUGIN_WANT_STATE | #if DISTRHO_PLUGIN_WANT_STATE | ||||
| LV2_State_Status lv2_save(const LV2_State_Store_Function store, const LV2_State_Handle handle) | LV2_State_Status lv2_save(const LV2_State_Store_Function store, const LV2_State_Handle handle) | ||||
| { | { | ||||
| # if DISTRHO_PLUGIN_WANT_FULL_STATE | |||||
| // Update current state | |||||
| for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) | |||||
| { | |||||
| const String& key = cit->first; | |||||
| fStateMap[key] = fPlugin.getState(key); | |||||
| } | |||||
| # endif | |||||
| for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) | for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) | ||||
| { | { | ||||
| const String& key = cit->first; | const String& key = cit->first; | ||||
| const String& value = cit->second; | const String& value = cit->second; | ||||
| const String urnKey("urn:distrho:" + key); | |||||
| const String urnKey(DISTRHO_PLUGIN_LV2_STATE_PREFIX + key); | |||||
| // some hosts need +1 for the null terminator, even though the type is string | // some hosts need +1 for the null terminator, even though the type is string | ||||
| store(handle, fUridMap->map(fUridMap->handle, urnKey.buffer()), value.buffer(), value.length()+1, fURIDs.atomString, LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE); | store(handle, fUridMap->map(fUridMap->handle, urnKey.buffer()), value.buffer(), value.length()+1, fURIDs.atomString, LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE); | ||||
| @@ -769,7 +791,7 @@ public: | |||||
| for (uint32_t i=0, count=fPlugin.getStateCount(); i < count; ++i) | for (uint32_t i=0, count=fPlugin.getStateCount(); i < count; ++i) | ||||
| { | { | ||||
| const String& key(fPlugin.getStateKey(i)); | const String& key(fPlugin.getStateKey(i)); | ||||
| const String urnKey("urn:distrho:" + key); | |||||
| const String urnKey(DISTRHO_PLUGIN_LV2_STATE_PREFIX + key); | |||||
| size = 0; | size = 0; | ||||
| type = 0; | type = 0; | ||||
| @@ -909,7 +931,7 @@ private: | |||||
| atomLong(uridMap->map(uridMap->handle, LV2_ATOM__Long)), | atomLong(uridMap->map(uridMap->handle, LV2_ATOM__Long)), | ||||
| atomSequence(uridMap->map(uridMap->handle, LV2_ATOM__Sequence)), | atomSequence(uridMap->map(uridMap->handle, LV2_ATOM__Sequence)), | ||||
| atomString(uridMap->map(uridMap->handle, LV2_ATOM__String)), | atomString(uridMap->map(uridMap->handle, LV2_ATOM__String)), | ||||
| distrhoState(uridMap->map(uridMap->handle, "urn:distrho:keyValueState")), | |||||
| distrhoState(uridMap->map(uridMap->handle, DISTRHO_PLUGIN_LV2_STATE_PREFIX "KeyValueState")), | |||||
| midiEvent(uridMap->map(uridMap->handle, LV2_MIDI__MidiEvent)), | midiEvent(uridMap->map(uridMap->handle, LV2_MIDI__MidiEvent)), | ||||
| timePosition(uridMap->map(uridMap->handle, LV2_TIME__Position)), | timePosition(uridMap->map(uridMap->handle, LV2_TIME__Position)), | ||||
| timeBar(uridMap->map(uridMap->handle, LV2_TIME__bar)), | timeBar(uridMap->map(uridMap->handle, LV2_TIME__bar)), | ||||
| @@ -1161,15 +1183,13 @@ static const void* lv2_extension_data(const char* uri) | |||||
| #endif | #endif | ||||
| #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | ||||
| # define DISTRHO_DIRECT_ACCESS_URI "urn:distrho:direct-access" | |||||
| struct LV2_DirectAccess_Interface { | struct LV2_DirectAccess_Interface { | ||||
| void* (*get_instance_pointer)(LV2_Handle handle); | void* (*get_instance_pointer)(LV2_Handle handle); | ||||
| }; | }; | ||||
| static const LV2_DirectAccess_Interface directaccess = { lv2_get_instance_pointer }; | static const LV2_DirectAccess_Interface directaccess = { lv2_get_instance_pointer }; | ||||
| if (std::strcmp(uri, DISTRHO_DIRECT_ACCESS_URI) == 0) | |||||
| if (std::strcmp(uri, DISTRHO_PLUGIN_LV2_STATE_PREFIX "direct-access") == 0) | |||||
| return &directaccess; | return &directaccess; | ||||
| #endif | #endif | ||||
| @@ -195,6 +195,10 @@ void lv2_generate_ttl(const char* const basename) | |||||
| pluginString += "@prefix doap: <http://usefulinc.com/ns/doap#> .\n"; | pluginString += "@prefix doap: <http://usefulinc.com/ns/doap#> .\n"; | ||||
| pluginString += "@prefix foaf: <http://xmlns.com/foaf/0.1/> .\n"; | pluginString += "@prefix foaf: <http://xmlns.com/foaf/0.1/> .\n"; | ||||
| pluginString += "@prefix lv2: <" LV2_CORE_PREFIX "> .\n"; | pluginString += "@prefix lv2: <" LV2_CORE_PREFIX "> .\n"; | ||||
| #ifdef DISTRHO_PLUGIN_BRAND | |||||
| pluginString += "@prefix mod: <http://moddevices.com/ns/mod#> .\n"; | |||||
| #endif | |||||
| pluginString += "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n"; | |||||
| pluginString += "@prefix rsz: <" LV2_RESIZE_PORT_PREFIX "> .\n"; | pluginString += "@prefix rsz: <" LV2_RESIZE_PORT_PREFIX "> .\n"; | ||||
| #if DISTRHO_PLUGIN_HAS_UI | #if DISTRHO_PLUGIN_HAS_UI | ||||
| pluginString += "@prefix ui: <" LV2_UI_PREFIX "> .\n"; | pluginString += "@prefix ui: <" LV2_UI_PREFIX "> .\n"; | ||||
| @@ -266,7 +270,7 @@ void lv2_generate_ttl(const char* const basename) | |||||
| pluginString += " a lv2:InputPort, lv2:AudioPort ;\n"; | pluginString += " a lv2:InputPort, lv2:AudioPort ;\n"; | ||||
| pluginString += " lv2:index " + String(portIndex) + " ;\n"; | pluginString += " lv2:index " + String(portIndex) + " ;\n"; | ||||
| pluginString += " lv2:symbol \"" + port.symbol + "\" ;\n"; | |||||
| pluginString += " lv2:symbol \"lv2_" + port.symbol + "\" ;\n"; | |||||
| pluginString += " lv2:name \"" + port.name + "\" ;\n"; | pluginString += " lv2:name \"" + port.name + "\" ;\n"; | ||||
| if (port.hints & kAudioPortIsSidechain) | if (port.hints & kAudioPortIsSidechain) | ||||
| @@ -296,7 +300,7 @@ void lv2_generate_ttl(const char* const basename) | |||||
| pluginString += " a lv2:OutputPort, lv2:AudioPort ;\n"; | pluginString += " a lv2:OutputPort, lv2:AudioPort ;\n"; | ||||
| pluginString += " lv2:index " + String(portIndex) + " ;\n"; | pluginString += " lv2:index " + String(portIndex) + " ;\n"; | ||||
| pluginString += " lv2:symbol \"" + port.symbol + "\" ;\n"; | |||||
| pluginString += " lv2:symbol \"lv2_" + port.symbol + "\" ;\n"; | |||||
| pluginString += " lv2:name \"" + port.name + "\" ;\n"; | pluginString += " lv2:name \"" + port.name + "\" ;\n"; | ||||
| if (port.hints & kAudioPortIsSidechain) | if (port.hints & kAudioPortIsSidechain) | ||||
| @@ -426,6 +430,14 @@ void lv2_generate_ttl(const char* const basename) | |||||
| { | { | ||||
| pluginString += " unit:unit unit:mhz ;\n"; | pluginString += " unit:unit unit:mhz ;\n"; | ||||
| } | } | ||||
| else if (unit == "ms") | |||||
| { | |||||
| pluginString += " unit:unit unit:ms ;\n"; | |||||
| } | |||||
| else if (unit == "s") | |||||
| { | |||||
| pluginString += " unit:unit unit:s ;\n"; | |||||
| } | |||||
| else if (unit == "%") | else if (unit == "%") | ||||
| { | { | ||||
| pluginString += " unit:unit unit:pc ;\n"; | pluginString += " unit:unit unit:pc ;\n"; | ||||
| @@ -433,8 +445,7 @@ void lv2_generate_ttl(const char* const basename) | |||||
| else | else | ||||
| { | { | ||||
| pluginString += " unit:unit [\n"; | pluginString += " unit:unit [\n"; | ||||
| pluginString += " a unit:Unit ;\n"; | |||||
| pluginString += " unit:name \"" + unit + "\" ;\n"; | |||||
| pluginString += " rdfs:label \"" + unit + "\" ;\n"; | |||||
| pluginString += " unit:symbol \"" + unit + "\" ;\n"; | pluginString += " unit:symbol \"" + unit + "\" ;\n"; | ||||
| pluginString += " unit:render \"%f " + unit + "\" ;\n"; | pluginString += " unit:render \"%f " + unit + "\" ;\n"; | ||||
| pluginString += " ] ;\n"; | pluginString += " ] ;\n"; | ||||
| @@ -466,8 +477,60 @@ void lv2_generate_ttl(const char* const basename) | |||||
| } | } | ||||
| } | } | ||||
| // comment | |||||
| { | |||||
| const String comment(plugin.getDescription()); | |||||
| if (comment.isNotEmpty()) | |||||
| pluginString += " rdfs:comment \"\"\"\n" + comment + "\n\"\"\" ;\n\n"; | |||||
| } | |||||
| #ifdef DISTRHO_PLUGIN_BRAND | |||||
| // MOD | |||||
| pluginString += " mod:brand \"" DISTRHO_PLUGIN_BRAND "\" ;\n"; | |||||
| pluginString += " mod:label \"" DISTRHO_PLUGIN_NAME "\" ;\n\n"; | |||||
| #endif | |||||
| // name | |||||
| pluginString += " doap:name \"" + String(plugin.getName()) + "\" ;\n"; | pluginString += " doap:name \"" + String(plugin.getName()) + "\" ;\n"; | ||||
| pluginString += " doap:maintainer [ foaf:name \"" + String(plugin.getMaker()) + "\" ] .\n"; | |||||
| // license | |||||
| { | |||||
| const String license(plugin.getLicense()); | |||||
| if (license.contains("://")) | |||||
| pluginString += " doap:license <" + license + "> ;\n\n"; | |||||
| else | |||||
| pluginString += " doap:license \"" + license + "\" ;\n\n"; | |||||
| } | |||||
| // developer | |||||
| { | |||||
| const String homepage(plugin.getHomePage()); | |||||
| pluginString += " doap:maintainer [\n"; | |||||
| pluginString += " foaf:name \"" + String(plugin.getMaker()) + "\" ;\n"; | |||||
| if (homepage.isNotEmpty()) | |||||
| pluginString += " foaf:homepage <" + homepage + "> ;\n"; | |||||
| pluginString += " ] ;\n\n"; | |||||
| } | |||||
| { | |||||
| const uint32_t version(plugin.getVersion()); | |||||
| const uint32_t majorVersion = (version & 0xFF0000) >> 16; | |||||
| const uint32_t microVersion = (version & 0x00FF00) >> 8; | |||||
| /* */ uint32_t minorVersion = (version & 0x0000FF) >> 0; | |||||
| // NOTE: LV2 ignores 'major' version and says 0 for minor is pre-release/unstable. | |||||
| if (majorVersion > 0) | |||||
| minorVersion += 2; | |||||
| pluginString += " lv2:microVersion " + String(microVersion) + " ;\n"; | |||||
| pluginString += " lv2:minorVersion " + String(minorVersion) + " .\n"; | |||||
| } | |||||
| pluginFile << pluginString << std::endl; | pluginFile << pluginString << std::endl; | ||||
| pluginFile.close(); | pluginFile.close(); | ||||
| @@ -518,7 +581,6 @@ void lv2_generate_ttl(const char* const basename) | |||||
| String presetsString; | String presetsString; | ||||
| presetsString += "@prefix lv2: <" LV2_CORE_PREFIX "> .\n"; | presetsString += "@prefix lv2: <" LV2_CORE_PREFIX "> .\n"; | ||||
| presetsString += "@prefix pset: <" LV2_PRESETS_PREFIX "> .\n"; | presetsString += "@prefix pset: <" LV2_PRESETS_PREFIX "> .\n"; | ||||
| presetsString += "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n"; | |||||
| # if DISTRHO_PLUGIN_WANT_STATE | # if DISTRHO_PLUGIN_WANT_STATE | ||||
| presetsString += "@prefix state: <" LV2_STATE_PREFIX "> .\n"; | presetsString += "@prefix state: <" LV2_STATE_PREFIX "> .\n"; | ||||
| # endif | # endif | ||||
| @@ -526,7 +588,7 @@ void lv2_generate_ttl(const char* const basename) | |||||
| const uint32_t numParameters = plugin.getParameterCount(); | const uint32_t numParameters = plugin.getParameterCount(); | ||||
| const uint32_t numPrograms = plugin.getProgramCount(); | const uint32_t numPrograms = plugin.getProgramCount(); | ||||
| # if DISTRHO_PLUGIN_WANT_STATE | |||||
| # if DISTRHO_PLUGIN_WANT_FULL_STATE | |||||
| const uint32_t numStates = plugin.getStateCount(); | const uint32_t numStates = plugin.getStateCount(); | ||||
| # endif | # endif | ||||
| @@ -545,34 +607,25 @@ void lv2_generate_ttl(const char* const basename) | |||||
| presetString = "<" DISTRHO_PLUGIN_URI + presetSeparator + "preset" + strBuf + ">\n"; | presetString = "<" DISTRHO_PLUGIN_URI + presetSeparator + "preset" + strBuf + ">\n"; | ||||
| # if DISTRHO_PLUGIN_WANT_STATE | |||||
| # warning "Exporting LV2 Presets with state not supported yet" | |||||
| # if 0 | |||||
| # if DISTRHO_PLUGIN_WANT_FULL_STATE | |||||
| presetString += " state:state [\n"; | |||||
| for (uint32_t j=0; j<numStates; ++j) | for (uint32_t j=0; j<numStates; ++j) | ||||
| { | { | ||||
| if (j == 0) | |||||
| presetString += " state:state [\n"; | |||||
| else | |||||
| presetString += " [\n"; | |||||
| const String key = plugin.getStateKey(j); | |||||
| const String value = plugin.getState(key); | |||||
| presetString += " <urn:distrho:" + plugin.getStateKey(j) + ">\n"; | |||||
| presetString += "\"\"\"\n"; | |||||
| presetString += plugin.getState(j); | |||||
| presetString += "\"\"\"\n"; | |||||
| presetString += " <urn:distrho:" + key + ">"; | |||||
| if (j+1 == numStates) | |||||
| { | |||||
| if (numParameters > 0) | |||||
| presetString += " ] ;\n\n"; | |||||
| else | |||||
| presetString += " ] .\n\n"; | |||||
| } | |||||
| if (value.length() < 10) | |||||
| presetString += " \"" + value + "\" ;\n"; | |||||
| else | else | ||||
| { | |||||
| presetString += " ] ,\n"; | |||||
| } | |||||
| presetString += "\n\"\"\"\n" + value + "\n\"\"\" ;\n"; | |||||
| } | } | ||||
| # endif | |||||
| if (numParameters > 0) | |||||
| presetString += " ] ;\n\n"; | |||||
| else | |||||
| presetString += " ] .\n\n"; | |||||
| # endif | # endif | ||||
| for (uint32_t j=0; j <numParameters; ++j) | for (uint32_t j=0; j <numParameters; ++j) | ||||
| @@ -454,7 +454,17 @@ public: | |||||
| fVstUI = new UIVst(fAudioMaster, fEffect, this, &fPlugin, (intptr_t)ptr); | fVstUI = new UIVst(fAudioMaster, fEffect, this, &fPlugin, (intptr_t)ptr); | ||||
| # if DISTRHO_PLUGIN_WANT_FULL_STATE | |||||
| // Update current state from plugin side | |||||
| for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) | |||||
| { | |||||
| const String& key = cit->first; | |||||
| fStateMap[key] = fPlugin.getState(key); | |||||
| } | |||||
| # endif | |||||
| # if DISTRHO_PLUGIN_WANT_STATE | # if DISTRHO_PLUGIN_WANT_STATE | ||||
| // Set state | |||||
| for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) | for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) | ||||
| { | { | ||||
| const String& key = cit->first; | const String& key = cit->first; | ||||
| @@ -506,6 +516,15 @@ public: | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| # if DISTRHO_PLUGIN_WANT_FULL_STATE | |||||
| // Update current state | |||||
| for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) | |||||
| { | |||||
| const String& key = cit->first; | |||||
| fStateMap[key] = fPlugin.getState(key); | |||||
| } | |||||
| # endif | |||||
| String chunkStr; | String chunkStr; | ||||
| for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) | for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) | ||||
| @@ -28,6 +28,10 @@ | |||||
| #include "lv2/lv2_kxstudio_properties.h" | #include "lv2/lv2_kxstudio_properties.h" | ||||
| #include "lv2/lv2_programs.h" | #include "lv2/lv2_programs.h" | ||||
| #ifndef DISTRHO_PLUGIN_LV2_STATE_PREFIX | |||||
| # define DISTRHO_PLUGIN_LV2_STATE_PREFIX "urn:distrho:" | |||||
| #endif | |||||
| START_NAMESPACE_DISTRHO | START_NAMESPACE_DISTRHO | ||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| @@ -46,7 +50,7 @@ public: | |||||
| fController(controller), | fController(controller), | ||||
| fWriteFunction(writeFunc), | fWriteFunction(writeFunc), | ||||
| fEventTransferURID(uridMap->map(uridMap->handle, LV2_ATOM__eventTransfer)), | fEventTransferURID(uridMap->map(uridMap->handle, LV2_ATOM__eventTransfer)), | ||||
| fKeyValueURID(uridMap->map(uridMap->handle, "urn:distrho:keyValueState")), | |||||
| fKeyValueURID(uridMap->map(uridMap->handle, DISTRHO_PLUGIN_LV2_STATE_PREFIX "KeyValueState")), | |||||
| fWinIdWasNull(winId == 0) | fWinIdWasNull(winId == 0) | ||||
| { | { | ||||
| if (fUiResize != nullptr && winId != 0) | if (fUiResize != nullptr && winId != 0) | ||||
| @@ -331,8 +335,6 @@ static LV2UI_Handle lv2ui_instantiate(const LV2UI_Descriptor*, const char* uri, | |||||
| void* instance = nullptr; | void* instance = nullptr; | ||||
| #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | ||||
| # define DISTRHO_DIRECT_ACCESS_URI "urn:distrho:direct-access" | |||||
| struct LV2_DirectAccess_Interface { | struct LV2_DirectAccess_Interface { | ||||
| void* (*get_instance_pointer)(LV2_Handle handle); | void* (*get_instance_pointer)(LV2_Handle handle); | ||||
| }; | }; | ||||
| @@ -381,7 +383,7 @@ static LV2UI_Handle lv2ui_instantiate(const LV2UI_Descriptor*, const char* uri, | |||||
| return nullptr; | return nullptr; | ||||
| } | } | ||||
| if (const LV2_DirectAccess_Interface* const directAccess = (const LV2_DirectAccess_Interface*)extData->data_access(DISTRHO_DIRECT_ACCESS_URI)) | |||||
| if (const LV2_DirectAccess_Interface* const directAccess = (const LV2_DirectAccess_Interface*)extData->data_access(DISTRHO_PLUGIN_LV2_STATE_PREFIX "direct-access")) | |||||
| instance = directAccess->get_instance_pointer(instance); | instance = directAccess->get_instance_pointer(instance); | ||||
| else | else | ||||
| instance = nullptr; | instance = nullptr; | ||||
| @@ -9,10 +9,10 @@ build: ../lv2_ttl_generator | |||||
| endif | endif | ||||
| ../lv2_ttl_generator: lv2_ttl_generator.c | ../lv2_ttl_generator: lv2_ttl_generator.c | ||||
| $(CC) lv2_ttl_generator.c -o ../lv2_ttl_generator -ldl | |||||
| $(CC) $< -o $@ -ldl | |||||
| ../lv2_ttl_generator.exe: lv2_ttl_generator.c | ../lv2_ttl_generator.exe: lv2_ttl_generator.c | ||||
| $(CC) lv2_ttl_generator.c -o ../lv2_ttl_generator.exe -static | |||||
| $(CC) $< -o $@ -static | |||||
| touch ../lv2_ttl_generator | touch ../lv2_ttl_generator | ||||
| clean: | clean: | ||||
| @@ -159,30 +159,20 @@ | |||||
| /* = KNOBS | /* = KNOBS | ||||
| ================================================ */ | ================================================ */ | ||||
| .mod-pedal-boxy{{{cns}}} .mod-control-group { | .mod-pedal-boxy{{{cns}}} .mod-control-group { | ||||
| margin:20px; | |||||
| margin:20px !important; | |||||
| position:relative; | position:relative; | ||||
| text-align:center; | text-align:center; | ||||
| z-index:30; | z-index:30; | ||||
| } | } | ||||
| .mod-pedal-boxy{{{cns}}} .top { | |||||
| margin-top:0px !important; | |||||
| } | |||||
| .mod-pedal-boxy{{{cns}}} .mod-control-group .mod-knob { | .mod-pedal-boxy{{{cns}}} .mod-control-group .mod-knob { | ||||
| overflow:hidden; | overflow:hidden; | ||||
| position:relative; | position:relative; | ||||
| } | } | ||||
| .mod-pedal-boxy{{{cns}}} .mod-control-group .mod-knob { | |||||
| height:110px; | |||||
| } | |||||
| .mod-pedal-boxy{{{cns}}}.mod-three-knobs .mod-control-group .mod-knob, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-four-knobs .mod-control-group .mod-knob, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-five-knobs .mod-control-group .mod-knob, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-six-knobs .mod-control-group .mod-knob, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-seven-knobs .mod-control-group .mod-knob, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-eight-knobs .mod-control-group .mod-knob { | |||||
| height:81px; | |||||
| } | |||||
| .mod-pedal-boxy{{{cns}}} .mod-control-group .mod-knob > span.mod-knob-title { | .mod-pedal-boxy{{{cns}}} .mod-control-group .mod-knob > span.mod-knob-title { | ||||
| bottom:0px; | bottom:0px; | ||||
| display:block; | display:block; | ||||
| @@ -199,47 +189,44 @@ | |||||
| text-transform:uppercase; | text-transform:uppercase; | ||||
| } | } | ||||
| /* ONE and TWO KNOBS */ | |||||
| .mod-pedal-boxy{{{cns}}}.mod-one-knob .mod-control-group .mod-knob .mod-knob-image, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-two-knobs .mod-control-group .mod-knob .mod-knob-image { | |||||
| /* ONE KNOB */ | |||||
| .mod-pedal-boxy{{{cns}}}.mod-one-knob .mod-control-group .mod-knob .mod-knob-image { | |||||
| background-image:url(/resources/knobs/boxy/boxy.png{{{ns}}}); | background-image:url(/resources/knobs/boxy/boxy.png{{{ns}}}); | ||||
| } | |||||
| .mod-pedal-boxy{{{cns}}}.mod-one-knob .mod-control-group .mod-knob .mod-knob-image, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-two-knobs .mod-control-group .mod-knob .mod-knob-image { | |||||
| height:100px; | |||||
| background-repeat:no-repeat; | |||||
| background-size:auto 98px; | |||||
| height:98px; | |||||
| width:98px; | |||||
| margin:0 auto; | margin:0 auto; | ||||
| width:100px; | |||||
| } | |||||
| .mod-pedal-boxy{{{cns}}}.mod-one-knob .mod-control-group .mod-knob > span.mod-knob-title { | |||||
| font-size:15px; | |||||
| height:15px; | |||||
| } | |||||
| .mod-pedal-boxy{{{cns}}}.mod-one-knob .mod-control-group .mod-knob { | |||||
| height:115px; | |||||
| } | } | ||||
| /* TWO KNOBS */ | /* TWO KNOBS */ | ||||
| .mod-pedal-boxy{{{cns}}}.mod-two-knobs .mod-control-group { | |||||
| margin:20px 10px; | |||||
| .mod-pedal-boxy{{{cns}}}.mod-two-knobs .mod-control-group .mod-knob .mod-knob-image { | |||||
| background-image:url(/resources/knobs/boxy/boxy.png{{{ns}}}); | |||||
| background-repeat:no-repeat; | |||||
| background-size:auto 90px; | |||||
| height:90px; | |||||
| width:90px; | |||||
| margin:0 auto; | |||||
| } | |||||
| .mod-pedal-boxy{{{cns}}}.mod-two-knobs .mod-control-group .mod-knob > span.mod-knob-title { | |||||
| font-size:13px; | |||||
| } | } | ||||
| .mod-pedal-boxy{{{cns}}}.mod-two-knobs .mod-control-group .mod-knob { | .mod-pedal-boxy{{{cns}}}.mod-two-knobs .mod-control-group .mod-knob { | ||||
| float:left; | float:left; | ||||
| width:50%; | width:50%; | ||||
| } | } | ||||
| /* THREE AND HIGHER KNOBS */ | |||||
| .mod-pedal-boxy{{{cns}}}.mod-three-knobs .mod-control-group, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-four-knobs .mod-control-group, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-five-knobs .mod-control-group, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-six-knobs .mod-control-group, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-seven-knobs .mod-control-group, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-eight-knobs .mod-control-group { | |||||
| margin:20px 6px; | |||||
| } | |||||
| .mod-pedal-boxy{{{cns}}}.mod-three-knobs .mod-control-group .mod-knob, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-four-knobs .mod-control-group .mod-knob, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-five-knobs .mod-control-group .mod-knob, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-six-knobs .mod-control-group .mod-knob, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-seven-knobs .mod-control-group .mod-knob, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-eight-knobs .mod-control-group .mod-knob { | |||||
| display:inline-block; | |||||
| .mod-pedal-boxy{{{cns}}}.mod-two-knobs .mod-control-group .mod-knob { | |||||
| height:103px; | |||||
| } | } | ||||
| /* THREE AND HIGHER KNOBS */ | |||||
| .mod-pedal-boxy{{{cns}}}.mod-three-knobs .mod-control-group .mod-knob .mod-knob-image, | .mod-pedal-boxy{{{cns}}}.mod-three-knobs .mod-control-group .mod-knob .mod-knob-image, | ||||
| .mod-pedal-boxy{{{cns}}}.mod-four-knobs .mod-control-group .mod-knob .mod-knob-image, | .mod-pedal-boxy{{{cns}}}.mod-four-knobs .mod-control-group .mod-knob .mod-knob-image, | ||||
| .mod-pedal-boxy{{{cns}}}.mod-five-knobs .mod-control-group .mod-knob .mod-knob-image, | .mod-pedal-boxy{{{cns}}}.mod-five-knobs .mod-control-group .mod-knob .mod-knob-image, | ||||
| @@ -248,10 +235,19 @@ | |||||
| .mod-pedal-boxy{{{cns}}}.mod-eight-knobs .mod-control-group .mod-knob .mod-knob-image { | .mod-pedal-boxy{{{cns}}}.mod-eight-knobs .mod-control-group .mod-knob .mod-knob-image { | ||||
| background-image:url(/resources/knobs/lata/lata.png{{{ns}}}); | background-image:url(/resources/knobs/lata/lata.png{{{ns}}}); | ||||
| background-repeat:no-repeat; | background-repeat:no-repeat; | ||||
| background-size:auto 70px; | |||||
| height:70px; | |||||
| margin:0 -2px; | |||||
| width:70px; | |||||
| background-size:auto 60px; | |||||
| height:60px; | |||||
| width:60px; | |||||
| margin:0 auto; | |||||
| } | |||||
| .mod-pedal-boxy{{{cns}}}.mod-three-knobs .mod-control-group .mod-knob, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-four-knobs .mod-control-group .mod-knob, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-five-knobs .mod-control-group .mod-knob, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-six-knobs .mod-control-group .mod-knob, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-seven-knobs .mod-control-group .mod-knob, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-eight-knobs .mod-control-group .mod-knob { | |||||
| display:inline-block; | |||||
| height:73px; | |||||
| } | } | ||||
| /* EIGTH KNOBS */ | /* EIGTH KNOBS */ | ||||
| @@ -269,10 +265,15 @@ | |||||
| z-index:35; | z-index:35; | ||||
| } | } | ||||
| .mod-pedal-boxy{{{cns}}}.mod-three-knobs .mod-enumerated-group { | |||||
| .mod-pedal-boxy{{{cns}}}.mod-three-knobs .mod-enumerated-group, | |||||
| .mod-pedal-boxy{{{cns}}}.mod-four-knobs .mod-enumerated-group { | |||||
| margin-bottom:5px !important; | margin-bottom:5px !important; | ||||
| } | } | ||||
| .mod-pedal-boxy{{{cns}}}.mod-four-knobs .mod-enumerated-group { | |||||
| width:250px; | |||||
| } | |||||
| .mod-pedal-boxy{{{cns}}} .mod-enumerated { | .mod-pedal-boxy{{{cns}}} .mod-enumerated { | ||||
| background-position:right center; | background-position:right center; | ||||
| background-repeat:no-repeat; | background-repeat:no-repeat; | ||||
| @@ -1062,4 +1063,3 @@ | |||||
| { | { | ||||
| border-color:black; | border-color:black; | ||||
| } | } | ||||
| @@ -49,11 +49,21 @@ protected: | |||||
| return "3BandEQ"; | return "3BandEQ"; | ||||
| } | } | ||||
| const char* getDescription() const override | |||||
| { | |||||
| return "3 Band Equalizer, stereo version."; | |||||
| } | |||||
| const char* getMaker() const noexcept override | const char* getMaker() const noexcept override | ||||
| { | { | ||||
| return "DISTRHO"; | return "DISTRHO"; | ||||
| } | } | ||||
| const char* getHomePage() const override | |||||
| { | |||||
| return "https://github.com/DISTRHO/Mini-Series"; | |||||
| } | |||||
| const char* getLicense() const noexcept override | const char* getLicense() const noexcept override | ||||
| { | { | ||||
| return "LGPL"; | return "LGPL"; | ||||
| @@ -61,7 +71,7 @@ protected: | |||||
| uint32_t getVersion() const noexcept override | uint32_t getVersion() const noexcept override | ||||
| { | { | ||||
| return 0x1000; | |||||
| return d_version(1, 0, 0); | |||||
| } | } | ||||
| int64_t getUniqueId() const noexcept override | int64_t getUniqueId() const noexcept override | ||||
| @@ -17,8 +17,9 @@ | |||||
| #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | #define DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_NAME "3 Band EQ" | |||||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/3BandEQ" | |||||
| #define DISTRHO_PLUGIN_BRAND "DISTRHO" | |||||
| #define DISTRHO_PLUGIN_NAME "3 Band EQ" | |||||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/3BandEQ" | |||||
| #define DISTRHO_PLUGIN_HAS_UI 1 | #define DISTRHO_PLUGIN_HAS_UI 1 | ||||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | ||||
| @@ -49,11 +49,21 @@ protected: | |||||
| return "3BandSplitter"; | return "3BandSplitter"; | ||||
| } | } | ||||
| const char* getDescription() const override | |||||
| { | |||||
| return "3 Band Equalizer, splitted output version."; | |||||
| } | |||||
| const char* getMaker() const noexcept override | const char* getMaker() const noexcept override | ||||
| { | { | ||||
| return "DISTRHO"; | return "DISTRHO"; | ||||
| } | } | ||||
| const char* getHomePage() const override | |||||
| { | |||||
| return "https://github.com/DISTRHO/Mini-Series"; | |||||
| } | |||||
| const char* getLicense() const noexcept override | const char* getLicense() const noexcept override | ||||
| { | { | ||||
| return "LGPL"; | return "LGPL"; | ||||
| @@ -61,7 +71,7 @@ protected: | |||||
| uint32_t getVersion() const noexcept override | uint32_t getVersion() const noexcept override | ||||
| { | { | ||||
| return 0x1000; | |||||
| return d_version(1, 0, 0); | |||||
| } | } | ||||
| int64_t getUniqueId() const noexcept override | int64_t getUniqueId() const noexcept override | ||||
| @@ -17,8 +17,9 @@ | |||||
| #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | #define DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_NAME "3 Band Splitter" | |||||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/3BandSplitter" | |||||
| #define DISTRHO_PLUGIN_BRAND "DISTRHO" | |||||
| #define DISTRHO_PLUGIN_NAME "3 Band Splitter" | |||||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/3BandSplitter" | |||||
| #define DISTRHO_PLUGIN_HAS_UI 1 | #define DISTRHO_PLUGIN_HAS_UI 1 | ||||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | ||||
| @@ -62,7 +62,7 @@ void DistrhoPluginAmplitudeImposer::initAudioPort(bool input, uint32_t index, Au | |||||
| break; | break; | ||||
| case 1: | case 1: | ||||
| port.name = "Input Right (Amp Env)"; | port.name = "Input Right (Amp Env)"; | ||||
| port.symbol = "in_left_amp"; | |||||
| port.symbol = "in_right_amp"; | |||||
| break; | break; | ||||
| case 2: | case 2: | ||||
| port.name = "Input Left (Audio)"; | port.name = "Input Left (Audio)"; | ||||
| @@ -84,7 +84,7 @@ void DistrhoPluginAmplitudeImposer::initAudioPort(bool input, uint32_t index, Au | |||||
| break; | break; | ||||
| case 1: | case 1: | ||||
| port.name = "Output Right"; | port.name = "Output Right"; | ||||
| port.symbol = "out_left"; | |||||
| port.symbol = "out_right"; | |||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| @@ -46,16 +46,32 @@ protected: | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Information | // Information | ||||
| const char* getName() const noexcept override | |||||
| { | |||||
| return "Amplitude Imposer"; | |||||
| } | |||||
| const char* getLabel() const noexcept override | const char* getLabel() const noexcept override | ||||
| { | { | ||||
| return "AmplitudeImposer"; | return "AmplitudeImposer"; | ||||
| } | } | ||||
| const char* getDescription() const override | |||||
| { | |||||
| return "Takes 2 stereo inputs and imposes the amplitude envelope of the first one on the second one.\n\ | |||||
| Also has a threshold level for the second input, so that when the signal falls below it, it is amplified up to the threshold, to give a greater signal to be amplitude modulated."; | |||||
| } | |||||
| const char* getMaker() const noexcept override | const char* getMaker() const noexcept override | ||||
| { | { | ||||
| return "ndc Plugs"; | return "ndc Plugs"; | ||||
| } | } | ||||
| const char* getHomePage() const override | |||||
| { | |||||
| return "https://github.com/DISTRHO/ndc-Plugs"; | |||||
| } | |||||
| const char* getLicense() const noexcept override | const char* getLicense() const noexcept override | ||||
| { | { | ||||
| return "MIT"; | return "MIT"; | ||||
| @@ -63,7 +79,7 @@ protected: | |||||
| uint32_t getVersion() const noexcept override | uint32_t getVersion() const noexcept override | ||||
| { | { | ||||
| return 0x1000; | |||||
| return d_version(0, 1, 0); | |||||
| } | } | ||||
| int64_t getUniqueId() const noexcept override | int64_t getUniqueId() const noexcept override | ||||
| @@ -25,8 +25,9 @@ | |||||
| #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | #define DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_NAME "Amplitude Imposer" | |||||
| #define DISTRHO_PLUGIN_URI "http://www.niallmoody.com/ndcplugs/ampimposer.htm" | |||||
| #define DISTRHO_PLUGIN_BRAND "DISTRHO" | |||||
| #define DISTRHO_PLUGIN_NAME "Amplitude Imposr" | |||||
| #define DISTRHO_PLUGIN_URI "http://www.niallmoody.com/ndcplugs/ampimposer.htm" | |||||
| #define DISTRHO_PLUGIN_HAS_UI 1 | #define DISTRHO_PLUGIN_HAS_UI 1 | ||||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | ||||
| @@ -53,11 +53,22 @@ protected: | |||||
| return "CycleShifter"; | return "CycleShifter"; | ||||
| } | } | ||||
| const char* getDescription() const override | |||||
| { | |||||
| return "Reads in a cycle's-worth of the input signal, then (once the whole cycle's been read in) outputs it again, on top of the current output.\n\ | |||||
| Works best with long/sustained sounds (e.g. strings, pads etc.), sounds like a weird kind of gentle distortion."; | |||||
| } | |||||
| const char* getMaker() const noexcept override | const char* getMaker() const noexcept override | ||||
| { | { | ||||
| return "ndc Plugs"; | return "ndc Plugs"; | ||||
| } | } | ||||
| const char* getHomePage() const override | |||||
| { | |||||
| return "https://github.com/DISTRHO/ndc-Plugs"; | |||||
| } | |||||
| const char* getLicense() const noexcept override | const char* getLicense() const noexcept override | ||||
| { | { | ||||
| return "MIT"; | return "MIT"; | ||||
| @@ -65,7 +76,7 @@ protected: | |||||
| uint32_t getVersion() const noexcept override | uint32_t getVersion() const noexcept override | ||||
| { | { | ||||
| return 0x1000; | |||||
| return d_version(0, 1, 0); | |||||
| } | } | ||||
| int64_t getUniqueId() const noexcept override | int64_t getUniqueId() const noexcept override | ||||
| @@ -25,8 +25,9 @@ | |||||
| #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | #define DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_NAME "Cycle Shifter" | |||||
| #define DISTRHO_PLUGIN_URI "http://www.niallmoody.com/ndcplugs/cycleshifter.htm" | |||||
| #define DISTRHO_PLUGIN_BRAND "DISTRHO" | |||||
| #define DISTRHO_PLUGIN_NAME "Cycle Shifter" | |||||
| #define DISTRHO_PLUGIN_URI "http://www.niallmoody.com/ndcplugs/cycleshifter.htm" | |||||
| #define DISTRHO_PLUGIN_HAS_UI 1 | #define DISTRHO_PLUGIN_HAS_UI 1 | ||||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | ||||
| @@ -17,8 +17,9 @@ | |||||
| #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | #define DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_NAME "Kars" | |||||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/Kars" | |||||
| #define DISTRHO_PLUGIN_BRAND "DISTRHO" | |||||
| #define DISTRHO_PLUGIN_NAME "Kars" | |||||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/Kars" | |||||
| #define DISTRHO_PLUGIN_HAS_UI 1 | #define DISTRHO_PLUGIN_HAS_UI 1 | ||||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | ||||
| @@ -46,19 +46,29 @@ protected: | |||||
| return "Kars"; | return "Kars"; | ||||
| } | } | ||||
| const char* getDescription() const override | |||||
| { | |||||
| return "Simple karplus-strong plucked string synth."; | |||||
| } | |||||
| const char* getMaker() const noexcept override | const char* getMaker() const noexcept override | ||||
| { | { | ||||
| return "falkTX"; | return "falkTX"; | ||||
| } | } | ||||
| const char* getHomePage() const override | |||||
| { | |||||
| return "https://github.com/DISTRHO/Kars"; | |||||
| } | |||||
| const char* getLicense() const noexcept override | const char* getLicense() const noexcept override | ||||
| { | { | ||||
| return "GPL v2+"; | |||||
| return "ISC"; | |||||
| } | } | ||||
| uint32_t getVersion() const noexcept override | uint32_t getVersion() const noexcept override | ||||
| { | { | ||||
| return 0x1000; | |||||
| return d_version(1, 0, 0); | |||||
| } | } | ||||
| int64_t getUniqueId() const noexcept override | int64_t getUniqueId() const noexcept override | ||||
| @@ -19,8 +19,9 @@ | |||||
| #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | #define DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_NAME "MVerb" | |||||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/MVerb" | |||||
| #define DISTRHO_PLUGIN_BRAND "DISTRHO" | |||||
| #define DISTRHO_PLUGIN_NAME "MVerb" | |||||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/MVerb" | |||||
| #define DISTRHO_PLUGIN_HAS_UI 1 | #define DISTRHO_PLUGIN_HAS_UI 1 | ||||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | ||||
| @@ -40,11 +40,21 @@ protected: | |||||
| return "MVerb"; | return "MVerb"; | ||||
| } | } | ||||
| const char* getDescription() const override | |||||
| { | |||||
| return "Studio quality reverb, provides a practical demonstration of Dattorro’s figure-of-eight reverb structure."; | |||||
| } | |||||
| const char* getMaker() const noexcept override | const char* getMaker() const noexcept override | ||||
| { | { | ||||
| return "Martin Eastwood, falkTX"; | return "Martin Eastwood, falkTX"; | ||||
| } | } | ||||
| const char* getHomePage() const override | |||||
| { | |||||
| return "https://github.com/DISTRHO/MVerb"; | |||||
| } | |||||
| const char* getLicense() const noexcept override | const char* getLicense() const noexcept override | ||||
| { | { | ||||
| return "GPL v3+"; | return "GPL v3+"; | ||||
| @@ -52,7 +62,7 @@ protected: | |||||
| uint32_t getVersion() const noexcept override | uint32_t getVersion() const noexcept override | ||||
| { | { | ||||
| return 0x1000; | |||||
| return d_version(1, 0, 0); | |||||
| } | } | ||||
| int64_t getUniqueId() const noexcept override | int64_t getUniqueId() const noexcept override | ||||
| @@ -18,8 +18,9 @@ | |||||
| #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | #define DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_NAME "Nekobi" | |||||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/Nekobi" | |||||
| #define DISTRHO_PLUGIN_BRAND "DISTRHO" | |||||
| #define DISTRHO_PLUGIN_NAME "Nekobi" | |||||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/Nekobi" | |||||
| #define DISTRHO_PLUGIN_HAS_UI 1 | #define DISTRHO_PLUGIN_HAS_UI 1 | ||||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | ||||
| @@ -57,11 +57,21 @@ protected: | |||||
| return "Nekobi"; | return "Nekobi"; | ||||
| } | } | ||||
| const char* getDescription() const override | |||||
| { | |||||
| return "Simple single-oscillator synth based on the Roland TB-303."; | |||||
| } | |||||
| const char* getMaker() const noexcept override | const char* getMaker() const noexcept override | ||||
| { | { | ||||
| return "Sean Bolton, falkTX"; | return "Sean Bolton, falkTX"; | ||||
| } | } | ||||
| const char* getHomePage() const override | |||||
| { | |||||
| return "https://github.com/DISTRHO/Nekobi"; | |||||
| } | |||||
| const char* getLicense() const noexcept override | const char* getLicense() const noexcept override | ||||
| { | { | ||||
| return "GPL v2+"; | return "GPL v2+"; | ||||
| @@ -69,7 +79,7 @@ protected: | |||||
| uint32_t getVersion() const noexcept override | uint32_t getVersion() const noexcept override | ||||
| { | { | ||||
| return 0x1000; | |||||
| return d_version(1, 0, 0); | |||||
| } | } | ||||
| int64_t getUniqueId() const noexcept override | int64_t getUniqueId() const noexcept override | ||||
| @@ -17,8 +17,9 @@ | |||||
| #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | #define DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_NAME "Ping Pong Pan" | |||||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/PingPongPan" | |||||
| #define DISTRHO_PLUGIN_BRAND "DISTRHO" | |||||
| #define DISTRHO_PLUGIN_NAME "Ping Pong Pan" | |||||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/PingPongPan" | |||||
| #define DISTRHO_PLUGIN_HAS_UI 1 | #define DISTRHO_PLUGIN_HAS_UI 1 | ||||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | ||||
| @@ -45,11 +45,21 @@ protected: | |||||
| return "PingPongPan"; | return "PingPongPan"; | ||||
| } | } | ||||
| const char* getDescription() const override | |||||
| { | |||||
| return "Ping Pong Panning."; | |||||
| } | |||||
| const char* getMaker() const noexcept override | const char* getMaker() const noexcept override | ||||
| { | { | ||||
| return "DISTRHO"; | return "DISTRHO"; | ||||
| } | } | ||||
| const char* getHomePage() const override | |||||
| { | |||||
| return "https://github.com/DISTRHO/Mini-Series"; | |||||
| } | |||||
| const char* getLicense() const noexcept override | const char* getLicense() const noexcept override | ||||
| { | { | ||||
| return "LGPL"; | return "LGPL"; | ||||
| @@ -57,7 +67,7 @@ protected: | |||||
| uint32_t getVersion() const noexcept override | uint32_t getVersion() const noexcept override | ||||
| { | { | ||||
| return 0x1000; | |||||
| return d_version(1, 0, 0); | |||||
| } | } | ||||
| int64_t getUniqueId() const noexcept override | int64_t getUniqueId() const noexcept override | ||||
| @@ -17,7 +17,8 @@ | |||||
| #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | #define DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_NAME "ProM" | |||||
| #define DISTRHO_PLUGIN_BRAND "DISTRHO" | |||||
| #define DISTRHO_PLUGIN_NAME "ProM" | |||||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/ProM" | #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/ProM" | ||||
| #define DISTRHO_PLUGIN_HAS_UI 1 | #define DISTRHO_PLUGIN_HAS_UI 1 | ||||
| @@ -43,11 +43,21 @@ protected: | |||||
| return "ProM"; | return "ProM"; | ||||
| } | } | ||||
| const char* getDescription() const override | |||||
| { | |||||
| return "ProjectM visualizer."; | |||||
| } | |||||
| const char* getMaker() const noexcept override | const char* getMaker() const noexcept override | ||||
| { | { | ||||
| return "DISTRHO"; | return "DISTRHO"; | ||||
| } | } | ||||
| const char* getHomePage() const override | |||||
| { | |||||
| return "https://github.com/DISTRHO/ProM"; | |||||
| } | |||||
| const char* getLicense() const noexcept override | const char* getLicense() const noexcept override | ||||
| { | { | ||||
| return "LGPL"; | return "LGPL"; | ||||
| @@ -55,7 +65,7 @@ protected: | |||||
| uint32_t getVersion() const noexcept override | uint32_t getVersion() const noexcept override | ||||
| { | { | ||||
| return 0x1000; | |||||
| return d_version(1, 0, 0); | |||||
| } | } | ||||
| int64_t getUniqueId() const noexcept override | int64_t getUniqueId() const noexcept override | ||||
| @@ -25,8 +25,9 @@ | |||||
| #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | #define DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| #define DISTRHO_PLUGIN_NAME "Soul Force" | |||||
| #define DISTRHO_PLUGIN_URI "http://www.niallmoody.com/ndcplugs/soulforce.htm" | |||||
| #define DISTRHO_PLUGIN_BRAND "DISTRHO" | |||||
| #define DISTRHO_PLUGIN_NAME "Soul Force" | |||||
| #define DISTRHO_PLUGIN_URI "http://www.niallmoody.com/ndcplugs/soulforce.htm" | |||||
| #define DISTRHO_PLUGIN_HAS_UI 1 | #define DISTRHO_PLUGIN_HAS_UI 1 | ||||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | ||||
| @@ -66,11 +66,22 @@ protected: | |||||
| return "SoulForce"; | return "SoulForce"; | ||||
| } | } | ||||
| const char* getDescription() const override | |||||
| { | |||||
| return "A fairly standard waveshaping distortion plugin, made more interesting through the use of feedback to control the shaping.\n\ | |||||
| Can get pretty loud and obnoxious."; | |||||
| } | |||||
| const char* getMaker() const noexcept override | const char* getMaker() const noexcept override | ||||
| { | { | ||||
| return "ndc Plugs"; | return "ndc Plugs"; | ||||
| } | } | ||||
| const char* getHomePage() const override | |||||
| { | |||||
| return "https://github.com/DISTRHO/ndc-Plugs"; | |||||
| } | |||||
| const char* getLicense() const noexcept override | const char* getLicense() const noexcept override | ||||
| { | { | ||||
| return "MIT"; | return "MIT"; | ||||
| @@ -78,7 +89,7 @@ protected: | |||||
| uint32_t getVersion() const noexcept override | uint32_t getVersion() const noexcept override | ||||
| { | { | ||||
| return 0x1000; | |||||
| return d_version(0, 1, 0); | |||||
| } | } | ||||
| int64_t getUniqueId() const noexcept override | int64_t getUniqueId() const noexcept override | ||||