void MLPluginProcessor::setDefaultParameters() { if (mEngine.getCompileStatus() == MLProc::OK) { // set default for each parameter. const unsigned numParams = getNumParameters(); for(unsigned i=0; i<numParams; ++i) { MLPublishedParamPtr paramPtr = getParameterPtr(i); MLSymbol paramType = paramPtr->getType(); if(paramType == "float") { float defaultVal = getParameterDefaultValue(i); setPropertyImmediate(getParameterAlias(i), defaultVal); } else if (paramType == "string") { // unimplemented } else if (paramType == "signal") { const MLProperty& p = getProperty(getParameterAlias(i)); if (p.getType() == MLProperty::kSignalProperty) { // TODO set up defaults for signal params once we are loading from JSON // right now we clear to zero MLSignal defaultSignal(p.getSignalValue()); defaultSignal.clear(); setPropertyImmediate(getParameterAlias(i), defaultSignal); } } } } }
// set scalar float plugin parameter by index. Typically called by the host wrapper. // The Property must propagate to other Listeners, but not back to us. // void MLPluginProcessor::setParameter (int index, float newValue) { if (index < 0) return; mEngine.setPublishedParam(index, MLProperty(newValue)); mHasParametersSet = true; setPropertyImmediateExcludingListener(getParameterAlias(index), newValue, this); }
// set plugin parameter by index. Typically called by the host wrapper // void MLPluginProcessor::setParameter (int index, float newValue) { if (index < 0) return; mEngine.setPublishedParam(index, newValue); mHasParametersSet = true; setPropertyImmediate(getParameterAlias(index), newValue); }
// set default value for each scalar parameter. needed before loading // patches, which are only required to store differences from these // default values. void MLPluginProcessor::setDefaultParameters() { if (mEngine.getCompileStatus() == MLProc::OK) { // set default for each parameter. const unsigned numParams = getNumParameters(); for(unsigned i=0; i<numParams; ++i) { float defaultVal = getParameterDefault(i); setPropertyImmediate(getParameterAlias(i), defaultVal); } } }
// for VST wrapper. void MLPluginProcessor::setParameterAsLinearProportion (int index, float newValue) { if (index < 0) return; MLPublishedParamPtr p = mEngine.getParamPtr(index); if(p) { p->setValueAsLinearProportion(newValue); mEngine.setPublishedParam(index, p->getValue()); mHasParametersSet = true; // set MLModel Parameter MLSymbol paramName = getParameterAlias(index); float realVal = mEngine.getParamByIndex(index); setPropertyImmediate(paramName, realVal); } }
void MLPluginProcessor::getStateAsXML (XmlElement& xml) { if( !(mEngine.getCompileStatus() == MLProc::OK)) return; #if DEMO xml.setAttribute ("pluginVersion", JucePlugin_VersionCode); xml.setAttribute ("presetName", String("----")); #else const unsigned numParams = getNumParameters(); // TODO use string properties of model instead of these JUCE strings. // also move to JSON. xml.setAttribute ("pluginVersion", JucePlugin_VersionCode); xml.setAttribute ("presetName", String(getStringProperty("preset").c_str())); xml.setAttribute ("scaleName", String(getStringProperty("key_scale").c_str())); // store parameter values to xml as a bunch of attributes. // not XML best practice in general but takes fewer characters. for(unsigned i=0; i<numParams; ++i) { const String paramName = symbolToXMLAttr(getParameterAlias(i)); const float defaultVal = getParameterDefault(i); const float paramVal = getParameter(i); if (paramVal != defaultVal) { xml.setAttribute(paramName, paramVal); //debug() << "setting XML param " << paramName << " to " << paramVal << "\n"; } } // store patcher info to xml { MLProcList patchers = getPatcherList(); if (!patchers.empty()) { MLProcPatcher& firstPatcher = static_cast<MLProcPatcher&>(**patchers.begin()); const int inputs = firstPatcher.getParam("inputs"); const int outputs = firstPatcher.getParam("outputs"); String outStr; String patcherInput = "patcher_input_"; for(unsigned i=1; i<=inputs; ++i) { bool differentFromDefault = false; outStr = ""; for(unsigned j=1; j<=outputs; ++j) { if (firstPatcher.getConnection(i, j)) { outStr += "1"; differentFromDefault = true; } else { outStr += "0"; } } if(differentFromDefault) { String outNum (i); xml.setAttribute(patcherInput + outNum, outStr); } } } } // store editor state to XML if one exists MLPluginEditor* pEditor = static_cast<MLPluginEditor*>(getActiveEditor()); if(pEditor) { MLRect r = pEditor->getWindowBounds(); xml.setAttribute("editor_x", r.x()); xml.setAttribute("editor_y", r.y()); xml.setAttribute("editor_width", r.getWidth()); xml.setAttribute("editor_height", r.getHeight()); xml.setAttribute("editor_num", getFloatProperty("patch_num")); xml.setAttribute("editor_anim", getFloatProperty("patch_anim")); } // save blob as most recently saved state mpLatestStateLoaded = XmlElementPtr(new XmlElement(xml)); #endif }