; RYCHTA
;
; drum sequencer made out of necessity
;
; use with WaggonBAU or Sitala
;
; (s) Severák 2019
; licensed with MIT license
<Cabbage> 
bounds(0, 0, 0, 0)
form caption("Rychta") size(700, 370), colour(58, 110, 182), pluginid("rych")

; UI was generated using profi method called copy&paste

texteditor bounds(6, 10, 100, 30) channel("r1name")
checkbox bounds(114, 10, 30, 30) channel("r1c1")
checkbox bounds(148, 10, 30, 30) channel("r1c2")
checkbox bounds(182, 10, 30, 30) channel("r1c3")
checkbox bounds(216, 10, 30, 30) channel("r1c4")
checkbox bounds(250, 10, 30, 30) channel("r1c5")
checkbox bounds(284, 10, 30, 30) channel("r1c6")
checkbox bounds(318, 10, 30, 30) channel("r1c7")
checkbox bounds(352, 10, 30, 30) channel("r1c8")
checkbox bounds(386, 10, 30, 30) channel("r1c9")
checkbox bounds(420, 10, 30, 30) channel("r1c10")
checkbox bounds(454, 10, 30, 30) channel("r1c11")
checkbox bounds(488, 10, 30, 30) channel("r1c12")
checkbox bounds(522, 10, 30, 30) channel("r1c13")
checkbox bounds(556, 10, 30, 30) channel("r1c14")
checkbox bounds(590, 10, 30, 30) channel("r1c15")
checkbox bounds(624, 10, 30, 30) channel("r1c16")
nslider bounds(658, 10, 30, 30) range(1, 127, 0, 1, 1) velocity(1) channel("r1note")
;---
texteditor bounds(6, 44, 100, 30) channel("r2name")
checkbox bounds(114, 44, 30, 30) channel("r2c1")
checkbox bounds(148, 44, 30, 30) channel("r2c2")
checkbox bounds(182, 44, 30, 30) channel("r2c3")
checkbox bounds(216, 44, 30, 30) channel("r2c4")
checkbox bounds(250, 44, 30, 30) channel("r2c5")
checkbox bounds(284, 44, 30, 30) channel("r2c6")
checkbox bounds(318, 44, 30, 30) channel("r2c7")
checkbox bounds(352, 44, 30, 30) channel("r2c8")
checkbox bounds(386, 44, 30, 30) channel("r2c9")
checkbox bounds(420, 44, 30, 30) channel("r2c10")
checkbox bounds(454, 44, 30, 30) channel("r2c11")
checkbox bounds(488, 44, 30, 30) channel("r2c12")
checkbox bounds(522, 44, 30, 30) channel("r2c13")
checkbox bounds(556, 44, 30, 30) channel("r2c14")
checkbox bounds(590, 44, 30, 30) channel("r2c15")
checkbox bounds(624, 44, 30, 30) channel("r2c16")
nslider bounds(658, 44, 30, 30) range(1, 127, 0, 1, 1) velocity(1) channel("r2note")
;---
texteditor bounds(6, 78, 100, 30) channel("r3name")
checkbox bounds(114, 78, 30, 30) channel("r3c1")
checkbox bounds(148, 78, 30, 30) channel("r3c2")
checkbox bounds(182, 78, 30, 30) channel("r3c3")
checkbox bounds(216, 78, 30, 30) channel("r3c4")
checkbox bounds(250, 78, 30, 30) channel("r3c5")
checkbox bounds(284, 78, 30, 30) channel("r3c6")
checkbox bounds(318, 78, 30, 30) channel("r3c7")
checkbox bounds(352, 78, 30, 30) channel("r3c8")
checkbox bounds(386, 78, 30, 30) channel("r3c9")
checkbox bounds(420, 78, 30, 30) channel("r3c10")
checkbox bounds(454, 78, 30, 30) channel("r3c11")
checkbox bounds(488, 78, 30, 30) channel("r3c12")
checkbox bounds(522, 78, 30, 30) channel("r3c13")
checkbox bounds(556, 78, 30, 30) channel("r3c14")
checkbox bounds(590, 78, 30, 30) channel("r3c15")
checkbox bounds(624, 78, 30, 30) channel("r3c16")
nslider bounds(658, 78, 30, 30) range(1, 127, 0, 1, 1) velocity(1) channel("r3note")
;---
texteditor bounds(6, 112, 100, 30) channel("r4name")
checkbox bounds(114, 112, 30, 30) channel("r4c1")
checkbox bounds(148, 112, 30, 30) channel("r4c2")
checkbox bounds(182, 112, 30, 30) channel("r4c3")
checkbox bounds(216, 112, 30, 30) channel("r4c4")
checkbox bounds(250, 112, 30, 30) channel("r4c5")
checkbox bounds(284, 112, 30, 30) channel("r4c6")
checkbox bounds(318, 112, 30, 30) channel("r4c7")
checkbox bounds(352, 112, 30, 30) channel("r4c8")
checkbox bounds(386, 112, 30, 30) channel("r4c9")
checkbox bounds(420, 112, 30, 30) channel("r4c10")
checkbox bounds(454, 112, 30, 30) channel("r4c11")
checkbox bounds(488, 112, 30, 30) channel("r4c12")
checkbox bounds(522, 112, 30, 30) channel("r4c13")
checkbox bounds(556, 112, 30, 30) channel("r4c14")
checkbox bounds(590, 112, 30, 30) channel("r4c15")
checkbox bounds(624, 112, 30, 30) channel("r4c16")
nslider bounds(658, 112, 30, 30) range(1, 127, 0, 1, 1) velocity(1) channel("r4note")
;---
texteditor bounds(6, 146, 100, 30) channel("r5name")
checkbox bounds(114, 146, 30, 30) channel("r5c1")
checkbox bounds(148, 146, 30, 30) channel("r5c2")
checkbox bounds(182, 146, 30, 30) channel("r5c3")
checkbox bounds(216, 146, 30, 30) channel("r5c4")
checkbox bounds(250, 146, 30, 30) channel("r5c5")
checkbox bounds(284, 146, 30, 30) channel("r5c6")
checkbox bounds(318, 146, 30, 30) channel("r5c7")
checkbox bounds(352, 146, 30, 30) channel("r5c8")
checkbox bounds(386, 146, 30, 30) channel("r5c9")
checkbox bounds(420, 146, 30, 30) channel("r5c10")
checkbox bounds(454, 146, 30, 30) channel("r5c11")
checkbox bounds(488, 146, 30, 30) channel("r5c12")
checkbox bounds(522, 146, 30, 30) channel("r5c13")
checkbox bounds(556, 146, 30, 30) channel("r5c14")
checkbox bounds(590, 146, 30, 30) channel("r5c15")
checkbox bounds(624, 146, 30, 30) channel("r5c16")
nslider bounds(658, 146, 30, 30) range(1, 127, 0, 1, 1) velocity(1) channel("r5note")
;---
texteditor bounds(6, 180, 100, 30) channel("r6name")
checkbox bounds(114, 180, 30, 30) channel("r6c1")
checkbox bounds(148, 180, 30, 30) channel("r6c2")
checkbox bounds(182, 180, 30, 30) channel("r6c3")
checkbox bounds(216, 180, 30, 30) channel("r6c4")
checkbox bounds(250, 180, 30, 30) channel("r6c5")
checkbox bounds(284, 180, 30, 30) channel("r6c6")
checkbox bounds(318, 180, 30, 30) channel("r6c7")
checkbox bounds(352, 180, 30, 30) channel("r6c8")
checkbox bounds(386, 180, 30, 30) channel("r6c9")
checkbox bounds(420, 180, 30, 30) channel("r6c10")
checkbox bounds(454, 180, 30, 30) channel("r6c11")
checkbox bounds(488, 180, 30, 30) channel("r6c12")
checkbox bounds(522, 180, 30, 30) channel("r6c13")
checkbox bounds(556, 180, 30, 30) channel("r6c14")
checkbox bounds(590, 180, 30, 30) channel("r6c15")
checkbox bounds(624, 180, 30, 30) channel("r6c16")
nslider bounds(658, 180, 30, 30) range(1, 127, 0, 1, 1) velocity(1) channel("r6note")
;---
texteditor bounds(6, 214, 100, 30) channel("r7name")
checkbox bounds(114, 214, 30, 30) channel("r7c1")
checkbox bounds(148, 214, 30, 30) channel("r7c2")
checkbox bounds(182, 214, 30, 30) channel("r7c3")
checkbox bounds(216, 214, 30, 30) channel("r7c4")
checkbox bounds(250, 214, 30, 30) channel("r7c5")
checkbox bounds(284, 214, 30, 30) channel("r7c6")
checkbox bounds(318, 214, 30, 30) channel("r7c7")
checkbox bounds(352, 214, 30, 30) channel("r7c8")
checkbox bounds(386, 214, 30, 30) channel("r7c9")
checkbox bounds(420, 214, 30, 30) channel("r7c10")
checkbox bounds(454, 214, 30, 30) channel("r7c11")
checkbox bounds(488, 214, 30, 30) channel("r7c12")
checkbox bounds(522, 214, 30, 30) channel("r7c13")
checkbox bounds(556, 214, 30, 30) channel("r7c14")
checkbox bounds(590, 214, 30, 30) channel("r7c15")
checkbox bounds(624, 214, 30, 30) channel("r7c16")
nslider bounds(658, 214, 30, 30) range(1, 127, 0, 1, 1) velocity(1) channel("r7note")
;---

