From 0a5110c8d3b79a45e362097bd85b8ced45547910 Mon Sep 17 00:00:00 2001 From: Takeshi Yokemura Date: Tue, 18 May 2021 23:57:43 +0900 Subject: [PATCH] Basic monophonic --- Source/BaseVoice.cpp | 7 +++++++ Source/BaseVoice.h | 2 ++ Source/CustomSynth.cpp | 25 ++++++++++++++++++++++++- Source/CustomSynth.h | 1 + 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/Source/BaseVoice.cpp b/Source/BaseVoice.cpp index 67fa17b..9332ed4 100644 --- a/Source/BaseVoice.cpp +++ b/Source/BaseVoice.cpp @@ -218,6 +218,13 @@ void BaseVoice::renderNextBlock (AudioSampleBuffer& outputBuffer, int startSampl } } +void BaseVoice::changeNote (int midiNoteNumber, float velocity) { + noteNumber = midiNoteNumber; + + ampByVelocityAndGain = * (settingRefs->gain) * velocity; // velocity value range is 0.0f-1.0f +} + + void BaseVoice::calculateAngleDelta() { auto cyclesPerSecond = MidiMessage::getMidiNoteInHertz (noteNumber); diff --git a/Source/BaseVoice.h b/Source/BaseVoice.h index 6acc79e..9a95a38 100644 --- a/Source/BaseVoice.h +++ b/Source/BaseVoice.h @@ -24,6 +24,8 @@ struct BaseVoice : public SynthesiserVoice void pitchWheelMoved (int) override {} void controllerMoved (int, int) override {} void renderNextBlock (AudioSampleBuffer& outputBuffer, int startSample, int numSamples) override; + + void changeNote (int midiNoteNumber, float velocity); virtual float voltageForAngle (double angle) = 0; virtual void onFrameAdvanced() {}; diff --git a/Source/CustomSynth.cpp b/Source/CustomSynth.cpp index 6434d8a..ed1bf4d 100644 --- a/Source/CustomSynth.cpp +++ b/Source/CustomSynth.cpp @@ -9,13 +9,36 @@ */ #include "CustomSynth.h" +#include "BaseVoice.h" +#include "PluginProcessor.h" CustomSynth::CustomSynth(Magical8bitPlug2AudioProcessor& p) : processor(p) {} void CustomSynth::noteOn(int midiChannel, int midiNoteNumber, float velocity) { - Synthesiser::noteOn(midiChannel, midiNoteNumber, velocity); + // Poly + if (!processor.settingRefs.isMonophonic()) { + Synthesiser::noteOn(midiChannel, midiNoteNumber, velocity); + return; + } + + // Mono + auto voice = voices.getFirst(); + + if (voice == nullptr) { + return; + } + if (voice->isKeyDown()) { + ((BaseVoice*)voice)->changeNote(midiNoteNumber, velocity); + } else { + Synthesiser::noteOn(midiChannel, midiNoteNumber, velocity); + } } void CustomSynth::noteOff(int midiChannel, int midiNoteNumber, float velocity, bool allowTailOff) { Synthesiser::noteOff(midiChannel, midiNoteNumber, velocity, allowTailOff); } + +void CustomSynth::allNotesOff (const int midiChannel, const bool allowTailOff) { + Synthesiser::allNotesOff(midiChannel, allowTailOff); +} + diff --git a/Source/CustomSynth.h b/Source/CustomSynth.h index ce09be4..a839784 100644 --- a/Source/CustomSynth.h +++ b/Source/CustomSynth.h @@ -19,6 +19,7 @@ public: void noteOn(int midiChannel, int midiNoteNumber, float velocity) override; void noteOff(int midiChannel, int midiNoteNumber, float velocity, bool allowTailOff) override; + void allNotesOff (const int midiChannel, const bool allowTailOff) override; private: Magical8bitPlug2AudioProcessor& processor;