void LinExpSignalUGenInternalK::processBlock(bool& shouldDelete, const unsigned int blockID, const int channel) throw() { int numSamplesToProcess = uGenOutput.getBlockSize(); float* outputSamples = uGenOutput.getSampleData(); float* inputSamples = inputs[Input].processBlock(shouldDelete, blockID, channel); float* inLowSamples = inputs[InLow].processBlock(shouldDelete, blockID, channel); float* inHighSamples = inputs[InHigh].processBlock(shouldDelete, blockID, channel); float* outLowSamples = inputs[OutLow].processBlock(shouldDelete, blockID, channel); float* outHighSamples = inputs[OutHigh].processBlock(shouldDelete, blockID, channel); const int krBlockSize = UGen::getControlRateBlockSize(); unsigned int blockPosition = blockID % krBlockSize; int numKrSamples = blockPosition % krBlockSize; while(numSamplesToProcess > 0) { float nextValue = value; if(numKrSamples == 0) { nextValue = linexp(*inputSamples, *inLowSamples, *inHighSamples, *outLowSamples, *outHighSamples); } numKrSamples = krBlockSize - numKrSamples; blockPosition += numKrSamples; inputSamples += numKrSamples; inLowSamples += numKrSamples; inHighSamples += numKrSamples; outLowSamples += numKrSamples; outHighSamples += numKrSamples; if(nextValue == value) { while(numSamplesToProcess && numKrSamples) { *outputSamples++ = nextValue; --numSamplesToProcess; --numKrSamples; } } else { float valueSlope = (nextValue - value) / (float)UGen::getControlRateBlockSize(); while(numSamplesToProcess && numKrSamples) { *outputSamples++ = value; value += valueSlope; --numSamplesToProcess; --numKrSamples; } value = nextValue; } } }
float UGenPlugin::getMappedParameter(int index) { if(getParameterWarp(index)) { return linexp(getParameter(index), 0.f, 1.f, getParameterMin(index), getParameterMax(index)); } else { return linlin(getParameter(index), 0.f, 1.f, getParameterMin(index), getParameterMax(index)); } }
void LinExpSignalUGenInternal::processBlock(bool& shouldDelete, const unsigned int blockID, const int channel) throw() { int numSamplesToProcess = uGenOutput.getBlockSize(); float* outputSamples = uGenOutput.getSampleData(); float* inputSamples = inputs[Input].processBlock(shouldDelete, blockID, channel); float* inLowSamples = inputs[InLow].processBlock(shouldDelete, blockID, channel); float* inHighSamples = inputs[InHigh].processBlock(shouldDelete, blockID, channel); float* outLowSamples = inputs[OutLow].processBlock(shouldDelete, blockID, channel); float* outHighSamples = inputs[OutHigh].processBlock(shouldDelete, blockID, channel); while(numSamplesToProcess--) { *outputSamples++ = linexp(*inputSamples++, *inLowSamples++, *inHighSamples++, *outLowSamples++, *outHighSamples++); } }