label bounds(114, 248, 30, 30) text("1") identchannel("s1")
label bounds(148, 248, 30, 30) text("2") identchannel("s2")
label bounds(182, 248, 30, 30) text("3") identchannel("s3")
label bounds(216, 248, 30, 30) text("4") identchannel("s4")
label bounds(250, 248, 30, 30) text("5") identchannel("s5")
label bounds(284, 248, 30, 30) text("6") identchannel("s6")
label bounds(318, 248, 30, 30) text("7") identchannel("s7")
label bounds(352, 248, 30, 30) text("8") identchannel("s8")
label bounds(386, 248, 30, 30) text("9") identchannel("s9")
label bounds(420, 252, 30, 24) text("10") identchannel("s10") fontcolour(192, 192, 192, 255)
label bounds(454, 252, 32, 24) text("11") identchannel("s11")
label bounds(488, 252, 30, 24) text("12") identchannel("s12")
label bounds(522, 252, 30, 25) text("13") identchannel("s13")
label bounds(556, 252, 30, 24) text("14") identchannel("s14")
label bounds(590, 252, 30, 24) text("15") identchannel("s15")
label bounds(624, 250, 30, 25) text("16") identchannel("s16")
label bounds(14, 280, 166, 39) text("RYCHTA")
label bounds(14, 322, 166, 18) text("drum sequencer")
checkbox bounds(288, 334, 126, 30) text("external clock") channel("extclock")
rslider bounds(186, 286, 95, 55) range(1, 500, 120, 1, 1) text("BPM") channel("bpm") identchannel("bpmw")
button bounds(288, 288, 80, 40) text("RUN", "STOP") channel("running") identchannel("runningw")


