Merge pull request #682 from jpcima/lfos-dedup

Deduplicate LFO code in core/fx
This commit is contained in:
JP Cimalando 2021-03-09 15:31:06 +01:00 committed by GitHub
commit 407fe3a123
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 43 additions and 55 deletions

View file

@ -44,8 +44,6 @@ set(SFIZZ_HEADERS
sfizz/effects/impl/ResonantStringAVX.h sfizz/effects/impl/ResonantStringAVX.h
sfizz/effects/impl/ResonantStringSSE.h sfizz/effects/impl/ResonantStringSSE.h
sfizz/effects/Apan.h sfizz/effects/Apan.h
sfizz/effects/CommonLFO.h
sfizz/effects/CommonLFO.hpp
sfizz/effects/Compressor.h sfizz/effects/Compressor.h
sfizz/effects/Disto.h sfizz/effects/Disto.h
sfizz/effects/Eq.h sfizz/effects/Eq.h
@ -75,6 +73,8 @@ set(SFIZZ_HEADERS
sfizz/Interpolators.hpp sfizz/Interpolators.hpp
sfizz/Logger.h sfizz/Logger.h
sfizz/LFO.h sfizz/LFO.h
sfizz/LFOCommon.h
sfizz/LFOCommon.hpp
sfizz/LFODescription.h sfizz/LFODescription.h
sfizz/MathHelpers.h sfizz/MathHelpers.h
sfizz/Metronome.h sfizz/Metronome.h

View file

@ -133,7 +133,7 @@ extern const OpcodeSpec<int> octaveOffset { 0, Range<int>(-10, 10), 0 };
extern const OpcodeSpec<int> noteOffset { 0, Range<int>(-127, 127), 0 }; extern const OpcodeSpec<int> noteOffset { 0, Range<int>(-127, 127), 0 };
extern const OpcodeSpec<float> effect { 0.0f, Range<float>(0.0f, 100.0f), kNormalizePercent }; extern const OpcodeSpec<float> effect { 0.0f, Range<float>(0.0f, 100.0f), kNormalizePercent };
extern const OpcodeSpec<float> effectPercent { 0.0f, Range<float>(0.0f, 100.0f), 0 }; extern const OpcodeSpec<float> effectPercent { 0.0f, Range<float>(0.0f, 100.0f), 0 };
extern const OpcodeSpec<int> apanWaveform { 0, Range<int>(0, std::numeric_limits<int>::max()), 0 }; extern const OpcodeSpec<LFOWave> apanWaveform { LFOWave::Triangle, Range<LFOWave>(LFOWave::Triangle, LFOWave::Saw), 0 };
extern const OpcodeSpec<float> apanFrequency { 0.0f, Range<float>(0.0f, std::numeric_limits<float>::max()), 0 }; extern const OpcodeSpec<float> apanFrequency { 0.0f, Range<float>(0.0f, std::numeric_limits<float>::max()), 0 };
extern const OpcodeSpec<float> apanPhase { 0.5f, Range<float>(0.0f, 1.0f), kWrapPhase }; extern const OpcodeSpec<float> apanPhase { 0.5f, Range<float>(0.0f, 1.0f), kWrapPhase };
extern const OpcodeSpec<float> apanLevel { 0.0f, Range<float>(0.0f, 100.0f), kNormalizePercent }; extern const OpcodeSpec<float> apanLevel { 0.0f, Range<float>(0.0f, 100.0f), kNormalizePercent };

View file

@ -31,6 +31,7 @@
#include "Config.h" #include "Config.h"
#include "SfzFilter.h" #include "SfzFilter.h"
#include "SfzHelpers.h" #include "SfzHelpers.h"
#include "LFOCommon.h"
#include "MathHelpers.h" #include "MathHelpers.h"
@ -44,18 +45,6 @@ enum class VelocityOverride { current = 0, previous };
enum class CrossfadeCurve { gain = 0, power }; enum class CrossfadeCurve { gain = 0, power };
enum class SelfMask { mask = 0, dontMask }; enum class SelfMask { mask = 0, dontMask };
enum class OscillatorEnabled { Auto = -1, Off = 0, On = 1 }; enum class OscillatorEnabled { Auto = -1, Off = 0, On = 1 };
enum class LFOWave : int {
Triangle,
Sine,
Pulse75,
Square,
Pulse25,
Pulse12_5,
Ramp,
Saw,
// ARIA extra
RandomSH = 12,
};
enum OpcodeFlags : int { enum OpcodeFlags : int {
kCanBeNote = 1, kCanBeNote = 1,
@ -252,7 +241,7 @@ namespace Default
extern const OpcodeSpec<int> noteOffset; extern const OpcodeSpec<int> noteOffset;
extern const OpcodeSpec<float> effect; extern const OpcodeSpec<float> effect;
extern const OpcodeSpec<float> effectPercent; extern const OpcodeSpec<float> effectPercent;
extern const OpcodeSpec<int> apanWaveform; extern const OpcodeSpec<LFOWave> apanWaveform;
extern const OpcodeSpec<float> apanFrequency; extern const OpcodeSpec<float> apanFrequency;
extern const OpcodeSpec<float> apanPhase; extern const OpcodeSpec<float> apanPhase;
extern const OpcodeSpec<float> apanLevel; extern const OpcodeSpec<float> apanLevel;

View file

@ -7,24 +7,25 @@
#pragma once #pragma once
namespace sfz { namespace sfz {
namespace fx {
namespace lfo {
enum Wave { enum class LFOWave : int {
kTriangle, Triangle,
kSine, Sine,
kPulse75, Pulse75,
kSquare, Square,
kPulse25, Pulse25,
kPulse12_5, Pulse12_5,
kRamp, Ramp,
kSaw, Saw,
// ARIA extra
RandomSH = 12,
}; };
template <int Wave> float evaluateAtPhase(float phase); namespace lfo {
template <LFOWave Wave> float evaluateAtPhase(float phase);
} // namespace lfo } // namespace lfo
} // namespace fx
} // namespace sfz } // namespace sfz
#include "CommonLFO.hpp" #include "LFOCommon.hpp"

View file

@ -4,11 +4,10 @@
// license. You should have receive a LICENSE.md file along with the code. // license. You should have receive a LICENSE.md file along with the code.
// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz // If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz
#include "CommonLFO.h" #include "LFOCommon.h"
#include <cmath> #include <cmath>
namespace sfz { namespace sfz {
namespace fx {
namespace lfo { namespace lfo {
// Pulse and Square levels // Pulse and Square levels
@ -16,7 +15,7 @@ namespace lfo {
static constexpr float hiPulse = 1.0f; static constexpr float hiPulse = 1.0f;
template <> template <>
inline float evaluateAtPhase<kTriangle>(float phase) inline float evaluateAtPhase<LFOWave::Triangle>(float phase)
{ {
float y = -4 * phase + 2; float y = -4 * phase + 2;
y = (phase < 0.25f) ? (4 * phase) : y; y = (phase < 0.25f) ? (4 * phase) : y;
@ -25,48 +24,47 @@ namespace lfo {
} }
template <> template <>
inline float evaluateAtPhase<kSine>(float phase) inline float evaluateAtPhase<LFOWave::Sine>(float phase)
{ {
float x = phase + phase - 1; float x = phase + phase - 1;
return -4 * x * (1 - std::fabs(x)); return -4 * x * (1 - std::fabs(x));
} }
template <> template <>
inline float evaluateAtPhase<kPulse75>(float phase) inline float evaluateAtPhase<LFOWave::Pulse75>(float phase)
{ {
return (phase < 0.75f) ? hiPulse : loPulse; return (phase < 0.75f) ? hiPulse : loPulse;
} }
template <> template <>
inline float evaluateAtPhase<kSquare>(float phase) inline float evaluateAtPhase<LFOWave::Square>(float phase)
{ {
return (phase < 0.5f) ? hiPulse : loPulse; return (phase < 0.5f) ? hiPulse : loPulse;
} }
template <> template <>
inline float evaluateAtPhase<kPulse25>(float phase) inline float evaluateAtPhase<LFOWave::Pulse25>(float phase)
{ {
return (phase < 0.25f) ? hiPulse : loPulse; return (phase < 0.25f) ? hiPulse : loPulse;
} }
template <> template <>
inline float evaluateAtPhase<kPulse12_5>(float phase) inline float evaluateAtPhase<LFOWave::Pulse12_5>(float phase)
{ {
return (phase < 0.125f) ? hiPulse : loPulse; return (phase < 0.125f) ? hiPulse : loPulse;
} }
template <> template <>
inline float evaluateAtPhase<kRamp>(float phase) inline float evaluateAtPhase<LFOWave::Ramp>(float phase)
{ {
return 2 * phase - 1; return 2 * phase - 1;
} }
template <> template <>
inline float evaluateAtPhase<kSaw>(float phase) inline float evaluateAtPhase<LFOWave::Saw>(float phase)
{ {
return 1 - 2 * phase; return 1 - 2 * phase;
} }
} // namespace lfo } // namespace lfo
} // namespace fx
} // namespace sfz } // namespace sfz

View file

@ -22,7 +22,7 @@
#include "Apan.h" #include "Apan.h"
#include "Macros.h" #include "Macros.h"
#include "CommonLFO.h" #include "LFOCommon.h"
#include "Opcode.h" #include "Opcode.h"
#include <limits> #include <limits>
#include <cmath> #include <cmath>
@ -107,22 +107,22 @@ namespace fx {
void Apan::computeLfos(float* left, float* right, unsigned nframes) void Apan::computeLfos(float* left, float* right, unsigned nframes)
{ {
switch (_lfoWave) { switch (_lfoWave) {
#define CASE(X) case lfo::X: \ #define CASE(X) case X: \
computeLfos<lfo::X>(left, right, nframes); break; computeLfos<X>(left, right, nframes); break;
default: default:
CASE(kTriangle) CASE(LFOWave::Triangle)
CASE(kSine) CASE(LFOWave::Sine)
CASE(kPulse75) CASE(LFOWave::Pulse75)
CASE(kSquare) CASE(LFOWave::Square)
CASE(kPulse25) CASE(LFOWave::Pulse25)
CASE(kPulse12_5) CASE(LFOWave::Pulse12_5)
CASE(kRamp) CASE(LFOWave::Ramp)
CASE(kSaw) CASE(LFOWave::Saw)
#undef CASE #undef CASE
} }
} }
template <int Wave> void Apan::computeLfos(float* left, float* right, unsigned nframes) template <LFOWave Wave> void Apan::computeLfos(float* left, float* right, unsigned nframes)
{ {
float samplePeriod = _samplePeriod; float samplePeriod = _samplePeriod;
float frequency = _lfoFrequency; float frequency = _lfoFrequency;

View file

@ -44,7 +44,7 @@ namespace fx {
private: private:
void computeLfos(float* left, float* right, unsigned nframes); void computeLfos(float* left, float* right, unsigned nframes);
template <int Wave> void computeLfos(float* left, float* right, unsigned nframes); template <LFOWave Wave> void computeLfos(float* left, float* right, unsigned nframes);
private: private:
float _samplePeriod { 0.0f }; float _samplePeriod { 0.0f };
@ -55,7 +55,7 @@ namespace fx {
float _dry { Default::apanLevel }; float _dry { Default::apanLevel };
float _wet { Default::apanLevel }; float _wet { Default::apanLevel };
float _depth { Default::apanLevel }; float _depth { Default::apanLevel };
int _lfoWave { Default::apanWaveform }; LFOWave _lfoWave { Default::apanWaveform };
float _lfoFrequency { Default::apanFrequency }; float _lfoFrequency { Default::apanFrequency };
float _lfoPhaseOffset { Default::apanPhase }; float _lfoPhaseOffset { Default::apanPhase };