| 11 | #include "Grain.h" |
| 12 | |
| 13 | float Grain::process(float chanPerc, const juce::AudioBuffer<float>& audioBuffer, float envelopeGain, int time) { |
| 14 | // Time percentage over duration |
| 15 | mTimePerc = juce::jlimit(0.0f, 1.0f, static_cast<float>((time - trigTs)) / duration); |
| 16 | |
| 17 | // Panning gain |
| 18 | mPanGain = computeChannelPanningGain(chanPerc); |
| 19 | |
| 20 | mTotalGain = envelopeGain * mPanGain * getAmplitude(); |
| 21 | |
| 22 | mSampleIdx = duration * pbRate * mTimePerc; |
| 23 | mLowSample = std::floor(mSampleIdx); |
| 24 | mHighSample = std::ceil(mSampleIdx); |
| 25 | mSampleRem = mSampleIdx - mLowSample; |
| 26 | if (pbRate < 0.0f) { |
| 27 | std::swap(mLowSample, mHighSample); |
| 28 | mSampleRem = fabsf(mLowSample - mSampleIdx); |
| 29 | mLowSample += audioBuffer.getNumSamples(); |
| 30 | mHighSample += audioBuffer.getNumSamples(); |
| 31 | } |
| 32 | |
| 33 | // Some quick interpolation between sample values |
| 34 | const float* fileBuf = audioBuffer.getReadPointer(0); |
| 35 | mSampleValue = juce::jmap(mSampleRem, fileBuf[(startPos + mLowSample) % audioBuffer.getNumSamples()], |
| 36 | fileBuf[(startPos + mHighSample) % audioBuffer.getNumSamples()]); |
| 37 | |
| 38 | mSampleValue *= mTotalGain; |
| 39 | return mSampleValue; |
| 40 | } |
| 41 | |
| 42 | float Grain::getAmplitude() { |
| 43 | if (mEnv.size() == 0) return 0.0f; |
nothing calls this directly
no outgoing calls
no test coverage detected