From d858a10fc9d116bba0c4526c02e9c7c591ba69e9 Mon Sep 17 00:00:00 2001 From: Roland Rabien Date: Thu, 21 May 2020 21:39:47 -0700 Subject: [PATCH] Working on wt --- modules/gin | 2 +- plugin/Resources/Wavetables/WINDOW_S.WAV | Bin 0 -> 32812 bytes plugin/Source/Boxes.h | 3 +- plugin/Source/PluginProcessor.cpp | 24 +++++++++++- plugin/Source/PluginProcessor.h | 8 +++- plugin/Source/WavetableVoice.cpp | 48 ++++++++++++++++++++--- plugin/Source/WavetableVoice.h | 13 ++++-- plugin/Wavetable.jucer | 5 +++ 8 files changed, 89 insertions(+), 14 deletions(-) create mode 100644 plugin/Resources/Wavetables/WINDOW_S.WAV diff --git a/modules/gin b/modules/gin index 2aa9e9f..d8ead26 160000 --- a/modules/gin +++ b/modules/gin @@ -1 +1 @@ -Subproject commit 2aa9e9fb9208a7e49eef07fe9a65365351b8481a +Subproject commit d8ead26e5775c0b11bd5067399d3a38beb7602b2 diff --git a/plugin/Resources/Wavetables/WINDOW_S.WAV b/plugin/Resources/Wavetables/WINDOW_S.WAV new file mode 100644 index 0000000000000000000000000000000000000000..e6f7134ac3df7ee4ec70611d3318ee93388803ba GIT binary patch literal 32812 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 w<5P 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 DTa|*c literal 0 HcmV?d00001 diff --git a/plugin/Source/Boxes.h b/plugin/Source/Boxes.h index c701fb5..ec7bf19 100644 --- a/plugin/Source/Boxes.h +++ b/plugin/Source/Boxes.h @@ -59,6 +59,7 @@ public: addPage ("WT " + String (i + 1), 3, 4); addPageEnable (i * 2, wt.enable); + addControl (i * 2, new gin::Knob (wt.table), 0, 0); addControl (i * 2, new gin::Knob (wt.tune, true), 1, 0); addControl (i * 2, new gin::Knob (wt.finetune, true), 2, 0); addControl (i * 2, new gin::Knob (wt.pan, true), 0, 1); @@ -78,7 +79,7 @@ public: auto& osc = proc.oscParams[i]; addPage ("OSC " + String (i + 1), 3, 4); - addPageEnable (i * 2, osc.enable); + addPageEnable (Cfg::numWTs * 2 + i * 2, osc.enable); addControl (Cfg::numWTs * 2 + i * 2, new gin::Select (osc.wave), 0, 0); addControl (Cfg::numWTs * 2 + i * 2, new gin::Knob (osc.tune, true), 1, 0); diff --git a/plugin/Source/PluginProcessor.cpp b/plugin/Source/PluginProcessor.cpp index 1ae0f15..fc01145 100644 --- a/plugin/Source/PluginProcessor.cpp +++ b/plugin/Source/PluginProcessor.cpp @@ -107,6 +107,7 @@ void WavetableAudioProcessor::WTParams::setup (WavetableAudioProcessor& p, int i String nm = "WT" + String (idx + 1) + " "; enable = p.addIntParam (id + "enable", nm + "Enable", "Enable", "", { 0.0, 1.0, 1.0, 1.0 }, idx == 0 ? 1.0f : 0.0f, 0.0f); + table = p.addExtParam (id + "table", nm + "Table", "Table", "", { 0.0, 1.0, 0.0, 1.0 }, 0.0f, 0.0f); voices = p.addIntParam (id + "unison", nm + "Unison", "Unison", "", { 1.0, 8.0, 1.0, 1.0 }, 1.0, 0.0f); voicesTrns = p.addExtParam (id + "unisontrns", nm + "Unison Trns", "LTrans", "st", { -36.0, 36.0, 1.0, 1.0 }, 0.0, 0.0f); tune = p.addExtParam (id + "tune", nm + "Tune", "Tune", "st", { -36.0, 36.0, 1.0, 1.0 }, 0.0, 0.0f); @@ -125,7 +126,7 @@ void WavetableAudioProcessor::OSCParams::setup (WavetableAudioProcessor& p, int String id = "osc" + String (idx + 1); String nm = "OSC" + String (idx + 1) + " "; - enable = p.addIntParam (id + "enable", nm + "Enable", "Enable", "", { 0.0, 1.0, 1.0, 1.0 }, idx == 0 ? 1.0f : 0.0f, 0.0f); + enable = p.addIntParam (id + "enable", nm + "Enable", "Enable", "", { 0.0, 1.0, 1.0, 1.0 }, 0.0f, 0.0f); wave = p.addIntParam (id + "wave", nm + "Wave", "Wave", "", { 1.0, 7.0, 1.0, 1.0 }, 1.0, 0.0f, waveTextFunction); voices = p.addIntParam (id + "unison", nm + "Unison", "Unison", "", { 1.0, 8.0, 1.0, 1.0 }, 1.0, 0.0f); voicesTrns = p.addExtParam (id + "unisontrns", nm + "Unison Trns", "LTrans", "st", { -36.0, 36.0, 1.0, 1.0 }, 0.0, 0.0f); @@ -397,6 +398,8 @@ void WavetableAudioProcessor::LimiterParams::setup (WavetableAudioProcessor& p) //============================================================================== WavetableAudioProcessor::WavetableAudioProcessor() { + formatManager->registerBasicFormats(); + enableLegacyMode(); setVoiceStealingEnabled (true); @@ -440,6 +443,9 @@ WavetableAudioProcessor::WavetableAudioProcessor() } setupModMatrix(); + + MemoryBlock mb (BinaryData::WINDOW_S_WAV, BinaryData::WINDOW_S_WAVSize); + updateWavetable (0, mb, 256); } WavetableAudioProcessor::~WavetableAudioProcessor() @@ -850,6 +856,22 @@ void WavetableAudioProcessor::handleController ([[maybe_unused]] int ch, int num modMatrix.setMonoValue (modSrcCC[num], val / 127.0f); } +void WavetableAudioProcessor::updateWavetable (int idx, MemoryBlock& src, int tableSize) +{ + if (auto reader = std::unique_ptr (formatManager->createReaderFor (std::make_unique (src, false)))) + { + AudioSampleBuffer buffer; + buffer.setSize (1, int (reader->lengthInSamples)); + reader->read (&buffer, 0, int (reader->lengthInSamples), 0, true, false); + + loadWavetables (waveTables[idx], buffer, reader->sampleRate, tableSize); + + for (auto v : voices) + if (auto wtv = dynamic_cast(v)) + wtv->setWavetable (idx, waveTables[idx]); + } +} + //============================================================================== bool WavetableAudioProcessor::hasEditor() const { diff --git a/plugin/Source/PluginProcessor.h b/plugin/Source/PluginProcessor.h index 47b5ed0..c2b5778 100644 --- a/plugin/Source/PluginProcessor.h +++ b/plugin/Source/PluginProcessor.h @@ -45,7 +45,7 @@ public: { WTParams() = default; - gin::Parameter::Ptr enable, voices, voicesTrns, tune, finetune, + gin::Parameter::Ptr enable, table, voices, voicesTrns, tune, finetune, level, detune, spread, pan; void setup (WavetableAudioProcessor& p, int idx); @@ -230,6 +230,9 @@ public: JUCE_DECLARE_NON_COPYABLE (LimiterParams) }; + //============================================================================== + void updateWavetable (int idx, MemoryBlock& src, int tableSize); + //============================================================================== gin::ModSrcId modSrcPressure, modSrcTimbre, modScrPitchBend, modSrcNote, modSrcVelocity, modSrcStep, modSrcMonoStep; @@ -237,6 +240,7 @@ public: Array modSrcCC, modSrcMonoLFO, modSrcLFO, modSrcFilter, modSrcEnv; //============================================================================== + SharedResourcePointer formatManager; WTParams wtParams[Cfg::numWTs]; OSCParams oscParams[Cfg::numOSCs]; @@ -277,6 +281,8 @@ public: AudioPlayHead* playhead = nullptr; + OwnedArray waveTables[Cfg::numWTs]; + //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WavetableAudioProcessor) }; diff --git a/plugin/Source/WavetableVoice.cpp b/plugin/Source/WavetableVoice.cpp index ed5cb65..4509358 100644 --- a/plugin/Source/WavetableVoice.cpp +++ b/plugin/Source/WavetableVoice.cpp @@ -12,6 +12,11 @@ WavetableVoice::WavetableVoice (WavetableAudioProcessor& p, BandLimitedLookupTab f.setNumChannels (2); } +void WavetableVoice::setWavetable (int idx, OwnedArray& table) +{ + wtOscillators[idx].setWavetable (table); +} + void WavetableVoice::noteStarted() { fastKill = false; @@ -51,7 +56,10 @@ void WavetableVoice::noteStarted() snapParams(); updateParams (0); snapParams(); - + + for (auto& osc : wtOscillators) + osc.noteOn(); + for (auto& osc : oscillators) osc.noteOn(); @@ -91,6 +99,9 @@ void WavetableVoice::noteRetriggered() updateParams (0); + for (auto& osc : wtOscillators) + osc.noteOn(); + for (auto& osc : oscillators) osc.noteOn(); @@ -137,6 +148,9 @@ void WavetableVoice::setCurrentSampleRate (double newRate) { MPESynthesiserVoice::setCurrentSampleRate (newRate); + for (auto& osc : wtOscillators) + osc.setSampleRate (newRate); + for (auto& osc : oscillators) osc.setSampleRate (newRate); @@ -161,9 +175,13 @@ void WavetableVoice::renderNextBlock (AudioBuffer& outputBuffer, int star // Run OSC ScratchBuffer buffer (2, numSamples); + for (int i = 0; i < Cfg::numWTs; i++) + if (proc.wtParams[i].enable->isOn()) + wtOscillators[i].processAdding (currentMidiNotes[i], wtParams[i], buffer); + for (int i = 0; i < Cfg::numOSCs; i++) if (proc.oscParams[i].enable->isOn()) - oscillators[i].processAdding (currentMidiNotes[i], oscParams[i], buffer); + oscillators[i].processAdding (currentMidiNotes[Cfg::numWTs + i], oscParams[i], buffer); // Apply velocity float velocity = currentlyPlayingNote.noteOnVelocity.asUnsignedFloat(); @@ -196,14 +214,32 @@ void WavetableVoice::updateParams (int blockSize) proc.modMatrix.setPolyValue (*this, proc.modSrcNote, note.initialNote / 127.0f); + for (int i = 0; i < Cfg::numWTs; i++) + { + if (! proc.wtParams[i].enable->isOn()) continue; + + currentMidiNotes[i] = noteSmoother.getCurrentValue() * 127.0f; + if (glideInfo.glissando) currentMidiNotes[i] = roundToInt (currentMidiNotes[i]); + currentMidiNotes[i] += float (note.totalPitchbendInSemitones); + currentMidiNotes[i] += getValue (proc.wtParams[i].tune) + getValue (proc.wtParams[i].finetune) / 100.0f; + + wtParams[i].voices = int (proc.wtParams[i].voices->getProcValue()); + wtParams[i].vcTrns = int (proc.wtParams[i].voicesTrns->getProcValue()); + wtParams[i].pw = getValue (proc.wtParams[i].table); + wtParams[i].pan = getValue (proc.wtParams[i].pan); + wtParams[i].spread = getValue (proc.wtParams[i].spread) / 100.0f; + wtParams[i].detune = getValue (proc.wtParams[i].detune); + wtParams[i].gain = getValue (proc.wtParams[i].level); + } + for (int i = 0; i < Cfg::numOSCs; i++) { if (! proc.oscParams[i].enable->isOn()) continue; - currentMidiNotes[i] = noteSmoother.getCurrentValue() * 127.0f; - if (glideInfo.glissando) currentMidiNotes[i] = roundToInt (currentMidiNotes[i]); - currentMidiNotes[i] += float (note.totalPitchbendInSemitones); - currentMidiNotes[i] += getValue (proc.oscParams[i].tune) + getValue (proc.oscParams[i].finetune) / 100.0f; + currentMidiNotes[Cfg::numWTs + i] = noteSmoother.getCurrentValue() * 127.0f; + if (glideInfo.glissando) currentMidiNotes[Cfg::numWTs + i] = roundToInt (currentMidiNotes[Cfg::numWTs + i]); + currentMidiNotes[Cfg::numWTs + i] += float (note.totalPitchbendInSemitones); + currentMidiNotes[Cfg::numWTs + i] += getValue (proc.oscParams[i].tune) + getValue (proc.oscParams[i].finetune) / 100.0f; oscParams[i].wave = (Wave) int (proc.oscParams[i].wave->getProcValue()); oscParams[i].voices = int (proc.oscParams[i].voices->getProcValue()); diff --git a/plugin/Source/WavetableVoice.h b/plugin/Source/WavetableVoice.h index 1b6a13b..ae73949 100644 --- a/plugin/Source/WavetableVoice.h +++ b/plugin/Source/WavetableVoice.h @@ -11,7 +11,9 @@ class WavetableVoice : public gin::SynthesiserVoice, { public: WavetableVoice (WavetableAudioProcessor& p, gin::BandLimitedLookupTables& bandLimitedLookupTables); - + + void setWavetable (int idx, OwnedArray& table); + void noteStarted() override; void noteRetriggered() override; void noteStopped (bool allowTailOff) override; @@ -35,7 +37,8 @@ private: WavetableAudioProcessor& proc; gin::BandLimitedLookupTables& bandLimitedLookupTables; - gin::VoicedStereoOscillator oscillators[Cfg::numOSCs] = + gin::WTVoicedStereoOscillator wtOscillators[Cfg::numWTs]; + gin::BLLTVoicedStereoOscillator oscillators[Cfg::numOSCs] = { bandLimitedLookupTables, }; @@ -49,8 +52,10 @@ private: gin::AnalogADSR adsr; - float currentMidiNotes[Cfg::numOSCs]; - gin::VoicedStereoOscillator::Params oscParams[Cfg::numOSCs]; + float currentMidiNotes[Cfg::numWTs + Cfg::numOSCs]; + + gin::WTVoicedStereoOscillator::Params wtParams[Cfg::numWTs]; + gin::BLLTVoicedStereoOscillator::Params oscParams[Cfg::numOSCs]; gin::EasedValueSmoother noteSmoother; diff --git a/plugin/Wavetable.jucer b/plugin/Wavetable.jucer index 5de073b..7e2b7c7 100644 --- a/plugin/Wavetable.jucer +++ b/plugin/Wavetable.jucer @@ -6,6 +6,11 @@ pluginManufacturerCode="Soca" pluginCode="SLwt" pluginAUMainType="'aumu'" cppLanguageStandard="latest" pluginChannelConfigs="{0,2}" version="0.0.2"> + + + + +