From 704527de7d2c5634322f38b1baa82ff42c1e357d Mon Sep 17 00:00:00 2001 From: Paul Giblock Date: Thu, 28 Feb 2008 21:57:52 +0000 Subject: [PATCH] soundfont 2 beta git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@732 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 15 + configure.in | 1 + plugins/Makefile.am | 1 + plugins/sf2_player/Makefile.am | 39 +++ plugins/sf2_player/artwork.png | Bin 0 -> 96460 bytes plugins/sf2_player/logo.png | Bin 0 -> 2433 bytes plugins/sf2_player/patches_dialog.cpp | 364 ++++++++++++++++++++++ plugins/sf2_player/patches_dialog.h | 93 ++++++ plugins/sf2_player/patches_dialog.ui | 216 +++++++++++++ plugins/sf2_player/sf2_player.cpp | 421 ++++++++++++++++++++++++++ plugins/sf2_player/sf2_player.h | 143 +++++++++ 11 files changed, 1293 insertions(+) create mode 100644 plugins/sf2_player/Makefile.am create mode 100644 plugins/sf2_player/artwork.png create mode 100644 plugins/sf2_player/logo.png create mode 100644 plugins/sf2_player/patches_dialog.cpp create mode 100644 plugins/sf2_player/patches_dialog.h create mode 100644 plugins/sf2_player/patches_dialog.ui create mode 100644 plugins/sf2_player/sf2_player.cpp create mode 100644 plugins/sf2_player/sf2_player.h diff --git a/ChangeLog b/ChangeLog index c17a5e22d..c04ca13d5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2008-02-28 Paul Giblock + + * plugins/sf2_player: + * plugins/sf2_player/patches_dialog.ui: + * plugins/sf2_player/logo.png: + * plugins/sf2_player/patches_dialog.cpp: + * plugins/sf2_player/sf2_player.cpp: + * plugins/sf2_player/Makefile.am: + * plugins/sf2_player/artwork.png: + * plugins/sf2_player/patches_dialog.h: + * plugins/sf2_player/sf2_player.h: + * plugins/Makefile.am: + * configure.in: + added beta of SoundFont player + 2008-02-28 Danny McRae * plugins/stk/Makefile.am: diff --git a/configure.in b/configure.in index d21e18ba8..65fc7665b 100644 --- a/configure.in +++ b/configure.in @@ -655,6 +655,7 @@ AC_CONFIG_FILES([Makefile plugins/midi_import/Makefile plugins/organic/Makefile plugins/patman/Makefile + plugins/sf2_player/Makefile plugins/singerbot/Makefile plugins/stk/Makefile plugins/stk/mallets/Makefile diff --git a/plugins/Makefile.am b/plugins/Makefile.am index d1613a503..8446e9c05 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -23,6 +23,7 @@ SUBDIRS = \ midi_import \ organic \ patman \ + sf2_player \ $(SINGERBOT_DIR) \ $(STK_DIR) \ triple_oscillator \ diff --git a/plugins/sf2_player/Makefile.am b/plugins/sf2_player/Makefile.am new file mode 100644 index 000000000..37afb4754 --- /dev/null +++ b/plugins/sf2_player/Makefile.am @@ -0,0 +1,39 @@ +AUTOMAKE_OPTIONS = foreign 1.4 + + +INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/src/lib -I. + + +AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="sf2player" + + +%.moc: ./%.h + $(MOC) -o $@ $< + +%.ui: ./%.ui + $(UIC) -o ui_$@ $< + + +MOC_FILES = ./sf2_player.moc ./patches_dialog.moc + +UIC_FILES = ./ui_patches_dialog.h + +BUILT_SOURCES = $(MOC_FILES) ${UIC_FILES} ./embedded_resources.h +EMBEDDED_RESOURCES = $(wildcard *png) + +./embedded_resources.h: $(EMBEDDED_RESOURCES) + $(BIN2RES) $(EMBEDDED_RESOURCES) > $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES = libsf2player.la + +libsf2player_la_SOURCES = sf2_player.cpp sf2_player.h patches_dialog.cpp patches_dialog.h ui_patches_dialog.h +libsf2player_la_LDFLAGS = -L /usr/lib -lfluidsynth + +$(libsf2player_la_SOURCES): ./embedded_resources.h diff --git a/plugins/sf2_player/artwork.png b/plugins/sf2_player/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..807c444d027a61f2d13c25534fa3b6ca555ba573 GIT binary patch literal 96460 zcmV)1K+V62P)KO^^|2XnrHQ>Vp(M`yk_)FNh|}OkzzWB zNGMYy!-tQ04V)ppubtWPD}Len#@9FA1}Ru#Sy2;FL_}uFjvmjR;}9s2WX1mKKL}vt zVrHv0O7&XDxu7YtWvzY|1(C{9&&AG20VU2`nx`YfaP?`p<|-L@&j?@ZEGZ^g8+mTh zGBrxcsAxe{OjAw8iv%->i3l}w*SDtOq3Y>VO-k`qAZ((Dh}B4SHwQEydd^}6-?%OIkG-ZK{IEj(7ahoLf!Z z^`^6Vy|6Rzik?^lAdXrOQizI76c{9kfDnQUy#R4k3^>JU=%*S9Xl6WZI|w3}ARVnR7zHgbu!0y&Wcnxr<}6`KU9z{RCJt#aBgvX-#dy>R8=%I zlj%ogn6en*4A=zw6`#(mkGd?{p4aueZ=at&|96k&SxaAQE%oR@V6?*dTMP;mut^Lm z03#UVe$=wCoXi)itNRk9rbw+2^c}ef;86%|zI2^uTOa)4WM{2sh$JmydZ=gM4h2ba z5J?7+ICwIlt%$HE@xbY6eR!T9A1~)KPo;?{7|TQIYNBZPKB8=*Q8E}4bNm!xjtf&W zV2XIkkR+$}>0Ls)o7Zt`*PD))@%nPTOx!Wh1W>^sg5dtU;ds9v1jlGP{^Wj{wIYVK zqUGp~BWo&w;Obe}j8wZdlWK~9q%A*NDVWZv@wf| zIJ?FbTy@1XVx^ZTOG=BfYKl}XVI){hLAowLDi(KOFej#j0fdMMQzed`rqP71vnm?( zw#|{whjQiRpTGReANg{haPbfA&A#Egzg@ri=KOJywcJd1J9(|U!5Zv?f90~)%eqiu zZD1N&q@C#}V49&6x8Yec7CF{4$qL~6Ivm(!Qk9w<-PneCj~r2M9S z=(%3v8nQ#+DCoT-dSC@9#m-ir%jv0}A6i|O`uzBK+Wz+0|BHq_{*F~aS(Q_vfp)}Z zW{QYPIqu5n5TH2tgk*D{F=~vxCj)!SGJU z6$5cJ2`39Oa6qsKO#&!nA`L&;>6@qeynXxp_VF>+3Trcagq9Vl%_yXLxSQHcnP%zW zOrR2j*fl+;?U@lXXQntw4svJgcJaD(#`dy*T@sx-jwM5u~MX72BGEJ#5ost}q9 z8R9rFkpp=Z=7xiVSLEnW4HHU1YphMJitb27!)Jof4QkjP?YL*sD_vt z5*t}ZnHzl@HP@T+)9ugy>BoP1;R-Ew6-z@Lj2!gu`TqOy#$ZAF@tkI4V@{J-Ss+D|`tc5HT^YLb~TGa^i_G&{?u z)8%j4{^?ZLswiFyYc)I38l_Mh1-pB%Y>e-F+mH?$hK|W50E~I5RUPWn|0{ zQihJLTsQCA=+4;K1|F0^-(>*efH7v1obH`DiG$qFW1fN|Np>=cyc4GbN#z}FLU}JR zWdQY<7|5BnYHhTWs!cWI-~)w{rRYp0m0{fBrBW5MhN?-JM9FA(r9luuu$87+7phU~ z+3Gp;oU)`YA{9$J=Jo*ytb|%%VI|RYnLwmUsH6&Q7Gfed_P5?|*s1-)n9$5cmA6v9zNQ`18W;*qo`*RM~`omhE+H~j6p)~m&^py3T=!|=RSh7M z4D$qG3KIs*$p~UpHT7j^=JfPw;&$}D0Wru)4E8sApSSYkRbOv2_Yi}D@AcZpQ7Z>% z)QJj`9N$I~Mix*eaHc-B^C_P{T)r*p4;E)-d8nsT-r7iU%M@j|qFHKK&2`;Q^|sniP0wf(ZBlE7Nn6lHQBoqx#6m17Nv4XDN`Oaa zNK{v>)33PO_b-?K@9}^8kAL@18?o?kXoD-~1NCJYecn17Ok1j*Bw~KPyneo3o>;%L zk00&vqdY&Cbtx@Jk(dJ=#2}6qP_cy~v6N?9YlB!#)T-78T+v^&t^;kacwu=*-r6Au zPYuyVf<|~wG8_+=(M1AwLR>r?#EYiP$()Rx8RRji3vtLmBmI`S#Td#UCVi4*;2Zmm z%a)%neNGs($ra)@Zk>L+w>Rl`@iZ&us2~j&x}q!VV=L!+{&@M_15K?r;}lDIjCRsI zL$RnJo`I=Rr9f;%KuUzjUdm^b7^1P9;m5I@I#2>2ui{ZMa!6Z0Xr+N!mpD%xl{)Hf#z%mTenBR~u`qT*<_dVRCHP&He-t>x`p<7azCjx zu@csU1q!87>=4IPLp?M+rzdn7W&7%}bCLP?AO82h`}=?TkvHL7Sp#1v1#@)QB&|{l zr_Mh2>5}!7?I~l6>-O>ofBCbwXC6NB%{R-(hli(?b-H=im@?M5~DmpF88C94f;ULnTatThH(qgB*Aw z(@I6F2^mD(YFuQy#n88#T|&Z5aqZ0Aw$1m=_dyQIj)ORPLnqTQK|2CoNsxg;6xRt?T>3)#$1B8obxA%-HrjDsQS*wBGrnODtGGt$evWxq1J z6V^vWkGazwCYi*1*ASI@U<_~ry%(s6+K5!3`z`vw_0ZPeKS>^<>VbsIyDW1|fJQoU z@T-P5yfYI9lRJ2hpgAH~Av-wIQJ9l`;zTS!Xq(b9)+kT9JhoFQ)ml?o@G>K@SjozPcCxHmrY@-w}1Hc zfBe7x-@pH(e-<9n*7VjeK>~$RnonQUBbmkp_S}YV0U-#Cz&7&6%a2?h_Rrt?H{YH< zeOymVS$r1VtvQu)JkRp0FjoR>>w}i7t75=3!k=m1@Ie1g;8#7c`0De)BiAD`X+ss^(2ab<}k` zX*7$fnFls5gk%mED-m-Q7$yGvU;gX=`TzXmKgHLbv$nI*UchR)r*izmbHC8i5Si5vb#?8GGS$w=)H0nD-ys&QwN$qaQ-UYOG)yv~qL zY|;D7!8|(EL>va}m>_8k&tL%kuGdQ=3Xz18i3_pv_|5tJQJ%ipzIpa%g>ywKdfM`2 zwic6uYtQL9bFV6rEl`)4J|Z^q+W0E_?7LouM7O!??lwI~AF&fJ%#E$H1ID6MRXJL8 z!375vvLJ%2OVuWtE>a8~BPPt=H?~7EO71$U+$H&chiA&WMpc(@$&G)%k!W9^~+Cx7e589 zw5J)?%1YMICQ>rdbRS64!@-RcsMCbEWPljyNS3T8(M3@9FYf*I>aRchm#6*dp*($( z=a0+tx}LRDw%s%1XdM#jo*ATz47qE-3xwb;0}Y~Q>=HZUCPQv>YQ95HC63}AkYvXb zkMLu}$GmrCrByUZXAAAy-qj?nj9jN{$0yl|feShjM<+7LNth33%RB5Rsqf%_B;KH6 zD~}(a&mXRT`)NLYQk?%K@GbFQPD*veS6FsphnBVvjdH)oK8{nh*4xr`ps?RK@7 z8SF`9am`!wH?B9v3)_|6XeXX(Sv68(Do69n0tIbYDPn8Z2eVwncJ)Qvvc7Tc^Iq$} z7)fD(9+XiHpLZcuKr5>EexC=_F*v&ZUEc)=LuOdvP&5v4EL{b#$RrA>G`$PLrKm5l zC2K;k2M3Nj?wh&kXMcI6pT}F{=}}K5YNb@HVu$Bdup(AeYlIO>I#PhH){8LJT%?Oi z5fQyb9f@Drf7)JtynOi+KXgKQIJY`?QKvvkB6BT;VLtnWLy-iUmCW2?G5ktDh);w{ z2M|e<6b|Otov&Z!+t0jy8vC!$->$M0-YlHyBB7$hPEH#RK@4&r##G!$M|XT?;4Z`I zLvBM;q8O0`WeXh==Be)L0CFg66A}$ZGKEoC1+%Czvq#1hM|K-i*<4O^=+e%ga7yu z*;)tsND9&E9^2g0cX>~0{Sr4yhr#S@U$57VD7PQ6-43u0jGGg5GH|zj>c+%p4J-*| zy6!+`?y}3UNy0ElLgqO9@B{4+BJQ5UA%I)nNr4z!RTGVoG08wTxcNOqHSk~@x^Knb z&+izWDwy6Sj!0N20cYAbPp5PLb`3qfmD7B9M#>X<&M?pB6rZHJjgifknIjp+t(aPs zEk=Kn>(4r4?(K5*>(t(Tj!9n_G2eXqX}f&p^+tEo$V%iB56e;|l@Tjx)P^fjF|FAi zV|lDqTB=!Uiz;rW^g5-a`9pG)DKeO)_6EsTeV!{Y2(XeA27gK)Qg}-DOL_-3nnZI$xNgZh9&8w z6C2eC?tb4fi2SJXdOyJkVzN2?iO1*lY5l0D54!4u+f_!e6C-L{(zL{BxqVvpNB`Jg zp8oaA{biY#J@pi`PJUB<9JC9WQSWfg_p9h9^?iW8+COdx;p&6Z z_tK^@BmGWfT~Kh2WY)iH_iU)Zydx+B5fm?vwVw3h79YBfTh7hrPJlNOLR=S?gApoe zNTnE@xC5I;Z3uUoF7-X)cDPs0D5xM+rLAQ-J*(*1Kbe-+m!}^;Ei#*#xO)y#Y?@Cy zI0OjE_VPEcuL|`tL!yhe4@?!!T_`QA-I--91^#S@a8x^!XzehybBJK2>h@- z-&Kg1Xb?&oET9yi((0XVrK;R@9am>JIH4;KAJ+9W9~x?mGgUd8N;@%Y%rdoGv(hbP zhP5n35@wDxrMGP#bDI%+&&y5rJ<>y*^jb!hm-6%XUw{6`{aF;~e&oYL zXxXum6|bOR&>muWY^y#gD0bpxUaGmU?i9bBE)QS-{Q36AG}a>mskq&W{EEn0Os`IGr#uWgM}eb%}jilb;) zMR84vAfb++Dyf-F!YpLz=3-hIcjI|IE_8I_^7~980u75yje!r>9C8Hs*o)oEY%ed| zf*H&~D1O*Fhv5wOEQ*srkbooa@x3?#DoIL+=y6mB$hO1jobTOw5|HDLN)Pd&aL0)@ zHET${E6-WqGk_JU0U@3lVdRagAkWlQ*T+^@e|YF?QHmw%YfjZ#9`H((Buqj)MS6(3 zdIVWTM@AnyuhKu;@VV!_mFxZ*)0L*Z%+I$ke|Y`3ANl;o?Z(9kjC=W!mGVIQ6(1k1 z)j$~qDy5jz1$)TaL=}_Tq*&HsvWhvfr}QY7;LB^@QNxa#T(P6*3-aDsXw-M}V{(V` zhii3==`2L01QLGF0{LHAgLy|phX@vO4-wo&1wkh{IP{RVr!6!qa&TmQpgfPVgor8=7vg@m z6G9z5mL?9vIcz9IMfDgRatGczEu9c7GpC|tkhkJFO^S;UWN=U&*KKMq!+sj%@K9_b z2f9BBUC;^173xmdx>*AXul^~lB!aQ7)@lMDhZ`v=1CR}&+OvjI)q!7xXSf1 zujQv9x6%9l#$0qf+0AZ$`uxK`#2;UH>xU3Z#l$q-#c;t^)@MFGmFJdKJQi9r>MG|| zv`RHCT20C-OJNa1G?~WKG3b%KzP_;~ZQ#n%?xDewkWh=nOu^rC*mtI0-Xqe2D-665 z&;masEPKz}ym#~?X>)`Q^!-uCJjjpIikW0&jEPWc%w()Ip&aRuq$QrT0!nMNg;G_P zVs$BvwF;G5w@>x+(~)H(4j%ONwg~ESnB>v0H-40_CQ58W|rJ|Xce#i^c-s9ceV>OcKzek$+euuN% z{Y5F%wVsVyE{`Y93$3tJqy|z`D%sMG7>}V-TMMa?7OFDS+-G$07n?8A9{;ilmmznL=h<6*n;ajGYmo0Kx(o<<#n;P3L0hGM7_- zDlA4QdRoirHvloHM}Hj_nVDhYce0_OYlfxN^deOmuEW92+?kT|2xx=rD2c*IF+sAZ z3`2>CoS-V9YGN6g5^?x)B7&wtgoqYveps&W3XK<-r|P9FJk+SlcC(*uPBLy>9D8?p zvfuOi@!r?{uV~W&TI9Wp3*cC)s8S)0e;MgP7gd5PNo8=Okc;MR+`Zeb#=qgCT(?FJgOiiT;wAAMf}Io=k{g!>9TKK zEI7ZNwwHPNaeMhwyxthe<6~7-oZ*n3IkQBqvlhHkPJB4?bYuyem8DTil#<1=L@O-q zz$i^4MFcY&7u$B(mg`ULpMU)MvcV1tlX0U~k5x^Sg6oXaJ-5*WQF1a9JK~1LFA`2@Mp!bZW>PZC z%!owN3q^4Y^9<2UPYZX#QYA$tJ@p{%p*|@If=fz)eBV9|2qMyo#B3$W0t>D9cMIdf zm#@6sa99R)s#8p)M9y%Dl#H5piW&EfRrClj%sXO93F3INkqL$Le=jfm5=?)$QI3d6 zz+r_zsNL6_q);1nuFK>2CTT_~oE8;PVxsGmI#MJnBASFRZkSX?ag{`6&YZjXR`-|O z^YXU-+nh}57UL&={`qqGk;{!+S5C|7J{i-hu4;2eCSdAip%kKV`oQx^mljc}Rdg{u zINWJ|IO)kwVJ8(k@}!6thPlf%Zm;dffBVDFgYHztCN}Pr(TG{&h{q)C6>EAD)qQs1 zFwgCswuT|^1F-uYy&OlNN1+Qx4i-n`PPY#B)g2Ta$P7F%SV={Hb$Vlu?v94ws@3Q-!pT%7qQrE| z{6)ryQMzCyQbHyvhRakz@(}t`Qan^d1d~cedI~CXTRSqD`}GIYNDBT3)|B?i7Yt?LL|i`owa#MS3%|2e2N&Lsv|XAkd#!+5-=Npi-;U6 z&yjACRt7FJQo}qXMN&NK3}$JZBXTdVGq2`rWBrz2M~iFk&UFKKnSP{COT8}(>pQTC zzbFC6B+<+ey&Iy$JwYLI$3iKHax}jb#VXkxXU>!^9@&_No;jVCcFxCTJk&|5S8WP`_~`%`7^gcR;*H2 z!muZnc8~E_Md!$g=sog01vy>^u;43dU?qyxrqjG{1)&<$WF7?R}w%yR!bagJMbxV$7&w#jre9 z7XNtnp=(goR6PQ>yGB`ka^t!%2e;r==!ed8y6*=eOvNXIL7si6C^8zObj42dc~5sV zMKm}L(j;H2$t%M%v4ub@bs_{Ws)K?m@~6$zp=^7kjrFTm)nKCGk@rB zU;OsU4thcg_JPyFS`od+UBoEwK^-Qkcw)c;E7H))UqN=uMXIcnmZ=^Rr0?C-t9sF1 z-S`@R^7}AT!7C}00!sfy)h_SvEO~Dz5lEN}A0xIMrmql3-gAS7qG^FbCkz^@Xh5O7 zn}aB&B90xVRUzG@sLseZ3_CATzHG4#e9{e9%CQ!B42`?5%Y@lc3y|pbny8H;+v;g9 zt-GuBBt;JeFal23#ObC~usTs;xK}<8uGwZ1CWmBpkO;S~muuP^ppiwai ziHIT;k<1L)tyT$53Af>;ODc(tB4H*Y+t8^VQWQy4{bb&PaO6OczvB5}|L-3j{`kY? z&tKU$;;>PVH@Y1AaCHYO}~z7 zY+PR$uk=@55_{5zht^7#)6_;K^$3((9IP%IGB{F5Bi@~w1v?daY-LqMM{8E|ypE6M z16IaNC*2(;>Z&)%UHnQ;u5*GK&4@--%JGhk%Hx6$9g1c4zH)bOJ0J#%k4*OFqLq$P~}J|gvmSQHCm)~rZR(>hwc1+ zLyq;UghT|Wk;pj0P*KHe4H74EoG^6aPN*^RfL|doZu9Egzz2Sq1VT~F@4FWy zHpv}7nwh|rSLZU>o>{&*fBWBj`@6sS`aeFueXDS~!%9zFET?&?nj)EL5t9rFGYb^|znWpwHLx^;c)*SWFn>>Ia9|HOx;>vFEGm<1v*oMP6L6rZ6H5llk- zC>JkxS3DbjUh>f&T39~3iOD+Gb*b7MNk0s<<8?(tqibBF@BPhQ#y*sCVhzHm71LvV zR<%eL)QTDnD(XJ7bcAbg1uIyQ0>L24jw+{U2Ic9E+y! zILFYm5T*D%x_4X*wPR8HP|PeTf(=b2H10{v``d3+!2O*T9@fxg7u`igY-p;uri{H@ zTwcA$;LR3oS(7{j3=0`qBurft%?Qbob1B$Bna!$FeW;^u>Y-iDhZ~TZ32214M$yzG z-5@b36OHaZ2#NaykWdkwM5Y;8-i-`#?Foikl!A3!>1Sl=zx~vI|7ZK*`~3Sa@p;|> zj0Qbw&N=oNBlgKP?)Ej6di32vC>bg$U{Xa!M)VnY;>niu-n;k)1dSEv8s)7Ss7 zrbxji^>7X?F|tHC<^+aI8n}?sGd1uaTyt`};WvDGFRy$3JncHioS9>Im?L7WPq{pL zF4mS(EQ`%lRo3*idq}9HV-lVLIh=tH#7Vg`ye#Oc+Ijo9sEx$LtF`?9nR=HdIg)KV zZ|#SBL}X?afPS6s^Sbx)P`Z)^GNUG%kbhqz4m1(XL>WzXN#4_a8Vxj1m6;LYz8@TT zB>G?km;orDDk|LfUTb}8P8N#7goMLQ$T&968~Wb&^ZT{EFS{0qVo@*w1yq<+QHVIb zs8pQG{Taw@{@`w~?E1mWFFlY2#D#HJngi6t1SO5KErK%7K8NmL4elVL)^q1|``Khi@k z4o^fzAURqAkQ6?aRGAVS=)s{K;gAGt%n6SpKb;i{kRud1A;iC)=IsQ0++Ob30usy? z_Ss$&dq)5!P)3d8CX;-8mIsA|0qCaz%`_JG1?z{V6p02-FKnXfr zt>OV!P6w6bNS3Coh)4us7;Jhv!#&fWHAT}sV5Lf7hVM`=S{o5 z?B$dHYR`HKO8^rW1oYVIWDx>M%~JP^BfZ>(B8W2Kd)u*hINOXB>+@ejC5s|?};}=8_ zL2G_Lqy4db`)~gA{SWb%Z-4%-Mix%WLt!=pIYm*eHaB>fgOXEgNX_-uKI49e8)(NcRoW-`6oj1t5m3c)_SPlSDGA1q5P}E_ z5QH#i101m*V`v%lB?G>gDCtYS;9+G!BGQ?MbQ5G0NKg`p*gzBvf^dR0 zB5|Bg6ly?9Xo&Qw>8|1vLx_=)fzF6w?j^lPOeIc$knG`Gpufd(`sIH=pI)B+^j|Lb z5Be1c55Ei{u5ae@dn z-2F?EcP#W1NonRpXYB~=K43;ceUs+AZ?bM!ZS!Wn1FBNb^_*`OdzP59G*+*OP8mv( zVo+uZj?m3kiw^5>=f@Er+hHCYDgh0tV4hL&MExualB(jlBVa^i;T`rM>M)qGzZ!jb`Ane-5zvHro~BAlPS!C3c8x)RhbU7xA;#-p^>C6o;QWvR z13|&butX9vi8H`pB?37Ruq?-fhU5VDYM4;Z2&8=`?7 z)Q_v(FfIBS)2zJo%LUJPvgJ9l5VC}_um(}UNh6IrMK~dNoj=@fH;0MNDJn5f{UVR# zp~G6Vga?8EQ7u-7#ihZ!Z0R|a3aNb0{?|_*KjU*l3_f!@`EA50hV5?%9TErw_Gk~S z8iZP1g;-q}T%{TlOOZNDE9Y8qQwkwS!aI=oVsLK(2Ry)ph~$zOXfiHJ5X5ZaKD}(d z^;nJieeIjI4gDT|kM<)A`)csSC?O8S)98+$=bRCod&a9}TO zdIP@L`Q2atkIOgbAIeuZ^Z)P1_bY6V7;|ce^~1v*VDUi0-r&uj%C}$JpP#lj8bs(t zMU;r(^qBM$3?@`!3QB5W0Y-Rj09v}VC)wv~`E}#Hg{{1{y9GKx^{HIwonjIT(o7Tp z&U-2%tkE6V2j11gtRXzQBLW@NVL#`}Qmw|z z{r(a!`wWOp>HDf&_=xQZouvS)m!EO?S86@w)GgsAv9aFFWox#JECJ#5lFS zpnG&~C%WiV$jy1RNEpLUC__nA1`W12gNWIg!x3T_ONK-scZnT-C)?~geb{^_Q~{<|0_NP4 z(q$|wr!Q#YF%tvMauCM0xZ8c}5KQ&X{^{lQukFJXZ3NN;lm}~Uoc~_}e)33ahG9Rh zV?N%UM~Li!5t`t|Fab-(yLnjdW|m6KER|JUDk=v>Cxs}mK+12nWB@#k=OLYiYau4BIgLOMxp)eJvMF^b zpwOP4;Eg*8b(>JDT=&+@`Xf6^NP3)a_JArYnG{ie2CtIIdF4!3kb?;#Os?QY0V%MM z4suW7)B*}d3Avm>ufOxJ{<6&F=T9#mu{NM1!xCtQaBPW9;o_}8t5>Bo-R83FxXoO~ zKdmqmNFpe0??FA?xmg0V!##)|9DLhgiwjgQ=Iisg_(G`wON>}h!QenP9aiJ8Xk=qpvXc* z1QsT*1%!Zz5vaC8sRaVc6mKr!Q$RVDm_#gt!P_o(f>Lxb1jwWRyd?@7%`X>0C^-42=u}+KcQm6Kfe6sGEb-H{~s?OKaBxT zcyl=R#LDmrQVG^39F!ELhb}~v5uCwb89QPMOY`Dv$W-UvA`R=tw?H(Ha5vu@?uMA& z@kPH{ZojXx6oH2~tRV(jJJy!b(^~d4Akc!FWg_;l0XrQM@>m{rM8HNcC5~KdoiHu3 zoQO4=Oi)`6y~!n8b^z*~JR;!4jp8o;3g7)MH@jJQ29yAxkF|oiIlD(XIE~`4@)rW# z!&j`1J`QxL(`Q`&b$kCSKJSo34bby+Ih92rG;miDbrt~T79)#?AWk5h-zeNDJi2GM z=!2NaAOkrvAW~-biK47sxH6Fj+o$Wc;?*#gi{6jtn;*&AFN6<_9s{6h2!Zv>jwJvP zJBt$&GDU(2Ja_~QVijai5NQf#Hi3(2XSO6LvXNJ?rzA3wu3G})f^v^}WddaDddodP zW)|MP!LQqH=#Kz~jZ92{>LcVOfL`S@Z72G$)QU_n%aMY9T&fC&52Kc-8IefH9@0B} zZf}YTb=1wM>US@HyvQ5+>i_xAAOD)L?oqHO)<9F}1o`H>x6`M~e*Q3hekRkdeVOKx zk$9kzBG@x}VVCaI-8b1g(0RSbEgS*cu^TqU{MA>NW&2*5LiRLn6ySBw9`MX{^_w+v zJGvO0a}OJL<%aNw9yy3<2~Tu8w(Nw%VZWSpKE;!|Nd0y4^QpfjaCBfn3?vDKi-D4z zeJ9*1-KEi|U0$|*7;J|PMgwRdNBZIV9ue{3VdMrIA$LF%?h-fp^{4yC5BO-J&bf6j zs7NAHF<~2GCuU9s1DXJwIwB5b9mG&&Xc(LmPRW7jXozuh8>7nG42*oUg!3fK^&JqUjJwRn*Qa( zkMHqb(CP3Mnd12@?_g}DIc#dhHKEKU!<3WK(snn?*s8-;xm#IxUQKhS-L`Is9alkl z^VRwC`e%8WXj<8mjN9@zGs?^s9_U+azF~xb5;^phejq($1PcRU54QS%m?i=T0$@as z^(;lLC`^bZTZ%p9F+pc3M!@r^3G3*Y+qSxG9xcLvU=dC~(#($Thk+ab?pSH;@OM1;YFR)9+cID4 zqEjr)?%ZJHJ+`%NLVMue`#6XkN?-yFR3JUrzQ?WRcF#V)n69l@(cLgD%uK(XoT_SN*^|NQ!Q|8jr(r86S4vd%z&cG;e2$5B|=dX#bGJ}kxV!=(}|GEAp|aE zmPIe~{%*N`uYoyZBB_aVgg7XPVG`IOq_wbLkR1}|4DbXAq=6J%kQ&T9oe&of6=ZNa8cJHGo01o` z$~Mq3IgSj$BrV(Yn#jrK0!)hM{U2=ohZp$U|Mma+kN>&+xAvnOZ7=QA&lcTG35gr= znOaLpiYs=%yJrFoYr}QNwQUyghMwH#ucu4@r_1^sv&CtR@IZIDZ?t)f)^d~rJTiwP zw3h9-m)ls<*)ei?z=pw-p^RFfgmg_dBACFRaCs_I4ImrBrkOb!?7pl|d1_7WL{nyV z+a{Vt<_ttbM6T2Ot9|aUz)(hNfrNKQBiMj@4|gjn`P_Y8bKb7)_OI`M{?Xre+#Pq- zYPJG<#SCzB6L7&^e4SX%6F--QyA(*#Od63Zg-;e;SW4kYCQg}ML~EQGg;VPKj<>If z!Gu{*PS7VT4BjO(sfX%lKS=k8EG|dEL>j`74l2iEBpR+HN~JIWHZM!28Y4W(O|YPv zkjNG|O=u@%=Tn^hezs`4e(LqbdH3pjq-!Fv`arg%fE_$&BBQH>QFf%Pt-NWaJsG`r zGYiX8f#u%Dz0m-$e1Zg1*aHcfcIrN_PB z*;sbk!#b_by+t_o9d59OYru<6r?*d+>pv{=Ceuw;(|ga&(RS~?<{mzLf_AuEj`j0? zR2q#p5}Oa$+tzN70!^H2uz`3GmC06dy#!!Fb}MRP)Z>ZE=+U*E=OZS zt$>C~3P4I3>FJK~gbRgO2X>GkM>jyYLpX;20h!F=U?ijfNa@z1BS$5c2LjnMqGylR zGLd1Wq%!wBy%gG1y0aTd!c(aANaup#U<*PR;;_bp0_3pGtZvPw@IBnp0!Gn#?l40V zq#k#c7~$Q(U~@xIh7CeLu_p&jVSbuS2nN17ns6|rTHzr$Je)9vhqnh!`r@Ll(w+v;n; zD(3TLdb z*~RM9%Qv&t62vSdph_|+Lm(i=NLMH$1u7U&I3lv0qru%#f|;pANJOR&f(wy{dE->h zfRn3d2_cY6WTub@WU!7xEVL)35C;o|?w@N0A`?!U!-O7YeV?u=F32EFt5JGPuO&0s zm|TLnlDA+09?idGmj?$k5(pFr1=8U6?hCUgSyH5T!wr_`BU>lOtv&0p1?rDpj-kkk zevH4}ntyJmclG>KmUEt&edo`DJmqug=SSYu4v-Ba4mzxZ0~FyH?$AIQQoYtK8*k-P zRYhL0IKGwd=JxLq`>sE??C{K~X;x~pi6J%zHC}hwn#Z0EO!c&!+E>%{44}zp(#>RR z@Me9xd!QRI)Z=^*g1+Pk$CT5LRoamvF9!o`#6yLTX=Z#TB3&8DV1Z7k1w4b8-5FDn z8VhIXvS!)R&JG0Au@LNpO{LS$Xw>f!fs&wsFNBjyVQ7vE3^K5-{r=itf5hK@!p|Ls zI4MHHCrHIqr|IAR@lSvL`hWR0{_>WdI6^E%YU&?~!Z(Ows^Gh4bf&QzhEhZj5d}OE zMj#NE5p7EbkSPi|Lro6kCM3z6x{;MJN%ta!KnO#UbBS;V6LqOVoq`b|keVsO2v16Y zbEb5lJ7}eJn2jx;S>320LLof-n+YT%7RYHJFU3-#C}}KHd&8u`dq7MgGQ!E2 zwUb?~uj0GhZu$E3)B4&S0xmtG0|GOM9}6N+SfKC74RYqUzh~X^X0%T=-|GDR+vm6M zp1;cf=`H{1t(=5V4XUDyH1rLmP(Vg^sW2sz^oodN%E8(ucvzy8YQWH{LDCpBV)G2t z-?|_@sAohtc-6+}0pn@~nT|k3gk=MfBc%XFNCxvbvXF%IB==|>yU-3_;qYWism zAcKs&dt!8;=12%-S4K0uBIR^DSB9y`{==0&uiQDx3UBhcc{VhEP=uBuRnD~)=t{Di zu8z(2bn9c2_-G~yI&iA~WrIGx*T);Z95}^!LMc+K2$IRoBjlm7DVQM-(;o+XFij^^ zMZ!C25K8q6+p~&CRB5Vx!E_LF+KyNw@6k5A)}LQrTSp{HKJHWr-+c}2!>uv|tVQ`U zFFY5SF4Kw5%Y1Hsc!O`A0Tf~E=YJex`xEy zr-v5@=#t>f$OA)X!b;3cJW2&iCXA?gu)BC>GWDXBO+5_`=MkGArXXSR2Sfr6>Jjd} z_rNPb%gjpAlZrB|W`bm7LdKg~pbSz%0PKK48t9JeOKU&1AOX5-W`T?CWCmy14AAUBSiRdNB1vm+o9c5XaNapWhEqf7>v*p zJUHclS57^m=A(SQ5R(Rk6B3Ft?a%TA?^OK6dtoRqVL)uoJA5xYuCLSQ8{T)gLmQCM z0*wyhdyei=R*_oHPo?YR>h$)=7wD1_DeoIOg5n)B5Lc}=`nISDR0vseDbRO(YYF+k|hm_z%WP+24bL0WI01Mg*B1Er&5LQq?CAf!n z5+jUa8)gcZK%~cTB+(YfiYVb7ogfJl#DrzhsStSV2ZX9}1{83MG#h{u5)Ot^!S3Ay zT(U6kJ6`enidWrToZia$By~`DD(_IIBLPVaHK-wn12!BsyCHk-+*t%D zVX%8(C%@BZA&bayR&;SBsA(cnI}FK@rH7c>a=tz3JjnQPt61D8=}AiI;bDQ6#_38S zutfN%ce89>I_ZfuDg|s~-;;o5;07*-FM%JwNfz2asELy9j|&(HFNx99cSd0(D-*&U?!T05tcdp8$}GAMqnWt5#H*@c;gf*9ljZtRXGZ6SYxof8wyADKDHBRzwsDSV^uT;Yxqz#UsJ z(j>U~9R3F96Q=WyNpPk&>TjvKu&21XxOpqrURQJ}+hu?^GJ)tvw$WBU%vDek0I#?=#DsE&vTMK_0B|qsPFCy`hfxGEsIWjF4PC*)L<$mAK(6SZrBqZPz)XV(20&>ql!w$2ciNQ<;r@@=A>XA_+-SO6!Cb; zjNZlwkIi8x=p=QfSx^gv`x7NCei27~qUj6+IKXf?D{1c0I^4X~>;3%K?blrZLE%X* zm*up5`~2zaCoS^@MIasAVLNmO2}ac+0g;J4jhHKfkp?%mhU`PM3g;GZ1P{F(K@aY% zjpn#SqX+cVe3)=_1T~J|2JZ)=nak@O`w@mT&M-pdEC5R~k+;Y}t8+t$%}&_pbFu?O zQ82y>iZWrEG01rC*za&)Tl~@yg{cuQPC$h2lRb|q(;?k6$j4Y!kJhna z?iM&YJ4Gj}U#i3z$e0)bJbklIuei(U{jK3j>OBjJjopaHrW*rgWrd zcDiE)($SIwG5T4Db~b=kLqY2S8x*rrkp;fw^_9@RGow~yUJ2%BXx#6q-B=qf2O zjvWTK!X3F%=Q~C9UV`1~1_rw-?XBJh?pAYJ+NG9RFDMgO!3(GYflL-oFcl#lebj+y zC;$)tIbZ=ApXFY;PbRMsBZlAPUXlfjoqI=EQZS<+5Utye>yEV{hj>(Rd79onz5Idn z*AieZDT$OxR9IPy5M`_7e!5Q|c6l}G`aAqC8N>)4<=&uV1!eGvCJNY*>#;{9yvBjKG0aeaLs1aSqYfbrun`s`swua>!|afoW~CC)7wG6Jg!#jS zSmJ?7K2XhJw1tCi+_*zF#oVwB)fq8>bv}yL9|FSo3tJ)u>gYL2=?Gv*6pk`PM1M4K zJ9>lzxii&}1{SXYP>}AzfHen$yo0vR>}V|#K<5|k3QCdQHNaU(Bu=OHROc!u6a^SG zq0TUXX8=&93=#eyvRKd7$$BSGc7!7g zZAWA90s?YD{ln8Y^X)r+kh{OR& zJA%46O7mcVb2ppjcpadum$Zd`yr=X}1;p2Tz zHj8~*U*ArAyFCB&^UF)(b=a2!RZz=g00lx0)6S^0JvvebdhQW%#{&+^!rUSg1HGLQ zIdoQs73eIwZ13inYN#NfQKQt6Rfi) zEyStzg!k<%sN$*?#Yy(PRPC`UJ#Rk2ziP`9Z$nI~<$bpnIjD&VOW$hn=S{&q%@qIE`H zKs9wrDLk5vhu4{hyZpd7rBP}UlAIC3Oc`zD0XYrQF^Cf8oQU7did)=R1HG2N6o5^hepy!__%1>scW<#?!+P7dYTeKsaUjB#1N1A zyDzUB3|wPm7h@hgau1Y55-cHPBq_w&V7*@NY%J5XpH1&jzxcbQe|xH03#g(jsWrGj zs>qCJXx6Hi(ugXOK?)kw0M4FFPGCeqHj1Dg9xZXDzQM2toWXtc?3!$WhA@Ir^z1#+ z!&dAGuMkE}gh1Y%&d;|WPUt!9QFo%dq>9#BiIqWUAzA>HD$q|)z13DiC%{1hHpGVD zqg!TR^XY-1iXB!!8=O%I)leCAf^7ISn)d=Lfdo~-I1DP`he_=Sg-l)p%J9xnKps;D zb=jqEY-O@KU`z|pU<*j^KTLA^wEXz-y7mM8>^6vUg8~gsKp*XV4DrXbnunS0@KQ62 zrx{{DAl-e`T@>iKPN(}fi~_y~Vvb2Mjk7q&d+RhOdtqkk96O7P6DPKf?%n_p1qTPi zM`NLYj2i;GYa*R(MT~br9-HHFF5&UY_b*jSfu4t-3Bi`skcZ2mAGg8rWD`IQe&F!` zKC%W5Bq1DLKyjFj`8Y8$Et28GhUI7ha*j$`d|_V%-OjN!W9x?dqj`3mk^ND(AYA9atCqeIjKkr1Cc>a=y4P>nt}J+UJbh%y2IEfLG9S@XpCi# z`xV{YB}kwv_*pL#Twv9g#imN9dagWGF3EzRER=4^)ZCDj(gTz_iJSAN zP{e^#8zlVSekgdn4jC9}mjX^O<8p!w&SStBYUn%YDW*Kiod?D?1>*3=CPB``Apwoi zB!P^`q`t}K)R9mht11BU#^27@%c*?)jIEq(AsgFBc%dP3IyL$CV?OU$5pj~#$4b9v-d_rM- ziMrzmDA`lP*0Bbg1?QvA4F?y0>{Y)!oxe2@CX(P7pS>V^RBb+fLq1RzoR6Oy5Raon zKyiR%KrjbCAO(ILCV_-?q+s|`*#VA`2L}Ta_r%~Hu*cg(i zk1EEJh=xA&SLKIUMkOo)Pz=%}*GW(Ny9KAoTq87;z|Bw@!9hT^a|qiW>F9UD##_%F zuUGlt-sm8~OCkdQgR6I0lO##5Gk+0LHFNj4YZ5krBQ1$RK)=ZvD2$$TY_? zdZ~Mrx$RkLUl?EMaqOoy9~;}Q-*(+c;=T^nVBM&1m;Z6Sw%gr8nTHIf1U6+(Gm-Oz zRo$pxYyah%PlVV-u%Je*>MAK&O@`w!!_l;tn-9v<`rJ<2?bNv@`#p~KXD7-8wC7P2 z$~0Dj&TDjMFFc=F79KXfatL1oS|BI#?pGH$t-OzoB@0qWq>RPqfPBc1z1tr3meMsX zG$Xg_mxblT!_)R~#r|l2d~<2MCOx@InBa26sx$#DDw^TLJUhEU%Gmd@)6GtI0i7D7 zQXZd9<;&B8o+uJp-$P8pbLo<1rh)B2L8UToveT~m()=da$^ylqU^A6uz@R5N$RKCO zA~f#n0)DDtW??V#FGJn#$NWzL5bs}xdrhB{ZFbD=kME4V$72aZL>{`d*`myqwhCoV z?;8US2(FTwCw4viMUes@{Nv{@pVkk)JoU2H<)Sv0K@0XhqxWKzK5{fIzS>HIt(7*y zm##U=u(Ky2=`(?S;(SzGgYn9%v+of-G_Xe9%C_0-zO+BQyfj9z=n=TtD@CnDQi8jx zub+7ohSsJo=V$y>^RmmyMI#YSu*?+6)j}go$HY2QKJCBV?6#EG`te(B{dOI_rH$-_ z9wp7YQF}f)3*_#I%Z;0$&pcgtG?ttFdGq}}k5X(?kA>Q(m1u;}%tmBY7O{C8Rin@3 z&g@T-syaOHD`y#7`C7)J6sRkg&;H@eaUsNa5s_t+aZ&wAJeu7?J#-*y)z)eTuRGiD!PaC(6wXuUDE#z5 z1^!fP&X+YA$@cTC)A>((uSWQ3@9`c*82MA(@=mXw^|#L4B|-IPah>D-O?X$l{WKpT z3ObIT*kCo5p@|`3<{w`9gT#>1gQj#Vei=_|UY4ie>|#kQd0`pL80J2r=hoAA&(st= z=s)rnHil;DU2oO4S0w{qdq}taWaARpPIFp6Moh~f_Hz3=zPyZ=m(j;ghoI_Y$z;H? zsG6!fHdQfrfyeb+L@w7)rw63MGFT!@x=;jHVtA^FYLPlz+Kv|zFPGMAgXL_lzn(7IycQgq|FGHf%#m@9j zzp-6uyu8&fz2EL3Qxn!T#q@r!^zuEc+J6Fi9Yu>BJEM1*&-`Pl|8p3;+(%4$4{rk| zm;D&C!jPX{>zUphiO4~cd0!psc94}8wdLwp=bMEQ4BF2A#6?+4IQE0B?SWI}aVc4} zs#cN1zt;!;Vi}gfc=Nt@G6nX^xN#kAaBF;(>{p_Ml8Q&e4HB7iRY#T5Xs=v5x7YFd z%JoVU)LD(HYC3VDs#Qc)UDGl%X0hi5T}w4OiZ(`RT%w+;6wE=B9HJ2-cfOwlf@pTp+0Sli)u1m+`;vb%>yI+nr4H&{j2Ve0Y2-Y}e>O%0(lwKua9Gz= zD|51`IlRrAWFqel%E&FY!=!aw6yC`jy}K8*+^0hqK0fJRW@O?mvU5F;c&ZP}c(f-% zqbv&ahJVFdj@DaC@uF^oMdKS0+FG#bmz%!P_uMd~F=n7hYH8r?K^bVL4ZFSg%Nw_y zTfZxK1)IDb2_aIDMNw4+3)wu(Q%EDuJWhXL`}mJZ+$F7xKSIdn?fvi+14#~=r{$s?KLKaEQ9+ZeE& zv4|zeuKQA6J(iNIh7R421gSbo(Z0L_dbJp5kYJe=ZNu-m$1#HoD&}mC!)oZtDt>m| zw$nd^6#1vWsK1jBpO6a$uHR^F#Fr8~{zmz(J+Z(^D3|*5Vf^mQ!xY$5D2vOZA`DP?CDFR32Gnr^#oK1Sdi;(p5EGlkDl9i{1%2lE`E;qd z#6IS8yfRLh>MG+Rr^qG8u<;|=(xZEe*i}c3=-pl=MBCb7KmB=o_|x_lzAX{sUcc#k z+Z_>|;+mV>u0A&U?)yZD#^F-eyS>H>7Tn4#@IoS(1gJqY#)&BK{CJVEU|TO&iI2M0 zx|l7d;&jziAxQ~e#U*;iO%fOj?1dKDrXXHxSPm(2sc5Xbd*nDIhfZop*FZ!xJVm>N1l4r@St=Z6BS~qmnsXu(Rq=O1*2r`(ZdZ!oYr( zrP2MaJ$`@V1({$oDH(W{A=O8UmxzdF-g10 zzY&!L2{zz~=f`?^s3ixzT@SDTVbn8Em+fQaX%zLB>@OZ>>na&b|H7^QkP;xReBI=m zp3K@4DSOk=8C<8NZ$aGGab{Vpq{qrjF-~zgk0;lW_J-}! z)nb9}^-K11iPIdJbv8u<PV^$#a2fb=E(=f=9=y23Q1c$WwwC>s zTRED9S;$e2E;)h$Ql{RTnuq#-*P{gzzlX;7eLW0hK`fj5Hb!PIm)^^MYunfDy1570 zXfO0D*GbJUh@pnqF*#UQPI1g+>P)vye3qz2ujm8k2Tn$wkc(a-Wn3fZMkrqJik-1X zP8TkMeH+cWwnXj_5|8Tv&@_Hwu zsInBcc|aK9cQ87*AD>C|`)*;NS+k2vBWU0A81hZ)>C`^1%W7v~?MQ~rVY3tq(#SsW zk!xhx?bYR*@6qwHeIc#&B(zVWf3{N@Po%2jIpY?n^hv&hd1L^99iryHFOjlN&_y$W#^1 zu#iF9Ge-9A*Vmh0YqKBUUL97)rlYJL7!$2X91W}9(Pi@$pBZdkuuygAA&Gk#sUsP# zA=P{Ow|@P~mp6a8zPvj7+u?|)g=Ju%RSQ@Z)l>=mID-&;uvHdV7K)=rI%bSQKcgRb z{8XQw>QYA*Fjfz1OY=52fMNKenpD}Trj5sg>A?0%cI%V{CvbTd(KHf7blZ;YyFJRfro{9 zZ7Fr>kNHtZ4@(Q1<#doLVTodzii^0Zmf+U$@{-?%zJ+y{LpKXpxE33;e$5V8#ialIu~)_SXW1K?Pas88_S@X%S>H7_YWslQLLi_J&nvB zUnM0d>P7PugIbi~O*S1r#;tzYa~=InXbX=qA?rqilBGmxVEB!mbdW(RL~R+G~I7@w#tUXWQ8tZKfJBMRQ(MtCnR=3%B_Y?PzA^%5MsUX8hYpIqTuJ z%7UKpmF0=cclF^?Q?%*;03ZNKL_t(pA8L1l5@+`c^+bklVS7oD?2DGt9|hTId--wm zm;N@2?u4{s5Hyl7mOz8i@cG+vu=uJJ>xaHULVfdo+x9oEZ*2Ye+9zy~orws}c9(eE zHxH^<7!A_rJUgewcR6g3^`whd5n(2lS(13VWKK)k#2^>K=;=Lkq>5ZOAr0?++nil$ z;$LZJY=BY%OC`liV6jG&ddTUzA2Je=u+$!hy~XEn-O+l`Oy{h8dAB&+GyT$obm`vE zFEuWXSU*<{EVWw!4N8JdxhLs(%UE0=@NjBGlo8~{OK$t?dgbNX_P}Pzt`q^u0?`l6 z!n83=AwxE{8NA$RJKlP~#TMKq7Md?IPdxJOJ+ILcvQ=XiX_ z512N2eqzqVN}ef;S5oN?-bUHjZ^B;U${rWL(ywo4|`tA1NIx_pny?gITV5lCtQv~V9TzPIE zVWKsID;Uv`4Gc|^}mA!0N+i%{6ed7;rw8ClT=L&ne48}m- zZ+6!o^8> z%fRH|GzR39JsUBb<}>!h@}YkGbbfmL_PYm`l_9jb4r{r44D4H1O%EJ3!-+_@?JC!8 zv@r&hwG`seqD^UrQKr&qmMcyfjGaEq*DYdX>^?0xDVT6lw5UN8$qJSy!j0}&t(sNT zqJ_8CTklTGJNfXwdpoip3=FxjENV)r3Fe{_YMMr*4^QvW85%@SFR{sZ%OTfZuY0|= z-uuH>d)aNDXHFGlV+`5`7q1;DlNN^#ydL*8PA>P$VfDoeA;V`Tt2MG}9FpUy z#IytbYDP?cbi22yf++5^!cwtiilPf@WT4#}?xIvPWei_P*(8R?ZS_Kq^Nnxc@Qx*A zhPdC@JD!YAG{(&Jjpz;Uw0VT1!nEki9hi^m@SH_0#3}@U1j@do4d%36Gm&i(~q>&3=DV0?$>T0%J zN}iF3r`yi0w|(DQ8)F7`?a%$)31)GZu75%IUP9{35qtyFS#Y zi+)=!FJt$8c=H&C6Y7X^9>l<)?8mfm+u=-wRVWqd_+U&Sd!yF_gJxx%fla>>sgzTk zU|sHVLZ5I2%no4H*fBX=g|bo)s94#95$WzlMyZZ=!qc6xNKyx3BP6wSYqyM@ZRbk< z`SBlKU)^-w33Oz}&D&t>^f_?ocX7+yuia7cJsF+W4_rbsuF#xzmu9GOg2h;&$e5(| zv#>5!m%3D}4>DvAE%&Kq#Y}5a$)TW1J;92d;E~Js_2JZ?3tjAHLPYIhQCjGbP=;31 z^!WxWNRm4B^pWrW;2oK}t{~=EX?`!e^`5!YciJGY^hWgKYMoXxk)t2gxkIc-MOIM8 z3JbDgMT!MRFGd*;>zBWxJypfeulsuIL?%ODZ~85R%%!{c*Z#OHC5XD)_+T=yjN&nd zMW$!&A>9md)!ZdEe4nsb6){(a^`h;#vQ$wMbrn4oR%c{JYMP{q$%9bc$MEJrvS?=syE#=251 z%0!GpU8#j7@XlrgNCiWUl9ZLQQSJa#DX{RsNR)Pd=?rq!?V-jJCTW^c{DO?KiWG!M zA8akR!MF0`kJq;=j*ZPnsPC;g+dR>eeisx~fuZyLXc05t&pWS)!fv?pcE6~B6D-cD zP=!S(b_f8Mg;o8s&Jciz2o#^(Bw?+TB343zT+phb!I|a5a(N!#ed-TJbbiFuSm!+% zI;MQzEQ>D#oaTpuO{UrJ#@ZyrLpc8eeun_x5QyOA#svedFhX}5Dby-~I%Lc^s% z$suZ#FssJM*7lyd+je#N)AFDHbp4u~-ul*P)7LcOh-8~IgfuGN@ZnAA(1pFR!(Q;g zHn=La5XQ-|K&75VPQ;mU5F~{-u{>~|PRQskRMD!7EMz#iPwUo-MhNUmTjTWk^6(%Z zAK$)vU@=k&WlaK#Ge9~nsBut>!n*r#nqY;ML*30zYlvgxXvZ<=;J6??e2{yLM%(F= z7$+0pM=moR5-Nvuv7ig4YUjdfwF{@!PpAE19j6D%Qbe(3g^Dc0s=A7VNTmn4b1uX# z``hvw*`dt2MAd~N!kVj;M6)0&nqi-O*}MGBh)-H z5MAyTtYL)PU^I=9eih&G&V)5arv#!bM2J@jmMr7bQd;06^VN5&->#PzZPGU0MlSdu z5;fcrr_Od{&ckXCzeCE?hIPs6)CJsSd!h|S{-Z5U=lQuSn9C^ z=uuK4HS|Hxr|WswhDIhTqf6x5a`$rKT}Bp9?b`R}FaP7qAHT2*`$ku4#xPh3aG$os z;+@`bmk74>J!zfod!GO8zx}JvAD;j8&%b}Wy=p06zTN)t`mM2KdARm^dc0_yv=j}a zxzQ>p3x~@Q#l3i_jv|@4y=^BDV)J46Bj*px<-2lvme1?Iwc)?(cA+gz}T@DNZ$X?73>3}T_4wAQno zc{-2B<>l#-Wx*EZvanpJ3QJ05siGHB6O9pSA_ZbYUh%=MSU7sKV4;?{STT)7Le;Ve zA_*!Y83zf#TWAk&?DcDx*NAX08RN!VnV)VnYvPjPFca!?8pt`OeFT|lgMHvPnS3zw zsqe!Q6;B&z7OAXDVmVS;p0xxcEKsNPx&Ah=V@sm5g$)il@a+IW`iXJovalKhw!zjI zJKF=Ru_V^?je2e4{OBKY>MMIOJS|fR8#We=a=`5^6%|oIM$fDL$?tv-&UtX zE?8oT+#cTkVf&A-yg(WBWE4yYz4Jd3A7YWMF+>JF!kchAVgK&)U;pc0|J8SY_;(L4 z<=@n|@#$@-zI^}fAFluL|NZ~|{yI(%oX56$8d>IvxIi*?Zc_^YywGTe998K?+tEM_ z|HSiee)at8ufO{^boG;aQR=D_o->rX>&>IPHe#K-4k27O*Ac0S%uI7*iF*g46k#aE ziuDoqd$`S$t=;oZ-s_BA`7;bT6+hgB}krC2(jry&G+E_2+qd&Y(S8)}?T=baTPhU?@Aw@l+-bQRq zUwdPO3=gLltv=Thl^Bw0Sqjs8F+UGK1(_*1MR&GPAC#t=GV~4#4034cOE7k^+%?d- zab>J0U4&1*d>zZzV$FRTDCa~VlrhZ;12yPm!wcg^-`UPw%xdvkG`4sxv{p{f<5vqd zLL=Sm?KNcyH;S?N+%)+iJ5cjXNr?dxMOE|Z81T+9vJ@=jJkImy2HUN^wS;lr(O&=9 z-rgRtopJ99_IIW3zz3d5>uu*%Nu{6QuTQ`E-~RGnegE>;&;Rk))$R8D_m8*Vq<--8 z_O$$FIemDMo!722?Y&I59V6LsKz2sBcV6B_6OW@c^^JMpBKj~^aBj^BRw&wu$0 z7iB#k*PI)EC0<0Rin;BfEn{|^?s&);Vo} zzHJ#d+xOU{we?HxgJNY)w(C9=v;?z_SQ3^9aZGKuNPV8mOa&<K3 z2Lk~VNr>NNw#8lF%Bz-JAFDL^%hO-};>>^h@xT9pt71V^v?0{t;mvOz zZLqJ5k39UF@Bj60zW?sSkH7o;cfY88>GtQ>hab}8Pv`&ic>B%cx9{`JcemgE`{n=s z```XQ|KUIX*NzMxjni~sELg$4R3|c7ixn#}LOd5w!7r?zpU=Gd-T((@Ni~X zk(v1x6i~y9$?z7%SX~-07>WsH5yHHApSpj?f-xhaja-bGWqP@rv$8~v;1H)|cI z@Alfb0+#9ZwwE*=l&T_tY33|uN=l+3>B=yrrwnm3s)(bZQJ?fw7?#<8})71mf;S!o^ALb2GX#8 zpA5{1`g`9asuGrglI$ZoZ?8U6PV3`pi^o28WvkfYr63uTP%wknCiGO-SaY04nImOO zaU_}zZDqOpD14-|_p-S(kAcf!i5jaDO1)e^E#$I2o=y*^?LYm2*8yRcr~c+|yLaLG zO#Q@%U+H)M%Wr=3`Q@+5e_0>eI_$bFe?GU*%iH4*m%l65#~ka|`h!`k@!_MM^y|OR zzsigwSBX*CTP02O|t!Be~wQ{3sr#ig39)k>ijSxi@Q5lXC={eu>n7%@pDmi`+3&#DWxq6@Z!ixkPY5nGNuyKg(K zv$Dc zyW>~!J^W_3PJc=C>bQwha+AKqV}v#Q%Jps~_5nM1x%J$dd-^1@&+I#&2}%uhGEFjt z*r(7>h(-)3Vk5ZuD92QIZfg1qyzX4|;pz0WhNP=|3A*CWZDn;P`FZA|2NBk$A6$J@ zQ>hD7w30hM@>+iE>lae$ehK%^CKOl%jXC{bRLaJeUu>T*_J925@`oSVw}0IK>E-R~ z#!cZjeEQ#i`@7$c|8;3{`cgl>eb>3&PJc{|a{V~3nvd7NcKl4GukM}4S7LmO=fC;! z|5|_fUw^;<{nr=z%$ueNHXlL(!-M?Z4t&6!hnTw!ZM@GG~AvKD{aoy-gIfT>$oG(9x@gfT4o`tf| zi%ZpYQCn-NMXTx(R;f!oocGUIMvQ1>DJzh>@4SW}P0O|zi&Qo9JwjR?x^=zYY!A=I zaH11R35iot&AP-Rb%Z*0Fv+IkT55VyJaeSyM1uEy$MK+@`IzD*|A@CFh?E`Lj&*t` z<5;Q2u$^{g3%W)v(2+rN+d)#j%b4Ts(6&YEo*if8#@=zoLIufoM2pPafi|Ff0zsXs z$-LVju1C%i<5)%c-6fQ7#JAY~yuE$k=~CB=*M+Bw1j8BdR=`+{TG(#fjHR-c+1)A< z6v)o4W#hHQo;wlI;}&>K=Q~{w&ow6&5al9>`f|Gc;ure;UqAoyrG49Dd;WZRy8gw- zKYUoUm%59vEZZsT8s9aB+L|5{)-~{?7}@Mw?zuW+#N%iE?%Qv-&;JzLwxO;z`c!^3 zWfV9e7fzo)ufP8Kx1TQ$%L7I4DVW@~8j`^n;aJs0a>sMD<;6#v#QN%w0!Fr|&Z054 z_~XtVnA+I9qAI#>x$S=2xXz7Of!P4f0N458?10YJ+2hvZb-UC`(9$ErWLJ)D#dgvMm%22cI%@J3nnDp+^^?a%iDiH-s}N;WM_A_W+P;H_O#JT z_hA{d7^qm(G@q2ul;dZv z&30re%`n9ncxQ8X>;1xBDGTL{)I*azj8<6Yreir$HWGFlbwL~2c=57H4tLK9k7l1I z84SA{{*9%uKvqnU#@iTQ3uSE|pZTb&^`9P2ECx$SGpg7rACNHWdDLO-K8q`rvc(vk z;=KyiAldTU<@3jdKm4DUkN@SLw|{}Gvj5Gm_mAfbn!XmTYebbJ zej*UWuTf0OTBFc!wB8_>Z@(;g+x6RSEiy7{V8D&rUSE2TK8@bmI{Wak#nxzzmUjt2 zz1zKwup_i_T5=EdVx>&pTRqAfhIgS9Q-v}lG`qdE%N9}e`ibj<+s1gK-bDIf^ASF9 z8v|X{n~Fh^Od>T0GC~@ylc%yQs;M0fv5<4rXOneC_S`xB2^uOHncXAO+@;B!I34Ko zs#1Pm{*I6wOWMLv0$L{qT}bmg26s(iD58O%!-iRz4_~z%^WPpt3HUR-;x*#hZp>kC-y9 zjI9XeamdDt(*_7}{6ORi&uZ47F7y7@3(FnVEvPXrw!qQbI||h``dnE5%Ewtz7@0hk$1glP&--)@Hq#3j{q+;?uXEcSo`UOt%SugLTn`HpxdFd zbD`VO9GkMlvLdFo)9p0WYxK!9$r`0FxUoZS8oOkJ^l0>*Jt?E;He#^NXV>vT=z-~53b;CPaLCluoN1fV zV`=I-Ln4A=T0-9J28>pSz+18s9AI~|YvKsqDv zf~0kH7|SwF=Land)xsGfBoUsGLo!6Q_jDI8Bl>U~(cifyX;NIX{Lwq~h&aHU=%ftz zecqIZi(>jL{bxy~GZJk^59s(8Fs7L{?GOS3OR~_~Px5yii0NTxw3uK9dB@()Q&tWW z!#jpx4(z2vKQwEHSk&+6*$n}%^h!LTE4tzK9X$=o#r9RSsVsY$pI9m=dSO{`W8azNF!hR{=+bJ>7>Jh9Z0nkOdy2m7jIOVZ zzUght@IyncNpZ|IJJA`PNt!Q8z88}-fOldL3=y!qds6S}$bu_k6m!Wt&dHE*05&2K zpSmIL5-C#=)micrNjM^hx@P8r-QzwFt;ey}5X3l(rI)vbN2Ay(bxB=NiwHlk;jS4% z99LMgTVwNai(qC|DPeK3@bW`^xwFHMa&7#CQd0j}oAN*XH@kH~^)O8WW$s62=)f{< z97;so@k|GlucLyDJ3MO~`YOxgq>udB_458CItu;nb(nBJyW3&xh8X2kY`Wh^#C1ks zAWmP9iWbx;0}2*QoSgOb2P&Bf`AAJ^mx9=e|7gua@hF6U(Zs#!?vyoi^W+Kt!j7Wa4IG zMAp%wSYLf#lGbwbDQJmttKWKf^JzAiQal-qx3=x{B>XUoh>+!Hl!S=cl9EVKu}DK_ zFq$2Mva(R@h>4x&k@_78Du+e=-KZj>bb`ncAxbsTrFxU;(Vj!^pbSEdB!^STAfPLC zU8Tlj$z{olJ_j`^DdwRbgr!aigQqgy;m+cbkw>@-=r}kxl+g?)U3Pj?bApe=F`4{Chm` z`!~T0&hg$)no0)^tfj6Zrlz4m4|0Pb9gpMdRN{z8nD4p^GWS(VcXB?DyZSo=TsU|%xAld z7rf&Oiyke6RD4?T1=YD`CM%}*)V>+^GT(#y*m)k=1{7AG(FsATZHb~upG)g*7G$UM z?YjIqS{6Q5B*~o>7Dt@k&)*icbN~2w`*ezKUDd@F904$J8p0oe`9dZ}{DAGW>}Bk)OwFz8~=K-vRvzf;%6|tN^VbPEH;2 zc0>csQZ{GSh{w2`?Q&XAabDV~ZqLOZj5>?VnHD(M+U3WW$AA9%_4Z1RK+Gbgg$zkN zGsE2_yFg_-^O$N`dXc5nfl*4%-_nR4L(p_apNoHYdO999lY3_3v|>q)ZBVl;l>CV= z&ZM9I9OtGK4zR?;Umd}E4W0SP86Nk*f^po8c_PPgDr6E3ptY!3JMZOY^>T5#5bk6GnXrO-0_W8kID5kH^gM=7lsfE zIy20K7PwQVmSQF*2wmRUmzu;QU~1{6x_3f1v!PK@VGQ~g#@gy$V_(2wnU85>OA_;? zJwN#KvtP>MmMJNN(lw;6-K58zlr%DOZ@ZN1$?r@*Nvmq9^zq(nwK=@&WXImvue3LA zjWI|NKcM*UBVTzp_zF~2QAo*5nMpNw!^(h4jA;Qm0Dy6aQAeW%exW`r`uySP!w-M+ zkk2{raM3NwHhfXaDHmU)aDIw&{QqRVNs}W-wxxOQplW6Se29rjGN*b~ucQ}UBE9SX z{|9>CyL$O@Vv>x>-2s@X-k}$2@L*MQ5i6&71Yo9mhjYI3bUNez`PrXVB)fEk`H25` zZU1ZrCdBD@H=Tc!rIoy+8ibx8C*z=irzetpOiG;w(@9#nT6FaY1$rB-DD(*N%{6YM zt5*e!BLz-7Cx2AQ@_O8kEcVyXFYL%gAG(XOS3WLq`~MZ+V}^6spB@7E3fe${AaKWA z_rFHd+mz-vL$TLxHEwZSQuZGT-Je~`Z|3#^rgH*2L-$GshD6u^azKs0z(nd!eISNZ zpaKOl!WM6=001BWNkl*4GYlCmRrF4qrk>hk=7nKQ7Id#ZBzTsqcU=;MB8 z0;1poR`>!fT`)Zni_0a3otiw-iP#;Kj35NU(t9_(c1vdtZ6TeqkH6$Vz6lawEgBri zh}f%zNW>6A(YL^pVHu>?djLCQWThP;M6XLwfzRMtXRSJr$3()+wq}pDBLsC1&=tOF zeC#V?RP%DXSjubZ(!X5=V`#&w!;v-Ij9}+J8l)kL`pD=GThS(PfXd8CLNzJRNxin}89;f^-H6aK;s#5r(z#ImpQlfD~}o z^Hna8C~>Im%@lVFW|=_(2l^(OnG(#LN!|7XfBs1h$5Yxm7@jybd%j4Rtu2 zAtQ09pjFh_#pf@OV`nZw6jO9_3S!!&P=RhqnLWecfebR^Ey<#XqYE(pw&PpVDH;*0 zjG)@rCS9us6gwT#LPZXvH=heZbDJoVP5ZLTUw;^ieT}{ux;gI z=gu}e#6g_pY}CqMZ1aFCUa7cJc7DO$q25OCD9E_I6GkL~A(Y2%7^{p*JKhM2BnXeT zER#J(wD;J4Pnc%Zf+4DD49B1rLlaq{v}gTB!c!cn6r<85aCmgbw1ZYwC5FKWF^c=N zxuGRC&g>`pRAR&Srt1klU zzrX);^?Cf0lPush3xP-83x!rla;n5+b7{vhlL?c;DQnRxdD;WSED#%LMK;6$h&VQ% z#(@!-F8$uIImGt-EmaQPaz>0!KzI27Iivy&J`U-DlkOwA&gHe5!minHg%*fFCuRwG z&E@l($SlJvVuU&^I4Eerv7+QY@L`73TSa@b(=(&Qh(V6uK+S;jTsTJ zn5MV$;WrUO6KrYz%+TSuo z%AWU@J%U7pDKglp1^|D<#~6U%eOaiq?=|+5CgB4Sxt~3Qf{pUJCUY(j%Rf3~0h_WAQq`0|VfOebAJq6A7~zFlRn=emP* #Z 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 literal 0 HcmV?d00001 diff --git a/plugins/sf2_player/logo.png b/plugins/sf2_player/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8cb2718f4c118841db773e023383fd181be0a247 GIT binary patch literal 2433 zcmV-{34Zp8P)h^}mj{m1oZk4WNlQy-#E20n)pwe&*~6(_8%g{77E;>k2$hEj9SkDf(Te!N?}V41 zfQ{jP%*z5=F;tDqGjb#>)K;5SGho7n_}xe9#u{PorcrWu*Xy!s)hbCzNs*kK9C5qd zaz6C*^hj+@jZ}ZIR=mGRl(r}1#W&R=ZVho0eSHokt6)k$u5-B?#5cnt-U)`3!r>v4 ze;XFok2k_~+pd=9pLtl4l9Gh8RxN-mUc6WaLswUq_SF0CnY6OSXju7H{KZS zualF%{asX4L`O%*xkK&qF?a4<4jec@OZGz28n&Tyg)v5Z$Y~8xG5BYz`qmMp{&1Q=l zbGzLvS+WGj?0mWn3(5*u70RliU!h^S-hy?$jo78J*zU4n`CbevUIU9FR34%(L`4A{ zIPVVJ13BZav3#EyKgBd7Jn+B+%$qllmX;Q3Yir5P&1LrN*@K$l2$K+Sw>FEtz6Z)3l#=Jg6ImRD^ysJ5N8vGun=jF5d0!YccU3`!pd`@aR3GGf_b*v zY??}5L~Cm+bLPy64nWP#LvjM~@$uYz^UZw}P)c#b4L1<<+R;jOBjInzhtEb?v(Ciy zm_+;$OxM|n9u%Y)o_lr>^8wJVgqdBFCJ+o+$jr>Vs03``!i8vBbe)lvl|@EI25GrB zafTR_O+&LO2n*eR>Z1F-ZhCk15;_th;*H=I>I-4fa(I0x?=)eY==M0fvk(!bxm26v2#~3@$vEf3Ro-_g2CW$;A^ z;W&367mKng0^53U!tWNqicg{Oq7;aPq^qa14Zq(%u#l#)Wy=;09Xf>D?M6hR$lL99 zVq;_bo$GKoXm4*nYmTay(6JD;4QA!Du=-LIK1Q%x8pb;G?2?ia7A#oMuh9DS>v1}r zl$DiXwOWadjU_KHj|medux8B~;^N}Y>zzCv4+#kgDCHusqn9sXO#=ikN$Iu|-YCr< zEh|>6=-0N3ii%|X`0sSfjI2*Q`Fcpe9F z$8(Ifmwuin1qB7-a=E0vyQ^K6s-};wlNRrZKE#|( zr*w674eB=M&YdgMrX)(;$7xcLZ8SV~k?Fz(;U|#cOw*5eH;$6Js`tb+&2Nb{H#ZMT zzN4dEUVM72_}@*D^3i(D3m4K7xm1`8afJpOJP*a2hqq3Xo!eiP^71k{c<|tW#5+6N zq@j9~G=4l)yvyPupK5Gf3aS6qFEqb~8Mh>8`MC>hxBDhqwfzB&th~9TXH8>N)>tIc zg^Dy_)_;XwT1;=znLy3H-onp9vhEdd{?B}3S_Gq)!jIEq)lKm^MqW&cmZl69V|GP4 zdK=7!_9pXaU4+j!!p;MOv<-(bjA0Dp{|o;Fq@yPWm#9Cx00000NkvXXu0mjfNvfeV literal 0 HcmV?d00001 diff --git a/plugins/sf2_player/patches_dialog.cpp b/plugins/sf2_player/patches_dialog.cpp new file mode 100644 index 000000000..518bc26ed --- /dev/null +++ b/plugins/sf2_player/patches_dialog.cpp @@ -0,0 +1,364 @@ +/* + * patches_dialog.cpp - display sf2 patches + * + * Copyright (c) 2008 Paul Giblock + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 "patches_dialog.h" + +#include +//#include + + +// Custom list-view item (as for numerical sort purposes...) +class patchItem : public QTreeWidgetItem +{ +public: + + // Constructor. + patchItem( QTreeWidget *pListView, + QTreeWidgetItem *pItemAfter ) + : QTreeWidgetItem( pListView, pItemAfter ) {} + + // Sort/compare overriden method. + bool operator< ( const QTreeWidgetItem& other ) const + { + int iColumn = QTreeWidgetItem::treeWidget()->sortColumn(); + const QString& s1 = text( iColumn ); + const QString& s2 = other.text( iColumn ); + if( iColumn == 0 || iColumn == 2 ) + { + return( s1.toInt() < s2.toInt() ); + } + else + { + return( s1 < s2 ); + } + } +}; + + + +// Constructor. +patchesDialog::patchesDialog( QWidget *pParent, Qt::WindowFlags wflags ) + : QDialog( pParent, wflags ) +{ + // Setup UI struct... + setupUi( this ); + + m_pSynth = NULL; + m_iChan = 0; + m_iBank = 0; + m_iProg = 0; + + // Soundfonts list view... + QHeaderView *pHeader = m_progListView->header(); +// pHeader->setResizeMode(QHeaderView::Custom); + pHeader->setDefaultAlignment(Qt::AlignLeft); +// pHeader->setDefaultSectionSize(200); + pHeader->setMovable(false); + pHeader->setStretchLastSection(true); + + m_progListView->resizeColumnToContents(0); // Prog. + //pHeader->resizeSection(1, 200); // Name. + + // Initial sort order... + m_bankListView->sortItems(0, Qt::AscendingOrder); + m_progListView->sortItems(0, Qt::AscendingOrder); + + // UI connections... + QObject::connect(m_bankListView, + SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), + SLOT(bankChanged())); + QObject::connect(m_progListView, + SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), + SLOT(progChanged(QTreeWidgetItem*,QTreeWidgetItem*))); + QObject::connect(m_progListView, + SIGNAL(itemActivated(QTreeWidgetItem*,int)), + SLOT(accept())); + QObject::connect(m_okButton, + SIGNAL(clicked()), + SLOT(accept())); + QObject::connect(m_cancelButton, + SIGNAL(clicked()), + SLOT(reject())); +} + + +// Destructor. +patchesDialog::~patchesDialog() +{ +} + + +// Dialog setup loader. +void patchesDialog::setup ( fluid_synth_t *pSynth, int iChan, const QString & _chanName, + lcdSpinBoxModel * _bankModel, lcdSpinBoxModel * _progModel ) +{ + + // We'll going to changes the whole thing... + m_dirty = 0; + m_bankModel = _bankModel; + m_progModel = _progModel; + + // Set the proper caption... + setWindowTitle( _chanName + " - Soundfont patches"); + + // set m_pSynth to NULL so we don't trigger any progChanged events + m_pSynth = NULL; + + // Load bank list from actual synth stack... + m_bankListView->setSortingEnabled(false); + m_bankListView->clear(); + + // now it should be safe to set internal stuff + m_pSynth = pSynth; + m_iChan = iChan; + + + fluid_preset_t preset; + QTreeWidgetItem *pBankItem = NULL; + // For all soundfonts (in reversed stack order) fill the available banks... + int cSoundFonts = ::fluid_synth_sfcount(m_pSynth); + for (int i = 0; i < cSoundFonts; i++) { + fluid_sfont_t *pSoundFont = ::fluid_synth_get_sfont(m_pSynth, i); + if (pSoundFont) { +#ifdef CONFIG_FLUID_BANK_OFFSET + int iBankOffset = ::fluid_synth_get_bank_offset(m_pSynth, pSoundFont->id); +#endif + pSoundFont->iteration_start(pSoundFont); + while (pSoundFont->iteration_next(pSoundFont, &preset)) { + int iBank = preset.get_banknum(&preset); +#ifdef CONFIG_FLUID_BANK_OFFSET + iBank += iBankOffset; +#endif + if (!findBankItem(iBank)) { + pBankItem = new patchItem(m_bankListView, pBankItem); + if (pBankItem) + pBankItem->setText(0, QString::number(iBank)); + } + } + } + } + m_bankListView->setSortingEnabled(true); + + // Set the selected bank. + m_iBank = 0; + fluid_preset_t *pPreset = ::fluid_synth_get_channel_preset(m_pSynth, m_iChan); + if (pPreset) { + m_iBank = pPreset->get_banknum(pPreset); +#ifdef CONFIG_FLUID_BANK_OFFSET + m_iBank += ::fluid_synth_get_bank_offset(m_pSynth, (pPreset->sfont)->id); +#endif + } + + pBankItem = findBankItem(m_iBank); + m_bankListView->setCurrentItem(pBankItem); + m_bankListView->scrollToItem(pBankItem); + bankChanged(); + + // Set the selected program. + if (pPreset) + m_iProg = pPreset->get_num(pPreset); + QTreeWidgetItem *pProgItem = findProgItem(m_iProg); + m_progListView->setCurrentItem(pProgItem); + m_progListView->scrollToItem(pProgItem); + + // Done with setup... + //m_iDirtySetup--; +} + + +// Stabilize current state form. +void patchesDialog::stabilizeForm() +{ + m_okButton->setEnabled(validateForm()); +} + + +// Validate form fields. +bool patchesDialog::validateForm() +{ + bool bValid = true; + + bValid = bValid && (m_bankListView->currentItem() != NULL); + bValid = bValid && (m_progListView->currentItem() != NULL); + + return bValid; +} + + +// Realize a bank-program selection preset. +void patchesDialog::setBankProg ( int iBank, int iProg ) +{ + if (m_pSynth == NULL) + return; + + // just select the synth's program preset... + ::fluid_synth_bank_select(m_pSynth, m_iChan, iBank); + ::fluid_synth_program_change(m_pSynth, m_iChan, iProg); + // Maybe this is needed to stabilize things around. + ::fluid_synth_program_reset(m_pSynth); +} + + +// Validate form fields and accept it valid. +void patchesDialog::accept() +{ + if (validateForm()) { + // Unload from current selected dialog items. + int iBank = (m_bankListView->currentItem())->text(0).toInt(); + int iProg = (m_progListView->currentItem())->text(0).toInt(); + // And set it right away... + setBankProg(iBank, iProg); + + if (m_dirty > 0) { + m_bankModel->setValue(iBank); + m_progModel->setValue(iProg); + } + + // Do remember preview state... + // if (m_pOptions) + // m_pOptions->bPresetPreview = m_ui.PreviewCheckBox->isChecked(); + // We got it. + QDialog::accept(); + } +} + + +// Reject settings (Cancel button slot). +void patchesDialog::reject (void) +{ + // Reset selection to initial selection, if applicable... + if (m_dirty > 0) + setBankProg(m_bankModel->value(), m_progModel->value()); + // Done (hopefully nothing). + QDialog::reject(); +} + + +// Find the bank item of given bank number id. +QTreeWidgetItem *patchesDialog::findBankItem ( int iBank ) +{ + QList banks + = m_bankListView->findItems( + QString::number(iBank), Qt::MatchExactly, 0); + + QListIterator iter(banks); + if (iter.hasNext()) + return iter.next(); + else + return NULL; +} + + +// Find the program item of given program number id. +QTreeWidgetItem *patchesDialog::findProgItem ( int iProg ) +{ + QList progs + = m_progListView->findItems( + QString::number(iProg), Qt::MatchExactly, 0); + + QListIterator iter(progs); + if (iter.hasNext()) + return iter.next(); + else + return NULL; +} + + + +// Bank change slot. +void patchesDialog::bankChanged (void) +{ + if (m_pSynth == NULL) + return; + + QTreeWidgetItem *pBankItem = m_bankListView->currentItem(); + if (pBankItem == NULL) + return; + + int iBankSelected = pBankItem->text(0).toInt(); + + // Clear up the program listview. + m_progListView->setSortingEnabled(false); + m_progListView->clear(); + fluid_preset_t preset; + QTreeWidgetItem *pProgItem = NULL; + // For all soundfonts (in reversed stack order) fill the available programs... + int cSoundFonts = ::fluid_synth_sfcount(m_pSynth); + for (int i = 0; i < cSoundFonts && !pProgItem; i++) { + fluid_sfont_t *pSoundFont = ::fluid_synth_get_sfont(m_pSynth, i); + if (pSoundFont) { +#ifdef CONFIG_FLUID_BANK_OFFSET + int iBankOffset = ::fluid_synth_get_bank_offset(m_pSynth, pSoundFont->id); +#endif + pSoundFont->iteration_start(pSoundFont); + while (pSoundFont->iteration_next(pSoundFont, &preset)) { + int iBank = preset.get_banknum(&preset); +#ifdef CONFIG_FLUID_BANK_OFFSET + iBank += iBankOffset; +#endif + int iProg = preset.get_num(&preset); + if (iBank == iBankSelected && !findProgItem(iProg)) { + pProgItem = new patchItem(m_progListView, pProgItem); + if (pProgItem) { + pProgItem->setText(0, QString::number(iProg)); + pProgItem->setText(1, preset.get_name(&preset)); + //pProgItem->setText(2, QString::number(pSoundFont->id)); + //pProgItem->setText(3, QFileInfo( + // pSoundFont->get_name(pSoundFont)).baseName()); + } + } + } + } + } + m_progListView->setSortingEnabled(true); + + // Stabilize the form. + stabilizeForm(); +} + + +// Program change slot. +void patchesDialog::progChanged (QTreeWidgetItem * _curr, QTreeWidgetItem * _prev) +{ + if (m_pSynth == NULL || _curr == NULL) + return; + + // Which preview state... + if( validateForm() ) { + // Set current selection. + int iBank = (m_bankListView->currentItem())->text(0).toInt(); + int iProg = _curr->text(0).toInt(); + // And set it right away... + setBankProg(iBank, iProg); + // Now we're dirty nuff. + m_dirty++; + } + + // Stabilize the form. + stabilizeForm(); +} + + +#include "patches_dialog.moc" diff --git a/plugins/sf2_player/patches_dialog.h b/plugins/sf2_player/patches_dialog.h new file mode 100644 index 000000000..3f4aada0a --- /dev/null +++ b/plugins/sf2_player/patches_dialog.h @@ -0,0 +1,93 @@ +/* + * patches_dialog.h - display sf2 patches + * + * Copyright (c) 2008 Paul Giblock + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _PATCHES_DIALOG_H +#define _PATCHES_DIALOG_H + +#include "ui_patches_dialog.h" +#include "lcd_spinbox.h" + +#include +#include + +//---------------------------------------------------------------------------- +// qsynthPresetForm -- UI wrapper form. + +class patchesDialog : public QDialog, private Ui::patchesDialog +{ + Q_OBJECT + +public: + + // Constructor. + patchesDialog(QWidget *pParent = 0, Qt::WindowFlags wflags = 0); + + // Destructor. + virtual ~patchesDialog(); + + + void setup(fluid_synth_t *pSynth, int iChan, const QString & _chanName, + lcdSpinBoxModel * _bankModel, lcdSpinBoxModel * _progModel ); + +public slots: + + void stabilizeForm(); + void bankChanged(); + void progChanged( QTreeWidgetItem * _curr, QTreeWidgetItem * _prev ); + +protected slots: + + void accept(); + void reject(); + +protected: + + void setBankProg(int iBank, int iProg); + + QTreeWidgetItem *findBankItem(int iBank); + QTreeWidgetItem *findProgItem(int iProg); + + bool validateForm(); + +private: + + // Instance variables. + fluid_synth_t *m_pSynth; + + int m_iChan; + int m_iBank; + int m_iProg; + + //int m_iDirtySetup; + //int m_iDirtyCount; + int m_dirty; + + lcdSpinBoxModel * m_bankModel; + lcdSpinBoxModel * m_progModel; +}; + + +#endif + diff --git a/plugins/sf2_player/patches_dialog.ui b/plugins/sf2_player/patches_dialog.ui new file mode 100644 index 000000000..5204dc09d --- /dev/null +++ b/plugins/sf2_player/patches_dialog.ui @@ -0,0 +1,216 @@ + + rncbc aka Rui Nuno Capela + qsynth - A fluidsynth Qt GUI Interface. + + Copyright (C) 2003-2007, rncbc aka Rui Nuno Capela. All rights reserved. + + 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; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + + patchesDialog + + + + 0 + 0 + 480 + 350 + + + + + 300 + 150 + + + + Qsynth: Channel Preset + + + + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + + + 20 + 0 + + + + + 80 + 32767 + + + + Bank selector + + + true + + + 4 + + + false + + + true + + + false + + + true + + + true + + + + Bank + + + + + + Program selector + + + true + + + 4 + + + false + + + true + + + false + + + true + + + true + + + + Patch + + + + + Name + + + + + + + + + 4 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 120 + 8 + + + + + + + + + + + OK + + + + 0 + 0 + + + + true + + + + + + + + + + Cancel + + + + 0 + 0 + + + + + + + + + + + m_okButton + m_cancelButton + + + + diff --git a/plugins/sf2_player/sf2_player.cpp b/plugins/sf2_player/sf2_player.cpp new file mode 100644 index 000000000..0225bbc2c --- /dev/null +++ b/plugins/sf2_player/sf2_player.cpp @@ -0,0 +1,421 @@ +/* + * sf2_player.cpp - a soundfont2 player using fluidSynth + * + * Copyright (c) 2008 Paul Giblock + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 +#include +#include +#include + +#include "sf2_player.h" +#include "engine.h" +#include "instrument_track.h" +#include "instrument_play_handle.h" +#include "note_play_handle.h" +#include "knob.h" +#include "song.h" +#include "automatable_model_templates.h" + +#include "main_window.h" +#include "patches_dialog.h" +#include "tooltip.h" +#include "lcd_spinbox.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +extern "C" +{ + +plugin::descriptor sf2_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "Sf2Player", + QT_TRANSLATE_NOOP( "pluginBrowser", + "SoundFont synthesizer" ), + "Paul Giblock ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + +sf2Instrument::sf2Instrument( instrumentTrack * _instrument_track ) : + instrument( _instrument_track, &sf2_plugin_descriptor ), + m_bankNum( -1, -1, 999, 1, this ), + m_patchNum( -1, -1, 127, 1, this ), + m_filename( "" ), + m_fontId( 0 ) +{ + + m_settings = new_fluid_settings(); + + /* Set the synthesizer settings, if necessary */ + + + m_synth = new_fluid_synth( m_settings ); + + + //fluid_settings_setstr(settings, "audio.driver", "jack"); + + //adriver = new_fluid_audio_driver(settings, synth); + + instrumentPlayHandle * iph = new instrumentPlayHandle( this ); + engine::getMixer()->addPlayHandle( iph ); + + connect( &m_bankNum, SIGNAL( dataChanged() ), + this, SLOT( updatePatch() ) ); + + connect( &m_patchNum, SIGNAL( dataChanged() ), + this, SLOT( updatePatch() ) ); +} + + + + +sf2Instrument::~sf2Instrument() +{ + engine::getMixer()->removePlayHandles( getInstrumentTrack() ); + delete_fluid_synth( m_synth ); + delete_fluid_settings( m_settings ); +} + + + + +void sf2Instrument::saveSettings( QDomDocument & _doc, + QDomElement & _this ) +{ + _this.setAttribute( "src", m_filename ); + m_patchNum.saveSettings( _doc, _this, "patch" ); + m_bankNum.saveSettings( _doc, _this, "bank" ); +} + + + + +void sf2Instrument::loadSettings( const QDomElement & _this ) +{ + openFile( _this.attribute( "src" ) ); + m_patchNum.loadSettings( _this, "patch" ); + m_bankNum.loadSettings( _this, "bank" ); +} + + + + +QString sf2Instrument::nodeName( void ) const +{ + return( sf2_plugin_descriptor.name ); +} + + +void sf2Instrument::openFile( const QString & _sf2File ) +{ + if( m_filename != "") + { + fluid_synth_sfunload( m_synth, m_fontId, TRUE); + } + + m_fontId = fluid_synth_sfload( m_synth, _sf2File.toLocal8Bit(), TRUE ); + + if( m_fontId >= 0) + { + m_patchNum.setValue(0); + m_bankNum.setValue(0); + m_filename = _sf2File; + + emit fileChanged(); + } +} + +void sf2Instrument::updatePatch( void ) +{ + printf("update patch\n"); + if( m_bankNum.value() >= 0 && m_patchNum.value() >= 0 ) { + fluid_synth_program_select( m_synth, 1, m_fontId, + m_bankNum.value(), m_patchNum.value() ); + } +} + + + +void sf2Instrument::playNote( notePlayHandle * _n, bool ) +{ + const float LOG440 = 2.64345267649f; + + const int defaultVelocity = 80; + + const f_cnt_t tfp = _n->totalFramesPlayed(); + + int midiNote = (int)floor( ( log2( _n->frequency() ) - LOG440 ) * 12 +69-58)+0.5; + + if ( tfp == 0 ) + { + _n->m_pluginData = new int( midiNote ); + fluid_synth_noteon( m_synth, 1, midiNote, defaultVelocity ); + } + else if( _n->released() ) + { + // Doesn't happen with release frames = 0 + } + +} + + +void sf2Instrument::waitForWorkerThread( void ) +{ + // No waiting required, at least not that I know of + return; +} + + +void sf2Instrument::play( bool _try_parallelizing ) +{ + const fpp_t frames = engine::getMixer()->framesPerPeriod(); + + sampleFrame * buf = new sampleFrame[frames]; + + // Assumes stereo and float sample_t + + fluid_synth_write_float( m_synth, frames, buf, 0, 2, buf, 1, 2 ); + + getInstrumentTrack()->processAudioBuffer( buf, frames, NULL ); + + delete[] buf; + + if( !_try_parallelizing ) + { + waitForWorkerThread(); + } +} + + + +void sf2Instrument::deleteNotePluginData( notePlayHandle * _n ) +{ + int * midiNote = static_cast( _n->m_pluginData ); + + fluid_synth_noteoff( m_synth, 1, *midiNote ); + + delete midiNote; + + _n->noteOff(); +} + + +pluginView * sf2Instrument::instantiateView( QWidget * _parent ) +{ + return( new sf2InstrumentView( this, _parent ) ); +} + + + + +sf2InstrumentView::sf2InstrumentView( instrument * _instrument, + QWidget * _parent ) : + instrumentView( _instrument, _parent ) +{ + QVBoxLayout * vl = new QVBoxLayout( this ); + QHBoxLayout * hl = new QHBoxLayout(); + + // File Button + m_fileDialogButton = new pixmapButton( this, NULL ); + m_fileDialogButton->setCursor( QCursor( Qt::PointingHandCursor ) ); + m_fileDialogButton->setActiveGraphic( embed::getIconPixmap( + "project_open_down" ) ); + m_fileDialogButton->setInactiveGraphic( embed::getIconPixmap( + "project_open" ) ); + connect( m_fileDialogButton, SIGNAL( clicked() ), + this, SLOT( showFileDialog() ) ); + toolTip::add( m_fileDialogButton, tr( "Open other SoundFont file" ) ); + + m_fileDialogButton->setWhatsThis( + tr( "Click here to open another SF2 file" ) ); + + // Patch Button + m_patchDialogButton = new pixmapButton( this, NULL ); + m_patchDialogButton->setCursor( QCursor( Qt::PointingHandCursor ) ); + m_patchDialogButton->setActiveGraphic( embed::getIconPixmap( + "track_op_menu" ) ); + m_patchDialogButton->setInactiveGraphic( embed::getIconPixmap( + "track_op_menu" ) ); + connect( m_patchDialogButton, SIGNAL( clicked() ), + this, SLOT( showPatchDialog() ) ); + toolTip::add( m_patchDialogButton, tr( "Choose the patch" ) ); + + + // LCDs + m_bankNumLcd = new lcdSpinBox( 3, this, "Bank" ); + m_bankNumLcd->setLabel( "Bank:" ); + m_bankNumLcd->addTextForValue( -1, "---" ); + m_bankNumLcd->setEnabled( FALSE ); + + m_patchNumLcd = new lcdSpinBox( 3, this, "Patch" ); + m_patchNumLcd->setLabel( "Patch:" ); + m_patchNumLcd->addTextForValue( -1, "---" ); + m_patchNumLcd->setEnabled( FALSE ); + + hl->addWidget( m_fileDialogButton ); + hl->addWidget( m_bankNumLcd ); + hl->addWidget( m_patchNumLcd ); + hl->addWidget( m_patchDialogButton ); + + vl->addLayout( hl ); + + // Next row + + hl = new QHBoxLayout(); + + m_filenameLabel = new QLabel( this ); + + hl->addWidget( m_filenameLabel ); + + vl->addLayout( hl ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( + "artwork" ) ); + setPalette( pal ); + + updateFilename(); +} + + + + +sf2InstrumentView::~sf2InstrumentView() +{ +} + + +void sf2InstrumentView::modelChanged( void ) +{ + sf2Instrument * k = castModel(); + m_bankNumLcd->setModel( &k->m_bankNum ); + m_patchNumLcd->setModel( &k->m_patchNum ); + + connect(k, SIGNAL( fileChanged( void ) ), + this, SLOT( updateFilename( void ) ) ); + + updateFilename(); + +} + + +void sf2InstrumentView::updateFilename( void ) +{ + m_filenameLabel->setText("File: " + + castModel()->m_filename + + "\nPatch: TODO"); + update(); +} + + +void sf2InstrumentView::showFileDialog( void ) +{ + sf2Instrument * k = castModel(); + + QFileDialog ofd( NULL, tr( "Open SoundFont file" ) ); + ofd.setFileMode( QFileDialog::ExistingFiles ); + + QStringList types; + types << tr( "SoundFont2-Files (*.sf2)" ); + ofd.setFilters( types ); + + if( k->m_filename == "" ) + { + ofd.setDirectory( + configManager::inst()->userSamplesDir() ); + } + else if( QFileInfo( k->m_filename ).isRelative() ) + { + QString f = configManager::inst()->userSamplesDir() + + k->m_filename; + if( QFileInfo( f ).exists() == FALSE ) + { + f = configManager::inst()->factorySamplesDir() + + k->m_filename; + } + + ofd.selectFile( f ); + } + else + { + ofd.selectFile( k->m_filename ); + } + +// HACK + ofd.setDirectory("/home/llama"); + + if( ofd.exec() == QDialog::Accepted && !ofd.selectedFiles().isEmpty() ) + { + QString f = ofd.selectedFiles()[0]; + if( f != "" ) + { + k->openFile( f ); + engine::getSong()->setModified(); + } + } + + +} + +patchesDialog * sf2InstrumentView::s_patchDialog = NULL; + +void sf2InstrumentView::showPatchDialog( void ) { + + sf2Instrument * k = castModel(); + + if( s_patchDialog == NULL ) { + printf("Creating patchDialog\n"); + s_patchDialog = new patchesDialog(this); + } + s_patchDialog->setup( k->m_synth, 1, k->getInstrumentTrack()->name(), + &k->m_bankNum, &k->m_patchNum ); + + s_patchDialog->exec(); +} + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( model *, void * _data ) +{ + return( new sf2Instrument( + static_cast( _data ) ) ); +} + + +} + +#include "sf2_player.moc" + diff --git a/plugins/sf2_player/sf2_player.h b/plugins/sf2_player/sf2_player.h new file mode 100644 index 000000000..9a8ea6330 --- /dev/null +++ b/plugins/sf2_player/sf2_player.h @@ -0,0 +1,143 @@ +/* + * sf2_player.h - a soundfont2 player using fluidSynth + * + * Copyright (c) 2008 Paul Giblock + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _SF2_PLAYER_H +#define _SF2_PLAYER_H + +#include "instrument.h" +#include "pixmap_button.h" +#include "instrument_view.h" +#include "knob.h" +#include "lcd_spinbox.h" +#include "fluidsynth.h" + +class sf2InstrumentView; +class notePlayHandle; + +class patchesDialog; +class QLabel; + +class sf2Instrument : public instrument +{ + Q_OBJECT +public: + sf2Instrument( instrumentTrack * _instrument_track ); + virtual ~sf2Instrument(); + + virtual void play( bool _try_parallelizing ); + + virtual void FASTCALL playNote( notePlayHandle * _n, + bool _try_parallelizing ); + virtual void FASTCALL deleteNotePluginData( notePlayHandle * _n ); + + + virtual void FASTCALL saveSettings( QDomDocument & _doc, + QDomElement & _parent ); + virtual void FASTCALL loadSettings( const QDomElement & _this ); + + virtual QString nodeName( void ) const; + + virtual f_cnt_t desiredReleaseFrames( void ) const + { + return( 0 ); + } + + virtual bool notePlayHandleBased( void ) const + { + return( FALSE ); + } + + + virtual bool supportsParallelizing( void ) const + { + return( FALSE ); + } + + virtual void waitForWorkerThread( void ); + + + virtual pluginView * instantiateView( QWidget * _parent ); + +public slots: + void openFile( const QString & _sf2File ); + void updatePatch( void ); + + +private: + fluid_settings_t* m_settings; + + fluid_synth_t* m_synth; + + fluid_audio_driver_t* m_adriver; + + int m_fontId; + + + + QString m_filename; + + lcdSpinBoxModel m_bankNum; + lcdSpinBoxModel m_patchNum; + + friend class sf2InstrumentView; + +signals: + void fileChanged( void ); + void patchChanged( void ); + +} ; + + + +class sf2InstrumentView : public instrumentView +{ + Q_OBJECT +public: + sf2InstrumentView( instrument * _instrument, + QWidget * _parent ); + virtual ~sf2InstrumentView(); + +private: + virtual void modelChanged( void ); + + pixmapButton * m_fileDialogButton; + pixmapButton * m_patchDialogButton; + + lcdSpinBox * m_bankNumLcd; + lcdSpinBox * m_patchNumLcd; + + QLabel * m_filenameLabel; + + static patchesDialog * s_patchDialog; + +protected slots: + void showFileDialog( void ); + void showPatchDialog( void ); + void updateFilename( void ); +} ; + + + +#endif