| @@ -6,6 +6,54 @@ | |||
| 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 Model; | |||
| @@ -40,14 +88,13 @@ struct Model { | |||
| std::string manufacturerSlug; | |||
| /** Human readable name for the manufacturer, e.g. "Foo Modular" */ | |||
| std::string manufacturerName; | |||
| /** List of tags representing the function(s) of the module */ | |||
| std::list<ModelTag> tags; | |||
| virtual ~Model() {} | |||
| virtual ModuleWidget *createModuleWidget() { return NULL; } | |||
| }; | |||
| extern std::list<Plugin*> gPlugins; | |||
| extern std::string gToken; | |||
| void pluginInit(); | |||
| void pluginDestroy(); | |||
| void pluginLogIn(std::string email, std::string password); | |||
| @@ -60,6 +107,12 @@ float pluginGetDownloadProgress(); | |||
| std::string pluginGetDownloadName(); | |||
| std::string pluginGetLoginStatus(); | |||
| extern std::list<Plugin*> gPlugins; | |||
| extern std::string gToken; | |||
| extern std::string gTagNames[NUM_TAGS]; | |||
| } // 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 { | |||
| ModuleWidget *createModuleWidget() override { | |||
| ModuleWidget *moduleWidget = new TModuleWidget(); | |||
| @@ -32,6 +32,7 @@ Model *createModel(std::string manufacturerSlug, std::string manufacturerName, s | |||
| model->name = name; | |||
| model->manufacturerSlug = manufacturerSlug; | |||
| model->manufacturerName = manufacturerName; | |||
| model->tags = {tags...}; | |||
| return model; | |||
| } | |||
| @@ -3,15 +3,15 @@ | |||
| void init(rack::Plugin *p) { | |||
| 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<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::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 float downloadProgress = 0.0; | |||
| static std::string downloadName; | |||
| static std::string loginStatus; | |||
| Plugin::~Plugin() { | |||
| for (Model *model : models) { | |||
| delete model; | |||