falco/cabbages/4track.csd

253 lines
5.7 KiB
Plaintext

; 4track - an TASCAM-like multitrack recorder
;
; (s) Severák 2020
; licensed with MIT license
<Cabbage>
form caption("4track") size(445, 250), colour(0, 51, 153), pluginid("4trk")
vslider bounds(40, 4, 50, 150) range(0, 1, 1, 1, 0.001) channel("vol1")
vslider bounds(95, 4, 49, 150) range(0, 1, 1, 1, 0.001) channel("vol2")
vslider bounds(150, 4, 50, 149) range(0, 1, 1, 1, 0.001) channel("vol3")
vslider bounds(204, 4, 50, 149) range(0, 1, 1, 1, 0.001) channel("vol4")
vslider bounds(256, 4, 50, 149) range(0, 1, 1, 1, 0.001) channel("volmix")
rslider bounds(42, 156, 52, 37) range(-0.5, 0.5, 0, 1, 0.001) channel("ch1bal")
rslider bounds(94, 156, 52, 37) range(-0.5, 0.5, 0, 1, 0.001) channel("ch2bal")
rslider bounds(150, 156, 52, 37) range(-0.5, 0.5, 0, 1, 0.001) channel("ch3bal")
rslider bounds(202, 156, 52, 37) range(-0.5, 0.5, 0, 1, 0.001) channel("ch4bal")
checkbox bounds(52, 194, 30, 30) channel("ch1") radiogroup("ch") colour:1(255, 0, 0, 255)
checkbox bounds(104, 194, 30, 30) channel("ch2") radiogroup("ch") colour:1(255, 0, 0, 255)
checkbox bounds(160, 194, 30, 30) channel("ch3") radiogroup("ch") colour:1(255, 0, 0, 255)
checkbox bounds(214, 194, 30, 30) channel("ch4") radiogroup("ch") colour:1(255, 0, 0, 255)
checkbox bounds(266, 194, 30, 30) channel("mix") radiogroup("ch") colour:1(255, 0, 0, 255)
checkbox bounds(320, 192, 108, 30) channel("ch0") radiogroup("ch") text("JUST PLAY")
checkbox bounds(318, 98, 108, 30) text("PLAY/REC") channel("running") colour:1(255, 0, 0, 255) fontcolour:1(255, 255, 0, 255) active(0) identchannel("playrec")
filebutton bounds(316, 8, 122, 30) mode("directory") channel("dir") text("PROJECT", "PROJECT")
label bounds(6, 202, 39, 16) text("CH")
label bounds(48, 230, 37, 16) text("1")
label bounds(104, 230, 27, 16) text("2")
label bounds(158, 230, 33, 16) text("3")
label bounds(214, 228, 30, 18) text("4")
label bounds(320, 42, 118, 34) text("4track")
label bounds(262, 230, 38, 16) text("mix")
label bounds(4, 168, 35, 16) text("PAN")
label bounds(2, 130, 36, 17) text("VOL")
label bounds(342, 80, 91, 16) text("by Severák")
checkbox bounds(318, 132, 120, 30) text("listen to input") channel("listen") value(1)
label bounds(348, 168, 80, 16) text("00:00") identchannel("timer")
</Cabbage>
<CsoundSynthesizer>
<CsOptions>
-n -d -+rtmidi=NULL -M0 -m0d
</CsOptions>
<CsInstruments>
; Initialize the global variables.
ksmps = 32
nchnls = 2
0dbfs = 1
; ignore incoming MIDI events
massign 0,0
gkRunning init 0
; this will be a working dir:
; selectable by button DIR
gSdir init ""
; whole code is split into multiple instruments:
; - main recorder controls
; - playback head
; - record head
; - mixing head
; - timer
; recorder controls (always on)
instr 1
kch1 chnget "ch1"
kch2 chnget "ch2"
kch3 chnget "ch3"
kch4 chnget "ch4"
kch0 chnget "ch0"
kmix chnget "mix"
klisten chnget "listen"
gkRunning chnget "running"
gSdir chnget "dir"
if changed(gSdir)==1 && strcmpk(gSdir, "")==1 then
; TODO - here activate only on selecting project
printks "activated! %s==%s %d\n", 0, gSdir, "", strcmpk(gSdir, "")
event "i",5,0,1
endif
if changed:k(gkRunning)==1 && gkRunning==1 && kch1==1 then
printks "REC 1 ON\n", 0.5
event "i",200,0,900,1
endif
if changed:k(gkRunning)==1 && gkRunning==1 && kch2==1 then
printks "REC 2 ON\n", 0.5
event "i",200,0,900,2
endif
if changed:k(gkRunning)==1 && gkRunning==1 && kch3==1 then
printks "REC 3 ON\n", 0.5
event "i",200,0,900,3
endif
if changed:k(gkRunning)==1 && gkRunning==1 && kch4==1 then
printks "REC 4 ON\n", 0.5
event "i",200,0,900,4
endif
if changed:k(gkRunning)==1 && gkRunning==1 && kmix==1 then
printks "MIX ON\n", 0.5
event "i",300,0,900
endif
if changed:k(gkRunning)==1 && gkRunning==1 && kch1!=1 then
printks "PLAY 1 ON\n", 0.5
event "i",100,0,900,1
endif
if changed:k(gkRunning)==1 && gkRunning==1 && kch2!=1 then
printks "PLAY 2 ON\n", 0.5
event "i",100,0,900,2
endif
if changed:k(gkRunning)==1 && gkRunning==1 && kch3!=1 then
printks "PLAY 3 ON\n", 0.5
event "i",100,0,900,3
endif
if changed:k(gkRunning)==1 && gkRunning==1 && kch4!=1 then
printks "PLAY 4 ON\n", 0.5
event "i",100,0,900,4
endif
if changed:k(gkRunning)==1 && gkRunning==1 then
; tick of the clock
event "i",400,0,900
endif
if kmix!=1 && klisten==1 then
; passtrough audio input when not mixing master and when its enabled
aL, aR ins
outs aL, aR
endif
endin
instr 5
chnset "active(1)", "playrec"
endin
; playback head
instr 100
if gkRunning==0 then
turnoff
endif
ich = p4
Sname sprintf "%s/ch%d.wav", gSdir, ich
Schname sprintf "vol%d", ich
Sbalname sprintf "ch%dbal", ich
kVol chnget Schname
kVolmix chnget "volmix"
kBal chnget Sbalname
ivalid filevalid Sname
if ivalid==1 then
kVol chnget Schname
aL, aR diskin2 Sname, 1
if kBal!=0 then
aL, aR pan2 aL+aR, kBal+0.5
endif
outs aL* (kVol * kVolmix), aR * (kVol * kVolmix)
else
turnoff
endif
endin
; record head
instr 200
if gkRunning==0 then
turnoff
endif
aL, aR ins
ich = p4
Sname sprintf "%s/ch%d.wav", gSdir, ich
printf_i "out=%s\n", 1, Sname
fout Sname, 9, aL, aR
endin
; mixing head
instr 300
if gkRunning==0 then
turnoff
endif
aL, aR monitor
Sname sprintf "%s/mix.wav", gSdir
printf_i "out=%s\n", 1, Sname
fout Sname, 9, aL, aR
endin
; timer
instr 400
if gkRunning==0 then
turnoff
endif
ktime init -1
ktrig metro 1
if ktrig==1 then
ktime = ktime + 1
Stime sprintfk "text(\"%02d:%02d\")", floor(ktime/60), (ktime%60)
chnset Stime, "timer"
endif
endin
</CsInstruments>
<CsScore>
;causes Csound to run for about 7000 years...
f0 z
;starts instrument 1 and runs it for a week
i1 0 [60*60*24*7]
</CsScore>
</CsoundSynthesizer>