-odac -d -F midifile.mid nchnls=2 ksmps = 64 ichn = 1 lp1: massign ichn, 0 loop_le ichn, 1, 16, lp1 pgmassign 0, 0 gisf sfload "sf_GMbank.sf2" sfpassign 0, gisf /* this instrument parses MIDI input to trigger the GM soundfont synthesis instrument (instr 10 */ instr 1 idkit = 317 /* drum-kit preset was 317*/ tableiw idkit, 9, 1 irel = 0.5 /* release envelope */ ipg = 1 ivol = 2 ipan = 3 nxt: kst, kch, kd1, kd2 midiin if (kst != 0) then kch = kch - 1 if (kst == 144 && kd2 != 0) then ; note on kpg table kch, ipg /* instrument identifier is 10.[chn][note] */ kinst = 10 + kd1/100000 + kch/100 if kch == 9 then /* exclusive identifiers */ if kpg == idkit+7 then krel = 2 /* add extra release time for orch perc*/ else krel = 0.5 endif if (kd1 == 29 || kd1 == 30) then ; EXC7 kinst = 10.97 elseif (kd1 == 42 || kd1 == 44 || kd1 == 46 || kd1 == 49) then ; EXC1 kinst = 10.91 elseif (kd1 == 71 || kd1 == 72) then ; EXC2 kinst = 10.92 elseif (kd1 == 73 || kd1 == 74) then ; EXC3 kinst = 10.93 elseif (kd1 == 78 || kd1 == 79) then ; EXC4 kinst = 10.94 elseif (kd1 == 80 || kd1 == 81) then ; EXC5 kinst = 10.95 elseif (kd1 == 86 || kd1 == 87) then ; EXC6 kinst = 10.96 endif else krel = 0.5 endif event "i", kinst, 0, -1, kd1, kd2, kpg, kch,krel elseif (kst == 128 || (kst == 144 && kd2 == 0)) then ; note off kpg table kch, ipg kinst = 10 + kd1/100000 + kch/100 if kch == 9 then if (kd1 == 29 || kd1 == 30) then ; EXC7 kinst = 10.97 elseif (kd1 == 42 || kd1 == 44 || kd1 == 46 || kd1 == 49) then ; EXC1 kinst = 10.91 elseif (kd1 == 71 || kd1 == 72) then ; EXC2 kinst = 10.92 elseif (kd1 == 73 || kd1 == 74) then ; EXC3 kinst = 10.93 elseif (kd1 == 78 || kd1 == 79) then ; EXC4 kinst = 10.94 elseif (kd1 == 80 || kd1 == 81) then ; EXC5 kinst = 10.95 elseif (kd1 == 86 || kd1 == 87) then ; EXC6 kinst = 10.96 endif else kpg = 0 endif event "i", -kinst, 0, 1 elseif (kst == 192) then /* program change msgs */ if kch == 9 then kpg = idkit if kd1 == 8 then kpg = idkit+1 elseif kd1 == 16 then kpg = idkit+2 elseif kd1 == 24 then kpg = idkit+3 elseif kd1 == 25 then kpg = idkit+4 elseif kd1 == 32 then kpg = idkit+5 elseif kd1 == 40 then kpg = idkit+6 elseif kd1 == 48 then kpg = idkit+7 endif else kpg = kd1 endif tablew kpg, kch, ipg elseif (kst == 176 && kd1 == 11) then /* volume msgs */ tablew kd2, kch, ivol elseif (kst == 176 && kd1 == 7) then /* pan msgs */ tablew kd2, kch, ipan endif kgoto nxt endif endin /* this is the GM soundfont synthesizer instrument */ instr 10 kenv linenr 10,0.001,p8,0.001 iamp table p5, 5 a1, a2 sfplay p5, p4, iamp,1, p6, 0, 0, 2 kv table p7, 2 kvol tablei kv, 5 kpan table p7, 3 kpan = (kpan - 64)/128 outs 0.2*a1*kvol*(0.5-kpan/2)*kenv, 0.2*a2*kvol*(0.5+kpan/2)*kenv endin instr 11 endin /* program preset (memory) table */ f1 0 16 -2 0 0 0 0 0 0 0 0 226 0 0 0 0 0 0 0 /* velocity (memory) table */ f2 0 16 -2 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 /* pan (memory) table */ f3 0 16 -2 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 f5 0 128 5 0.1 128 1 /* velocity mapping: less nuanced */ f6 0 128 5 0.01 128 1 /* velocity mapping: more nuanced */ i 1 0 360000 e