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);
	}
}
Exemple #6
0
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;
}
Exemple #7
0
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;
}
Exemple #8
0
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;
}
Exemple #9
0
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();
	}
}