From f01bb6ff6877da794edfaaad3697053b4af0c3e7 Mon Sep 17 00:00:00 2001 From: Shane Dunne Date: Mon, 2 Sep 2019 11:13:53 -0400 Subject: [PATCH] Increase max voice count to 32 This code includes the changes needed for compatibility with older patch/bank files, which assume a maximum count of 8. New patches/banks will be saved with an extra XML attribute (voiceCount="32"); if this is not present, then a value of "1.0" for the voice count will be interpreted as 8. --- Source/Engine/Motherboard.h | 16 +++++++++------- Source/Engine/SynthEngine.h | 4 ++-- Source/Images/voices.png | Bin 3496 -> 5936 bytes Source/PluginEditor.cpp | 28 ++++++++-------------------- 4 files changed, 19 insertions(+), 29 deletions(-) diff --git a/Source/Engine/Motherboard.h b/Source/Engine/Motherboard.h index 12477f0..21d9201 100755 --- a/Source/Engine/Motherboard.h +++ b/Source/Engine/Motherboard.h @@ -48,8 +48,9 @@ public: bool vibratoEnabled; float Volume; - const static int MAX_VOICES=8; - float pannings[MAX_VOICES]; + const static int MAX_VOICES = 32; + const static int MAX_PANNINGS = 8; + float pannings[MAX_PANNINGS]; ObxdVoice voices[MAX_VOICES]; bool uni; bool Oversample; @@ -79,7 +80,7 @@ public: // pannings = new float[MAX_VOICES]; totalvc = MAX_VOICES; vq = VoiceQueue(MAX_VOICES,voices); - for(int i = 0 ; i < MAX_VOICES;++i) + for(int i = 0 ; i < MAX_PANNINGS;++i) { pannings[i]= 0.5; } @@ -362,11 +363,12 @@ public: float x1 = processSynthVoice(voices[i],lfovalue,viblfo); if(Oversample) { - float x2 = processSynthVoice(voices[i],lfovalue2,viblfo2); vlo+=x2*(1-pannings[i]); - vro+=x2*(pannings[i]); + float x2 = processSynthVoice(voices[i],lfovalue2,viblfo2); + vlo+=x2*(1-pannings[i % MAX_PANNINGS]); + vro+=x2*(pannings[i % MAX_PANNINGS]); } - vl+=x1*(1-pannings[i]); - vr+=x1*(pannings[i]); + vl+=x1*(1-pannings[i % MAX_PANNINGS]); + vr+=x1*(pannings[i % MAX_PANNINGS]); } if(Oversample) { diff --git a/Source/Engine/SynthEngine.h b/Source/Engine/SynthEngine.h index 7e74550..c916590 100755 --- a/Source/Engine/SynthEngine.h +++ b/Source/Engine/SynthEngine.h @@ -166,7 +166,7 @@ public: } void setVoiceCount(float param) { - synth.setVoiceCount(roundToInt((param*7) +1)); + synth.setVoiceCount(roundToInt((param*(synth.MAX_VOICES-1)) +1)); } void procPitchWheelAmount(float param) { @@ -184,7 +184,7 @@ public: } void processPan(float param,int idx) { - synth.pannings[idx-1] = param; + synth.pannings[(idx-1) % synth.MAX_PANNINGS] = param; } void processTune(float param) { diff --git a/Source/Images/voices.png b/Source/Images/voices.png index c8af407f54e7869381af7ce889243faa4e42c543..fdaa2a3a709a4feb69820d982b9104d3a990afd3 100755 GIT binary patch literal 5936 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 literal 3496 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 L3&V2#JJJ6E2Kblx diff --git a/Source/PluginEditor.cpp b/Source/PluginEditor.cpp index c50300f..989a9d5 100755 --- a/Source/PluginEditor.cpp +++ b/Source/PluginEditor.cpp @@ -287,14 +287,8 @@ void ObxdAudioProcessorEditor::rebuildComponents() envelopeDetuneKnob = addTinyKnob(1353,300,ownerFilter,ENVDER,"Env",0.2); voiceSwitch = addNormalButtonList(124,338,17,ownerFilter,VOICE_COUNT,"VoiceCount",ImageCache::getFromMemory(BinaryData::voices_png,BinaryData::voices_pngSize)); - voiceSwitch ->addChoise("1"); - voiceSwitch ->addChoise("2"); - voiceSwitch ->addChoise("3"); - voiceSwitch ->addChoise("4"); - voiceSwitch ->addChoise("5"); - voiceSwitch ->addChoise("6"); - voiceSwitch ->addChoise("7"); - voiceSwitch ->addChoise("8"); + for (int i=1; i <= 32; i++) + voiceSwitch ->addChoise(String(i)); voiceSwitch ->setValue(ownerFilter->getParameter(VOICE_COUNT),dontSendNotification); legatoSwitch = addNormalButtonList(25,338,65,ownerFilter,LEGATOMODE,"Legato",ImageCache::getFromMemory(BinaryData::legato_png,BinaryData::legato_pngSize)); @@ -400,14 +394,8 @@ void ObxdAudioProcessorEditor::rebuildComponents() bendLfoRateKnob = addNormalKnobClassic(364,345,ownerFilter,BENDLFORATE,"ModRate",0.4); voiceSwitch = addNormalButtonListClassic(172,321,38,ownerFilter,VOICE_COUNT,"VoiceCount",ImageCache::getFromFile(skinFolder.getChildFile("voices.png"))); - voiceSwitch ->addChoise("1"); - voiceSwitch ->addChoise("2"); - voiceSwitch ->addChoise("3"); - voiceSwitch ->addChoise("4"); - voiceSwitch ->addChoise("5"); - voiceSwitch ->addChoise("6"); - voiceSwitch ->addChoise("7"); - voiceSwitch ->addChoise("8"); + for (int i=1; i <= 32; i++) + voiceSwitch->addChoise(String(i)); voiceSwitch ->setValue(ownerFilter->getParameter(VOICE_COUNT),dontSendNotification); legatoSwitch = addNormalButtonListClassic(65,321,95,ownerFilter,LEGATOMODE,"Legato",ImageCache::getFromFile(skinFolder.getChildFile("legato.png"))); @@ -511,7 +499,7 @@ void ObxdAudioProcessorEditor::sliderValueChanged (Slider* c) handleSParam(lfoAmt1Knob,LFO1AMT) handleSParam(lfoAmt2Knob,LFO2AMT) - handleSParam(pan1Knob,PAN1) + handleSParam(pan1Knob,PAN1) handleSParam(pan2Knob,PAN2) handleSParam(pan3Knob,PAN3) handleSParam(pan4Knob,PAN4) @@ -671,12 +659,12 @@ void ObxdAudioProcessorEditor::mouseUp(const MouseEvent& e) int bankStart = 1000; { - const String currentBank = getFilter()->getCurrentBankFile().getFileName(); - + const String currentBank = getFilter()->getCurrentBankFile().getFileName(); + for (int i = 0; i < banks.size(); ++i) { const File bank = banks.getUnchecked(i); - bankMenu.addItem(i + bankStart + 1, bank.getFileNameWithoutExtension(), true, bank.getFileName() == currentBank); + bankMenu.addItem(i + bankStart + 1, bank.getFileName(), true, bank.getFileName() == currentBank); } menu.addSubMenu("Banks", bankMenu);