I’ve got a journal paper from the 1995 journal of acoustics with a listing for a wavetable trumpet synth. It’s in scanned pdf format, so have to type it in. What I’ve typed is the listing below.
Also, the definition of the kbr uses a function called “as”. I can’t find any reference to what that means. I wonder if that is supposed to be the “abs” function.
The program runs, but it crackles. I may have made some typing errors and there may be typing errors in the actual paper itself. I think I have already found a couple of errors.
Any pointers would be greatly appreciated.
-o dac // real-time output sr = 22050 // sample rate kr=2205 0dbfs = 1 // maximum amplitude (0 dB) is 1 nchnls = 2 // number of channels is 2 (stereo) ksmps = 10 // number of samples in one control cycle (audio vector) giseed=5.5instr 2
// sine tone with amplitude=0.2 and frequency=550Hz
aSine = poscil:a(0.2,880)
// apply fade-in 0.1 sec and fade-out of 1 sec over the duration (p3)
aOut = linen:a(aSine,0.1,p3,1)
outall(aOut)
endin
instr 1
ipchfreq=p4
iamp1=p5
iamp2=p6
imaxbr=p7
ifreq=cpspch(ipchfreq)
iattack = 0.24*(1.1667 - .1667*ifreq/261)
if iattack<0.30*p3 igoto init1
iattach=0.30*p3
init1:
idecay=0.8
if idecay<0.65*p3 igoto init2
idecay=0.65*p3
init2: isustain=p3-iattack-idecay
if isustain !=0 igoto init3
isustain=.1*idecay
idecay=.9*idecay
init3:
kpct line 0.0, p3, 1.0
ktime = kpct*p3
kpt = kpct*100
;prototype dfr curve (from ctp03.pv.an)
kfreq linseg-.015, iattack/2,-.004,
iattack/2, .0, isustain, .0, idecay/2, .005,
idecay/2, .021
kfreqr1 randi .0004, 10, giseed
giseed=frac(giseed+3.141592654)
kfreqr2 rand .002, giseed
giseed=frac(giseed+3.141592654)
kfreqr2 rand .002, giseed
giseed=frac(giseed+3.141592654)
kfreq=(kfreq+kfreqr1+kfreqr2)*ifreq
display kfreq, p3
;prototype rms curve (from ctpt03.pv.an)
krms linseg 0,.031*iattack,.021*iamp1,
.031*iattack, .028*iamp1, .041*iattack, .21*iamp1,
.01*iattack, .18*iamp1, .017*iattack, .28*iamp1,
.08*iattack, .4*iamp1, .16*iattack, .44*iamp1,
.32*iattack, .7*iamp1, .06*iattack, .714*iamp1,
.25*iattack, iamp1, isustain, iamp2, .26*idecay,
.075*iamp2, .18*idecay, .42*iamp2, .31*idecay,
.109*iamp2, .17*idecay, .0109*iamp2, .015*idecay,
.0028*iamp2, .03*idecay, .0019*iamp2, .005*idecay,
0
krmsr randi .05*krms, 20, giseed
giseed =frac(giseed+3.141592654)
krms = abs(krms+krmsr)
display krms, p3
kbr linseg 0, .01*iattack, .33*imaxbr,
.1*iattack, .48*imaxbr, .3*iattack,
.68*imaxbr, .4*iattack, .96*imaxbr, .1*iattack+
.1*isustain, 1.0*imaxbr, .6*isustain, .94*imaxbr,
.3*isustain, .54*imaxbr, .21*idecay, .28*imaxbr,
.16*idecay, .15*imaxbr, .16*idecay, 0
kbrr1 randi 0.07*kbr, 20, giseed
giseed=frac(giseed+3.141592654)
kbrr2 rand 0.02*kbr, giseed
kbrr2 = 0
giseed=frac(giseed+3.141592654)
//kbr=as(kbr+kbrr1+kbrr2)
kbr = kbrr1+kbrr2
display kbr, p3
w1: if ipchfreq>8.01 goto w2
iwt = 1
goto wend
w2: if ipchfreq>8.0 goto w3
iwt = 2
goto wend
w3: if ipchfreq>9.01 goto w4
iwt = 3
goto wend
w4: if ipchfreq>10.00 goto w5
iwt = 4
goto wend
w5: iwt = 5
wend: awt oscili krms, ifreq+kfreq, iwt, giseed
giseed=frac(giseed+3.141592654)
; set filter parameters
icut0 = 20
icut1 = 300
icut2 = 500
icut3 = 825
icut4 = 975
icut5 = 1225
icut6 = 1525
icut7 = 1925
icut8 = 2450
icut9 = 3000
icut10 = 4000
kw2 = frac(kbr)
kw1 = 1.0-kw2
f1: if kbr>=1 kgoto f2
kcut = kw1*icut0+ kw2*icut1
kgoto fend
f2: if kbr>=2 kgoto f3
kcut = kw1*icut1 + kw2*icut2
kgoto fend
f3: if kbr>=3 kgoto f4
kcut = kw1*icut2 + kw2*icut3
kgoto fend
f4: if kbr>=4 kgoto f5
kcut = kw1*icut3 + kw2*icut4
kgoto fend
f5: if kbr>=5 kgoto f6
kcut = kw1*icut4 + kw2*icut5
kgoto fend
f6: if kbr>=6 kgoto f7
kcut = kw1*icut5 + kw2*icut6
kgoto fend
f7: if kbr>=7 kgoto f8
kcut = kw1*icut6 + kw2*icut7
kgoto fend
f8: if kbr>=8 kgoto f9
kcut = kw1*icut7 + kw2*icut8
kgoto fend
f9: if kbr>=9 kgoto f10
kcut = kw1*icut8 + kw2*icut9
kgoto fend
f10: if kbr>=10 kgoto fmax
kcut = kw1*icut9 + kw2*icut10
kgoto fend
fmax: kcut = icut10
fend:
display kcut, p3
afilt reson awt, 0, sqrt(2.)*kcut, 0
asig balance afilt, awt
kgoto end
end:
anoise rand 0.001*asig, giseed
giseed = frac(giseed+3.141592654)
asig = asig+anoise
out asig
endin
// call instrument 1 at start time 0 and for 2 seconds i 2 0 2f1 0 8193 10 0.376492 -0.836273 0.875826
-0.702022 -0.944316 0.782612 0.755986 0.755986
0.785038 0.588679 -0.544976 0.544976 0.489619
0.489619 -0.233817 -233817 0.132038
-0.132038 0.132038 -0.072570 0.072570 0.072570
0.114808 0.114808 -0.114808 -0.114808 0.059510
0.059510 0.059510 0.059510 -0.059510 0.059510
0.049870 0.049870 0.049870 -0.049870 0.049870
-0.049870 0.049870 0.01302 0.013012 0.013012
f2 0 8193 10 0.574816 -0.875826 -0.702022
0.782712 -0.755986 -0.785038 -0.588679
-0.544976 0.489619 -0.233817 0.233817
-0.132038 -0.072570 0.072570 -0.072570
-0.114808 -0.114808 -0.114808 0.059510
-0.059510 -0.059510 0.049870 0.049870 0.049870
-0.049870 -0.049870 0.013012 0.013012 0.013012
f3 0 8193 10 08836273 0.702022 0.782612 -0.785038
0.588679 0.544976 -0.489619 0.233817 0.132038
0.072570 -0.072570 -0.114808 -0.114808
0.059510 -0.59510 0.049870 0.049870 -0.049870
-0.049870 -0.013012 -0.013012
f4 0 8193 10 0.875826 0.782612 -0.785038 0.544976
-0.233817 -0.132038 -0.072570 -0.114808
-0.114808 0.059510
f5 0 8193 10 0.875826 0.782612 -0.544976 0.233817
-0.132038 -0.072570 -0.022570
i1 0 3.0 8.01 2000 1800 9
i1 2 3.0 7.08 2000 1800 9
i1 2 3.0 9.01 2000 1800 9
i1 4 3.0 7.05 2000 1800 9
i1 4 3.0 8.08 2000 1800 9
i1 4 3.0 9.00 2000 1800 9