label bounds(378, 298, 292, 17) text("there will be more features in 2020")
</Cabbage>
<CsoundSynthesizer>
<CsOptions>
-n -d -+rtmidi=NULL -M0 -m0d -Q0
</CsOptions>
<CsInstruments>
; Initialize the global variables. 
ksmps = 32
nchnls = 2
0dbfs = 1

;instrument will be triggered by keyboard widget
instr GUI
    kstep init 0
    
    kextclock chnget "extclock"
    
    if kextclock==1 then
        kbpm	chnget	"HOST_BPM"
	 	kbpm limit kbpm,1,2000
	    krunning chnget "IS_PLAYING"
	    chnset kbpm, "bpm"
        chnset krunning, "running"
    else    
        krunning chnget "running"
        kbpm chnget "bpm"
    endif
    
    if changed:k(kextclock)==1 then
        if kextclock==1 then
            ; we display native clock values and disable buttons
            chnset "active(0)", "runningw"
            chnset "active(0)", "bpmw"
            
        else
            ; we enable buttons
            chnset "active(1)", "runningw"
            chnset "active(1)", "bpmw"
        endif
    endif
    
    kcps = kbpm / 15
    
    ktrig metro kcps
    
    if changed:k(krunning)==1 then
        kstep = 0
    endif
    
    if krunning==1 && ktrig==1 then
        Stepiden sprintfk "s%d", (kstep+1)
        chnset " fontcolour(255, 255, 0, 255)", Stepiden
        if kstep==0 then
            Stepidenprev sprintfk "s%d", 16
        else 
            Stepidenprev sprintfk "s%d", kstep
        endif
        chnset " fontcolour(192, 192, 192, 255)", Stepidenprev
        
        ; another massive copypasta section:
       
        krow = 1
       
        Snoteiden sprintfk "r%dnote", krow
        Scheckiden sprintfk "r%dc%d", krow, (kstep+1)
           
        knote chnget Snoteiden
        kchecked chnget Scheckiden
            
        if knote>1 && kchecked==1 then
            ;printks "midiout kstatus=%d, kchan=%d, kdata1=%d, kdata2=%d\n", 0, 144, 10, knote, 100
            midiout 144, 10, knote, 100
        endif
        
        krow = 2
       
        Snoteiden sprintfk "r%dnote", krow
        Scheckiden sprintfk "r%dc%d", krow, (kstep+1)
           
        knote chnget Snoteiden
        kchecked chnget Scheckiden
            
        if knote>1 && kchecked==1 then
            ;printks "midiout kstatus=%d, kchan=%d, kdata1=%d, kdata2=%d\n", 0, 144, 10, knote, 100
            midiout 144, 10, knote, 100
        endif
        
        krow = 3
       
        Snoteiden sprintfk "r%dnote", krow
        Scheckiden sprintfk "r%dc%d", krow, (kstep+1)
           
        knote chnget Snoteiden
        kchecked chnget Scheckiden
            
        if knote>1 && kchecked==1 then
            ;printks "midiout kstatus=%d, kchan=%d, kdata1=%d, kdata2=%d\n", 0, 144, 10, knote, 100
            midiout 144, 10, knote, 100
        endif
        
        krow = 4
       
        Snoteiden sprintfk "r%dnote", krow
        Scheckiden sprintfk "r%dc%d", krow, (kstep+1)
           
        knote chnget Snoteiden
        kchecked chnget Scheckiden
            
        if knote>1 && kchecked==1 then
            ;printks "midiout kstatus=%d, kchan=%d, kdata1=%d, kdata2=%d\n", 0, 144, 10, knote, 100
            midiout 144, 10, knote, 100
        endif
        
        krow = 5
       
        Snoteiden sprintfk "r%dnote", krow
        Scheckiden sprintfk "r%dc%d", krow, (kstep+1)
           
        knote chnget Snoteiden
        kchecked chnget Scheckiden
            
        if knote>1 && kchecked==1 then
            ;printks "midiout kstatus=%d, kchan=%d, kdata1=%d, kdata2=%d\n", 0, 144, 10, knote, 100
            midiout 144, 10, knote, 100
        endif
        
        krow = 6
       
        Snoteiden sprintfk "r%dnote", krow
        Scheckiden sprintfk "r%dc%d", krow, (kstep+1)
           
        knote chnget Snoteiden
        kchecked chnget Scheckiden
            
        if knote>1 && kchecked==1 then
            ;printks "midiout kstatus=%d, kchan=%d, kdata1=%d, kdata2=%d\n", 0, 144, 10, knote, 100
            midiout 144, 10, knote, 100
        endif
        
        krow = 7
       
        Snoteiden sprintfk "r%dnote", krow
        Scheckiden sprintfk "r%dc%d", krow, (kstep+1)
           
        knote chnget Snoteiden
        kchecked chnget Scheckiden
            
        if knote>1 && kchecked==1 then
            ;printks "midiout kstatus=%d, kchan=%d, kdata1=%d, kdata2=%d\n", 0, 144, 10, knote, 100
            midiout 144, 10, knote, 100
        endif
    
        ;printks "step = %d\n", 0, (kstep+1)
    
        kstep = (kstep + 1) % 16
    endif
    
    
endin

</CsInstruments>
<CsScore>
i "GUI" 0 3600
</CsScore>
</CsoundSynthesizer>
