/*
Author: Tonetta Ivan (Ruben) - 2016.02 - Italy
- many thanks to God [Yahwéh, YHWH, Geova]: He made life possible, and all you can do with it;
- many thanks to my wife and my children for their patience;
- many thanks to Rory Walsh for Cabbage and his great support (http://forum.cabbageaudio.com/);
- many thanks to Iain McCurdy, for his support and all code shared (http://iainmccurdy.org/);
- many thanks to Riccardo Bianchini, Alessandro Cipriani, Giorgio Zucco, Jim Aikin for their wonderful books and "Vallste" for his (old) support (http://triceratupuz.altervista.org/";
- many thanks to Barry Vercoe and all Csound developers in the world (http://www.csounds.com/);
I'm not a writer of professional code in csound; so what we present is a very simple 3 oscillators (saw, sq, tri) for subtractive technique: PWM, Cut 12/24dBOct, Distortion unit Pre-filter, final waveshaping
with limit Low/High and freeverb...
*/
form size(705, 320), caption("Cabbtractive"), pluginID("plu1")
groupbox bounds( 4, 4, 250, 100), colour(160, 160, 160, 20), text("Osc1"){
rslider bounds( 0, 25, 70, 70), channel("pitch1"), range(-12, 12, 0, 1, 1 ), text("Pitch"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds( 45, 25, 70, 70), channel("fine1"), range(-1, 1, 0, 1, .001 ), text("Fine"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds(175, 27, 50, 50), channel("pwr1"), range(.001, 3, 1, .5, .01 ), text("PWR"), textbox(0), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds(210, 55, 50, 50), channel("pwa1"), range(.001, .3, .1, 1, .001 ), text("PWA"), textbox(0), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
combobox bounds(105, 55, 60, 20), channel("combobox1"), items("Saw", "Pulse", "Tri"), colour(155, 0, 0, 255), fontcolour("black")
}
groupbox bounds( 4, 109, 250, 100), colour(160, 160, 160, 20), text("Osc2"){
rslider bounds( 0, 130, 70, 70), channel("pitch2"), range(-12, 12, 0, 1, 1 ), text("Pitch"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds( 45, 130, 70, 70), channel("fine2"), range(-1, 1, 0, 1, .001 ), text("Fine"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds(175, 132, 50, 50), channel("pwr2"), range(.001, 3, 1, .5, .01 ), text("PWR"), textbox(0), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds(210, 160, 50, 50), channel("pwa2"), range(.001, .3, .1, 1, .01 ), text("PWA"), textbox(0), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
combobox bounds(105, 155, 60, 20), channel("combobox2"), items("Saw", "Pulse", "Tri"), colour(155, 0, 0, 255), fontcolour("black")
}
groupbox bounds( 4, 215, 250, 100), colour(160, 160, 160, 20), text("Osc3"){
rslider bounds( 0, 235, 70, 70), channel("pitch3"), range(-12, 12, 0, 1, 1 ), text("Pitch"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds( 45, 235, 70, 70), channel("fine3"), range(-1, 1, 0, 1, .001 ), text("Fine"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds(175, 237, 50, 50), channel("pwr3"), range(.001, 3, 1, .5, .01 ), text("PWR"), textbox(0), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds(210, 265, 50, 50), channel("pwa3"), range(.001, .3, .1, 1, .01 ), text("PWA"), textbox(0), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
combobox bounds(105, 255, 60, 20), channel("combobox3"), items("Saw", "Pulse", "Tri"), colour(155, 0, 0, 255), fontcolour("black")
}
groupbox bounds(259, 4, 80, 310), colour(160, 160, 160, 20), text("Volume"){
rslider bounds(265, 25, 70, 70), channel("amp1"), range(.001, 1, .8, .5, .01 ), text("Osc1"), textbox(1), colour(255, 0, 0, 50), trackercolour(255, 0, 0, 255), fontcolour(255, 0, 0, 255)
rslider bounds(265, 130, 70, 70), channel("amp2"), range(.001, 1, .8, .5, .01 ), text("Osc2"), textbox(1), colour(255, 0, 0, 50), trackercolour(255, 0, 0, 255), fontcolour(255, 0, 0, 255)
rslider bounds(265, 235, 70, 70), channel("amp3"), range(.001, 1, .8, .5, .01 ), text("Osc3"), textbox(1), colour(255, 0, 0, 50), trackercolour(255, 0, 0, 255), fontcolour(255, 0, 0, 255)
}
groupbox bounds(344, 215, 250, 100), colour(160, 160, 160, 20), text("Amp"){
rslider bounds(345, 235, 70, 70), channel("a1"), range(.0001, 5, .01, .5, .01 ), text("A"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds(390, 235, 70, 70), channel("d1"), range(.0001, 5, .01, .5, .01 ), text("D"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds(435, 235, 70, 70), channel("s1"), range(.0001, 1, 1, 1, .01 ), text("S"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds(480, 235, 70, 70), channel("r1"), range(.0001, 5, .01, .5, .01 ), text("R"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds(530, 235, 70, 70), channel("master"), range(.0001, 1, .1, .5, .001 ), text("Master"), textbox(1), colour(255, 0, 0, 50), trackercolour(255, 0, 0, 255), fontcolour(255, 0, 0, 255)
}
groupbox bounds(344, 4, 250, 205), colour(160, 160, 160, 20), text("Filter"){
rslider bounds(345, 25, 70, 70), channel("cut"), range( -40, 80, 80, 1, 1 ), text("Cutoff"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds(530, 25, 70, 70), channel("dist"), range(.001, 1, .180, 1, .001 ), text("Distort"),textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds(345, 125, 70, 70), channel("a2"), range(.001, 5, .01, 1, .01 ), text("A"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds(390, 125, 70, 70), channel("d2"), range(.001, 5, .01, 1, .01 ), text("D"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds(435, 125, 70, 70), channel("s2"), range(.001, 1, 1, 1, .01 ), text("S"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds(480, 125, 70, 70), channel("r2"), range(.001, 5, .01, 1, .01 ), text("R"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds(530, 125, 70, 70), channel("envamt"), range(.001, 1, .2, 1, .01 ), text("EnvAmt"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
button bounds(408, 52, 25, 20), channel("button1"), text("12", "24"), colour:0(155, 0, 0, 255), colour:1(255, 0, 0, 255), fontcolour:0(0,0,0,255), fontcolour:1(0,0,0,255)
button bounds(510, 52, 25, 20), channel("button2"), text("Off", "On"), colour:0(155, 0, 0, 255), colour:1(255, 0, 0, 255), fontcolour:0(0,0,0,255), fontcolour:1(0,0,0,255)
}
groupbox bounds(598, 4, 100, 100), colour(160, 160, 160, 20), text("Limit"){
rslider bounds(590, 25, 70, 70), channel("low"), range(-1, .4, -.4, 1, .001 ), text("Low"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds(635, 25, 70, 70), channel("high"), range(-.4, 1, .4, 1, .001 ), text("High"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
}
groupbox bounds(598, 109, 100, 125), colour(160, 160, 160, 20), text("Reverb"){
rslider bounds(590, 160, 70, 70), channel("room"), range(0, 1, .5, 1, .001 ), text("RoomS"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
rslider bounds(638, 160, 70, 70), channel("dmph"), range(0, 1, 0, 1, .001 ), text("Dmp"), textbox(1), colour(155, 0, 0, 50), trackercolour(155, 0, 0, 255), fontcolour(155, 0, 0, 255)
button bounds(635, 134, 25, 20), channel("button3"), text("Off", "On"), colour:0(155, 0, 0, 255), colour:1(255, 0, 0, 255), fontcolour:0(0,0,0,255), fontcolour:1(0,0,0,255)
}
label bounds(605, 245, 100, 15), text("Tonetta Ivan"), align("left"), fontcolour("red")
label bounds(620, 260, 100, 15), text("2016.02"), align("left"), fontcolour("red")
-n -d -+rtmidi=NULL -M0 --midi-velocity-amp=5 ; --midi-key-cps=4
sr = 44100
ksmps = 16
nchnls = 2
0dbfs = 1
garev init 0 ; global variable for reverb
instr 1
; receiving GUI values
kpitch1 chnget "pitch1"
kfine1 chnget "fine1"
kratelfo1 chnget "pwr1"
kamplfo1 chnget "pwa1"
icombobox1 chnget "combobox1"
kpitch2 chnget "pitch2"
kfine2 chnget "fine2"
kratelfo2 chnget "pwr2"
kamplfo2 chnget "pwa2"
icombobox2 chnget "combobox2"
kpitch3 chnget "pitch3"
kfine3 chnget "fine3"
kratelfo3 chnget "pwr3"
kamplfo3 chnget "pwa3"
icombobox3 chnget "combobox3"
ia1 chnget "a1"
id1 chnget "d1"
is1 chnget "s1"
ir1 chnget "r1"
kamp1 chnget "amp1"
kamp2 chnget "amp2"
kamp3 chnget "amp3"
ia2 chnget "a2"
id2 chnget "d2"
is2 chnget "s2"
ir2 chnget "r2"
ibutton1 chnget "button1"
kcut chnget "cut"
kenvamt chnget "envamt"
kdist chnget "dist"
ibutton2 chnget "button2"
klow chnget "low"
khigh chnget "high"
ibutton3 chnget "button3"
kmaster chnget "master"
; Smooth k values
kcut portk kcut, .01
kenvamt portk kenvamt, .01
kmaster portk kmaster, .01
kamplfo1 portk kamplfo1, .01
kamplfo2 portk kamplfo2, .01
kamplfo3 portk kamplfo3, .01
klow portk klow, .01
khigh portk khigh, .01
; LFO
klfo1 oscil kamplfo1, kratelfo1, 2 ; range: bipolar .3 to -.3
klfo2 oscil kamplfo2, kratelfo2, 2
klfo3 oscil kamplfo3, kratelfo3, 2
klfo1 = klfo1 + .5 ; range: unipolar .8 to .2
klfo2 = klfo2 + .5
klfo3 = klfo3 + .5
; Midi Note NUMBER at input
imidi notnum
; Conversion: MIDI note number, GUI values (Pitch and Fine) to cps (because vco request cps, not MIDI, values)
kcps1 cpsmidinn imidi+kpitch1+kfine1
kcps2 cpsmidinn imidi+kpitch2+kfine2
kcps3 cpsmidinn imidi+kpitch3+kfine3
; Pitch-Bender in cps values (with 2+ and 2- octaves range)
kpb pchbend -24, 24
; Add the pitch-bender values for each cps oscillators separately
kcps1 = kcps1 + kpb
kcps2 = kcps2 + kpb
kcps3 = kcps3 + kpb
; Amplitude envelope generation
kenv1 madsr ia1, id1, is1, ir1, 0, 1
; Audio generation
a1 vco kenv1, kcps1, icombobox1, klfo1, 1
a2 vco kenv1, kcps2, icombobox2, klfo2, 1
a3 vco kenv1, kcps3, icombobox3, klfo3, 1
; Volume control for each oscillator
a1 = a1 * kamp1
a2 = a2 * kamp2
a3 = a3 * kamp3
; General amplitude correction (prevent distortion)
asig = (a1 + a2 + a3) * .333333
; Distortion on/off
if (ibutton2 == 1) then
{
asig distort asig, kdist, 3
}
endif
; Filter envelope
kenv2 madsr ia2, id2, is2, ir2, 0, 1
; Amount filter envelope
kenv2 = (kenv2 * 56) * kenvamt
kenv2 cpsmidinn kenv2 + kcut
; Filter
if (ibutton1 == 0) then
{
alp butterlp asig, kenv2
}
elseif (ibutton1 == 1) then
{
alp butterlp asig, kenv2
alp butterlp alp, kenv2
}
endif
; WaveShaping: Limit
alp limit alp, klow, khigh
; If button is pushed, send the signal also to reverb
if (ibutton3 == 1) then
{
garev = garev + alp
}
endif
; Audio out with GUI gain control
outs alp * kmaster, alp * kmaster
endin
instr 99
; receiving GUI values
kroom chnget "room"
kdmph chnget "dmph"
; Smooth k values
kroom portk kroom, .01
kdmph portk kdmph, .01
; Reverb
alpL, alpR freeverb garev, garev, kroom, kdmph, sr, 0
; Audio out with GUI gain control
outs alpL, alpR
; reset global variable
garev = 0
endin
f 1 0 65536 10 1 ; VCO sin wave
f 2 0 65536 7 -1 32768 1 32768 -1 ; LFO tri wave
f 3 0 257 9 .5 1 270 1.5 .33 90 2.5 .2 270 3.5 .143 90 4.5 .111 270 ; distortion values from manual
f0 3600
i 99 0 3600 ; turn on efx instrument