; adapted from the Csound Book, ; chapters 7 and 19, by Richard Dobson and Hans Mikelson sr = 44100 kr = 4410 ksmps = 10 nchnls = 2 ; BASS PHYSICAL MODEL instr 1901 ; INITIALIZATIONS ifqc = cpspch(p5) ipluck = 1/ifqc*p6 kcount init 0 adline init 0 ablock2 init 0 ablock3 init 0 afiltr init 0 afeedbk init 0 koutenv linseg 0,.01,1,p3-.11,1,.1,0 ; OUTPUT ENVELOPE kfltenv linseg 0, 1.5, 1, 1.5, 0 ; THIS ENVELOPE LOADS THE STRING WITH A TRIANGLE WAVE kenvstr linseg 0,ipluck/4,-p4/2,ipluck/2,p4/2,ipluck/4,0,p3-ipluck,0 aenvstr = kenvstr ainput tone aenvstr,200 ; DC BLOCKER ablock2 = afeedbk-ablock3+.99*ablock2 ablock3 = afeedbk ablock = ablock2 ; DELAY LINE WITH FILTERED FEEDBACK adline delay ablock+ainput,1/ifqc-15/sr afiltr tone adline,400 ; RESONANCE OF THE BODY abody1 reson afiltr, 110, 40 abody1 = abody1/5000 abody2 reson afiltr, 70, 20 abody2 = abody2/50000 afeedbk = afiltr aout = afeedbk aoutmono = 50*koutenv*(aout + kfltenv*(abody1 + abody2)) outs 0.3*aoutmono, 0.7*aoutmono endin ; LEGATO "FLUTE" instr 705 idur = abs(p3) ; MAIN INIT BLOCK ipch1 = cpspch(p6) ipch2 = cpspch(p5) kpch = ipch2 iport = 0.02 ; TIGHT PITCH iatt = 0.02 ; AND AMPLITUDE RAMPS idec = p10 ; GET DECAY FROM SCORE irise = idur*p9 ; SET SWELL PEAK POSITION ; ... (ifall SET LATER) idovib = 1 ; ASSUME WE USE VIBRATO icut = (p5 > 9.01 ? 4000 : 2500) ; TRIM HIGHEST PARTIALS ; ASSUME THIS IS A TIED NOTE iamp = p4 ; TIED NOTE STARTS AT SCORE AMP i1 = -1 ; PHASE FOR TIED NOTE i2 = -1 ; PHASE FOR VIBRATO ir tival ; TIED NOTE? ;CONDITIONAL INIT BLOCK tigoto tie i1 = 0 ; FIRST NOTE, RESET PHASE i2 = 0.25 ; COSINE PHASE FOR VIBRATO iamp = 0 ; SET START AMP iatt = 0.08 ; STRETCH ATTACK IF FIRST NOTE tie: iadjust = iatt+idec ; LONG NOTE, WE'RE SAFE if idur >= iadjust igoto doamp ; ADJUST RAMP DURATIONS FOR iatt = (idur/2)-0.005 ; ... SHORT NOTES, 10msec LIMIT idec = iatt ; CAN'T HAVE ZERO TIMESPAN iadjust = idur-0.01 ; (ENSURE ilen != 0 FOR LINSEG) idovib = 0 ; NO VIBRATO ON SHORT NOTES iport = 0.005 ; EVEN TIGHTER PITCH RAMP doamp: ilen = idur-iadjust ; MAKE AMPLITUDE RAMP amp linseg iamp, iatt, p4, ilen, p4, idec, p7 ; ADD CHIFF ON FIRST NOTE if ir == 1 goto pitch ; NO CHIFF ON TIED NOTES ichiff = p4/10 ; MATCH CHIFF TO VOLUME OF NOTE ; BALANCE CHIFFS WITH REGISTER ifac1 = (p5 > 9.01 ? 3.0 : 1.) ; (AVOID DIVISION AT AUDIO... ifac2 = (p5 > 9.01 ? 0.1 : 0.2) ; ...RATES) aramp linseg 0, 0.005, ichiff, 0.02, ichiff*0.5, 0.05, 0, 0, 0 anoise rand aramp achiff1 reson anoise, 3000, 500, 1, 1 ; 2 FILTERS FOR FIXED hf CHIFF, achiff2 reson anoise, 6000, 1000, 1, 1 ; ... WITH RESCALING achiff3 reson anoise,ipch2*2, 20, 0, 1 ; ONE FILTER FOR PITCHED CHIFF, achiff = (achiff1+achiff2)*ifac1+(achiff3*ifac2) pitch: ; MAKE PITCH RAMP if ir == 0 || p6 == p5 kgoto expr ; SKIP ptchramp GEN IF 1st NOTE OR TIE kpramp linseg ipch1, iport, ipch2, idur-iport, ipch2 kpch = kpramp expr: ; MAKE EXPRESSION ENVELOPE ; p8 SETS PEAK OF EXPRESSION POINT, p9 MOVES IT IF p9==0 (ILLEGAL FOR LINSEG) irise = (p9>0.?irise:iatt) ; SET MAXIMUM ACCENT SHAPE ifall = idur-irise ; MAKE SURE A NEG p8 DOES NOT TAKE AMP BELOW ZERO p8 = ((p8+p4)>0.?p8:-p4) aslur linseg 0, irise, p8, ifall, 0 ; MAKE VIBRATO if idovib == 0 goto play ; SKIP VIBRATO IF SHORT NOTE avib oscili 0.5, 4.5, 2, 0.25 ; MED SPEED, ASSUME SINE f2 avib = avib+0.5 aslur = aslur*avib play: ; MAKE THE NOTE aamp = amp+aslur aflute oscili aamp, kpch, 1, i1 ; TRIM PARTIALS OF HIGH asig butterlp aflute, icut, 1 ; ... NOTES, NO REINIT aoutmono = asig+achiff*0.25 ; FINAL SCALING OF CHIFF outs 0.7*aoutmono,0.3*aoutmono endin