Tune synth down one octave; add LFO1/LFO2 OSC2 phase destination

This commit is contained in:
Armin 2026-07-15 23:51:58 +02:00
commit a8928fc6a4
3 changed files with 13 additions and 4 deletions

View file

@ -1,7 +1,7 @@
#pragma once #pragma once
#include <cmath> #include <cmath>
enum class LFODest { FilterCutoff = 0, OSC1Freq, OSC2Freq, BothOsc }; enum class LFODest { FilterCutoff = 0, OSC1Freq, OSC2Freq, BothOsc, OSC2Phase };
enum class LFOShape { Sine = 0, Triangle, Saw, Square }; enum class LFOShape { Sine = 0, Triangle, Saw, Square };
class LFO { class LFO {

View file

@ -38,9 +38,11 @@ public:
lfo2.reset(); lfo2.reset();
baseFreq1 = 440.0f * std::pow(2.0f, (static_cast<float>(midiNoteNumber) - 69.0f) / 12.0f) baseFreq1 = 440.0f * std::pow(2.0f, (static_cast<float>(midiNoteNumber) - 69.0f) / 12.0f)
* std::pow(2.0f, semitone1 / 12.0f + fineTune1 / 1200.0f) * std::pow(2.0f, octave1); * std::pow(2.0f, semitone1 / 12.0f + fineTune1 / 1200.0f) * std::pow(2.0f, octave1)
* globalTune;
baseFreq2 = 440.0f * std::pow(2.0f, (static_cast<float>(midiNoteNumber) - 69.0f) / 12.0f) baseFreq2 = 440.0f * std::pow(2.0f, (static_cast<float>(midiNoteNumber) - 69.0f) / 12.0f)
* std::pow(2.0f, semitone2 / 12.0f + fineTune2 / 1200.0f) * std::pow(2.0f, octave2); * std::pow(2.0f, semitone2 / 12.0f + fineTune2 / 1200.0f) * std::pow(2.0f, octave2)
* globalTune;
osc1.setFrequency(baseFreq1); osc1.setFrequency(baseFreq1);
osc2.setFrequency(baseFreq2); osc2.setFrequency(baseFreq2);
@ -113,6 +115,12 @@ public:
osc1.setFrequency(freq1); osc1.setFrequency(freq1);
osc2.setFrequency(freq2); osc2.setFrequency(freq2);
// Apply LFO to OSC2 phase (vibrato-style phase sweep)
if (lfo1Depth > 0.001f && lfo1Dest == LFODest::OSC2Phase)
osc2.setPhase(phaseOffset2 + lfo1Out * 0.5f);
if (lfo2Depth > 0.001f && lfo2Dest == LFODest::OSC2Phase)
osc2.setPhase(phaseOffset2 + lfo2Out * 0.5f);
float left = 0.0f, right = 0.0f; float left = 0.0f, right = 0.0f;
osc1.process(&left, &right); osc1.process(&left, &right);
osc2.process(&left, &right); osc2.process(&left, &right);
@ -243,6 +251,7 @@ private:
float outputLevel = 0.8f; float outputLevel = 0.8f;
float baseFreq1 = 440.0f; float baseFreq1 = 440.0f;
float baseFreq2 = 440.0f; float baseFreq2 = 440.0f;
float globalTune = 0.5f; // synth tuned down one octave (1/2 of normal pitch)
float lfo1Depth = 0.0f; float lfo1Depth = 0.0f;
float lfo2Depth = 0.0f; float lfo2Depth = 0.0f;
LFODest lfo1Dest = LFODest::FilterCutoff; LFODest lfo1Dest = LFODest::FilterCutoff;

View file

@ -505,7 +505,7 @@ MainContentComponent::MainContentComponent(ChromaFlockProcessor& p)
setupKnob(lfo2RateKnob, "RATE"); setupKnob(lfo2RateKnob, "RATE");
setupParam(lfo2DepthKnob, lfo2DepthAttach, "lfo2Depth", "DEPTH"); setupParam(lfo2DepthKnob, lfo2DepthAttach, "lfo2Depth", "DEPTH");
setupCB(lfo2ShapeBox, lfo2ShapeAttach, "lfo2Shape", {"Sine", "Triangle", "Saw", "Square"}); setupCB(lfo2ShapeBox, lfo2ShapeAttach, "lfo2Shape", {"Sine", "Triangle", "Saw", "Square"});
setupCB(lfo2DestBox, lfo2DestAttach, "lfo2Dest", {"Filter", "OSC1", "OSC2", "Both OSC"}); setupCB(lfo2DestBox, lfo2DestAttach, "lfo2Dest", {"Filter", "OSC1", "OSC2", "Both OSC", "OSC2 Phase"});
setupCB(lfo2SyncBox, lfo2SyncAttach, "lfo2Sync", {"Sync Off", "Sync On"}); setupCB(lfo2SyncBox, lfo2SyncAttach, "lfo2Sync", {"Sync Off", "Sync On"});
lfo2SyncBox.onChange = [this]() { lfo2SyncBox.onChange = [this]() {
setupSyncKnob(lfo2RateKnob, lfo2RateAttach, lfo2BeatAttach, "lfo2Rate", "lfo2Beat", lfo2SyncBox); setupSyncKnob(lfo2RateKnob, lfo2RateAttach, lfo2BeatAttach, "lfo2Rate", "lfo2Beat", lfo2SyncBox);