Improved 4track with timer, bells and whistles.

This commit is contained in:
severak 2020-04-18 22:07:03 +02:00
parent 9f38d4964d
commit 5e38765fe8
1 changed files with 92 additions and 40 deletions

View File

@ -1,34 +1,44 @@
; 4track - an TASCAM-like multitrack recorder
; TODO
; - track balance
; - master volume
; - "listen to input" checkbox
; - výběr kvality/formátu nahrávání
; - před výběrem projektu nepůjde nahrávat
; - timer
; - manuál
;
; (s) Severák 2020
; licensed with MIT license
<Cabbage>
form caption("4track") size(400, 240), colour(0, 51, 153), pluginid("4trk")
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(94, 4, 50, 150) range(0, 1, 1, 1, 0.001) channel("vol2")
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")
checkbox bounds(48, 158, 30, 30) channel("ch1") radiogroup("ch")
checkbox bounds(104, 158, 30, 30) channel("ch2") radiogroup("ch")
checkbox bounds(160, 158, 30, 30) channel("ch3") radiogroup("ch")
checkbox bounds(214, 158, 30, 30) channel("ch4") radiogroup("ch")
checkbox bounds(268, 158, 108, 30) channel("ch0") radiogroup("ch") text("JUST PLAY")
checkbox bounds(268, 90, 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(264, 10, 122, 30) mode("directory") channel("dir") text("PROJECT")
label bounds(8, 166, 39, 16) text("CH")
label bounds(46, 194, 37, 16) text("1")
label bounds(106, 194, 27, 16) text("2")
label bounds(160, 194, 33, 16) text("3")
label bounds(216, 194, 30, 18) text("4")
checkbox bounds(268, 124, 107, 30) channel("mix") text("FINAL MIX") fontcolour:1(255, 255, 0, 255) radiogroup("ch")
label bounds(266, 48, 118, 34) text("4track")
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>
@ -47,7 +57,16 @@ gkRunning init 0
; this will be a working dir:
; selectable by button DIR
gSdir init "."
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
@ -61,13 +80,15 @@ kch0 chnget "ch0"
kmix chnget "mix"
klisten chnget "listen"
gkRunning chnget "running"
gSdir chnget "dir"
if changed(gSdir)==1 then
printks "gSdir=%s\n", 0.5, gSdir
; tohle aktivuje projekt
chnset "active(1)", "playrec"
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
@ -116,16 +137,25 @@ if changed:k(gkRunning)==1 && gkRunning==1 && kch4!=1 then
event "i",100,0,900,4
endif
if gkRunning==0 then
; passtrough
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
; playback head
instr 100
if gkRunning==0 then
@ -136,8 +166,10 @@ endif
ich = p4
Sname sprintf "%s/ch%d.wav", gSdir, ich
Schname sprintf "vol%d", ich
Sbalname sprintf "ch%dbal", ich
kVol chnget Schname
printf_i "in=%s, %s, %d\n", 1, Sname, Schname, kVol
kVolmix chnget "volmix"
kBal chnget Sbalname
ivalid filevalid Sname
if ivalid==1 then
@ -145,14 +177,19 @@ if ivalid==1 then
kVol chnget Schname
aL, aR diskin2 Sname, 1
outs aL*kVol, aR*kVol
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
; record head
instr 200
if gkRunning==0 then
@ -166,13 +203,11 @@ Sname sprintf "%s/ch%d.wav", gSdir, ich
printf_i "out=%s\n", 1, Sname
fout Sname, 9, aL, aR
outs aL, aR
clear aL, aR
endin
; mix record
; mixing head
instr 300
if gkRunning==0 then
@ -188,6 +223,23 @@ 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>