; DiskRecPlay.csd
; Written by Iain McCurdy, 2012
form caption("Disk Rec/Play") size(300, 400), pluginid("dkrp")
groupbox bounds(10, 0, 70, 80), text("Record")
checkbox channel("Record"), bounds(20,25,50,50), value(0), shape("square"), colour("red")
groupbox bounds(80, 0, 70, 80), text("Pause")
checkbox channel("Pause"), bounds(90,25,50,50), value(0), shape("square"), colour("Blue")
groupbox bounds(150, 0, 70, 80), text("Play Loop")
checkbox channel("PlayLoop"), bounds(160,25,50,50), value(0), shape("square")
groupbox bounds(220, 0, 70, 80), text("Play Once")
checkbox channel("PlayOnce"), bounds(230,25,50,50), value(0), shape("square"), colour("yellow")
hslider bounds(10, 80, 280,70), channel("Speed"), range(-4, 4, 1), text("Speed")
hslider bounds(10, 150, 280,70), channel("InSkip"), range(0, 1, 0), text("In Skip")
hslider bounds(10, 220, 280,70), channel("InGain"), range(0, 1, 1), text("Input Gain")
hslider bounds(10, 290, 280,70), channel("OutGain"), range(0, 1, 1), text("Output Gain")
-d -n
;Author: Iain McCurdy (2012)
sr = 44100
ksmps = 32
nchnls = 2
0dbfs = 1
gkrecdur init 0
#define FILENAME #32BitRecording.raw#
instr 1
gkRecord chnget "Record" ;READ IN CABBAGE WIDGET CHANNELS
gkPause chnget "Pause"
gkPlayLoop chnget "PlayLoop"
gkPlayOnce chnget "PlayOnce"
gkSpeed chnget "Speed"
gkInSkip chnget "InSkip"
gkInGain chnget "InGain"
gkOutGain chnget "OutGain"
kswitch changed gkRecord,gkPlayOnce,gkPlayLoop ;IF EITHER 'PLAY ONCE', 'PLAY LOOP' OR 'RECORD' ARE CHANGED, GENERATE A MOMENTARY '1'
if kswitch==1 then ;IF SWITCH CHANGE TRIGGER IS '1'
reinit RESTART ;BEGIN A REINITIALISATION PASS
endif ;END OF CONDITIONAL BRANCH
RESTART: ;A LABEL. BEGIN REINITIALISATION PASS FROM HERE
if i(gkRecord)=1 then ;IF RECORD BUTTON IS ON...
turnon 4 ;TURN ON RECORD INSTRUMENT
elseif i(gkRecord)=0 then ;OR ELSE IF RECORD BUTTON IS OFF...
turnoff2 4,0,0 ;TURN OFF RECORD INSTRUMENT
endif ;END OF THIS CONDITIONAL BRANCH
if i(gkPlayLoop)=1 then ;IF 'PLAY LOOP' BUTTON IS ON...
turnon 2 ;TURN ON PLAY LOOP INSTRUMENT
endif ;END OF THIS CONDITIONAL BRANCH
if i(gkPlayOnce)=1 then ;IF 'PLAY ONCE' BUTTON IS ON...
turnon 3 ;TURN ON PLAY ONCE INSTRUMENT
endif ;END OF THIS CONDITIONAL BRANCH
endin
instr 2 ;PLAYBACK LOOPED INSTRUMENT
if gkPlayLoop=0 then ;IF PLAY LOOPED BUTTON IS DEACTIVATED THEN...
turnoff ;...TURNOFF THIS INSTRUMENT
endif ;END OF CONDITIONAL BRANCH
ifilelen filelen "$FILENAME"
iInSkip = i(gkInSkip)*ifilelen
kporttime linseg 0,0.001,0.02
kSpeed portk gkSpeed,kporttime
if gkPause!=1 then ;IF PAUSE BUTTON IS NOT ACTIVATED...
aL,aR diskin2 "$FILENAME",kSpeed,iInSkip,1 ;PLAY AUDIO FROM FILE
outs aL*gkOutGain,aR*gkOutGain ;SEND AUDIO TO OUTPUT
endif ;END OF CONDITIONAL BRANCH
endin
instr 3 ;PLAYBACK ONCE INSTRUMENT
if gkPlayOnce=0 then ;IF PLAY ONCE BUTTON IS DEACTIVATED THEN...
turnoff ;...TURNOFF THIS INSTRUMENT
endif ;END OF CONDITIONAL BRANCH
ifilelen filelen "$FILENAME"
iInSkip = i(gkInSkip)*ifilelen
kporttime linseg 0,0.001,0.02
kSpeed portk gkSpeed,kporttime
if gkPause!=1 then ;IF PAUSE BUTTON IS NOT ACTIVATED...
aL,aR diskin2 "$FILENAME",kSpeed,iInSkip,0 ;PLAY AUDIO FROM FILE
outs aL*gkOutGain,aR*gkOutGain ;SEND AUDIO TO OUTPUT
kplaydur line 0,1,1 ;CREATE A RISING VALUE USED AS A TIMER
if kplaydur>=gkrecdur then ;IF END OF RECORDING IS REACHED...
koff = 0
chnset koff,"PlayOnce"
turnoff ;- TURN OFF THIS INSTRUMENT IMMEDIATELY.
endif ;END OF CONDITIONAL BRANCH
endif ;END OF CONDITIONAL BRANCH
krelease release
if krelease==1 then
chnset 1-krelease,"PlayOnce"
endif
endin
instr 4 ;RECORD
if gkPause!=1 then ;IF PAUSE BUTTON IS NOT ACTIVATED...
ainL,ainR ins ;READ AUDIO FROM STEREO INPUT
fout "$FILENAME", 6, ainL*gkInGain, ainR*gkInGain ;WRITE MONO AUDIO TO A 32 BIT HEADERLESS FILE (TYPE:6)
gkrecdur line 0,1,1 ;GLOBAL VARIABLE USED TO REGISTER THE DURATION OF THE CURRENTLY RECORDED FILE
endif ;END OF CONDITIONAL BRANCHING
endin
i 1 0 [3600*24*7]