-odac sr = 44100 kr = 441 nchnls = 2 0dbfs = 1 seed 0 #include "wavetables.udo" giampfn init -1 gifreqfn init -1 gifftsize = 4096 opcode SCReverb, aa, aakkjpo setksmps 1 ainL, ainR, kFeedBack, kLPFreq, iSRate, iPitchMod, iSkip xin iSRate = (iSRate <= 0 ? 1 : (sr / iSRate)) if (iSkip != 0) igoto SkipInit afilt1 init 0 afilt2 init 0 afilt3 init 0 afilt4 init 0 afilt5 init 0 afilt6 init 0 afilt7 init 0 afilt8 init 0 ; Delay times chosen to be prime numbers. ; Works with sr=44100 ONLY. If you wish to ; use a different delay time, find some new ; prime numbers that will give roughly the ; same delay times for the new sampling rate. ; Or adjust to taste. idel1 = 2473.000 / (iSRate * 44100) idel2 = 2767.000 / (iSRate * 44100) idel3 = 3217.000 / (iSRate * 44100) idel4 = 3557.000 / (iSRate * 44100) idel5 = 3907.000 / (iSRate * 44100) idel6 = 4127.000 / (iSRate * 44100) idel7 = 2143.000 / (iSRate * 44100) idel8 = 1933.000 / (iSRate * 44100) ; kFeedBack: ; gain of reverb. Adjust empirically ; for desired reverb time. .6 gives ; a good small \\\"live\\\" room sound, .8 ; a small hall, .9 a large hall, ; .99 an enormous stone cavern. ; iPitchMod: ; amount of random pitch modulation ; for the delay lines. 1 is the \\\"normal\\\" ; amount, but this may be too high for ; held pitches such as piano tones. ; Adjust to taste. ; kLPFreq: ; Cutoff frequency of lowpass filters ; in feedback loops of delay lines, ; in Hz. Lower cutoff frequencies results ; in a sound with more high-frequency ; damping. ; k1-k8 are used to add random pitch modulation to the ; delay lines. Helps eliminate metallic overtones ; in the reverb sound. iPitchMod = iPitchMod / iSRate k1 randi 0.0010 * iPitchMod, 3.100 * iSRate, 0.06 k2 randi 0.0011 * iPitchMod, 3.500 * iSRate, 0.90 k3 randi 0.0017 * iPitchMod, 1.110 * iSRate, 0.70 k4 randi 0.0006 * iPitchMod, 3.973 * iSRate, 0.30 k5 randi 0.0010 * iPitchMod, 2.341 * iSRate, 0.63 k6 randi 0.0011 * iPitchMod, 1.897 * iSRate, 0.70 k7 randi 0.0017 * iPitchMod, 0.891 * iSRate, 0.90 k8 randi 0.0006 * iPitchMod, 3.221 * iSRate, 0.44 ; apj is used to calculate \\\"resultant junction pressure\\\" for ; the scattering junction of 8 lossless waveguides ; of equal characteristic impedance. If you wish to ; add more delay lines, simply add them to the following ; equation, and replace the .25 by 2/N, where N is the ; number of delay lines. apj = .25 * (afilt1+afilt2+afilt3+afilt4+afilt5+afilt6+afilt7+afilt8) adum1 delayr 1 adel1 deltap3 idel1 + k1 delayw ainL + apj - afilt1 adum2 delayr 1 adel2 deltap3 idel2 + k2 delayw ainR + apj - afilt2 adum3 delayr 1 adel3 deltap3 idel3 + k3 delayw ainL + apj - afilt3 adum4 delayr 1 adel4 deltap3 idel4 + k4 delayw ainR + apj - afilt4 adum5 delayr 1 adel5 deltap3 idel5 + k5 delayw ainL + apj - afilt5 adum6 delayr 1 adel6 deltap3 idel6 + k6 delayw ainR + apj - afilt6 adum7 delayr 1 adel7 deltap3 idel7 + k7 delayw ainL + apj - afilt7 adum8 delayr 1 adel8 deltap3 idel8 + k8 delayw ainR + apj - afilt8 ; 1st order lowpass filters in feedback ; loops of delay lines. kLPFreq = kLPFreq * iSRate afilt1 tone adel1 * kFeedBack, kLPFreq afilt2 tone adel2 * kFeedBack, kLPFreq afilt3 tone adel3 * kFeedBack, kLPFreq afilt4 tone adel4 * kFeedBack, kLPFreq afilt5 tone adel5 * kFeedBack, kLPFreq afilt6 tone adel6 * kFeedBack, kLPFreq afilt7 tone adel7 * kFeedBack, kLPFreq afilt8 tone adel8 * kFeedBack, kLPFreq ; The outputs of the delay lines are summed ; and sent to the stereo outputs. This could ; easily be modified for a 4 or 8-channel ; sound system. aoutL = 0.35 * (afilt1 + afilt3 + afilt5 + afilt7) aoutR = 0.35 * (afilt2 + afilt4 + afilt6 + afilt8) SkipInit: xout aoutL, aoutR endop instr liner index = p4 isinit = p5 iampscale = (((gifftsize / 2) - index) / (gifftsize / 2)) * 0.1 isamp = (isinit == 1) ? random(0, iampscale) : tab_i(index, giampfn) isfreq = (isinit == 1) ? 440 : tab_i(index, gifreqfn) tabw oscil:k(1, random(0.01, 1), -1, random(0, 1)) * linseg(isamp, p3, random(0, iampscale)), index, giampfn tabw linseg(isfreq, p3, random(50, 1900)), index, gifreqfn endin instr rndoise ipanrange1 = p4 ipanrange2 = p5 ifreqmax = random(100, 1000) if (random(0, 1) > 0.3) then a1 oscil line(random(0.5, 1), p3, random(0.5, 1)), random(100, ifreqmax) else a1 noise line(random(0.5, 1), p3, random(0.5, 1)), random(-1, 1) endif if (random(0, 1) > 0.6) then a1 *= oscil(line(random(0.5, 1), p3, random(0.5, 1)), random(100, ifreqmax)) endif if (random(0, 1) > 0.9) then a1 *= noise(line(random(0.5, 1), p3, random(0.5, 1)), random(-1, 1)) endif if (random(0, 1) > 0.6) then a1 *= oscil(random:k(0.5, 1), random(100, ifreqmax)) endif if (random(0, 1) > 0.9) then a1 *= noise(random:k(0.5, 1), random(-1, 1)) endif if (random(0, 1) > 0.6) then a1 taninv a1 * line(random(1, 10), p3, random(1, 10)) endif if (random(0, 1) > 0.6) then a1 butterhp a1, line(random(20, 2000), p3, random(20, 2000)) endif if (random(0, 1) > 0.6) then a1 butterlp a1, line(random(500, 16000), p3, random(500, 16000)) endif if (random(0, 1) > 0.5) then a1 *= oscil(1, random(1, 50)) else a1 *= line(random(0, 1), p3, random(0, 1)) endif if (random(0, 1) > 0.6) then a1 waveset a1, random(1, 20) endif a1 *= 0.5 aL, aR pan2 a1, ipanrange1, ipanrange2 outs aL, aR endin instr trigrndoise itime = 0 imax = random(5, 20) while (itime < p3) do ilen = (p3 / imax) * random(0.6, 1.2) event_i "i", "rndoise", itime, ilen, random(0, 1), random(0, 1) itime += ilen * random(0.8, 1.1) od endin instr clicker aL noise 0.4, 0.4 aR noise 0.4, 0.4 kamp linseg 1, p3, 0 outs aL*kamp, aR*kamp endin instr clickmaker idur random 0.001, 0.01 kmetro metro random(1, 6) if (kmetro == 1) then event "i", "clicker", 0, idur endif endin instr 1 ktime timeinsts isize = gifftsize / 2 giampfn ftgen 0, 0, isize, 7, 0 gifreqfn ftgen 0, 0, isize, 7, 0 itime = 60 kmetro metro 1/itime kinit init 1 if (kmetro == 1) then kndex = 0 while (kndex < isize) do event "i", "liner", 0, itime, kndex, kinit kndex += 1 od if (kinit == 1) then kinit = 0 endif endif event_i "i", "clickmaker", 0, 1 kmetro2 metro 3 if (ktime > 5 && kmetro2 == 1 && random:k(0, 1) > 0.95) then event "i", "trigrndoise", 0, random:k(0.6, 2) endif ; pvsinit not working here.. f1 pvsanal oscils(1, 440, 0), gifftsize, gifftsize/4, gifftsize, 1 pvsftr f1, giampfn, gifreqfn f2L pvscale f1, 0.03 + oscil(0.01, 0.01) f2R pvscale f1, 0.03 + oscil(0.01, 0.02, -1, 0.26) a2L pvsynth f2L a2R pvsynth f2R a2L pareq a2L, 200, 0.3, 0.6 a2R pareq a2R, 200, 0.3, 0.6 k2mul = 3 * (abs(oscil(0.7, 0.1)) + 0.2) a2L *= k2mul a2R *= k2mul ay pvsynth f1 ay *= abs(oscil(0.7, 0.001, -1, 0)) ;ay exciter ay, 3000, 20000, 10, 10 a1L = ay a1R = ay ;a1L, a1R SCReverb ay, ay, 0.9, 10000 aL = a1L + a2L aR = a1R + a2R outs aL, aR endin i1 0 100