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); } } } } }
void MLPluginProcessor::doPropertyChangeAction(MLSymbol property, const MLProperty& newVal) { int propertyType = newVal.getType(); int paramIdx = getParameterIndex(property); float f = newVal.getFloatValue(); switch(propertyType) { case MLProperty::kFloatProperty: setParameterWithoutProperty (property, f); if (paramIdx < 0) return; // convert to host units for VST f = newVal.getFloatValue(); if (wrapperType == AudioProcessor::wrapperType_VST) { MLPublishedParamPtr p = mEngine.getParamPtr(paramIdx); if(p) { f = p->getValueAsLinearProportion(); } } // send to wrapper in host units AudioProcessor::sendParamChangeMessageToListeners (paramIdx, f); break; case MLProperty::kStringProperty: break; case MLProperty::kSignalProperty: break; default: break; } }
void MLPluginProcessor::doPropertyChangeAction(MLSymbol propName, const MLProperty& newVal) { int propertyType = newVal.getType(); int paramIdx = getParameterIndex(propName); if (paramIdx < 0) return; float f = newVal.getFloatValue(); switch(propertyType) { case MLProperty::kFloatProperty: { // update DSP engine parameters MLPublishedParamPtr p = mEngine.getParamPtr(paramIdx); if(p) { // set published float parameter in DSP engine. setParameterWithoutProperty (propName, f); // convert to host units for VST f = newVal.getFloatValue(); if (wrapperType == AudioProcessor::wrapperType_VST) { f = p->getValueAsLinearProportion(); } // either enqueue change, or send change immediately to host wrapper if(p->getNeedsQueue()) { p->pushValue(f); } else { AudioProcessor::sendParamChangeMessageToListeners (paramIdx, f); } } } break; case MLProperty::kStringProperty: { // set published string parameter in DSP engine. const std::string& sigVal = newVal.getStringValue(); setStringParameterWithoutProperty (propName, sigVal); } break; case MLProperty::kSignalProperty: { // set published signal parameter in DSP engine. const MLSignal& sigVal = newVal.getSignalValue(); setSignalParameterWithoutProperty (propName, sigVal); } break; default: break; } }
// for VST wrapper. float MLPluginProcessor::getParameterAsLinearProportion (int index) { float r = 0; if (index < 0) return(0); MLPublishedParamPtr p = mEngine.getParamPtr(index); if(p) { r = p->getValueAsLinearProportion(); } return r; }
// 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); } }
MLButton* MLPluginView::addToggleButton(const char * displayName, const MLRect & r, const char * paramName, const Colour& color, const float sizeMultiplier) { MLButton* b = MLAppView::addToggleButton(displayName, r, paramName, color, sizeMultiplier); MLPluginProcessor* const filter = getProcessor(); int idx = filter->getParameterIndex(paramName); if (idx >= 0) { MLPublishedParamPtr p = filter->getParameterPtr(idx); if (p) { b->setToggleValues(p->getRangeLo(), p->getRangeHi()); } } else { debug() << "MLPluginView::addToggleButton: parameter " << paramName << " not found!\n"; } return b; }
MLMultiSlider* MLPluginView::addMultiSlider(const char * displayName, const MLRect & r, const MLSymbol paramName, int numSliders, const Colour& color) { MLMultiSlider* dial = MLAppView::addMultiSlider(displayName, r, paramName, numSliders, color); MLPluginProcessor* const filter = getProcessor(); if(filter) { int paramIdx = filter->getParameterIndex(paramName.withFinalNumber(0)); if (paramIdx >= 0) { MLPublishedParamPtr p = filter->getParameterPtr(paramIdx); if (p) { dial->setRange(p->getRangeLo(), p->getRangeHi(), p->getInterval()); } } else { debug() << "MLPluginView::addMultiSlider: parameter " << paramName << " not found!\n"; } } return dial; }
MLDial* MLPluginView::addDial(const char * displayName, const MLRect & r, const MLSymbol paramName, const Colour& color) { MLDial* dial = MLAppView::addDial(displayName, r, paramName, color); // setup dial properties based on the filter parameter MLPluginProcessor* const filter = getProcessor(); int idx = filter->getParameterIndex(paramName); if (idx >= 0) { MLPublishedParamPtr p = filter->getParameterPtr(idx); if (p) { dial->setRange(p->getRangeLo(), p->getRangeHi(), p->getInterval(), p->getZeroThresh(), p->getWarpMode()); dial->setDoubleClickReturnValue(true, p->getDefault()); } } else { debug() << "MLPluginView::addDial: parameter " << paramName << " not found!\n"; } return dial; }
void MLParamGroupMap::addParamToCurrentGroup(MLPublishedParamPtr p) { p->setGroupIndex(mCurrentGroup); }
void MLPluginProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) { if (mEngine.isEnabled() && !isSuspended()) { unsigned samples = buffer.getNumSamples(); // get current time from host. // should refer to the start of the current block. AudioPlayHead::CurrentPositionInfo newTime; if (getPlayHead() != 0 && getPlayHead()->getCurrentPosition (newTime)) { lastPosInfo = newTime; } else { lastPosInfo.resetToDefault(); } // set host phasor double bpm = lastPosInfo.isPlaying ? lastPosInfo.bpm : 0.; double ppqPosition = lastPosInfo.ppqPosition; double secsPosition = lastPosInfo.timeInSeconds; int64 samplesPosition = lastPosInfo.timeInSamples; bool isPlaying = lastPosInfo.isPlaying; // TEST if(0) if(lastPosInfo.isPlaying) { debug() << "bpm:" << lastPosInfo.bpm << " ppq:" << std::setprecision(5) << ppqPosition << std::setprecision(2) << " secs:" << secsPosition << "\n"; } // set Engine I/O. done here each time because JUCE may change pointers on us. possibly. MLDSPEngine::ClientIOMap ioMap; for (int i=0; i<getNumInputChannels(); ++i) { ioMap.inputs[i] = buffer.getReadPointer(i); } for (int i=0; i<getNumOutputChannels(); ++i) { ioMap.outputs[i] = buffer.getWritePointer(i); } mEngine.setIOBuffers(ioMap); // for any parameters with queues, send out one queued value per block for(int i = 0; i < mEngine.getPublishedParams(); ++i) { MLPublishedParamPtr p = mEngine.getParamPtr(i); if(p) // TODO clean up null paramater ptrs! { if(p->getQueueValuesRemaining() > 0) { AudioProcessor::sendParamChangeMessageToListeners (i, p->popValue()); } } } if(acceptsMidi()) { convertMIDIToEvents(midiMessages, mControlEvents); midiMessages.clear(); // otherwise messages will be passed back to the host } mEngine.processBlock(samples, mControlEvents, samplesPosition, secsPosition, ppqPosition, bpm, isPlaying); } else { buffer.clear(); } }