@@ -6,6 +6,54 @@ | |||||
namespace rack { | namespace rack { | ||||
enum ModelTag { | |||||
AMPLIFIER_TAG, | |||||
ATTENUATOR_TAG, | |||||
BLANK_TAG, | |||||
CLOCK_TAG, | |||||
CONTROLLER_TAG, | |||||
DELAY_TAG, | |||||
DIGITAL_TAG, | |||||
DISTORTION_TAG, | |||||
DRUM_TAG, | |||||
DUAL_TAG, | |||||
DYNAMICS_TAG, | |||||
EFFECT_TAG, | |||||
ENVELOPE_FOLLOWER_TAG, | |||||
ENVELOPE_GENERATOR_TAG, | |||||
EQUALIZER_TAG, | |||||
EXTERNAL_TAG, | |||||
FILTER_TAG, | |||||
FUNCTION_GENERATOR_TAG, | |||||
GRANULAR_TAG, | |||||
LFO_TAG, | |||||
LOGIC_TAG, | |||||
LOW_PASS_GATE_TAG, | |||||
MIDI_TAG, | |||||
MIXER_TAG, | |||||
MULTIPLE_TAG, | |||||
NOISE_TAG, | |||||
OSCILLATOR_TAG, | |||||
PANNING_TAG, | |||||
QUAD_TAG, | |||||
QUANTIZER_TAG, | |||||
RANDOM_TAG, | |||||
REVERB_TAG, | |||||
RING_MODULATOR_TAG, | |||||
SAMPLE_AND_HOLD_TAG, | |||||
SAMPLER_TAG, | |||||
SEQUENCER_TAG, | |||||
SLEW_LIMITER_TAG, | |||||
SWITCH_TAG, | |||||
SYNTH_VOICE_TAG, | |||||
TUNER_TAG, | |||||
UTILITY_TAG, | |||||
VISUAL_TAG, | |||||
WAVESHAPER_TAG, | |||||
NUM_TAGS | |||||
}; | |||||
struct ModuleWidget; | struct ModuleWidget; | ||||
struct Model; | struct Model; | ||||
@@ -40,14 +88,13 @@ struct Model { | |||||
std::string manufacturerSlug; | std::string manufacturerSlug; | ||||
/** Human readable name for the manufacturer, e.g. "Foo Modular" */ | /** Human readable name for the manufacturer, e.g. "Foo Modular" */ | ||||
std::string manufacturerName; | std::string manufacturerName; | ||||
/** List of tags representing the function(s) of the module */ | |||||
std::list<ModelTag> tags; | |||||
virtual ~Model() {} | virtual ~Model() {} | ||||
virtual ModuleWidget *createModuleWidget() { return NULL; } | virtual ModuleWidget *createModuleWidget() { return NULL; } | ||||
}; | }; | ||||
extern std::list<Plugin*> gPlugins; | |||||
extern std::string gToken; | |||||
void pluginInit(); | void pluginInit(); | ||||
void pluginDestroy(); | void pluginDestroy(); | ||||
void pluginLogIn(std::string email, std::string password); | void pluginLogIn(std::string email, std::string password); | ||||
@@ -60,6 +107,12 @@ float pluginGetDownloadProgress(); | |||||
std::string pluginGetDownloadName(); | std::string pluginGetDownloadName(); | ||||
std::string pluginGetLoginStatus(); | std::string pluginGetLoginStatus(); | ||||
extern std::list<Plugin*> gPlugins; | |||||
extern std::string gToken; | |||||
extern std::string gTagNames[NUM_TAGS]; | |||||
} // namespace rack | } // namespace rack | ||||
@@ -18,8 +18,8 @@ namespace rack { | |||||
//////////////////// | //////////////////// | ||||
template <class TModuleWidget> | |||||
Model *createModel(std::string manufacturerSlug, std::string manufacturerName, std::string slug, std::string name) { | |||||
template <class TModuleWidget, typename... Tags> | |||||
Model *createModel(std::string manufacturerSlug, std::string manufacturerName, std::string slug, std::string name, Tags... tags) { | |||||
struct TModel : Model { | struct TModel : Model { | ||||
ModuleWidget *createModuleWidget() override { | ModuleWidget *createModuleWidget() override { | ||||
ModuleWidget *moduleWidget = new TModuleWidget(); | ModuleWidget *moduleWidget = new TModuleWidget(); | ||||
@@ -32,6 +32,7 @@ Model *createModel(std::string manufacturerSlug, std::string manufacturerName, s | |||||
model->name = name; | model->name = name; | ||||
model->manufacturerSlug = manufacturerSlug; | model->manufacturerSlug = manufacturerSlug; | ||||
model->manufacturerName = manufacturerName; | model->manufacturerName = manufacturerName; | ||||
model->tags = {tags...}; | |||||
return model; | return model; | ||||
} | } | ||||
@@ -3,15 +3,15 @@ | |||||
void init(rack::Plugin *p) { | void init(rack::Plugin *p) { | ||||
p->slug = "Core"; | p->slug = "Core"; | ||||
p->addModel(createModel<AudioInterfaceWidget>("Core", "Core", "AudioInterface", "Audio Interface")); | |||||
p->addModel(createModel<MidiToCVWidget>("Core", "Core", "MIDIToCVInterface", "MIDI-to-CV Interface")); | |||||
p->addModel(createModel<AudioInterfaceWidget>("Core", "Core", "AudioInterface", "Audio Interface", EXTERNAL_TAG)); | |||||
p->addModel(createModel<MidiToCVWidget>("Core", "Core", "MIDIToCVInterface", "MIDI-to-CV Interface", MIDI_TAG, EXTERNAL_TAG)); | |||||
p->addModel(createModel<MIDICCToCVWidget>("Core", "Core", "MIDICCToCVInterface", "MIDI CC-to-CV Interface")); | |||||
p->addModel(createModel<MIDIClockToCVWidget>("Core", "Core", "MIDIClockToCVInterface", "MIDI Clock-to-CV Interface")); | |||||
p->addModel(createModel<MIDITriggerToCVWidget>("Core", "Core", "MIDITriggerToCVInterface", "MIDI Trigger-to-CV Interface")); | |||||
p->addModel(createModel<QuadMidiToCVWidget>("Core", "Core", "QuadMIDIToCVInterface", "Quad MIDI-to-CV Interface")); | |||||
p->addModel(createModel<MIDICCToCVWidget>("Core", "Core", "MIDICCToCVInterface", "MIDI CC-to-CV Interface", MIDI_TAG, EXTERNAL_TAG)); | |||||
p->addModel(createModel<MIDIClockToCVWidget>("Core", "Core", "MIDIClockToCVInterface", "MIDI Clock-to-CV Interface", MIDI_TAG, EXTERNAL_TAG, CLOCK_TAG)); | |||||
p->addModel(createModel<MIDITriggerToCVWidget>("Core", "Core", "MIDITriggerToCVInterface", "MIDI Trigger-to-CV Interface", MIDI_TAG, EXTERNAL_TAG)); | |||||
p->addModel(createModel<QuadMidiToCVWidget>("Core", "Core", "QuadMIDIToCVInterface", "Quad MIDI-to-CV Interface", MIDI_TAG, EXTERNAL_TAG, QUAD_TAG)); | |||||
// p->addModel(createModel<BridgeWidget>("Core", "Core", "Bridge", "Bridge")); | // p->addModel(createModel<BridgeWidget>("Core", "Core", "Bridge", "Bridge")); | ||||
p->addModel(createModel<BlankWidget>("Core", "Core", "Blank", "Blank")); | |||||
p->addModel(createModel<NotesWidget>("Core", "Core", "Notes", "Notes")); | |||||
p->addModel(createModel<BlankWidget>("Core", "Core", "Blank", "Blank", BLANK_TAG)); | |||||
p->addModel(createModel<NotesWidget>("Core", "Core", "Notes", "Notes", BLANK_TAG)); | |||||
} | } |
@@ -31,13 +31,59 @@ namespace rack { | |||||
std::list<Plugin*> gPlugins; | std::list<Plugin*> gPlugins; | ||||
std::string gToken; | std::string gToken; | ||||
std::string gTagNames[NUM_TAGS] = { | |||||
"Amplifier/VCA", | |||||
"Attenuator", | |||||
"Blank", | |||||
"Clock", | |||||
"Controller", | |||||
"Delay", | |||||
"Digital", | |||||
"Distortion", | |||||
"Drum", | |||||
"Dual/Stereo", | |||||
"Dynamics", | |||||
"Effect", | |||||
"Envelope Follower", | |||||
"Envelope Generator", | |||||
"Equalizer", | |||||
"External", | |||||
"Filter/VCF", | |||||
"Function Generator", | |||||
"Granular", | |||||
"LFO", | |||||
"Logic", | |||||
"Low Pass Gate", | |||||
"MIDI", | |||||
"Mixer", | |||||
"Multiple", | |||||
"Noise", | |||||
"Oscillator/VCO", | |||||
"Panning", | |||||
"Quad", | |||||
"Quantizer", | |||||
"Random", | |||||
"Reverb", | |||||
"Ring Modulator", | |||||
"Sample and Hold", | |||||
"Sampler", | |||||
"Sequencer", | |||||
"Slew Limiter", | |||||
"Switch", | |||||
"Synth Voice", | |||||
"Tuner", | |||||
"Utility", | |||||
"Visual", | |||||
"Waveshaper", | |||||
}; | |||||
static bool isDownloading = false; | static bool isDownloading = false; | ||||
static float downloadProgress = 0.0; | static float downloadProgress = 0.0; | ||||
static std::string downloadName; | static std::string downloadName; | ||||
static std::string loginStatus; | static std::string loginStatus; | ||||
Plugin::~Plugin() { | Plugin::~Plugin() { | ||||
for (Model *model : models) { | for (Model *model : models) { | ||||
delete model; | delete model; | ||||