Voices only need the resource set

This commit is contained in:
Paul Fd 2020-02-09 14:16:52 +01:00
parent bbad781bf9
commit 137607b2c6
3 changed files with 14 additions and 15 deletions

View file

@ -611,7 +611,7 @@ void sfz::Synth::resetVoices(int numVoices)
voices.clear(); voices.clear();
for (int i = 0; i < numVoices; ++i) for (int i = 0; i < numVoices; ++i)
voices.push_back(std::make_unique<Voice>(resources.midiState, resources)); voices.push_back(std::make_unique<Voice>(resources));
for (auto& voice: voices) { for (auto& voice: voices) {
voice->setSampleRate(this->sampleRate); voice->setSampleRate(this->sampleRate);

View file

@ -14,8 +14,8 @@
#include "absl/algorithm/container.h" #include "absl/algorithm/container.h"
#include <memory> #include <memory>
sfz::Voice::Voice(const sfz::MidiState& midiState, sfz::Resources& resources) sfz::Voice::Voice(sfz::Resources& resources)
: midiState(midiState), resources(resources) : resources(resources)
{ {
} }
@ -45,7 +45,7 @@ void sfz::Voice::startVoice(Region* region, int delay, int number, uint8_t value
baseVolumedB = region->getBaseVolumedB(number); baseVolumedB = region->getBaseVolumedB(number);
auto volumedB { baseVolumedB }; auto volumedB { baseVolumedB };
if (region->volumeCC) if (region->volumeCC)
volumedB += normalizeCC(midiState.getCCValue(region->volumeCC->first)) * region->volumeCC->second; volumedB += normalizeCC(resources.midiState.getCCValue(region->volumeCC->first)) * region->volumeCC->second;
volumeEnvelope.reset(db2mag(Default::volumeRange.clamp(volumedB))); volumeEnvelope.reset(db2mag(Default::volumeRange.clamp(volumedB)));
baseGain = region->getBaseGain(); baseGain = region->getBaseGain();
@ -54,28 +54,28 @@ void sfz::Voice::startVoice(Region* region, int delay, int number, uint8_t value
float gain { baseGain }; float gain { baseGain };
if (region->amplitudeCC) if (region->amplitudeCC)
gain *= normalizeCC(midiState.getCCValue(region->amplitudeCC->first)) * normalizePercents(region->amplitudeCC->second); gain *= normalizeCC(resources.midiState.getCCValue(region->amplitudeCC->first)) * normalizePercents(region->amplitudeCC->second);
amplitudeEnvelope.reset(Default::normalizedRange.clamp(gain)); amplitudeEnvelope.reset(Default::normalizedRange.clamp(gain));
float crossfadeGain { region->getCrossfadeGain(midiState.getCCArray()) }; float crossfadeGain { region->getCrossfadeGain(resources.midiState.getCCArray()) };
crossfadeEnvelope.reset(Default::normalizedRange.clamp(crossfadeGain)); crossfadeEnvelope.reset(Default::normalizedRange.clamp(crossfadeGain));
basePan = normalizeNegativePercents(region->pan); basePan = normalizeNegativePercents(region->pan);
auto pan { basePan }; auto pan { basePan };
if (region->panCC) if (region->panCC)
pan += normalizeCC(midiState.getCCValue(region->panCC->first)) * normalizeNegativePercents(region->panCC->second); pan += normalizeCC(resources.midiState.getCCValue(region->panCC->first)) * normalizeNegativePercents(region->panCC->second);
panEnvelope.reset(Default::symmetricNormalizedRange.clamp(pan)); panEnvelope.reset(Default::symmetricNormalizedRange.clamp(pan));
basePosition = normalizeNegativePercents(region->position); basePosition = normalizeNegativePercents(region->position);
auto position { basePosition }; auto position { basePosition };
if (region->positionCC) if (region->positionCC)
position += normalizeCC(midiState.getCCValue(region->positionCC->first)) * normalizeNegativePercents(region->positionCC->second); position += normalizeCC(resources.midiState.getCCValue(region->positionCC->first)) * normalizeNegativePercents(region->positionCC->second);
positionEnvelope.reset(Default::symmetricNormalizedRange.clamp(position)); positionEnvelope.reset(Default::symmetricNormalizedRange.clamp(position));
baseWidth = normalizeNegativePercents(region->width); baseWidth = normalizeNegativePercents(region->width);
auto width { baseWidth }; auto width { baseWidth };
if (region->widthCC) if (region->widthCC)
width += normalizeCC(midiState.getCCValue(region->widthCC->first)) * normalizeNegativePercents(region->widthCC->second); width += normalizeCC(resources.midiState.getCCValue(region->widthCC->first)) * normalizeNegativePercents(region->widthCC->second);
widthEnvelope.reset(Default::symmetricNormalizedRange.clamp(width)); widthEnvelope.reset(Default::symmetricNormalizedRange.clamp(width));
pitchBendEnvelope.setFunction([region](float pitchValue){ pitchBendEnvelope.setFunction([region](float pitchValue){
@ -83,7 +83,7 @@ void sfz::Voice::startVoice(Region* region, int delay, int number, uint8_t value
const auto bendInCents = normalizedBend > 0.0f ? normalizedBend * region->bendUp : -normalizedBend * region->bendDown; const auto bendInCents = normalizedBend > 0.0f ? normalizedBend * region->bendUp : -normalizedBend * region->bendDown;
return centsFactor(bendInCents); return centsFactor(bendInCents);
}); });
pitchBendEnvelope.reset(static_cast<float>(midiState.getPitchBend())); pitchBendEnvelope.reset(static_cast<float>(resources.midiState.getPitchBend()));
sourcePosition = region->getOffset(); sourcePosition = region->getOffset();
triggerDelay = delay; triggerDelay = delay;
@ -98,7 +98,7 @@ void sfz::Voice::prepareEGEnvelope(int delay, uint8_t velocity) noexcept
auto secondsToSamples = [this](auto timeInSeconds) { auto secondsToSamples = [this](auto timeInSeconds) {
return static_cast<int>(timeInSeconds * sampleRate); return static_cast<int>(timeInSeconds * sampleRate);
}; };
const auto& ccArray = midiState.getCCArray(); const auto& ccArray = resources.midiState.getCCArray();
egEnvelope.reset( egEnvelope.reset(
secondsToSamples(region->amplitudeEG.getAttack(ccArray, velocity)), secondsToSamples(region->amplitudeEG.getAttack(ccArray, velocity)),
secondsToSamples(region->amplitudeEG.getRelease(ccArray, velocity)), secondsToSamples(region->amplitudeEG.getRelease(ccArray, velocity)),
@ -141,7 +141,7 @@ void sfz::Voice::registerNoteOff(int delay, int noteNumber, uint8_t velocity [[m
if (region->loopMode == SfzLoopMode::one_shot) if (region->loopMode == SfzLoopMode::one_shot)
return; return;
if (!region->checkSustain || midiState.getCCValue(config::sustainCC) < config::halfCCThreshold) if (!region->checkSustain || resources.midiState.getCCValue(config::sustainCC) < config::halfCCThreshold)
release(delay); release(delay);
} }
} }
@ -192,7 +192,7 @@ void sfz::Voice::registerCC(int delay, int ccNumber, uint8_t ccValue) noexcept
} }
if (region->crossfadeCCInRange.contains(ccNumber) || region->crossfadeCCOutRange.contains(ccNumber)) { if (region->crossfadeCCInRange.contains(ccNumber) || region->crossfadeCCOutRange.contains(ccNumber)) {
const float crossfadeGain = region->getCrossfadeGain(midiState.getCCArray()); const float crossfadeGain = region->getCrossfadeGain(resources.midiState.getCCArray());
crossfadeEnvelope.registerEvent(delay, Default::normalizedRange.clamp(crossfadeGain)); crossfadeEnvelope.registerEvent(delay, Default::normalizedRange.clamp(crossfadeGain));
} }
} }

View file

@ -34,7 +34,7 @@ public:
* *
* @param midiState * @param midiState
*/ */
Voice(const MidiState& midiState, Resources& resources); Voice(Resources& resources);
enum class TriggerType { enum class TriggerType {
NoteOn, NoteOn,
NoteOff, NoteOff,
@ -281,7 +281,6 @@ private:
int minEnvelopeDelay { config::defaultSamplesPerBlock / 2 }; int minEnvelopeDelay { config::defaultSamplesPerBlock / 2 };
float sampleRate { config::defaultSampleRate }; float sampleRate { config::defaultSampleRate };
const MidiState& midiState;
Resources& resources; Resources& resources;
ADSREnvelope<float> egEnvelope; ADSREnvelope<float> egEnvelope;