From 5788e70d4749ef98d429bb0abd30787a74e6e533 Mon Sep 17 00:00:00 2001 From: DeRobyJ Date: Sat, 26 Jul 2014 16:02:44 +0200 Subject: [PATCH 1/2] Italian Localization Update All the strings present in the source are updated. --- data/locale/it.qm | Bin 195809 -> 230539 bytes data/locale/it.ts | 10 ++++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/data/locale/it.qm b/data/locale/it.qm index 28ddcfd3ae84ff347c185a9d617927bce8b1e7f7..f5b44309d3ba96baa36e87c11f7c4364d438e0a4 100644 GIT binary patch delta 35617 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 PhHm@^5sWies?qru8ihZ@ delta 11702 zcmX|{30O_r`^Vq4_TFbcr_7aP$W&BjrO1>NLdsBND#}oXGINAnLMR;5HH9)Il0(QC z3K`;>Gf$Cu%J~0w_V4*Wo_jz0>~r?oYp?ab-*?z8T4;DwrZsvU3b!eEw|?cN+V;nX zY(93sBT>WEL{yJx%SW&kQPx)!=)Y-1 zk|$A*Hx}|fUb3ncv*N75F@b$agDIz;dFlxOUoQ3t1_~ z?~1Xf{UsxH-Ae4uHzNNt#0KJNLB6ylQLnv3znT#Rg%Q2-micxcSVZ*ONYobt7!$x$ zV!NVczRe=)-x=q>%KTG>D5M2Zj6G4P7se@-`99r3Hux(B8hn~qzX~$%Z6Jy?6P>{_ zkHZq5#gdN0ikzK9G<_ja!71Vg&Jj}-kl=%r*}sznU#!IbW+eE5S*|3k!gU7*k#G<+ z2a)gv*PAbsIA9L3_X?TcACfpCj_8|lnB{=Ek0fzHH{$(Qf~myC`!e-L5|ic;E8Rfi z_NiDQ3;^<^&LpN?C+@Y8#9gt(?)Q}WDucxAVq$yDBp$@-jNB`8ryaPN=z5riY*#y( z#y!n(P)xMBA&EJTFd~t}>mt#Nc_iNaLoDN?%)D0?@(}zU=lS6EB;MMF?HCPaT`Eb5^YF!Ne6e^Vu}>Hv2?nzh-0p^%PnEf{{4=b1 zGq`&z@mNeW6MMP^*MWS(Y?2OQz<1k7I_g8L)n<~8B@j!dtqeGq#E^>$R~ibw#CF3o+QVaO<|nJ zz~)4G5;goinXJh%E zotG>pI17}yeiSuo1mkj_PmLDs1;0?E#TZZ-MU7VHfhKBn2IoBvlba%dc;-@So`@UQ ztU)bDJR)lFlUl`XA(q{SJVwGx4%{M-(Rku)JMwtYoVaf;wYeBheDobMdX+CtRw}g( z#SadKQQPtr$a+TY%6ae}wJ+x(e`^05#Ut;(=f^^Sa{dy#^@O^ukU4^8$mr16XCaaD4-#f z?L!X=SP)6<%tPuq47xt!2leWQCw;lXLU#Ku^_dBwIo1}0Q64i=pV_df6RoLFJZ$R3 zRO++q8nNl`D9H6QY-KP7g<$-h11M-$5i#S8SPCjQ0BaBYA2(9aOX&97rxe^f1AEzl zf`_amJ~otsM+eCebWn+MKGB3o*d|#FNMq;TmT2SA_)x=q%%#bK>8?iyD7V_mH z_z7;liuy%mk&)evp?<&dgCXl>?tMu8^$BpNTGT%gTeH`dLfr8E{lhX#Y$#+jw&HUY znSYv5$gyN%ckua446#wk7V>x{g$j7m=m``$DiPydr-2Ia<~bVFN)0#lp+P^>jl}0W zQCP%yV&Ce46TpEq{Br=Y$D=7K4*})FQVZFp^%in*Jxwe(+WgiOD`Khhr&6qhrOrP> zliF4$=5mB)%v?)sW|W1T|3fn?2NR36rdhuo@#GgMKHZaer$Ln9X|yNq7)whBBSdzL zqLr7|5bu&l|LzJS>Sj+{Qj&?j_{sb=+(OoRKBdkrfbmtMt&^4#s~<$$8HA{Q14@4q zM{MLX+I=p9s8TlNY{7#hY3NkzH0Vqw<&`=S^SeyvT2~~#u@_x3zKSB2XQFF2@I>AZ zEM)!xbTbV?b1n*m(45;xciZ_On5p2Lw=H4h~ z6Nej3cVl$|uM)HOVQzhsh~@ld%`%dRHe6$^t?Ll0^@z2O!IRX##5`tZBPdDCW5H?S zZEG;k8yceY_pI&vw?yM>vi41<5Z9_$`@66m`{S(3Gy~C3(P%kfPXn31$p-G0EAvM& z>k%A8?8`RRb5nm}BZ@8L#(Jz*lMT@FUaap22+{JdEW{Ja__31ApGG#M{6eSU&7}aY3%;ZGGYTqTF95iuwwGU^)1+gF;GBbejIy{a~Dhhojr;Z6hdL)Bb`#^rp7yf<4k6(YY18&)gKZ%7cP3z8| zoH#-(>@kHEG3%umzNaBnB@DHW4h&im`pN$u=q%|7wuO%>stos)7x;DHlFAv2; ziXcqHQstJ(e0k48e%V8)C{`lwbxo+!83N^7Q?RX9LUchCYQ*^wA9zuyr$y%cd%w`^ zV{f9`nL>-t5V)I@1b6?(m`H8GJq-d@bFyG;88oD}*t2u$d-q!kEZU2xg8(Va!=bu==bJ^ARU54;A8eoFjfE zSD3Of3C8nLm~tGfHcgnZEri&tL<_l4Ntjt@2kM3m!pv0_h;m7oc@R84SeP|u8N#%; zFzXF$Vq6O$K5rSZ;0MA&0YdgMTu3~FEeiAy76sNt3^3jjRy*broBPs2elkK>J@pf@ ziQR>*4u@f6tA(wupmLP3wH>JN61E0_l0itD0%LPsBq>CXkddPGcL+)| zvsiJ!4x)CS#45*N1H0;qHBuH5J6lJrbr?ym{Zz5xGI-0n!D7Rc`NaBUiB7K~;Q!a+ z#HLMP{dJCsO+9eKZI{G0%fgV~r;DC2VmfhB^zxG6*OO$vz9DwdA?|-Au}g<`M0<9L z{(JDf%`36nrQ1-v{$h{1a9>(1_E;K=-whOdT*<*_N$llcO!VDkAv3#!#$sZRE{eU! zyF&SvTgX@a5Qi+mlD91thpfiHG0tE;#B~=7xiMNCUb8JR=c{74HUz>`Qye)PmC!gZ zG4jM^V)Z0()U;SkXt6k2;ZN+>BXL5RKaoNdC(nvN=5t4!JSUIXv1oC!vHal04$BF? z`MNk|KnSFDlQ?yK5K=CCnXjgc(={o?`{s*tJqnRl`-}5FY(V(jY#}>*Mds5I@gHpf zvC1Cef+_H(Ls!JalgzB#Wv!`C?pR3^TgClEa|V~;`YOTP$Qv-GcpeDo@DclKH0BkG75Hd|27*ANd@f?|FN7Y|OUg1&*ZcyQ?~q9c0o z=!LCBpN@*TdC(VY4>9)!6t>NHvEaUeD8VRR@WJ)QqfETC?JY6S>0)6sJ9H#gS;*XX zh*uh(fO3rxZyH+?x3d;+<>V2sn=aluh9`1tFFqY|fXHuxSn|FD@wH>cw~?ttS09RH zBcc%tPD<1_193h_QpYwWw$NG9Z9;MyenIB(E|R|eALReThe}nJk3rpjRH~9$3E?+i zsuqNbXt1wTy%5s7evRbNurjjXjZ)nv5G3C|QoYQ#M5_ZNr)q0q6P+cOH^Gq9ZBo;g z2uib_qD_G8H@B(g<@g@qk@YB!^M1y)Q+2K%j~mNs*q{!3EM7GfKGijX)y~UP+b{?5?{s zZbuGoa7UVWR!>w|EKTa5CGPz~ni&Iq=p8C0bU<4D++F6|DboDW*yEe6r3Kvvp+T`p zT9E0C5^RjL_~IPmA#0_iF4@S6|C5$Yb|AjZMlvnlhU+IvYY2kZxW2T}SP6M~<}_(j zbtqluTxs*iXOP-YQfel&`)7fa`ZEBvU$V4yL^=c`$3niPy0rbsG-7|oOKFQBG@pCP z{F5c^TINf9%PJ`|8_Db3ZBnKg-`BU5vQBS65c(_~u&aVrOsaI~a6RI>MUv5SV4p7? zjtL`b?jhyeL_5yGRXR}{LR85^I`5eXE1n}=^g%iu<}6(d!IQO-q)TxDM0LAL|9Q2< zfDdK9=qa~2Jj2>@^h3xr0nQtFh$YatJ zzNw?pUcIR3;Q`}(k)R0J=z;RSNYVS16S3_}75zqSK=!*((eFn%{NLfQBBT*AljHe{ z(Bu@Nz#N(V42m(8a?wO8Q;hBS0mgStF=3|vK0xvs^P{}Wxg6G^W6YNLMB#Zz-h(&^2{luisGMS7xe$Wo=_}sT#3eEhGKCS z{2+9&BBc;v^s2pL(=J&3r{OYx+bgztynxl-QtViQX!k)UvuuH4cVrRqmOm7GlG_pM zx=fL=2YqAT&x*|B@b{DR75iI57v|nk9NGtO3vT{DUQ?WFI2-;SIY@D?{0H+sDbBz9 z2X1p+kzctP@x}#;Yu3>IvnMU&yp5tr83?I;uDIO{y&H!YisBU$P>>WT-UbyCALpU? z7#l^reVpRs#dgGV#wxx&hZkIqSMu@(W?m1aG#*}XbhuJEp^#X|>Pk(X5qmwdpHlPf z6a2irQdizsIQv>@Eh5v2y{NQCp}_9HkXh12X;O4Z( zdXp`Y#zpBq^8kXyBc-Pel&+si>G=>7y0ug3mDPuM?`z6-Ap&uiM5VWO7Ev`HrQh-6 zM5zsx!RdZP9d=vDy5CWjD<$RsRfg_?4%9fK9M~UQYCBFj)V5rRJ}QmF?Q+pVJ)<0c z6@oJJvof*^W_W6?GSa^_4bTl(v zdDg8RGM2^4v(4@ys@;-#>Av#ppvTbu8OpQa3yEsgS3cYkgrM?9S(*f|X&k5gy12_sH#F6eBNOk zqN;QZ{=bQ-Y;UiHbe>Vwy^Ot`9ieiu_e00>jmpIfwA!L_=?)sssa*O%V2=Hi`Le5p zd`mx-%NTrbJyX>@@(Bu=OqJ)Iig4#|DqpuXctf&I#oP(+VqV zqyws8R)8S1N9McLs(yvDP)46n4ZQDwZucJ5ux}F)RtKntdrJ_iW2*3f-~|u<%6t>1 zitu5?<~yrKbzVU%FkBTq{syrsnW{;B-Xfcxq?#Q8iQd>j6<=u^9(0r{zQz~uqAGrM zOZflB&8oQ)g3Fy0)m%?p_|-*~Q1>ZjctACOBW%NXQ1#FCKSa$cs228dBsRNLwWuqk z^urvPKdPt}H-VA`)mN=3j3#n?qcSDcBNmaVG9m7>W7TE8=xZV0JYTg*OeWs+ohp4{ zk`cYw2dX{$QBc%hqssgq4k2<-?YoQ&r^;?Hj(F7+)q!~>#C`;;4$k&RxBRrqys|h0L?Ls$j<#C||0~-)X9XuSMu??^0bD?oNFCch!ZWLD+&5 zGT+oxU8#vD@9C_%_A>&(XPxR{Dx}=!z3OpKY{8?ps^`zLiJdN0y&Qo4LEVR{--|Kv zpvP*RaSyD!L7>|H8v1ru#;faYRl~|(sq59ajs~Jy?c^>&h{mX0TjB-})~Z`A^nop; ztKH}0Mn{bn@=YDo9tW{i|N5wX6V@Q#zo+(#9e_T7pW5%|W_VL$b&rv7+grocJvU=( zuZ~j(y}|uf&QKc%6i&q6_fSXrxe}WbWg$QQOFjBFq;Qj%-qJ$WyN-Iw3N#@6?bI_;hd~E!s%I~1M{G%mh5Yn<^}K{FXh8f?C;Z4o*uJb@ z(h+XnK1ZFjHi>w*O-A*qj!lW}Xl5ZdrK;EM2!nq2>-Atp7 zZAL7ytwxgt#WnsOqOtA{0lIcaQ)#*fgrk4tEU+|4AHXLP|d`K1~jM6YvOEPp(>uPnLPU^z8|KUoP;Hv^-wd#?2P2}lV-67 z?zeB3%u9*gCT&g}%JAQs^uV{oow{mvZ@^NAF3@Byf$em!tI58ACm;7qll?t_XlzBz(F4$j zpkC91(;PoJi&#oS%_%e3WSl1dnGprU&{$1DS_TA!YYMV6F_2kvVTDB8 zBUW?a43=uc9L+_4EaiqKnxf7(Ffkv^b?X4)@ot)1i{2syE7IJJ$Mvq=HTOH?9de8P zS|J~GL=6wEW)8I8-AZe4P9hpTUR!;z9fDnZt^Ioqgv~)~Z~TUXYLeE$&jT~|($;a^ zK&)y%ZC%X-lw|$24aVjYm8{e{O+nh-Dqq{^Kg5KtX<8TUXQEkw+5j^IrHiQTIktqT z@(gXCAXt6c2@CluTkXKRH*mg&g>3f>?V!hKTHSNg4w;9ota)8)jPT*a{_)k0EzfN7 z0%hKxCiB&83pqQgov06j)Y@v}^4p-k5792TQVSBCtX=pJ?i9UVyQpq7s^K--Mag%F z+yBunwt}(NZmV6DyaVCcTf5QwGbDVqb{iTL)Vq$%zL`etZlgca;O5$lzH1SW^R)+- zqKln0Q+w(G+~ngMnZInbXWUWct}$!RA}GZkWFC6$xAMAv=`-yg76ofxr_-E9%($9lAs^9Kr&m2A-teZbLU~5D zC|Fl*r7O{-8ZyfYEoA1KGN07fRWCq{F#7M*)en*5o>x<*EWAL8kQe)-CH6L7+~a-bAR0#+a%&~cXj#JStv}Z>+%;EKjGl1uAs;k#b$}FkYK%=U3JB)3h)j`uY2T? zh?mlnWR^PWp1eX9Td||=)zMVEBf6+79b`a7Gh6rJT9i6 zgcK5=RHoNwIS}Jh^cB)uqI7$&uQXvNbmzIgp)nj2a2%<3y?{OI-&Eg(sfnwZz6l4F zMfxTJsMw}&B7)Lnef!KfG>7YF@M3+)a|}FauYMq}f{7ODhknK@ z*#HmyFr;og@RNS{={wMq{xaX+)f>xCaB-031fRZL=4FL`#4r?>A2;g9xZ`hjdU)$+ z;BP&sa|iv5JFdj1uGPnHzzsiKk@<1AK7JEEe;lA+*ax;V+g-nC>2(wwWAw`w=OJ1y zwUD1_q~B1U2Q2BKPn*{iC0Vi&2hDNtT)(r-l~}?+3;C(j`h6o3A(g-N`^*R;M^F8Yg@~q|j25z9 zGxaw=<371d^bds+EWNG%iTM&@fU&Cnxf|SL-g*o9DT9GkeF!J0WKeE{1RvRAP@cn+ zxU@ECkVNubIR@=E#P#UTh6~n)}-ZT9DKxIR(%r&S5Z4JF2 zw_%gWoq55lIj>h#5kCy$w8)%jXG z_^rQH=ldw7{+_n-yI)Mac_%CXs9Z?$QJFPbSq0bMijqpS>VGX4U9k^VA$q)8-EiD0 zbc!>CY@k)>Zn)q4r&eKVAL4FaRzvhK#%V{b#+J4qny}Mq>IuY%c`K}pi5U!t{fR{uJq6#Kkb=HFIUds=rRR>#xofEr7Du#45fBiLgit5e(j@M7|) z)tT;?$n3RNw*>=U*RQpDl=g&p^~Y9E&St@Q1FfE>!YB_5R*uyv7EAL5^&gHp}v z@4dr#fl)gOIrH^~SvgIn3Rx{%x!I*`@9UTn5p19068xX74fUa(6oh|0apZ^pf{>2( zpblB}`=+|H^C<;MamsLtp-B{x@@T8A?HG!pS~Qem@oxf%^Wa1pni9Fx!{pFMu**8W z)S0!6pb_{NVfkJ8uVZl4aEip4TDT?(jJ6z){NGXeSg~35%P$DhIDB1}Qgx+gwU_vD zEIyT=8IB)}wfs0XYuw7uZByKCdYewf@Y*TcZ`r2ox&JBUQE|AoJ?1XoG$JM5SS7{3 zxPmnXiNf7#;qtihnPg3QkfC7VSq+}okg_(uu5M%gBe3Oa(;GeOW}atY4uaXH66-3O zR@kx}^Km=YPf%;HGM%tSz03_9*cXF&z6-Ns<`!;jrBbV*URb#xeBae{s}*~#)!{@G z?u6$xt#U`MdCP;PbJoQa?}h)lMKZPdnin%G%}0HhotV=2bb)!3KkIGH)|-9?Vh(LX zSshk=D2>4w6EITw$_>R6l%Fa86mIGj$|{><2eLbYdDjr;CYhRyVBY4~k*onT@lmX) zdF>b$z)ZWMSv!+4nwd);Km+X}&m_g);MisjPsdwCd+%a*b!MDaV)D2qP%U zG&!ENG6{27<&>ap6}7dng;Chti4b7SIVs^$+2*iqtfs;IHj7ne=3p~BA(TT9RG+!uYDVmgKHyurmCAg%$sdg!IF)h2qMN?D>yJPlw&F(VRxcu~8 zv-p+;a8}p!tBX+6JmNiSLw4TOv=Z!wcgZLTvF*Wx=(|JCOCCR;}yW3F14H(@6H z-`%v@h1=uLVfGzk9Zf@;a+T>)W3DzucM%*+>)iNY)6XtKvgvpeZZN0%3V)c%(41SD z#=7$+rgm+(ig~L;>COP|W==`tN2{B%Pjh#3!fD=BWp00w zXL57UW!{CGL$C3%-0XORd#i;YnrOOmf!8q2Ddu&}ImP_8-mEC)^O$M(J05D@^`2kV znXUiu=7LG!LZSJ+AapR8<0=XrY)n!kVX66HBjFe``?(6GI&+`4f?G%PBcrfW{6BN6 B1aANU diff --git a/data/locale/it.ts b/data/locale/it.ts index 7fc41fed6..64d6537fe 100644 --- a/data/locale/it.ts +++ b/data/locale/it.ts @@ -36,7 +36,9 @@ If you're interested in translating LMMS in another language or want to improve existing translations, you're welcome to help us! Simply contact the maintainer! Se hai partecipato alla traduzione ed il tuo nome non รจ presente in questa lista, aggiungilo! - Roberto Giaconia <derobyj@gmail.com> + Roberto Giaconia <derobyj@gmail.com> + +Se sei interessato a tradurre LMMS o vuoi migliorare una traduzione esistente, sei il benvenuto! License @@ -3256,7 +3258,7 @@ Assicurarsi di avere i permessi in lettura per il file e per la directory che lo Ui Contributors ordered by number of commits: - Hanno collaborato: (ordinati per numero di contributi) + Hanno collaborato (ordinati per numero di contributi): Involved @@ -4969,7 +4971,7 @@ Facendo doppio click sui plugin verranno fornite informazioni sulle relative por Wave Channel Volume - Volume wave del canale: + Volume wave del canale Noise Channel Volume: @@ -5342,7 +5344,7 @@ la rotellina del mouse impostare il volume delle note versatile kick- & bassdrum-synthesizer - sintetizzatore di colpo di cassa versatile + sintetizzatore di colpo di cassa e di kick versatile GUS-compatible patch instrument From c266e7b88e034bfe54c093fdfa95babf0439610b Mon Sep 17 00:00:00 2001 From: Vesa Date: Sun, 27 Jul 2014 19:34:41 +0300 Subject: [PATCH 2/2] Monstro: optimize Rewrote handling of modulators so that we don't have to allocate extra buffers for every note - should improve performance and make cpu usage more consistent --- plugins/monstro/Monstro.cpp | 577 ++++++++++-------------------------- plugins/monstro/Monstro.h | 32 +- 2 files changed, 177 insertions(+), 432 deletions(-) diff --git a/plugins/monstro/Monstro.cpp b/plugins/monstro/Monstro.cpp index 21fe87cfc..dc1b9b8f9 100644 --- a/plugins/monstro/Monstro.cpp +++ b/plugins/monstro/Monstro.cpp @@ -67,11 +67,6 @@ MonstroSynth::MonstroSynth( MonstroInstrument * _i, NotePlayHandle * _nph, m_samplerate( _samplerate ), m_fpp( _frames ) { - m_env1_buf = new sample_t[_frames]; - m_env2_buf = new sample_t[_frames]; - m_lfo1_buf = new sample_t[_frames]; - m_lfo2_buf = new sample_t[_frames]; - m_osc1l_phase = 0.0f; m_osc1r_phase = 0.0f; m_osc2l_phase = 0.0f; @@ -84,15 +79,14 @@ MonstroSynth::MonstroSynth( MonstroInstrument * _i, NotePlayHandle * _nph, m_ph3l_last = 0.0f; m_ph3r_last = 0.0f; - m_env1_phase = 0.0f; - m_env2_phase = 0.0f; - - m_lfo1_phase = 0.0f; - m_lfo2_phase = 0.0f; - - m_lfo1_s = Oscillator::noiseSample( 0.0f ); - m_lfo2_s = Oscillator::noiseSample( 0.0f ); + m_env_phase[0] = 0.0f; + m_env_phase[1] = 0.0f; + m_lfo_phase[0] = 0.0f; + m_lfo_phase[1] = 0.0f; + m_lfo_next[0] = Oscillator::noiseSample( 0.0f ); + m_lfo_next[1] = Oscillator::noiseSample( 0.0f ); + m_osc1l_last = 0.0f; m_osc1r_last = 0.0f; @@ -118,11 +112,6 @@ MonstroSynth::MonstroSynth( MonstroInstrument * _i, NotePlayHandle * _nph, MonstroSynth::~MonstroSynth() { - delete[] m_env1_buf; - delete[] m_env2_buf; - delete[] m_lfo1_buf; - delete[] m_lfo2_buf; - } @@ -132,39 +121,78 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) // macros for modulating with env/lfos #define modulatefreq( car, mod ) \ modtmp = 0.0f; \ - if( mod##_e1 != 0.0f ) modtmp += m_env1_buf[f] * mod##_e1; \ - if( mod##_e2 != 0.0f ) modtmp += m_env2_buf[f] * mod##_e2; \ - if( mod##_l1 != 0.0f ) modtmp += m_lfo1_buf[f] * mod##_l1; \ - if( mod##_l2 != 0.0f ) modtmp += m_lfo2_buf[f] * mod##_l2; \ + if( mod##_e1 != 0.0f ) modtmp += m_env[0] * mod##_e1; \ + if( mod##_e2 != 0.0f ) modtmp += m_env[1] * mod##_e2; \ + if( mod##_l1 != 0.0f ) modtmp += m_lfo[0] * mod##_l1; \ + if( mod##_l2 != 0.0f ) modtmp += m_lfo[1] * mod##_l2; \ car = qBound( MIN_FREQ, car * powf( 2.0f, modtmp ), MAX_FREQ ); #define modulateabs( car, mod ) \ - if( mod##_e1 != 0.0f ) car += m_env1_buf[f] * mod##_e1; \ - if( mod##_e2 != 0.0f ) car += m_env2_buf[f] * mod##_e2; \ - if( mod##_l1 != 0.0f ) car += m_lfo1_buf[f] * mod##_l1; \ - if( mod##_l2 != 0.0f ) car += m_lfo2_buf[f] * mod##_l2; + if( mod##_e1 != 0.0f ) car += m_env[0] * mod##_e1; \ + if( mod##_e2 != 0.0f ) car += m_env[1] * mod##_e2; \ + if( mod##_l1 != 0.0f ) car += m_lfo[0] * mod##_l1; \ + if( mod##_l2 != 0.0f ) car += m_lfo[1] * mod##_l2; #define modulatephs( car, mod ) \ - if( mod##_e1 != 0.0f ) car += m_env1_buf[f] * mod##_e1; \ - if( mod##_e2 != 0.0f ) car += m_env2_buf[f] * mod##_e2; \ - if( mod##_l1 != 0.0f ) car += m_lfo1_buf[f] * mod##_l1; \ - if( mod##_l2 != 0.0f ) car += m_lfo2_buf[f] * mod##_l2; + if( mod##_e1 != 0.0f ) car += m_env[0] * mod##_e1; \ + if( mod##_e2 != 0.0f ) car += m_env[1] * mod##_e2; \ + if( mod##_l1 != 0.0f ) car += m_lfo[0] * mod##_l1; \ + if( mod##_l2 != 0.0f ) car += m_lfo[1] * mod##_l2; #define modulatevol( car, mod ) \ - if( mod##_e1 > 0.0f ) car *= ( 1.0f - mod##_e1 + mod##_e1 * m_env1_buf[f] ); \ - if( mod##_e1 < 0.0f ) car *= ( 1.0f + mod##_e1 * m_env1_buf[f] ); \ - if( mod##_e2 > 0.0f ) car *= ( 1.0f - mod##_e2 + mod##_e2 * m_env2_buf[f] ); \ - if( mod##_e2 < 0.0f ) car *= ( 1.0f + mod##_e2 * m_env2_buf[f] ); \ - if( mod##_l1 != 0.0f ) car *= ( 1.0f + mod##_l1 * m_lfo1_buf[f] ); \ - if( mod##_l2 != 0.0f ) car *= ( 1.0f + mod##_l2 * m_lfo2_buf[f] ); \ + if( mod##_e1 > 0.0f ) car *= ( 1.0f - mod##_e1 + mod##_e1 * m_env[0] ); \ + if( mod##_e1 < 0.0f ) car *= ( 1.0f + mod##_e1 * m_env[0] ); \ + if( mod##_e2 > 0.0f ) car *= ( 1.0f - mod##_e2 + mod##_e2 * m_env[1] ); \ + if( mod##_e2 < 0.0f ) car *= ( 1.0f + mod##_e2 * m_env[1] ); \ + if( mod##_l1 != 0.0f ) car *= ( 1.0f + mod##_l1 * m_lfo[0] ); \ + if( mod##_l2 != 0.0f ) car *= ( 1.0f + mod##_l2 * m_lfo[1] ); \ car = qBound( -MODCLIP, car, MODCLIP ); - // pre-render env's and lfo's - renderModulators( _frames ); + + + //////////////////// + // // + // MODULATORS // + // // + //////////////////// + + // LFO phase offsets + const float lfo1_po = m_parent->m_lfo1Phs.value() / 360.0f; + const float lfo2_po = m_parent->m_lfo2Phs.value() / 360.0f; + + // remove cruft from phase counters to prevent overflow, add phase offset + m_lfo_phase[0] = absFraction( m_lfo_phase[0] + lfo1_po ); + m_lfo_phase[1] = absFraction( m_lfo_phase[1] + lfo2_po ); + + // LFO rates and increment + m_lfo_rate[0] = ( m_parent->m_lfo1Rate.value() * 0.001f * m_samplerate ); + m_lfo_rate[1] = ( m_parent->m_lfo2Rate.value() * 0.001f * m_samplerate ); + m_lfo_inc[0] = 1.0f / m_lfo_rate[0]; + m_lfo_inc[1] = 1.0f / m_lfo_rate[1]; + + m_env_sus[0] = m_parent-> m_env1Sus.value(); + m_env_sus[1] = m_parent-> m_env2Sus.value(); + + m_lfovalue[0] = m_parent->m_lfo1Wave.value(); + m_lfovalue[1] = m_parent->m_lfo2Wave.value(); + m_lfoatt[0] = m_parent->m_lfo1_att; + m_lfoatt[1] = m_parent->m_lfo2_att; + + m_env_pre[0] = m_parent->m_env1_pre; + m_env_att[0] = m_parent->m_env1_att; + m_env_hold[0] = m_parent->m_env1_hold; + m_env_dec[0] = m_parent->m_env1_dec; + m_env_rel[0] = m_parent->m_env1_rel; + m_env_pre[1] = m_parent->m_env2_pre; + m_env_att[1] = m_parent->m_env2_att; + m_env_hold[1] = m_parent->m_env2_hold; + m_env_dec[1] = m_parent->m_env2_dec; + m_env_rel[1] = m_parent->m_env2_rel; + // get updated osc1 values // get pulse width - const float pw = ( m_parent->m_osc1Pw.value() / 100.0f ); + const float pw = ( m_parent->m_osc1Pw.value() * 0.01f ); const float o1pw_e1 = ( m_parent->m_pw1env1.value() ); const float o1pw_e2 = ( m_parent->m_pw1env2.value() ); const float o1pw_l1 = ( m_parent->m_pw1lfo1.value() * 0.5f ); @@ -322,7 +350,8 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) // begin for loop for( f_cnt_t f = 0; f < _frames; f++ ) { - + // update modulators + updateModulators( f ); /* // debug code if( f % 10 == 0 ) { @@ -618,408 +647,122 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) m_osc3l_phase = absFraction( o3l_p - o3lpo ); m_osc3r_phase = absFraction( o3r_p - o3rpo ); + m_lfo_phase[0] = absFraction( m_lfo_phase[0] - lfo1_po ); + m_lfo_phase[1] = absFraction( m_lfo_phase[1] - lfo2_po ); } -void MonstroSynth::renderModulators( fpp_t _frames ) +inline void MonstroSynth::updateModulators( int frame ) { - // LFO phase offsets - const float lfo1_po = m_parent->m_lfo1Phs.value() / 360.0f; - const float lfo2_po = m_parent->m_lfo2Phs.value() / 360.0f; - - // remove cruft from phase counters to prevent overflow - m_lfo1_phase = fraction( m_lfo1_phase ); - m_lfo2_phase = fraction( m_lfo2_phase ); - - // LFO rates - const float lfo1_r = m_parent->m_lfo1Rate.value() / 1000.0f * m_samplerate; - const float lfo2_r = m_parent->m_lfo2Rate.value() / 1000.0f * m_samplerate; - // frames played before - const f_cnt_t tfp = m_nph->totalFramesPlayed(); - - // LFOs - // LFO 1 - - switch( m_parent->m_lfo1Wave.value() ) + const f_cnt_t tfp = m_nph->totalFramesPlayed() + frame; + + for( int i = 0; i < 2; ++i ) { - case WAVE_SINE: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const float ph = m_lfo1_phase + lfo1_po; - m_lfo1_s = Oscillator::sinSample( ph ); - if( t < m_parent->m_lfo1_att ) m_lfo1_s *= ( static_cast( t ) / m_parent-> m_lfo1_att ); - m_lfo1_buf[f] = m_lfo1_s; - m_lfo1_phase += 1.0f / lfo1_r; - } - break; - case WAVE_TRI: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const float ph = m_lfo1_phase + lfo1_po; - m_lfo1_s = Oscillator::triangleSample( ph ); - if( t < m_parent->m_lfo1_att ) m_lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); - m_lfo1_buf[f] = m_lfo1_s; - m_lfo1_phase += 1.0f / lfo1_r; - } - break; - case WAVE_SAW: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const float ph = m_lfo1_phase + lfo1_po; - m_lfo1_s = Oscillator::sawSample( ph ); - if( t < m_parent->m_lfo1_att ) m_lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); - m_lfo1_buf[f] = m_lfo1_s; - m_lfo1_phase += 1.0f / lfo1_r; - } - break; - case WAVE_RAMP: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const float ph = m_lfo1_phase + lfo1_po; - m_lfo1_s = Oscillator::sawSample( ph ) * -1.0f; - if( t < m_parent->m_lfo1_att ) m_lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); - m_lfo1_buf[f] = m_lfo1_s; - m_lfo1_phase += 1.0f / lfo1_r; - } - break; - case WAVE_SQR: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const float ph = m_lfo1_phase + lfo1_po; - m_lfo1_s = Oscillator::squareSample( ph ); - if( t < m_parent->m_lfo1_att ) m_lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); - m_lfo1_buf[f] = m_lfo1_s; - m_lfo1_phase += 1.0f / lfo1_r; - } - break; - case WAVE_SQRSOFT: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const float ph = m_lfo1_phase + lfo1_po; - m_lfo1_s = oscillate( WAVE_SQRSOFT, ph, lfo1_r ); - if( t < m_parent->m_lfo1_att ) m_lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); - m_lfo1_buf[f] = m_lfo1_s; - m_lfo1_phase += 1.0f / lfo1_r; - } - break; - case WAVE_MOOG: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const float ph = m_lfo1_phase + lfo1_po; - m_lfo1_s = Oscillator::moogSawSample( ph ); - if( t < m_parent->m_lfo1_att ) m_lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); - m_lfo1_buf[f] = m_lfo1_s; - m_lfo1_phase += 1.0f / lfo1_r; - } - break; - case WAVE_SINABS: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const float ph = m_lfo1_phase + lfo1_po; - m_lfo1_s = oscillate( WAVE_SINABS, ph, lfo1_r ); - if( t < m_parent->m_lfo1_att ) m_lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); - m_lfo1_buf[f] = m_lfo1_s; - m_lfo1_phase += 1.0f / lfo1_r; - } - break; - case WAVE_EXP: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const float ph = m_lfo1_phase + lfo1_po; - m_lfo1_s = Oscillator::expSample( ph ); - if( t < m_parent->m_lfo1_att ) m_lfo1_s *= ( static_cast( t ) / m_parent-> m_lfo1_att ); - m_lfo1_buf[f] = m_lfo1_s; - m_lfo1_phase += 1.0f / lfo1_r; - } - break; - case WAVE_RANDOM: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - if( t % static_cast( lfo1_r ) == 0 ) m_lfo1_last = Oscillator::noiseSample( 0.0f ); - m_lfo1_s = m_lfo1_last; - if( t < m_parent->m_lfo1_att ) m_lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); - m_lfo1_buf[f] = m_lfo1_s; - } - m_lfo1_phase += static_cast( _frames ) / lfo1_r; - break; - case WAVE_RANDOM_SMOOTH: - default: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const f_cnt_t tm = t % static_cast( lfo1_r ); - const float p = static_cast( tm ) / lfo1_r; - if( tm == 0 ) - { - m_lfo1_last = m_lfo1_s; - m_lfo1_s = Oscillator::noiseSample( 0.0f ); - } - m_lfo1_buf[f] = cosinusInterpolate( m_lfo1_last, m_lfo1_s, p ); - if( t < m_parent->m_lfo1_att ) m_lfo1_buf[f] *= ( static_cast( t ) / m_parent->m_lfo1_att ); - } - m_lfo1_phase += static_cast( _frames ) / lfo1_r; - break; - } - - // LFO 2 - - switch( m_parent->m_lfo2Wave.value() ) - { - case WAVE_SINE: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const float ph = m_lfo2_phase + lfo2_po; - m_lfo2_s = Oscillator::sinSample( ph ); - if( t < m_parent->m_lfo2_att ) m_lfo2_s *= ( static_cast( t ) / m_parent-> m_lfo2_att ); - m_lfo2_buf[f] = m_lfo2_s; - m_lfo2_phase += 1.0f / lfo2_r; - } - break; - case WAVE_TRI: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const float ph = m_lfo2_phase + lfo2_po; - m_lfo2_s = Oscillator::triangleSample( ph ); - if( t < m_parent->m_lfo2_att ) m_lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); - m_lfo2_buf[f] = m_lfo2_s; - m_lfo2_phase += 1.0f / lfo2_r; - } - break; - case WAVE_SAW: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const float ph = m_lfo2_phase + lfo2_po; - m_lfo2_s = Oscillator::sawSample( ph ); - if( t < m_parent->m_lfo2_att ) m_lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); - m_lfo2_buf[f] = m_lfo2_s; - m_lfo2_phase += 1.0f / lfo2_r; - } - break; - case WAVE_RAMP: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const float ph = m_lfo2_phase + lfo2_po; - m_lfo2_s = Oscillator::sawSample( ph ) * -1.0f; - if( t < m_parent->m_lfo2_att ) m_lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); - m_lfo2_buf[f] = m_lfo2_s; - m_lfo2_phase += 1.0f / lfo2_r; - } - break; - case WAVE_SQR: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const float ph = m_lfo2_phase + lfo2_po; - m_lfo2_s = Oscillator::squareSample( ph ); - if( t < m_parent->m_lfo2_att ) m_lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); - m_lfo2_buf[f] = m_lfo2_s; - m_lfo2_phase += 1.0f / lfo2_r; - } - break; - case WAVE_SQRSOFT: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const float ph = m_lfo2_phase + lfo2_po; - m_lfo2_s = oscillate( WAVE_SQRSOFT, ph, lfo2_r ); - if( t < m_parent->m_lfo2_att ) m_lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); - m_lfo2_buf[f] = m_lfo2_s; - m_lfo2_phase += 1.0f / lfo2_r; - } - break; - case WAVE_MOOG: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const float ph = m_lfo2_phase + lfo2_po; - m_lfo2_s = Oscillator::moogSawSample( ph ); - if( t < m_parent->m_lfo2_att ) m_lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); - m_lfo2_buf[f] = m_lfo2_s; - m_lfo2_phase += 1.0f / lfo2_r; - } - break; - case WAVE_SINABS: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const float ph = m_lfo2_phase + lfo2_po; - m_lfo2_s = oscillate( WAVE_SINABS, ph, lfo2_r ); - if( t < m_parent->m_lfo2_att ) m_lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); - m_lfo2_buf[f] = m_lfo2_s; - m_lfo2_phase += 1.0f / lfo2_r; - } - break; - case WAVE_EXP: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const float ph = m_lfo2_phase + lfo2_po; - m_lfo2_s = Oscillator::expSample( ph ); - if( t < m_parent->m_lfo2_att ) m_lfo2_s *= ( static_cast( t ) / m_parent-> m_lfo2_att ); - m_lfo2_buf[f] = m_lfo2_s; - m_lfo2_phase += 1.0f / lfo2_r; - } - break; - case WAVE_RANDOM: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - if( t % static_cast( lfo2_r ) == 0 ) m_lfo2_last = Oscillator::noiseSample( 0.0f ); - m_lfo2_s = m_lfo2_last; - if( t < m_parent->m_lfo2_att ) m_lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); - m_lfo2_buf[f] = m_lfo2_s; - } - m_lfo2_phase += static_cast( _frames ) / lfo2_r; - break; - case WAVE_RANDOM_SMOOTH: - default: - for( f_cnt_t f = 0; f < _frames; f++ ) - { - const f_cnt_t t = f + tfp; - const f_cnt_t tm = t % static_cast( lfo2_r ); - const float p = static_cast( tm ) / lfo2_r; - if( tm == 0 ) - { - m_lfo2_last = m_lfo2_s; - m_lfo2_s = Oscillator::noiseSample( 0.0f ); - } - m_lfo2_buf[f] = cosinusInterpolate( m_lfo2_last, m_lfo2_s, p ); - if( t < m_parent->m_lfo2_att ) m_lfo2_buf[f] *= ( static_cast( t ) / m_parent->m_lfo2_att ); - } - m_lfo2_phase += static_cast( _frames ) / lfo2_r; - break; - } - - ///////////////////////////////////////////// - // - // - // envelopes - // - // - ///////////////////////////////////////////// - - const float env1_sus = m_parent-> m_env1Sus.value(); - const float env2_sus = m_parent-> m_env2Sus.value(); - - for( f_cnt_t f = 0; f < _frames; f++ ) - { - // envelope 1 - - // adjust phase for release - if( m_env1_phase < 4.0f && m_nph->isReleased() && f >= m_nph->framesBeforeRelease() ) + switch( m_lfovalue[i] ) { - if( m_env1_phase < 1.0f ) m_env1_phase = 5.0f; - else if( m_env1_phase < 2.0f ) m_env1_phase = 5.0f - fraction( m_env1_phase ); - else if( m_env1_phase < 3.0f ) m_env1_phase = 4.0f; - else m_env1_phase = 4.0f + fraction( m_env1_phase ); + case WAVE_SINE: + m_lfo[i] = Oscillator::sinSample( m_lfo_phase[i] ); + break; + case WAVE_TRI: + m_lfo[i] = Oscillator::triangleSample( m_lfo_phase[i] ); + break; + case WAVE_SAW: + m_lfo[i] = Oscillator::sawSample( m_lfo_phase[i] ); + break; + case WAVE_RAMP: + m_lfo[i] = Oscillator::sawSample( m_lfo_phase[i] ) * -1.0f; + break; + case WAVE_SQR: + m_lfo[i] = Oscillator::squareSample( m_lfo_phase[i] ); + break; + case WAVE_SQRSOFT: + m_lfo[i] = oscillate( WAVE_SQRSOFT, m_lfo_phase[i], 0 ); + break; + case WAVE_MOOG: + m_lfo[i] = Oscillator::moogSawSample( m_lfo_phase[i] ); + break; + case WAVE_SINABS: + m_lfo[i] = oscillate( WAVE_SINABS, m_lfo_phase[i], 0 ); + break; + case WAVE_EXP: + m_lfo[i] = Oscillator::expSample( m_lfo_phase[i] ); + break; + case WAVE_RANDOM: + if( tfp % static_cast( m_lfo_rate[i] ) == 0 ) m_lfo_last[i] = Oscillator::noiseSample( 0.0f ); + m_lfo[i] = m_lfo_last[i]; + break; + case WAVE_RANDOM_SMOOTH: + const f_cnt_t tm = tfp % static_cast( m_lfo_rate[i] ); + if( tm == 0 ) + { + m_lfo_last[i] = m_lfo_next[i]; + m_lfo_next[i] = Oscillator::noiseSample( 0.0f ); + } + m_lfo[i] = cosinusInterpolate( m_lfo_last[i], m_lfo_next[i], static_cast( tm ) / m_lfo_rate[i] ); + break; + } + + // attack + if( tfp < m_lfoatt[i] ) m_lfo[i] *= ( static_cast( tfp ) / m_lfoatt[i] ); + + // increment phase + m_lfo_phase[i] += m_lfo_inc[i]; + + + ///////////////////////////////////////////// + // // + // // + // envelopes // + // // + // // + ///////////////////////////////////////////// + + if( m_env_phase[i] < 4.0f && m_nph->isReleased() && frame >= m_nph->framesBeforeRelease() ) + { + if( m_env_phase[i] < 1.0f ) m_env_phase[i] = 5.0f; + else if( m_env_phase[i] < 2.0f ) m_env_phase[i] = 5.0f - fraction( m_env_phase[i] ); + else if( m_env_phase[i] < 3.0f ) m_env_phase[i] = 4.0f; + else m_env_phase[i] = 4.0f + fraction( m_env_phase[i] ); } // process envelope - if( m_env1_phase < 1.0f ) // pre-delay phase + if( m_env_phase[i] < 1.0f ) // pre-delay phase { - m_env1_buf[f] = 0.0f; - m_env1_phase = qMin( 1.0f, m_env1_phase + m_parent->m_env1_pre ); + m_env[i] = 0.0f; + m_env_phase[i] = qMin( 1.0f, m_env_phase[i] + m_env_pre[i] ); } - else if( m_env1_phase < 2.0f ) // attack phase + else if( m_env_phase[i] < 2.0f ) // attack phase { - m_env1_buf[f] = calcSlope1( fraction( m_env1_phase ) ); - m_env1_phase = qMin( 2.0f, m_env1_phase + m_parent->m_env1_att ); + m_env[i] = calcSlope1( fraction( m_env_phase[i] ) ); + m_env_phase[i] = qMin( 2.0f, m_env_phase[i] + m_env_att[i] ); } - else if( m_env1_phase < 3.0f ) // hold phase + else if( m_env_phase[i] < 3.0f ) // hold phase { - m_env1_buf[f] = 1.0f; - m_env1_phase = qMin( 3.0f, m_env1_phase + m_parent->m_env1_hold ); + m_env[i] = 1.0f; + m_env_phase[i] = qMin( 3.0f, m_env_phase[i] + m_env_hold[i] ); } - else if( m_env1_phase < 4.0f ) // decay phase + else if( m_env_phase[i] < 4.0f ) // decay phase { - const sample_t s = calcSlope1( 1.0f - fraction( m_env1_phase ) ); - if( s <= env1_sus ) + const sample_t s = calcSlope1( 1.0f - fraction( m_env_phase[i] ) ); + if( s <= m_env_sus[i] ) { - m_env1_buf[f] = env1_sus; + m_env[i] = m_env_sus[i]; } else { - m_env1_buf[f] = s; - m_env1_phase = qMin( 4.0f - env1_sus, m_env1_phase + m_parent->m_env1_dec ); - if( m_env1_phase == 4.0f ) m_env1_phase = 5.0f; // jump over release if sustain is zero - fix for clicking + m_env[i] = s; + m_env_phase[i] = qMin( 4.0f - m_env_sus[i], m_env_phase[i] + m_env_dec[i] ); + if( m_env_phase[i] == 4.0f ) m_env_phase[i] = 5.0f; // jump over release if sustain is zero - fix for clicking } } - else if( m_env1_phase < 5.0f ) // release phase + else if( m_env_phase[i] < 5.0f ) // release phase { - m_env1_buf[f] = calcSlope1( 1.0f - fraction( m_env1_phase ) ); - m_env1_phase += m_parent->m_env1_rel; + m_env[i] = calcSlope1( 1.0f - fraction( m_env_phase[i] ) ); + m_env_phase[i] += m_env_rel[i]; } - else m_env1_buf[f] = 0.0f; - -// qDebug( "env1 %f", m_env1_buf[f] ); - - // envelope 2 - - - - // adjust phase for release - if( m_env2_phase < 4.0f && m_nph->isReleased() && f >= m_nph->framesBeforeRelease() ) - { - if( m_env2_phase < 1.0f ) m_env2_phase = 5.0f; - else if( m_env2_phase < 2.0f ) m_env2_phase = 5.0f - fraction( m_env2_phase ); - else if( m_env2_phase < 3.0f ) m_env2_phase = 4.0f; - else m_env2_phase = 4.0f + fraction( m_env2_phase ); - } - - // process envelope - if( m_env2_phase < 1.0f ) // pre-delay phase - { - m_env2_buf[f] = 0.0f; - m_env2_phase = qMin( 1.0f, m_env2_phase + m_parent->m_env2_pre ); - } - else if( m_env2_phase < 2.0f ) // attack phase - { - m_env2_buf[f] = calcSlope2( fraction( m_env2_phase ) ); - m_env2_phase = qMin( 2.0f, m_env2_phase + m_parent->m_env2_att ); - } - else if( m_env2_phase < 3.0f ) // hold phase - { - m_env2_buf[f] = 1.0f; - m_env2_phase = qMin( 3.0f, m_env2_phase + m_parent->m_env2_hold ); - } - else if( m_env2_phase < 4.0f ) // decay phase - { - const sample_t s = calcSlope2( 1.0f - fraction( m_env2_phase ) ); - if( s <= env2_sus ) - { - m_env2_buf[f] = env2_sus; - } - else - { - m_env2_buf[f] = s; - m_env2_phase = qMin( 4.0f - env2_sus, m_env2_phase + m_parent->m_env2_dec ); - if( m_env2_phase == 4.0f ) m_env2_phase = 5.0f; // jump over release if sustain is zero - fix for clicking - } - } - else if( m_env2_phase < 5.0f ) // release phase - { - m_env2_buf[f] = calcSlope2( 1.0f - fraction( m_env2_phase) ); - m_env2_phase += m_parent->m_env2_rel; - } - else m_env2_buf[f] = 0.0f; - + else m_env[i] = 0.0f; } - } @@ -2071,7 +1814,7 @@ QWidget * MonstroView::setupOperatorsView( QWidget * _parent ) m_lfo2RateKnob -> setWhatsThis( tr( "Rate sets the speed of the LFO, measured in milliseconds per cycle. Can be synced to tempo. " ) ); m_lfo1PhsKnob -> setWhatsThis( tr( "PHS controls the phase offset of the LFO. " ) ); m_lfo2PhsKnob -> setWhatsThis( tr( "PHS controls the phase offset of the LFO. " ) ); - + m_env1PreKnob -> setWhatsThis( tr( "PRE, or pre-delay, delays the start of the envelope from the start of the note. 0 means no delay. " ) ); m_env2PreKnob -> setWhatsThis( tr( "PRE, or pre-delay, delays the start of the envelope from the start of the note. 0 means no delay. " ) ); m_env1AttKnob -> setWhatsThis( tr( "ATT, or attack, controls how fast the envelope ramps up at start, measured in milliseconds. " diff --git a/plugins/monstro/Monstro.h b/plugins/monstro/Monstro.h index 4b2066c88..b0e2c1bcd 100644 --- a/plugins/monstro/Monstro.h +++ b/plugins/monstro/Monstro.h @@ -208,12 +208,10 @@ private: const sample_rate_t m_samplerate; fpp_t m_fpp; - sample_t * m_env1_buf; - sample_t * m_env2_buf; - sample_t * m_lfo1_buf; - sample_t * m_lfo2_buf; + sample_t m_env [2]; + sample_t m_lfo [2]; - void renderModulators( fpp_t _frames ); + inline void updateModulators( int frame ); // linear interpolation /* inline sample_t interpolate( sample_t s1, sample_t s2, float x ) @@ -307,17 +305,21 @@ private: float m_osc3l_phase; float m_osc3r_phase; - sample_t m_env1_phase; - sample_t m_env2_phase; - - float m_lfo1_phase; - float m_lfo2_phase; + sample_t m_env_phase [2]; + float m_lfo_phase [2]; + sample_t m_lfo_last [2]; + sample_t m_lfo_next [2]; + float m_lfo_inc [2]; + float m_lfo_rate [2]; + float m_env_sus [2]; - sample_t m_lfo1_last; - sample_t m_lfo2_last; - - sample_t m_lfo1_s; - sample_t m_lfo2_s; + int m_lfovalue[2]; + int m_lfoatt[2]; + float m_env_pre[2]; + float m_env_att[2]; + float m_env_hold[2]; + float m_env_dec[2]; + float m_env_rel[2]; sample_t m_osc1l_last; sample_t m_osc1r_last;