String LoadSave::getLicense(var state) { if (!state.isObject()) return ""; DynamicObject* object_state = state.getDynamicObject(); NamedValueSet properties = object_state->getProperties(); if (properties.contains("license")) return properties["license"]; return ""; }
void LoadSave::loadSaveState(std::map<std::string, String>& state, const NamedValueSet& properties) { if (properties.contains("author")) state["author"] = properties["author"]; if (properties.contains("patch_name")) state["patch_name"] = properties["patch_name"]; if (properties.contains("folder_name")) state["folder_name"] = properties["folder_name"]; }
void LoadSave::loadControls(SynthBase* synth, const NamedValueSet& properties) { mopo::control_map controls = synth->getControls(); for (auto control : controls) { String name = control.first; if (properties.contains(name)) { mopo::mopo_float value = properties[name]; control.second->set(value); } else { mopo::ValueDetails details = mopo::Parameters::getDetails(name.toStdString()); control.second->set(details.default_value); } } }
void LoadSave::loadControls(mopo::HelmEngine* synth, const CriticalSection& critical_section, const NamedValueSet& properties) { ScopedLock lock(critical_section); mopo::control_map controls = synth->getControls(); for (auto control : controls) { String name = control.first; if (properties.contains(name)) { mopo::mopo_float value = properties[name]; control.second->set(value); } else { mopo::ValueDetails details = mopo::Parameters::getDetails(name.toStdString()); control.second->set(details.default_value); } } }
void LoadSave::varToState(SynthBase* synth, std::map<std::string, String>& save_info, var state) { if (!state.isObject()) return; DynamicObject* object_state = state.getDynamicObject(); NamedValueSet properties = object_state->getProperties(); // Version 0.4.1 was the last build before we saved the version number. String version = "0.4.1"; if (properties.contains("synth_version")) version = properties["synth_version"]; // After 0.4.1 there was a patch file restructure. if (compareVersionStrings(version, "0.4.1") <= 0) { NamedValueSet new_properties; new_properties.set("settings", object_state); properties = new_properties; } var settings = properties["settings"]; DynamicObject* settings_object = settings.getDynamicObject(); NamedValueSet settings_properties = settings_object->getProperties(); Array<var>* modulations = settings_properties["modulations"].getArray(); // After 0.5.0 mixer was added and osc_mix was removed. And scaling of oscillators was changed. if (compareVersionStrings(version, "0.5.0") <= 0) { // Fix control control values. if (settings_properties.contains("osc_mix")) { mopo::mopo_float osc_mix = settings_properties["osc_mix"]; settings_properties.set("osc_1_volume", sqrt(1.0f - osc_mix)); settings_properties.set("osc_2_volume", sqrt(osc_mix)); settings_properties.remove("osc_mix"); } // Fix modulation routing. var* modulation = modulations->begin(); Array<var> old_modulations; Array<DynamicObject*> new_modulations; for (; modulation != modulations->end(); ++modulation) { DynamicObject* mod = modulation->getDynamicObject(); String destination = mod->getProperty("destination").toString(); if (destination == "osc_mix") { String source = mod->getProperty("source").toString(); mopo::mopo_float amount = mod->getProperty("amount"); old_modulations.add(mod); DynamicObject* osc_1_mod = new DynamicObject(); osc_1_mod->setProperty("source", source); osc_1_mod->setProperty("destination", "osc_1_volume"); osc_1_mod->setProperty("amount", -amount); new_modulations.add(osc_1_mod); DynamicObject* osc_2_mod = new DynamicObject(); osc_2_mod->setProperty("source", source); osc_2_mod->setProperty("destination", "osc_2_volume"); osc_2_mod->setProperty("amount", amount); new_modulations.add(osc_2_mod); } } for (var old_modulation : old_modulations) modulations->removeFirstMatchingValue(old_modulation); for (DynamicObject* modulation : new_modulations) modulations->add(modulation); } if (compareVersionStrings(version, "0.7.2") <= 0) { bool stutter_on = settings_properties["stutter_on"]; if (stutter_on) { settings_properties.set("stutter_resample_sync", 0); settings_properties.set("stutter_sync", 0); } } loadControls(synth, settings_properties); loadModulations(synth, modulations); loadSaveState(save_info, properties); }