void EnvGenUGenInternal::processBlock(bool& shouldDelete, const unsigned int blockID, const int channel) throw() { int numSamplesToProcess = uGenOutput.getBlockSize(); float* outputSamples = uGenOutput.getSampleData(); if(isStealing() == false && shouldSteal() == true) { setIsStealing(); const int numLevels = env_.getLevels().size(); float stealValue = (float)currentValue; float targetValue = env_.getLevels().getSampleUnchecked(numLevels-1); float inc = (targetValue - stealValue) / (float)numSamplesToProcess; while(numSamplesToProcess) { *outputSamples++ = stealValue; stealValue += inc; --numSamplesToProcess; } shouldDelete = shouldDelete ? true : shouldDeleteValue; currentValue = targetValue; currentCurve = EnvCurve(EnvCurve::Empty); setIsDone(); } else { if(isReleasing() == false && shouldRelease() == true) { int releaseNode = env_.getReleaseNode(); if(releaseNode >= 0) // try this, - don't release if releaseNode is -1 { setSegment(releaseNode, UGen::getSampleRate()); } } while(numSamplesToProcess && isDone() == false) { int samplesThisTime = min(stepsUntilTarget, numSamplesToProcess); numSamplesToProcess -= samplesThisTime; stepsUntilTarget -= samplesThisTime; // select from different curves here..., use a different loop switch(currentCurve.getType()) { case EnvCurve::Numerical: while(samplesThisTime) { *outputSamples++ = (float)currentValue; b1 *= grow; currentValue = a2 - b1; --samplesThisTime; } break; case EnvCurve::Linear: while(samplesThisTime) { *outputSamples++ = (float)currentValue; currentValue += grow; --samplesThisTime; } break; case EnvCurve::Exponential: while(samplesThisTime) { *outputSamples++ = (float)currentValue; currentValue *= grow; --samplesThisTime; } break; case EnvCurve::Sine: while(samplesThisTime) { *outputSamples++ = (float)currentValue; double y0 = b1 * y1 - y2; currentValue = a2 - y0; y2 = y1; y1 = y0; --samplesThisTime; } break; case EnvCurve::Welch: while(samplesThisTime) { *outputSamples++ = (float)currentValue; double y0 = b1 * y1 - y2; currentValue = a2 + y0; y2 = y1; y1 = y0; --samplesThisTime; } break; case EnvCurve::Empty: case EnvCurve::Step: default: while(samplesThisTime) { *outputSamples++ = (float)currentValue; --samplesThisTime; } } if(stepsUntilTarget <= 0) { if(setSegment(currentSegment + 1, UGen::getSampleRate()) == true) { shouldDelete = shouldDelete ? true : shouldDeleteValue; const int numLevels = env_.getLevels().size(); currentValue = env_.getLevels().getSampleUnchecked(numLevels-1); currentCurve = EnvCurve(EnvCurve::Empty); goto exit; } } } } while(numSamplesToProcess--) { *outputSamples++ = (float)currentValue; } return; exit: while(numSamplesToProcess--) { *outputSamples++ = (float)currentValue; } setIsDone(); sendDoneInternal(); }
void LoopPointsUGenInternal::prepareForBlock(const int /*actualBlockSize*/, const unsigned int /*blockID*/, const int /*channel*/) throw() { senderUserData = userData; if(isDone()) sendDoneInternal(); }
void ASRUGenInternal::prepareForBlock(const int actualBlockSize, const unsigned int blockID, const int channel) throw() { senderUserData = userData; if(isDone()) sendDoneInternal(); }