; EMULATING MIDI-BASED STUDIOS - EXAMPLE
; by Steven Yi
; 
; Written for issue 13 of the Csound Journal
; http://www.csounds.com/csoundJournal/issue13
;
<CsoundSynthesizer>
<CsInstruments>
sr=44100
ksmps=1
nchnls=2
0dbfs=1


/* SIGNAL ROUTING */

connect "Saw", "out", "SawBody", "in"
connect "SawBody", "out", "Mixer", "in1"
connect "Square", "out", "Mixer", "in2"

/* ENABLE ALWAYS ON INSTRUMENTS */

alwayson "SawBody"
alwayson "Mixer"

/* USER DEFINED OPCODES - These are used as Effects within the Mixer*/

opcode FeedbackDelay, a,aii
setksmps 1

ain, idelaytime, ifeedback xin
afeedback init 0

asig = ain + afeedback

afeedback delay asig * ifeedback, idelaytime

xout ain + afeedback

endop


/* INSTRUMENT DEFINITIONS */

instr 1 ; Automation - set value 

Sparam = p4	; name of parameter to control
ival = p5	; value
kcounter = 0

if (kcounter == 0) then
chnset k(ival), Sparam
turnoff
endif

endin

instr 2 ; Automation instrument

Sparam = p4	; name of parameter to control
istart = p5	; start value
iend = p6	; end value

ksig line istart, p3, iend

chnset ksig, Sparam

endin

/* The per-note signal block of the Saw instrument */
instr Saw 

ipch = cpspch(p4)
iamp = p5

kenv linsegr 0, .05, 1, 0.05, .9, .1, 0
kenv = kenv * iamp 
aout vco2 kenv, ipch

outleta "out", aout

endin

/* The always-on signal block of the Saw instrument */
instr SawBody

aout inleta "in"

kcutoff chnget "sawBodyCutoff"

aout moogladder aout, kcutoff, .07 

outleta "out", aout

endin


/* The per-note signal block of the Square instrument */
instr Square

ipch = cpspch(p4)
iamp = p5

kenv linsegr 0, .05, 1, 0.05, .9, .1, 0
kfiltenv linsegr 0, .05, 1, 0.05, .5, .1, 0

aout vco2 1, ipch, 10
aout lpf18 aout, ipch * 2 + (ipch * 8 * kfiltenv), 0.99, .8

aout = aout * kenv * iamp 

outleta "out", aout

endin


/* Mixer for the project */
instr Mixer

ain1 inleta "in1"
ain2 inleta "in2"


/* reading in values for automatable parameters */
kfader1 chnget "fader1"
kfader2 chnget "fader2"

kpan1 chnget "pan1"
kpan2 chnget "pan2"

; Applying feedback delay, fader, and panning for the Saw instrument 
ain1 FeedbackDelay ain1, .5, .4
ain1 = ain1 * kfader1
aLeft1, aRight1 pan2 ain1, kpan1

; Applying fader and panning for the Square instrument 

ain2 = ain2 * kfader2
aLeft2, aRight2 pan2 ain2, kpan2

; Mixing signals from instruments together to "Master Channel"

aLeft sum aLeft1, aLeft2
aRight sum aRight1, aRight2


; Global Reverb for all Instruments
ilevel 	= 0.7
ifco	= 3000
aLeft, aRight 	reverbsc 	aLeft, aRight, ilevel, ifco

; Output final audio signal
outs aLeft, aRight

endin

</CsInstruments>

<CsScore>

i "Saw" 0 .25 8.00 .5
i. + . 8.02 .
i. + . 8.03 .
i. + . 8.05 .

i "Saw" 4 .25 8.00 .5
i. + . 8.02 .
i. + . 8.03 .
i. + . 8.05 .

i "Square" 0 .25 6.00 .5
i. 1 . 6.00 .5
i. 2 . 6.00 .5
i. 3 . 6.07 .5
i. + . 6.07 .5

i "Square" 4 .25 6.00 .5
i. 5 . 6.00 .5
i. 6 . 6.00 .5
i. 7 . 5.07 .5
i. + . 5.07 .5

; Initializing values for automatable parameters
i1 0 .1 "fader1" 1
i1 0 .1 "pan1" 0
i1 0 .1 "fader2" 1
i1 0 .1 "pan2" .75
i1 0 .1 "sawBodyCutoff" 1000

; Setting values for automatable parameters
i2 0 1 "sawBodyCutoff" 1000 8000
i2 4 1 "sawBodyCutoff" . . 

i2 4 4 "fader1" 1 .5
i2 4 1 "pan1" 0 1
i2 0 4 "fader2" .4 1
i2 4 4 "fader2" 1 .4


; extend score so effects have time to fully process
f0 10 

</CsScore>
</CsoundSynthesizer>
