118 lines
2.5 KiB
Plaintext
118 lines
2.5 KiB
Plaintext
|
<Cabbage>
|
|||
|
form caption("Victor") size(400, 300), colour(58, 110, 182), pluginid("def1")
|
|||
|
keyboard bounds(8, 158, 381, 95)
|
|||
|
label bounds(28, 10, 310, 82) text("Victor")
|
|||
|
</Cabbage>
|
|||
|
|
|||
|
; posted by Victor Lazzariny to CSound mail list
|
|||
|
;
|
|||
|
; Sometime ago there was a question here about divide down oscillators etc, and I mentioned
|
|||
|
; that a multiplier scheme was possible instead. So here’s the full example of an
|
|||
|
; emulation of a string machine. It’s commented so it should be more or less
|
|||
|
; self-explanatory. There are five parts to the code
|
|||
|
;
|
|||
|
; 1. Creating the bandlimited tables for each octave
|
|||
|
; 2. The phase generation instrument, which produces the lowest octave phases
|
|||
|
; in twelve instances recursively launched, placed in an audio-rate array
|
|||
|
; 3. The note generator, which picks up one of the phase signals, scales it up
|
|||
|
; to the right octave and looks up the table waveform
|
|||
|
; 4. The single VCA which applies an envelope controlled by a gate signal
|
|||
|
; 5. The stereo chorus.
|
|||
|
|
|||
|
|
|||
|
<CsoundSynthesizer>
|
|||
|
<CsOptions>
|
|||
|
-n -d -+rtmidi=NULL -M0 -m0d --midi-key-pch=5 --midi-velocity-amp=4
|
|||
|
</CsOptions>
|
|||
|
<CsInstruments>
|
|||
|
; Initialize the global variables.
|
|||
|
ksmps = 32
|
|||
|
nchnls = 2
|
|||
|
0dbfs = 1
|
|||
|
|
|||
|
massign 1,2
|
|||
|
massign 2,2
|
|||
|
massign 3,2
|
|||
|
massign 4,2
|
|||
|
|
|||
|
// phase signals
|
|||
|
gaphs[] init 12
|
|||
|
// lowest oct
|
|||
|
ioct init 4
|
|||
|
// partial arrays
|
|||
|
iarr[] init sr/(2*cpspch(ioct+1))
|
|||
|
|
|||
|
// sawtooth table generation
|
|||
|
while ioct < 12 do
|
|||
|
// reset partial table
|
|||
|
icnt = 0
|
|||
|
while icnt < lenarray(iarr) do
|
|||
|
iarr[icnt] = 0
|
|||
|
icnt += 1
|
|||
|
od
|
|||
|
// fill partial table
|
|||
|
icnt = 1
|
|||
|
while icnt <= sr/(2*cpspch(ioct+1)) do
|
|||
|
iarr[icnt-1] = 1/icnt
|
|||
|
icnt += 1
|
|||
|
od
|
|||
|
// create bandlimited table
|
|||
|
ifn ftgen ioct,0,16384,10,iarr
|
|||
|
ioct += 1
|
|||
|
od
|
|||
|
|
|||
|
// 12 phase signals
|
|||
|
instr 1
|
|||
|
inst = p4/100
|
|||
|
gaphs[p4] = phasor:a(cpspch(inst))
|
|||
|
if p4 < 11 then
|
|||
|
inst += .01
|
|||
|
schedule(1+inst,0,p3,p4+1)
|
|||
|
endif
|
|||
|
endin
|
|||
|
schedule(1.,0,-1,0)
|
|||
|
|
|||
|
// note generator
|
|||
|
gasig init 0
|
|||
|
instr 2
|
|||
|
indx = round(frac(p5)*100)
|
|||
|
ioct = int(p5)
|
|||
|
itab = ioct < 4 ? 4 : (ioct > 12 ? 12 : ioct)
|
|||
|
a1 = tablei:a(gaphs[indx]*2^ioct,itab,1,0,1)
|
|||
|
gasig += a1*linenr:a(.2,0,.2,.01)
|
|||
|
endin
|
|||
|
|
|||
|
// VCA
|
|||
|
instr 3
|
|||
|
kact active 2
|
|||
|
kgate = kact > 0 ? 1 : 0
|
|||
|
if kgate > 0 then
|
|||
|
kht = .2
|
|||
|
else
|
|||
|
kht = .1
|
|||
|
endif
|
|||
|
kenv = portk(kgate,kht)
|
|||
|
gasig *= kenv
|
|||
|
endin
|
|||
|
schedule(3,0,-1)
|
|||
|
|
|||
|
// chorus
|
|||
|
instr 4
|
|||
|
aL, aR reverbsc gasig, gasig, 0.7, 10000
|
|||
|
|
|||
|
amod1 = randi:a(3,.75)+oscili(2,.35)+31
|
|||
|
amod2 = randi:a(2,.65)+oscili(3,.55)+29
|
|||
|
a1 = vdelay(aL*.5,amod1,35)
|
|||
|
a2 = vdelay(aR*.5,amod2,35)
|
|||
|
out((aL + a1),(aR + a2))
|
|||
|
gasig = 0
|
|||
|
endin
|
|||
|
schedule(4,0,-1)
|
|||
|
|
|||
|
</CsInstruments>
|
|||
|
<CsScore>
|
|||
|
;causes Csound to run for about 7000 years...
|
|||
|
f0 z
|
|||
|
</CsScore>
|
|||
|
</CsoundSynthesizer>
|