From ae76e125dc76e66b9b4a6a945a3dab56b26b5085 Mon Sep 17 00:00:00 2001 From: Shane Dunne Date: Mon, 2 Sep 2019 10:59:19 -0400 Subject: [PATCH 1/4] Simplify .jucer file These changes allow use of the default JUCE paths on all platforms. Life is much simpler if you put JUCE where it "wants" to be: ~/JUCE on Mac/Linux or C:\JUCE on Windows. I also cleaned up some settings for the VS2019 builds. x64/x32 were reversed, etc. This is all tested in both VS2019 and VS2017. --- OB-Xd.jucer | 131 ++++++++++++++++++++++++++-------------------------- 1 file changed, 66 insertions(+), 65 deletions(-) diff --git a/OB-Xd.jucer b/OB-Xd.jucer index 6d4ba21..c3ca3c1 100644 --- a/OB-Xd.jucer +++ b/OB-Xd.jucer @@ -75,19 +75,19 @@ osxArchitecture="64BitIntel"/> - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -96,19 +96,19 @@ targetName="Obxd64"/> - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -139,22 +139,22 @@ - - + + - - - - - - - - - - - - + + + + + + + + + + + + @@ -165,36 +165,37 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + From 1e54c4d37df45e9ddd3994ac566c38886268b216 Mon Sep 17 00:00:00 2001 From: Shane Dunne Date: Mon, 2 Sep 2019 11:03:43 -0400 Subject: [PATCH 2/4] Support JUCE 5.4.3 AND 5.4.4 JUCE 5.4.4 breaks a lot of code, because several APIs that used to use plain pointer types have been converted to std::unique_ptr. Fortunately, this only affects the OB-Xd code in two spots. I've done a bit of fancy footwork with #define/#if to allow the code to compile cleanly with either version, but this kind of thing shouldn't be carried on forever. I'd strongly recommend switching to JUCE 5.4.4 as soon as it's practical, and then getting rid of all this #if business. --- Source/PluginProcessor.cpp | 135 ++++++++++++++++++++++--------------- 1 file changed, 80 insertions(+), 55 deletions(-) diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index cba424f..166cf82 100755 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -11,6 +11,9 @@ It contains the basic startup code for a Juce application. #include "PluginEditor.h" #include "Engine/Params.h" +// Compare JUCE_VERSION against this to check for JUCE 5.4.3 and earlier +#define JUCE_543 328707 + //only sse2 version on windows #ifdef _WINDOWS #define __SSE2__ @@ -724,7 +727,7 @@ AudioProcessorEditor* ObxdAudioProcessor::createEditor() } //============================================================================== -void ObxdAudioProcessor::getStateInformation (MemoryBlock& destData) +void ObxdAudioProcessor::getStateInformation(MemoryBlock& destData) { XmlElement xmlState = XmlElement("Datsounds"); xmlState.setAttribute(S("currentProgram"), programs.currentProgram); @@ -734,6 +737,7 @@ void ObxdAudioProcessor::getStateInformation (MemoryBlock& destData) { XmlElement* xpr = new XmlElement("program"); xpr->setAttribute(S("programName"), programs.programs[i].name); + xpr->setAttribute(S("voiceCount"), Motherboard::MAX_VOICES); for (int k = 0; k < PARAM_COUNT; ++k) { @@ -750,60 +754,7 @@ void ObxdAudioProcessor::getStateInformation (MemoryBlock& destData) xmlState.setAttribute(String(i), bindings.controllers[i]); } - copyXmlToBinary(xmlState,destData); -} - -void ObxdAudioProcessor::setStateInformation (const void* data, int sizeInBytes) -{ - if (XmlElement* const xmlState = getXmlFromBinary(data,sizeInBytes)) - { - XmlElement* xprogs = xmlState->getFirstChildElement(); - if (xprogs->hasTagName(S("programs"))) - { - int i = 0; - forEachXmlChildElement(*xprogs, e) - { - programs.programs[i].setDefaultValues(); - - for (int k = 0; k < PARAM_COUNT; ++k) - { - programs.programs[i].values[k] = e->getDoubleAttribute(String(k), programs.programs[i].values[k]); - } - - programs.programs[i].name = e->getStringAttribute(S("programName"), S("Default")); - - ++i; - } - } - - for (int i = 0; i < 255; ++i) - { - bindings.controllers[i] = xmlState->getIntAttribute(String(i), 0); - } - - setCurrentProgram(xmlState->getIntAttribute(S("currentProgram"), 0)); - - delete xmlState; - } -} - -void ObxdAudioProcessor::setCurrentProgramStateInformation(const void* data,int sizeInBytes) -{ - if (XmlElement* const e = getXmlFromBinary(data, sizeInBytes)) - { - programs.currentProgramPtr->setDefaultValues(); - - for (int k = 0; k < PARAM_COUNT; ++k) - { - programs.currentProgramPtr->values[k] = e->getDoubleAttribute(String(k), programs.currentProgramPtr->values[k]); - } - - programs.currentProgramPtr->name = e->getStringAttribute(S("programName"), S("Default")); - - setCurrentProgram(programs.currentProgram); - - delete e; - } + copyXmlToBinary(xmlState, destData); } void ObxdAudioProcessor::getCurrentProgramStateInformation(MemoryBlock& destData) @@ -815,11 +766,85 @@ void ObxdAudioProcessor::getCurrentProgramStateInformation(MemoryBlock& destData xmlState.setAttribute(String(k), programs.currentProgramPtr->values[k]); } + xmlState.setAttribute(S("voiceCount"), Motherboard::MAX_VOICES); xmlState.setAttribute(S("programName"), programs.currentProgramPtr->name); copyXmlToBinary(xmlState, destData); } +void ObxdAudioProcessor::setStateInformation(const void* data, int sizeInBytes) +{ +#if JUCE_VERSION <= JUCE_543 + XmlElement * const xmlState = getXmlFromBinary(data, sizeInBytes); +#else + std::unique_ptr xmlState = getXmlFromBinary(data, sizeInBytes); +#endif + if (xmlState) + { + XmlElement* xprogs = xmlState->getFirstChildElement(); + if (xprogs->hasTagName(S("programs"))) + { + int i = 0; + forEachXmlChildElement(*xprogs, e) + { + bool newFormat = e->hasAttribute("voiceCount"); + programs.programs[i].setDefaultValues(); + + for (int k = 0; k < PARAM_COUNT; ++k) + { + float value = float(e->getDoubleAttribute(String(k), programs.programs[i].values[k])); + if (!newFormat && k == VOICE_COUNT) value *= 0.25f; + programs.programs[i].values[k] = value; + } + + programs.programs[i].name = e->getStringAttribute(S("programName"), S("Default")); + + ++i; + } + } + + for (int i = 0; i < 255; ++i) + { + bindings.controllers[i] = xmlState->getIntAttribute(String(i), 0); + } + + setCurrentProgram(xmlState->getIntAttribute(S("currentProgram"), 0)); + +#if JUCE_VERSION <= JUCE_543 + delete xmlState; +#endif + } + } + +void ObxdAudioProcessor::setCurrentProgramStateInformation(const void* data, int sizeInBytes) +{ +#if JUCE_VERSION <= JUCE_543 + XmlElement * const e = getXmlFromBinary(data, sizeInBytes); +#else + std::unique_ptr e = getXmlFromBinary(data, sizeInBytes); +#endif + if (e) + { + programs.currentProgramPtr->setDefaultValues(); + + bool newFormat = e->hasAttribute("voiceCount"); + for (int k = 0; k < PARAM_COUNT; ++k) + { + float value = float(e->getDoubleAttribute(String(k), programs.currentProgramPtr->values[k])); + if (!newFormat && k == VOICE_COUNT) value *= 0.25f; + programs.currentProgramPtr->values[k] = value; + } + + programs.currentProgramPtr->name = e->getStringAttribute(S("programName"), S("Default")); + + setCurrentProgram(programs.currentProgram); + +#if JUCE_VERSION <= JUCE_543 + delete e; +#endif + } +} + //============================================================================== bool ObxdAudioProcessor::loadFromFXBFile(const File& fxbFile) { From f01bb6ff6877da794edfaaad3697053b4af0c3e7 Mon Sep 17 00:00:00 2001 From: Shane Dunne Date: Mon, 2 Sep 2019 11:13:53 -0400 Subject: [PATCH 3/4] 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 zcmXw7dpy(s_n%1RlKXAwqtsk-&1OiHYvtO9+{2J-jFL+Ym5?%*l4PPaAFJFWBTQ~1 zav4o7V^~JXWfa5kd#}E~KlXUNc3$t-InUSgJkNPwQtfRm1^K{yAP`9K!g;fQfl&km z;szbu2h40jWe)?xq44vrH$WhMQO=KRa3Y=!7^Nf4T_PQj{*lp$>sLYHh@h}Yjj*ec z3Q!Gg4Va&$3*bqTc){$PV~pow{x-p>Bev7dxA&rC=+}oAvWtUCFYaJnOGM1HTnQT6RoeL+ z&zQKq{@JkFE57pj*y62WX52=>^5>t=1B|wxM=z)3)DkCU-)on~&Ut4<^Ekk=!xq1f zMbCS?du8C$LX>|+1>D{nB@-G947M|t78j%XNigxn(>Hybx9_Sr;G+cPaC`(6^Py3r z@ZHa8qtyus)Vi#V@}`N=OJ$=Iqw!lmW-IIpckyD7G|%SR68c%O#mJj-GV%qhQ;CK3 zzlX7p=GG%&Uu`$M_og?*}jYrHdL7#6tr(Oi3crqB8@u?AJ z#1B_1O%(6ly%7*T$8C9d(U_W&c;txw`-aAtN)uDNmAxyA+nqFR;)(6$-A_-(Gvu*+ zKe`_wY)>~$I5zI27`v?enn7c{#%gzv42|49rRd2+a_$Z2#JLkzadb@^`R2&okx}wO z^G@%eL{CsCYvSY&gIQ(id9Y#B{I5gVQVE;Wq+X0MWpFTIDNU`Y(GQC~B?*};HeOez z&;|#u&p8uUS@}x0GlWPmxf!$NRIFt{U(5H3;2BEn`YxL4^v{gFhB7SpGo=bKZY z->{I}nKXQ>s!@1l9x{BTH`;Bl{-#~+*p|zF3QEy)bT`_#?zcl`8~ZB{?H%z2F>2Fm zop7c($kzeY=GJhU7Che5VZX7x_xm5KX91{&;x)nX@gegvGfU7ncFI4c2@ylfH8qv1 z|5{TMz73@BgeI(0D*io#!bI-vL<$v)KAF$^=~)@n!@x886Z~hpWBD1zS~q`?$p|6m z*@f@lO?czx$7j9bYEZv}!929vAAT)hX_4H1I`axkqm+K^(M*Sml+C-R(grgoS)bri z8Xomgi$9eL*=rSX>arnMhV;X)E!2j7QQtem?o#|E=6759Cg~*sWos83{-ck3JJne)=I76YSnFB|jo}{2S9TI3=trJwCrY~P5AkH_mOMD)FzN2qW^j(1XVj-vX+7_Tl-ixk0h0;vKHh$sTl}_~(h(|X|M&i%gK}dG&#Fc4 zD=nI?p@tpmuB#I567dPQ|1EDT{Pq(gyW-_sS#5OuyAXUAhb8QO7LR1JQQWQMM9J5c zzn?CPdJVKSN)HdnLAMLr6!Fu%+ojILy|E91n(U#13B_g4t2^y5#zlkEBbTe-xEBk1 zo3g_y&gOcSS7L*zOt@*u8U@>JOuCesrvUZflgx@ zk9z_+XPPzJp=GIvl9iu)w^&iYBEfSiT+jHfm!>{}tP2R9M?HR~24y^cw>2*jHT!k% zL-2%wTjKFxk0fl1G_`=v-Hy8dFi>>{KBGEASl*kz8CVxQF=lS{%sS8TxvOnZ?f{JD zi7eLHUS{gwxC5JV?mP=k{)%f0Fs?I-WEv`xKt(GdYMx?X9K zj9!92TRyt7ay0*lp?+ixE1NxEQERHu&Ud9M>i0JlA=H-SJ)ETOjYyYSOyEdb@AK2q z!(ti6J3rqAIF;vWhe)1^`Dj*eI=5c7)84NUKV3V11Or=Or!0H1Iu5kL#o8?DeW6$6 zU#4ltL^7;#o3s6eu2)$W=Bi>>OY5_=!cKlIcU`Bd8hi?{*q2*(O*tsnC>g<^SNBHN z)+k8pB}f*NIzhObCfCZP!;dsa-qj%Q+o#KQmAm6fG&La#|}JBc&I! zw`Cb+_Ejc|H@w)pQQzz>_e4PV23hxuvuL#V4+M$sbEY%!#&lH|<5=y|fdN6==JhS1 z#R{aldNeI=gKf@#HMD`~yyT7)s@v*(ae6o`=B{uUS;uO*X=8Ht2JQ{5;I+_PO0n8| zq1|o5M`i}`*MH=NDG%HksIW8t-gNX`sp%q%t2`&8X z$gSP%ydSKxAmBW`o&9jC2)-Q_VNVqg=(uVVo;fAE@7UXXq#9oiFaPmRglUI^Q(Ur; z9Qi`mdur|Cw0TiV^$A}@b))MywVS^QN@U^UmxzTx=YDU&gqR3>#<*q<RDT;r-G8N{TTW>cExF*exDDp zy3JU!kRcdmilL>tE}Z^vLOG8U6Lmcr7dUt~pX|L9mYoMoDBg~CK}=;M`xA>dv;@BK z*|dufoPa%~o*`quuVjNLfvlxfb*cOK*ZX>)SBX!d zRc5?6CW{f==&-7oy@=_7JJVkrb5a?L*yPw8Tio6))}d~|CRKoC@ElmwiBcw=&H; z11Ca6Wzv#gX|&HD+U>vMX64rfz4{ee~ zx<8#7H%hkskmI=TDy?Y8!w5!+0_Tzz%guMP5!7 za7sKxypQ~DmTW?IFBU1;z~4n*urXS|nnPW`J043UuY8)tFc z1JYNMp+-txRSD-wy^4CMvMzZ@?WobzJE{xQ+k+gFLxK|-{Ze}Tw;KOY*8{&bbH?iq zU)V9zVkT=ihWOFwWFFwX)a4mcOZ!junCNDJ=JE7SxTHS^ve-1Hpi9A5cv`meyM!d< z4_H%0^hUd=Op&~CykhyW_#r?*B)TjZ0?qo1lq~Iel7mxQUG5%|J*#6`!{PEd8D5%B z+b3HB_7_VLZo_{5=HE#N+gerrW8no9D#? z>V6Jk?{H8+kI?i?;-H6ZfRMFF4VvD)=Z_r!0x?tcx846&a^<{f&mCsXcxAZvHh}Ui zPzAPmprhZ$$B$LI=|sWwXFTc<5rRfOIp6l0HfXOnzAmyQ?SOg;WV%BE&T$<`GO$0< zk^P78dSPEG>jw$>dmAYpnk{J+EM5YGr!eSqvP%yfX7cou!yZ=8yo2bSUlBaVq3%A) z3UW%?rVIYT?6(_7@SSicJ+L}Qe@ygATaF|RiQ32S-v<`c?)JlV9^d+V)t|cUoRcNI zH3JA*QQ>5wCD3}K8$~w-X2Du-@sWM-+C$K=b?I}*OtC7~EpB1jHcu&ec8)lNIvn@O zqfHHx;XjjgbS8}yuC!i@k&7_ZbGk#BdPF8nv5 z^xaLipkpX{Il;e{O^L)$b4(ULY7~1-^S+x0SFwKl^5gn6C0ZcYdA1$J{Zy0}^ zj|1GFAUQK|BbwCLz)N@;Vx~7v14UGT&Qx>~=FgQ(TV*4sTYj+A4PDv~fN8CX`%R19 zWCAABw#!WS7<+F&0BvicM-t$dUr3UfP9m&$YYzvrCFR7=OQSjeT2y~LSOxY|tD(fC z1N?%Lv%tQ_@nBJs+APHKEes3Xvd-b~TGE1Ia^}x-T7jZST?O*-n!(9LFF`8_n}mk zVd++U+!R*;$FxEcRyssAo#T0azGAGf`&;<^H*FEpZ(E})m1()4G{v%6ao&f%I(Gt;HB792i$k4!H`(>usu<4aO^yy5{yRb9o_AlN%Sj~v%T~&7&w)R0E%Nq z@R?TGRw>i$-*x!uSAESE=goP+;l)9kZ|TqQcGJSHQ9L=A$b9xF!a@3V(}39~>He!o z2kD2}11yqCnhgFv}2zjvT5V(12t7nBzzACEghX+{$=91Cl|9r&~HmmqLQGyUNmO-MY!J&yd4MhvjHK zDguCJ(GpN{3>65 zk(NCUU=t@v>a{_D?3_$HE)iq`dk#%R~F3qilcd2xt59LJBD z|DOZ$ZZi7Kytv6fspwJ@(r1+OK3TL+EIe+(Y= zBkz}X>V=a(D!e**0r9%9aJb)&zXbL)PcA~As)f@I(IdfK4^MKc#3!M9i>{#YNKERs zfJf8yge_+C9-~-mpzd$}f%^W#@(&t^>sK$jS?YEOWuGel8N${M!61GuR3K#6nU&0G zuz>}CReuf)1vGVV>Mo|$e&uW)-zLdRGYR{^6iUQ0|CQ$ZOV8^uKz~)&oBo##ZV8Dz zWlo5D%s=sbN;k!4figN<4e$>TuZ%kIXcfIg-k+ZtYQpI3H8k!BCUyY9XHZXqG-_Y< zuAuiKlu;7LC7Q{~Cv~?fT>sUWb61IfLNwol^*FMJ-?Bq;M4K;x*64($?q>ft49x-U zMXzedHK{a6gVg=KysN4ScU4S*Z#C|_ss~xNvzl5zrb`rlUN{jiW}_1C8~@UprFsze zii8YgiSK+>qp$=|F)u(4)J4eX9sZJ0{8EyMVTW9j_M9j3`Mh-QL`G~Ulxpi>;?6T| zE_$O#iFa~(y`~ySK--j{jxgb>usj~1ZC?7JI;&|9v=$6S*gScYALw?bQ(~XI27vCk z#h3#?qLHt#@)~v7&E8NxVDWSyo4p^6bP@yJjp&%bdCcCn`#t2VtV8NMyE#*UVSiW$ zRJ^(Q1mHkzbsGZ&Ow_h5wvO7+&69oarc(^FZmjQ5V!Dfm&0J)o+mT?ZvPhU)ggK5p zWzjQTOd%bBN+rokq+pzSGI^+h-QzW5?EQjaWSf!+?%;4bbYfk%EK+YsIs8$Wn@sZ0 zTjF)*@Uo~<7-xWbL&4NQeQJ%HQ&2c=CVZ$nTN=$vm@lRTi-yzFr$XI28cM!qd{Ks2 il2*pjUA&g}KzCFnhn5k+^1#<_&;@f_vvL#fd;bS6!l*R> 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); From 46db00baefc38f598a48d4d40aa5920d15851f40 Mon Sep 17 00:00:00 2001 From: Shane Dunne Date: Mon, 2 Sep 2019 11:31:30 -0400 Subject: [PATCH 4/4] One more .jucer change I missed one item for the Xcode export. Life is also easier if you put the VST3 SDK where Steinberg expects them, which is ~/SDKs/VST3_SDK on Mac or Linux, or C:\SDKs\VST3_SDK on Windows. --- OB-Xd.jucer | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/OB-Xd.jucer b/OB-Xd.jucer index c3ca3c1..1165bb0 100644 --- a/OB-Xd.jucer +++ b/OB-Xd.jucer @@ -65,8 +65,7 @@ - +