' *************************************************************** ' * test and debug code for midi controlled robots and automats * ' * < Simba > * ' * 2007 * ' *************************************************************** '2007.06.26 in the works - cymbal and hihat tasks made but not tested yet ' task type to be filled in ' hihat open close, castagnets, lights tbd.. '2007.07.02: extended. gwr '2007.07.06: some bugs removed gwr. ' icon upgraded. '2007.07.07: motor test en debug. '2007.07.19: first public appearance of Simba '2007.09.13: Bug discovered in midi hub pic: Pabst motor on on power up... '2010.10.07: firmware for PIC1 rewritten by gwr. DECLARE FUNCTION Init_Simba () AS LONG DECLARE SUB Cymbal1 DECLARE SUB Cymbal1_UD () DECLARE SUB Cymbal1_Stop () DECLARE SUB Cymbal2 DECLARE SUB Cymbal2_UD () DECLARE SUB Cymbal2_Stop () DECLARE SUB HiHat () DECLARE SUB HiHatOpenClose () DECLARE SUB HiHat_Stop () DECLARE SUB Tambourine () DECLARE SUB Simba_casta () DECLARE SUB Simba_Casta_UD () DECLARE SUB Icebell () DECLARE SUB motor1 () ' hitachi DECLARE SUB motor1_stop () DECLARE SUB motor2 () ' papst DECLARE SUB motor2_stop () DECLARE SUB Simbalites () DECLARE SUB Simbalites_stop () DECLARE SUB Simba_Extras () 'notes reserved for extension DECLARE SUB Simba_Extras_Ud () 'notes reserved for extension DECLARE SUB Simba_110 () DECLARE SUB simba_111 () DECLARE SUB Simba_112 () DECLARE SUB Simba_113 () DECLARE SUB Simba_114 () %cymbal1 = 20 %cymbal2 = 21 %hihat = 22 %hihatoc = 23 %tamb = 24 %motor1 = 25 %motor2 = 26 %simbcast = 27 %icebell = 28 %simba_lites = 29 %simba_extras = 30 %Simba110 = 48 %Simba111 = 49 %Simba112 = 50 %Simba113 = 51 %Simba114 = 52 FUNCTION Init_Simba () AS LONG ' GetInstrumentParams Simba, %IDM_SIMBA 'no need to do this here - handled in init_mm !! Task(%MM_SysxTask).naam = "SendSysx" Task(%MM_SysxTask).freq = .33 Task(%MM_SysxTask).cptr = CODEPTR(MM_Sysx) 'in m_robots.inc Task(%cymbal1).naam = "cymbal1" Task(%cymbal1).freq = 1 Task(%cymbal1).cptr = CODEPTR(Cymbal1) TaskEX(%cymbal1).stopcptr = CODEPTR(Cymbal1_Stop) Task(%cymbal2).naam = "cymbal2" Task(%cymbal2).freq = 1 Task(%cymbal2).cptr = CODEPTR(Cymbal2) TaskEX(%Cymbal2).stopcptr = CODEPTR(Cymbal2_Stop) Task(%HiHat).naam = "HiHat" Task(%HiHat).freq = 1 Task(%HiHat).cptr = CODEPTR(HiHat) Task(%HiHatOc).naam = "OpnCls" Task(%HiHatOc).freq = 1 Task(%HiHatOc).cptr = CODEPTR(HiHatOpenClose) TaskEX(%HiHatOc).stopcptr = CODEPTR(HiHat_Stop) Task(%tamb).naam="tambour" Task(%tamb).freq = 1 Task(%tamb).cptr = CODEPTR(Tambourine) Task(%motor1).naam="motorL" ' Hitachi - noot 58 Task(%motor1).freq = 16 Task(%motor1).cptr = CODEPTR(Motor1) TaskEX(%motor1).stopcptr = CODEPTR(Motor1_stop) Task(%motor2).naam="motorR" ' Papst - noot 59 Task(%motor2).freq = 16 Task(%motor2).cptr = CODEPTR(Motor2) TaskEX(%motor2).stopcptr = CODEPTR(Motor2_stop) Task(%simbcast).naam="castas" Task(%simbcast).freq = 1 Task(%simbcast).cptr = CODEPTR(Simba_casta) Task(%icebell).naam="icebell" Task(%icebell).freq = 1 Task(%icebell).cptr = CODEPTR(Icebell) Task(%simba_lites).naam="lites" Task(%simba_lites).freq = 1 Task(%simba_lites).cptr = CODEPTR(Simbalites) TaskEX(%simba_lites).stopcptr = CODEPTR(Simbalites_stop) Task(%simba_extras).naam="extensions" Task(%simba_Extras).freq = 1 Task(%simba_extras).cptr = CODEPTR(Simba_ExtraS) Task(%simba110).naam="L110" Task(%simba110).freq = 50 Task(%simba110).cptr = CODEPTR(Simba_110) TaskEX(%simba110).stopcptr = CODEPTR(Simba110_stop) Task(%simba111).naam="L111" Task(%simba111).freq = 50 Task(%simba111).cptr = CODEPTR(Simba_111) TaskEX(%simba111).stopcptr = CODEPTR(Simba111_stop) Task(%simba112).naam="L112" Task(%simba112).freq = 50 Task(%simba112).cptr = CODEPTR(Simba_112) TaskEX(%simba112).stopcptr = CODEPTR(Simba112_stop) Task(%simba113).naam="L113" Task(%simba113).freq = 50 Task(%simba113).cptr = CODEPTR(Simba_113) TaskEX(%simba113).stopcptr = CODEPTR(Simba113_stop) Task(%simba114).naam="L114" Task(%simba114).freq = 50 Task(%simba114).cptr = CODEPTR(Simba_114) TaskEX(%simba114).stopcptr = CODEPTR(Simba114_stop) MM_Simba_On ' sends controller 66 SetDlgItemText gh.Cockpit, %GMT_TITLE , "" SetDlgItemText gh.Cockpit, %GMT_AUTHOR , $gwr FUNCTION = %True END FUNCTION SUB Cymbal1 STATIC note AS INTEGER STATIC damp AS INTEGER LOCAL velo AS INTEGER LOCAL v AS BYTE STATIC slnr AS DWORD STATIC udnr AS DWORD IF ISFALSE Task(%cymbal1).tog THEN DIM TaskParamLabels(3) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "Tempo", "Level", "Damper", "Note" IF ISFALSE Task(%cymbal1).hParam THEN MakeTaskParameterDialog %cymbal1,3,Slider(),1,UDctrl(),TaskParamLabels() slnr = TaskEX(%cymbal1).SliderNumbers(0) UDctrl(TaskEX(%cymbal1).UpdownNumbers(0)).cptr = CODEPTR(Cymbal1_UD) ' note UDctrl(TaskEX(%cymbal1).UpDownNumbers(0)).value = 60 Slider(slnr).value = Task(%cymbal1).freq * 4 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr + 1).value = 4 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 4 ' low level on init. SlideR(slnr + 3).value = 0 SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, 0 ' damper off on init. udnr = TaskEX(%cymbal1).UpDownNumbers(0) mPlay Simba.channel, 64, 0 'damper off END IF Task(%cymbal1).tog = %True END IF 'a slider is not ideal for the damper, but GMT leaves us only the choice between a slider and an updown.. IF damp <> Slider(slnr + 2).value THEN damp = Slider(slnr + 2).value mPlay Simba.channel, 64, damp 'werkt dit zo: hogere velocity is harder dempen? ' ja, maar voor de demper is een note-off nodig!!! END IF note = UDctrl(udnr).value ' 4 beaters v = Slider(slnr+1).value CONTROL SET TEXT gh.cockpit, %GMT_MSG1, "symb1 " + STR$(note) + STR$(v) 'dit lijkt correc, maar speelt niet IF ( v > 0) THEN mPlay simba.channel, note, v : CONTROL SET TEXT gh.cockpit, %GMT_MSG2, STR$(timegettime) Task(%cymbal1).freq = MAX(.25, (Slider(slnr).value) / 4!) END SUB SUB Cymbal1_UD () ' controls the repetition note to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%cymbal1).UpDownNumbers(0) noot = 60 + (UDCtrl(udnr).value MOD 4) '60-63 UDCtrl(udnr).value = noot SetDlgItemText Task(%cymbal1).hparam, %GMT_TEXT0_ID + 16, "N=" & STR$(noot) END SUB SUB Cymbal1_Stop () Noteoff Simba.channel, 64 END SUB SUB Cymbal2 STATIC note AS INTEGER STATIC damp AS INTEGER LOCAL velo AS INTEGER LOCAL v AS SINGLE STATIC slnr AS DWORD STATIC udnr AS DWORD IF ISFALSE Task(%cymbal2).tog THEN DIM TaskParamLabels(3) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "Tempo", "Level", "Damper", "Note IF ISFALSE Task(%cymbal2).hParam THEN MakeTaskParameterDialog %cymbal2,3,Slider(),1,UDctrl(),TaskParamLabels() slnr = TaskEX(%cymbal2).SliderNumbers(0) UDctrl(TaskEX(%cymbal2).UpdownNumbers(0)).cptr = CODEPTR(Cymbal2_UD) ' note UDctrl(TaskEX(%cymbal2).UpDownNumbers(0)).value = 72 Slider(slnr).value = Task(%cymbal2).freq * 4 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr + 1).value = 4 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 4 ' low level on init. SLider(slnr + 2).value = 0 SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, 0 ' damper off on init. mPlay Simba.channel, 76, 0 udnr = TaskEX(%cymbal2).UpDownNumbers(0) END IF Task(%cymbal2).tog = %True END IF IF damp <> Slider(slnr + 2).value THEN damp = Slider(slnr + 2).value: mPlay Simba.channel, 76, damp 'werkt dit zo: hogere velocity is harder dempen? ' gwr: de aanslagsterkte van de demper wordt geregeld, zoals bij de ' player piano. Met hoge velo's krijg je dus een abrupte demping, met ' lage een eerder softe. END IF note = UDctrl(udnr).value v = Slider(slnr+1).value IF v THEN mPlay simba.channel, note, v Task(%cymbal2).freq = MAX(.25, (Slider(slnr).value) / 4!) END SUB SUB Cymbal2_UD () ' controls the repetition note to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%cymbal2).UpDownNumbers(0) noot = 72 + (UDCtrl(udnr).value MOD 4) '72-75 UDCtrl(udnr).value = noot SetDlgItemText Task(%cymbal2).hparam, %GMT_TEXT0_ID + 16, "N=" & STR$(noot) END SUB SUB Cymbal2_Stop () NoteOff Simba.channel, 76 END SUB SUB HiHat () STATIC note AS INTEGER LOCAL velo AS INTEGER LOCAL v AS SINGLE STATIC slnr AS DWORD STATIC udnr AS DWORD IF ISFALSE Task(%hihat).tog THEN DIM TaskParamLabels(2) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "Tempo", "Level", "Note" IF ISFALSE Task(%hihat).hParam THEN MakeTaskParameterDialog %hihat,2,Slider(),1,UDctrl(),TaskParamLabels() slnr = TaskEX(%hihat).SliderNumbers(0) UDctrl(TaskEX(%hihat).UpdownNumbers(0)).cptr = CODEPTR(HiHat_UD) ' note UDctrl(TaskEX(%hihat).UpDownNumbers(0)).value = 65 Slider(slnr).value = Task(%hihat).freq * 4 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 4 ' low level on init. udnr = TaskEX(%hihat).UpDownNumbers(0) END IF Task(%hihat).tog = %True END IF note = MAX(65, UDctrl(udnr).value) v = Slider(slnr+1).value IF v THEN mPlay simba.channel, note, v Task(%hihat).freq = MAX(.25, (Slider(slnr).value) / 4!) END SUB SUB Hihat_UD () ' controls the repetition note to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD ' STATIC init AS DWORD udnr = TaskEX(%hihat).UpDownNumbers(0) ' IF ISFALSE init THEN noot = 65 + (ABS(UDCtrl(udnr).value + 1) MOD 6) '65-70 ' ELSE ' noot = 65 ' END IF UDCtrl(udnr).value = noot SetDlgItemText Task(%hihat).hparam, %GMT_TEXT0_ID + 16, "N=" & STR$(noot) END SUB SUB HiHatOpenClose () 'separate task for opening and closing the hihat 'note 71 ' needs a note off!!! LOCAL v AS SINGLE STATIC slnr AS DWORD STATIC tg AS DWORD IF ISFALSE Task(%hihatOC).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "Tempo", "Level" IF ISFALSE Task(%hihatOC).hParam THEN MakeTaskParameterDialog %hihatOC,2,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%hihatOC).SliderNumbers(0) Slider(slnr).value = Task(%hihatOC).freq * 4 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 4 ' low level on init. END IF Task(%hihatOC).tog = %True END IF BIT TOGGLE tg, 0 v = IIF(tg, Slider(slnr+1).value, 0) mPlay simba.channel, 71, v Task(%hihatOC).freq = MAX(.25, (Slider(slnr).value) / 16!) END SUB SUB HiHat_Stop () NoteOff Simba.channel, 71 END SUB SUB Tambourine () LOCAL v AS SINGLE STATIC slnr AS DWORD IF ISFALSE Task(%tamb).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "Tempo", "Level" IF ISFALSE Task(%tamb).hParam THEN MakeTaskParameterDialog %tamb,2,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%tamb).SliderNumbers(0) Slider(slnr).value = Task(%tamb).freq * 4 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 4 ' low level on init. END IF Task(%tamb).tog = %True END IF v = Slider(slnr+1).value IF v THEN mPlay simba.channel, 77, v Task(%tamb).freq = MAX(.25, (Slider(slnr).value) / 16!) END SUB SUB Motor1 () ' Hitachi DC motor, left side STATIC v AS BYTE STATIC slnr AS DWORD STATIC CNT AS DWORD IF ISFALSE Task(%motor1).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "koppel" ,"speed" IF ISFALSE Task(%motor1).hParam THEN MakeTaskParameterDialog %motor1,2,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%motor1).SliderNumbers(0) slider(slnr).value = 5 slider(slnr+1).value = 32 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, 5 ' small motorkoppel on init. SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 32 END IF cnt = %False Task(%motor1).freq = 1 Task(%motor1).tog = %True END IF IF ISFALSE cnt MOD 2 THEN mPlay Simba.channel, 58, %False ELSE IF Slider(slnr).value THEN v = Slider(slnr).value mPlay simba.channel, 58, v ELSE NoteOff Simba.channel, 58 END IF END IF INCR cnt Task(%motor1).freq = MAX(0.01, slider(slnr+1).value / 32 ) END SUB SUB Motor1_Stop () mPlay Simba.channel, 58, %False END SUB SUB Motor2 () 'Papst AC - note 59 - Rechterkant STATIC v AS BYTE STATIC slnr AS DWORD IF ISFALSE Task(%motor2).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "speed" IF ISFALSE Task(%motor2).hParam THEN MakeTaskParameterDialog %motor2,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%motor2).SliderNumbers(0) Slider(slnr).value = 10 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, 10 END IF RESET v Task(%motor2).tog = %True END IF IF v MOD 2 THEN mPlay simba.channel, 59, 127 ' - no pwm allowable ELSE NoteOff simba.channel, 59 END IF INCR v Task(%motor2).freq = MAX(Slider(slnr).value / 10, 0.5) END SUB SUB Motor2_Stop () NoteOff Simba.channel, 59 END SUB SUB Simba_casta () STATIC note AS INTEGER LOCAL velo AS INTEGER LOCAL v AS SINGLE STATIC slnr AS DWORD STATIC udnr AS DWORD IF ISFALSE Task(%simbcast).tog THEN DIM TaskParamLabels(2) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "Tempo", "Level", "Note" IF ISFALSE Task(%simbcast).hParam THEN MakeTaskParameterDialog %simbcast,2,Slider(),1,UDctrl(),TaskParamLabels() slnr = TaskEX(%simbcast).SliderNumbers(0) UDctrl(TaskEX(%simbcast).UpdownNumbers(0)).cptr = CODEPTR(Simba_Casta_UD) ' note UDctrl(TaskEX(%simbcast).UpDownNumbers(0)).value = 78 Slider(slnr).value = Task(%simbcast).freq * 4 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 4 ' low level on init. udnr = TaskEX(%simbcast).UpDownNumbers(0) END IF Task(%simbcast).tog = %True END IF note = UDctrl(udnr).value v = Slider(slnr+1).value IF v THEN mPlay simba.channel, note, v Task(%simbcast).freq = MAX(.25, (Slider(slnr).value) / 8!) END SUB SUB Simba_Casta_UD () ' controls the repetition note to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%simbcast).UpDownNumbers(0) noot = 78 + (UDCtrl(udnr).value MOD 2) UDCtrl(udnr).value = noot SetDlgItemText Task(%simbcast).hparam, %GMT_TEXT0_ID + 16, "N=" & STR$(noot) END SUB SUB Icebell () ' %Icebell - midi note 80 ' later a damper may be added on note 81 LOCAL velo AS INTEGER LOCAL v AS SINGLE STATIC slnr AS DWORD IF ISFALSE Task(%icebell).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "Tempo", "Level" IF ISFALSE Task(%icebell).hParam THEN MakeTaskParameterDialog %icebell,2,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%icebell).SliderNumbers(0) Slider(slnr).value = Task(%icebell).freq * 4 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 4 ' low level on init. END IF Task(%icebell).tog = %True END IF v = Slider(slnr+1).value IF v THEN mPlay simba.channel, 80 , v Task(%icebell).freq = MAX(.25, (Slider(slnr).value) / 8!) END SUB SUB SimbaLites () '%simba_lites - mapped on midi notes 110 to 114 ' 110-111 : eyes ' 112 : E10 lites ' 113: back spot ' 114: frontal yellow led's STATIC n AS INTEGER IF ISFALSE Task(%simba_lites).tog THEN n = 109 Task(%Simba_lites).tog = %True END IF IF n > 109 THEN NoteOff Simba.channel, n INCR n IF n > 114 THEN n = 110 mPlay Simba.channel, n, 127 Task(%simba_lites).freq = 3 END SUB SUB Simbalites_Stop () MM_Simba_Off %MM_Lights END SUB SUB Simba_extras () STATIC note AS INTEGER LOCAL velo AS INTEGER LOCAL v AS SINGLE STATIC slnr AS DWORD STATIC udnr AS DWORD IF ISFALSE Task(%simba_extras).tog THEN DIM TaskParamLabels(2) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "Tempo", "Level", "Note" IF ISFALSE Task(%simba_extras).hParam THEN MakeTaskParameterDialog %simba_extras,2,Slider(),1,UDctrl(),TaskParamLabels() slnr = TaskEX(%simba_extras).SliderNumbers(0) UDctrl(TaskEX(%simba_extras).UpdownNumbers(0)).cptr = CODEPTR(Simba_extras_UD) ' note UDctrl(TaskEX(%simba_extras).UpDownNumbers(0)).value = 82 Slider(slnr).value = Task(%simba_extras).freq * 4 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 4 ' low level on init. udnr = TaskEX(%simba_extras).UpDownNumbers(0) END IF Task(%simba_extras).tog = %True END IF note = UDctrl(udnr).value v = Slider(slnr+1).value IF v THEN mPlay simba.channel, note, v Task(%hihat).freq = MAX(.25, (Slider(slnr).value) / 4!) END SUB SUB Simba_extras_UD () ' extra notes on pulse only board ' controls the repetition note to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD ' controls the repetition note to be played. udnr = TaskEX(%simba_extras).UpDownNumbers(0) noot = 82 + ((UDCtrl(udnr).value -3) MOD 9) '80 - 90 UDCtrl(udnr).value = noot SetDlgItemText Task(%simba_extras).hparam, %GMT_TEXT0_ID + 16, "N=" & STR$(noot) END SUB SUB Simba_110 () ' 110-111 : eyes STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%simba110).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "Tempo" IF ISFALSE Task(%simba110).hParam THEN MakeTaskParameterDialog %simba110,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%simba110).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Simba.channel, 110, 127 KeyPress Simba.channel,110, slider(slnr).value Task(%Simba110).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value KeyPress Simba.channel, 110, n END IF Task(%simba110).freq = 10 END SUB SUB Simba110_Stop () NoteOff Simba.channel, 110 END SUB SUB Simba_111 () '111 - eye STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%simba111).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "Tempo" IF ISFALSE Task(%simba111).hParam THEN MakeTaskParameterDialog %simba111,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%simba111).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Simba.channel, 111, 127 KeyPress Simba.channel,111, slider(slnr).value Task(%Simba111).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value KeyPress Simba.channel, 111, n END IF Task(%simba111).freq = 10 END SUB SUB Simba111_Stop () NoteOff Simba.channel, 111 END SUB SUB Simba_112 () ' 112 : E10 lites STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%simba112).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "Tempo" IF ISFALSE Task(%simba112).hParam THEN MakeTaskParameterDialog %simba112,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%simba112).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Simba.channel, 112, 127 KeyPress Simba.channel,112, slider(slnr).value Task(%Simba112).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value KeyPress Simba.channel, 112, n END IF Task(%simba112).freq = 10 END SUB SUB Simba112_Stop () NoteOff Simba.channel, 112 END SUB SUB Simba_113 () ' 113: back spot STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%simba113).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "Tempo" IF ISFALSE Task(%simba113).hParam THEN MakeTaskParameterDialog %simba113,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%simba113).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Simba.channel, 113, 127 KeyPress Simba.channel,113, slider(slnr).value Task(%Simba113).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value KeyPress Simba.channel, 113, n END IF Task(%simba113).freq = 10 END SUB SUB Simba113_Stop () NoteOff Simba.channel, 113 END SUB SUB Simba_114 () ' 114: frontal yellow led's STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%simba114).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "Tempo" IF ISFALSE Task(%simba114).hParam THEN MakeTaskParameterDialog %simba114,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%simba114).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Simba.channel, 114, 127 KeyPress Simba.channel,114, slider(slnr).value Task(%Simba114).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value KeyPress Simba.channel, 114, n END IF Task(%simba114).freq = 10 END SUB SUB Simba114_Stop () NoteOff Simba.channel, 114 END SUB 'EOF