void JuceDemoPluginAudioProcessor::process (AudioBuffer<FloatType>& buffer, MidiBuffer& midiMessages, AudioBuffer<FloatType>& delayBuffer) { const int numSamples = buffer.getNumSamples(); // apply our gain-change to the incoming data.. applyGain (buffer, delayBuffer); // Now pass any incoming midi messages to our keyboard state object, and let it // add messages to the buffer if the user is clicking on the on-screen keys keyboardState.processNextMidiBuffer (midiMessages, 0, numSamples, true); // and now get our synth to process these midi events and generate its output. synth.renderNextBlock (buffer, midiMessages, 0, numSamples); // Apply our delay effect to the new output.. applyDelay (buffer, delayBuffer); // In case we have more outputs than inputs, we'll clear any output // channels that didn't contain input data, (because these aren't // guaranteed to be empty - they may contain garbage). for (int i = getNumInputChannels(); i < getNumOutputChannels(); ++i) buffer.clear (i, 0, numSamples); // Now ask the host for the current time so we can store it to be displayed later... updateCurrentTimeInfoFromHost(); }
void AudioSampleBuffer::applyGainRamp (const int channel, const int startSample, int numSamples, float startGain, float endGain) noexcept { if (startGain == endGain) { applyGain (channel, startSample, numSamples, startGain); } else { jassert (isPositiveAndBelow (channel, numChannels)); jassert (startSample >= 0 && startSample + numSamples <= size); const float increment = (endGain - startGain) / numSamples; float* d = channels [channel] + startSample; while (--numSamples >= 0) { *d++ *= startGain; startGain += increment; } } }
void AudioSampleBuffer::applyGain (const int startSample, const int numSamples, const float gain) noexcept { for (int i = 0; i < numChannels; ++i) applyGain (i, startSample, numSamples, gain); }
void AudioMixer2::update(void) { audio_block_t *in, *out=NULL; unsigned int channel; for (channel=0; channel < 2; channel++) { if (!out) { out = receiveWritable(channel); if (out) { int32_t mult = multiplier[channel]; if (mult != 65536) applyGain(out->data, mult); } } else { in = receiveReadOnly(channel); if (in) { applyGainThenAdd(out->data, in->data, multiplier[channel]); release(in); } } } if (out) { transmit(out); release(out); } }
// static void SampleUtil::applyAlternatingGain(CSAMPLE* pBuffer, CSAMPLE gain1, CSAMPLE gain2, int iNumSamples) { // This handles gain1 == CSAMPLE_GAIN_ONE && gain2 == CSAMPLE_GAIN_ONE as well. if (gain1 == gain2) { return applyGain(pBuffer, gain1, iNumSamples); } // note: LOOP VECTORIZED. for (int i = 0; i < iNumSamples / 2; ++i) { pBuffer[i * 2] *= gain1; pBuffer[i * 2 + 1] *= gain2; } }
// static void SampleUtil::applyAlternatingGain(CSAMPLE* pBuffer, CSAMPLE gain1, CSAMPLE gain2, int iNumSamples) { // This handles gain1 == 1.0 && gain2 == 1.0f as well. if (gain1 == gain2) { return applyGain(pBuffer, gain1, iNumSamples); } for (int i = 0; i < iNumSamples; i += 2) { pBuffer[i] *= gain1; pBuffer[i+1] *= gain2; } }
// static void SampleUtil::copyWithGain(CSAMPLE* pDest, const CSAMPLE* pSrc, CSAMPLE gain, int iNumSamples) { if (pDest == pSrc) { return applyGain(pDest, gain, iNumSamples); } if (gain == 1.0f) { memcpy(pDest, pSrc, sizeof(pDest[0]) * iNumSamples); return; } if (gain == 0.0f) { memset(pDest, 0, sizeof(pDest[0]) * iNumSamples); return; } for (int i = 0; i < iNumSamples; ++i) { pDest[i] = pSrc[i] * gain; } // OR! need to test which fares better // memcpy(pDest, pSrc, sizeof(pDest[0]) * iNumSamples); // applyGain(pDest, gain); }
void AudioSampleBuffer::applyGain (const float gain) noexcept { applyGain (0, size, gain); }