Remove the helpers in the midi class and be explicit in the process

This commit is contained in:
Paul Ferrand 2020-03-30 19:58:32 +02:00
parent eac0c0e804
commit 0da5c43bb5
2 changed files with 44 additions and 31 deletions

View file

@ -154,26 +154,6 @@ public:
return returnedValue;
}
template<class T, class F = decltype(gainModifier<T>)>
void additiveModifiers(const CCMap<T>& modifiers, absl::Span<float> output, absl::Span<float> temp, F&& lambda = gainModifier<T>)
{
fill<float>(output, 0.0f);
for (auto& mod : modifiers) {
linearEnvelope(mod, temp, lambda);
add<float>(temp, output);
}
}
template<class T, class F = decltype(gainModifier<T>)>
void multiplicativeModifiers(const CCMap<T>& modifiers, absl::Span<float> output, absl::Span<float> temp, F&& lambda = gainModifier<T>)
{
for (auto& mod : modifiers) {
linearEnvelope(mod, temp, lambda);
applyGain<float>(temp, output);
}
}
const EventVector& getEvents(int ccIdx) const noexcept;
template<class T, class F>

View file

@ -275,15 +275,23 @@ void sfz::Voice::ampStageMono(AudioSpan<float> buffer) noexcept
// Amplitude envelope
fill<float>(*modulationSpan, baseGain);
resources.midiState.multiplicativeModifiers(region->amplitudeCC, *modulationSpan, *tempSpan);
for (auto& mod : region->amplitudeCC) {
resources.midiState.linearEnvelope(mod, *tempSpan, gainModifier<float>);
applyGain<float>(*tempSpan, *modulationSpan);
}
DBG("Final gain: " << modulationSpan->back());
applyGain<float>(*modulationSpan, leftBuffer);
// Crossfade envelopes
// crossfadeEnvelope.getBlock(modulationSpan);
fill<float>(*modulationSpan, 1.0f);
resources.midiState.multiplicativeModifiers(region->crossfadeCCInRange, *modulationSpan, *tempSpan, xfinBind);
resources.midiState.multiplicativeModifiers(region->crossfadeCCOutRange, *modulationSpan, *tempSpan, xfoutBind);
for (auto& mod : region->crossfadeCCInRange) {
resources.midiState.linearEnvelope(mod, *tempSpan, xfinBind);
applyGain<float>(*tempSpan, *modulationSpan);
}
for (auto& mod : region->crossfadeCCOutRange) {
resources.midiState.linearEnvelope(mod, *tempSpan, xfoutBind);
applyGain<float>(*tempSpan, *modulationSpan);
}
DBG("XF: " << modulationSpan->back());
applyGain<float>(*modulationSpan, leftBuffer);
@ -311,15 +319,28 @@ void sfz::Voice::ampStageStereo(AudioSpan<float> buffer) noexcept
const auto xfinBind = std::bind(crossfadeIn<float, float>, _1, _2, region->crossfadeCCCurve);
const auto xfoutBind = std::bind(crossfadeIn<float, float>, _1, _2, region->crossfadeCCCurve);
// Amplitude envelope
fill<float>(*modulationSpan, baseGain);
resources.midiState.multiplicativeModifiers(region->amplitudeCC, *modulationSpan, *tempSpan);
for (auto& mod : region->amplitudeCC) {
resources.midiState.linearEnvelope(mod, *tempSpan, gainModifier<float>);
applyGain<float>(*tempSpan, *modulationSpan);
}
DBG("Final gain: " << modulationSpan->back());
buffer.applyGain(*modulationSpan);
// Crossfade envelopes
fill<float>(*modulationSpan, 1.0f);
resources.midiState.multiplicativeModifiers(region->crossfadeCCInRange, *modulationSpan, *tempSpan, xfinBind);
resources.midiState.multiplicativeModifiers(region->crossfadeCCOutRange, *modulationSpan, *tempSpan, xfoutBind);
for (auto& mod : region->crossfadeCCInRange) {
resources.midiState.linearEnvelope(mod, *tempSpan, xfinBind);
applyGain<float>(*tempSpan, *modulationSpan);
}
for (auto& mod : region->crossfadeCCOutRange) {
resources.midiState.linearEnvelope(mod, *tempSpan, xfoutBind);
applyGain<float>(*tempSpan, *modulationSpan);
}
DBG("XF: " << modulationSpan->back());
buffer.applyGain(*modulationSpan);
// Volume envelope
@ -349,7 +370,10 @@ void sfz::Voice::panStageMono(AudioSpan<float> buffer) noexcept
// Apply panning
fill<float>(*modulationSpan, region->pan);
resources.midiState.additiveModifiers(region->panCC, *modulationSpan, *tempSpan);
for (auto& mod : region->panCC) {
resources.midiState.linearEnvelope(mod, *tempSpan, gainModifier<float>);
add<float>(*tempSpan, *modulationSpan);
}
DBG("Pan: " << modulationSpan->back());
pan<float>(*modulationSpan, leftBuffer, rightBuffer);
}
@ -369,18 +393,27 @@ void sfz::Voice::panStageStereo(AudioSpan<float> buffer) noexcept
// Apply panning
// panningModulation(*modulationSpan);
fill<float>(*modulationSpan, region->pan);
resources.midiState.additiveModifiers(region->panCC, *modulationSpan, *tempSpan);
for (auto& mod : region->panCC) {
resources.midiState.linearEnvelope(mod, *tempSpan, gainModifier<float>);
add<float>(*tempSpan, *modulationSpan);
}
pan<float>(*modulationSpan, leftBuffer, rightBuffer);
// Apply the width/position process
// widthModulation(*modulationSpan);
fill<float>(*modulationSpan, region->width);
resources.midiState.additiveModifiers(region->widthCC, *modulationSpan, *tempSpan);
for (auto& mod : region->widthCC) {
resources.midiState.linearEnvelope(mod, *tempSpan, gainModifier<float>);
add<float>(*tempSpan, *modulationSpan);
}
width<float>(*modulationSpan, leftBuffer, rightBuffer);
// positionModulation(*modulationSpan);
fill<float>(*modulationSpan, region->position);
resources.midiState.additiveModifiers(region->positionCC, *modulationSpan, *tempSpan);
for (auto& mod : region->positionCC) {
resources.midiState.linearEnvelope(mod, *tempSpan, gainModifier<float>);
add<float>(*tempSpan, *modulationSpan);
}
pan<float>(*modulationSpan, leftBuffer, rightBuffer);
}