From d5259292c91ab58ea382fcae4d4267fd7c278f90 Mon Sep 17 00:00:00 2001 From: Steffen Baranowsky Date: Tue, 5 Jan 2016 15:25:25 +0100 Subject: [PATCH] New GUI for the native EQ plugin --- plugins/Eq/12dB.png | Bin 0 -> 1029 bytes plugins/Eq/12dBoff.png | Bin 0 -> 958 bytes plugins/Eq/24dB.png | Bin 0 -> 1059 bytes plugins/Eq/24dBoff.png | Bin 0 -> 990 bytes plugins/Eq/48dB.png | Bin 0 -> 1075 bytes plugins/Eq/48dBoff.png | Bin 0 -> 1012 bytes plugins/Eq/ActiveAnalyse.png | Bin 0 -> 935 bytes plugins/Eq/ActiveAnalyseoff.png | Bin 0 -> 846 bytes plugins/Eq/ActiveHP.png | Bin 0 -> 992 bytes plugins/Eq/ActiveHPoff.png | Bin 0 -> 905 bytes plugins/Eq/ActiveHS.png | Bin 0 -> 968 bytes plugins/Eq/ActiveHSoff.png | Bin 0 -> 883 bytes plugins/Eq/ActiveLP.png | Bin 0 -> 990 bytes plugins/Eq/ActiveLPoff.png | Bin 0 -> 896 bytes plugins/Eq/ActiveLS.png | Bin 0 -> 983 bytes plugins/Eq/ActiveLSoff.png | Bin 0 -> 909 bytes plugins/Eq/ActivePeak.png | Bin 0 -> 1064 bytes plugins/Eq/ActivePeakoff.png | Bin 0 -> 998 bytes plugins/Eq/CMakeLists.txt | 4 +- plugins/Eq/EqControls.cpp | 43 +- plugins/Eq/EqControls.h | 17 +- plugins/Eq/EqControlsDialog.cpp | 293 ++++++++--- plugins/Eq/EqControlsDialog.h | 36 +- plugins/Eq/EqCurve.cpp | 818 +++++++++++++++++++++++++++++++ plugins/Eq/EqCurve.h | 209 ++++++++ plugins/Eq/EqEffect.cpp | 4 +- plugins/Eq/EqFader.h | 21 +- plugins/Eq/EqLayout1BG.png | Bin 0 -> 52487 bytes plugins/Eq/EqParameterWidget.cpp | 298 +++++------ plugins/Eq/EqParameterWidget.h | 104 ++-- plugins/Eq/EqSpectrumView.h | 63 ++- plugins/Eq/artwork.png | Bin 27905 -> 0 bytes plugins/Eq/bandLabel1.png | Bin 0 -> 413 bytes plugins/Eq/bandLabel1on.png | Bin 0 -> 457 bytes plugins/Eq/bandLabel2.png | Bin 0 -> 487 bytes plugins/Eq/bandLabel2on.png | Bin 0 -> 544 bytes plugins/Eq/bandLabel3.png | Bin 0 -> 488 bytes plugins/Eq/bandLabel3on.png | Bin 0 -> 537 bytes plugins/Eq/bandLabel4.png | Bin 0 -> 467 bytes plugins/Eq/bandLabel4on.png | Bin 0 -> 525 bytes plugins/Eq/bandLabel5.png | Bin 0 -> 458 bytes plugins/Eq/bandLabel5on.png | Bin 0 -> 515 bytes plugins/Eq/bandLabel6.png | Bin 0 -> 525 bytes plugins/Eq/bandLabel6on.png | Bin 0 -> 605 bytes plugins/Eq/bandLabel7.png | Bin 0 -> 446 bytes plugins/Eq/bandLabel7on.png | Bin 0 -> 499 bytes plugins/Eq/bandLabel8.png | Bin 0 -> 540 bytes plugins/Eq/bandLabel8on.png | Bin 0 -> 614 bytes plugins/Eq/circle1.png | Bin 0 -> 1030 bytes plugins/Eq/handle1.png | Bin 0 -> 1174 bytes plugins/Eq/handle1inactive.png | Bin 0 -> 734 bytes plugins/Eq/handle2.png | Bin 0 -> 1483 bytes plugins/Eq/handle2inactive.png | Bin 0 -> 942 bytes plugins/Eq/handle3.png | Bin 0 -> 1459 bytes plugins/Eq/handle3inactive.png | Bin 0 -> 920 bytes plugins/Eq/handle4.png | Bin 0 -> 1344 bytes plugins/Eq/handle4inactive.png | Bin 0 -> 818 bytes plugins/Eq/handle5.png | Bin 0 -> 1421 bytes plugins/Eq/handle5inactive.png | Bin 0 -> 918 bytes plugins/Eq/handle6.png | Bin 0 -> 1506 bytes plugins/Eq/handle6inactive.png | Bin 0 -> 944 bytes plugins/Eq/handle7.png | Bin 0 -> 1511 bytes plugins/Eq/handle7inactive.png | Bin 0 -> 833 bytes plugins/Eq/handle8.png | Bin 0 -> 1429 bytes plugins/Eq/handle8inactive.png | Bin 0 -> 948 bytes plugins/Eq/handlehover.png | Bin 0 -> 967 bytes 66 files changed, 1548 insertions(+), 362 deletions(-) create mode 100644 plugins/Eq/12dB.png create mode 100644 plugins/Eq/12dBoff.png create mode 100644 plugins/Eq/24dB.png create mode 100644 plugins/Eq/24dBoff.png create mode 100644 plugins/Eq/48dB.png create mode 100644 plugins/Eq/48dBoff.png create mode 100644 plugins/Eq/ActiveAnalyse.png create mode 100644 plugins/Eq/ActiveAnalyseoff.png create mode 100644 plugins/Eq/ActiveHP.png create mode 100644 plugins/Eq/ActiveHPoff.png create mode 100644 plugins/Eq/ActiveHS.png create mode 100644 plugins/Eq/ActiveHSoff.png create mode 100644 plugins/Eq/ActiveLP.png create mode 100644 plugins/Eq/ActiveLPoff.png create mode 100644 plugins/Eq/ActiveLS.png create mode 100644 plugins/Eq/ActiveLSoff.png create mode 100644 plugins/Eq/ActivePeak.png create mode 100644 plugins/Eq/ActivePeakoff.png create mode 100644 plugins/Eq/EqCurve.cpp create mode 100644 plugins/Eq/EqCurve.h create mode 100644 plugins/Eq/EqLayout1BG.png delete mode 100644 plugins/Eq/artwork.png create mode 100644 plugins/Eq/bandLabel1.png create mode 100644 plugins/Eq/bandLabel1on.png create mode 100644 plugins/Eq/bandLabel2.png create mode 100644 plugins/Eq/bandLabel2on.png create mode 100644 plugins/Eq/bandLabel3.png create mode 100644 plugins/Eq/bandLabel3on.png create mode 100644 plugins/Eq/bandLabel4.png create mode 100644 plugins/Eq/bandLabel4on.png create mode 100644 plugins/Eq/bandLabel5.png create mode 100644 plugins/Eq/bandLabel5on.png create mode 100644 plugins/Eq/bandLabel6.png create mode 100644 plugins/Eq/bandLabel6on.png create mode 100644 plugins/Eq/bandLabel7.png create mode 100644 plugins/Eq/bandLabel7on.png create mode 100644 plugins/Eq/bandLabel8.png create mode 100644 plugins/Eq/bandLabel8on.png create mode 100644 plugins/Eq/circle1.png create mode 100644 plugins/Eq/handle1.png create mode 100644 plugins/Eq/handle1inactive.png create mode 100644 plugins/Eq/handle2.png create mode 100644 plugins/Eq/handle2inactive.png create mode 100644 plugins/Eq/handle3.png create mode 100644 plugins/Eq/handle3inactive.png create mode 100644 plugins/Eq/handle4.png create mode 100644 plugins/Eq/handle4inactive.png create mode 100644 plugins/Eq/handle5.png create mode 100644 plugins/Eq/handle5inactive.png create mode 100644 plugins/Eq/handle6.png create mode 100644 plugins/Eq/handle6inactive.png create mode 100644 plugins/Eq/handle7.png create mode 100644 plugins/Eq/handle7inactive.png create mode 100644 plugins/Eq/handle8.png create mode 100644 plugins/Eq/handle8inactive.png create mode 100644 plugins/Eq/handlehover.png diff --git a/plugins/Eq/12dB.png b/plugins/Eq/12dB.png new file mode 100644 index 0000000000000000000000000000000000000000..650a9b7ed9944e2b10e2c24b5f68c480f34b801f GIT binary patch literal 1029 zcmV+g1p51lP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00V7FL_t(Y$Gw(Ih+IV!hQE5< zZU+TH4dj6fgNouJ8-oEKlaL4_gBl$Z9{~k%s}O_EM4iMSCW_)Zg5pk0R#5_?Bt{92 zj6@_^jAUuD(v{JfboZ?~$3<1&?sl>;F?hL$zPG4*{_|J;=dU)8Om0wP48viK!5F|8 z41j_1bjeFm$_=Whf~cbZ2ycvG!}>dL-r=mpxj~E;krNv;09DoU%Sh6cWDp{xn3$Vi z$Y9o4yt8=k3EtsD2DZ)?mKkgqXc({$CaOpQh;^cl2@@l#iZLdGdFSxnQ&pZSctY@a z?{Lmyt!;pY*)3-UBAHE$iP}btHO-s`%sET&jw*Ostw2>}K<5geF<5Kh63kFVB(us( zm#FKQ=L0H=h-5HZz*+f{iFL(e%L+WI=J@?BMm9nNbE_$==t67Tr&)LGvB;1I`- zzC#r}&O2siKjPbyXL#y~ady5qHM)u-sKVk>hbnjg9^Jl|3x6(h-L+$E8ehl6mb<|i ztO1P8U1Y7{WwC?h(*NWg>!zq9W{?`H;6}pXJuItFz2Yti5F=UmZKe#ZI?T zU(N$5CVIUZSD2#Uwe*5ElQURKg0n(2hF{K}W8=gt0Gysb*i^b_<{5VH{e<0nK4#U* z8?t*OVeFcU$*DJ3antoYw_{6_-)wvAe%&;_j&_mu*jS5pt0DwXD81Jhv|ZlRA_GsX z>quSartWlmEG>2Ebb55UJ&vFF8L!H~Fq7o&FHI|&$1bm_Qvr=5c~!ypZ6?;)&-&Gi zDlrMpr7N)dHo{^00000NkvXXu0mjfBMIDQ literal 0 HcmV?d00001 diff --git a/plugins/Eq/12dBoff.png b/plugins/Eq/12dBoff.png new file mode 100644 index 0000000000000000000000000000000000000000..8e5b61599822c5bf19afb34f132a62b0fae89b6a GIT binary patch literal 958 zcmV;v13~e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00SmTL_t(Y$Gw)#ZX87r$A4Ab zV_8I2kR|&8Y+i0TL?Mn1#7N|V zIXar1uHw+Wv%5x-_=xDkcF(B0e)F%dURhaLbp!+f5kv%OpP{VE`US(m#}L!uz43PBYOp`BGFL!~GN z#)xA)&q#ONy+9mGi6n-Q07np_NKq34F$O{igb)du)v3yuvJ4ZE>>@^rz%k3Jk{L+_ zNr@)!KtzZXSWqQ|K#Wy^#^Tap9OcEzT2HaC6)hM2I4wQd}4!F=k*^sHlb! zY#6l(WsG2!NXbSZ&uZ0-%t2arscHrmmu8ibD#kol6;)OJbsZzOzWt{4N(^J3(QIFk zoQ*+wJoF^pxr8 zX*!(_7cN``fe3==sKyQsp3pSe=UU>qzP8Thl})+6A||J_u1aQ#(VF7 zkk9BSwmUnwxp((2tE($*bw>WiI63*92YU~A`<-_u-v4oO!fQ)Qt+MfP^X5k!|9Z^c z{XLeJm$P!8$f#jY72!&}#{Ge1AyW}dq$}=htkWqVk~>i%y9P{GcyOQ+_0J(=S#gj^KBh* gI66A~U;Y;S39&XmH~A$_MF0Q*07*qoM6N<$f>|xN6aWAK literal 0 HcmV?d00001 diff --git a/plugins/Eq/24dB.png b/plugins/Eq/24dB.png new file mode 100644 index 0000000000000000000000000000000000000000..1543f94edad542d523765ed155d659c95801cb60 GIT binary patch literal 1059 zcmV+;1l;?HP)4bZ4EO*502y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00WCjL_t(Y$Gw(KXk1kk$A9?`R=qIMadVaq6(sl{w=&QhQX^Z!Fh+X7U#OLvWS$}m@cTQ=5JOcjZwNG zLJX1VnYjdJoy9wg_nyK#e35{yvzcWA>jmlsTm}EQNQJg{RRdD9Z%sTn01-YYm)+ z8LEgRR%z)XRTa{FKt&Oe1ZFdsFC0aY*fq)`u`3+jIjrsO-D+lOpG1@pBcV#g0f=Z? z(il_0#*hS&#gPCD%CewQ7BrhBjYf)Qv&_GXp8FIxZF`JHey_~M_U1JPe3Ew($@4G0 z!|Yc-GIGl`JaFF#W#Ma;zISYz*8W3$J2Sa*6-7{mg~c{y;Q<)AZ7-+(SfKx`J~nUK z$d;k2z!DZ10ksm_Nyr&m5*TzGKBwO?~nWciuYzz{OYG zQ;+}h>u+3l?PaVVIA@he-#_vM2lm~~kz>>Km`xs&dSv2-w|V&f?Ob@l`G^Q2ii+^v z=aYQ@#X$gmm_3-JF3Lq4*73pdS^jJ<)#?)w0Ah%AIu$N6MZs(C1qFWkd7iPmo&w<0 zkDkR@AsB;G5R;OGD0QWK#&@uL@2l+I^9lp&)+YCeLf@K_;nBxA@7%MwV{E9-Z*JXw zy>8yLk!F^5Utfb}qogQ2Mee=YpzZ3W7U_CoRRyXlHFbNb!{Xu+?RJOuQirLJzs9T5 zHOwff`*YKZrm=t4)G>pG6?s*`FWXG0lAkSCFRFwnI2ZqwU3EGMFjSEk1yRK>9|={6 zwQ-6lA;^C-;wsRo0#%5aSq2L+)`>LxnXAss5fefn#MlLsm{g}4kZhc1^6->iX45ls d|I6QkzW{3Od#sh#S+)QG002ovPDHLkV1g~0>lgq4 literal 0 HcmV?d00001 diff --git a/plugins/Eq/24dBoff.png b/plugins/Eq/24dBoff.png new file mode 100644 index 0000000000000000000000000000000000000000..419a091ba505e370aaf6df7a8df636731490571e GIT binary patch literal 990 zcmV<410np0P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00TxzL_t(Y$Gw)ZZyZGwhrjn` z*0KvLwq#eK3L;ptqq7v6AcZ0^62zt;{{T=2g$k&!oj(B*yCWh9Xl*$t*d*zJ$`nMg zgk3nT6?B!O^Uiw|Gq<;Plmdu2>279cXXo4B@6CI2(&@}P0)l`DB7!v6Pz#X6)_l5(Pn32&!lZ zO{*#yDn&8SBDQ#*k?y#AfjE{DNem$Yjvz#lq9z1l41^E}ArdsJQgQ3O2tBh1J=C-P+s_OZEjNJU{%f^)$ zTFz)*Uy!^Tg{1{*aOv_KA%yaPvc0{{k9RltVsYt&i&*CT`g!0PHM z&khe69v)_DYKrOU84!pdh~{|AOwVxf;#>Ui{dZiRdmAnB>~_2S_UkVIsA>b+-TjmG zwY3JKBA5uz4iC9@?PKLfS}Tf!|7K}Gcq#5*w|Q(ljd0cytT4<$F4a?aIn6?rv-_JKJfpQ`?qwyIp>|caJOc3&*V5+1cUSJKq4X zytLSi|Mm1Kubn;1`1ts9oAmniPk8_8RkpW(Z^qPH-aoj1pSig?CMG6ICCIyMacP;Q z?Erwt~H2woQYH%XmRBBi=1 z#BPS;M0axWOexp1W7)5$q<>tlQmU!z0!#^W!yO|131Ub}15mR6R)|xb6e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00WyzL_t(Y$Gw(ch?G?r#((F} z_szBx1pNW6tAZlv!kY@AKel9GY=4x+h4LbhD3XjUV%KUF!B`?KQ0T&RV<9CLwnVHf zQ;T9_!KkYxLb|B7K)cY`ZFatM-nWZ$=9}5pn@SqyWxhF_d7tx~^E}TP^Kk!4HOA0g z))uhG3z`B9D0o!1rie!LLMXC@nA)u-lV-lEm4(~l> z=_w0OQFy#}IA^ie)R^M#`*61zrOBzA?vJBPKMvs=n6os)@zv_#3`({4#qkNnMm1Z&=1BpPlB<=0dGL5dk2ENUK%h zGE)@1W-n+xIibfWI4cBW*s^(mP0#H?MA`DpIzmhhw+%nW*6r`Gb=v`!FS{zGM-+N5 zE9oD2g=??5lE*i!uKSzy>+aURRV(Pp((dhT(93Qv)}R|m9RYHE>ACRSCTs*VMY;4f>KjxAbpg!KRb002ovPDHLkV1m(%{SN>D literal 0 HcmV?d00001 diff --git a/plugins/Eq/48dBoff.png b/plugins/Eq/48dBoff.png new file mode 100644 index 0000000000000000000000000000000000000000..37f0f5ff80eeb987123fe4c3879590d49c575a35 GIT binary patch literal 1012 zcmVe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00Ue}L_t(Y$Gw)%Z&gJU$3N%H z+@_lbyJ%#M5t{(P1XF?wD~1|LaUlstT`4Topk)R4AAmdg(f$b-HQ{xmmPAdgDG*s$ z7m}LTromk$v`H5wuXoOIG1L3rD`BA$-{Q@@d2{EJ@Av$eEBp69?+6G2B8Ujm{Dv|s z^T&J~yldh(?%??gFY6J3UAvw^RZ*2ZiXy5F7`Ddk)PnFl-vYQ9=7yPJ=9n2vON&H7 zP!)nI8bULwN`^{N40I8@c%G5&xO;&(mJ&$}ApwpcM3JH<1Y!(?5C|a>G^uTRw{PD9VC3LIMn_-nQ3cR$ zw+SHtFf}#B!;KC4`}-Ll9%j#;y&w=l5Y6#eUtec_{+GroE%Cf_=V#t}`yBwj`tl17 zAASXZ#l=6EZnYYSieMr<+}Pms>5sVg=RI!B++gp%eSi?9D-O4A&N2GZD6Q7@94F1O zdhO^@zWwHFR#sLxapKJ;CNncLjE^7V>76^deCe~i-|~NxlUK77BO^_9YIkBSFE7(- zT?gRPix-;ppJr!y_q~&xJavlM*&mzr)dvrFcK2=u2L~TX(us*Pym9>>C;y;_ltwXtX`W9^X4G|E>NNM7 z2#%Zg)Jv1L?qJ5)*sFYg?HXpzkt1W6835zQUT1o`#dNF1jvY^7<@u_rn7n$0fq?-I z9eOdJk0S>Tyx`9b4^vf6x7plmv$bd|^!rX9& z$kqliB&7~0*?()qsm=;5Up2TBy}*Rhp)Eg@p2QVn*)cQ2-E+*$9I$f3YHplQ^zzKN ib;Mz5Y4Lw~E%+O?7F33Y|958q0000e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00R$6L_t(Y$Gw(Ki=0Ie$A4A* zGV@h}5W&dmvI`+ZkOgr=f|s0?tVF~}JV*{A5g{JjJt#r(8w3Ih9z3Y0xU!(2m;EO0 z%skyy9{PEiiBUX6AEv13?&|-)s;j!5NA_RYb`fD+R0I(~1OX7}|2^?>oc;&yxP!Ul zk4Y2}wztj^Vj!pz!X%qcG+>d5)ZKf{257A|i5az2j!#Y-nFi(d`(N_er*DyBAf`sF zLHj5h**eiW;Xr2YSWi&8N>?gU3hs`GG_n{1069l;ilh{YF%W{Hsw2^QbbpNs%vv<1 zR5~q)%4jo^g`kZrMP{=^&XH@^@AB=#j~bx}ssc}l40p_0RPE?0U00et;O3ZFBhxjq zlp;AtW;yZQ*B=v8AclbIl)IhFxA^IYqqWFdp3Iz5E2V4B0hoC^(psCtB8+4qDA%sv zCFexWiCIp}=b728$$Xyq<q1ZrMc{fjD4DINm za%t~9a-X}LA~^+8id@*aN$T^OQslRv?{Cu##z^c>AolYyD9^t5CLt;pc5b4>wNV|h27Cc@^R5beSMHz#nF^wcit^0!Z;VMF zfX1;Xzn^^3&kYqUfQ(oODF5;~{q?JVTtB~c1ArGUzWuj0+Iq~?cv=>Peh>ij$^Q7qBh0L?Rv)o&Q19=;U<^}X z&DkE`TV&oEDNst?*u3frrBqg30iavc=eKT*Tfda=8Lvv1od^?0EG3;o5jL+7J6*eeHv(5m&<f1EAZxqNFJ59^CXx3RzL3Z<*mYM47*-QV@Ydk5ZE$A2P+_YVB({;o&&*3*tY zIUvUP)L${B6uMH|%hP*e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00Op2L_t(Y$Gw(qk`zS{hM&x; z>bVCV0GGQkqDN3f{|JV{euM0;ivnt(96>!2dywg_Onzi_^~?qs{y;mTCbRPEowu_l zYvkt5j~xL)Km-v%`W~9r^!GdtzNI*hJ9vEH&7KjsapNOY6;%l-il}yAnB{fU2H~O4 z0B(l4VP=>)X2#Xk8?qp%3V;9gCwD&mjHHUD6u=UI$jt5?^xOl|9d~aaj@3#PL#Tiw z2w5c90OXuVDUnhpX|Pk3EoK2GBJqk?7=dFJtg0DR1*w%OA`lUjEwGdlITuRFyng)$ z!!R(Efz>du8dj`Uv4&yj`f6CQYH`CbP=WyNK^ikv<@Z;w$SHNuoHHdykx~lZegClQr4%mC z&$@pG$*mRhp%YaELHh}BV0XW~hbHCO8$7)PlKUI~KQtxdqq{`{ZF{;Xw$EWC4{#*;0>kGPlm_^{_i{}vph)Pd7Iy_kH zve@VSqy2-Ocxm-|450kW=kVzGAN?oCM*y5X{o%ba>bt+sCfj7N_@TNxhX?zM-52}y z`1=pO4PUF*eZkCeyO!hzfVsDk)An2PopyK5&z|CLynOL|nT_UvqstK8N~$4it+A%5 z?`L^(e6;MZ`K=nCe{naykXsvPpiYdKZLp~&P1DFUO^mJBIF8Le@y-1QeLwrBY3%vG z{rXEE#BPS;s5_X?Om>sTapLmF3&zc62W+$1aB+UNfOY?FeytN$Yp`=*Z||1hUa!6N z@IP6%*K6O~yXD#2Ay}_JLFd8wp{^LSCM)hv_I5RZwHsDZvk!cE#%-N(xVn1tzx*wD Y3zHe@It^S#MF0Q*07*qoM6N<$g5|}GT>t<8 literal 0 HcmV?d00001 diff --git a/plugins/Eq/ActiveHP.png b/plugins/Eq/ActiveHP.png new file mode 100644 index 0000000000000000000000000000000000000000..3534c799823b42fa640c6bb0c82d636741649f11 GIT binary patch literal 992 zcmV<610Vc}P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00T%#L_t(Y$Gw)%Yh6_k$3Jt< zxi9~Lc2R5$lwwV)ZiLv@THT6SxKt1~BI3f08xdPjK?U82NCm|o2>t*?7vio7sT2Z& zMl`lWT-5vvN!~kWW?Y6iEIqvFBEob85kvqH1VEtO zUH5RDc7i+ZVD9+7NFu`Gy>}2(B!)nYli1rtEi5ttb@z5x#Z=BOwS^H@A5G&Cdb&@V)1!nAPWG<`h**uFV0Mc^#=L zp)#WiqKTsdRErj2%UPA=tkI(MW$HMVhzW(eSZ@>Eu=U@4ljVsqUcJwf(PcBeY$ys@H=~Sy* zjUn+5$Hmok&YrpZhTlK?^b*fJ^$2RlFTeiD#pR#+eK?StXrGx`H6E{0H8XzO*kXC* zXTJROMa=w0%E#PrGmafS%-rlDhQrLx?ueb8VXF%`ByYRmOya#mI@t#fkmPDZ&f%5_=y$0#eKTqvbp zbFRNvRZ3Aztr@kG+?g1rTHBSn#BR>)ZMQNUj>d+3(606`^`xoky6%vAn<=^aS#L96 zeS3)`M{Z$fcXU&BH5ygGk`-0MDzloDi;j)c%sIU{PYA;H_VDJ6IF~xsqK#PtE2`r{ z-UM>{>>)x7Y;W)Wt5-}Zg`zqEGc}3`?geYc`Cq;~ZJOETwT=JfZ^7TA;I_W}1#?gU O0000e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00QwzL_t(Y$Gw(Kk`qS|g}=-y zU0_0l6(OyVV1^ZrIe~{IKlTxT4S#nq-r7C`_91`;u)q-puVIOrU{?IJ<_5I7GQFr$ zcWcHI4hV-kLaLG~yI#MSnXg(dUi{V(5ClXJ5v2PKWme{=Tn;{%IF37b{=&=u5rMO3 z=cp>Gl1EWQwF8FDcpSArc%E+n+zfNW%rJAzjKjlsL_ts$f+`w9H>yeomBJVpAP(?6 zL%QSc1;nwGNMZ;Ha0DTW6gD9cV<3b;2$7(fovI9&WiS!R645gP$1Jl-W+W9PCE6T; zh!81YL6r~!F^&poERt^WD5o>)SY^pHwK*PebKDg~h$5g;Bn*)lGhk+@s0KuY)oR7F zr%wR5e&gnV89kUKQnDV%Gg~zy;~6}t6aWvm0y4PnbBy( zXw;R5WDJ%r5Zqua}(P-DNhLF`Lc!@%~Tz{@VkNj*fCn z>|;ZSXc+7z+O>{?AUfB$>-auVsGz4zkw>(zW;&8j~?>k#h=u5eJsDam1ikM z7B?yHo0%R|g}SZ*m`{KA<3|sv>zc`A!hEs7%t$G*zrWw*Pk_k3 zTvfGXcW>|1^@B^7`0n5UGvmXD_blHmbFcf!*yvjoRpLr@ef;=|YPsar?K@l5ce46( z{N$Sn|wM_HrwB2GJ?TSqw9k?q97|0F1|D)@{4RYTK?( zHgyMD_H{EHC%P9_DP=z^o4$Viik+Pu)=l%pc9l{~+iqB<%+4XQ2@pe4>YjAISRkS_ z>*ni>I2CD&oVXLcfCmgC fc=+yrc`f)Gey(2=_&>NB00000NkvXXu0mjf$BdED literal 0 HcmV?d00001 diff --git a/plugins/Eq/ActiveHS.png b/plugins/Eq/ActiveHS.png new file mode 100644 index 0000000000000000000000000000000000000000..c4a5546da44e87ae998ef1e3e54e8886bd818bb8 GIT binary patch literal 968 zcmV;(12_DMP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00S^dL_t(Y$Gw)#t6W78#edb^ zcgFY^xKno;bRmKela06$(IgO1aN)wQhaVe3P$ak!UAi;!OniipY;+?;32sFRJP;*8 zUN$2B4a&>R?dmEQ)py>!d~FOiQ{2nko;r1^Pn|n*?72fOBCJOeK?D#%00jEoEtli; z54htF=8oSGMMOCC#KYv0$tjWZUhFR-5{vACx_iH}FKKJG7iKhVT;ARZu#^)eCrT*{ zB~yj~PC0d!0k#gb4mg3CJJtcTHmWv66?aEO0<7drDTUdrFdGWPP$(snb0Vd*0$OKx zGb=C)HmZ%96iKq$vjWRGF_g?~D9q;rvsnP<+yO;MN#GXDaK|iIMe7>1YU~Hx95V~B z)WOP-8HQjtpAEro$dsH(Y47YNW@pY`V(Z)w+-Y6d`XE}`8Y!3&g6QH1zyKS10V|dE zYB#_7p5Lzg!7o35j#-Fe94i2|2D8O-WOsMD$}0jTlyybD&a9PBj8;6_7e`=Gh;sQBI$kq;`Dbs z^w?{>^~UqOvvG7?`IsAS79(JWne{pJo)>UP-e_<{8BL9iSDxj{_9myk zyvWtx|3v#URi$a%+nPm9xz_V1+;PHYR2!`|ni{n>#;T~sb?lNpzx6&JeSD5umD;~w z-?vy+c6XO7mm{hTYu1h0N$%_!X0u2zR>rZi94m{($Z{F6Sd2V)|9u>O@)2Hr^Rs== z{{Cl|etU3nbUO^NLYbw6#4jYle#8 qu2?tDyZQ38b!L~hcm9{Z1^)uu@tV0bw!B{e0000e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00P@dL_t(Y$Gw)la$H3ag}?3@ z=?Ro6vz?ogt4w6PJOJh8?mnb|X^`}CQW>(^fi1Ox#QLLymHMK?{h*AP6EL`UjEkD*{)pTt!t; zmEMaYsuM7b{Vr-kL?4d;;f{yn?zji;&hhbcsvxKeMHMY&>Q$wKN-_o(hzq>vkP$>g zf&^}ci6a;g2tpM}Hl>njiuDhXCp zDWy>BUV_#P>6k~knAyathfJ;Y^+0$Kp&&vP0hJ74snps5J3~da%wS{IM0oP#5B_}m zl*`)Pd+*{Ns5>I`oXJ8QrBrGulpS^~03Scz@b`-seDdjMlj52g0A>wq#?TsPXJ@GP z-xs8-QAl>0PwAkglzt3e5=`3ST15oITmh}?h|Ee2z=hm&)`279@HtRJfCnvKQ%%-vL?4P{R z0|<09(b>x!H}4WQ>rb1<@7%q|Z@>OB&+W_)!@zcXMjM7afTx{-25FpWm}ZS;Mr%fE z1FbcN)_Ok-92^{Q_1ZOl{^>`CVV>V^x3ty)M1&wFBMx_hphhGsv+if3%|zg?sMtBX zx_R?e%#3fo{_0XeynW{mZr0faR5C9nj-(4j1a5w*5g#4h;OOYa#YQ})AyY#HH4;on zhxWe7Ud9#UJ!0-%Fg5Z-;CaJpH_n%OdG_175^#L{{D1jd@DH4{Q@sGgCer`_002ov JPDHLkV1jq=k=g(N literal 0 HcmV?d00001 diff --git a/plugins/Eq/ActiveLP.png b/plugins/Eq/ActiveLP.png new file mode 100644 index 0000000000000000000000000000000000000000..37c2ca869b5ee7b88fff5764627b81481130995a GIT binary patch literal 990 zcmV<410np0P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00TxzL_t(Y$Gw)pYh6VY#(!sK z?u-5dl@e@|m?|}Ctq5XlX{_B=T!}~v>cWC_=_1gD6{;xs7j)5rv_e-3F2t2uQYmB^ zkyxz@vHlP7&CEG2&fNQ6+Egrv!#mvf9&^ukzH`6x&6QVAt(b@~9YF*UKm-90Xy0~S zhS5G?h8d_Cc26V`VdeRQ#1x4k5aT3v7U79SCZJ~4uIxx!t4>0dS}M0Twj3 zh$apPbg-@!FsQUu``poUT)VOcz{QV0=j!D(%*+{y3ro$&xej?nAh^7nNK*9Hr9jtt zTT^TAsEgeB?N3g>{Rx{JmpHt0|lnIYi*+U;g00;w&Nb3Kl?GUN?rco4WdV|NI#a zEzJ*=K4_g-J;HbEn;cl2<)2n^kMS7+P@F3;$?mMS=?evEn zdtr$u7WSg5Z4RyF1q_0rTyL!rBI7<{MaGBU*8-os?Rl@ zKVXL8Hd9Ka)=Di(&XsX4l;YQM_F=s@#%qrp8ZOzcaUQ4>^||dCeg8HdC_uSuX@Nqf{lv`mgP3|NcFE z@zqVvoqdJz*qN7H{gF5`2g{`n#;IzQq7QAv$6q{zs%Z2vVLju;nKoq%aoiU?)}ZN~Xu9-cbQ?AFHC|MFV!H%eTF{OsYHqyPW_ M07*qoM6N<$f+1YbfB*mh literal 0 HcmV?d00001 diff --git a/plugins/Eq/ActiveLPoff.png b/plugins/Eq/ActiveLPoff.png new file mode 100644 index 0000000000000000000000000000000000000000..3b570fadf9195f3772158f05f6f93ff51ddc9914 GIT binary patch literal 896 zcmV-`1AqL9P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00QVqL_t(Y$Gw)pk`zS{hQG|J zet~tC*@*GP>@vd%Z*sxilN!4yuK~ORa0Q=0y{NAM9Mq#=gq-Bc!0t_=-(k8kIb?ND z53qz9h80m$HPv19&;MuUUn5tpeBuZQ0wRbAGJJ%4ao;~|x zV08NG6>ZzHx3|Y)vE=5h+wbJZY&IKMPp20UtAMpqdbR@O_qjpek55jR%|1qJfuGkF z%O$JT3#QWxe5mE2T0H9I)2ml$nn;YC(va34YKMnMeE;3I%;)>;?(W8(>MZ?U2NWDP z->MgP+o~Hgqm(kt$GuC@J0)%v^UX>ml;-!QaVa0(Yw+7eZA|L&-Zz` zT2V@emC;#l)y^P0)i|qRmRkMZr|>yNJ(kwpnM@`Cy#DJoA5A6!TF-Se94EV1R;7fW zZB@UbQvSAG?de zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00TcsL_t(Y$Gw(MYn)XS#((GB zduNjI3%FC4wYX432rd*A6k2ql5Xd40W2lmyAa|GMvG z82tlgm_akc?y4vvti5oK5CcJ#5EgZM2yZO105!Az&8eofwneo@EtT7M4joK`5`z+B zB*j2X4y-{tO9xv9S_T}zni;JFlw8TBBBfwvh=_y55Qs4{8bwAal2RnbKnRMe&ViQM z-OCDEb2g<^vKB;TzGe;EU&k?(JQPD+u~ z2dK4@QkqY@z4HZMA1If%F3{RS7&#YITv*MFoa?-=2&l`uizEg@2z}D#jALN3y27Xf zrxf{W?<0Qt`FH;O>mNqRw?Fn{NGTAa5<(!xfChEjh@b+9x{Fl(Y{uinWHNT41SLdQ zY8+G>l-*A+vA+2kF-HGCxO#_O8hV}TKX_GDfo^KmUV^BivbcGuXP$nNoy%`>{`qaL zfBBuS)5X1R6X|_>Fs#4xlD+!!vphCgVRd!PWHM&5I%Yghq~w+uCOt!poO|xQGsSeU ze}$uePx#@-Ux}VE?h&y0d3h<;8cl$v_kdl!ag%F%xA=^S$TXsLFIboAAlF(OK^sMcV9=x?!RL6Jth5|E48?}OR2QldQcnDj74D9 z*1eJlLC8JVYHf^0ah{DkA716fwevjn#N$k-v%5@PJ7_u8*9_tiGbMYTsmenWWOL&+ zHr8L^_+)lwT+L<}9&V&6c4-Mj@qvHn$aW2eqA(z^jb+A(FypeT* zg#2h8F{KnrtqZVLU3F%K)`Rm=K0Mnpv)gwL|CiT-{{TPGgu@Q-xK;oF002ovPDHLk FV1lDI#VY^+ literal 0 HcmV?d00001 diff --git a/plugins/Eq/ActiveLSoff.png b/plugins/Eq/ActiveLSoff.png new file mode 100644 index 0000000000000000000000000000000000000000..234d03fbeb46466df6dd184e67e770d754a0eaf7 GIT binary patch literal 909 zcmV;819JR{P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00Q+%L_t(Y$Gw)zl2kGDwn4$ofUL=Z3)f z^A}K6RHgQ!h-wFhP5&}#gUCAG0AvJ_K|~OdLezIyP0SG5lg4mddY zaDvys!f}r+P*%1Yfe7`?WFn4IjJtR5Q6}s%lTu0#^5YNR^W@267K_8KxXMZq8IcC$ z9;nv%f}k6Pt7ucCl0Zbwb18*k7}{CZ&nKVWY(_-b z+uI{azI*r(1orp$n=;$^xf9_;1n$n?FJ2&5uDqX@-o3;yyu~og7-j>rVd&thrGuT- z?tl5kneT4hzQbyD%F{oeV!5NJ>Is|OWh5y%sj1zzT>inM<&wqWA&bQ!;m+vJIF78> zYgVfjtJSJ|jX@1Mt(VN`bwflCK4o`&e9WWelFvS`tRjMVX?^#`NFcF|iEh0tSg%LM z(W^+z$cQeWP5b?~U%7efHts%=e&9Y5zKsc&@Vs# z#D$9&na}5p({w@^&0E-`akW;y=JDe^vW*5 z*i4W>+`EEaXT+zcr>{0*A1lL_PBO7e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00WRoL_t(Y$Gw)#YgAVl#((GI z&LsE;xHK*`Ru_d}G*qNT`=KZ(ij^idA*RtT+J!DfP;h5Aia3$PCUjBgrXUteODPhB zfV3zjt4LS=1r0NE&&S)vIdf;?Bs=kPUuL+R^FHtM-sgSJRVR*(ic*T+&`O~cpcD!~ zLH@VtB?$Qj5kw%0Aa8_KN-;XJ3u6sNYmDi}#v)Q;rMjRZl7HEdG=$iV7zsY`Y-Kfp zX```5W38pI23sUxZFFXtzE>|)Cx_e z6$cQbq?U$&PRvMx$l^$V39QHkD5aQN_=Ue;tnqyLZUr`d`8&S<;Wwtg`~(q6j8qa< z6v4SrM$jfu*6voV}KeMo-% z>CY|Q;l;}Rs?sgQSP5b8$jp{`&YnJmMWAu#8wLkzY}+=#;9#A>fg1IC!Ti#%>>Zh5 zcKR4!&z#s2?9Tn4xi|NS>B&!-{Nf1hwxii9X*S!eueWHnN`C+2FRbKQkSx_sl_5l? zCqCw@sn2--;AK7-dynB=Lw#WXtp3Zrxko%-zDw|d(s@FRRj%Ir8WDtKGu{V62m~K- zE^YKau=wCA*KaQ2obQY4Hi zS|vMoZ0Eq}FjKR)X|+n)?eu(V_BIDbhuOJfdwQPtm8HWuzag&(*pAJ3m;9__Gf@N| zBF3cYKY!*h!3Pe0_-)m~@y|cv{F%cvn`NI}m1Sb?T_A)=6v1|m1m{C#oG}XC$37!I zb#jbTC&xAz@qg>B&5hXk)K(udvkc}#sFWsIAjZ9&BgT7=51|VdL&PhEh$m*_e4B@7 i>}B?BW%ZqW7W@x2Gn@Kx2$3xS0000e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00T}*L_t(Y$Gw)zZd6AQhQF$A zd+F6=Vd?_LxQ36UpEWktHnh0L*lC zWzjunj!nEn8L8*=Y4z#v{8iO|ADN#1(h(2@L=X|Axrf@T{WE?J-s(7xJ9zoS>v%-q z{P{^#6;&x$QAD)?!{BBU?znq}IN1!7j9`Ex2vMY}34s^`Ap}B*1TE@RrKPOEM5Kg>p(1c{E~+eNOa(C` zl^KW#kqQf{gb;{vq(Wm2=^&4Cwz5W537J|d^8wF}yMhQ&1XOAWLnOumED9CX(7?Lg zJ@&iZhO@Y|#M0985S9(IJOp`Bt2rY=$(gi@BZNo{fpALQ?%pnczkSQ?J9it{!|g3z zyx3=Dd8MjSL=sX#W*OD8z98tJ!d0|Zq@tlfi@LzO<6~YQ9B^}eqZtb!aC3cw*9Ql@ zJ3elWM>Mq75^c7Qf*{)7V}jHw)SAx+_wRA-`i={OwFx3jOiYwqnUS-RbH>d0 z=ly$RZf@RRzWnn{bNJ@l@6fuz&oq!)g+KlH!>ea8$TbR#ll?RPV~K37wLDil19hr#R>L$)Br{SnQtFdZqSNUx zIW@)h)+YUazX{X!)+UovQ*=5VQc88ckp|GZuIG&7ME9!7toYf9-LI$^BErJ_0%pb^ zzyH>R@T<$0S(sm--|L;QE3-sO1C>_PIYb5%BqL@+kmZkzcxGmnnVH!WM*N}o;lGV| zkcJvg+=+v-6{ +#include +#include EqControlsDialog::EqControlsDialog( EqControls *controls ) : @@ -45,113 +43,223 @@ EqControlsDialog::EqControlsDialog( EqControls *controls ) : m_controls = controls; setAutoFillBackground( true ); QPalette pal; - pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "EqLayout1BG" ) ); setPalette( pal ); - setFixedSize( 350, 275 ); - m_inSpec = new EqSpectrumView( &controls->m_inFftBands, this); - m_inSpec->move( 51, 2 ); + setFixedSize( 500, 500 ); + QGridLayout * mainLayout = new QGridLayout( this ); + + m_inSpec = new EqSpectrumView( &controls->m_inFftBands, this ); + mainLayout->addWidget( m_inSpec, 0, 1, 1, 8 ); m_inSpec->color = QColor( 238, 154, 120, 80 ); - m_outSpec = new EqSpectrumView( &controls->m_outFftBands, this); - m_outSpec->move( 51, 2 ); - m_outSpec->color = QColor(145, 205, 22, 80); + + m_outSpec = new EqSpectrumView( &controls->m_outFftBands, this ); + m_outSpec->color = QColor( 145, 205, 22, 80 ); + mainLayout->addWidget( m_outSpec, 0, 1, 1, 8 ); + m_parameterWidget = new EqParameterWidget( this , controls ); - m_parameterWidget->move( 51, 2 ); + mainLayout->addWidget( m_parameterWidget, 0, 1, 1, 8 ); - setBand( 0, &controls->m_hpActiveModel, &controls->m_hpFeqModel, &controls->m_hpResModel, 0, QColor(255 ,255, 255), tr( "HP" ) ,0,0); - setBand( 1, &controls->m_lowShelfActiveModel, &controls->m_lowShelfFreqModel, &controls->m_lowShelfResModel, &controls->m_lowShelfGainModel, QColor(255 ,255, 255), tr( "Low Shelf" ), &controls->m_lowShelfPeakL , &controls->m_lowShelfPeakR ); - setBand( 2, &controls->m_para1ActiveModel, &controls->m_para1FreqModel, &controls->m_para1BwModel, &controls->m_para1GainModel, QColor(255 ,255, 255), tr( "Peak 1" ), &controls->m_para1PeakL, &controls->m_para1PeakR ); - setBand( 3, &controls->m_para2ActiveModel, &controls->m_para2FreqModel, &controls->m_para2BwModel, &controls->m_para2GainModel, QColor(255 ,255, 255), tr( "Peak 2" ), &controls->m_para2PeakL, &controls->m_para2PeakR ); - setBand( 4, &controls->m_para3ActiveModel, &controls->m_para3FreqModel, &controls->m_para3BwModel, &controls->m_para3GainModel, QColor(255 ,255, 255), tr( "Peak 3" ), &controls->m_para3PeakL, &controls->m_para3PeakR ); - setBand( 5, &controls->m_para4ActiveModel, &controls->m_para4FreqModel, &controls->m_para4BwModel, &controls->m_para4GainModel, QColor(255 ,255, 255), tr( "Peak 4" ), &controls->m_para4PeakL, &controls->m_para4PeakR ); - setBand( 6, &controls->m_highShelfActiveModel, &controls->m_highShelfFreqModel, &controls->m_highShelfResModel, &controls->m_highShelfGainModel, QColor(255 ,255, 255), tr( "High Shelf" ), &controls->m_highShelfPeakL, &controls->m_highShelfPeakR ); - setBand( 7, &controls->m_lpActiveModel, &controls->m_lpFreqModel, &controls->m_lpResModel, 0, QColor(255 ,255, 255), tr( "LP" ) ,0,0); - int cw = width()/8; //the chanel width in pixels - int ko = ( cw * 0.5 ) - ((new Knob( knobBright_26, 0 ))->width() * 0.5 ); + setBand( 0, &controls->m_hpActiveModel, &controls->m_hpFeqModel, &controls->m_hpResModel, 0, QColor(255 ,255, 255), tr( "HP" ) ,0,0, &controls->m_hp12Model, &controls->m_hp24Model, &controls->m_hp48Model,0,0,0); + setBand( 1, &controls->m_lowShelfActiveModel, &controls->m_lowShelfFreqModel, &controls->m_lowShelfResModel, &controls->m_lowShelfGainModel, QColor(255 ,255, 255), tr( "Low Shelf" ), &controls->m_lowShelfPeakL , &controls->m_lowShelfPeakR,0,0,0,0,0,0 ); + setBand( 2, &controls->m_para1ActiveModel, &controls->m_para1FreqModel, &controls->m_para1BwModel, &controls->m_para1GainModel, QColor(255 ,255, 255), tr( "Peak 1" ), &controls->m_para1PeakL, &controls->m_para1PeakR,0,0,0,0,0,0 ); + setBand( 3, &controls->m_para2ActiveModel, &controls->m_para2FreqModel, &controls->m_para2BwModel, &controls->m_para2GainModel, QColor(255 ,255, 255), tr( "Peak 2" ), &controls->m_para2PeakL, &controls->m_para2PeakR,0,0,0,0,0,0 ); + setBand( 4, &controls->m_para3ActiveModel, &controls->m_para3FreqModel, &controls->m_para3BwModel, &controls->m_para3GainModel, QColor(255 ,255, 255), tr( "Peak 3" ), &controls->m_para3PeakL, &controls->m_para3PeakR,0,0,0,0,0,0 ); + setBand( 5, &controls->m_para4ActiveModel, &controls->m_para4FreqModel, &controls->m_para4BwModel, &controls->m_para4GainModel, QColor(255 ,255, 255), tr( "Peak 4" ), &controls->m_para4PeakL, &controls->m_para4PeakR,0,0,0,0,0,0 ); + setBand( 6, &controls->m_highShelfActiveModel, &controls->m_highShelfFreqModel, &controls->m_highShelfResModel, &controls->m_highShelfGainModel, QColor(255 ,255, 255), tr( "High Shelf" ), &controls->m_highShelfPeakL, &controls->m_highShelfPeakR,0,0,0,0,0,0 ); + setBand( 7, &controls->m_lpActiveModel, &controls->m_lpFreqModel, &controls->m_lpResModel, 0, QColor(255 ,255, 255), tr( "LP" ) ,0,0,0,0,0, &controls->m_lp12Model, &controls->m_lp24Model, &controls->m_lp48Model); - m_inGainFader = new EqFader( &controls->m_inGainModel, tr( "In Gain" ), this, &controls->m_inPeakL, &controls->m_inPeakR); - m_inGainFader->move( 10, 5 ); + m_inGainFader = new EqFader( &controls->m_inGainModel, tr( "In Gain" ), this, + &controls->m_inPeakL, &controls->m_inPeakR ); + + mainLayout->addWidget( m_inGainFader, 0, 0 ); m_inGainFader->setDisplayConversion( false ); m_inGainFader->setHintText( tr( "Gain" ), "dBv"); - - - m_outGainFader = new EqFader( &controls->m_outGainModel, tr( "Out Gain" ), this, &controls->m_outPeakL, &controls->m_outPeakR ); - m_outGainFader->move( 315, 5 ); + m_outGainFader = new EqFader( &controls->m_outGainModel, tr( "Out Gain" ), this, + &controls->m_outPeakL, &controls->m_outPeakR ); + mainLayout->addWidget( m_outGainFader, 0, 9 ); m_outGainFader->setDisplayConversion( false ); - m_outGainFader->setHintText( tr( "Gain" ), "dBv"); - //gain faders + m_outGainFader->setHintText( tr( "Gain" ), "dBv" ); - int fo = (cw * 0.5) - (m_outGainFader->width() * 0.5 ); - - for( int i = 1; i < m_parameterWidget->bandCount() - 1; i++) + // Gain Fader for each Filter exepts the pass filter + for( int i = 1; i < m_parameterWidget->bandCount() - 1; i++ ) { - m_gainFader = new EqFader( m_parameterWidget->getBandModels(i)->gain, tr( "" ), this ,m_parameterWidget->getBandModels( i )->peakL, m_parameterWidget->getBandModels( i )->peakR ); - m_gainFader->move( cw * i + fo , 123 ); + m_gainFader = new EqFader( m_parameterWidget->getBandModels( i )->gain, tr( "" ), this, + m_parameterWidget->getBandModels( i )->peakL, m_parameterWidget->getBandModels( i )->peakR ); + mainLayout->addWidget( m_gainFader, 2, i+1 ); + mainLayout->setAlignment( m_gainFader, Qt::AlignHCenter ); m_gainFader->setMinimumHeight(80); m_gainFader->resize(m_gainFader->width() , 80); m_gainFader->setDisplayConversion( false ); m_gainFader->setHintText( tr( "Gain") , "dB"); } - - for( int i = 0; i < m_parameterWidget->bandCount() ; i++) + + //Control Button and Knobs for each Band + for( int i = 0; i < m_parameterWidget->bandCount() ; i++ ) { m_resKnob = new Knob( knobBright_26, this ); - if(i ==0 || i == 7) - { - m_resKnob->move( cw * i + ko , 190 ); - } else - { - m_resKnob->move( cw * i + ko , 205 ); - } + mainLayout->setRowMinimumHeight( 4, 33 ); + mainLayout->addWidget( m_resKnob, 5, i+1 ); + mainLayout->setAlignment( m_resKnob, Qt::AlignHCenter ); m_resKnob->setVolumeKnob(false); m_resKnob->setModel( m_parameterWidget->getBandModels( i )->res ); if(i > 1 && i < 6) { m_resKnob->setHintText( tr( "Bandwidth: " ) , " Octave" ); } else { m_resKnob->setHintText( tr( "Resonance : " ) , "" ); } m_freqKnob = new Knob( knobBright_26, this ); - if( i == 0 || i == 7 ) - { - m_freqKnob->move( cw * i + ko, 222 ); - } else - { - m_freqKnob->move(cw * i + ko, 235 ); - } + mainLayout->addWidget( m_freqKnob, 3, i+1 ); + mainLayout->setAlignment( m_freqKnob, Qt::AlignHCenter ); m_freqKnob->setVolumeKnob( false ); m_freqKnob->setModel( m_parameterWidget->getBandModels( i )->freq ); m_freqKnob->setHintText( tr( "Frequency:" ), "Hz" ); - m_activeBox = new LedCheckBox( m_parameterWidget->getBandModels( i )->name , this , "" , LedCheckBox::Green ); - m_activeBox->move( cw * i + fo + 3, 260 ); + // adds the Number Active buttons + m_activeBox = new PixmapButton( this, NULL ); + m_activeBox->setCheckable(true); m_activeBox->setModel( m_parameterWidget->getBandModels( i )->active ); + + QString iconActiveFileName = "bandLabel" + QString::number(i+1) + "on"; + QString iconInactiveFileName = "bandLabel" + QString::number(i+1); + m_activeBox->setActiveGraphic( PLUGIN_NAME::getIconPixmap( iconActiveFileName.toLatin1() ) ); + m_activeBox->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( iconInactiveFileName.toLatin1() ) ); + + mainLayout->addWidget( m_activeBox, 1, i+1 ); + mainLayout->setAlignment( m_activeBox, Qt::AlignHCenter ); + m_activeBox->setModel( m_parameterWidget->getBandModels( i )->active ); + + // adds the symbols active buttons + m_activeBox = new PixmapButton( this, NULL ); + m_activeBox->setCheckable(true); + m_activeBox->setModel( m_parameterWidget->getBandModels( i )->active ); + switch (i) + { + case 0: + m_activeBox->setActiveGraphic( PLUGIN_NAME::getIconPixmap( "ActiveHP" ) ); + m_activeBox->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "ActiveHPoff" ) ); + break; + case 1: + m_activeBox->setActiveGraphic( PLUGIN_NAME::getIconPixmap( "ActiveLS" ) ); + m_activeBox->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "ActiveLSoff" ) ); + break; + case 6: + m_activeBox->setActiveGraphic( PLUGIN_NAME::getIconPixmap( "ActiveHS" ) ); + m_activeBox->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "ActiveHSoff" ) ); + break; + case 7: + m_activeBox->setActiveGraphic( PLUGIN_NAME::getIconPixmap( "ActiveLP" ) ); + m_activeBox->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "ActiveLPoff" ) ); + break; + default: + m_activeBox->setActiveGraphic( PLUGIN_NAME::getIconPixmap( "ActivePeak" ) ); + m_activeBox->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "ActivePeakoff" ) ); + } + + mainLayout->addWidget( m_activeBox, 7, i+1 ); + mainLayout->setAlignment( m_activeBox, Qt::AlignHCenter); + m_activeBox->setModel( m_parameterWidget->getBandModels( i )->active ); + + // Connects the knobs, Faders and buttons with the curve graphic + QObject::connect( m_parameterWidget->getBandModels( i )->freq , SIGNAL( dataChanged() ), m_parameterWidget, SLOT ( updateView() ) ); + if ( m_parameterWidget->getBandModels( i )->gain ) QObject::connect( m_parameterWidget->getBandModels( i )->gain, SIGNAL( dataChanged() ), m_parameterWidget, SLOT ( updateView() )); + QObject::connect( m_parameterWidget->getBandModels( i )->res, SIGNAL( dataChanged() ), m_parameterWidget , SLOT ( updateView() ) ); + QObject::connect( m_parameterWidget->getBandModels( i )->active, SIGNAL( dataChanged() ), m_parameterWidget , SLOT ( updateView() ) ); + + m_parameterWidget->changeHandle( i ); } + + // adds the buttons for Spectrum analyser on/off + m_inSpecB = new PixmapButton(this, NULL); + m_inSpecB->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "ActiveAnalyse" ) ); + m_inSpecB->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "ActiveAnalyseoff" ) ); + m_inSpecB->setCheckable(true); + m_inSpecB->setModel( &controls->m_analyseInModel ); + + m_outSpecB = new PixmapButton(this, NULL); + m_outSpecB->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "ActiveAnalyse" ) ); + m_outSpecB->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "ActiveAnalyseoff" ) ); + m_outSpecB->setCheckable(true); + m_outSpecB->setModel( &controls->m_analyseOutModel ); + mainLayout->addWidget( m_inSpecB, 1, 0 ); + mainLayout->addWidget( m_outSpecB, 1, 9 ); + mainLayout->setAlignment( m_inSpecB, Qt::AlignHCenter ); + mainLayout->setAlignment( m_outSpecB, Qt::AlignHCenter ); + //hp filter type + m_hp12Box = new PixmapButton( this , NULL ); + m_hp12Box->setModel( m_parameterWidget->getBandModels( 0 )->hp12 ); + m_hp12Box->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "12dB" ) ); + m_hp12Box->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "12dBoff" ) ); - m_hp12Box = new LedCheckBox( tr( "12dB" ), this , "" , LedCheckBox::Green ); - m_hp12Box->move( cw*0 + ko, 170 ); - m_hp12Box->setModel( &controls->m_hp12Model ); - m_hp24Box = new LedCheckBox( tr( "24dB" ), this , "" , LedCheckBox::Green ); - m_hp24Box->move( cw*0 + ko, 150 ); - m_hp24Box->setModel( &controls->m_hp24Model ); + m_hp24Box = new PixmapButton( this , NULL ); + m_hp24Box->setModel(m_parameterWidget->getBandModels( 0 )->hp24 ); - m_hp48Box = new LedCheckBox( tr( "48dB" ), this , "" , LedCheckBox::Green ); - m_hp48Box->move( cw*0 + ko, 130 ); - m_hp48Box->setModel( &controls->m_hp48Model ); + + m_hp24Box->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "24dB" ) ); + m_hp24Box->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "24dBoff" ) ); + + m_hp48Box = new PixmapButton( this , NULL ); + m_hp48Box->setModel( m_parameterWidget->getBandModels(0)->hp48 ); + + m_hp48Box->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "48dB" ) ); + m_hp48Box->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "48dBoff" ) ); //LP filter type + m_lp12Box = new PixmapButton( this , NULL ); + mainLayout->addWidget( m_lp12Box, 2,1 ); + m_lp12Box->setModel( m_parameterWidget->getBandModels( 7 )->lp12 ); + m_lp12Box->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "12dB" ) ); + m_lp12Box->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "12dBoff" ) ); - m_lp12Box = new LedCheckBox( tr( "12dB"), this , "" , LedCheckBox::Green ); - m_lp12Box->move( cw*7 + ko -5 , 170 ); - m_lp12Box->setModel( &controls->m_lp12Model ); - m_lp24Box = new LedCheckBox( tr( "24dB"), this , "" , LedCheckBox::Green ); - m_lp24Box->move( cw*7 + ko - 5, 150 ); - m_lp24Box->setModel( &controls->m_lp24Model ); - m_lp48Box = new LedCheckBox( tr( "48dB"), this , "" , LedCheckBox::Green ); - m_lp48Box->move( cw*7 + ko - 5, 130 ); - m_lp48Box->setModel( &controls->m_lp48Model ); + m_lp24Box = new PixmapButton( this , NULL ); + m_lp24Box->setModel( m_parameterWidget->getBandModels( 7 )->lp24 ); + m_lp24Box->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "24dB" ) ); + m_lp24Box->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "24dBoff" ) ); + + m_lp48Box = new PixmapButton( this , NULL ); + m_lp48Box->setModel( m_parameterWidget->getBandModels( 7 )->lp48 ); + m_lp48Box->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "48dB" ) ); + m_lp48Box->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "48dBoff" ) ); + // the curve has to change its appearance + QObject::connect( m_parameterWidget->getBandModels( 0 )->hp12 , SIGNAL ( dataChanged() ), m_parameterWidget, SLOT( updateView())); + QObject::connect( m_parameterWidget->getBandModels( 0 )->hp24 , SIGNAL ( dataChanged() ), m_parameterWidget, SLOT( updateView())); + QObject::connect( m_parameterWidget->getBandModels( 0 )->hp48 , SIGNAL ( dataChanged() ), m_parameterWidget, SLOT( updateView())); + + QObject::connect( m_parameterWidget->getBandModels( 7 )->lp12 , SIGNAL ( dataChanged() ), m_parameterWidget, SLOT( updateView())); + QObject::connect( m_parameterWidget->getBandModels( 7 )->lp24 , SIGNAL ( dataChanged() ), m_parameterWidget, SLOT( updateView())); + QObject::connect( m_parameterWidget->getBandModels( 7 )->lp48 , SIGNAL ( dataChanged() ), m_parameterWidget, SLOT( updateView())); + + QVBoxLayout * hpGrpBtnLayout = new QVBoxLayout; + hpGrpBtnLayout->addWidget( m_hp12Box ); + hpGrpBtnLayout->addWidget( m_hp24Box ); + hpGrpBtnLayout->addWidget( m_hp48Box ); + + QVBoxLayout * lpGrpBtnLayout = new QVBoxLayout; + lpGrpBtnLayout->addWidget( m_lp12Box ); + lpGrpBtnLayout->addWidget( m_lp24Box ); + lpGrpBtnLayout->addWidget( m_lp48Box ); + + mainLayout->addLayout( hpGrpBtnLayout, 2, 1, Qt::AlignCenter ); + mainLayout->addLayout( lpGrpBtnLayout, 2, 8, Qt::AlignCenter ); automatableButtonGroup *lpBtnGrp = new automatableButtonGroup(this,tr ( "lp grp" ) ); - lpBtnGrp->addButton( m_lp12Box); + lpBtnGrp->addButton( m_lp12Box ); lpBtnGrp->addButton( m_lp24Box ); lpBtnGrp->addButton( m_lp48Box ); lpBtnGrp->setModel( &m_controls->m_lpTypeModel, false); @@ -162,11 +270,46 @@ EqControlsDialog::EqControlsDialog( EqControls *controls ) : hpBtnGrp->addButton( m_hp48Box ); hpBtnGrp->setModel( &m_controls->m_hpTypeModel,false); + mainLayout->setAlignment( Qt::AlignTop ); + for (int i = 0 ; i < 10; i++) + { + mainLayout->setColumnMinimumWidth(i, 50); + } + + mainLayout->setAlignment( m_inGainFader, Qt::AlignHCenter ); + mainLayout->setAlignment( m_outGainFader, Qt::AlignHCenter ); + mainLayout->setRowMinimumHeight( 0,200 ); + mainLayout->setRowMinimumHeight( 1, 40 ); + mainLayout->setRowMinimumHeight(6,15); + mainLayout->setContentsMargins( 0, 11, 0, 0 ); + mainLayout->setAlignment(m_inSpec, Qt::AlignCenter ); + mainLayout->setAlignment(m_outSpec, Qt::AlignCenter ); + + m_freqLabel = new QLabel(this); + m_freqLabel->setText("- " + tr( "Frequency")+ " -" ); + m_freqLabel->move( 217 , 377 ); + + m_resLabel1 = new QLabel(this); + m_resLabel1->setText("- " + tr( "Resonance")+ " -" ); + m_resLabel1->move( 62 , 444 ); + + m_resLabel2 = new QLabel(this); + m_resLabel2->setText("- " + tr( "Resonance")+ " -" ); + m_resLabel2->move( 365 , 444 ); + + m_bandWidthLabel = new QLabel(this); + m_bandWidthLabel->setText("- " + tr( "Bandwidth")+ " -" ); + m_bandWidthLabel->move( 215 , 444 ); + + setLayout(mainLayout); } + + + void EqControlsDialog::mouseDoubleClickEvent(QMouseEvent *event) { - m_originalHeight = parentWidget()->height() == 150 ? m_originalHeight : parentWidget()->height() ; - parentWidget()->setFixedHeight( parentWidget()->height() == m_originalHeight ? 150 : m_originalHeight ); + m_originalHeight = parentWidget()->height() == 283 ? m_originalHeight : parentWidget()->height() ; + parentWidget()->setFixedHeight( parentWidget()->height() == m_originalHeight ? 283 : m_originalHeight ); update(); } diff --git a/plugins/Eq/EqControlsDialog.h b/plugins/Eq/EqControlsDialog.h index f0bf4a993..09984fe4d 100644 --- a/plugins/Eq/EqControlsDialog.h +++ b/plugins/Eq/EqControlsDialog.h @@ -31,8 +31,11 @@ #include "LedCheckbox.h" #include "EqParameterWidget.h" #include "MainWindow.h" -#include "qpushbutton.h" #include "EqSpectrumView.h" +#include "PixmapButton.h" +#include +#include + class EqControls; @@ -50,27 +53,33 @@ public: private: EqControls * m_controls; - Fader* m_inGainFader; Fader* m_outGainFader; Fader* m_gainFader; Knob* m_resKnob; Knob* m_freqKnob; - LedCheckBox* m_activeBox; - LedCheckBox* m_lp12Box; - LedCheckBox* m_lp24Box; - LedCheckBox* m_lp48Box; - LedCheckBox* m_hp12Box; - LedCheckBox* m_hp24Box; - LedCheckBox* m_hp48Box; + PixmapButton* m_inSpecB; + PixmapButton* m_outSpecB; + PixmapButton* m_activeBox; + PixmapButton* m_lp12Box; + PixmapButton* m_lp24Box; + PixmapButton* m_lp48Box; + PixmapButton* m_hp12Box; + PixmapButton* m_hp24Box; + PixmapButton* m_hp48Box; LedCheckBox* m_analyzeBox; EqParameterWidget* m_parameterWidget; EqSpectrumView* m_inSpec; EqSpectrumView* m_outSpec; + QLabel* m_freqLabel; + QLabel* m_resLabel1; + QLabel* m_resLabel2; + QLabel* m_bandWidthLabel; + virtual void mouseDoubleClickEvent(QMouseEvent *event); - EqBand* setBand( int index, BoolModel* active, FloatModel* freq, FloatModel* res, FloatModel* gain, QColor color, QString name, float* peakL, float* peakR) + EqBand* setBand( int index, BoolModel* active, FloatModel* freq, FloatModel* res, FloatModel* gain, QColor color, QString name, float* peakL, float* peakR, BoolModel *hp12, BoolModel *hp24, BoolModel *hp48, BoolModel *lp12, BoolModel *lp24, BoolModel *lp48 ) { EqBand* filterModels = m_parameterWidget->getBandModels( index ); filterModels->active = active; @@ -80,10 +89,17 @@ private: filterModels->gain = gain; filterModels->peakL = peakL; filterModels->peakR = peakR; + filterModels->hp12 = hp12; + filterModels->hp24 = hp24; + filterModels->hp48 = hp48; + filterModels->lp12 = lp12; + filterModels->lp24 = lp24; + filterModels->lp48 = lp48; return filterModels; } int m_originalHeight; + }; diff --git a/plugins/Eq/EqCurve.cpp b/plugins/Eq/EqCurve.cpp new file mode 100644 index 000000000..54d9b82e7 --- /dev/null +++ b/plugins/Eq/EqCurve.cpp @@ -0,0 +1,818 @@ +/* + * EqCurve.cpp - declaration of EqCurve and EqHandle classes. + * + * Copyright (c) 2015 Steffen Baranowsky + * + * This file is part of LMMS - http://lmms.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#include "EqCurve.h" +#include "lmms_math.h" +#include "Effect.h" +#include "embed.h" + +EqHandle::EqHandle( int num, int x, int y ) +{ + PI = LD_PI; + m_numb = num; + setMouseHover( false ); + m_width = x; + m_heigth = y; + m_mousePressed = false; + m_active = false; + setFlag( ItemIsMovable ); + setFlag( ItemSendsGeometryChanges ); + setAcceptHoverEvents( true ); + float totalHeight = 36; + m_pixelsPerUnitHeight = ( m_heigth ) / ( totalHeight ); + m_handleMoved = false; + QObject::connect( this,SIGNAL( positionChanged() ) , this, SLOT( handleMoved() ) ); +} + + + + +QRectF EqHandle::boundingRect() const +{ + return QRectF( -11, -11, 23, 23 ); +} + + + + +void EqHandle::handleMoved() +{ + m_handleMoved = true; +} + + + + +void EqHandle::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget ) +{ + painter->setRenderHint( QPainter::Antialiasing, true) ; + if ( m_mousePressed ) + { + emit positionChanged(); + + } + + // graphics for the handles + QString fileName = "handle" + QString::number(m_numb+1); + if ( !isActiveHandle() ) { fileName = fileName + "inactive"; } + QPixmap circlePixmap = PLUGIN_NAME::getIconPixmap( fileName.toLatin1() ); + painter->drawPixmap( -12, -12, circlePixmap ); + + // on mouse hover draw an info box and change the pixmap of the handle + if ( isMouseHover() ) + { + // keeps the info box in view + float rectX = -40; + float rectY = -40; + if ( EqHandle::y() < 40 ) + { + rectY = rectY + 40 - EqHandle::y(); + } + if ( EqHandle::x() < 40 ) + { + rectX = rectX + 40 - EqHandle::x(); + } + if ( EqHandle::x() > m_width - 40 ) + { + rectX = rectX - (40 - (m_width - EqHandle::x() ) ); + } + + painter->drawPixmap( -12, -12, PLUGIN_NAME::getIconPixmap( "handlehover" ) ); + QRectF textRect = QRectF ( rectX, rectY, 80, 30 ); + QRectF textRect2 = QRectF ( rectX+1, rectY+1, 80, 30 ); + QString freq = QString::number( xPixelToFreq(EqHandle::x() )) ; + QString res; + if ( getType() < 3 || getType() > 3 ) + { + res = tr( "Reso: ") + QString::number( getResonance() ); + } + else + { + res = tr( "BW: " ) + QString::number( getResonance() ); + } + + painter->setPen( QColor( 255, 255, 255 ) ); + painter->drawRect( textRect ); + painter->fillRect( textRect, QBrush( QColor( 128, 128, 255 , 64 ) ) ); + + painter->setPen ( QColor( 0, 0, 0 ) ); + painter->drawText( textRect2, Qt::AlignCenter, + QString( tr( "Freq: " ) + freq + "\n" + res ) ); + painter->setPen( QColor( 255, 255, 255 ) ); + painter->drawText( textRect, Qt::AlignCenter, + QString( tr( "Freq: " ) + freq + "\n" + res ) ); + } +} + + + + +QPainterPath EqHandle::getCurvePath() +{ + QPainterPath path; + float y = m_heigth*0.5; + for ( float x=0 ; x < m_width; x++ ) + { + if ( m_type == 1 ) y = getLowCutCurve( x ); + if ( m_type == 2 ) y = getLowShelfCurve( x ); + if ( m_type == 3 ) y = getPeakCurve( x ); + if ( m_type == 4 ) y = getHighShelfCurve( x ); + if ( m_type == 5 ) y = getHighCutCurve( x ); + if ( x==0 ) path.moveTo( x, y ); // sets the begin of Path + path.lineTo( x, y ); + } + return path; +} + + + + + +float EqHandle::getPeakCurve(float x) +{ + double freqZ = xPixelToFreq( EqHandle::x() ); + const int SR = Engine::mixer()->processingSampleRate(); + double w0 = 2* PI * freqZ / SR ; + double c = cosf( w0 ); + double s = sinf( w0 ); + double Q = getResonance(); + double A = pow( 10, yPixelToGain(EqHandle::y()) / 40 ); + double alpha = s * sinh( log( 2 ) / 2 * Q * w0 / sinf( w0 ) ); + double a0, a1, a2, b0, b1, b2; // coeffs to calculate + + //calc coefficents + b0 = 1 + alpha*A; + b1 = -2*c; + b2 = 1 - alpha*A; + a0 = 1 + alpha/A; + a1 = -2*c; + a2 = 1 - alpha/A; + + //normalise + b0 /= a0; + b1 /= a0; + b2 /= a0; + a1 /= a0; + a2 /= a0; + a0 = 1; + + double w; + double PHI; + double gain; + double freq = xPixelToFreq( x ); + w = 2*PI * freq / SR; + PHI = pow( sin( w/2 ), 2 )*4; + gain = 10* log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1*(b0+b2 )+ 4*b0*b2 ) ) *PHI ) + - 10*log10( pow( 1+ a1+ a2 ,2 ) + ( 1* a2 * PHI - ( a1 * ( 1+ a2 ) +4 *1 * a2 ) ) *PHI ); + float y= gainToYPixel( gain ); + return y; +} + + + + +float EqHandle::getHighShelfCurve( float x ) +{ + double freqZ = xPixelToFreq( EqHandle::x() ); + const int SR = Engine::mixer()->processingSampleRate(); + double w0 = 2 * PI * freqZ / SR; + double c = cosf( w0 ); + double s = sinf( w0 ); + double A = pow( 10, yPixelToGain( EqHandle::y() ) * 0.025 ); + double beta = sqrt( A ) / m_resonance; + double a0, a1, a2, b0, b1, b2; // coeffs to calculate + + //calc coefficents + b0 = A *( ( A +1 ) + ( A - 1 ) * c + beta * s); + b1 = -2 * A * ( ( A - 1 ) + ( A + 1 ) * c ); + b2 = A * ( ( A + 1 ) + ( A - 1 ) * c - beta * s); + a0 = ( A + 1 ) - ( A - 1 ) * c + beta * s; + a1 = 2 * ( ( A - 1 ) - ( A + 1 ) * c ); + a2 = ( A + 1) - ( A - 1 ) * c - beta * s; + //normalise + b0 /= a0; + b1 /= a0; + b2 /= a0; + a1 /= a0; + a2 /= a0; + a0 = 1; + + double w; + double PHI; + double gain; + double freq = xPixelToFreq( x ); + w = 2* PI * freq / SR ; + PHI = pow(sin( w/2 ), 2 ) * 4; + gain = 10* log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1*( b0+b2 )+ 4*b0*b2 ) ) *PHI ) + - 10*log10( pow(1+ a1+ a2 ,2 ) + ( 1* a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2) ) *PHI ); + float y= gainToYPixel( gain ); + return y; +} + + + + +float EqHandle::getLowShelfCurve( float x ) +{ + double freqZ = xPixelToFreq( EqHandle::x() ); + const int SR = Engine::mixer()->processingSampleRate(); + double w0 = 2 * PI * freqZ / SR ; + double c = cosf( w0 ); + double s = sinf( w0 ); + double A = pow( 10, yPixelToGain( EqHandle::y() ) / 40 ); + double beta = sqrt( A ) / m_resonance; + double a0, a1, a2, b0, b1, b2; // coeffs to calculate + + //calc coefficents + b0 = A * ( ( A+1 ) - ( A-1 ) * c + beta * s ); + b1 = 2 * A * ( ( A - 1 ) - ( A + 1 ) * c) ; + b2 = A * ( ( A + 1 ) - ( A - 1 ) * c - beta * s); + a0 = ( A + 1 ) + ( A - 1 ) * c + beta * s; + a1 = -2 * ( ( A - 1 ) + ( A + 1 ) * c ); + a2 = ( A + 1 ) + ( A - 1) * c - beta * s; + + //normalise + b0 /= a0; + b1 /= a0; + b2 /= a0; + a1 /= a0; + a2 /= a0; + a0 = 1; + + double w; + double PHI; + double gain; + double freq = xPixelToFreq( x ); + w = 2* PI * freq / SR ; + PHI = pow( sin( w/2 ), 2 ) * 4; + gain = 10 * log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1 * ( b0+b2 ) + 4 * b0 * b2 ) ) *PHI ) + - 10 * log10( pow( 1 + a1 + a2, 2 ) + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI ); + float y= gainToYPixel( gain ); + return y; +} + + + + +float EqHandle::getLowCutCurve( float x ) +{ + double freqZ = xPixelToFreq( EqHandle::x() ); + const int SR = Engine::mixer()->processingSampleRate(); + double w0 = 2 * PI * freqZ / SR ; + double c = cosf( w0 ); + double s = sinf( w0 ); + double resonance = getResonance(); + double A = pow( 10, yPixelToGain( EqHandle::y() ) / 20); + double alpha = s / 2 * sqrt ( ( A +1/A ) * ( 1 / resonance -1 ) +2 ); + double a0, a1, a2, b0, b1, b2; // coeffs to calculate + + b0 = ( 1 + c ) * 0.5; + b1 = ( -( 1 + c ) ); + b2 = ( 1 + c ) * 0.5; + a0 = 1 + alpha; + a1 = ( -2 * c ); + a2 = 1 - alpha; + //normalise + b0 /= a0; + b1 /= a0; + b2 /= a0; + a1 /= a0; + a2 /= a0; + a0 = 1; + + double w; + double PHI; + double gain; + double freq = xPixelToFreq( x ); + w = 2 * PI * freq / SR ; + PHI = pow( sin( w/2), 2 ) * 4; + gain = 10 * log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1 * ( b0 + b2 ) + 4 * b0 * b2 ) ) * PHI ) + - 10 * log10( pow( 1 + a1 + a2, 2 ) + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI ); + + if ( m_hp24 ) + { + gain = gain + 10 * log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1 * ( b0 + b2 ) + 4 * b0 * b2 ) ) * PHI ) + - 10 * log10( pow( 1 + a1 + a2, 2 ) + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI ); + + } + + if ( m_hp48 ) + { + gain = gain + 10 * log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1 * ( b0 + b2 ) + 4 * b0 * b2 ) ) * PHI ) + - 10 * log10( pow( 1 + a1 + a2, 2 ) + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI ); + + gain = gain + ( 10 * log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1 * ( b0 + b2 ) + 4 * b0 * b2 ) ) * PHI ) + - 10 * log10( pow( 1 + a1 + a2, 2 ) + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI )); + + } + + float y= gainToYPixel( gain ); + return y; +} + + + + +float EqHandle::getHighCutCurve( float x ) +{ + double freqZ = xPixelToFreq( EqHandle::x() ); + const int SR = Engine::mixer()->processingSampleRate(); + double w0 = 2 * PI * freqZ / SR ; + double c = cosf( w0 ); + double s = sinf( w0 ); + double resonance = getResonance(); + double A = pow( 10, yPixelToGain(EqHandle::y() ) / 20 ); + double alpha = s / 2 * sqrt ( ( A + 1 / A ) * ( 1 / resonance -1 ) +2 ); + double a0, a1, a2, b0, b1, b2; // coeffs to calculate + + + b0 = ( 1 - c ) * 0.5; + b1 = 1 - c; + b2 = ( 1 - c ) * 0.5; + a0 = 1 + alpha; + a1 = -2 * c; + a2 = 1 - alpha; + + //normalise + b0 /= a0; + b1 /= a0; + b2 /= a0; + a1 /= a0; + a2 /= a0; + a0 = 1; + + double w; + double PHI; + double gain; + double freq = xPixelToFreq( x ); + w = 2 * PI * freq / SR ; + PHI = pow(sin( w/2),2 )*4; + + gain = 10 * log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1 * ( b0 + b2 ) + 4 * b0 * b2 ) ) * PHI ) + - 10 * log10( pow( 1 + a1 + a2, 2 ) + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI ); + + if ( m_lp24 ) + { + gain = gain + ( 10 * log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1 * ( b0 + b2 ) + 4 * b0 * b2 ) ) * PHI ) + - 10 * log10( pow( 1 + a1 + a2, 2 ) + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI ) ); + + } + + if ( m_lp48 ) + { + gain = gain + ( 10 * log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1 * ( b0 + b2 ) + 4 * b0 * b2 ) ) * PHI ) + - 10 * log10( pow( 1 + a1 + a2, 2 ) + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI ) ); + + gain = gain + ( 10 * log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1 * ( b0 + b2 ) + 4 * b0 * b2 ) ) * PHI ) + - 10 * log10( pow( 1 + a1 + a2, 2 ) + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI ) ); + } + + + float y= gainToYPixel( gain ); + return y; +} + + + + + +float EqHandle::getResonance() +{ + return m_resonance; +} + + + + +int EqHandle::getNum() +{ + return m_numb; +} + + + + +void EqHandle::setType(int t) +{ + EqHandle::m_type = t; +} + + + + +void EqHandle::setResonance(float r) +{ + EqHandle::m_resonance = r; +} + + + + +bool EqHandle::isMouseHover() +{ + return m_mouseHover; +} + + + + +void EqHandle::setMouseHover(bool d) +{ + m_mouseHover = d; +} + + + + +int EqHandle::getType() +{ + return m_type; +} + + + + +bool EqHandle::isActiveHandle() +{ + return m_active; +} + + + + +void EqHandle::setHandleActive( bool a ) +{ + EqHandle::m_active = a; +} + + + + +void EqHandle::setHandleMoved( bool a ) +{ + m_handleMoved = a; +} + + + + +bool EqHandle::getHandleMoved() +{ + return m_handleMoved; +} + + + + +void EqHandle::sethp12() +{ + m_hp12 = true; + m_hp24 = false; + m_hp48 = false; +} + + + + +void EqHandle::sethp24() +{ + m_hp12 = false; + m_hp24 = true; + m_hp48 = false; +} + + + + +void EqHandle::sethp48() +{ + m_hp12 = false; + m_hp24 = false; + m_hp48 = true; +} + + + + +void EqHandle::setlp12() +{ + m_lp12 = true; + m_lp24 = false; + m_lp48 = false; +} + + + + +void EqHandle::setlp24() +{ + m_lp12 = false; + m_lp24 = true; + m_lp48 = false; +} + + + + +void EqHandle::setlp48() +{ + m_lp12 = false; + m_lp24 = false; + m_lp48 = true; +} + + + + +void EqHandle::mousePressEvent( QGraphicsSceneMouseEvent *event ) +{ + m_mousePressed = true; + QGraphicsItem::mousePressEvent( event ); +} + + + + +void EqHandle::mouseReleaseEvent( QGraphicsSceneMouseEvent *event ) +{ + m_mousePressed = false; + QGraphicsItem::mouseReleaseEvent( event ); +} + + + + +void EqHandle::wheelEvent( QGraphicsSceneWheelEvent *wevent ) +{ + float highestBandwich; + if ( m_type < 3 || m_type > 3 ) + { + highestBandwich = 10; + } + else + { + highestBandwich = 4; + } + + int numDegrees = wevent->delta() / 120; + float numSteps = 0; + if ( wevent->modifiers() == Qt::ControlModifier ) + { + numSteps = numDegrees * 0.01; + } + else + { + numSteps = numDegrees * 0.15; + } + + if ( wevent->orientation() == Qt::Vertical ) + { + m_resonance = m_resonance + ( numSteps ); + + if ( m_resonance < 0.1 ) + { + m_resonance = 0.1; + } + + if ( m_resonance > highestBandwich ) + { + m_resonance = highestBandwich; + } + emit positionChanged(); + } + wevent->accept(); +} + + + + +void EqHandle::hoverEnterEvent( QGraphicsSceneHoverEvent *hevent ) +{ + setMouseHover( true ); +} + + + + +void EqHandle::hoverLeaveEvent( QGraphicsSceneHoverEvent *hevent ) +{ + setMouseHover( false ); +} + + + + +QVariant EqHandle::itemChange( QGraphicsItem::GraphicsItemChange change, const QVariant &value ) +{ + if ( change == ItemPositionChange ) + { + // pass filter don't move in y direction + if ( EqHandle::m_type == 1 || EqHandle::m_type == 5 ) + { + float newX = value.toPointF().x(); + if ( newX < 0 ) + { + newX = 0; + } + if ( newX > m_width ) + { + newX = m_width; + } + return QPointF(newX, m_heigth/2); + } + } + + QPointF newPos = value.toPointF(); + QRectF rect = QRectF( 0, 0, m_width, m_heigth ); + if ( !rect.contains( newPos ) ) + { + // Keep the item inside the scene rect. + newPos.setX( qMin( rect.right(), qMax( newPos.x(), rect.left() ) ) ); + newPos.setY( qMin( rect.bottom(), qMax( newPos.y(), rect.top() ) ) ); + return newPos; + } + return QGraphicsItem::itemChange( change, value ); +} + + + + +// ---------------------------------------------------------------------- +// +// Class EqCurve +// +// Every Handle calculates its own curve. +// But EqCurve generates an average curve. +// +// ---------------------------------------------------------------------- + +EqCurve::EqCurve( QList *handle, int x, int y ) +{ + m_width = x; + m_heigth = y; + m_handle = handle; + m_alpha = 0; +} + + + + +QRectF EqCurve::boundingRect() const +{ + return QRect( 0, 0, m_width, m_heigth ); +} + + + + +void EqCurve::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget ) +{ + painter->setRenderHint( QPainter::Antialiasing, true ); + + //Computes the main curve + //if a band is active the curve will be computed by averaging the curves of each band + QMap mainCurve; + for ( int x = 0; x < m_width ; x++ ) + { + mainCurve[x] = 0; + } + int activeHandles=0; + for ( int thatHandle = 0; thatHandlecount(); thatHandle++ ) + { + if ( m_handle->at(thatHandle)->isActiveHandle() == true ) + { + activeHandles++; + } + } + for ( int thatHandle = 0; thatHandlecount(); thatHandle++ ) + { + if ( m_handle->at(thatHandle)->isActiveHandle() == true ) + { + for ( int x = 0; x < m_width ; x=x+1 ) + { + if ( m_handle->at( thatHandle )->getType() == 1 ) + { + mainCurve[x]= ( mainCurve[x] + ( m_handle->at( thatHandle )->getLowCutCurve( x ) * ( activeHandles ) ) - ( ( activeHandles * ( m_heigth/2 ) ) - m_heigth ) ); + } + if ( m_handle->at(thatHandle)->getType() == 2 ) + { + mainCurve[x]= ( mainCurve[x] + ( m_handle->at( thatHandle )->getLowShelfCurve( x ) * ( activeHandles ) ) - ( ( activeHandles * ( m_heigth/2 ) ) - m_heigth ) ); + } + if ( m_handle->at( thatHandle )->getType() == 3 ) + { + mainCurve[x]= ( mainCurve[x] + ( m_handle->at( thatHandle )->getPeakCurve( x ) * ( activeHandles ) ) - ( ( activeHandles * ( m_heigth/2 ) ) - m_heigth ) ); + } + if ( m_handle->at( thatHandle )->getType() == 4 ) + { + mainCurve[x]= ( mainCurve[x] + ( m_handle->at( thatHandle )->getHighShelfCurve( x ) * ( activeHandles ) ) - ( ( activeHandles * ( m_heigth/2 ) ) - m_heigth ) ); + } + if ( m_handle->at(thatHandle)->getType() == 5 ) + { + mainCurve[x]= ( mainCurve[x] + ( m_handle->at( thatHandle )->getHighCutCurve( x ) * ( activeHandles ) ) - ( ( activeHandles * ( m_heigth/2 ) ) - m_heigth ) ); + } + } + } + } + + QPainterPath mCurve; + //compute a QPainterPath + for ( int x = 0; x < m_width ; x++ ) + { + mainCurve[x] = ( ( mainCurve[x] / activeHandles ) ) - ( m_heigth/2 ); + if ( x==0 ) + { + mCurve.moveTo( x, mainCurve[x] ); + } + mCurve.lineTo( x, mainCurve[x] ); + } + //and paint it with Pathstroker + QPainterPathStroker stroke; + QPainterPath strokeP; + stroke.setWidth( 2 ); + strokeP = stroke.createStroke( mCurve ); + painter->fillPath( strokeP, QBrush( Qt::white ) ); + + // if mouse hover a handle, m_alpha counts up slow for blend in the filled EQ curve + // todo: a smarter way of this "if-monster" + QColor curveColor; + if ( m_handle->at( 0 )->isMouseHover() + || m_handle->at( 1 )->isMouseHover() + || m_handle->at( 2 )->isMouseHover() + || m_handle->at( 3 )->isMouseHover() + || m_handle->at( 4 )->isMouseHover() + || m_handle->at( 5 )->isMouseHover() + || m_handle->at( 6 )->isMouseHover() + || m_handle->at( 7 )->isMouseHover() + ) + { + if ( m_alpha < 40 ) + m_alpha = m_alpha + 10; + } + else + { + if ( m_alpha > 0 ) + m_alpha = m_alpha - 10; + } + + //draw on mouse hover the curve of hovered filter + for ( int i = 0; i < m_handle->count(); i++ ) + { + if ( m_handle->at(i)->isMouseHover() ) + { + switch ( i+1 ) + { + case 1: curveColor = QColor( 163, 23, 23, 10*m_alpha/4 );break; + case 2: curveColor = QColor( 229,108,0, 10*m_alpha/4 );break; + case 3: curveColor = QColor( 255,240,0, 10*m_alpha/4 );break; + case 4: curveColor = QColor( 12, 255, 0, 10*m_alpha/4 );break; + case 5: curveColor = QColor( 0, 252, 255, 10*m_alpha/4 );break; + case 6: curveColor = QColor( 59, 96, 235, 10*m_alpha/4 );break; + case 7: curveColor = QColor( 112, 73, 255, 10*m_alpha/4 );break; + case 8: curveColor = QColor( 255, 71, 227, 10*m_alpha/4 ); + } + QPen pen ( curveColor); + pen.setWidth( 2 ); + painter->setPen( pen ); + painter->drawPath( m_handle->at( i )->getCurvePath() ); + } + } + // draw on mouse hover the EQ curve filled. with m_alpha it blends in and out smooth + QPainterPath cPath; + cPath.addPath( mCurve ); + cPath.lineTo( cPath.currentPosition().x(), m_heigth ); + cPath.lineTo( cPath.elementAt( 0 ).x , m_heigth ); + painter->fillPath( cPath, QBrush ( QColor( 255,255,255, m_alpha ) ) ); + +} diff --git a/plugins/Eq/EqCurve.h b/plugins/Eq/EqCurve.h new file mode 100644 index 000000000..65d9aa81e --- /dev/null +++ b/plugins/Eq/EqCurve.h @@ -0,0 +1,209 @@ +/* + * EqCurve.h - defination of EqCurve and EqHandle classes. + * +* Copyright (c) 2015 Steffen Baranowsky + * + * This file is part of LMMS - http://lmms.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#ifndef EQCURVE_H +#define EQCURVE_H + +#include +#include +#include +#include "lmms_math.h" + + +enum{ + highpass=1, + lowshelf, + para, + highshelf, + lowpass +}; + + + + + +// implements the Eq_Handle to control a band +class EqHandle : public QGraphicsObject +{ + Q_OBJECT +public: + EqHandle( int num, int x, int y ); + void paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget ); + QPainterPath getCurvePath(); + float getPeakCurve( float x ); + float getHighShelfCurve( float x ); + float getLowShelfCurve( float x ); + float getLowCutCurve( float x ); + float getHighCutCurve( float x ); + float getResonance(); + int getNum(); + int getType(); + void setType( int t ); + void setResonance( float r ); + bool isMouseHover(); + void setMouseHover( bool d ); + bool isActiveHandle(); + void setHandleActive( bool a ); + void setHandleMoved(bool a); + bool getHandleMoved(); + void sethp12(); + void sethp24(); + void sethp48(); + void setlp12(); + void setlp24(); + void setlp48(); +private: + long double PI; + float m_pixelsPerUnitWidth; + float m_pixelsPerUnitHeight; + float m_scale; + bool m_hp12; + bool m_hp24; + bool m_hp48; + bool m_lp12; + bool m_lp24; + bool m_lp48; + bool m_mouseHover; + bool m_active; + int m_type, m_numb; + float m_resonance; + float m_width, m_heigth; + bool m_mousePressed; + bool m_handleMoved; + QRectF boundingRect() const; + + + + + inline float freqToXPixel( float freq ) + { + float min = log ( 27) / log( 10 ); + float max = log ( 20000 )/ log( 10 ); + float range = max - min; + return ( log( freq ) / log( 10 ) - min ) / range * m_width; + } + + + + + inline float xPixelToFreq( float x ) + { + float min = log ( 27) / log( 10 ); + float max = log ( 20000 ) / log( 10 ); + float range = max - min; + return pow( 10 , x * ( range / m_width ) + min ); + } + + + + + inline float gainToYPixel( float gain ) + { + return ( m_heigth ) - ( gain * m_pixelsPerUnitHeight ) - ( ( m_heigth ) * 0.5 ); + } + + + + + inline float yPixelToGain( float y ) + { + return ( ( 0.5 * m_heigth ) - y ) / m_pixelsPerUnitHeight; + } + + + + +signals: + void positionChanged(); +private slots: + void handleMoved(); + + +protected: + void mousePressEvent( QGraphicsSceneMouseEvent *event ); + void mouseReleaseEvent( QGraphicsSceneMouseEvent *event ); + void wheelEvent( QGraphicsSceneWheelEvent *wevent ); + void hoverEnterEvent( QGraphicsSceneHoverEvent *hevent ); + void hoverLeaveEvent( QGraphicsSceneHoverEvent *hevent ); + QVariant itemChange( GraphicsItemChange change, const QVariant &value ); +}; + + + +class EqCurve : public QGraphicsObject +{ + Q_OBJECT +public: + EqCurve( QList *handle, int x, int y ); + QList *m_handle; + QRectF boundingRect() const; + void paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget ); +private: + int m_width, m_heigth; + int m_alpha; + + float m_pixelsPerUnitHeight; + float m_scale; + + + + + inline float freqToXPixel( float freq ) + { + float min = log ( 27) / log( 10 ); + float max = log ( 20000 ) / log( 10 ); + float range = max - min; + return ( log( freq ) / log( 10 ) - min ) / range * m_width; + } + + + + + inline float xPixelToFreq( float x ) + { + float min = log ( 27) / log( 10 ); + float max = log ( 20000 ) / log( 10 ); + float range = max - min; + return pow( 10 , x * ( range / m_width ) + min ); + } + + + + + inline float gainToYPixel( float gain ) + { + return ( m_heigth ) - ( gain * m_pixelsPerUnitHeight ) - ( ( m_heigth ) * 0.5 ); + } + + + + + inline float yPixelToGain( float y ) + { + return ( ( 0.5 * m_heigth ) - y ) / m_pixelsPerUnitHeight; + } + +}; + +#endif // EQCURVE_H diff --git a/plugins/Eq/EqEffect.cpp b/plugins/Eq/EqEffect.cpp index 01830ce10..2abfc0711 100644 --- a/plugins/Eq/EqEffect.cpp +++ b/plugins/Eq/EqEffect.cpp @@ -188,7 +188,7 @@ bool EqEffect::processAudioBuffer(sampleFrame *buf, const fpp_t frames) const int sampleRate = Engine::mixer()->processingSampleRate(); sampleFrame m_inPeak = { 0, 0 }; - if(m_eqControls.m_analyseIn ) + if(m_eqControls.m_analyseInModel.value( true ) ) { m_eqControls.m_inFftBands.analyze( buf, frames ); } @@ -326,7 +326,7 @@ bool EqEffect::processAudioBuffer(sampleFrame *buf, const fpp_t frames) m_eqControls.m_outPeakR = m_eqControls.m_outPeakR < outPeak[1] ? outPeak[1] : m_eqControls.m_outPeakR; checkGate( outSum / frames ); - if(m_eqControls.m_analyseOut ) + if(m_eqControls.m_analyseOutModel.value( true ) ) { m_eqControls.m_outFftBands.analyze( buf, frames ); setBandPeaks( &m_eqControls.m_outFftBands , ( int )( sampleRate * 0.5 ) ); diff --git a/plugins/Eq/EqFader.h b/plugins/Eq/EqFader.h index 0e1ae986a..05d411f3a 100644 --- a/plugins/Eq/EqFader.h +++ b/plugins/Eq/EqFader.h @@ -27,9 +27,9 @@ #include "EffectControls.h" #include "MainWindow.h" #include "GuiApplication.h" -#include "qwidget.h" #include "TextFloat.h" -#include "qlist.h" +#include +#include @@ -39,8 +39,8 @@ class EqFader : public Fader public: Q_OBJECT public: - EqFader( FloatModel * model, const QString & name, QWidget * parent, float* lPeak, float* rPeak ) : - Fader( model, name, parent) + EqFader( FloatModel * model, const QString & name, QWidget * parent, QPixmap * back, QPixmap * leds, QPixmap * knob, float* lPeak, float* rPeak ) : + Fader( model, name, parent, back, leds, knob ) { setMinimumSize( 23, 116 ); setMaximumSize( 23, 116 ); @@ -53,6 +53,19 @@ public: setPeak_R( 0 ); } + EqFader( FloatModel * model, const QString & name, QWidget * parent, float* lPeak, float* rPeak ) : + Fader( model, name, parent ) + { + setMinimumSize( 23, 116 ); + setMaximumSize( 23, 116 ); + resize( 23, 116 ); + m_lPeak = lPeak; + m_rPeak = rPeak; + connect( gui->mainWindow(), SIGNAL( periodicUpdate() ), this, SLOT( updateVuMeters() ) ); + m_model = model; + setPeak_L( 0 ); + setPeak_R( 0 ); + } diff --git a/plugins/Eq/EqLayout1BG.png b/plugins/Eq/EqLayout1BG.png new file mode 100644 index 0000000000000000000000000000000000000000..482fcf116477cf4fb1ff6856e93d4508a33e074c GIT binary patch literal 52487 zcmZ^~2Q-`E`~Oc{Ri&j=sa<>2R(qD#rqtf0Mr}1BiPh?`)t*6%s$IK8Xw_(pP%BoV zwPFWBZ2w0;pYQ*i@9+G6$H|fNJWs-N-}iH0*Y$e8ujnTRnm4X9T_+(SxuLD4VN60o zdI-FBuU!R>DD#`h1HZ01>S}6`oL~GDAWBkzBNV<`mi{Cplyny_Qj+XkM&KZMfVTc4 z@;{_kZt!s0PToiZ4&4oSWD%h5O-r=C5utkdSbY zXltmM1W&Caz`oDXp|i(IO&QbB%WhKptaT0%SDE_yeZPr*s^s$^eCkY?;}@~6bw*4K z1{ot`h47|wrqOGr2t`r9+e%(RESlS&a1%S6Lg^Z@pR{6%zD1XFZ*o40U7(7%It0xp z_Fzzu;~*zh$6wGgm!WUC8UI1sAzT;=Pdq;RrE)IQZg4C8>l>c?&nR>)umN4yMAa-h zX#XAg%gz4(pXtz6{&&T{Qz;?;bICIbzQh0da0jiy&c&Df_mW_W|9;K?y5=QW+H%fc z?keRbHZ1bLpPXH+g0fTb9nRZ?ZJeK=|2}0(ce1<|wUV8nvqp^+Bz&lAXqObR%SZ#6#Qtqo>rY zI$6>r#jH=(%t=_G%pVL&)RR><7jvjrW;-%MD zt?8!5#;tgtkogG}p(ZRusO_Ljlx;;Edzwf5BdSbnR^QuhBO<8tPuE?cSo|qITt%6X zHF(AS_!V^sN&ES6JAQhpB>bpkd&Mx^%KH2xb?CMHgHFEGK=!k(_uDmzp?a3Yq{NUb z?5E3`iF7ib_va0rrj@n zB1w8ozyH3Tn=9?sTVS7ia8JVxh4xcRw-0tDh66wDeJ|EcYs?aQ(_$sFgHyBSF@x(X!>6c(| zbk(KhZ|6VM{8t?mor%v>jPc|n28@q@VL?A!3kaCP%6hZ4 zjfsJ)%V%l@)wu?U1Ow-4Xnq6Jlmh&0Z+d#Q#r?)cY{tR{xoN#!=ms#g8zZ`3REQl( zY=wa?WMh2oq2DwY`vv#e!4O{ZX_W38HS=sqhhZhQZ6}sQQ+U>7GZNiH33a z5RDxp@PPJf{xRdO{_dA12Lk_EMbFpkI0jvxB)Ar@k+|3_%}~{%b8*WUYa6i-7Mbd2 z?>x9W$Vrp=7(TSG$S1VH{0;7-oc=7W9T$N9veoQ*KUHu>+GyfaPbsE@e5UaVm-gPL zglO&DL$)Ke+rU{`ZDUs|%_7;+pU+WeVc&6xS150uq1i`JS515S%8#Kd$=PqHZw^5= zKDEa9`bLbGSKE{J}rt3(W3 zsgCP~L6Ut^$G`d?18>e1SdrCE$BiErerhXoAAVS{r%uLS{i~DAM|$kMzUIQhoo0d; zHHt+HNIiQ#Yz1)*mjND(=G@QebPIfgH9M?O{jwO&6?|!YNa0yTGcz#YbA?=5d2&2MaMfK6wS|6Z ze@Cj7mjW~h|DgR9isysgZY!{jpSdu#{SLXMA0OBq{KKwJdWecq-n=@JV8I;II#8@K{b*5}pZ9~Bwes#|^Pr)(S z{?XpH4{KRs_e+XnYNg@hFd>gGGep&`M$qiq^yjwPcfIJ%akOZ)BTmTvX-de88`JX1 z_SQWHT01~6O9p0GGl*S_THiLA`XL@78cdt`s>t}Ee|R;R>)8|=!Cl@3w7T>Fp9G;z z`a!y}8sQ4c&^CPmntAFyFQ$M*9b%Oy|a3fW0G@s+x=_6JnmRW@aIi;@Pe#*-XRbCwpO|j^H z>mS+|dkE$M3!=`+AeUxilZ2G)nwq=ck6QS2V8x;m*zwk3PF03EkDC~zgeu8j8XS!k zAYV>>p=%lhZRJt@w`738A)lJExW8Mc35i>JNkN{d1pcKw{+0Mg=9uGfla0Vqd^|B-Deb&I<5%LtE)Rze z^laLR`aI*?t)k`w)~0%Ldj&dWcMPt-6D<--D;y8yW^Z!BUakk}4ZB==EL~m?nPWHG7lOL@C7`f{z|BO@m{F3B=+QG;b=f34Y<*V+e_A(Nt7 z)81YutH+fJW+@@n^W0(n%0~O_Nk@FEV5^1`&kQZ@*I#bYWxq(Dg;B^bsokf28kPNv zE`Xc%(S0U!1IW6N8aLA;MJ62I-OtaYXw?=5{p2sov2S3d2Ed0$#TT|rX$QQGr zvE@vc>i5mQi^sjo^&{&&ck#U7evRIKvD&Y53kIo9oG}z*X{>kbwC2R=R-T)&sc_Nt z8I;T@HRSL(X)h#$&F9kdqsSylB;OQeb*MsU;%?RoRrj$|Yh}Hla(+i*&^`X=NS9}X z|M~TkK*yWe(v=XM3GmbrPnwn!zk;V1&PD%qeU{oi>no~i{Hiczfx2AmO0eYDuRELG zzASkDhPAO2slfETNn~zXYr~=^uogOWN=C*-Er%0)LJJmu|L+hlOF!#Z=CY$2-v4H; zePACSl4SJAzYHA6(YaYdA3_#ElG^xtUFu^j*fj^_Mm`XvzJ2HCIrgKMl$HM3qsU5p z{cktvG=mM+sfP&5`L<<>2!oQhkn-+$TLm*#=Q6i!4{SUZE;QaCug@ZN^LF`l+oSzr zkeLd*TO-p%^@iHoUxTQVPd&CWuOa0LI+dTA4crZbBMPRzJcG9gx1VSw7QeD8f2Vsq zjostiDO0O#OhoUCmKEM5VHu_N^*evCok((9wZSg}Em+;_Vc1y;C98F0U5v_wH8nJX ze%pzjq8{A*8vaK#+BZ4;XZwkIP6+yFh?l+KTsd_$6;H3!*$N%>m3*?UFof~IdV!v( zAJ08H?W-~Dhoknflhc}nMLhelYcUY08}N#uMLll00(-?~J$p5^OtM&*@W3#WAZV81 zix;B)oh|zy_`7|>O%nHV=SmEsv9WZopt>@javq2nXA<}4-$@@Yz+9BRVJvoJ}ioq z;ND;z&CRQy$8@dnjllOlOdSsxa6$Lv22OEl1X@DfFZ=NLqZ!sQ`5sEUI{p;nNz6vm z)Iv1b;N~W6UEw>K#8=kdUpLlD5;{J7&y5;9<{z%^PRSeKanj{{h9#myDrDmp zO6erh-5s%ALGBRTaa3X=r>zLZu80UV%_Q&Omt!6m-Xx`_Qt;Ak_Xuw@S?PTYAsIJE z^N!{(<2S zIqdeXFircP2l(HLEh7q=n?pX7|Jln`9&_76=e3oe^dDpGd~jw2bQVs#?Xzjw{8S*4 z5iK{=(+b)LqVPUaNy-j#c%9?W*`$3B#-;RlUN77|(1yLQ{L2h99DkhF($nUj8g`66 zF~4edQr9&Wy1u!$S2xkN5p)CT^I~l4qBgvTe9t|oZe+-9c*%sq3h!cLTt=ybw^5-` zSh7{evwaYU5UWtF+1N?;B)#iNAMcTVUkr^4n5t_Q5{XXQ0|v@J?l~~5i8}i`Zpt1h zA=JADqqucfuJi*XAazved>ms}MeNhUv*;TdaManomXBrKwqNwEZEtSIK7#Nm3$ds= z1_9ZNi0@s(fhP$2EhU!FXvNwN6O-RTc7bENqcuk=3T%eQ3;3x1D!{l6?^^|d$fDud zL_PkT-NyUL;P*SDi6VaZ3e7gR5}e*nhu_04_(e<%k4*}x6A&09D+XxKlOWew!VAnjc}I*tuOJMHKr7x` z-Dt@qe*3Uy%V21jx*8w|$-p~>xC5!m15hD%h{nka7LN3c)|53RRjB53z8W#042S;hFts>o zrna1zc{VpDAQo_T|4!IZiB0xrR`iF2AC))yL;vvE8kfYO71z{6yQ&rH4YPtFPkh30 z4_fE7#wAn)@+0lmbBqNKsNbZV)QEbqyRTAF9gUN7mi!<2KpN^hi5006@_04;OT_0y z8Hhv7{o7B@?R$LE zhIwZT9c>Fj@NW)S`c#%MV)J6dDKo5C0T>ZAb zfBvL*0`)XO2}5QrcUS$j7uP!V^-M~CGZv*l@Jwah?Y*ic!^x|-gLSDLwB6$CX6zm6 zgDI@suZ-yYSn{Dstbpmn{7>0Kp-=yA_M^Vt2;Xt@?{!OmyJpTO9#;~;AR-0h@y!5Y zHfXSL~?OFU7mIL>*tTtthS(z21D|^!g2T ztb0Dm_uL${{p@n7-J3r^-`Da-vO(tJUv{!|VK&c4SJ&rd_ub}#(W1eAJDbzhu5f8g z+GXETd(vRG-I)6?m)5CXn&-by6~&_c^BVFgxlwWYMa1P9s z(#N7{MjCb4gY?NAt6~`)-(%Zt*trvQY*D&gqPSDA zC^TG(_S^b3&w|8CocI%87B0d zl0@AQYXrF*{Qg0jSvPXFD`LkS-9e9C%Jxs&d|)Ir?x#$8MXX0NNkkY_4Ehw6&7qNI zX~<^p=+bLe{xrAzH%5i@YrvvE+BV{LrCJm(^j`Uc@JL~6zTLs3DrcX;*_V;}__?y= zF~Pt5Sfli8gt8uA3hbdMHW%i%v59KC`6{Pw~1gK751BGU*9#RTT?ozsK8^NoxTR+iW6hTZ~c>q!kHOW_KV{Lp%HbZyy0t00`&NY)>&tsPxrTdZ?brX_L3?ETcauLw64Mhy{ic~1Jc&_s68xf0exg# zK7YiYRs%3P1is0*dw-U!Z_^AY$V+1N+g1xz@S|%IlVjse^+Cj`Bg=JcD1HrsSJ;!k z$p(GR1ui)u7=~U72QbuS(V2bvR(hQa#KkU*OzHb}nY5sn7^VerJ&uyiCS;#%7wP7K z(Dg7KP6^rN>BmJzLQXSZIp5jK3pAixQ?*gNfd&l;B|nx`v2}3DP8QaF$wts)9v?TF zrJ4G7Sn7`!CERvod%E0JJDz+%GJ6lvGOU6q_x$@B*ZOG3dPr!dbQ$IgAw<8G>&w%p z8ptR4yGzM(v{b)Dzl#za_sb)sZtWVf!jD+4dbcLvBWn;j{v&zh2nT55puuzyDE+H& zwoD0M62e_K^X*$|`Dr-wJZfCcX^@!Uk#zDx^+S3XUgcC^9W?cA9t)lM6)OX+_y_dt z!Q8XzZA82CkQar&;Y+P$`2aQ5&45gmTo94+>Z=~sa$9@ZI4z8(Yg?$X7pO_g&I{@z zDqMKBo~F9PgSrX5U0h@Qcrnk1r7F?5S@h92Z!5x#_@#w_>hz|sr}T)n&~{+-yDd%H z&f?K~SZnTcZp|I@b{r-%C%dElT=SgKr*MhpJRn*MhM&~WHk|Jfa6;&dOSgoNe;aXg1~ zO>86RlE(Y1&rpLB8Bbo#Y1AYSb0Pe3KfNM(MPRco260@rc1Cn6BsA*5aVEW?G4d{o zOZ`-}45$}VWy`iEs@!(z(qzs4I?*D264Hk`J~Yc1qte2e2ReB+o!^CJE`2hGGnW`t z`px(XYtF4t*E)mRtqOdg^bV+6c=_(q{7A~UJ2{$fasU16Ii6`aP-!-t_Jl3Dia~d{ z-<5pc5v2_iL2+Nx^p{8( zW70qf&#JwjPf*RR>a1#lNdROSqD?bxm8r_sFcz)ROmjq6iXG5KyRi0rq# zdbtAi_~(cm-*?q#jKzAFK6y8TvfnA}htxzh=+R!e>VK%g3V!_~$*97WZu46wft7{1 z=P~ahvQQFd%Ec>)K-+ zZaebuwtqWj;Fv#h^Q*HKid;2uTRin5L} zGt<`&H#^nZ%PJn=0#_?}S?$IWYs;_p*Q|%0A0?ji=Pp#g0TiCrt#9&6el9LoMHSCa z{?Ca>cxq{5(T4XudC}!Lp_790SI?KM6D^#Q1MXG-mlrR$*ZFH6>AohL&u*x06Galpnn6A8!dz#O`kjZ&P~I zGx6came6hRp<+AW&&0o5qBgxh@8$yH-cu~XB_+=FThcj(|LuI z+4xP^8e$D#Q~%3EhcPDf(DVu} zkC%Z#+?TMobN%gWEJcQ;_wSfcK8@jI*ZBzn68~p+4wA%>P|CFG z*%Dh*0D-kPdgG(;>J}FXaNBH4pEDHyV^d^U!J2C1O_Da377*1vy-*{`5bolkTw=7P zxqAnlqfxWStb$Qbm}YG{N>PO~FsRN=Iq_iO%{x`Z=UaSExxAE2%mfjmGv8NDi0OU8 zgfA%oT$G034t1_oS*b{a20^ug1~{So@`<$nOWMiG8x0$_&9zSa34BdN&l9sa=;l#5 zLUEsT1p^J_(Gqcgi4a=GUFqzQZVwuF4ME+EVK+c$QZAkTn9_#@g0&&wcG|a_)Ze`MV%`2fXrLLsiD0JdORCI|rVA zpD-|W?J&Jq%)DtM0E1fm!(eM5r68 zTwB?q4dk7l0)3_3=3h3q2I!Y9;oaZHhb7#tlFg^F)2?PuPRBtBr=W*U&KpC`SUByD zj%ALMk}T3^*E!`Pi)9td4{2y!T$95mpJ0fG6<0k!y{t|oM|59^e~z;#0vj;ic(}$( zOD|ZG*16+(QJrNb7uR)#uZGJ0 zX=k!V(@RbOEJLCASEG~7lsFcOjpn;JhxrV3Vw{cJsnqx$YbIG+x`v>q%T}rise%12afc|iWg8w?&=DTBHzW5lO$aJoHY2HH?k}0*nGjjJ&b`6^~ zys{?lx)-w&-+~?dFH5Q%hW((-pW+33%$`8*j;Neb%XZ1_rztd9bu1*Fek}nFPR!Qz zxr%LLL4H^CH)0t=dqHW-aOx-9>t2Uo?chZVP(IeN{{;ki&j0+tAhBv`ZT|H zYigl7ZWue}dUNgnfzu2=MjR2_!=Ilv#c+L51_dv+yZBu>o;?dPJRXhZnh4#k`R>)k zzP?#w!z|)>tc=*PYk1PxRXtl+%G~W?pQ2Pt{qEiN>IR7A*wvXY=O;+zxCBszb&*ne zXS;YnV~<5rnnk2>EFq|zL?(RjBwH}ey7qkVGQ$!>g z0HkL18QH^zxj$X41o(1Y*N=fy`SNI+03$>~%e>DbN?Y6v=;e>tb zaqIiO2;~Ar3yBqTI4}&;v{MUkG^ny15hi^Yc3$CD_zHEaN_HqxaH`r?@gzo_S{%Rb zZZcn-ajC%zX0@}I4LaVfX}+9*v8}X2TZssG;VTzSP4W-+Yt9Ya(*Khk=xDz{h&IT3 zo4U+<+GF?B9A`16S$lPDd4!0?S9lO&)x&xMZeMAG-l~D4(b6^NTZQ+G{~27WDUlv- zu+9@LWfDKoJy5xzgNkyhPf|$2tHuH_)_Lkq;v*7`;W%U4j2bOmUr2(Bq;Wr7I6U6V9y@l>V z`?uxrwT2|k8B`JTR$%iUzu>B50hZNQ20`e}ueb~qqV3_N(13hcw%Mn!$)PXxxhx*sRm z+1^yen^+xw;J2ZF^nG&Ys|F2|lszIaBypQ~NIFvBzm` z(uq#E_$G_9Pj1(KM*A>15=6`-PI(_eP}bb-(Y>L>HSMraN+_{>9<#Qnzpk>Yue2CW z5dV*#N<|QWmmfl?8;NYU*G^Wx!5wY6v$kqG0o{ll-r{yyTH=L9EZO-OWtXdMKYYqt z*toKgOC{o9wes&&B-ySP8T3Ql1J`rze=IQY zCp3_ji5#`DwA zdOJBqB$1Y|`TJ0WN%RWWArPll2Llo>xxp;eHUvVuzb(}&FCoB>0SHr->brG7XHJ65 zFlt_N({8g8WY1op9&b8|NvY0|sUbALBa=cbs}%;5S_~V%LBLPTZP5H{8=LVBz{u|e zM~z;XeomaZ4wct8&1^Xtn~#4(pHv^REyH+Jgmi7%C=ujCIp%CR7CM0mOCbypbe`z7 zPtEt|=$x1!=JxNuR7#3c8$Q!*@<;R;k(@lJ@!X^wD&6dgdDOQl!kP-e$*aW_4hiv` zh}t)QVgdyruDeT^eE`&@Dbr}|vCw4tOL|v<#NS~Hi4hP&#T<*j@Ke5x+)a`%Uaq)& zDZBUBXnWUEg&MKMlX!ILMyHATw^UALh4`5VxVy`nZr}5*+yikG>g~hMgJj>WkgG1*=>;-i#LTpENhG-6+RMB?o4|=Q50&U{7z9iK5sS9fwFsGX z-HGsBK=Cy`{7=TP`q<$#*o&PxXW~!?-*UNOPk0>*HvHP?kz>ns!+kBsDhIB+BM(15 zdN;m_<@fpX=X$UmU>fE=oHyJlVoz=o5V}*R)g}tT-&fCEZg=z zyLsc3Qu^HU>hB~@`!O&2h((k4y_gXE*)FPdYuUErox2lhFu*tB0kQ1~)Muv!t zo^%C0cwVfr8e&Elw6nmu(==1iFM`_~EUS|%K=QX_5&Z3{K+#xmjH}diMTH*&s%!h~ue0F3UKI z9(tg5pGk9A??uMU;rx^?u7)vrJ8qvR;)YOcmmW9Wi@#R4K8AC!#dD?o68t%RjYKkC zl{aaT@5!;hVtW1Rn~YSA`_Xz5Yx+|&NakcJ;d^Baq>*xuKII)y9N(uw-dB~ie71Ds z$5;0e7bf+rdtV<)cbVJ%5Gn z8aj$Sb$B=~-yhO>t@Rq6heY;wRminX32A3O-yhndOqwET^K@<3Hu|HYJtYQZySG0= zU8EB9BuXso$mfjcvNQ}NNS{3E1VCMiC0s@D?X0%b>)fhzbjQclMibxFNOw!SAVokD z5h@Ch_d2B&-2jqOE8fkzf3(ZYUHvst?FIRU0j1z{F!^n-7brw?lg)pR+F)N%n^P{u=#@*Og6c6Xm9(dAnh|-tCvQR)dEn zUEBya`0Z&dE5S=Viv^}#U6Ec(h=&Y!KUq90FbV5sC6irxi!TU^K<|rOqL~7{?rFuN ziGHO!Orv@Dm;G?U--4RN4Mgltk-)?k0e<)R%j@etLgw_j>|-uB;N;U&o_-AwdMLSq zgc&FTQW&EXm@(VqZR|5z6aKY4_qpj^{FeoUX!~v7;MrG-ywX3}o);@kS_3Z3#83*a zouJSCL+OxT8AJEAG?sb?ZQB z(I9l_66YaYJ@l(xEz-<+m5Kf*z ze7vk0>h)8`I@i7x?hG=A4#|v0DHti?SVCt7hfn|O)TJhje%)?(o(!|8ZU+O zWsG>VkwaW{xnUa5-JTfYIW3R7fA_KBl05JHuDMl=4Uy@R2mX)Nx$pSZy<5UmQ#JUq z`CoPfvnr6SLExHZNKw?nFvard;)x@cZhrpt24=r1pGC8!m9s)ZOm|&J0nUz~TW&oM zogeQy7QT<;V_5po{@1E9-u^QPu>p&@OYaqW)EP}i)w=QcYC_h;%X@2CjxPpkk%I#q z;TSTP=qzFzgYq{qmi+A9`lYu#FY`hK^v3<|E;)M49&|Ded+_`<#d6`7m-&awU9T7h ztpz7zV3RUd_c;QOxcfFC(@+{niAfed&zfxOBa!-y{rqY*;zZ)Cr$^=1g=El^y5Mn| zq-X`9hD><|@*K`@;Z(~5>qYJ4YtIy*P$dtPP-*M?Oi;o?K1DjIVaA#*?;dTL;lYQK z-ZJSWL``kXsV3V~nlr!zE`MgV&|rL5p(%VrE753HHg-dlHF*Ku^ws}DTQbK|RSeh@ zjLQ87i(8{l-?RTtIhne;-(LE0Z!C~S@vNw}s<|;Ck}pxSDsp%a{VZ(z${ArWbU|PA zHC^&a+T$HkleOo`3_F<$^&%S@6)h$@GjU-OT>>xc+|W-OWzCXA(jFFx{d&NSF}v9^ zqyTM8vN0RV#ecFWv5|Yy*;*Is#zN-wR!zZ)#b|mf+Le$%?^O*ZL)4MS#otb{k}v)y zlFllx+}qhoiMz$l{sDBb3v{U)uFH)td@%SFAb@Pw9_}O_jrusu4sKT6JM4D1EbrQaq=)aU zo!>;7Tt8n&p9!}S`y~$!+7B{hznE;fhyr4uc`~1xmaQo}A$6_OX8p4hD1+J|lQ+&p z@SBn?_e9G#_e*&Pf<<-`&gzik7S z&&E7#C3`vylbiE+vjco*9{gd9rn3BjsIlmmD{JE7vv656oh(nki1m-u8bFmOEGqC| zudwSGdULb#zJ)^fJ4&rQtKBcwkEoS~6vjkJuif+OXY7~7?!O9uZGXC*|6O-bF)}B7 zL38VG;@QnGoc$?2cVAT&aIl?sr-aDFgW2H_@KH=x9=OJNxC418CL3^2@K-*=|9GExT4yX&$(~&cAKAUr zc>JWC?sx(L2PIcm162iRI%qqWyu~%vqpEWLPYvI0AQK$w)DXAYlm}7IfBP!yZtK>v zQ}F&xp_spY?C0EJyOHb~^Tqgo3iO&D;LpbHDVGIukVJQ>B~$RzPll{-a z1!H)b+=w*@x^wy~58s5~!^&?mC8MX%8|Q^`nx&}31^C_#jf>tHeO;j&8qHSEPUEPl z0c>`A7sVD~@dky1m>pq&P-RRt0Q)xl;XKe@56pLb-d79 z?|{KqKi0Y^ag}i|aGP(<^W|$CT%)+QB$bW6=VL7qVCn9hOG_vBtIcq_c#~h>T|&iN zKQGweU(?*o_%VR|t1Oq$?_&AMtcqP_5G-!Z;^a@XGRpX(L=Caj;#-=)&`YtgvOS#Z zd_DMJ&ipo{7^G92P^<@rFFUxoU;kN5zi!tWMd@>{rnuKh2Y3hHUUYd>OCr%Xb$9fK z-1T+WtboTd8g+J7(>@4`jO7|kXd{3?Bf{yK(zU3s*R`JyU^32*-H z30>U_BDN%A5X~)Y{Im;S`g~5;2mjiij{9695zG+z+oXJQOUgc!-e-U3bJhY^b44Rc zi#ud367W?nJF8R+|IS)?#!VZw)ztZlZpau@uj=9p_W40Lbo_xS>ESBeB&4@&;m;Y(mA&_7tm^6qn&s9m0{*7$fJ|Z zr=dO{=Or(v^!8PqbqJI*k9juS-TRI@+U}>QmX_V>xVS_tU`Pw#D(Ze+vHZB^}{*-g^r1v^+_<>T0qGA#<#}~)v5?J>Iv(X`T z;HniB%6Ad=|{#kU$)piYKesH4g}X|&_}*>Jz?j(CWD@aI&0AmRs+lU zpo+>!*CsLIQ}#bR)}_m*1FJ(%qpZrBcbGn({XKpoeLo5mY-v5s$I%4*bzC3#_4|)IfDJ6m5CL9)UGxZX3 z@&%Qx|Bp4p`gTc`$zN9lCvja9p=zAw3~~-02($tiHfC}3zhr41J?U$U)#?BmCx^ydiC(qsHzJ` zqNN_C?&LcnM&LypG?eb`I=^500=@nEdWH-HRB$Q z%7UgCD?G9lNvWwAY9On((M>WxXk3(?`0jP|YmVc7%w20tHy|vLbYSV0GjtR9cP6T|h*7ZROyet0Zla(^y+q@>vcU(YOf z$8Vr?WH^(u>y}NQC()ZU+y~L;ehqIE=hC`0$M^Y7pzRseSZoo7Hw5k|R#v_jLQJmvVa%^+>)CE%R3iRbJ;MTV?Zc zdwvC7m2LwIajh*Oxz5G)&82vu(HS=R?s1RrvtsV|cY<;QoQy)w z8bt-!+}>s&HszyJu8zySMTqxi;}Z^c z@h!gaZMo{IdGG*~j)$nWDx!JqY`6OCwd9X!RzJEFM*n=$AGoul>LPL7y#3q1NDkK8 z4;2??)_nO8QX7AK+P28FBI~C=3v`{IOt-)7P0wp$8Qq9o_E9QWgW=VRj&07q!r6YOp2Ll;nvqLnaW08?rnjC}eXy@`DxH8eS` zuup9MPh%1)VO$w=Vb76*0s^WJCd=4CbYWZviT1#<_QbTKT7jBj+C8UOLhyQyPoc@< zMJ#y&5IwD@Wg$5sU^)fROyDnN=_k#&vpixsz=qhxdOre=aW;}wWogj&8n}nzvaa)J z+iCr0Z(-k2Euiec0>Xb_&kuOs6*nO;s;^VmQQWd2fyZJx((X}h=S8nwZyR9E;mUa> zy?G+Gi{;sG^JtVEujT++!RnXQ@pB{r(qUO`YK#Nmcyw#g;~uFGPFP$)AIxCk9_MOs zziv7C%NUztbgRayYDgTC6g8@F-Y1Ut)u&k+y;5tyBCS3UodtkRuZJ0IX6=`_i$0I> zlh77dMZCi{l zw`yxXugabx%jnl21)#37HvxkoTFQD4n3GS$xxwu5U|<{$|40Mc-iAk&JsqrhnV&QwH7nbm&ZT%b?w4nh&Tsa z31jHD3qYxX!@S>g!na|~AFuwSqgr19(;*NcRf(Q{17m?3I#2x@D)tI|(na=9nl9W1 z?GjpfS7JjmwC#K-Wln0lZt0Gp;z0~rBVziDS#h;^t&TT;ACq3GL4fMu<=UbCnax`qG{yH`JO$SLuo^??~{+?_I5H%dinO_PdW?t`zCvUo$9>(y-S# zWt*PesG$DYDLcGKn_rR`3ubR}#PV3nzmj`!VF6v48OVC^yn5;qO$0U?7r>w2#LLVA zs?zv%x!S0Lt~8GX`IJx0w=cfdOlgtO0;Q=)a!QF}uX>sx_Ydcd3BDZW#n#RE8OItX zSoQ{*JhQm7471e-jB-=uQi5=)c429gO6c1Ecmd=cfvy!V#M+LGX~cJ^l6lj|!qmA*ze=XD8Aj<}bK) z@U=T5%gMr3c7lavb@1xdjm^s8N27V6Y!~edGUP})Rv2g&`LsMTk3~P_X(gTH*JkeO z;S%#Hj90HAufxJiiL8}n+ecery9PyUr-*|G?!k|xBPS-JlCfhDg8Q&pB`uAk(Aa}9=bSKxw9JpJ6YID{UB>V$xkym==+G9F^yGHjK0{9iU2njBK6nM@?) zl1Ds_B;;k}4MNlnclH2`YTywV5Clp*4c#=^A5wgnjL+S)^|#aAnO)JZhFf>bMlY~~ z0ZMo59OqG$3Uth>`ar9zD?Sdte>lBnTeeuK4osE7-yFb5vRzJ!@kf*+;qabTXq;*I zAkgh{TG#bJ_jD3t&Cp~NzDahWP*mF_6Ss4TeBf7}bAWHNW79hcqN6+Z_;n4OGL>GN zn-Q)MexfBo%9XEfI5~G|!3&>*rDt2?Fi8Jqm1K<-}hrZ+jC8f>ywgsNNhSmCEpW20XpSaNmtam>4bDx-sxOr(yWYCF39dZ z(|m&Xro$;IF+b1Q=ak;zdEl5y@mtS!Up)I}R!BRNPbv(!L4onl5FU%9i&iC7s50Xp zlh*PFpmj3MzpC>fbp@9I`CFIm?Krc1M}-u1AI%LN>Q?4l{dGudk6qwW+TQN=#G?dI z+t|!;UWHP+gg$^mRZ{=eet1i|H9`fU;O9*RXjWF1>L`n61@4+4uGETSVSvkVt`woH(1#011hUXiWIghl@)3>NT12_DzZY!*7kXB{`y;eq~2c zV_`6C#jAnjeO1T8_MmBK>A-(NUNQ%j0B~HP@k*J!Q~JOB?h!GbbQ?4PrDbfP{vP)@={2ZdYF3rgfNLnNi3AI>?l7Y|E7uU8 zH`1A4K8XBn#=rw~*JmQ06?L{E70k=$3WFFs)~Aq)oy&!#hR9vh-C6qbcm5WJs9lmd z#XEZeT3Up(fL%F&bXAsqCq*EeLa5ytHf@BVF5YhEZ`rW z=JTuOl4iv0g7~g6=u~c(qB?=Gg|emmfJLn4dsA3U1*jy0K3?pmL(7UkSk6h9-Sy?3kn_#c*Avu&%1{Wcp65B)IkGcf`wy@REL zEvq%g!d)X-8z+7jlpt$YicG2BSKwH-6HE~hr*xrb3UG7f=1%PKaGp`AiE>@&5A6Y@ z4`bbJ*OO3d59|OHh#5YJ*FcNwnP?FMERey5j(w_p<$0I17~sqs{|pSE$gxF)n|~81 zAn`K9)9hsIJNX&1`4WID;Oga48+GJaPZD9xgXIbh*bk{_cu>6GzlJLmjtcnAvk5nN z%I|?qF#KopkOUkc%^i{XU9dHcq_{m$24=@GS%p}x;h*|0nAcQlzp8T zfh39a8jj7Sc#j~|^wvM`s&$Z}7Pb?D`@9O75ERBf+n~K!XDSWrK-{3YC%R*Wz4_Lt zxMqw)em^i8We~jNOVEE?@UogQ0jYT164BAj~0`n%AcC*lU)7b_>GwdHO zWxXup2gO4lbaqA#ghWjqc%@0eHX&w{;75Sr=TYt6j#RbYxq48O>0qVoantC|_*2)> zYO}T+dZA+Ic;>r;dBwHJOrmGu>hvtFCHkl`M-c^@c_(NyhH(s-xdQvtwG4~=SDLyDI?Onh$Bz{u9_BjhN`+~XVT1NpVr9FYR3$h6R!$4N zIvTN=>?^7h7BZ|y2#UP?(7j8}TJ^Vk492DRgfWTSfx3_pkIzAwvOj1FVW_)DH??MN}mr@=a^r*|y)*xS9eea~5X0qf+CFvP>2` zq`4s(BYw%sTzMlL(=hFy;L2=PAA^IsxnmP1qyR!@7HHXAH|k1x&JLYyUHwJ+%y4p%Tji8!0 z2P(m2B?!FGp5z4U#J49q0HQ%LR?R0KFxa30%dHBU41~2$L9!p<+`VzxR;kn#0T~uW z0TM!+$2d>EiJl6c=_BafJ+vA&Z)eH-=Qk~y>DXHje6VCWx2RZ|4|dD{DzB!^CcNJ9 zGu?#^=!MUMlk{}hU~SOE=WjGa0|pH1>|OF)GO}`2fhZF5jW2U8c(kB~y~eX4cF=F} zUy^ria4J3p9FCHsByRKSxzCBZkZJa1f6bP4T|E{nxl9S4Y$X{6tm{qJPK8{{N282?WNQ-C z%u>`d-F=!&@qiqsIRInf1g2nPH%%y0TvgPVV(V<-^>$wlxf=T<^mZOxTt;S62&l;4O9Tvp1ov z3Df>{7Ww!go10An?2Q8)*r^wfbq=i$;lTZA@8uMx!Gb#{ z-kIKEP&0IlvxlQoHG455AP25gG8hbQD;25nR$r&D9k(}q0*!gj)}95*SkKQxe*||s zbN`H)K2pXmox($`%cU^A(Gtq4*bY>PyC2E+hA0^&xYB+`kqY42diyDLqc_jz#bm|b z1`YE=>3qX#<9(dPXL}Ed8avzSK7OK*K#| zO^3tWd}6{oQ?;Gn-1x`2A{n;%^evNX0|VSHf3BdS@AOlh^fEPgybw8GD9k41Wvcc6&imw>t=^Um;3LAnsA?3xG+oGw*5=sYChx+ zz+RkFv)Y#mA;8IfAA4aqKO2hLp0Q_j{?^5=P^+nhrEspAJ-Wmxp#>1&e`Q) z=LtrGJB>Nv$=Yl=qguu#v*6a|u}PQi&!4AkmVcoDukvXhX{)t6>)-}Jv?!juX{ma{ zmef76VcY8pC1%By>VH1vEINwg<#2`>48q+tKNYZHesZfQEi=FOODZ0cKmC;x z@<)_Q{=bIsZ2a|0JrCvrLq7WNx*mFgY9r}}<(CTw??(mmf6l>>+tlAQD)QVzqS$qJ zAczXR0)>Ma%Pe0ap@w^MLHU!muAwZE==xOqHNNyF?^MxAh7NBVIHQsPhn}w9+c$1T zY@YS?-Q6z_(QYDQMzN=JyzgtCBw-%yMV!8)p5G7+Rv`vGzWg?7kdSy|nZA{#G+MtX zr&Aew&R^LSvehE`e9MwGdi~Cw@f~Gqs1a`w_`vQzUtaRkgOF=-x4PBmJ94pJdv?^~ z!;k%8FJr5Fzs|5c`uVeQl$k)V5=yiqgx^W3y>=~*Hp8AS6cgqjKl@7vBlHxURFRXf z28A8WhA&_oaHp8UEA!ca#d)TJ>)-O@Gq$gs4|c;Yy>{9iZjWAI!VEma&QlBJPDTgH zmxv0khgbnwd%&H0foDS3JNhBUv8o-1Jwo`7AOV{SW`fyi+$IO2)64N#M#|L+fS%R4Ub#BV(3NOGDAZ&(*bvoMm@$%l@pPo*F zLjZbHlJcesO$J_OoM~Bu>;U6_%?C#yG|GV#Fq-IlW6qY7weL>(W~f=~i1;?GnsZhh zVsbOic`O{ITJmd)1<3|_)MH!njaC{)ZA3Gc=xlJoL(=lMg_GlrhN^rVto1y`35B-8 z8bi-*aIXq)!}6KYBSM}Go{Q@jOz&r{Ihp>nzzbjh=Z^igqw(J7265{WQ5}$q1tTU( zFK~>s?)cr^u}D=jmFvuxx&85}9b!0}Z(T6&W9@4mw?U)yORLPGPvaFy2}$hMg8mIc zHRo?=re4n95pMxG4!!iZTc!tq&sEt58I&_!Cuw}<^@p&Q?;3K>iwH-u#Px3(G*8yM zMb)?g;G%MML0|QQGPVV@;K90qjSU6jS^_gmTl!1q$(gVtvU0P_62rbIqnFWxzu`)46y$tICoiKa?sWxUW1jP(yzHR z+&09g+SeWS8{3E#+=42EU_ovm`r*uLxqlHT@*F8VAv+_q!0zrpMgr=xOKpa1v0&Uc zX%$|`h!*T6BMvNJ{@4Wo30M4C`pX1T%mRni|0iD*?5fnwfq4pwf?ldbRk1yW+c0&WTf5Ewe&7tBJTzXh2Up9{N z`n>B7k<4YE#DR3zq0rd2AM!}$dWQXM;jL!p-eWA(@}hY7wp0)ye6)D72lQhiYnE_( z>|=YzdR5XLS=q{x;{mrnS8}Zx83th|XQk+{a?mhXyg!o|0BDS@DIO3oDIH0(9a@dR z3bSkiS^!{?TdpxRWGO=SghAVXlUIlbE$jw#yjY{NV;mQfVMaU?WU5Z`!KrFV`~>g? zVI{p}34nP5NDEvD#GhaUa~N%l0mJcdX4iGEu3rN~=tgT8?e(TLwg+Dj%E)>ZcICBn zIs#ga3)^2-O6juGEQri`t&qZ#v%cLO1Jb))0&1z($cqWVmXM(UJM(rv!Yo%{r1;p6 zCb?Mg3Hb4L+6)HR3e?PxKHCa{1tjl$gDY1hejSp8#u08ScDz}9NZj3_bp(wyr{}o! zOm^Q00+~f9|NPEc$dGD}oIi+Od;WnWS6H|C*U#Sn0Ml;{?x_-JB%4iA-o9og#^9Ez zk3BMGe~5aJTi$!{KGMfSil&t|YApJ{6gEh%5m6IoR_Di_4&Ni_{u_FEBeL!a9)Ye~ zBnaEne8cA17atGDg%|NknpiTC3J!lmt=yjgjQoe~KmOcE=<|0Q=K9-9MsobN4&Fon zQ1^>vcy7$#c04}iY$zp5DDVkBVlm4DA7Jy$dl5|&n| zqSzBvR*Ts=gf!vKyO8T?;LztfXTTO7QmP-ig&3r3>;AMyT9;Vz-H8pk^WprJd5z?# zk)3&!190EKgN&XWT= z$op_mf0268{)uygo@gG7hRD}djgNv{A9gsUFqIIr!sPa(sNA?MpemI0vq{q>a|*yd&(tM;4jhd>{Bf(iKx zsJVcM!z<1x&NHVER@i~A$cdgGVfTjPt_pBOW1Z`T0?@|ELIfP%8a2c3wF?^5N|Fyp zBhPf3K+oQ@O8VSf4%;;M3%~<M(PyS*)H5vZ0lV`<2OF&>cK-~)@`I+~Skpv0sUZI@atpiF< zdO;m%divdXpW0Psdys9OS$Bu!b-C`d_7>2pJCDNZI>&8f0B2x5ST0P8>cR3Fz@@mL4w*HKwhs6LGj&B`qk&S?(RcVm-MuMv5zbO+4NiRdQb}uz_n*XM1<;6Z=$Aija(q+kL*I4 zh_LGT`tgJlW906C0p!~%z0k~MeIrk1uhqV+N9583eba!9c2V}d%Fh3!m)3{$Uaode zHo#JO!0PuZ5U$=MJ|5ENk%qAWa56(Lj+W&w+{dN}T%C(ajb{kVCX<`|1YTr~@)wax zxXoCDo(tQJQHGwU5e72Hp4OE-d_GZ@i;{UWKYjVFr#XNh0wX|?7$kJJ^myPg7K>YC zy#inCRLI>T3fw7<+V9Z|9iS+_r+KBLa44);M`1y;xsq^(=s#xpfHdzAP5GB|O7@9; zzQ+jCER`_@o|dvv9PTS)fWZ_F8DY{2GPw)ITg)janFEs{qpBZg&aQFyDJ_B29S`jL zuJ_L*ALDclHOGEFQy^Vngm|SU!ouKSq7g!;qYm3~!2R?c=%xjAPot8)+jN8PfA@Qa z1gyd$T-S)`DFuJ&`F{9NG$Zq)=Q8e)EanndWYFUlRDY0~i_mKZe~1gBKdZ{20+I*! zcYvZiuy-0*3Q$H(te^*dwMTho+UIHQH4lhx84CN^QHvP~yM&e5dGD_FD)iR9Fz$U< zZF%Frz3o!f!KjZ)`L}d9^q$s{s?1wqjqN{fLO%LiuJy}>YCz|J{LXclioDLQ?Ki_VkN+2uY z?p_?dN}-#K*o?aOk~vN@wVgjmOGfH3Z{i!thd16lKfYL(5|fHG$$faHIeTu*z^X3E zxJL8srF>K`&wtc05ib{)$}Ne1)2_|M_LBVI5($a8|AaHZGW3vbS5MG~e5GDKIdk-G ztNi55e~`!dmOm0cqa3)oo7nXu+aI-1KBh*Z$wBY^dW8d4NkTs?+%+amW)g_;)Bb+< z?c81}kM0^X^MH)m8=5~<+mcT{y#c;aM+IW_T^=k7182*UgMVUmX@&27_O{;Jo2XVxbv)9RxNa%(2eQfAlsDGoD)~Px+l#)k7Ir|e=+Sy_2 z3;$0~+`elXe6I(;%1*!WwER(d$x)pz`E|n2@a~;*Hl^b?4%+5=G<2=3c(wq~^O{ z59|6u9%W6pTKZf%&-V#INwW=tnlSQYT8d-G1#glzg8`nNlp1@t;6y)|lj(Rz$-W=f)yWOl!WhrK=>bzHb&u zQ!yYCAc|maUG2X^*`oU?L1vs1ithp*j>_Wma+c^wmJNlay{Yu%j=5f9ru6qG zR=^iq2dt7OlTnS5GKX8GH=E`cRd{=pDdo#LI{QR=h$*kAo`PUo$(-M>qwxIiaw->B zVn%*jrGn^Np5$D4h6YR4FDsLJ!uMX>n7dn6)V`(9^Qj}fLW49VRNk{=!%0qNgjq@E z;ak!Pn?f>@gE}m7OB?&^x5iV3Zhwi;KcS~oTlsLLA8&kE=ZbXf)|aGvL=GI(7n7jQ zTmJWNez~i@pY9d%(TuT-Bu)R{FA%f!qCv<#A*Av1=q~t`?a*Bf%)LxaZSKD<)ti!# z**&3D>j)~V>tV0wxH~5JZ*i!_PoKBuYhl8s9pl~iC6H{%b-8xTH5U(IB{8{OpvGX` zlot6ye3A|15%4Vt1HN>u&!AF1G)jNf5dWtI04;%|jPpn2_B+riTHdn=kXsG%H$C%j zS^QGzYaO4%ErTV{a!71=_}U=<=?XEP|IJd&j0qUz45_f;vt?MArA6x=(v$VOu@br7 z*K5b=8a!T5>ymD@?Sb1NJ3oK3-;jB;xjworzL|fBnPSHxdEHA+c964~&{0%CH`cn< zxV2cao{0wyMShO0Tt+gja{0VPEc-WUY<=<=eNKIZp-O4TUux7_e%6S zQ*3)Ti7Bx=!mejMiT-re^Bt&A5N7UP4U`U7*X4BwaW?aUVjA}$8w5JN8rwjib93oG z38?`aiAcl7v{uxd|AE-_&O#{&v;GXRc-={0~M+-i^N*SN6=9i&V_;pLce8UlnvccZVhlbeh_yAt0(AUO!mxYrOjTW;KmJIJit1)GgY=Nd+9=fbhi;DiUsq&HPghM(u)2elq#KMMhj}L3m{xhhM@df32J!A%waVMhe_Wch2QnLnwdX7qwlr^=9E}(@EKlUq z|61BD3OMccYlQkdLbon;qU8D0FGN~cf*s6~ z42A_tjvSnA?lil5S}sr?o8V*5W`t*EnE6pRP&;Q2>(HH+Or4oIJsdlzcCO|8b?GPI zaddv9m{y&xI))K~ik6`f*052_i{hxMw2g_ms&csec;iK!i*XL@FR?Z-&4yScz%N zy8N~C*vn;HsEXD(@ORl29GuAdX)}QgbHrqci%I6~;FDfq(`Mb;1|r2>qDh>mIXt%w zzu)<&Y}r5CTE;!ugvvjrbJZSQa!Q0>4!)`7MSL|7LhPXP_I&AKic)vU41x2hlV zW->Q#wz+wG$E+2^GB2&>og;E{a~F7yor;U5%aK}I9&)q7l9EOy1R#9G=e-v1l5bcp zS66(3H1?#Ujy~tb5$c%B*2ZEyC6uo#q8ZEAgr+z9FBHujbOmsHyGv-qAfba90ghR3 zUHPLg-LX?CK5B5N-S%EVmMV^;xvv?GTeNEFjP?(Gm+?c0-g)_rp?ypWRIF zW(;SKUXA%+VrvvTpIklM$^pHVREeN%W~%7P#VWe8Qvf` zYyzg67xikyt?0qeP@B5M(l^ZIv2qx=i^^AS*>Pz!&hy=Hl50$s>>b;ZKc|ZovF{@2 zqQ1SyFjjLPe1Cz}wKE_&7kN(}ag%Fcim`bb=h>wod(s;eWPN-Uz;g!IJ5&|#2e1ko zW#5{)@zde=^NsJBS>N)unGX4KVGSc)-wmOsOPO$(TOml`WtiXM&aFHeq3o@kf<6}K zgMuw}lJ#7B?nvMA4)`d|3(u}WT#K#=jwwNUW1V>>^PySV_|1>&*d<(H`p)XBKQ>q! zWRxyUb_ck2ZGgcL)qH>U-*L5iin_tcgI%{BUz(VN_-Yk`ydK6uo7Mieu!294HuoED zga%r)Zf1*`J#aHTwny;KSbi5?yiQ64Z^Dh|JK z#02OO1=&d{@3Z@C740H)KlJTCr~y(3F~N~cQkjI!QR0aIV$VUL z+8l;_{MW9~SG$G3f25l|M`^yi^P*&+?H-&UpoEV}CW@H)C8H*P!M+%hv_JdXx?=P~ z4{Z@#rz6TgnDs0)0*&YSdXt)`vOCXcbBlT?c+)~Psmt2YYx?#PYZn8d+Hoc1MGuHU zV_VvXi7=qr+4!L954H(=EA&z!LeJ>ZUx#RWgiB{!!cZ4f9`sj6yjWtj*B5JqI>IV*F;YjE9Jb%$%~IxA9>9_fBC88 z$@kKr1s2BcO{3A5i3Wj6dnKli7?c#(vP_s6de4=UcF*wO8ZRRG&a({b$6=g^I5Q{# z@@K7<$1v~!+c_~KSJS|fcQuhI>k%Z#^t&0P+oBOo)QJ~tdhx8{5t7$beb z8aCmW`_^5y?%K18;(lr6HmaWDe(_O9JGAJ9SoC4G=$0Ttv$M2kq)oZVvhfeRLfztt z7j#sVU}y0A8P8>M6n{we z?K&sRC5_B`@31UZ2y))i$PA*?(P0B0+GTsHKBsxQYPr+mX@XnQGA?>!>Z4mcrSUPKdDrEMQW&1zG(Skx|c-ubE2 zCjl%EI_6P2&e*oi%WSj;HywbqX8BDI05?OFZ?*WlCDnCXt=YTsZ33&sdVoeSD9~r9 z&CG2P$d#0%DHma6Nk@ObjC~?D5>)fd|!91j1oz%Pm!=e-ebdHqF}-36`&y_m`+AdEF&VM~IywJAUJn zjF9k#@==(C){{{S_J0?W^p{{O#T_S|_pgghQQ=7QiIYYfEY##o`#~`eMVPJHJWenL zZd>a~2aWtuUBEhF6ZNn5`n?{PzfUsh0%J5|+j!$8^vh^%A1XmvZrZh=Zexa1c;J;e z;DsC+j8gv$?gBa1cWmjZGi~R?=~w!FxDo~VOQA>XsX`P!W;0FZ50O2J3I#zGGp7JvpFjGfxinkM%c(uHr4Z z^r~9ufs~}E$6TyA43nu9ue=Iwc9KjAa3bk%7+DJX3>;5!`5QDRvZi*Iv?NBo1{B*r zmU9gwnuKUR%jXBjZRb~e-ec15lJ3XKrpyMxz0B$oAD7Za|u%F!z5%*jhlX@!D(S%w??I=-LCdqcjtqGNQFB9h{rCPe?2Jp8%sRbLS z@S`$ilY{wMcPmA0ZDb;jvCGAhy<{`k?^-&C9%_8Zl+l5IOFeN!k$e$Q@=gs4Yn3Wi zEBCUVTE z>Qt6vw>~=A&Yv64rj8ha-#IWGEWLGx;C)C(Oi(qLdmk^Nwc{V>;OrG2l8`tKQ&_i4lzl1oVQ%H){tOPvuDH`A8!0~-*Eb{2k0)7To=oQs4{$ZG&e!beoHid#PRf8lk>}D+X;X#9X!~OW2XUR+FRMA5%;30UhnV zeu)=(hnU9}cJG*S)HfpGwl^#-`|Q!l)?8;xb^x;?^%TE=LvlDI!Lc8bwQMgj0xZ#C zx7=EnHWd!f3qaNwct;?~V-OxI0e5EsW>HUMh&Vtgn1u*~O8T8EGT)ZRvM)9-DMjS6^rg{hCY_fuoPM zW28X!Cv80M(^S$ynI)uOo-X_@<@_3(?Y%dkK}3yY@$Zofs$0=C^0m>#O7%!-wBdpO zc}j&YX{N@Hv%6Gs98`|XYtKjwR84rrtI=)M;EZ?fhwd9obVt(zutKR3e3Yf?xY5p1 z(7X3c{c%YPP2GH>2F+hPK7TR4Ssw2MH!apq2buD1g>yWAQ^RShHyBx3$7oY)E=Y*lg2#aa!63o0E-voewpZJLvnw_uTPvxMXKUJj{ z+I1^rtb9xV=7DC74_<7}>VvO(WUu9BA3g+`^wj29yITU^{&4<@UMN1-%j|odB4D3wN%Lg*h=-x4|rQD;rPC> zt!Lr-W0p>#U2KBDES8-U1?2&AVxd(60E^VpdO8V()sRFJ&`k{ypVj^5$DHWu8iR|F<sv92OUv$%u-wVZMfI5()+y2wqR=p+p9&ftqBW$C zYm_=}gb@|LVTh%XRn5(k6~2A*#wTLx&&lg$#8qd%`k)W^EKeH_ci7&A!wbq6%9ocJID#q+L&hKi%bN|2hBsQY=> zS>Ze0&nnM)DmbDqp991k{B4=n{8}SEnkYK5bSnXW_#RdlB^=q86o}bWIM84Ui3weK z)Xfuj-yENQ^FV|0oR+xg6N7DS-6*+7_TX#Uz-J7KwjFw>9AD!p;tb#q@2P#+?k8$; z(Hm%i2$cL}fUG_8ba%aCqEJbW{aU6e!W7N+NJ}`%<8XP=?ldpx!<#T?-7-xRTSUjM zKv10ppIK0@0^6t8FMrCP>JOLcnxwLl6tmj6M@4XK-D3#zs`i%j|Kj7wt=uK_!JC&u z@5@3I&l;#}Imw&tna;cFv=7Vl3Vlnac>PVz&`%fa{y9VsVCR09`GC=ADkc z_!xesS8AYIWtf&!*AE|r9CIYo$|lzw9?9{tQk?oesT3RFO_Rv-<&1T{cL##Mi|tD4 z>NISQpRV(FvU@16C)fNqpK6-dB=$8ziidwDh9F{s>lt`B;!)7d<5#4LsYS{Vxo0GJ zRPDE)I<}fG{5tz3xgYCu^2w~$)2`WD_sY)WX1N75+S2VWB%Tk5wEDHMS-tvrO7mD3 z$mt$n=VvqB*oFqgl`fI!*JT(yqZjMM?Uoe>T1(FNK~U3>Tjc`}UB0I zhJK~y>TsLMFUJAZnKzW>N96@qOy@TlFJ$n%|E-J-a$8K$nX(B%IOax_ zTISg!FaMLn+7ynKTrA;&u0o(rxVd0&yx2)io8tovrsGaWisi`?&QoCHLc~;dbA9lP zPA~m*mBEoF|g1fEwF7Z<Zapsh2xb)qE?~oNBpQOL|X!^TRGG#+bEc?JuoR84X9l@b{d}t(BZv>QvgB++?78Qw; zVC!gex~$jJ0}s3RdUFh~tMFIvhyh;v>ATwfo2DBbC9cQ?WT7s*m?Zc5RCZtZJXWwr zl$2_Blublhz*h7|1Teb~4L|*1QRn?ZzvN-*HelKWpNE}15A(DOcXf&tN|h=@5jR;K{Tw?_2GWY{tX z7aQtcgOU}IeXGVjRpxrs!Agu;@jQ!50@ix#n@Z$LgTWD#`Gc+H1vNI))&X$3+4pMK z0>Yni6ykzsEK||XvrrqW8*;$}zqfMttvp%dqNCl^@p+nmV(GTJbS8GG9A6&pFk)39}tDyLc{p)W{{f>K4f6*}>aY#P@A2^S7WFwE> z8&Ahuh1dDZx9&#$!=zOYDI`Ha5!OB&t}6imf6uOAfl+vELPA7MjWIA>R8y>vz3iwS zg|XUC1ge85(k<5l59%-dd7b%3Y|zzWYDOz7QzOyZ21WjxlV7!#7UdJ zB=REEyFTO4qzyl?D)Isw_6`6TT<2w8jqVEe&(6*m$l_i(+q*xI;h#O=!q$old7?Kz zyL|8Qcv&k{+EBb53F?DM44Q~Z#Ce^e*qIVmeXq~(2Vr3swC^$o11p|+IC3 zLS8jX-9p6d`PQab=_S=&)_U}OObbFmmaX5nf3`qGYqt;08ID-LoPEPxIt+_CCs1YQ z8*El7UtUJ<7Dl29K&#r=r_upc0N{A z{&^K1n7m;^sli<1!&21c`;~_@iA9zBL4(4Ht_wp9N-;y)k6!uHgd8@}7wA{ci0>U2 z_X{hpj52;?ANh|P&%z{*=BWKydCxI!N@Ln#R|RW`K{P)tAPRg5;bi#NK@k zUQ%0`&6p)-9ERC+`1kC|GX?%&uo6>&y;}5XI>jPbFBMSD2TV2-)N6!Ce%J#4}g!9HRvF~ z1?zBNmHj%mv)6MiN78WuhM?%^7lY?y=T2=U!!QYcI0^+!P=#);ov$6b1znpH~d6BM2g&`7=t8Y;&XQ z2+9ArKTFMphwP0@8yL^i>XZ?4$j13o$(aw>7>KiGGbpca#Ud|tHL;(tVERMUE<^JC zBQ@WG=du0(>_DkI{OW8_{7CogRRC_e51=QYFP}`pUiEuI$f~rGv>-T|e!c8zT)Z8# zwDCK;_h-cksckB3Dq3aXo%IC*4T$NRipUQz#wlh zXeCe=jDJJb8F-{qj7N9vt6E)03M~ko2D7a^7onwniJO`X+~}cK{PlJz0C9ZU?R5zQ zsn}e3s2rjx^eQoW4N$#bksLc-?jP5!n>N9(mc7ewO0<4IU%6GsZyI7#2&xC@MmP<) zLIdW#ObPP1aP@5S7zRJNg))`FcP#pKMjTsqn5<{w_+NJ+`1{e!Yfs|_7ydV@rr07) z>LT(jT<4ddZt_zA8RgF}6VmGL3BdrPVjN4eG$TbQw(jiPuJ&P*)yyWsr5xBKldg2b zbrY87=BEeSlUvM83L?or&gUCno?qctwpp*Jnhb$XfPR4H5v$pHN&>x7Ho2XVk?W;j zMwaTZFA#|Fmk2_!n;B!x&N>K}PBwDr3B6X6HWBb7)HvwylV2ile-u?+1rS%IrLXKW^^l9)3oL){eJ1*(%*9&tshwv<)+b?of zXiJD&Wb#!NLU@FJT5V(w`8rgOm>)i@eBryx;1r4x4GxpB-1eY;Sgs)?WWQ4(Up};G zQz^?z~0b9?YxWL@Ti{{kl=j!`y=4e zX#^#8QQYdmE$WjHL;$3_ahbJ8GTMMlpKUBx%?~ml&T*5$nrP)fSVtGRGmBMx=kS`A zu4um}h>E7^u+HrO*qRha{N;fm4ZIN{j})~OOd5+5v))P5E?8ZyON8C)BIp4xCOrUN zK3Bgcc>Ne{Tl42RlZB_*PSog5N8L6EUWptb^?JvUt0#-N3jL_eE3-2!UMKSM)A5~r z-~5fA?6rsrkS70qiq#9mj_c0E52_JF@z*K4YoZY(WU(NuP{I%%xXs$t?zUFnOY`!w zr)wuTFYxB*MXS7*TcPhiZ2VVdM?#^-N@Um7WBgu{#mh=h~) zGVplG+*j-7ueOu}2e){S3opNSr1hN#wH zW9RTd2!4{|qsl3 zf2ms5&i>$E$X?uVayppXo($&tWA$gofQmh3ES5KGy&!)vNxcBPK$PK>%9E1uGgjv~ z&G6aK?r-~1IpP_v&txQC287~mbD68%My7EK`Nw1S3=>Q_1--NtdcLk+4_zj?dwy2A z$ejIhS)?0@6(h>Z&FY>Ml38Xnf*_H$LJyFq0``Rg_NYdudKfG%GjD) zzID#XEC`~w-cPSzfd;V#Tk0Nq73N)>iOcNgV|iz-{l-X)kD*U=wWSdw=FIoHCeb`D#<58C~DD$r!wLj!s9*osTE2p4W%yv|;R7 z2@IVl)Ag7${23|~gW5N-kvJ{&0O*h*^@)zmH5{x$bOU7T^);u?96=BPK@h3x|gyERY}bUTlS< zYvWO@Gf>;tuYas1Rh6bhQ8529(vvB+0=>DuAwxJa`u`kL;r8^?nX{mwP{Sk$?!~dN z#MA7lK)CXX(P-fJ3L~{18JIx0;UMzl>qB?9Y@LsnaHpRC7XHXgEjypUaLKocNbetU zLcF1>8@q5aN=lA^Q#O2#VJor$m0#|61^2G)G&}Co$~f5sw_G6SA!H@q#hfX&(jdW4 zF%O?xoHS(U!B&}gZ@7r_iSqLao1onnNJmH5E}?@zruihQ7?pE+!;~gd0Zct@(P_Wu zf=9#=0_X3`deSvE7i}(Ee}bh*XpqIGm6q>sQLVKSefwY_OyHG z00Rx9t*3oOqAd2xFBT7>KcN*Fv{03)mJ;F@oCTPnKZf%SB0POzPbC393QYM0+t|zs zWa|~Q{wEou@>lN(oz%q;IJVkjGH2$?n;W-gaLS<5wC2|FVLudk6 z&gm*Zbnp1x`|f@3uJ!(bw^ppI zvktRn?Q{0t-~DOdklKdb!{3NFE7RvSB|AR6Yl%M(2XltE#%3w18BT^!S0yh?>Mtcd z&ykfH*C1+XsgtjCoqZn|oUcwMu~1@6l;rGgQh)E1Hbv3%wr{2JZEhr(3SA#}?i>TR zPy#sqt$r?C?_bI~k~20Nb{I(k2Q`usnShkGvFpR)NNoH)f0on4Y^bhZ%!X!3H@hfF z`C~g5GRH7HN?gQpfrMY_CEha=H?YXM+7VQo$h${1Dxl>2oBETTi2x}IuY};|wtXvi zK|dl~|Cbk*MCe<6J`a$o7kfn@(7(e*u64w}QIfYo`Rp+gJ{4cOyv6QEM6vknYe%AN z`aC&*jBB&Gzh?k@Os@N^k$%{wd-_C9qWKv@-qo9YfBVC#&$}XyWc?u+CFmEWE8^XQ z?l3XT@Fmq}6je*yvc%$+-Mh`23G#wH^J6GUm6$RVvJVwjkz&~*6wz%V{KRWn=dfuu z$1y^PS?26U*0$fBsZue2NNuTNUO#XnZl&;kI%ES0uyRskV!AHFmi8v~*x3=g4-PO* zZ62U6S~d1Qhl9tOQ>=xn?!Nmbq?~)@E&SlcMLnZr1wbpQIo}O#@G7^gPcs4i2Ua`b z8fR7-10uxz7EUDe%rQlLh^NZ{kOSa7j*{m|DJzV=a7^4ee9au=td4v;nP5!MX#di= zXYrRdr_a%fU4nX~CZa>A-`TBC%@d%_9IAM_A?zpgwd6fpX0lyP41n$^7oz9isPYGW z+-=>ng|Mr!qGc=`r+72Hn@oe0REr+20%OmI~wvzkcAHkdJ=$b zR4hD$ft1DD3V`(J0=Y`j87L?cv?{RqqGg0qCB3%mxwO+ZWy(|KrEHb}bp0E{tcr)Y zl9xp+!~}9It?Nd;oE)R9UOaf`H2L?g1pC4AVe6k|4w-#M5V??lvzkS$Ycia{gKbH7 zoIG)w@h=<@yGULJ<@a`fL{FJxiWZigeUPxJ5YMa;`@Z5xM$*5D+e6JnQJliJlBs08rVWo`yqV?@# zH0~UdtKT6LKtxJ==aCdb538PT4>7rwZqkvWtOZdHFvp=O*oUt=5U8R&t`q7~v_$h9 zg%G{z*}uByj+_U(+?EC_z++W(l&r?*NL8H(>JBtE7I)fF32FOZbkh6P)WQH)GD>m) zm7?B5Eg&pprqZ;u{%E4akrx9b;S3(kSQwQ7bmmbo3GT&t`anMax%+8w z@6}RW>)X19DUf?nm|wn-EY2cvw^Yk5>PCFQr!sfcvye>0w?exKWS%Rfp6cgu zOR~qOOK%9+#3uWHBTc*zx2CvLV=)#q+6${%t8zwt-dOuP$Qy; zlI)6+zzYu*0sMp9`OWVC=BbPAT_Wa#TuZ+UqMO%5LOW}VmWLW41-SM7v#+kN`rnkv zg{SHg+rGhP$vhr%B`KK-EtBD1A!B*8vG`H;1A`*RVzl$Yo!q=$f+0 zvObp8`W+%&=950;N+lWd+gokiNM-3&nq!F_jwPv|yhW?!%}MHBiH!FLdSZMEd0UGc z?$EkdHJwo_eX!5h_ghI>luT{oxC@oc%i+MLbU&rYM~xz?_sux2@&;6M-nHF)i0gnk zbsH7V^rS63UQSYZ73Lw(CoMr77kk)FdsitsEI$b2K9n2G4A2S>ZP;&`TR&eRV|u9R zKHrp(srHIoP9i0`zKs7pt~pjALXx>dx=GCMw}siMp<<2w=@LDtNbhoV&1>; z{*yiZsustfqW&;yEn3k#2 zAJXp^$2Zbl*$Zs_7!9XDQfkCERcRo#s~9pEo#RE;bT5(9@iy@*zk-p+qoE2dzdfM#1ugL z>y~^Zk>EN=cGM&Co0h&zuW7W)9=SPVUutoZ6zY6N$FC^85aKd1oReV3iRst?t&HR= zjN6Re^oDvgp7=nQlU6}@xAFv^BP*8^i=I=3ZOKK>np>3Vz2$IneMq>~saEx^bofhd zgn3!QPdy%vb^6U&@jNxLd}B~NV`go)Ijfuo#<$d5G5NwIYt&?{aj!vV0ERS|uhIvl z0!F{BK3Y&!n9%F2oOz|3NMmGv0mOOc&gNkXj^OX^wB7iS-RSS!IY*&yhwf=TrUnKW zWjZ_1xM$)nE5^s|0P6BcNE`F>W_5+O>mk%2ePZ#puDSQnNOe{4ZG$U^9H@CYcqa)m zfYu&ec~?9ItTzXf!10Z1Dvy32Ho=|O&SHq%NQmrw0mH%8j)2mlHRq0uXmdc{*{qES z*U59`P7xN&Wzt847~Z^x8zgN7+Z6xc1b|rfxkCnP|;8qjO zCZj@;|Dj(AG%>9-p3z4k#y2sI3A@yE6VW zpz{c>KhB;bPKXmN8Ex~!;zt^Lz-#*Vx&w@9Bd5PYzT6=fhpVvJ%8}DDygp40C1)le zXLzEdCB-!&t{vQmSU3C8Xn>wR$p|gdGT*ilPVAa}8Jmb$fuTZ8nwxy-gWlPI+L`C} zW=rPS=czW#N`JCJtLWkn;#AC`p_YiS>~9&ZAKT&K^neTQ#!CSqkT+7t?TwTp-BSkr zqVcIMqK5vO1C)_by0XrE{Emc z;O`Wa;sc4z!DVN3#jZ^^==bwaJc%w| zn-U=Z5Wkgc?j6$DAiWp4=Y-KbXt)^NUFduxEUXPH1)>;!f8JEzG1wd@Z7}Ga`JV1s z0tBT&h066x`Ll0aSB!EEniKP;ecYDVMPs?hO%Zajo?!}uQy5wBCv1qn)KY|d37mYKnoDi(f)GAGVB zQpJj>Ji|`P_ulg_hcRNSF{o4!$l4G|ds{UB;{^t~;CBd}_&Ol0&!v#_(u=8h<=Qe7=!;VEnW*^d~ho1^iq8mKh)~ zeMWUFRPpei$LCK?^OBhbo)qh`a7gU@!`O*9DA)=NgwM>594!JArY%sIV`tEBq5lvo z;acn1EC6OS_R=mEHSgoG#AYcUou2^@*J|gi1_RJV=dS_BfyvtPODM*tW&?gZ6@M`} za|{$1QhPr`&Z=^Cfs`0u^_-};eMMkQRdAz~S(mvHEgjv=aJAjmW0U`CoTdyl8-a15 zX;f4~8lbJV(#6$dg?0>N=~dFlpV|Sdk*6^Ry#mk~q%RZveuvQ#7E%S|$n)TM;+WJ| zxal2lBPk1m`|~H>XA}ySXF*_KrP4CNve^lzm07ZTF}GkP!2B0aNFFd)o$F(4UCv>9 zLh+!km?OD%Q2eSg1(nr{ti(Ah(-UW(y@3daOy9AE5^E|cAtXFJ2nx{h% zayP0BP@J)l@+23htIKdO9ci!6u|E#lMppl6R z5doHy7;I2;F?WSknzP(4M zQJ5a~rcVf4XLRFAk_JY1@MDcUfzU-1U!+@$nllzeBnk0@Vs9 zGZnX6ety0r$=0X&dXUmM+%PTKXR>SNF&j84`Ui$|01^DS?hcY5Bgd${ z**f!w<9FRc*>^kqNlH&@6Hs*%H?xfqmb32%hqxo1Q#=U&l7o~kw3SCCK|T*s;dE;#glGfbsK>i`Gfc( z+gKOqGarL_NQfVV-5B%VRF8Si=Wod7L8;Ed!lJVBD|X2=JYO*aoH3ihkeVce8DhCd z2Db7i-ArbkNSljuu z3xuGZkyV;^~uF5U&z)H0r z&?CO=NR}boKY5@bPPmmr8 z9PE0PhTJN|x$XUjiL1{Pl5T`6J?z4Xd9fZdKfLwsMJXL)Xwbr%#76QyON>+L79gHR zVc#9cr0W;Sw{l1f8Zn?_E z*Q8;0Y^yoTv?gY=y~m=#89-;&SokEc^Ox|64(W-wKUj-XcR(c0HX?$J_jh#2IP|zv zZVo{fI0?Ug(s;CksdcWI0$|N1Smh-q--W=|MSJU};{%eV*&TOXt73ohHB3DW;Bh$t z+#Bu=i9Z1awsJHdTiROT$g=ArravqBOM|43&}CEWTk>8%cU!aariYonh6W4rQhk#9mZkN;(8=_LDadPy#lGI+LI?7BaI740FA~ zca3(1?|h6z}tW zp!gX7-ZbZ5A^*ff$yXt$V%`w7iZaEXQWqLdI!GPe700~d#X|K+0y%BI{C#3(#o}qg|ygbgcnHo z?p$uSOh(>CW-V!6ll1pB4!W$32%k|aV!Hdkdtu0$WEhPg(Qo8tzA@q`4HshfqFb?L z?>WUzhSjV0M@>3aVhjxp>-e&N4V7a+oJwwL98guctS*g`&4}pA9Om^4lx&62yp_6u zpPf|=>1^wZl0A;^tKamoLh7K*Fx=+d+}EOCKz_pmR8!CqJix}O`Q6^CnMblLQ%M{( z&P-GX^${UGMIP&6cg+c_W@Ev^9RcRD6$yP@*V}HI?M_IIyS<~=?%{5=fcmwWiEa7a zlRmk#TnD>88YH5?q=~-Yckj;;c6ToAx-N)$E+CYh=^l8Ca6_Oa&gxUXySctq;EE)} z=D@RGF2>Bh3@0}D>S)yi1wB2UQL>;fUvTl*H@>nGHO~|Xx7}K~uUs!@iNBd22k9ZX zbqhiYI$}h;6taZNvmqTH^|K+0L9L@%wqSHnt?pFigqF!w#RbX)htiE@iRYM+bxH3& z`*IDpxrL^q3j5!UIShzry2A;7OkG5e4U4OP_?yLq+Cuc$&RE^~0>}d!Ej0d65gTrL zhBZ28meUOR^2fG=o{cy}OTfyfux~f8#hlxE9{ocN;iyKr=5+dmHmmB1hS+aG z!I8aA_wWTe3>#)Tf{a4(TR+&(YijOt{ziK~{PdoHmE!ZbWn{}>2ISf9{m(08^x|I} z{5EJ@H`%4awEA~DAI13{pIqS>-S#H=6fCvV{BV5di&v)(c0#lOdo5>F#JeR}M7Oo| zqw&~Xd3jSmZ=O;A8Sv?0MnZV`2c2TCjyQ=*6@6R*{B zf4^!IA{}Tb#CV`DzN9ZW;AgHDCB5_b$*`|f@qN+nRJ3F?B;7OsXtTUs#?bnKQ_Ox7~o@1%cQlzQ79He%-45iGYCCRR`v$pS6>abXVc z4vWKcffo*+4w0PNM4;gNNsHv{%*AZ4W#aML)UrP<1XQFp$e+E%AA_a81pIPGM53lH zq3RCikc=d^ubPmi2Q{_8BhRSpts}m1H>7U4X@A5HRE6Mm@4Nm-yQU4+4Nz#%D*jTcOrJj zp}!b&7zPMbjwB}!R1V@D8BBPz8M%HfuRJ#B0V?oQBPVNB#qGmjJzdS_T7X}P=7))xPqm#{htQ~|Ls?Jq)tlz-yIH&y^-+5sTa)l!PHf!-i>rAT7H^Kr<8hiVMV!@eKs~nZ5MnSoT%AfXv zk|Ar6PD%v%Y|*vH9FUjED8w%12=Bn0MRwsY_Tj@GobzQ!H!=j@$LzbhdJ`!w65=+> zt?ySup58##ts`j#EXnF1{$jy#SICTs@0c$(M-Q zU+{%2|ACWM7@n6VudwHTbnDadqqVp^XIv~OyJ(jLB>ibHD?b>>Qv$hShD43!exKkB zEBv9pw$m3=ANa8@24WBg=dLN~YnV9T;s9jfl2^LM|A0dm`r0q>T4=Y)mZ-xBWFq@B z#q2J9sz&kPYE$@%d)yrMK=^!>#%qV)trPFkMpupui1Iz)Ck}}S`DvR0 zed>R;+We=$|Hy#+P{dw(e=;yBS)900FRszqXEl$;4ZkDI65s!R=iJEA`H|}?tn6jqXz1AYtYPKq4j#i0*v;QJKF zN_ql7K-U0GCtv(|YcW)tHS#5w?_z75Raj#~-Tde+iq0sYbHLj1M`s1NC2Jt@^l=zI zm;*+?4Hg2glyr#X$ym>myfa7(K;cb1e8B~fgkyQiWfgO{uB(^M%2NE}OpMh)87Co!DSp{7L9Q)YXCX~52zW>{nR>4WL@KB7F zJZ7{0t_w~Rp`sU812~88-b?NKzqJ56hniC=Uy0s9G9g})p+Sr4Y>Rp>=8ChdZBV56 zh&Y7V5hLy?;{l3oykBL`!HTihjy~Tf^CLKmqHo8Toh6%zXQ_adhegu?*H+HEVkJgECXV;zrK+9u#EH3ftv*V2w%ea**EeG$5 zu|yzu;*$G|a;MwanN%Z$&4<8yA6Hp>L?iw6%{+lQbWyUsIlyd0wOdaE^L??JSmD>> z)F9+1S`!pO|J6?S7Yc@&!h3BEbt0Wo%@p?c3+8ITC$nOD|AYnV@TcdXPC*`*j^SBO zukAxXKbT5K9}CahteZ!qHaG|lu+DoFrZq>apzKdpT&@_C`fY}UUk6xR#YwmDlSzDS zzCd0P5$x4n;qh*lV-tI4^XFm&3yhaNj0@>5eh$h}SIZL?iY^w?%-U1q5V-ptGU)|w zHSfbS=`b2C>2NaN?KqV@82(W=;h#T)uU`8S5`21dMKC_054q@jpry%SH+}5?D(7vn zjuRKTv_^x|U7cD*u)H>2RdOl_oju6To8?3U`n|X7D!S*D%AcWVXWgez~BMjszMnFuG66r<@wM|YaPchIDBe-SMDWYw`@CHSH zfLsP+j*c%qC>BHA6vrChAgMIt@%IE0$_$iGcbiSjF}t{38JuPTG3cn4y;1RwK$}JY zs2rjk1^u(`04Yv#3Cy1-WxayASms7jOcax8ZW$X|9&9OBY0$!j|{}j7!RN!)nE}S9qAh zld1PsSCiB)e`(Z+So-6lYLg4%8%ktP+s-DBq>pBML*2I*Zos48u^sFzx122#kuA|q z6F6W&^bSjZnBciXjtJ$R(+;9HPsM^V?1YkRsq)vO=tKB=7uleew1ch#M7cJvTa`EO zx_HP(NRx7ED4+%YK2CqbAQ7Ym-=ppD{^Ij8Q}>}*e(Bq0YY#c6C&mtE6&FPNF?e5@ z=$4Y@{*<%gA z*V$Bom6f$}61E>-Gp40<*aRghN%l%+|M{~*r78Oe{Uj-^O?AntOxD{F2%qFs!G&Qe zEu}A0rY1NbPT3nI)Tj~E;)j=~zO%@Y41R~io@&F_JHE4PU6X8M6Cv_`%@RBi-a=Qp zlv&%n0^x`!%^A%d`AJKeXyvIUlp%BI-RAk@2nVwG@OxIFw>ob2Ti~5%L`vs(>ybYj zaijewbU5I=c0MKiwp5?|-aZ*QZ-&nec^0LV@MB{9%kdu*yd|oarG_m!aka}wGr?g_ zR`sd`wL6hBW?68f_tmFz__Ejw{BAO;un2_mvrhonFb?8g>$z^uW zNu>@_!S+dXUgUNYco{;4Q_8!E70IjJK&Mizwa-UgM>YTiBZK_bGxX!(K z`){E4Qa8Klx>?`^`p=oIt=nnc8da)j6u%^2D8H@w=&*Rho5+a8)kKS3JGz3y8M7Li z1VrwMVI$G~aOFM3*41511A3YGiyXnHwRE4GTGA(v%Pvm*2?>Cm-%!&3QQt>GsSL&e ziRUz?L;)z7yjSfeD7iIVNs9^HyET>G`%nY!s$ijm5{BPBTt-L` z{d>@$3kwD~=2JqJWK&exCJZkH&2=(=V$2t^-w=W&fmS6Sn#+~pQ^ zkGQ-Thd!a7nvf3+%y&n~9rm3ncg0aY_TAZ^ZKQ88II2kkE>5(y8DOxG4)ps?Z}GTTn9Fum^qpf#XeBJa$wOa9{K|$74xxWwpGHO=$`& zd$z+ozjtF$fc3+7lA-Rnl;s3j4HWhZGF){|fFH(c<&h-UM5ssgVONxd z%a*Pv8Nt{&pv=A;{P4|&yW0TUGg*rzq75+n3y8GM2!KqH!iA*~ELg{|x#soSMl%*V_32UBiSvGj9%_mJ)9|{=Fn&2J^$8i)60*g#40Yc=n}b@?7@Cy=R3ZcXJtN z=>giSI3M!iTi5Yp9Z_D+aU;}kt}yGtiHlQ@TsfGo>dDm zNJV@~)pYQdYV}4Y&^?5E&bx5^U!k<|c0s;IPyu^{L*~PqX^<{tN5 z`$DAHVtz=+E7&;(O{BW8LwNN18-TW=;*F|JxL)M*7~*rJJh{fRLB88;DzQ+#isGD9`$g4zhFEYt#`o^()!+Q+Ylf?H}c-kQlBr%-kN4rJS!-cIIH~mh9YHD z?*0p)fa^r~TSF-T=7Mj{B_mw+pfj)jmK-s_TPa=D(LfWSD5eo{Y7?KNB8LJ%u#RE# zt&FBhPycPURO_PlWppMN0`m{s>mr8gAKcUs9+Oc%q`vr^^;v(QVLL+8COuEaHIs2D z@T>~g&oxzuM78gn18nXz3nMk(06#*`+tT#m2ZHl%1}40-BTy2PKc#oh0j1NKF;?s= zU`A7W=x)P@z5*c%1rR?2UR;@LwAI+Az{IklD5iZ2DKEEs4P7_ysa_h<#9mVnS_k1A zQb!6iXHUx9qP*Eo0>Z&Y?d{xUDHa_aX83jci=zgCwYqPB1-=PTH@$PVS2kTrQ@vb_ z>@56Rh>m_7*c|&ss}c^$cm=V(_H1(BH+r&x@%0GGyZy3 zf@_J&@qmOW5pvF&A?jB#*z9znPM(2~oi9}Pxv96_LYcod=RKt~l}>oZcbs1QB=c~; z4t(=PhL%ipN=D~;h?Je2@aO7~G=dE{sg?8zW$FH^mnS1M@e$vC`4u%m#@(@VK3LRC ztId&&n|x92N7c5G^sR5~dnB6392Md7&uOfxO@CuT2Rdivsy+XR`QMYf%fUqA6MmB& z-j94f`Bz(tdUoXaLV;F`m-oYFoOFBm0I?6u+!{d3?GcOyizvq!nENHUk`(U7jeCWI zi33kt!vu)e7&B5^7xWC=CC}lk^0j1{Uk7?KF~jPA?Qh$iUa{y@0VgaMW*{)IFE?Qe#Rb1(Bb~I=Gm1RYffwgJ1rDghSu-UIE^4`h* zP+5M(fnVr(NU%li&-r<8@&}qhj{bI5(bvyS=s%26Op_C~ot$azSGsdH??tBaMjt*2 zX{QPOlYtwr-nKERaY`F^ftX$EHPREYkP8_tf5Jc!h>7j@`Y`~!cCIblxww}s)p&5| z;yojT_}g=Z8;G1KDHs;PLas8+niBxg_tlB;KhNU*TblkGJ)37V5zBSW=SzU@V1fcj zL#gp^24v&-k9(UF%~Sg#slJ5X%MHRcHCk8C`sa3cz{XD>x1BWjFEE@ue%zAM(L+G+ zPrlXAe~)RWJ|J5@Q$plhOBBOAkm@u2=NTt2#+gP2Sx#03Mu^S{LSaLOF49YbZ}8a_ z+LIMdbJcFf&2ygD$r&(n<}=$mQm01~fq@rajp{TXuHMzgH{MrZU|2+=;-xl%RIGwJ zd!Lqb7|e)OUtBxiL&GEYtfoKQ{A0^;_B_g>%_4*o!(+KJ&sL$8cgEr{@{~>JP#C0plD}Znw~Xzv6_2?PSeB}Vj%-tV@sSsl*Jr;3+0~yR-dee;o%rA zKyfH_Y}dIw>JA()P0p;5;`H@;eKpl4hG36x;7wrpECQH<}hD?vq)+0N21K4 zv`d}UOCw<$4H*s7I`sV z_?U8 z*K~eJ_k2peE)vS>xg*3KOEzVW5o_$}~GZrzsrI`8@3$Kzimlz;f&eZXFIR*ll`zrGHEqT`rejd%4@DRjWC@rSX zv7CUs9-5FrG!KC6yqcqA{P-DZ(#1}Jg~xn<7L>tt*QdO^I22i}Ewghdd~|M`S3wA* zzXUaERMlUvlDn+)Jl%{*lyH<&{R7emfZ93}#bV}Kx_rr}Dk&l6=#8XY68Z925lH-C za`Slds|7J@!I(~~ytHH`fvlXN3|QY5$T4OwBVw-PS3;SMrs5wetbIIb6dx?gj$%lX z$264x+(5jA!8s`^L((BJ?+u|7$A#gpPDA1jH)vBHS5=)&!GGrmOvj+=bOg=s8>L`r zp^0ae!3Mqab?K1Zr#}+B34Nc)V`Nnm;ccvd)x{emrxD&Oc%q}KRHf+(&k0M1pc~<# z3~?*LmnYs&|7P8gbQ4D}0)cP`{7Z79VU6OUK|m}}gyo#jIwFjUr*O<-Si2#{}d(lHt0F(T@d*WJ$bI}RJ#SOoV zA9}g%tcUj++w=>`ggO@#koY=z&J=-?$cUQI>kCm<9<2OMV{R}a zK1uv%B?*v9;{Vqi3VR90zAYdsi_COJucpB&QjzlB!+5`IqWx`&PDf8Jw zuYL=NaT92>>(^N%@5l9rCLQ8gpzk${4Q-W~9@Eq(Sfx##@yxHul)n`mKpGq^X-!4C zy_>r!Xzy!nIF+-r4CtKb_u8$9Nsb7`Vj%}UG&vOiE`|~yjXc>hElkH0l3`%iOvr;! z9W$!TJpF>d9`%(9C_or-5Q$hp6sfHPW0RB06oMRrJs1i{G1d)%)x=w zM}Khh-AcS!E+k|7D@}5`(m~tvup*z-O_s_L6?3nEq1m+o#bk)^*?!K;())VYp*ka+ zxo@zBv1QrsDP78Y)SRPFf`wgh&IU-V?n{o*WOcwh+Uq7h)bRUmyf2#jCL^r^{4zRW z76I4`A!Y;Oda=3t;nHz@oan0MX|9{J<&b^9vv;bul$A$4-n@u|Bo6e<=kz1bpq9iW zxQ%WT#qyafND;dguOtRw%kCq&-kPcJwv@Ay6NCoMM=39@s~^>XHh<_@E2n-9vg~R* z8;Xr~nvSc{r0Q_aaNxX$`nF>-Ku{VjZF6pJcq1+Uz_8@!gFG2la@p4@?|v_8x3>l! zNB=RN{pD5hP4$~}kT>h!@UtJrsJ3xQSx&(PGA7!vV#c6jN+*Q;AfwE;sgNGH0BCk) zjot6o5532#gC%-4v88&zuSUO{5>Z034J5A?m13ODGseqoCWRo>Y?ChUGTcqikKhA?X_%lNT?+%FOyN5qS;9!RqW^KGF89)G zN7QOMgurA~BaN%^uU1OElr5)zpN?mSm>&7}SX61UrUqs^*SP5W&x)!$2us8*k4WE@ zgIi{W2|tZc(b!$Jb}`SD8<{`G{&DCDt%kwl#nS3rs*GhTeyzG+MfigvXhGv66gS9$ zGtTa3V!J`IY39D4Z#oyB0s1l=N}GW7QE)RaH===;K~M!1gDNE2R5Ic8hVBsbZDl=! z@7IpJ-x+G)ytjadyeTw`#axRXT9;N1&3ky9fDPKLsLsZq9I{%01sIM$CKfd&K<+K> z@0R;+$KxJSY8)4!3VpO%|L*9fc4H5Z^Oo=4rPLa|w0e4{ea;&4&`7j#bNz8A&tYr7 z9=3GnsrxR$pdoMOQA+)qSt6{QMu?X<)+K?<&e>^alg}&Q-Sz5NAJ-U?w|a=mHns@2 z1oVCD-F-D0m~q})GS-%(Z_BLYmc^j9L&oDNwq8`{(=2Bn0Y8Sbh~Lcm?6sb+eME#( z?<@VJ%gVT@aY&)o0D4YilV6qpwQ%?-b-^eud)sFI4zhT*TbIX%Ihl{^zg&s_9=)yf z^*LD=)GVKf$l!3Afk92>TK=w2f#X1fLWpkah_DBm{X6FK4?|myu?Wsx`eyoae%@vS zDSk{DvyIvA98DC{V8##{<+GkQ?Ie~1*`$?~;b;Ry2kICxZrITTu%1scWTzn`R22m&%^XfBUuhHbLhtp28W=0H6`o-i!|<1x6|_MgopuE zwO>5dUM;v5pHT+{$T^8wC<5p&s>8xeek`yxCAA;knze@1o_t3E0~dciodR+|D&-)5 zw&nzlfBrwWeOodIC`u!Cz;+B*wvGVOezp?;^fU@pr8ETuO)Xt%n~xXQQid%F!p__Dh=uhIXWIUa720V$YtVe5%K6LXKjTEXu%5G>CXPq9?|$yT>XyPE zIy=GxlpwpdJ@RNEC7)_I2pq%w5OA;moF7et01aru%v9s3nt)WWN*xf?rAY7iW+9c_ z^71Cft>XkSi(%a&ojGN+;0&LpUf{wkwyXzvmaTp3H4?NYN?!^aO2xmyd}7x+eoxS3 zI4Y~z6ft{7s^guw(g4Jjxq#h@(#z2aKTj4|=p!t;xwBlg&R8wF0o8F$KX?d{uTEOz z`6(GPVKob-UNR5u1kQMXw%o~w*qgy0NR?BQOP7ucBWi|3rU980z8lY@ zX2h;{aWdWs2%Ekb)9nhMy%q9>e1Ml&VVhia zPX@EyEUR8fsyXo^9|F_4_aC*L%Z~*Ay?M`Kcr@8|!)&?Zqg_8)-QWuw-K`)F)#3oD zvK=41;_9sUZJBKCV}4|c)QKh-Q;#}3Iz&GRskMXQF4+plJXM<-JlIc!XxPi~pfYTj zBd<9I6l<~n=HNQCrwLLFSoz&|ugCScC6OMw-6M*JenS4#1&2>Uk1OWrq*E0)Hf+Ti z3II(?`ijN=ZzrpqPt(Qa4N*oMB4QnaLib2n%lnbS;fex0#IfZ7;Rn=Xz#0X3zkiYV zFIeqa4(ISxz0 zBxFK01>5HMD1FAiaLb|8Q#p~(cc)-XawVb2EDn=c@N)5&0?)SAl=&IkV@`dMj=Ob! zYN>Ca>Djhd*D11d(bg_?=i*?}r+0;eIbodS{E8mXd&zO^E5w1Bqn)0_#1Bc-K6gz% z9#&4M1KW1y#47M8dV4?ao(&K?U`n%HzjDD`2CkG~Zbtea?YghHC$8{F?+URp)tzSs zwaK(~Fw-NmjN4@$E8guW+(&#Jn`C35c-d_HH{p@;+nCoc9@*vPOm1Wn-(jmrFeaie z?h>$m`>Z==&^$Kb7R9sN*;4-%FZ|TZ+*wS++{{dq`4zb{Z^Hm2!)4cZpt5102JH76 z0oFV);yIBDwa22{zr}N@MLnnFbLvmCGa5I8Pc3yR=)hpVUy3?($@;JXKIX`caGD3A z^xDw)hNZyuH~R&5!cbEdmn2I2M#%?J$sqgC{G+4nvlmwkpL&!0cLm;LFho>-jNG!F z*g$m}UZU)pAi0<)yGJ9)2QiFQP5#s7N7Yt4;N^y^y{P5-D+AlAPIZ4Q#Oe~J{INe0 zNe1`Poj+4kci5it!u*`a25#^#oit!xz|Qa{#>?$a{(7gEw!hoc&zf~ltH+ZoFg+H9 zCl_$X-A0k)w#cx#D>|&$a=bs?)sqNeaq;DK{|Kk5MoPqnx6^lrsphfx$mM~E#$QX_ z{bkjI2!n^BI^$MM~n7SFz_ zvWjzOv^s(1oSyy2aNp0*MTNGY2OVazO90B z8Y!76x~`991Oz1PstU5Y1IV?gb&~{0=XQo4WT^_@)*}2IB|5*Kp3ZcC-kOp3%n0A6 zw{<6~gor|!ZKR>$z6E4}{u8MJ7$2)s-oPI9ktph8N@6;7CC_O$g)%%?dFpm})%V&> z(+!rNZ@Po6)GR`s*Q@&PNA;)Fqm>z&_hbD*21rlkE^Odd6wzFAq?nG_Li)DremX20FH1PcGzxcr_RLFeC$g1GU z{+!ZkURm9Kb+0aCTQEjK8fb>ZM@vByqpEnx%vY$gs@YmVL6gvpm>#&qEZAeW3-LNv zPAX|bTB`|peGn1q!Y^&U){Ol76f#9jdgRBt&ihH{AaG&ZJ+G7U2bV3;jklZ*1aJ$= z%dfk~hJP(;mBk80H%m6$G|A7rO&D7KT$7#5n!<^pOW1L5V9Is%61DK+xL4-&m#Lk8 zr@!x`DAk8at-s7_T_#4)s#8qyvGM$iQ#CagzB24Cf3B59BV{lZerElpF)dm(O|zf1 zi5(xS$aZ3?H1w+{!R%8xnD%vg{ zHI}^FYkc76lew1{H~UnzzcfIPh(8$nyw0D}zkgoYy%+eFya@u)FOF}!zuyzpDsxYI zk(86%#wC+HtIk*F6P@ugu%XO#ceR@3HKz>xAYo>y@ajCH{;A2_({2caw|v>6{ht4g zE(csW<)_m~IP&t&9fIYdg%<<_$_IiD_{vs`8#}XO4oc_gYRSEwK+nc--}hycWN{6M z$dwyPSw7Rh4Yl`P1UGhcbR>xvw0hCb*LG@?opr^W->L_-5?QT=?W*L_W;ZuWOZj66 z_vhO5T89x>D{TIJ7#eN=@S)oP(jtteqc+x1)WF|bzQhd48QFXZRZw^;eF;6^-|;t( z?_>z~0k5?UTsdl)9-zXPU7Anv`|Hc%_njH-#ft?aEqt%?DlP*&V?Zj3^78VIXG<2H zS8Qdv23#|uPr!M`R&>r~xg&^uaXNqgvXeGO>I)=wPeMlrnLkGva(}!?BBQl0-gvrS ztvAt_cHY~s`a4~x?vygK#d9*>ofvPcz1NAD4IhZ(`CiCU!T>6{;o{UmngI`_7)o69 zmKpx?)`l;UNj+kmgU9->SA*ofd7rB`qlapji1bW z`&YkN^<_QKi+up+j1S|d$z66`s-F#i#PjvbmoMH>*WgOj1<_JGi}La|bB@K#1s~6G# z2KQ&7BjeuNp@{vyzn)Lu73w{%$jy*^Q#XZ-;vr*g8)A=3{0yHnCOk zzmjpBf`Z%8YTQn?&(Z4K5iSzaCjTOq7yh=|bdo<5tjbVmQsY6ctStpLyBj?fJHM#C z)Tvq3qW1Lc=#fv@mGC%r_3-LXjb@Cr70?PNYs3sEO^rW#nC!g{cud$l@)%*+-+({> z!AShYFmGGj)v0cui>)A9tu&&vu!7II-dWvoe*e(akeL}(;qEhg5lm!hfw>g%-`T7M zwNkq+bJr-(|CQel5%ysQM7^)_^^d9BiA{yg$k=|J_~mP6=F|CI-ins3HYD$UMdy{Mxun<2qr=@OU_j2h z3tYmuO;5-;el+N}%g>wfd2F0lcBE=m3x1 z0j>n@h(rnp2%cVoie0mj8t9~PXw<#hlc1!0w(WfxjHEo6yg!VnlOEWxi)s(=e|a2Y z)ZLlR!Qx~q*jZ5mQ#Gwy469wO7GLV4WCwX&zn>s`Mb#@e{~7RFTvZNeO zS5JHyN$G<4R^_1IZomK)ff6M?qW^Cp(lD@i!f$N6^rbWvm}p%?6Yjjo(P1ym4%5Q% zNu?AnqbSUAq6(xhN~76VZx*?8`2ho-^Kq~|EUL6>EjRN6H8c1KN)A_7k}0C>?HYu|tp z{E3ku_$op0>;Rz22??0V{^!O2c@5nBf8GC|7ys+`|M$)R^TXbj*yAf3B<{v2$1aJSZwa-~cV;|0Xl_*eKTl-CgVY%*HKkG@vMpeSA z72TmPUX^}TU?@=GXAqG;8Qm?*@XF+qt}M4LEFF~D?>-&Ta};~hTFu?&e_;R2T{q>?(=zVlxFWN3 zBUkL+b#f{58|sZ8c*rqm*iG8rX2@_Q^GURoSd|#V0zS)FeneKpowb0Ol+1kk$6oE$ V%G + * Copyright (c) 2015 Steffen Baranowsky * * This file is part of LMMS - http://lmms.io * @@ -23,34 +24,55 @@ */ #include "EqParameterWidget.h" -#include "QPainter" -#include "qwidget.h" #include "lmms_math.h" -#include "MainWindow.h" -#include "QMouseEvent" #include "EqControls.h" +#include +#include +#include + EqParameterWidget::EqParameterWidget( QWidget *parent, EqControls * controls ) : QWidget( parent ), m_bands ( 0 ), - m_selectedBand ( 0 ) + m_displayWidth ( 400 ), + m_displayHeigth ( 200 ), + m_notFirst ( false ), + m_controls ( controls ) + { m_bands = new EqBand[8]; - resize( 250, 116 ); - // connect( Engine::mainWindow(), SIGNAL( periodicUpdate() ), this, SLOT( update() ) ); - QTimer *timer = new QTimer(this); - connect(timer, SIGNAL(timeout()), this, SLOT(update())); - timer->start(100); - float totalLength = log10( 21000 ); - m_pixelsPerUnitWidth = width( ) / totalLength ; - float totalHeight = 80; - m_pixelsPerUnitHeight = (height() - 4) / ( totalHeight ); - m_scale = 1.5; + resize( m_displayWidth, m_displayHeigth ); + float totalHeight = 36; // gain range from -18 to +18 + m_pixelsPerUnitHeight = m_displayHeigth / totalHeight; m_pixelsPerOctave = freqToXPixel( 10000 ) - freqToXPixel( 5000 ); - m_controls = controls; - tf = new TextFloat(); - tf->hide(); + //GraphicsScene and GraphicsView stuff + m_scene = new QGraphicsScene(); + m_scene->setSceneRect( 0, 0, m_displayWidth, m_displayHeigth ); + m_view = new QGraphicsView(this); + m_view->setStyleSheet( "border-style: none; background: transparent;"); + m_view->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); + m_view->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); + m_view->setScene( m_scene ); + + //adds the handles + m_handleList = new QList; + for ( int i = 0; i < bandCount(); i++ ) + { + m_handle = new EqHandle ( i, m_displayWidth, m_displayHeigth ); + m_handleList->append( m_handle ); + m_handle->setZValue(1); + m_scene->addItem( m_handle ); + } + + //adds the curve widget + m_eqcurve = new EqCurve( m_handleList, m_displayWidth, m_displayHeigth ); + m_scene->addItem( m_eqcurve ); + for ( int i = 0; i < bandCount(); i++ ) + { + // if the data of handle position has changed update the models + QObject::connect( m_handleList->at( i ) ,SIGNAL( positionChanged() ), this ,SLOT( updateModels() ) ); + } } @@ -58,7 +80,7 @@ EqParameterWidget::EqParameterWidget( QWidget *parent, EqControls * controls ) : EqParameterWidget::~EqParameterWidget() { - if(m_bands) + if( m_bands ) { delete[] m_bands; m_bands = 0; @@ -68,174 +90,122 @@ EqParameterWidget::~EqParameterWidget() -void EqParameterWidget::paintEvent( QPaintEvent *event ) +void EqParameterWidget::updateView() { - QPainter painter( this ); - //Draw Frequecy maker lines - painter.setPen( QPen( QColor( 100, 100, 100, 200 ), 1, Qt::SolidLine, Qt::RoundCap, Qt::BevelJoin ) ); - for( int x = 20 ; x < 100; x += 10) - { - painter.drawLine( freqToXPixel( x ) , 0, freqToXPixel( x ) , height() ); - } - for( int x = 100 ; x < 1000; x += 100) - { - painter.drawLine( freqToXPixel( x ) , 0, freqToXPixel( x ) , height() ); - } - for( int x = 1000 ; x < 11000; x += 1000) - { - painter.drawLine( freqToXPixel( x ) , 0, freqToXPixel( x ) , height() ); - } - //draw 0dB line - painter.drawLine(0, gainToYPixel( 0 ) , width(), gainToYPixel( 0 ) ); - for( int i = 0 ; i < bandCount() ; i++ ) { - m_bands[i].color.setAlpha( m_bands[i].active->value() ? activeAplha() : inactiveAlpha() ); - painter.setPen( QPen( m_bands[i].color, 1, Qt::SolidLine, Qt::RoundCap, Qt::BevelJoin ) ); - float x = freqToXPixel( m_bands[i].freq->value() ); - float y = height() * 0.5; - float gain = 1; - if( m_bands[i].gain ) + if ( m_handleList->at( i )->getHandleMoved() == false ) //prevents a short circuit between handle and data model { - gain = m_bands[i].gain->value(); - } - y = gainToYPixel( gain ); - float bw = m_bands[i].freq->value() * m_bands[i].res->value(); - m_bands[i].x = x; m_bands[i].y = y; - const int radius = 7; - painter.drawEllipse( x - radius , y - radius, radius * 2 ,radius * 2 ); - QString msg = QString ( "%1" ).arg ( QString::number (i + 1) ); - painter.drawText(x - ( radius * 0.5 ), y + ( radius * 0.85 ), msg ); - painter.setPen( QPen( m_bands[i].color, 1, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin ) ); - if( i == 0 || i == bandCount() - 1 ) - { - painter.drawLine(x , y, x, y - (m_bands[i].res->value() * 4 ) ); + //sets the band on active if a fader or a knob is moved + bool hover= false; // prevents an action if handle is moved + for ( int j = 0; j < bandCount(); j++ ) + { + if ( m_handleList->at(j)->isMouseHover() ) hover = true; + } + if ( !hover ) + { + if ( sender() == m_bands[i].gain ) m_bands[i].active->setValue( true ); + if ( sender() == m_bands[i].freq ) m_bands[i].active->setValue( true ); + if ( sender() == m_bands[i].res ) m_bands[i].active->setValue( true ); + } + + changeHandle(i); } else { - painter.drawLine(freqToXPixel(m_bands[i].freq->value()-(bw * 0.5)),y,freqToXPixel(m_bands[i].freq->value()+(bw * 0.5)),y); + m_handleList->at( i )->setHandleActive( m_bands[i].active->value() ); + m_handleList->at( i )->setHandleMoved( false ); } } + + m_notFirst = true; + if ( m_bands[0].hp12->value() ) m_handleList->at( 0 )->sethp12(); + if ( m_bands[0].hp24->value() ) m_handleList->at( 0 )->sethp24(); + if ( m_bands[0].hp48->value() ) m_handleList->at( 0 )->sethp48(); + if ( m_bands[7].lp12->value() ) m_handleList->at( 7 )->setlp12(); + if ( m_bands[7].lp24->value() ) m_handleList->at( 7 )->setlp24(); + if ( m_bands[7].lp48->value() ) m_handleList->at( 7 )->setlp48(); } -void EqParameterWidget::mousePressEvent( QMouseEvent *event ) +void EqParameterWidget::changeHandle( int i ) { - m_oldX = event->x(); m_oldY = event->y(); - m_selectedBand = selectNearestHandle( event->x(), event->y() ); - m_mouseAction = none; - if ( event->button() == Qt::LeftButton ) m_mouseAction = drag; - if ( event->button() == Qt::RightButton ) m_mouseAction = res; + //fill x, y, and bw with data from model + float x = freqToXPixel( m_bands[i].freq->value() ); + float y = m_handleList->at( i )->y(); + //for pass filters there is no gain model + if( m_bands[i].gain ) + { + float gain = m_bands[i].gain->value(); + y = gainToYPixel( gain ); + } + float bw = m_bands[i].res->value(); + + // set the handle position, filter type for each handle + switch ( i ) + { + case 0 : + m_handleList->at( i )->setType( highpass ); + m_handleList->at( i )->setPos( x, m_displayHeigth/2 ); + break; + case 1: + m_handleList->at( i )->setType( lowshelf ); + m_handleList->at( i )->setPos( x, y ); + break; + case 2: + m_handleList->at( i )->setType( para ); + m_handleList->at( i )->setPos( x, y ); + break; + case 3: + m_handleList->at( i )->setType( para ); + m_handleList->at( i )->setPos( x, y ); + break; + case 4: + m_handleList->at( i )->setType( para ); + m_handleList->at( i )->setPos( x, y ); + break; + case 5: + m_handleList->at( i )->setType( para ); + m_handleList->at( i )->setPos( x, y ); + break; + case 6: + m_handleList->at( i )->setType( highshelf ); + m_handleList->at( i )->setPos( x, y ); + break; + case 7: + m_handleList->at( i )->setType( lowpass ); + m_handleList->at( i )->setPos( QPointF( x, m_displayHeigth/2 ) ); + break; + } + + // set resonance/bandwidth for each handle + if ( m_handleList->at( i )->getResonance() != bw ) + { + m_handleList->at( i )->setResonance( bw ); + } + + // and the active status + m_handleList->at( i )->setHandleActive( m_bands[i].active->value() ); + m_handleList->at( i )->update(); + m_eqcurve->update(); } -void EqParameterWidget::mouseReleaseEvent( QMouseEvent *event ) +void EqParameterWidget::updateModels() { - m_selectedBand = 0; - m_mouseAction = none; - const int inXmin = 228; - const int inXmax = 250; - const int inYmin = 20; - const int inYmax = 30; - - const int outXmin = 228; - const int outXmax = 250; - const int outYmin = 30; - const int outYmax = 40; - - if(event->x() > inXmin && event->x() < inXmax && event->y() > inYmin && event->y() < inYmax ) + for ( int i=0 ; i < bandCount(); i++ ) { - m_controls->m_analyseIn = !m_controls->m_analyseIn; + m_bands[i].freq->setValue( xPixelToFreq( m_handleList->at(i)->x() ) ); + if( m_bands[i].gain ) m_bands[i].gain->setValue( yPixelToGain( m_handleList->at(i)->y() ) ); + m_bands[i].res->setValue( m_handleList->at( i )->getResonance() ); + //sets the band on active if the handle is moved + if ( sender() == m_handleList->at( i ) ) m_bands[i].active->setValue( true ); } - - if(event->x() > outXmin && event->x() < outXmax && event->y() > outYmin && event->y() < outYmax ) - { - m_controls->m_analyseOut = !m_controls->m_analyseOut; - } - - tf->hide(); -} - - - - -void EqParameterWidget::mouseMoveEvent( QMouseEvent *event ) -{ - int deltaX = event->x() - m_oldX; - int deltaR = event->y() - m_oldY; - m_oldX = event->x(); m_oldY = event->y(); - if(m_selectedBand && m_selectedBand->active->value() ) - { - switch ( m_mouseAction ) { - case none : - break; - case drag: - if( m_selectedBand->freq ) m_selectedBand->freq->setValue( xPixelToFreq( m_oldX ) ); - if( m_selectedBand->gain )m_selectedBand->gain->setValue( yPixelToGain( m_oldY ) ); - break; - case res: - if( m_selectedBand->res )m_selectedBand->res->incValue( ( deltaX) * resPixelMultiplyer() ); - if( m_selectedBand->res )m_selectedBand->res->incValue( (-deltaR) * resPixelMultiplyer() ); - break; - default: - break; - } - } - if( m_oldX > 0 && m_oldX < width() && m_oldY > 0 && m_oldY < height() ) - { - tf->setText( QString::number(xPixelToFreq( m_oldX )) + tr( "Hz ") ); - tf->show(); - const int x = event->x() > width() * 0.5 ? - m_oldX - tf->width() : - m_oldX; - tf->moveGlobal(this, QPoint( x, m_oldY - tf->height() ) ); - } -} - - - - -void EqParameterWidget::mouseDoubleClickEvent( QMouseEvent *event ) -{ - EqBand* selected = selectNearestHandle( event->x() , event->y() ); - if( selected ) - { - selected->active->setValue( selected->active->value() ? 0 : 1 ); - } -} - - - - -EqBand* EqParameterWidget::selectNearestHandle( const int x, const int y ) -{ - EqBand* selectedModel = 0; - float* distanceToHandles = new float[bandCount()]; - //calc distance to each handle - for( int i = 0 ; i < bandCount() ; i++ ) - { - int xOffset = m_bands[i].x - x; - int yOffset = m_bands[i].y - y; - distanceToHandles[i] = fabs( sqrt( ( xOffset * xOffset ) + ( yOffset * yOffset ) ) ); - } - //select band - int shortestBand = 0; - for ( int i = 1 ; i < bandCount() ; i++ ) - { - if ( distanceToHandles [i] < distanceToHandles[shortestBand] ){ - shortestBand = i; - } - } - if(distanceToHandles[shortestBand] < maxDistanceFromHandle() ) - { - selectedModel = &m_bands[shortestBand]; - } - delete[] distanceToHandles; - return selectedModel; + m_eqcurve->update(); } diff --git a/plugins/Eq/EqParameterWidget.h b/plugins/Eq/EqParameterWidget.h index eb83ec962..c503858aa 100644 --- a/plugins/Eq/EqParameterWidget.h +++ b/plugins/Eq/EqParameterWidget.h @@ -2,6 +2,7 @@ * eqparameterwidget.cpp - defination of EqParameterWidget class. * * Copyright (c) 2014 David French +* Copyright (c) 2015 Steffen Baranowsky * * This file is part of LMMS - http://lmms.io * @@ -26,8 +27,13 @@ #ifndef EQPARAMETERWIDGET_H #define EQPARAMETERWIDGET_H #include +#include +#include +#include #include "EffectControls.h" #include "TextFloat.h" +#include "EqCurve.h" + class EqControls; @@ -40,6 +46,12 @@ public : FloatModel* res; FloatModel* freq; BoolModel* active; + BoolModel* hp12; + BoolModel* hp24; + BoolModel* hp48; + BoolModel* lp12; + BoolModel* lp24; + BoolModel* lp48; QColor color; int x; int y; @@ -58,6 +70,10 @@ class EqParameterWidget : public QWidget public: explicit EqParameterWidget( QWidget *parent = 0, EqControls * controls = 0); ~EqParameterWidget(); + QList *m_handleList; + + void changeHandle(int i); + const int bandCount() { return 8; @@ -65,13 +81,6 @@ public: - const int maxDistanceFromHandle() - { - return 20; - } - - - EqBand* getBandModels( int i ) { @@ -79,88 +88,65 @@ public: } - - - const int activeAplha() - { - return 200; - } - - - - - const int inactiveAlpha() - { - return 100; - } - - - - - const float resPixelMultiplyer() - { - return 100; - } - - -signals: - -public slots: - -protected: - virtual void paintEvent ( QPaintEvent * event ); - virtual void mousePressEvent(QMouseEvent * event ); - virtual void mouseReleaseEvent(QMouseEvent * event); - virtual void mouseMoveEvent(QMouseEvent * event); - virtual void mouseDoubleClickEvent(QMouseEvent * event); - private: + EqBand *m_bands; + int m_displayWidth, m_displayHeigth; + bool m_notFirst; EqControls *m_controls; + + QGraphicsView *m_view; + QGraphicsScene *m_scene; + EqHandle *m_handle; + EqCurve *m_eqcurve; + float m_pixelsPerUnitWidth; float m_pixelsPerUnitHeight; float m_pixelsPerOctave; float m_scale; - EqBand* m_selectedBand; - TextFloat *tf; - - EqBand* selectNearestHandle( const int x, const int y ); - - enum MouseAction { none, drag, res } m_mouseAction; - int m_oldX, m_oldY; - int *m_xGridBands; - inline int freqToXPixel( float freq ) + + + inline float freqToXPixel( float freq ) { - return ( log10( freq ) * m_pixelsPerUnitWidth * m_scale ) - ( width() * 0.5 ); + float min = log ( 27) / log( 10 ); + float max = log ( 20000 )/ log( 10 ); + float range = max - min; + return ( log( freq ) / log( 10 ) - min ) / range * m_displayWidth; } - inline float xPixelToFreq( int x ) + + inline float xPixelToFreq( float x ) { - return pow( 10, ( x + ( width() * 0.5 ) ) / ( m_pixelsPerUnitWidth * m_scale ) ); + float min = log ( 27 ) / log( 10 ); + float max = log ( 20000 ) / log( 10 ); + float range = max - min; + return pow( 10 , x * ( range / m_displayWidth ) + min ); } - inline int gainToYPixel( float gain ) + inline float gainToYPixel( float gain ) { - return ( height() - 3) - ( gain * m_pixelsPerUnitHeight ) - ( (height() -3 ) * 0.5); + return m_displayHeigth - ( gain * m_pixelsPerUnitHeight ) - ( m_displayHeigth * 0.5 ); } - inline float yPixelToGain( int y ) + inline float yPixelToGain( float y ) { - return ( ( 0.5 * height() ) - y) / m_pixelsPerUnitHeight; + return ( ( 0.5 * m_displayHeigth ) - y ) / m_pixelsPerUnitHeight; } +private slots: + void updateModels(); + void updateView(); }; - #endif // EQPARAMETERWIDGET_H diff --git a/plugins/Eq/EqSpectrumView.h b/plugins/Eq/EqSpectrumView.h index 306937399..1d9ad5ea2 100644 --- a/plugins/Eq/EqSpectrumView.h +++ b/plugins/Eq/EqSpectrumView.h @@ -23,13 +23,13 @@ #ifndef EQSPECTRUMVIEW_H #define EQSPECTRUMVIEW_H -#include "qpainter.h" -//#include "eqeffect.h" -#include "qwidget.h" +#include +#include #include "fft_helpers.h" #include "Engine.h" + const int MAX_BANDS = 2048; class EqAnalyser @@ -54,7 +54,7 @@ public: m_active ( true ) { m_inProgress=false; - m_specBuf = (fftwf_complex *) fftwf_malloc( ( FFT_BUFFER_SIZE + 1 ) * sizeof( fftwf_complex ) ); + m_specBuf = ( fftwf_complex * ) fftwf_malloc( ( FFT_BUFFER_SIZE + 1 ) * sizeof( fftwf_complex ) ); m_fftPlan = fftwf_plan_dft_r2c_1d( FFT_BUFFER_SIZE*2, m_buffer, m_specBuf, FFTW_MEASURE ); clear(); } @@ -121,6 +121,8 @@ public: ( int )( LOWEST_FREQ * ( FFT_BUFFER_SIZE + 1 ) / ( float )( m_sr / 2 ) ), ( int )( HIGHEST_FREQ * ( FFT_BUFFER_SIZE + 1) / ( float )( m_sr / 2 ) ) ); m_energy = maximum( m_bands, MAX_BANDS ) / maximum( m_buffer, FFT_BUFFER_SIZE ); + + m_framesFilledUp = 0; m_inProgress = false; m_active = false; @@ -139,16 +141,20 @@ public: QWidget( _parent ), m_sa( b ) { - setFixedSize( 250, 116 ); + setFixedSize( 400, 200 ); QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(update())); - timer->start(2000); + timer->start(100); setAttribute( Qt::WA_TranslucentBackground, true ); m_skipBands = MAX_BANDS * 0.5; - float totalLength = log10( 21000); - m_pixelsPerUnitWidth = width( ) / totalLength ; + float totalLength = log10( 20000 ); + m_pixelsPerUnitWidth = width( ) / totalLength ; m_scale = 1.5; color = QColor( 255, 255, 255, 255 ); + for ( int i=0 ; i < MAX_BANDS ; i++ ) + { + m_bandHeight.append( 0 ); + } } @@ -168,7 +174,7 @@ public: { m_sa->m_active = isVisible(); const int fh = height(); - const int LOWER_Y = -60; // dB + const int LOWER_Y = -36; // dB QPainter p( this ); p.setPen( QPen( color, 1, Qt::SolidLine, Qt::RoundCap, Qt::BevelJoin ) ); const float e = m_sa->m_energy; @@ -183,13 +189,28 @@ public: } pp = QPainterPath(); float * b = m_sa->m_bands; - int h; + float h; pp.moveTo( 0,height() ); for( int x = 0; x < MAX_BANDS; ++x, ++b ) { - h = (int)( fh * 2.0 / 3.0 * ( 20 * ( log10 ( *b / e ) ) - LOWER_Y ) / (-LOWER_Y ) ); - if( h < 0 ) h = 0; else if( h >= fh ) continue; - pp.lineTo( freqToXPixel(bandToFreq( x ) ), fh-h ); + h = ( fh * 2.0 / 3.0 * ( 20 * ( log10( *b / e ) ) - LOWER_Y ) / (-LOWER_Y ) ); + if( h < 0 ) + { + h = 0; + } + else if( h >= fh ) + { + continue; + } + if (h > m_bandHeight.at(x)) + { + m_bandHeight[x] = h; + } + else + { + m_bandHeight[x] = m_bandHeight[x] -1; + } + pp.lineTo( freqToXPixel( bandToFreq( x ) ), fh - m_bandHeight.at( x ) ); } pp.lineTo( width(), height() ); pp.closeSubpath(); @@ -205,21 +226,29 @@ public: return ( log10( band - m_skipBands ) * m_pixelsPerUnitWidth * m_scale ); } + + + inline float bandToFreq ( int index ) { return index * m_sa->m_sr / (MAX_BANDS * 2 ); } - inline int freqToXPixel( float freq ) + + + inline float freqToXPixel( float freq ) { - return ( log10( freq ) * m_pixelsPerUnitWidth * m_scale ) - ( width() * 0.5 ); + float min = log ( 27) / log( 10 ); + float max = log ( 20000 )/ log( 10 ); + float range = max - min; + return ( log( freq ) / log( 10 ) - min ) / range * width(); } + private: float m_pixelsPerUnitWidth; float m_scale; int m_skipBands; + QList m_bandHeight; } ; - - #endif // EQSPECTRUMVIEW_H diff --git a/plugins/Eq/artwork.png b/plugins/Eq/artwork.png deleted file mode 100644 index 33fa4960defbf65b02db84e0b812bec717e4e0c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27905 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%0A?-KV-lr7 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 Hu0mjf8ekH` diff --git a/plugins/Eq/bandLabel1.png b/plugins/Eq/bandLabel1.png new file mode 100644 index 0000000000000000000000000000000000000000..402a9f3ab38dc7d9493916512ba6a5caf356aaf5 GIT binary patch literal 413 zcmV;O0b>4%P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{009L_L_t(o!|j#JYQr!PMeo>> zZJCC;c~G)#z9sbkKOkL%G|-Y}YdtJa7l9_wP32mK7M-O)9PXWw4I~nYL?V$0g0|ad zo=PSF;AyjoE_&JRkWE?Rq%tw|;%s(@)p7wM!r}D@W9;}cDJ7PRIqF&g0KE4<5(UZ1 zqCnH!qplUQ?ApGycKjOG>qq2y{_VVN_4o^7t%Y+Ar;jtVz6!K9<0pH2KcVY75E14N z4FG_dp-qHj-g^)cib8(POdA8{i0@1(HK@X2vZ}n1>A148yvX{#58A|FnUn%TTz1Mi z2WE~ZtEy`7yne zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00A*cL_t(o!|jznOT$1IhkuvU zpodmU{hP!n26QWQ(W$r?Tpaywj)I%Jn>hIe1XnAl@!BdynlzZGxj0yi;?!^#Q0|$I zgYew@%lqB|3WY+UP$#i$ZbklA_D>KGYWtE~IHXDoBZ8^|&9mgkE zV7*AZY_2{9Z)Xjw_ACJ4^({r`F%nyuxipQf<}x~Dh7iC_Ev zLm<9E`p+?fFv0o7E$&$^xMQLC201;u#vq762tjMx0swH%!8)P%$_7CKfM8*s!Z1G1 z*n5ibo@Vmq%rUEZgnlS@sBLrRYyJJ-Ns+CLWSn#OOk!pA+9W77M&0>>I7#KnenvQy zdlB1Kwa_pZk~voK<{0}TK0LboJMY>5m6gf|oIqMVuPB%V00000NkvXXu0mjf(fPb9 literal 0 HcmV?d00001 diff --git a/plugins/Eq/bandLabel2.png b/plugins/Eq/bandLabel2.png new file mode 100644 index 0000000000000000000000000000000000000000..dfcbadb686f354889dd3ff1db3152cdc695d49ac GIT binary patch literal 487 zcmVe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00B=)L_t(o!|j#ZPQpMChCkSr z7Ge+dfT!q%J`3^v9{>{(l(W!Er7fjiC`MyE5Ec?mzsudp{5z9>W}%>i%7P$7(<+Qc6XsEbu4|keAHBS|T#_p`k0KVGm@LZx zh~wn#ZV|`w-MAJ4aGW{-d7kqynaX$L8sBpg2$EuTK;`?Ph}*#sQw^l4Tj)yB=wp z?q*%7ih}#Goxl5^ d{a>-Y@(i_`Y-pJ6eGmWu002ovPDHLkV1jpP&aD6d literal 0 HcmV?d00001 diff --git a/plugins/Eq/bandLabel2on.png b/plugins/Eq/bandLabel2on.png new file mode 100644 index 0000000000000000000000000000000000000000..62c668c0031d3267ca4409c93cfd3248c2b96dfd GIT binary patch literal 544 zcmV+*0^j|KP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00D?eL_t(o!|jzxFGEojfIm;4 zYU62Hw5p+au@F*0NJLDDB1j|_Hn#o}OLlf*BeCd0f(3~XO$gT+q?c(b3V-$%q_}r!S?I%m7fOs#zBW4i1pCETg6}LngsaheA`m zow8B|vq>g=|HSJ08NS_1v9jK-3L4!dpU#SlObmEb46?+AFDR~zmO|sVcWo_Bu`k=& z4&ksBu()!>?*0wsPKD9o8USR2Bv$4R+;Vo|BN|Hpa2|}k-vvW4vE7(T@h$@BY%2#K znM|>~b|StT0VE0fyQ^^5+IV?MGVk5z_%tG3rWE8cGFXknt`H7CGPmI8;+G}NNT#~1 z4E3p)@@0J6A-qe6BoaySL*3}M)6?PN`T3RE`91uByXeWv#6+S`OiXS5z4cq0o#e^6X%l49AZcZlWtJZkd>rmSm2q-< i6OsJi&r?&Grn~{RdT{|nDDLn80000P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00B@*L_t(o!|jz_Z-OushTo0~ z<)a8r7v1jWZ!!D-KfqmVyPOIYkbf1$=K|dm1PBWRM-~<+V%*>JUl%v003HRv$Co>psEhgT7yyw zpRul&i@jM{nkJZ}$yrS)h21XeE$h8A&vk#)q?ElySIOL8WI+(%ev+DhXK(Kx-M+># zNBSLU7zWsEcjhk$Ap}Y(WO?4z9LF&eBOwG2vnd$!KnMWe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00DtXL_t(o!|jzzOF}^ufWNN! zsCc6|uYSu9naNzE; z(rhuHppd;OvU8B;_#`J*wzSZX#bT(4$xaip(}b~6M>ujNu8il&$EvyDNW0jRoyKk{ z7D^mNv)nzrAUjPgFZuycP{hjO7x%<3?g20vwRFnnkKFcNTC8j`=wf2bRS|oBDY3bg zBpgYLefn*!Oe@Y!6+s8Ld`AlE7|jU~c+zaA$KxF=h1iwcvkW)d)vYVq}Bf z>XLG~%tkm#G#YNu=_B^FRB) bvYPS+@iJ{oR1YI900000NkvXXu0mjft1{#9 literal 0 HcmV?d00001 diff --git a/plugins/Eq/bandLabel4.png b/plugins/Eq/bandLabel4.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c9b6e035f79b3cf92db5a1b6f62846f58688b1 GIT binary patch literal 467 zcmeAS@N?(olHy`uVBq!ia0vp^(m<@i!3HGxts29C6kC$Fy9>jA5L~c#`DCC7XMsm# zF#`j)FbFd;%$g$s6l5>)^mS#w&ne5J#G`&t3S@v}iEBiObAE1aYF-J0b5UwyNotBh zd1gt5g1e`0KzJjcI0FNtwWo_?NW|f{QxE1fIf%IS^PDkQ7PdO9F?8|$q+kE#6DHr9 zrRQ_ht0}={SB6t=mXgM#We?YIBwBpFSIZL+3;`X-Qa;THQ#EFEd;IaLtN&$9x2d^n zLel2#y&zJtt~oW5;mq@Vm%^BRK3<)#c?^9S57h0q*R=9hTYBWPOv}f)4s)DCER0VZ zeY~T1$l%7?NpI?Qbe@{ZsrVsAT#@D9tHS7Eerl@>_eFxBOBO2G2=Tt{*e; zEu6#X<$2BVz@_+wOU|?@-^)Aw``oX+dQsVj3JxcI%Sb z9QjpXacISbTZfFI?x*{697Hl=?TD_|G2%Y*quqn!(f6&t;uc GLK6Vln8#cI literal 0 HcmV?d00001 diff --git a/plugins/Eq/bandLabel4on.png b/plugins/Eq/bandLabel4on.png new file mode 100644 index 0000000000000000000000000000000000000000..22f99e626265e0c44fc9f57dd0de58d813d47d47 GIT binary patch literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^(m<@i!3HGxts29C6kC$Fy9>jA5L~c#`DCC7XMsm# zF#`j)FbFd;%$g$s6l5>)^mS#w&ne5JBw;Ikt{NyLS>hT|;+&tGo0?a`;9QiNSdyBe zP@Y+mq2TW68xY>eC(gjYSnBEG7!q;#?bP$$hZ1Ct$*206XGZyU7b#VqkbPzULd3bF zZid1m`!sibS?g;nITkewPL$>G=bp2R$3ItU$(B-qXNrq%K3h;R|MB;ywf66S*WUYH z$*2Sdi&j3FykyNw(H^FTttC~@7N|$I-9K$s#kIK3+VIpxjb|=r+$9+fd_1XqYt=hD zopZ)Ok(Nj)1_LR{fZe-(t4DWj)R67sXk`jpd--ajgkJSAeFF`-9>?bG3q!+i&Dt%l za)>qXRCmHnhP-znCA(^~*Su8g;rkJIVp|LLCzu4OvSk)dT=^#ByV N44$rjF6*2Ung9UE+!6o) literal 0 HcmV?d00001 diff --git a/plugins/Eq/bandLabel5.png b/plugins/Eq/bandLabel5.png new file mode 100644 index 0000000000000000000000000000000000000000..b1d942333f541bdbb9ff5a04e23dc36c6d8f3e39 GIT binary patch literal 458 zcmV;*0X6=KP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00A;dL_t(o!|j#rO2aS|hTkTK zexzwvnVUlq#a+wr{x4uE(}^NXXkELuwDE`F2ClkdT2S)*Jt zdR~k%MA1NR^pyf`?-t;k!*OgJMFY65`(tQ+mBy;7kfs@)o?o^*CF=GMvYW!XuJy?* z%fje*_?bK+j`3*N`hFdBW`UFl!vJ9z?5)RfqOY?cl#R7GPOwf>eVwgVuLz`se zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00C=BL_t(o!|j#9O9DX{#oxN? zY-)}hsf!|ME+r}kK}67{Ll)5~=-8oae@&;LQ-_XSy7doqtAj)+6>1)Way3b61+{Iv z=|!PncA=Qxao)h=y>Ivi;BYt`4u|tAgnWL}a>`5sfTX6`Zd9#Q;BvA?N6n<4UJOtf z2m6a7wfB!Mj!p{fl4)^etoEWCY->y=#+yCY4R$q3qJWtg1pqW#9h{yO(d(J^JP<80 z1>zO~01BPJ&ej~lL61FV>G|nlO38)UxPraiEEG!Enn|KCa$bZ;SXqj)efpoKg~Q`( zcs*`JR3BECV~D7e0DyQbz`jPy0*p={<;ORiUpx%Xsh`-pK}>VFx4Ydhc4jgWvAv#z z8uCIE1t^qYV=Xbz>kWh5%rdDUa+xr4nea&crl_+^wvY~v)ox2V?#eB8$u6&+kWGaU zRehj-8U4PAMze!LQAg?imF?EA*4n7n+JEyu`@d$6@(n80RX0|Bdz=6O002ovPDHLk FV1oXg)&~Fp literal 0 HcmV?d00001 diff --git a/plugins/Eq/bandLabel6.png b/plugins/Eq/bandLabel6.png new file mode 100644 index 0000000000000000000000000000000000000000..a574db58532369f853376c5ee28637403f5f2973 GIT binary patch literal 525 zcmV+o0`mQdP)@02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00DJLL_t(o!|j#bPQpMCh0k`k zrL=%;MJmQv`loqB=cClW6{(()ayYjGR8t-;-r@Zhi%)ankIBzfO8H2cz$_R2h$jX=ecM! z>R^oR)zU0e=SIWSnH~} z0fkY7!C-Wr2B}mGSXLDPKt$jg$Nk+c7-Lv2mzahT;y6(QtJiAV2GKOwwzU_pX__EO zn9b+EpEJ{}eESjCbJRE!`nLN9!x55X1}Pwp29HNT<^vvrBt(B z?aq(uTzssRhUVqv=6-g>Kp*8SjuW`WHK=jiv};J6NK%YqObM1(ZUF!|y~PToN%&k+P;1i|?4oM-e P00000NkvXXu0mjfsY=|v literal 0 HcmV?d00001 diff --git a/plugins/Eq/bandLabel6on.png b/plugins/Eq/bandLabel6on.png new file mode 100644 index 0000000000000000000000000000000000000000..f67a2517a50bff49fa82d77a75f79dc9120856c4 GIT binary patch literal 605 zcmV-j0;2tiP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00G5GL_t(o!|j#LOB+ELhacD7 zux3}2t`^Zot*(+54=uEyp@R{Qf7}?AN(-UoM?(+O) z3deE9ACTT|jlqF10JiO-1r?sm-$qs>ip45xZ@2mIIWI;w8twANiXt(5{fhV8)2%Zb zAEsKXlT7XZ{XOfCbo_CX$yh{8vUWY-jh9wZeEd?NQgMim7|g{-0O&MSF)~Ft37>ek zgH!+6x0Byb%2u-*V%pWO_h;-*FS0D51r?_64|((1?17kMpS~7}-Mt3D#CRVQ<9)xq z^E#0elkC-6mVBXd=9=reyjb}`I#Uvp%(Ch%EWYR7ScDsMuGgTslfVUvcL)Fg02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00AaRL_t(o!|j#bPQpMCM$b~p zRxHpKMWT1|EX4PJ08CWG%AW?>CY1hoVM4+UmfCHi*>knYe#yyBW@bU7(P%Up%~^=? z_#v-L)&#g8jg*TXCleZVma$e@vq;Esdh|W_WF`zF{P+3qUnX0vA2Yk%u9`AhmOOdC z-|yLMgKEn7^gKPD7a_R29U`S9NfKr=pEOOYZ;(9C8Qu(#Qj%pEZ~mO5fT)zL@42+w z7XU1lE8;j-)B2Vrahx6iK@buIp_(}pLNK_#LI^>crYx3AbwlmC4yI`Wuv&kRWw{!e zVHotf9RT7uW?P`mOUpdhq0#t`uGgRHcB5e!*!JaNc*7`CC+l|X!>cwW%U4)t+xFpn oZmXZYu3o0EfAc^4zp`5S0w=RuNyyr%V*mgE07*qoM6N<$f+Fa*g#Z8m literal 0 HcmV?d00001 diff --git a/plugins/Eq/bandLabel7on.png b/plugins/Eq/bandLabel7on.png new file mode 100644 index 0000000000000000000000000000000000000000..fc04379254fdf69f390af39941ff359465fb3605 GIT binary patch literal 499 zcmVe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00CP`L_t(o!|j#5OF~f?#((O) z6?nrSH4`n!zR01X5Bj2LkcOI~vA?S+Xo-fPAZUn&K!_T{!pcx1j35OwHMMSJgAlZ+ zndd@rf73af2Oi$%yyrcjqobpvqoea93_jmNQ7bbEpv&VCZWN6~Flrg2re;z#qRCMw zb5kAVW4cSRy?6cl%G%q^6*aMkbbVrU*p;&9PpLc?mx=nsxVCZjZQs~nVs&Kzo7GG@ z^UBul71h_F}V|QPmH2_CsW{Z(_P}e%ei^+XBF$|CYx@PE6~&oC;&ZP5?sT zWL5W6lbIwLS@LybG#bbkR1S`!;vV(PxQiA`69E2`82Q4x7&FBzGcxD^Ad$=w2*$;Y ztJw)RvRslLpWaif@t>$@)~v{Q`>g<^o(tSWli~*Pkk^jMRFVaP@tUiu%B-)a^=lmp p*Irds<7$2L{BQne|JO`YJ^|?+THvhhjLiT5002ovPDHLkV1hl9)&~Fp literal 0 HcmV?d00001 diff --git a/plugins/Eq/bandLabel8.png b/plugins/Eq/bandLabel8.png new file mode 100644 index 0000000000000000000000000000000000000000..9f971840a37255a698c52390c2f48ad80b7ddbd3 GIT binary patch literal 540 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 QX#fBK07*qoM6N<$f*099kN^Mx literal 0 HcmV?d00001 diff --git a/plugins/Eq/handle2.png b/plugins/Eq/handle2.png new file mode 100644 index 0000000000000000000000000000000000000000..51c1df2906d376ba43e584c1b0c67b5cc430f6e5 GIT binary patch literal 1483 zcmV;+1vL7JP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00lEiL_t(Y$F-GPh+S75#(!(= zwJ+y>&Sa)N=A5Rq6Y-FVjhXf#MDmcT2^J(stRQF*eDSF;Y5OX^`JnhD7!0H@2AXIH zD#E0WG$v>(Z8O!BfYrpLGo5R4?&s{Y_g;G~AI?mZwh?^s|F~G|TmReleeiz_@vuV+ ziai93D3ha1jyygt3JE}jp+m?jP43bJLVigszK#8_;P$5oP7+Y1Op!-g6BORiJbEqV zvm1t5BFX!TK{dn5GX-uwZCI;p(x*#@F6(SC5C-!p@GamR6{_6{c3g7Vy^wOSm&Ml^ ztW{XyAgskIfpimOE+srN$s1p`d{Ee+$v;?TKzI8C@jxrGOj6sdQGLZQdtLL?Fhe@< z(2*rgBvz{NT}L8(2PbQBG6`ybj`zM>&G75Zz5k+9Q&FA039uXf5ryP=Qhi-zOaolQgcRE<0c`Wbb^5jpt_=&?IAjMlznh zN4crUzt-oALy2x_bbCb7Zi~eCYx4a0`6GAkY`n0t(tPpCmA`)D*=N5t)#;$yZ7*rH z+@#Y*4}A2cRSvd_z)mqyzmZl=WT4!Yl0>8r2)=E$K#hxXsN zapPvQ*=+CGvuF3defui6ZvA`x{r7JUgit7DgrBjF=MYSKtnW?weT~HGgq&@tcPaAKriV?Ah1n=H~vgyu2KJOfUda@Fhbu5W%=DBScNIvSE1A z1?hPRrL2%r&}hu$7Zw)2lg(zcCr_R{f9lk!Th>~H5J)MJ(&9KqD20?7syRL+#ZcVN ze3R%IhnrrE3?wq}aD3lL&qJO*{fneZ{q78VwsJAVB5PR~=) z_pS8(Sb82(#mLzS{>g|TZ;_5O@6kH2lkCNqD0ERJhcwD#j4?DCjmI6wk@b4LTCdlu z0He_;x^m@Dw=ZA*{boL|RiTiojKIl6ga;(6Y|^BK-e%~%N{8~10&iZ_9M&0(&S0gq z?A<&0^DuN$t%cn#R4E~RA6YJIw^Gq=F^`jtagJ8GJQ2}H)8XQM@Q^jSN6ReT4tVcc z%8c~Db&$SqlQ7gyk_a;f7bs;!5E!RWK$UW+Vv4sf$Mvr&?yydq&oB~S$Br5LBMg5; z`vd&XRT$irh*ru@S0Mw13<6}fgenxQ%H@nxDp|Lf$1ORy#RPXY%k}S-cz0rjdz4ud zzh?AF$(2Bn0+00`rE)39uGeA?^jv~iVYG+A8NZMQp;AO1Mn|Xk^K*(1ifgnOu)+`M ziRZ_=DL!Fu639{D5sH*r0ogb6RNt0NuSC>h$a)ULs>jmPW&U+A&)UQ~eOBqP!97Ak z!9$$rqYr+J;ALDS0XfP%#sozI6as&XEgD0U5Jd}3hbI_`-;(@K2EA2<7^@EIK~Wfs l3>F{5T{NHtA2;Uh_z!e6Me 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 N002ovPDHLkV1j+@o=5-y literal 0 HcmV?d00001 diff --git a/plugins/Eq/handle3inactive.png b/plugins/Eq/handle3inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..4c0ebbd470eb70e81dd9478ccc80f0ada1600a7d GIT binary patch literal 920 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 b+O2;8AAocB!M>ng00000NkvXXu0mjftqqx4 literal 0 HcmV?d00001 diff --git a/plugins/Eq/handle5inactive.png b/plugins/Eq/handle5inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..a242ac176b4db3b5fc0f64d49c33d7b22a00d70b GIT binary patch literal 918 zcmV;H18Mw;P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00RC=L_t(Y$HkSsPg7wO#($+B zK>2KLF_Kus4yF+llMW4`F==2jCTwmbZis(?gF2gZfQ=1-kgzy0nrIA*Lt|r8F^Y-W zhy_GiES3WO;<`MS++dVE^?3UmYgzz7fm+O%OEC<3d%GvE!d3GDp|+zE655#S~;05l4)rn?hx>0SoXz+)f* z?Aohvo&fg&*MU30Wo=#r@@m0%y_dD-1$u!#pagtTn|=Xr2BHG)RZw0fZwYu; z1e^m(iA3UtX`1&<(|n-&-PzgMD_Y-Bd{z1V!owwSzfOfmC2uQXAE*Wb0ss2?`c@{B z`D*oWWo2bk>kgnvfUUww0ecp>SI4cck_x~fP<6Rn7=~fY&CNY6l}eRLrE)YqJ^enL z%^nK)Q1KnwAY|#nWgBRldT8~w3YgJo)bMyb&attvnAhuV1Q;J5{}GGDX42_&QE_GE z)r12!wOJck=eY)$0Fg+<50FeI-vt7J_~PQ?bDz)GJ~=sgO?jp*r*0=~iRcnAuZ1-r zt5RzxRc9E6JD1Dd%VaXyU@-VdIi0{cphr2kfVXz$MFo1LN;lw`n3xDIEiH`<4-fkR z!r^cyK%r15iJV*UUga0O(jjz6h|eu<%O2 zO^WZ3URITRETWoNM6ENbLDiDUWWJ@PWoKYupeGaxT__fdrKzc@C-Hdvqu3fUIiJKe zCo`)!Yzhqm_kbZCuWd;`Zyiew&tYS10e9*B1@I8~1k|0ji66*(`V{ODh|>n>5!*J! zbld#?GcW_ZwtUBKTs5h(Boi{k#!{c9z)k_5Q7ak+JP$0}2YS+SE3(ZsnUKY*MQqyz s*se{>z)LY+whZgP{E7bQKlD_upLJRi89{(q$p8QV07*qoM6N<$f;_s0I{*Lx literal 0 HcmV?d00001 diff --git a/plugins/Eq/handle6.png b/plugins/Eq/handle6.png new file mode 100644 index 0000000000000000000000000000000000000000..eadaff0ff16cf2498e23e2f35642896a48f00108 GIT binary patch literal 1506 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 N002ovPDHLkV1h>;#|r=e literal 0 HcmV?d00001 diff --git a/plugins/Eq/handle7inactive.png b/plugins/Eq/handle7inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..a7fe5d609644d67623c6887909c1aef51182a787 GIT binary patch literal 833 zcmV-H1HSx;P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00OB=L_t(Y$HkSuPg7A8$3M{5 z0+kj7iXlyq$bx}Jr#k4S44QOxBdp@c-i5!wKfuA|g~Wug5e7p@U{MCdIDnfFYm}B} z=`UV?x_obQ^Dr6{iEnxBz2|(+_ndprd2oeK&u{iZzyL4?M77oidiA>sQn_a8c=(fx7&{Ktevp zz!zoNg@=Hfz%wbX0jEF?_%5|oDfR`f3DOHhfKec>G8KW2W2v44?g94aLiR%nFk||n*UB`e z8k*WRlydi3TwI)-pPx^!uC8wH?ChLrzajgo{A0%6hC9}MZU(^s*=+VO+FE8&| z%N@(7CC(*y(`pbW*kGAV=En5&^yJpo*1qR?jX)zhR%11P1uw}Us;&&%0Tvb(ZUd~Z zuYU@F!?KUczZ8U5H7iW}59%#LILUmoI1TZ2s zVW20OOpc$QpO-3?O3MOAWtWg&U7S2t@oSoH?}7VrFpvUp5s$}T=92R(7Q?yUu zSHQM?puv$_*VsJP5HhN+No`!fxPtn?o)mAJf%RX$ME~>~dZo`#k=*EOkiuC600000 LNkvXXu0mjf3wdz1 literal 0 HcmV?d00001 diff --git a/plugins/Eq/handle8.png b/plugins/Eq/handle8.png new file mode 100644 index 0000000000000000000000000000000000000000..2b7344e8ba2d0ca0b9178e516e32e9158599f33e GIT binary patch literal 1429 zcmV;G1#0?202y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00jL>L_t(Y$F-F~XxnBOhTmWM zWks@N$2Myhr)+JYG~mMM+Ti%mLoS_jD73Vp1lqu$(Ay3z?Aqff^p-LKw4kk0z0N4iL0AK_p+RLK*zybgbKo&sUfT31UIZ{P+WF70n3@k1~ zwzJ4K^2o0iP>@qdB>=PmY($9K1SCB0<~{HrfG^r;56)wLxQz063oV(&SjY!>NF+ic z5=Atig3M$g;Uw53CaXmh*EDEN0BZnt`VSy`Mxg^3*~a!~kMQVp4YgcLZuz!ub4PIk zk9r}A5fVjF6eBS~4OLO^=#pk?bgVV@b_O#`8Du^I_zQqVK%)LwWB}PV+Jg`A@bqiE z&Y7CYw)Jh_8nCz%I)Tsp2&~&INfJ?2RqSLsAy4q2wpGgon*na&R$YhQ0pJ1X^x-N1 zZ65Q(b<}f)YOrRa={KdOXW3T37z;V)yFZIkN?g|sJ>3g~bP(YvP)9vi-YkEb!juI- zi4b{0uRmkJP|7Hew@Ax3;)dT8o1ST#Jef>Nj~_q&rqO78x3#tP{qpkiw>NLz9IxQLL>Egu1#Metp zOCO#;e_mA-MZS0M-nC1YE)BV^8@AhRZnjLnt+u(9v<51u9PO>|E}T|T9bsUhBRPQs zCt!?)p67+9PMtbYuh-w5KY#w`D_5@kdiCnnpF~k47cN}*((}B~b=}Z$oWK@r&Qumu zX?3Kh3$nZC>sTM=;GsvokOkcthhd0?g@wgJp^&?O|NfcP)m8KQ_3K}Go)FMe6ix)3m9Y20NJ25eF#`k@1c6Roc+qZAO>VtJ%r<$Wt-PAh;6gB~v0C?Y9QUFFu zD2+bBlZhR5hi#>{x(am;S7;xcPN$^|%SeMC2j$C~mw%hW)H?tl0POU~;sR(-VzRM@ zwYN2=mIDREgh*oXnC~b~;QM|g2m-<|gd|Bs(=@8fI!(K2DY=!5jcty-Euy#vzyjdx zH7*8VLxU#IU}gybYOPw1`czbOMYI*0`-&ey>iVcmWI+iOQ8P5E@95Gwe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00SIJL_t(Y$HkRTNRx3G$3NRU zEoW+N8Ja|Dl7lTYA)2&Pbg&L3f)Ps4F+u{p1YNv!^W?=tV5gMu5Gr&~qL2j|EGwE&l{86XDS z1D*mKW)xNdd>?QQxCR{4;z?jtDOlHYM&H~(E#L>XfcHw%5AYHoByg>aRu%F`fj1QX zCXkh15l|_gcfg{e{0_H(!@yN3P6MBT55Om>O-XS^;Itr4pcwE1_G-QC@s&1UoC$o7ukXBV7>~yn z!r}0m9(N3%yvcML@SM>gF1x`-M@KJ~mX^A^y1H(AJf2%aLqiXIK40C~*w|U45nV=O z<$eZF%D}CzECL)}uh+A+wUrtf8ChIkU*8@a9DD&#RaNB?xJdSH`6mn0lG3cGQv2`K zyL>Dbdld`@1JP*o((>|hqNSzfD8Tge^b3J^%f3R&$JOX zkMdgy98fBD348~5WNv8T$jxeOzS9u0Rh3F@xq#(bGy^=7;z#zt`Y(T?zxogTr^h$z W_aHIbN=I-20000 literal 0 HcmV?d00001 diff --git a/plugins/Eq/handlehover.png b/plugins/Eq/handlehover.png new file mode 100644 index 0000000000000000000000000000000000000000..ff8021d87ff8b1e1088f20a6dd79cd75c2e9b13d GIT binary patch literal 967 zcmV;&133JNP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00S>cL_t(Y$F-GBYaB-qhM%hG z+1c6ETDENKut6bmAfQ|V0iWzcAeUeaHu(|0=a(dB{fOXPLXHX8r$DX-LoA4354Jb{ z*pJzr>8bLeXQh1DRv>7g>F(;c-l}e<-V)yP)y|H=SfB(9(9P^nDNK68pYQUQw;9*Y zWr5uYl|Yb0svX_|^E6_B(&1?#OwS}=JNqP3g?@nDAPfSO*(s`Oon?fl5mwRDZOTG8 zdMEkX`52hNK!t-IjC%>R1{yy_=He9HdQv-&YFHXDDumzvMc!q+fDbd_tAVhU1)8?u zb$d$OIOMVkkaHo6Xh35`5g)j|Wgk9iO#^L91^@4N!I8vxny5nt+ehZB|(IH4q z?lmhwG*YTC49aJpDhIDyzW$BGHx0G3BT&JuZQ=SMG(S7fzJnsmae>-ug7+xAdu6X# z(<2)6BqAAz3Lo5tkG>FYeF;BSwX>rF;|M{xcN1jfOn!iiC2RpBhbzFI!=A0#Gt%hn zBTu-CW%84eaPMZ~V;q1|pjP(p!t$Zw))ENh4rSO7GDfL?+) z1CbVU2ORSpkrW6(y5GkNm5ZncotOSVg}4f`>Hz^X)#qSLjPLg!L-Y~ zaxmlQJ`8Rcq7aEJ1?CD-JM%t_c@OeuEpv(fv+qDs`9yh|b{y@R=~a11~F> z12ci=z_Gxw791;SboQAf+{-HY`OG(vf9d`T+Wv>`{|3b;*LpPn1Oxy8002ovPDHLkV1hPevhV-^ literal 0 HcmV?d00001