global { srate 44100; krate 1000; inchannels 0; outchannels 2; interp 1; ksig _kMidiScavengeCount_; ksig _kMidiScavengeReleaseCount_; send (sfReverb; 3.20000, 1; reverb_send); route (wet, sfReverb); route (dry, sfInstrument); send (mix; 1, -1 ; dry, wet); sequence(sfInstrument, sfReverb); } instr sfInstrument(iMidiNote, iMidiVelocity)preset * { asig aResult[2]; ksig bDone; ksig bRelease; ksig bReleased; ivar iEffectiveNote; iEffectiveNote = iMidiNote + _midicoarsetuning_(); bRelease = released; bDone = _soundfont_(aResult,preset,iMidiNote, iMidiVelocity, bRelease, (MIDIbend-8192)*(2.0/8192.0) + _midifinetuning_(iEffectiveNote), MIDIctrl[7]*(1.0/127.0), MIDIctrl[11]*(1.0/127.0), 0, (MIDIctrl[10]-64.0)*(1/64.0) ); if (bDone) { turnoff; } else { if (bRelease) { bReleased = 1; extend(1.0/k_rate); } } outbus(reverb_send, 4*aResult); output(2*aResult); } // // instr mix // // mixes reverb and direct sound equally // instr mix(mix1, mix2) { asig out[2]; ksig wetVol; ksig dryVol; wetVol = mix1; dryVol = mix2; out[0] = input[0]*wetVol + input[2]*dryVol; out[1] = input[1]*wetVol + input[3]*dryVol; output(out); } instr sfReverb(iRT60) { output (StereoReverb(input[0], input[1], iRT60)); } aopcode StereoReverb(asig inL, asig inR, ivar f0) { ivar rt; ivar d2, distance, inv_distance, inv_d2; ksig first, ki; asig ap1, ap2; asig inMono; asig c[4]; asig outL, outR; ivar t[4], revgain[4], i; table timeconst (data, 5, 0.030000, 0.034300, 0.039300, 0.045000, 0.000000); oparray comb [4]; rt = f0; inMono = (inL + inR)*0.5; distance = 1.200000; inv_distance = 1.0/distance; d2 = distance * distance; inv_d2 = 1.0/d2; i = 0; while (i < 4) { t [ i ] = tableread (timeconst, i); revgain [ i ] = combgain(t [ i ], rt); i = i + 1; } ap1 = allpass (inMono *inv_distance, 0.001700, 0.700000); ap2 = allpass (ap1, 0.005000, 0.700000); c[0]= comb (ap2, t[0], revgain[0]); c[1]= comb (ap2, t[1], revgain[1]); c[2]= comb (ap2, t[2], revgain[2]); c[3]= comb (ap2, t[3], revgain[3]); outL = (c[0]+ c[1]+ c[2]+ c[3]) *0.25; outR = (c[0]- c[1]+ c[2]- c[3]) *0.25; return ( (outL) * (distance * 0.750000), (outR) * (distance * 0.750000) ); } opcode combgain(xsig t, xsig rt) { xsig temp; temp = exp (log (10) * - 3 * t / rt); return (temp); }