41 startValue = endValue = 0.;
42 transitionStart = transitionEnd = 0;
45 bool IsNonzero()
const
47 return (startValue != 0.) || (endValue != 0.);
54 void Write(
float* buffer,
int startIdx,
int nFrames)
56 float val =
static_cast<float>(startValue);
57 float dv =
static_cast<float>((endValue - startValue)/(transitionEnd - transitionStart));
59 for(
int i=startIdx; i<startIdx + transitionStart; ++i)
63 for(
int i=startIdx + transitionStart; i<startIdx + transitionEnd; ++i)
68 for(
int i=startIdx + transitionEnd; i<startIdx + nFrames; ++i)
75 using RampArray = std::array<ControlRamp, N>;
83 using RampArray = ControlRamp::RampArray<N>;
86 using ProcessorArray = std::array<ControlRampProcessor, N>;
95 void Process(
int blockSize)
98 mpOutput.startValue = mpOutput.endValue;
100 if(mSamplesRemaining)
102 if(mSamplesRemaining == mGlideSamples)
105 if(mSamplesRemaining > blockSize)
108 int glideStartSamples = blockSize - mStartOffset;
109 mpOutput.endValue = mpOutput.startValue + glideStartSamples*mChangePerSample;
110 mpOutput.transitionStart = mStartOffset;
111 mpOutput.transitionEnd = blockSize;
112 mSamplesRemaining -= glideStartSamples;
117 mpOutput.endValue = mTargetValue;
118 mpOutput.transitionStart = mStartOffset;
119 mpOutput.transitionEnd = mStartOffset + mGlideSamples;
120 mSamplesRemaining = 0;
123 else if(mSamplesRemaining > blockSize)
126 mpOutput.endValue = mpOutput.startValue + mChangePerSample*blockSize;
127 mpOutput.transitionStart = 0;
128 mpOutput.transitionEnd = blockSize;
129 mSamplesRemaining -= blockSize;
134 mpOutput.endValue = mTargetValue;
135 mpOutput.transitionStart = 0;
136 mpOutput.transitionEnd = mSamplesRemaining;
137 mSamplesRemaining = 0;
143 void SetTarget(
double targetValue,
int startOffset,
int glideSamples,
int blockSize)
145 mTargetValue = targetValue;
146 if(glideSamples < 1) glideSamples = 1;
147 mGlideSamples = glideSamples;
148 mSamplesRemaining = glideSamples;
149 mChangePerSample = (targetValue - mpOutput.endValue)/glideSamples;
150 mStartOffset = startOffset;
155 static ProcessorArray<N>* Create(RampArray<N>& inputs)
157 return CreateImpl<N>(inputs, std::make_index_sequence<N>());
162 template<
size_t N,
size_t ...Is>
163 static ProcessorArray<N>* CreateImpl(RampArray<N>& inputs, std::index_sequence<Is...>)
165 return new ProcessorArray<N>{std::ref(inputs[Is]).get()...};
169 double mTargetValue {0.};
170 double mChangePerSample {0.};
171 int mGlideSamples {0};
172 int mSamplesRemaining {0};
173 int mStartOffset {0};
A ControlRamp describes one value changing over time.
void Write(float *buffer, int startIdx, int nFrames)
Writes the ramp signal to an output buffer.