From 868ec9f2d6fe23c66215924867db343cd4825bcb Mon Sep 17 00:00:00 2001 From: r-lyeh Date: Fri, 26 Feb 2016 15:27:57 +0100 Subject: [PATCH] add support for non-timidity soundfonts (like Fluid R3) --- README.md | 5 +-- test_data/mid/migm1.mid | Bin 0 -> 29707 bytes test_data/mid/migm1.txt | 43 ++++++++++++++++++++++++ third_party/libmodplug/src/load_pat.cpp | 38 +++++++++++++++------ 4 files changed, 73 insertions(+), 13 deletions(-) create mode 100644 test_data/mid/migm1.mid create mode 100644 test_data/mid/migm1.txt diff --git a/README.md b/README.md index 5dbffc4..7c3e1c2 100644 --- a/README.md +++ b/README.md @@ -39,5 +39,6 @@ Libyquist is released under the 2-Clause BSD license. All dependencies and codec ## About MIDI files * [SoundFonts](https://en.wikipedia.org/wiki/SoundFont) are required to decode MIDI files. -* Libnyquist supports `.pat` soundfonts only. Use [unsf tool](http://alsa.opensrc.org/Unsf) to convert from `.sf2` to `.pat` soundfonts. -* Also, [sfark tool](http://www.melodymachine.com/sfark.htm) may be needed to unpack legacy compressed soundfonts. +* Libnyquist supports `.pat` (GUS) soundfonts only. Use [unsf tool](http://alsa.opensrc.org/Unsf) to convert from `.sf2` to `.pat` soundfonts, and [sfark tool](http://www.melodymachine.com/sfark.htm) to unpack compressed soundfonts (`.sf2ark`). +* The compiler directive `PAT_CONFIG_FILE` tells libnyquist what soundfont file is set by default (defaults to `pat/timidity.cfg`; valid options are `FluidR3_GM2/FluidR3_GM2-2.cfg`, etc). +* Additionally, there is runtime check for the environment variable `MMPAT_PATH_TO_CFG`, which contains the path to the config file. For more info please check [this source file](third_party\libmodplug\src\load_pat.cpp) diff --git a/test_data/mid/migm1.mid b/test_data/mid/migm1.mid new file mode 100644 index 0000000000000000000000000000000000000000..aef79ef3be6e84b6a2a533f6d965122e68cd2f1b GIT binary patch literal 29707 zcmc({+jkpRn&?*rkOT?d?{@+u0SXc!38Fv(6pMuofFMu+2nZlWON7m~Wq9O1ZMi+3 z>6vl2r+XDi+vBxPvKB6s!>p`iS?za^ySiL6z1r_8ZqNVh*M9fJ z#q{s)Y8`-)|5f|lvaV~tb5HpF{-a#Rf0#*EGe`dNKF|KowO@at*{XJ8tG713*!ahS z_G{0+<_+~WLVN$?#=5a!htwC3f9*M0Y21!_?RE9V-`-Z<#=7x$ zTk8BrYijP-wa|Z~JjXw86i?o?i|R(Bc$_R(-TX{8N~a@sS>0o4z%HrHM*g^u`D|Xr z8pV?RGk)8XjeIp{=hY62sa$o8pLcUgZ)B^fJXo^IY~+qdm`&!?Mk9ApvU6&?kv*|L zX3d_4S^+cur>eW3YJ8D4#rF zv>KHYd)lt3j~b;DdkqMmgAo49!t`+uQ_-UGz;&tw`n*c8wV&Cf0F+OP0B+0XW9GIR z#i|{I-YP4pQoh$&ELOd&#SmDuw3AnE;P=YMGP_Y$IbinzG~v-sGM5r8%YfcsC0Qzs zvA6**BdkSXWPqi=LIDeK6Dc}GA2JnX+u0aD{+b_kMjxxh-De@y$mZ<{RQzSX{L=F!4-cONG$fHqzA|JB3m*C*5{h{oPU{jVEN(7v4rHA7JJkAO?WA=)#8uSI984kO_HLX4KndbR-N^-;|(^1WoNEj z6~rWg(-{cfM0{cJc2Pp@#O^JAB+{py06jgExL$*C1*of0IZc+Ib)!fLem7IG65&ue z-77!qXBJhtA(1XU8)4hMlCb=dEirzv{*NR2uRTihKK!r|ebi@1(P8e9JN?M59g?aSZPVPGt&26M`lQMR|So$=b+vf;p;v|O1-Q9G$dGHM{F<{HNCl5Hsa zX(L~8WgofHPj+$S;k@e45{^68n7yOyl}7B5*N!1`&T=cOEB)vglH)MaZDe{;k|(Nk zLv^JEG;%O)N3dJ&k*>h^GzRDvthq8z`awOPR9*@Id|3jLtmv6Xm&%>qK9fZb@8b-1oQ4)x$r-gVxm`p2z zac@?Zsx^FVwQLb%-iEZe(j%FwiEJhmH zT|J#~=abLP1J_Pv1cZ>qDq!n|@|{KujN;LFiV%PD=Vrx)IH*}q3*baYmTDu93>7VX z@S*w0wUdm1sgI?+a_uOcJaPYP-mUj{4#rqT16^4Gh)T$MAO1OE(o4MJYuE7_#O%YJ zcpb>>_P!dg5*HE)eK-so{$=77y}lu#@Q32nr7-Gu$EyZk`ETO&E%ZLniC4*)B$+=k zUWZ`k^g3P@Vrt)t*C>HC?3kw$ukR4AuIqS(MHu}$UP&MWD4lribrPDL!bjXryzUB@ zPP|SLuWM|-0ooPN+9Sj(!9cc)vH4}Z&J!#5iPw3F*C~-VQ|bC+;#JQ-&Hq5W&Jky8 ze`LIR;bE^6uejw&CtiD!s_R?vxZBB1Z--=gs{M3opE^*-> zh*x*MQg`B20J~m|SJLs5$=Blbot=#9kBrwIqcV;~BAs|8RGpCR#48D4*Y#Sw5?l~} zEnamfKlq_|B_iz#@v3Jl`m6EUYf8#{C0_OXqptK1#p~vC0MkD{N`bsSr#9-9dzD|A30YW(= zTfP#nuh&-+@S|}Ee|LSwN$9UfsjmaX>+jdsRc0rg`ufMm>&yCj9j{VfVcnIhyo^_= zuQy(e*Wpfm{TGc_i+G*=roQfC(&2CF>mM7hLF%i->+jXqKQ&%Sq2I2rop>GS)Yo1o zUU6ZK;wANUz;PF+zINi(eO+G(98R2_`a1ECMGpUU-MjHQ4gNumHq~OZKj6n`Bd?B1 z)kWl{Q-4DarW%yx=K+44C%BP#d4Dn3_v-z{LAg}OJn>tH#bjx(bARz0 z=l&w(++W=Pr$OyEo*!%8r~hZRSv1}{qn&ORT=&CgV`q(;uTf?%otj01TyAMa&e zt{|Gli2YamwkMkTsCAZC4_Hj)qGSAwkbaukXetjDt{|GZ_z1H}4$RG*Q98@1cr$C* zAG2mpL#+Us9Z1+=e#|t>k>odI<8H{B%{=6t!-fI)+0Xd>7}gBddYk2V92Sesvhje? zYE}$;`iv`xX34PEfbfAZT>=5e0e1H=wTTwtI$Z*N9`t2Lx}*S=sM$D&1~470N``2S*(f}^Ub1VGG2@{xqLV~0<_GQvU-FbKVY=yn@8~^3$Es2 z_`%sB3a$WHQRB^{$PV+p%|o6KosD;{H-5}`Hr*^+xA^gx4Y%0v81-zx)T3rTl47)b zFio6=f#zXIFpM@U(K|d(G|SOUCE{XlqIqbzn7V(cN-!2?>MhK-!FbfpUJ zWKYy~&k}fku67?0hMEOrFCe=SPo}FL_884vbpYtq9MUDMIM98~a#hSQ(M-oxq3UM! zPJyQ*WIsaojM7Th1N?X_LqJrNow!U1h_W^@1~`f5Tm39Otp(sCvb%f<0j)kle>^oZIqqC zlIq9RlX=y}!h<}PC|b5({N~5ad~F?ne6yKn7o9>gr&Jcnaw?idUM?4MH5Uu(IdzQp zTnCb64-!ac?q;zz1Dc;e^Om4n#O+g1)S9KLBqR@Ue4B+y5ZwmLA%MhSQJuw_rTQHp z@OO}w)f=c*Lhl$S{9EL+2b!hYCjcBY%QfWaW^DsOar_Ybr-`Rz2|hXc$ZXk?upn-0 z5oavb>|Qp13WL7{JP-C{sW!mcU56`zv4|^?hf6gohEeVodiJ8i zPnuavl>H9cyoFV+EvO)jrHJ}u$&xgS=%ULAvm;+Q_{RKS2MD$s}E`{%tlE5=~4iG zV$I}Ec{4vxO4;2ci)D7p(3xs(Z#_xpyU(^&nR}pS%q*S7l-}IoR??h0+fnyTxK-63 zfy~u3_A8OpAc2{PsP~)d_-$sNG}G0m$z#bJ`^`;r2>c&!Qm`_+?`+3Q;Pn!cBn;8X zjb?23v03s#Vvp^EXB>T+k$f05A4Qa{HDh;1SxYt5$*0U2&GhlRNwb@smFDK1pMg3B zzXNBRYMk?OGh^nRY?!XT8$)Yp^{|;XZ-KyU?%e6;d4o%ZrrLgLkV%!Y-{r*AH1m%k z+uhtM9c`H2vn};-0}0KPJ;n52H@EkX;rWfGS$f;p^)gj7u;YUV_s$-uU!j1 z|98IA{xcDLEnSjo9Ph-x*x!5^|JU~K!sj1$;{N~xxL%9@AGZGq@&ESA_#X!U|CjiG z)&4s#uGixKe^6)X zq{b2F<$-9r_3}WJ{^>`beEj2Q@BgJg^zO}j+uIR&q5E6sK-77m8~raM+HXCE<~`|d zsrYg>8ZO>lFKzrUPs@SNhYtgvPaX%(-#sTdxr3x09;z;C2+hW^8u@K4WOud7H7#4$ zinYme4jEY~DZUmUyuQdrEau!iWYy2Vft%^Txyov}MKR-zV$r&LPBG)$$N6Zym8oj^ zs$P2TJLevddzO+~Y~>BQE^oO9nwZOf=%w8}zN&(`Ka$j-hpaOJ9&wLrLWo>eaD zHvN4+fO@eGlZyaCkHWdwDni-N%hmf(?sneU0hq688KJz?p^TVItxR0cTm0H!PUA9{ z6V7NWTNBdd`YITa58ceRXo^8k8Sl(-WVT0Ij%Fa^@9@(@SK7)(wQ>|#0hA&RV1Fx9 z)ABVsJwF1vGOD)(#(Z2WQMKduA??a5FQmI$#k!uWYiTf&_j9VRs3uy_<%%Y4M3{5& z_N1u1t#nl5wPxOzDjQlhI&{v#Ca-$aYP>90MebJKpT?q4)38=5@AIOFc&i*r9!C55 zIg(dvt&E{ptUqEO~VgIcXDcCA+s(e6FYKTCTQm&Q)_- z4bo}0=z-EsBi8BW~-FT~>w))PG)FPQo7%mzj)26s_I-bmi zQ+ZfGipa9%cw30_MpV!oVwG( zEbyvlYTf50xqw;DsD)N0>PTaWG~FF(hFYaMK1;x?b|&fDCh%Dthh5@Kyx}2W?3wHM z6BSj5Ksw4vA*+VUYFNyL^X5^f^Prmm9qpKjU;W(RKbbLtO z**H-cAx-FIV;g5Dh&);KE8<^Am!;<`;zEwz=U`FKgtU^e31vJUnZ<=_TDqp^h*n%9 zt$Mh{X{94X11@yGGe-in`&wzDRdPj$NqnuhNaXNJhwCC*f95#)lBV3PBa68d-@u5E zsV;nM97imwAi5lbLyp#bE#YgWISE(O*{I5^K8%2==I~$wyLG7cDx@#Vho>!Zif-i$ z9Wj=3?5f1M)rVqI?9s}pb=(Y(!zV0_%nlzV2F?mN32H*C!$6`bRK3>9M#yRozfJ`5 zKpFzj$!+5R;zw-0`As$t!Z1=vHpgi(o9NWvF)?bLC!1q)5}T9Fof!SpNzzazDxGXh z8JQ=W>rOV0AS$VW43A?vY2y!PbMH6Vd;!Xs4ex=Q*Rwg?47ChHJBq7f*ne&)zZipz z$%O|tm>{bXy<@8GoJOIoQgE`_4^y-LjG;a?Q9_i7TpsU~iQIS}x*a zd6;ix@H2{mn|K)`zFH+iPsNk@NIDl8m(cIbjh?5}SWc~wQBlDJ3*lBNJ`Z0Z6g0~7 z{Z`2uMZ`JIqJ&;cQC(Fs8y9Dw+!|UsDjv%XP7L09faI!wy;Y2`(9eR*b~8&v>^kW< z>S5NPAh57NVOx{gR77-O;FDdz`ct4*#9dr4Y%(iK-c?8h!IaU(?Cv$}XbSgs*pL*x z!K@!x($!3h*f^-_kkDE=t9X8J{et>l>%hVhNYX3J@ylJIw#kIR+kFJl;DPew)U6iV zna^0O9YFHLqSPMd0PM&A_~|;pO0v7EACR&RR1dkMLK1YKpknKt?C(BMTdf1970FfS ze(QNCHMh^HAE|@$A4#H(wGOL#jYy|atD&fxr5#q^=c&7< z9<>fFy=E!W!HMNLuc@9xWt_+r)P3OeLsekTbBLa(ODEMN7i~4eE4kuC-K?nr0z-eS z#z4kbSFTn~>0Dl(KUU$I8siJ8)*JYSafH3~H*ll^+11jH)RIgbDNmu(7#vwz!O9R^ zlzgqAK53D=(LmYqlf@ALeG)AZfSAj%mqNpbB_Di^ue!jT>qzMZwJLkT#|1R_+_X{! z^_P-`Ae~bI@G-a0DpX;_M<9|@*frlOMfJBLrSrEWD@0l+alJyLT2ZbOwbMGmK#}J> z^_{3vt77OU@l<(9dmMG0pGaQad@L~^ZgKH)qE49eR#ZSL=;P=ERN-k=LK+z1aho+_ zL^~#(b2)tMRJU85eugCO!wX50XknVz)yq*b>^(g4^^Q<0QMA792xlZ&I2~b3T#Bqu zG4jw6YPq_e{<T*n9UY<9=?J;U?do)dDANVO zL@V!;HgJoMFmV_i;3o}(bcA@nG?PPFHCG|bb0j6FBODf|Av+WesWPv0gflsU!RZLq zs~zFQbw}8*q)yu;Ea?bo)Pro7*U4qDm;Gpko~_9 zQn~2}G1a(Jr30!Q8N}V9ts_iE+sj4Y5!ySBQkJ>2mJCE$?mEV`%H%nMg*K~oNa2Zy z8e_~(iAfL18%J?17anFdir@5tb&+z>Ix;}qjnnK>xuqB2gPyw;p%K^e(Nrm#u0*Fu zxwp8>z&tK;un6jdf_6 zq+bj$M8OYuJO15RKZ?PAedqnnH3KGy1jJYmB@_ zVvfzzVC-w`_u)`nU>eraN}Jfkoy9cza43oDx6|a)*|Lx|{b3d4iVIMd>O# zbA13FN^?Py;8=KQ&9j>sqI*el0>4UXnYlrD1aMsZ?=X&5rDC~pkwfLDH>bL4#i&rh z%}9LqG7+zl9*&I_cDu<5$HF5b%Ul?f&@uF&@X6MZ6hfMkIgy$!`iQ<4bE3*(Tq=v( z$x?p0eeJQ4Do52Z(BTQ(W%V(hePoTCAFBnf&0FaZq7K3YS#5**of30UEDu!=9V6HB z%&oG#)QK=JMj~Qvw~AFML2+!`qVvl|--0UHlea9Kz$9wW!&AZHv}ZJXbW_-=CI@gV z57P@ATH%s6yCz!-T&{?Tt;+~&ghrrJTC=p9#6!Y^!a3A&TBM*G^37pjya7r7<1BsN?X~>^|_q(pvz|| zLYg{3OI0S9<;a+pD#mY$+IaDUIXLJp@`OpKHmj}Uke&*t3h!k7dS=Okvbo=0k$PKN z@}WXH>xh;M%wcEF+c#Qeeqv2I+R`lHRnkbIbUs)psc92^E6ZK1y0URw0MUy}sf*eF z;@5xcIn}&myg*?6JfO0zz`nuQ-3pbg^AN@1X3GBC^PB3u*3Ed)mmlEgl22t?zU_^3 zAE&QX^Uu#$)f=tAwjE=i9cTqgH~3L#1y0hT{a${4(7I`Q!DWAXQ~kJgbI0?ZHs%;(lk7r)c% zWGi1O3I?p@OC=pt%PBi?zO0^t$ynR(2Fb>nGFxl;{P`NQYx`&K^22Ja+)XtTY z_ZTa!l~RJSzqNQwOS4FBTP%IZSb~CWf%#d>mp|X+#|N#|{650}w6$i&ZqjP3spFgK z9XNasrgE)y69(4Rhb^CRF?bEX4t%k-wsRlgE+8@h{GzqKpJ)7$V~xM*SR-`@hX0T? z`k~`{X^kPQ@$qZcSVi~{h{PIu9c%pLpJ@&8j?52QBipgY-Va&h9T?hO+wTI|{WU7Y zTE2iL-uc=Z`B$t_#|qU~t)XFs%^$Qz7U7>`jrdKYuVam;f08x!u)?R;)_D83p07=D z8*X#o7Z`N{-IYpp1M8*tvs~Jy3QGr6zhgUS1Xn3Wy3KW;AWt7rwa*osShTgi_#3J z!&dsv6m6@~DxY>8ow|$9Qsi5X*e4bRV3F2}(%UND(V11P{r&#)eWEjeq92@gRgbg# z`)@MAxtH^nUS%ao9pk+oGU>Tzu7hU}Gu0Vs+FH51^jKX7s*A%J+M>vv==syG^6A|N zcZSX%aFLd->N~qGv)W6)(@(#|-Dz4an5vI2139dpy2__|{#n(`(|)^lOgUNR&?W66 zp9u2h6vZ#bW&6vk`H{C?Ud{W9KYRC`zu5or2haW4cb>oZ7k;^#|NB?2<~RTAfcE$D z#_jgM{fqYF=-tE6y>cX4ikz?J$LwG+5V@ck!3>^uX)$oYeUskK&)T74X#66tW~rzC zc6MZkg)>FVL80VKNUQzJb}VEsZifah_;S_P-U$p`Y^%@BwmGX`?5ML}w0EQ97pD5$ zwX1sDX5>Ow5f{(r%k5Nn;eyv3!|ilr`cWI+4w9Ip*F9f*?N!f@45MED=QgO6D-Wd)OdTt zN}9&r#fH+_DXR-EqA4}d=6h-W{D7yfcGMb#`^`3Quz9h45mjAEZO}HgxvSZ!CbNcc z9BikJL1?hxX)ARDF=yH_HNsMamr+njnekN08Up3$hMMD(jrMj;Gp!gC{q1PI8yY(f z4W+Z`Zd5LKk%RZ+)xE5>$XuYEjvMGg2#kn4?O1IDLcL0@w>PT&D0{1I8mUxu45afL zY8nz-XmOw&sg8mlC8<=}7`uq@lQslgI&a={>gR2u9)(eu#XO6h^V%h z;|p}AZLcsCtLf(RC8+V;I9})%Wyj*WX+)S~LO!S;ZEx3gRo9IA^aXE&x22WwwYQ_X zfnkho=C~I0@X2ylJ0_%cRhxlKUrhDz$`?Mh7@xmaZ;5y@#hrd1cHmRoG*_Xh;$9S? zlmSFHLKtm6`|K#lm_aeOF!3lmHC~^$W7Rp9*06vMd#WvFKz)1@u%T|Cpcxc&1OD0( z@cY)$%?!4TuxGrTs}6%col_sTktJ5wjp_`nyHSurZWu5OJr-RRxee8g<1Qc$+R=7u z(;e3N1A`T4YFx?fs8#0J?3OPg+uK#msLcwxZP+ua8Use^;)<}Hk1V9BE_{5ooey=x zAy@r+I~8BdhvjLKIO%3}5x^dvr^!Wl?@~S0*4S^W<);@OaVi1IB$}u1yb~Qhg9drG_plMW4d*G#^kg zHI|Bu32VqA3Wwng5j3WZ-U~jNZs+12!HeHb^2~+93clk~)eW9Tl-lKKT-7{0EwarG ztQY3`d0t@e0;AwqWW0eBElNxnHDY2F_aN?Ik!%w01kVO@U5eP`Al1gz2*(|Q--%m1 zE7FcdaW(vIsxv3w-`)Iw-qPSXAvQJdpeggMjMc)g=wXX0P zVKy5VW%EJEI0jjBR+V+1r4h2+9R4o>Mj}mq)M7ozoUr`b3 z9`TH~AOVR~9A@ohB4y#5L^{gST_=%N6OeF8oKmg~_ywp@N9Jjq(4yNNF0J%VgNqZVVjW6tS zYMx29@(YXr@>0)O5sXR>lQuyHjfiH37MLU#@`hu9TBc<~nmM!19CqPgNBDDiCM~3+ zvrO{2KL^=`b~elhR+yUM?#{a5(SrwqT+bLw7reHBNA5%0=*IN%!eoOv_~sAs>>dE+ zt&U0F0*a3|b858BZ9^uco3m25=xGFF4;cjQp&=0l^>k%X59fJ|kT#Z?Lp|Js+c3^8 zy`=sbCK-^B%E_-dmkCnikPb}r3|zN4wv*(|g&BHW1dxj!O+}ZPBXMybV9$#QWzxy= zV!|vYOmqFn3*v|r1-V(vs<+$8cXfGBCeGPJAnKGBUO66wz-Z;8Tgc+XvG~lM~stEaYbIcY@$@o2-0qP1&}MoRNMz(5AS>U z>lJb|bG$l=Fvsyg0DIfcjFz{Sm~>MHGq9L47t$tVl|me;f@Z*E>io~ zR16{QBGH4fuN|{?$Y&&<`UBj@Lu(Yo)fd{^kvQeq+uq`Nix^DRg^>y1R)Jfh(YVDv z%=!E#a@%jUx$xboE|P?C!R7W2zEIs}Wq3z@+D_N?otmuS+ce17t9F;QDOxAJoq4Vs z^<`8{%q_Gj1exl-c$}er*51Jf>e61~>vKG@(a%PX0`{$Tj24yb98>dDA_=jZpq_%e zFa>v$O~a(rLAYL#?uHb~AD|&yoK=-Ix}hsr z6d1w)-awcd0Vu&7Y0}|m`K4IoTS=q6a5p78Gc}*6+CU%d%veF5x~1XC(0O60cFOO| zEcC+R5{8x2K*lHh&I88NY-Ul~HPkZNPWgs2q0!EoU7%eUhG%a(9g^zQ-OkRA@yt0Q zI++bcm?8e*3W3dX7Dr^j4$K^!Y+=q-_C}7aL`NkmjVGtbCW#xken8> zft&o~^L49Th%CZUZ#xxPDERx?J6@oVNJVE0ev_yEf=acEQ1TWr-X4{#gD0*0pW2D zgO9Zhg4meDu5QQRQJxlg;?Ja?&f+xu7MEqtd?XrZgZ6 z1P~oO>4U_>sZr|XGIRWW=^%+`s%=(vTKz2!8e39XUE9=wElW40;a?`BP=P&L%KoR2 za}bZ6E&ta6e|y9CWP8R-r}IYJ410mHaQ`{b?x)meBkhfmN87UlEazG7XE_04{O?pn zJqUQ4kCEF(G)a{H8HbN;_D!@OgbEiA)Y);{2w5z6+nfHqi%m%)@gNa<#-ZK+#!k2o zZD%=@%h4-}8oSxNn^r&P+Ti6SgD3XQCByD_{QF${_n&C|hc2Bzh}!z!{Mx_wJk`C% zf9k(ns6O~?LFF$OEI;GQ<$@v4=QEdU*8FE{DsZ``wix>_L)PABA(doYW?Z>`K672J z)ph`=up!7e%NTVwELgX|GzoOSM>wR%&R3pG*iGUJ~yp1pOs z2JJP3Swl!sYX}br!DFZ@uCdBL^8DEd zEcrVuR@JK2%}={~Rq5FAC+s_4zMQMiq3@gMf0wc6a;f&q&z1mKt|ehP4I$eFq&*4` z!prhCPxFiqdEUKTwH~3rFqDo#A4Mp;N2GFJF4QFgM9iQwF4lKHTf`TZp|z}1mw|c- zCND~tH|xuv@kZzJX7v^$Ca7mYy^V=BL4Amxe+uf05H!T5DBQZsh-vEkU@$IkJm1F& zjLY@<`#8x(;Bx)>8bAC@+-K~+yj6el*)6q+I7OtvGW9wvT!fkMF|mR|EJhbn#vyGn zUV8&x6QU~saP1n|T5G{yDFX52l485>;8_JW|++-~9e2;Mu4kAz{1`#Dd zHo!ke_+j5hZ?~a64=)cGD?G;-#XltoEm#OL&R+-N_~l$Rj1x>US`vi)*A701P!h%B z@Vl$EE`DyV!tp9jxC(=-Rf!-%kMt74DMN%P5j2MO!)Sk+SdKI17$t^1Y}jIhb&bHs zbByN^Bwk}9h)@v-1`sKTB!nD69v}$>@TdSD6{y-C5zz%lw_pbjtu!MkuD;FKi-;9O z+d@PM!C6F%F%F~U655TUWzqH=A^CI03qla)*Fe2SLUM9x^)?hH(PoS>hkZr6K_RVm zNUz}{Yxvk&RWX*paEoyqh&KSh*Q(-L1T_g}jZC&swfmrD|L0#h<>GI2uhK5pjA0hH zF4rQD7;B8vooD0hfFJg~%eBx9KVp|_@dd^tqrJ|L(&ch|29ea|S~SG-4RUgok+NYN z1)@4X=Xkw!8Hl_KH)+O4EAejOJh~!S0uw;&UEYk(5pwCv#i(5*IPYHiLXx;QE`8xY zV>B77t9}nZ@2n!rs!>BZ7>oag?7`)FeApK@FzK5<<)9|d+bFvaGRYIFESAyJKlYfQ7g`vim!a0 zQvcn97rFQ*J0C*xK0C^cJF>I?Mb=1X;x0CG>v96c2>afE;tk&f7| zoNtlk_h01wJ#6_mocsQtNp${-h5p@Z7P3l5)$-n>^pRCAiMc-4{^KhaihGZ>|D&k= zM^E%WjeT`^I#fO#N}u!=pABYD`@Z1g622DtO8u(m3*Ir&R?@4=YyGd(>0Nr;FE~1W zm3`JzJn8;|zbXByeA<8biRTOFVS>`+}szEa0q>FO|`!49Yg&~ZQq4nOJcfbwAk z?_Pd0^?RUSV+FM5RjmKc`_<#qrNh(l>`7nwlezS>t}poRj1RWHDxUOz!3PjusZU&R z%sl}e^p;Zp?O%U&d^%To=02>BAyn^IrB4Pk&-%YOR$X7^PrJXUsGhG<&qls*KJxT_ zWqvgN1qY#wTH`&>BErrTkG<&=5uyjqeTUDwvL|lj;LB*f5E^wpBKfy})zQi{P`;O< zj9>yX()2Ufku&$Icf!pP>A1$BP+ z%AAOUZRyGc3$GBaOzS=)wCl6MMVaDfZ47Ly+)eOvm#I692BQJZ$%GMRbtJ)U3ao^K z{%I)O3c`>Xb_F9M$s7_536QBaAuu0|%rH9!6TFZd*&T6zxvQ3fa#^?tU7@ghm9VB@ za4W%7(0Y%%c=q2-sJmB*s$Q5L2>J$@7)z+Jg7RJ=npwTUzTTjkL_xy0eieM~HJ`f+ zp)H;`e+Poh1?sMUsD+|m21Jq85G$KkfvTRUFTk~jZv84)(*rdvQD0>uNGlOkf6m+v z)UsE>YHGLY;-_axtufxemK+OWF1*+O^&5ua^0W}&_-O$ube-EULD{k2# zJ!YUnxRHf=54-svpQgXw&Hph~U;ffiW5QyhuCu(Dz%aWtA2@GZ1-ZDb_cA-ded$$D z-WA0G??ViD>1P33%u}Y}RwyK%`yr_bia<@@t#t#z^3bjthqG1I7Ow&iMI*yk3Du9( zG1-~0g8W>90}mT!641i%2r+?)VvK0Lw#SmXDnwF2%OO>BVY6i#N!_j4wHAuMMGwyL<%^R3_RLO~hqkwPP3{P0)7A& zza~%zA8j_`RM}P0}v4I=*91W2o8v| ziGjNSSop@qc!6k1!!9fAa7hRWFOG5ekHcWK*2Mz8dG{KHS@*$7Z$Qliv5dH7HNeCo z!R7_hn@}HJC2EppX4oOzc7Za)5+1KKtXhbOo5Tt%pa^1=wW)+!$4K&22ual7MMKaK zZW5L_LRUgP5U~N)$Uq`HZ-im6uCvdq3lr#`9aUao-vq3mOOT)%5FQitm#VI+L|tT> zOQ<#Bh}ViRdqcF4Aes``JQ#;b2~}|ly`!|11WsCrB$(yTYc#M54I!6Cx58sUc@pdp zaqM1~pJ_f|71e}CnZJsrM5dZH8@>EQgs7IN##H9oETYyi&vM!#2y`fHC zCYefR;YE&klap#{S|KbMkIX`hVrN0*fm;lV3(~;4@Cf-hIBv6BU8Lm$W&{6FGXcgJTvPHTHa2D+QQ!{QsYQ-&x!2ky6F@EDirmNj1KJ@Zw-7v_{3+vsZgs_C`q)hR4B3? zQc8u|2D}$B;MxnHRH&N)$#{eXbEw)8jXYI{GqK1`%2Plk1ft-NqqjlUB!@uMkFB+W zaZ9u*3`u^8O3?HrRNyLMh?>dK1kIF_z!F3zQgabnFvJu2{u`+kE-G0sC^V3w5OTP1 zT#)8Ur6C4=No`>e5}U%kIM_7*5sPS2xQO~#>qKfD^pXZ3eT)BQMY5};4KjH`IwdkN zuMY#T+AYTBq8r-W$V()eH3^|js5)Fm2Y4Fhp&;2zx)TTqnq^{@0x-%?`Xzo+?-SA> zaz|`vd@|0y5u|enlkXi(Pl(;5$HDoPWE#+h9KoXVa6)HvC#Y^aTb@gF-j-xc5--pZ z7Sy<;9w{I7S&&C1%b^p8qXB>?om@xPg!@v96XM@uXsJ9MPsKQfJoQ3c^08!{+DL~^ zHywvwh!64v8#hHsl0wmIyjQ46ir`wC-NST|lxfjA8VFn741T5SPEsnB`{7lmtOE%a>#y(21v_*ZLsyq(q4Tl%8xU-2@j@T(6 z${iKm1e`tr+mU!{G3d|@@jcFhgzG(~ItAEVk{n1&B2p~!6GuTpjD>c?Vytdn5{X#C zUfeMbhjVnD){UQwK98F>11ngl~?EnS7wl_B`w35tVBdxEn{R+#0F1)OG% zw#(U%I>LS+Ar=sC5jCPXV^Iu4q7p?1oMweQj<-F6Webla~29brs?gt>#rCE?EWBP&Oijpg1rk5>7<~X*O^M z981m*(i{}xqO;pHZccnxMPBhZ(kbvOJfSek8g>JRIJ`tA?$yaNBJco4h9GH|j-xsV zc_P`VbJ8iHDCwe2YmlEJk)sKUgp)bg)O(#(kVr%ok}wA`OL7JYY(t_k5rI_+HDmPzwI<&`IFLn9QkY@FCHFStgm2`i$c^zAc$o z=Eg))-mO5hqkn`5%z<$hj0L9=nnxs(>ercJgv=|sst}KgHpD3s&QXDeKpHhp-Xa-^ z7Fi@##JP!T&YZ+Jo<-O=7b5Ov_PBWjVO#q3Aba_J}vt%hw zb{Ng6>ev3P8Sy@v9|DO6pI!q^Ij4t0RFV%L0w659bo{Dw3(?o9*IJ^JMg!91aCUeu z5lC0z=OiZ1E1iLytEGRLU<@@EuSPd^oK_|(N~B|Pl3AnDE9&{)$X}) zKuF<-_=AWqC1fhV4MfL-@MCdCNg~u)k#L-!-1U%1l?XFekV-&|IQAmCPOzSwKPiC{ z;Sm(TJ;5;e#GukiNK{KjA=RK~@k_^}gkO5dPVXQV6LIKbP!M`{vS=shF&BCmcH%~f zsXKj?xE;Hs8OPb_sOX71{y=SUN)|2o$d&nAM3j0D&#U~z#wS+=ONy}Q3eOXzEKABX zYf?bNj>etCD%^H@CrJZKU`16VG%Q8m?f5z@s0E2aC*IHiW_1uEhLlWtsA+IYGbX)B z=cp{+hnEUM+_sZt9E502q>z}BI)qzrjplSMoXuboU4u{*3pO&j(?6J;Or1QtD*d8~ zWKOomCmrt5BsX%-@rfRQ!#TE3h~~RQdTDl)=nHdCI7LtND!B*k%?qDS>rB@or%w)r zu!9EZqnwN*d5^Cmq;tSVGsq|QxbBsu0itW|17;PfPX(J(&_p9xx<_h;Sim`4g#~M( zE=pNpbgm5?39*FZ$RaOZEQenDk^WBB5aW_~$Y<#Oy7`vu-Qkp~MEgZ5OGvg5O(0xA z&^dQ8POs@4ISZDg(tezP6SdGWodUihO^kHGPOc)I1Yi0t5j%B_(t zWa0gz!-?jC@YLfq=?VWWz+gEnZG6f(tNP!^F04l5 zOmPO7y8#HN2Ck|DVSbYCBko|hkJTyqY3W%LKDm7&dqf661IPd9F+x5u!Z_pMcTyjI;a*3~ycq{W->Wz`WJLG;#+Jdi1a-F((S;_BtdA zMO2?$d`Fy;%~iK(FA$MZ7-8HA20Z+%1l4mSlY0v z0q$0v>!z)%#DX4(bO-09K60p_K;W@UQd^#2TaiBm4KuMQO_EG7CK6Kg6W%#r^5fM%g>Dr|7a{sU>%??LU?#DU52qVGyfyB6+ zd+6-~68Tgyzm$y)F#CY!lPntp&wi4K3j;S;b_M)S_2I3KW0;7b;za51PDErYCvp8M zIM>(dxA9|C5Rh6;PFnH={9OsBTcI?^<&{q$c;oD%znse%#{K>JP`QM3?>p zaVwlwzZJI|(x7~A+`^k*y3beRmWzzpzj-Zg<&?ltjV6(V`lrS%`9vrz1*C>VyM%r2 zqyBkudtGm(CLKyle{a40!*Sb-$MN3-P)elUN~Ha1^>(OJ?_SnhiQD`ijN9+1w-TN% zspn3;{r@FyrQS;1_H^nkhNj64^#*;?M9`ApCa+aniCW|Ps;xw=R9ksP^{r}4)L!=@ zQf>c~sO5b&wI(DLNvf?L;8o@KR@*-uwNhF+v3*aqm0Bs)R-*O0qL#ZqN|sY?d0k2_Tizas8NYMP7bcqP_YF%4;8$I1k?m_#Gcl?|vtsznV#xt9zNfyXkW2 zI8!~!?7i|)%WI@lPyCffnZqOh;nAZ#t9 #include #include #include @@ -47,11 +48,21 @@ #include "load_pat.h" #define DIRDELIM '/' -//#define TIMIDITYCFG "pat/TimGM6mb.cfg" -#define TIMIDITYCFG "pat/timidity.cfg" -#define PATHFORPAT "pat" -#define PAT_ENV_PATH2CFG "MMPAT_PATH_TO_CFG" +#ifndef PAT_CONFIG_FILE +//#define PAT_CONFIG_FILE "FluidR3_GM2/FluidR3_GM2-2.cfg" +#define PAT_CONFIG_FILE "pat/timidity.cfg" +#endif + +#ifndef PAT_CONFIG_DRUM_OFFSET +#define PAT_CONFIG_DRUM_OFFSET 25 // timidity.cfg drum patches start at 25 +#endif + +#ifndef PAT_ENV_PATH2CFG +#define PAT_ENV_PATH2CFG "MMPAT_PATH_TO_CFG" +#endif + + // 128 gm and 63 drum #define MAXSMP 191 @@ -221,7 +232,7 @@ int pat_gm_drumnr(int n) { if( n < 25 ) return 129; if( n+129-25 < MAXSMP ) - return 129+n-25; // timidity.cfg drum patches start at 25 + return 129+n-PAT_CONFIG_DRUM_OFFSET; return MAXSMP; } @@ -356,15 +367,20 @@ void pat_init_patnames(void) char line[PATH_MAX]; char cfgsources[5][PATH_MAX] = {{0}, {0}, {0}, {0}, {0}}; MMSTREAM *mmcfg; - strncpy(pathforpat, PATHFORPAT, PATH_MAX); - strncpy(timiditycfg, TIMIDITYCFG, PATH_MAX); + + strncpy(timiditycfg, PAT_CONFIG_FILE, PATH_MAX); p = getenv(PAT_ENV_PATH2CFG); if( p ) { - strncpy(timiditycfg, p, PATH_MAX - 14); - strncpy(pathforpat, p, PATH_MAX - 13); - strcat(timiditycfg, "/timidity.cfg"); - strcat(pathforpat, "/instruments"); + strncpy(timiditycfg, p, PATH_MAX); } + { + std::string normalized(timiditycfg); + for( size_t i = 0; i < normalized.size(); ++i ) { + if( normalized[i] == '\\' ) normalized[i] = '/'; + } + strcat(pathforpat, normalized.substr(0, normalized.find_last_of('/') + 1).c_str() ); + } + strncpy(cfgsources[0], timiditycfg, PATH_MAX - 1); nsources = 1;