@@ -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/> | |||
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/> | |||
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 can also store state internally if needed, but this breaks DSSI compatibility).<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/> | |||
List of plugins made with DPF:<br/> | |||
- [DISTRHO Kars](https://github.com/DISTRHO/Kars) | |||
- [DISTRHO Mini-Series](https://github.com/DISTRHO/Mini-Series) | |||
- [DISTRHO MVerb](https://github.com/DISTRHO/MVerb) | |||
- [DISTRHO Nekobi](https://github.com/DISTRHO/Nekobi) | |||
@@ -549,26 +549,39 @@ protected: | |||
*/ | |||
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. | |||
*/ | |||
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. | |||
*/ | |||
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; | |||
/** | |||
Get the plugin unique Id.@n | |||
This value is used by LADSPA, DSSI and VST plugin formats. | |||
@see d_cconst() | |||
*/ | |||
virtual int64_t getUniqueId() const = 0; | |||
@@ -631,6 +644,16 @@ protected: | |||
virtual void loadProgram(uint32_t index) = 0; | |||
#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 | |||
/** | |||
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 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. | |||
*/ | |||
@@ -73,6 +73,10 @@ | |||
# define DISTRHO_PLUGIN_WANT_STATE 0 | |||
#endif | |||
#ifndef DISTRHO_PLUGIN_WANT_FULL_STATE | |||
# define DISTRHO_PLUGIN_WANT_FULL_STATE 0 | |||
#endif | |||
#ifndef DISTRHO_PLUGIN_WANT_TIMEPOS | |||
# define DISTRHO_PLUGIN_WANT_TIMEPOS 0 | |||
#endif | |||
@@ -104,6 +108,14 @@ | |||
# error Synths need MIDI input to work! | |||
#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 | |||
@@ -196,6 +196,13 @@ public: | |||
return fPlugin->getLabel(); | |||
} | |||
const char* getDescription() const noexcept | |||
{ | |||
DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, ""); | |||
return fPlugin->getDescription(); | |||
} | |||
const char* getMaker() const noexcept | |||
{ | |||
DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, ""); | |||
@@ -203,6 +210,13 @@ public: | |||
return fPlugin->getMaker(); | |||
} | |||
const char* getHomePage() const noexcept | |||
{ | |||
DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, ""); | |||
return fPlugin->getHomePage(); | |||
} | |||
const char* getLicense() const noexcept | |||
{ | |||
DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, ""); | |||
@@ -371,6 +385,16 @@ public: | |||
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) | |||
{ | |||
DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); | |||
@@ -40,6 +40,10 @@ | |||
# error DISTRHO_PLUGIN_URI undefined! | |||
#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_OUT (DISTRHO_PLUGIN_WANT_MIDI_OUTPUT || (DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI)) | |||
@@ -739,6 +743,15 @@ public: | |||
if (fPortControls[i] != nullptr) | |||
*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 | |||
@@ -747,12 +760,21 @@ public: | |||
#if DISTRHO_PLUGIN_WANT_STATE | |||
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) | |||
{ | |||
const String& key = cit->first; | |||
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 | |||
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) | |||
{ | |||
const String& key(fPlugin.getStateKey(i)); | |||
const String urnKey("urn:distrho:" + key); | |||
const String urnKey(DISTRHO_PLUGIN_LV2_STATE_PREFIX + key); | |||
size = 0; | |||
type = 0; | |||
@@ -909,7 +931,7 @@ private: | |||
atomLong(uridMap->map(uridMap->handle, LV2_ATOM__Long)), | |||
atomSequence(uridMap->map(uridMap->handle, LV2_ATOM__Sequence)), | |||
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)), | |||
timePosition(uridMap->map(uridMap->handle, LV2_TIME__Position)), | |||
timeBar(uridMap->map(uridMap->handle, LV2_TIME__bar)), | |||
@@ -1161,15 +1183,13 @@ static const void* lv2_extension_data(const char* uri) | |||
#endif | |||
#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | |||
# define DISTRHO_DIRECT_ACCESS_URI "urn:distrho:direct-access" | |||
struct LV2_DirectAccess_Interface { | |||
void* (*get_instance_pointer)(LV2_Handle handle); | |||
}; | |||
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; | |||
#endif | |||
@@ -195,6 +195,10 @@ void lv2_generate_ttl(const char* const basename) | |||
pluginString += "@prefix doap: <http://usefulinc.com/ns/doap#> .\n"; | |||
pluginString += "@prefix foaf: <http://xmlns.com/foaf/0.1/> .\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"; | |||
#if DISTRHO_PLUGIN_HAS_UI | |||
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 += " lv2:index " + String(portIndex) + " ;\n"; | |||
pluginString += " lv2:symbol \"" + port.symbol + "\" ;\n"; | |||
pluginString += " lv2:symbol \"lv2_" + port.symbol + "\" ;\n"; | |||
pluginString += " lv2:name \"" + port.name + "\" ;\n"; | |||
if (port.hints & kAudioPortIsSidechain) | |||
@@ -296,7 +300,7 @@ void lv2_generate_ttl(const char* const basename) | |||
pluginString += " a lv2:OutputPort, lv2:AudioPort ;\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"; | |||
if (port.hints & kAudioPortIsSidechain) | |||
@@ -426,6 +430,14 @@ void lv2_generate_ttl(const char* const basename) | |||
{ | |||
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 == "%") | |||
{ | |||
pluginString += " unit:unit unit:pc ;\n"; | |||
@@ -433,8 +445,7 @@ void lv2_generate_ttl(const char* const basename) | |||
else | |||
{ | |||
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:render \"%f " + unit + "\" ;\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: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.close(); | |||
@@ -518,7 +581,6 @@ void lv2_generate_ttl(const char* const basename) | |||
String presetsString; | |||
presetsString += "@prefix lv2: <" LV2_CORE_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 | |||
presetsString += "@prefix state: <" LV2_STATE_PREFIX "> .\n"; | |||
# endif | |||
@@ -526,7 +588,7 @@ void lv2_generate_ttl(const char* const basename) | |||
const uint32_t numParameters = plugin.getParameterCount(); | |||
const uint32_t numPrograms = plugin.getProgramCount(); | |||
# if DISTRHO_PLUGIN_WANT_STATE | |||
# if DISTRHO_PLUGIN_WANT_FULL_STATE | |||
const uint32_t numStates = plugin.getStateCount(); | |||
# endif | |||
@@ -545,34 +607,25 @@ void lv2_generate_ttl(const char* const basename) | |||
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) | |||
{ | |||
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 | |||
{ | |||
presetString += " ] ,\n"; | |||
} | |||
presetString += "\n\"\"\"\n" + value + "\n\"\"\" ;\n"; | |||
} | |||
# endif | |||
if (numParameters > 0) | |||
presetString += " ] ;\n\n"; | |||
else | |||
presetString += " ] .\n\n"; | |||
# endif | |||
for (uint32_t j=0; j <numParameters; ++j) | |||
@@ -454,7 +454,17 @@ public: | |||
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 | |||
// Set state | |||
for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) | |||
{ | |||
const String& key = cit->first; | |||
@@ -506,6 +516,15 @@ public: | |||
} | |||
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; | |||
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_programs.h" | |||
#ifndef DISTRHO_PLUGIN_LV2_STATE_PREFIX | |||
# define DISTRHO_PLUGIN_LV2_STATE_PREFIX "urn:distrho:" | |||
#endif | |||
START_NAMESPACE_DISTRHO | |||
// ----------------------------------------------------------------------- | |||
@@ -46,7 +50,7 @@ public: | |||
fController(controller), | |||
fWriteFunction(writeFunc), | |||
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) | |||
{ | |||
if (fUiResize != nullptr && winId != 0) | |||
@@ -331,8 +335,6 @@ static LV2UI_Handle lv2ui_instantiate(const LV2UI_Descriptor*, const char* uri, | |||
void* instance = nullptr; | |||
#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | |||
# define DISTRHO_DIRECT_ACCESS_URI "urn:distrho:direct-access" | |||
struct LV2_DirectAccess_Interface { | |||
void* (*get_instance_pointer)(LV2_Handle handle); | |||
}; | |||
@@ -381,7 +383,7 @@ static LV2UI_Handle lv2ui_instantiate(const LV2UI_Descriptor*, const char* uri, | |||
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); | |||
else | |||
instance = nullptr; | |||
@@ -9,10 +9,10 @@ build: ../lv2_ttl_generator | |||
endif | |||
../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 | |||
$(CC) lv2_ttl_generator.c -o ../lv2_ttl_generator.exe -static | |||
$(CC) $< -o $@ -static | |||
touch ../lv2_ttl_generator | |||
clean: | |||
@@ -159,30 +159,20 @@ | |||
/* = KNOBS | |||
================================================ */ | |||
.mod-pedal-boxy{{{cns}}} .mod-control-group { | |||
margin:20px; | |||
margin:20px !important; | |||
position:relative; | |||
text-align:center; | |||
z-index:30; | |||
} | |||
.mod-pedal-boxy{{{cns}}} .top { | |||
margin-top:0px !important; | |||
} | |||
.mod-pedal-boxy{{{cns}}} .mod-control-group .mod-knob { | |||
overflow:hidden; | |||
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 { | |||
bottom:0px; | |||
display:block; | |||
@@ -199,47 +189,44 @@ | |||
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}}}); | |||
} | |||
.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; | |||
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 */ | |||
.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 { | |||
float:left; | |||
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-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, | |||
@@ -248,10 +235,19 @@ | |||
.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-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 */ | |||
@@ -269,10 +265,15 @@ | |||
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; | |||
} | |||
.mod-pedal-boxy{{{cns}}}.mod-four-knobs .mod-enumerated-group { | |||
width:250px; | |||
} | |||
.mod-pedal-boxy{{{cns}}} .mod-enumerated { | |||
background-position:right center; | |||
background-repeat:no-repeat; | |||
@@ -1062,4 +1063,3 @@ | |||
{ | |||
border-color:black; | |||
} | |||
@@ -49,11 +49,21 @@ protected: | |||
return "3BandEQ"; | |||
} | |||
const char* getDescription() const override | |||
{ | |||
return "3 Band Equalizer, stereo version."; | |||
} | |||
const char* getMaker() const noexcept override | |||
{ | |||
return "DISTRHO"; | |||
} | |||
const char* getHomePage() const override | |||
{ | |||
return "https://github.com/DISTRHO/Mini-Series"; | |||
} | |||
const char* getLicense() const noexcept override | |||
{ | |||
return "LGPL"; | |||
@@ -61,7 +71,7 @@ protected: | |||
uint32_t getVersion() const noexcept override | |||
{ | |||
return 0x1000; | |||
return d_version(1, 0, 0); | |||
} | |||
int64_t getUniqueId() const noexcept override | |||
@@ -17,8 +17,9 @@ | |||
#ifndef 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_IS_RT_SAFE 1 | |||
@@ -49,11 +49,21 @@ protected: | |||
return "3BandSplitter"; | |||
} | |||
const char* getDescription() const override | |||
{ | |||
return "3 Band Equalizer, splitted output version."; | |||
} | |||
const char* getMaker() const noexcept override | |||
{ | |||
return "DISTRHO"; | |||
} | |||
const char* getHomePage() const override | |||
{ | |||
return "https://github.com/DISTRHO/Mini-Series"; | |||
} | |||
const char* getLicense() const noexcept override | |||
{ | |||
return "LGPL"; | |||
@@ -61,7 +71,7 @@ protected: | |||
uint32_t getVersion() const noexcept override | |||
{ | |||
return 0x1000; | |||
return d_version(1, 0, 0); | |||
} | |||
int64_t getUniqueId() const noexcept override | |||
@@ -17,8 +17,9 @@ | |||
#ifndef 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_IS_RT_SAFE 1 | |||
@@ -62,7 +62,7 @@ void DistrhoPluginAmplitudeImposer::initAudioPort(bool input, uint32_t index, Au | |||
break; | |||
case 1: | |||
port.name = "Input Right (Amp Env)"; | |||
port.symbol = "in_left_amp"; | |||
port.symbol = "in_right_amp"; | |||
break; | |||
case 2: | |||
port.name = "Input Left (Audio)"; | |||
@@ -84,7 +84,7 @@ void DistrhoPluginAmplitudeImposer::initAudioPort(bool input, uint32_t index, Au | |||
break; | |||
case 1: | |||
port.name = "Output Right"; | |||
port.symbol = "out_left"; | |||
port.symbol = "out_right"; | |||
break; | |||
} | |||
} | |||
@@ -46,16 +46,32 @@ protected: | |||
// ------------------------------------------------------------------- | |||
// Information | |||
const char* getName() const noexcept override | |||
{ | |||
return "Amplitude Imposer"; | |||
} | |||
const char* getLabel() const noexcept override | |||
{ | |||
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 | |||
{ | |||
return "ndc Plugs"; | |||
} | |||
const char* getHomePage() const override | |||
{ | |||
return "https://github.com/DISTRHO/ndc-Plugs"; | |||
} | |||
const char* getLicense() const noexcept override | |||
{ | |||
return "MIT"; | |||
@@ -63,7 +79,7 @@ protected: | |||
uint32_t getVersion() const noexcept override | |||
{ | |||
return 0x1000; | |||
return d_version(0, 1, 0); | |||
} | |||
int64_t getUniqueId() const noexcept override | |||
@@ -25,8 +25,9 @@ | |||
#ifndef 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_IS_RT_SAFE 1 | |||
@@ -53,11 +53,22 @@ protected: | |||
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 | |||
{ | |||
return "ndc Plugs"; | |||
} | |||
const char* getHomePage() const override | |||
{ | |||
return "https://github.com/DISTRHO/ndc-Plugs"; | |||
} | |||
const char* getLicense() const noexcept override | |||
{ | |||
return "MIT"; | |||
@@ -65,7 +76,7 @@ protected: | |||
uint32_t getVersion() const noexcept override | |||
{ | |||
return 0x1000; | |||
return d_version(0, 1, 0); | |||
} | |||
int64_t getUniqueId() const noexcept override | |||
@@ -25,8 +25,9 @@ | |||
#ifndef 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_IS_RT_SAFE 1 | |||
@@ -17,8 +17,9 @@ | |||
#ifndef 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_IS_RT_SAFE 1 | |||
@@ -46,19 +46,29 @@ protected: | |||
return "Kars"; | |||
} | |||
const char* getDescription() const override | |||
{ | |||
return "Simple karplus-strong plucked string synth."; | |||
} | |||
const char* getMaker() const noexcept override | |||
{ | |||
return "falkTX"; | |||
} | |||
const char* getHomePage() const override | |||
{ | |||
return "https://github.com/DISTRHO/Kars"; | |||
} | |||
const char* getLicense() const noexcept override | |||
{ | |||
return "GPL v2+"; | |||
return "ISC"; | |||
} | |||
uint32_t getVersion() const noexcept override | |||
{ | |||
return 0x1000; | |||
return d_version(1, 0, 0); | |||
} | |||
int64_t getUniqueId() const noexcept override | |||
@@ -19,8 +19,9 @@ | |||
#ifndef 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_IS_RT_SAFE 1 | |||
@@ -40,11 +40,21 @@ protected: | |||
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 | |||
{ | |||
return "Martin Eastwood, falkTX"; | |||
} | |||
const char* getHomePage() const override | |||
{ | |||
return "https://github.com/DISTRHO/MVerb"; | |||
} | |||
const char* getLicense() const noexcept override | |||
{ | |||
return "GPL v3+"; | |||
@@ -52,7 +62,7 @@ protected: | |||
uint32_t getVersion() const noexcept override | |||
{ | |||
return 0x1000; | |||
return d_version(1, 0, 0); | |||
} | |||
int64_t getUniqueId() const noexcept override | |||
@@ -18,8 +18,9 @@ | |||
#ifndef 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_IS_RT_SAFE 1 | |||
@@ -57,11 +57,21 @@ protected: | |||
return "Nekobi"; | |||
} | |||
const char* getDescription() const override | |||
{ | |||
return "Simple single-oscillator synth based on the Roland TB-303."; | |||
} | |||
const char* getMaker() const noexcept override | |||
{ | |||
return "Sean Bolton, falkTX"; | |||
} | |||
const char* getHomePage() const override | |||
{ | |||
return "https://github.com/DISTRHO/Nekobi"; | |||
} | |||
const char* getLicense() const noexcept override | |||
{ | |||
return "GPL v2+"; | |||
@@ -69,7 +79,7 @@ protected: | |||
uint32_t getVersion() const noexcept override | |||
{ | |||
return 0x1000; | |||
return d_version(1, 0, 0); | |||
} | |||
int64_t getUniqueId() const noexcept override | |||
@@ -17,8 +17,9 @@ | |||
#ifndef 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_IS_RT_SAFE 1 | |||
@@ -45,11 +45,21 @@ protected: | |||
return "PingPongPan"; | |||
} | |||
const char* getDescription() const override | |||
{ | |||
return "Ping Pong Panning."; | |||
} | |||
const char* getMaker() const noexcept override | |||
{ | |||
return "DISTRHO"; | |||
} | |||
const char* getHomePage() const override | |||
{ | |||
return "https://github.com/DISTRHO/Mini-Series"; | |||
} | |||
const char* getLicense() const noexcept override | |||
{ | |||
return "LGPL"; | |||
@@ -57,7 +67,7 @@ protected: | |||
uint32_t getVersion() const noexcept override | |||
{ | |||
return 0x1000; | |||
return d_version(1, 0, 0); | |||
} | |||
int64_t getUniqueId() const noexcept override | |||
@@ -17,7 +17,8 @@ | |||
#ifndef 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_HAS_UI 1 | |||
@@ -43,11 +43,21 @@ protected: | |||
return "ProM"; | |||
} | |||
const char* getDescription() const override | |||
{ | |||
return "ProjectM visualizer."; | |||
} | |||
const char* getMaker() const noexcept override | |||
{ | |||
return "DISTRHO"; | |||
} | |||
const char* getHomePage() const override | |||
{ | |||
return "https://github.com/DISTRHO/ProM"; | |||
} | |||
const char* getLicense() const noexcept override | |||
{ | |||
return "LGPL"; | |||
@@ -55,7 +65,7 @@ protected: | |||
uint32_t getVersion() const noexcept override | |||
{ | |||
return 0x1000; | |||
return d_version(1, 0, 0); | |||
} | |||
int64_t getUniqueId() const noexcept override | |||
@@ -25,8 +25,9 @@ | |||
#ifndef 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_IS_RT_SAFE 1 | |||
@@ -66,11 +66,22 @@ protected: | |||
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 | |||
{ | |||
return "ndc Plugs"; | |||
} | |||
const char* getHomePage() const override | |||
{ | |||
return "https://github.com/DISTRHO/ndc-Plugs"; | |||
} | |||
const char* getLicense() const noexcept override | |||
{ | |||
return "MIT"; | |||
@@ -78,7 +89,7 @@ protected: | |||
uint32_t getVersion() const noexcept override | |||
{ | |||
return 0x1000; | |||
return d_version(0, 1, 0); | |||
} | |||
int64_t getUniqueId() const noexcept override | |||