' *************************************************************** ' * test and debug code for midi controlled robots and automats * ' * * ' * 2006 * ' *************************************************************** ' 09.01.2006: creation date of this code module ' 21.01.2006: test and debug session. ' 22.01.2006: cluster test added. ' 27.01.2006: lites added & wind ctrl. improved ' 06.02.2006: pIC5 bugs removed. Tremulant still to be done. ' 24.03.2006: lite 3 added. %krum_debug = 0 ' define only for low level hardware debugging compilation - gwr %Test_Krum = 48 ' scale test %Krum_Poly = 49 ' polyfonie en plaknoten test %Krum_Tremulant = 50 %Krum_klusters = 51 ' 16 note cluster tests. %Test_Krum_Wind = 52 %Krum_Lite1 = 53 %Krum_Lite2 = 54 %krum_lite3 = 55 %Krum_Tune = 56 %Krum_Error = 57 ' for debugging %Krum_OnOff = 58 ' for debugging %Krum_Valve = 59 ' for debugging GLOBAL hwCtrlKrum AS LONG DECLARE SUB Krum_Test () DECLARE SUB Krum_Poly_test () DECLARE SUB Krum_Poly_UD () DECLARE SUB Krum_Tremulant_Test () DECLARE SUB Krum_Tremulant_Stop () DECLARE SUB Krum_Kluster_Test () DECLARE SUB Krum_Klusters_UD () DECLARE SUB Krum_Wind () DECLARE SUB Krum_Wind_CB () DECLARE SUB Krum_Tune () DECLARE SUB Krum_Tune_UD () DECLARE SUB Krum_Lite1 () DECLARE SUB krum_lite2 () DECLARE SUB Krum_lite3 () #IF %DEF(%Krum_Debug) DECLARE SUB krum_Error () DECLARE SUB Krum_OnOff () #ENDIF DECLARE SUB Krum_Valve () DECLARE FUNCTION Krum_Init () AS LONG DECLARE SUB Krum_controlroom DECLARE CALLBACK FUNCTION CB_Krum_Controlroom 'for midiplayer DECLARE SUB dummyplayer(OPT BYVAL rst AS LONG, OPT BYVAL pause AS LONG) 'we only need declaration for calldword using.. FUNCTION Krum_Init () AS LONG LOCAL retval AS LONG LOCAL m AS ASCIIZ * 20 m = " test code" Sendmessage gh.Cockpit, %WM_SETTEXT,0, VARPTR(m) GetInstrumentParams Krum, %IDM_Krum retval = SetRobotport (Krum, Inifilename, hMidiO()) Task(%Test_Krum).naam = "Scale" Task(%Test_Krum).cptr = CODEPTR(Krum_Test) Task(%Test_Krum).freq = 20 Task(%Test_Krum).level = 127 Task(%Test_Krum).channel = Krum.Channel TaskEX(%Test_Krum).stopCptr = CODEPTR(MM_Krum_Off) Task(%Krum_Poly).naam = "Poly" Task(%Krum_Poly).cptr = CODEPTR(Krum_Poly_Test) Task(%Krum_Poly).freq = 20 Task(%Krum_Poly).level = 127 Task(%Krum_Poly).channel = Krum.Channel TaskEX(%Krum_Poly).stopCptr = CODEPTR(MM_Krum_Off) Task(%Krum_Tremulant).naam = "Trem" Task(%Krum_Tremulant).cptr = CODEPTR(Krum_Tremulant_Test) Task(%Krum_Tremulant).freq = 10 Task(%Krum_Tremulant).level = 127 Task(%Krum_Tremulant).channel = Krum.Channel TaskEX(%Krum_Tremulant).stopcptr = CODEPTR(Krum_Tremulant_Stop) Task(%Krum_Klusters).naam = "Kluster" Task(%Krum_Klusters).cptr = CODEPTR(Krum_Kluster_Test) Task(%Krum_Klusters).freq = 10 Task(%Krum_Klusters).level = 127 Task(%Krum_Klusters).channel = Krum.Channel TaskEX(%Krum_Klusters).stopCptr = CODEPTR(MM_Krum_Off) Task(%Test_Krum_Wind).naam = "Motor" Task(%Test_Krum_Wind).cptr = CODEPTR(Krum_Wind) Task(%Test_Krum_Wind).freq = 20 Task(%Test_Krum_Wind).channel = Krum.Channel Task(%Krum_lite1).naam = "Lite1" Task(%Krum_lite1).cptr = CODEPTR(Krum_lite1) Task(%Krum_lite1).freq = 16 Task(%Krum_lite1).channel = Krum.channel Task(%Krum_lite2).naam = "Lite2" Task(%Krum_lite2).cptr = CODEPTR(Krum_lite2) Task(%Krum_lite2).freq = 16.1 Task(%Krum_lite2).channel = Krum.channel Task(%Krum_lite3).naam = "Lite3" Task(%Krum_lite3).cptr = CODEPTR(Krum_lite3) Task(%Krum_lite3).freq = 16.2 Task(%Krum_lite3).channel = Krum.channel #IF %DEF(%Krum_debug) Task(%Krum_error).naam = "Error" ' debug PIC only Task(%Krum_error).cptr = CODEPTR(Krum_error) Task(%Krum_error).freq = 1 Task(%Krum_error).channel = Krum.channel Task(%Krum_onoff).naam = "OnOff" ' debug PIC only - motor on off Task(%Krum_onoff).cptr = CODEPTR(Krum_onoff) Task(%Krum_onoff).freq = 1 Task(%Krum_onoff).channel = Krum.channel #ENDIF Task(%Krum_valve).naam = "Valve" Task(%Krum_valve).cptr = CODEPTR(Krum_valve) Task(%Krum_valve).freq = 10 Task(%Krum_valve).channel = Krum.channel Task(%Krum_Tune).naam = "Tune" Task(%Krum_Tune).cptr = CODEPTR(Krum_Tune) Task(%Krum_Tune).freq = 10 Task(%Krum_Tune).channel = Krum.channel 'interactive fileplayiing Task(App.ReadSeqScoreTasknr).naam = "MFilePlay" Task(App.ReadSeqScoreTasknr).cptr = GetProcAddress(GetModuleHandle("g_lib.dll"),"MM_MIDIPLAYER") Task(App.ReadSeqScoreTasknr).freq = 500 '800 ' this is too fast! use 500 or 1000, 800 has no meaning Task(App.ReadSeqScoreTasknr).flags = %DLL_TASK OR %PERTIM_TASK TaskEX(App.ReadSeqScoreTasknr).stopcptr = GetProcAddress(GetModuleHandle("g_lib.dll"),"MM_MIDIPLAYERSTOP") ButnSW(8).tag0 = "KrumCtrl tog" ButnSW(8).tag1 = "KrumCtrl tog" ButnSW(8).cptr = CODEPTR(Krum_Controlroom) SetDlgItemText gh.Cockpit, %GMT_TITLE, "-robot" SetDlgItemText gh.Cockpit, %GMT_AUTHOR, $gwr FUNCTION = %True END FUNCTION SUB Krum_Test() ' scale test for Krum PWM motor controll and tremulant circuit. STATIC i% STATIC oldnote AS INTEGER STATIC slnr AS BYTE STATIC udnr AS BYTE IF ISFALSE Task(%Test_Krum).tog THEN LOCAL testid%, testhandle AS LONG i% = Krum.lowtes ' create a parameter window: DIM TaskParamLabels(0 TO 3) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Wind" ' controller 7 TaskParamLabels(2) = "Valve" ' controller 1 - valve or controller 11, tremulant speed (if on) TaskParamlabels(3) = "+/-" ' tremulant on/off IF ISFALSE Task(%Test_Krum).hParam THEN MakeTaskParameterDialog %Test_Krum,3,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE udnr THEN udnr = TaskEX(%Test_Krum).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Krum_Test_UD) UDctrl(udnr).value = %False Krum.ctrl(10) = %False ' tremulant on/off switch END IF IF ISFALSE slnr THEN slnr = TaskEX(%Test_Krum).SliderNumbers(1) ' wind Slider(slnr).value = %MM_Krum_Motor SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Test_Krum).tog = %True END IF IF Slider(slnr).value <> Krum.ctrl(7) THEN Krum.ctrl(7) = Slider(slnr).value ' 0-127 Controller Krum.channel, 7, Krum.ctrl(7) ' motor speed END IF SELECT CASE Udctrl(udnr).value CASE %False IF Krum.ctrl(10) <> %False THEN ' set controller to windvalve control Controller Krum.channel, 10,0 Krum.ctrl(10) = 0 END IF IF Krum.ctrl(1) <> Slider(slnr+1).value THEN Controller Krum.channel, 1, Slider(slnr+1).value Krum.ctrl(1) = Slider(slnr+1).value END IF CASE ELSE IF Krum.ctrl(10) <> 16 THEN ' set controller to tremulant control Controller Krum.channel, 10, 16 Krum.ctrl(10) = 16 END IF IF Krum.ctrl(11) <> Slider(slnr+1).value THEN Controller Krum.channel, 11, Slider(slnr+1).value Krum.ctrl(11) = Slider(slnr+1).value END IF END SELECT IF ISFALSE oldnote THEN mPlay Krum.channel,i%, 64 oldnote = i% INCR i% IF i% > Krum.hightes THEN i% = Krum.lowtes ELSE NoteOff Krum.channel, oldnote oldnote = %False END IF Task(%Test_Krum).freq = Slider(slnr-1).value IF Task(%Test_Krum).freq < 0.5 THEN Task(%Test_Krum).freq = 0.5 END SUB SUB Krum_Test_UD () ' callback on parameter UpDowns.- tremulant switch LOCAL udnr AS DWORD udnr = TaskEX(%Test_Krum).UpdownNumbers(0) IF UDctrl(udnr).value <= %False THEN UDctrl(udnr).value = %False SetDlgItemText Task(%Test_Krum).hparam, %GMT_TEXT0_ID + 16, "On" ELSE UDctrl(udnr).value = %True SetDlgItemText Task(%Test_Krum).hparam, %GMT_TEXT0_ID + 16, "Off" END IF END SUB SUB Krum_Poly_Test () STATIC slnr AS BYTE STATIC udnr AS BYTE STATIC oldpic AS BYTE LOCAL n1 AS INTEGER LOCAL n2 AS INTEGER LOCAL n3 AS INTEGER IF ISFALSE Task(%Krum_Poly).tog THEN ' create a parameter window: DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamlabels(1) = "pic" IF ISFALSE Task(%Krum_poly).hParam THEN MakeTaskParameterDialog %Krum_Poly,1,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE udnr THEN udnr = TaskEX(%Krum_Poly).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Krum_Poly_UD) UDctrl(udnr).value = 1 oldpic = 1 END IF IF ISFALSE slnr THEN slnr = TaskEX(%Krum_poly).SliderNumbers(0) ' tempo Slider(slnr).value = 8 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Krum_Poly).tog = %True END IF SELECT CASE UDctrl(udnr).value CASE <> oldpic MM_Krum_Off %MM_Notes oldpic = UDctrl(udnr).value EXIT SUB CASE 1 ' pic1 - notes 36 - 51 n1 = Krum.lowtes + (RND(1) * 16) DO n2 = Krum.lowtes + (RND(1) * 16) n3 = Krum.lowtes + (RND(1) * 16) LOOP UNTIL (n2 <> n1) AND (n3 <> n2) AND (n2 <> n3) CASE 2 ' pic2 - notes 52 - 67 n1 = 52 + (RND(1) * 16) DO n2 = 52 + (RND(1) * 16) n3 = 52 + (RND(1) * 16) LOOP UNTIL (n2 <> n1) AND (n3 <> n2) AND (n2 <> n3) CASE 3 ' pic3 - notes 68 - 83 n1 = 68 + (RND(1) * 16) DO n2 = 68 + (RND(1) * 16) n3 = 68 + (RND(1) * 16) LOOP UNTIL (n2 <> n1) AND (n3 <> n2) AND (n2 <> n3) CASE 4 ' pic4 - notes 84 - 91 - notes 92-99: nc n1 = 84 + (RND(1) * 8) DO n2 = 84 + (RND(1) * 8) n3 = 84 + (RND(1) * 8) LOOP UNTIL (n2 <> n1) AND (n3 <> n2) AND (n2 <> n3) END SELECT addnote2har Krum.Har(1), n1, 64 addnote2har Krum.Har(1), n2, 64 addnote2har Krum.Har(1), n3, 64 Instrumplay Krum Task(%Krum_Poly).freq = Slider(slnr).value /2 IF Task(%Krum_Poly).freq < 0.5 THEN Task(%Krum_Poly).freq = 0.5 END SUB SUB Krum_Poly_UD () ' callback on parameter UpDowns. - PIC selector LOCAL udnr AS DWORD udnr = TaskEX(%Krum_Poly).UpdownNumbers(0) IF UDctrl(udnr).value < 1 THEN UDctrl(udnr).value = 1 SetDlgItemText Task(%Krum_Poly).hparam, %GMT_TEXT0_ID + 16, "1" ELSEIF UDctrl(udnr).value > 4 THEN UDctrl(udnr).value = 4 SetDlgItemText Task(%Krum_Poly).hparam, %GMT_TEXT0_ID + 16, "4" ELSE SetDlgItemText Task(%Krum_Poly).hparam, %GMT_TEXT0_ID + 16, STR$(UDctrl(udnr).value) END IF END SUB SUB Krum_Kluster_Test () STATIC slnr AS BYTE STATIC udnr AS BYTE STATIC oldpic AS BYTE LOCAL n1 AS INTEGER LOCAL n2 AS INTEGER LOCAL i AS LONG STATIC s AS LONG IF ISFALSE Task(%Krum_Klusters).tog THEN ' create a parameter window: DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamlabels(1) = "pic" IF ISFALSE Task(%Krum_klusters).hParam THEN MakeTaskParameterDialog %Krum_Klusters,1,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE udnr THEN udnr = TaskEX(%Krum_Klusters).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Krum_Klusters_UD) UDctrl(udnr).value = 1 oldpic = 1 END IF IF ISFALSE slnr THEN slnr = TaskEX(%Krum_Klusters).SliderNumbers(0) ' tempo Slider(slnr).value = 6 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Krum_Klusters).tog = %True END IF SELECT CASE UDctrl(udnr).value CASE <> oldpic MM_Krum_Off %MM_Notes oldpic = UDctrl(udnr).value s = %False EXIT SUB CASE 1 ' pic1 - notes 36 - 51 n1 = Krum.lowtes n2 = 51 CASE 2 ' pic2 - notes 52 - 67 n1 = 52 n2 = 67 CASE 3 ' pic3 - notes 68 - 83 n1 = 68 n2 = 83 CASE 4 ' pic4 - notes 84 - 91 - notes 92-99: nc n1 = 84 n2 = 91 END SELECT IF ISFALSE s THEN FOR i = n1 TO n2 addnote2har Krum.Har(1), i, 64 NEXT i Instrumplay Krum s = %True ELSE Instrumplay Krum ' notes off s = %False END IF Task(%Krum_Klusters).freq = Slider(slnr).value /2 IF Task(%Krum_Klusters).freq < 0.5 THEN Task(%Krum_Klusters).freq = 0.5 END SUB SUB Krum_Klusters_UD () ' callback on parameter UpDowns. - PIC selector LOCAL udnr AS DWORD udnr = TaskEX(%Krum_Klusters).UpdownNumbers(0) IF UDctrl(udnr).value < 1 THEN UDctrl(udnr).value = 1 SetDlgItemText Task(%Krum_Klusters).hparam, %GMT_TEXT0_ID + 16, "1" ELSEIF UDctrl(udnr).value > 4 THEN UDctrl(udnr).value = 4 SetDlgItemText Task(%Krum_Klusters).hparam, %GMT_TEXT0_ID + 16, "4" ELSE SetDlgItemText Task(%Krum_Klusters).hparam, %GMT_TEXT0_ID + 16, STR$(UDctrl(udnr).value) END IF END SUB SUB Krum_Tremulant_Test () ' test for Krum tremulant circuit using the wind valve ' not yet functionnal on pic level. (06.02.2006) STATIC slnr AS BYTE STATIC tog AS LONG STATIC oldval AS LONG LOCAL value AS DWORD IF ISFALSE Task(%Krum_Tremulant).tog THEN Task(%Krum_tremulant).tog = %True DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Krum_Tremulant).hParam THEN MakeTaskParameterDialog %Krum_Tremulant,1,Slider(),0,UDctrl(),TaskParamLabels() END IF slnr = TaskEX(%Krum_Tremulant).SliderNumbers(0) oldval = %False Krum.ctrl(10) = 16 Controller Krum.channel, 10, Krum.ctrl(10) ' enable tremulant END IF IF oldval <> Slider(slnr).value THEN Krum.ctrl(11) = Slider(slnr).value Controller Krum.channel, 11, Krum.ctrl(11) oldval = Slider(slnr).value END IF Task(%Krum_Tremulant).freq = 10 END SUB SUB Krum_Tremulant_Stop () ' disable sforzando Krum.ctrl(10) = %False Controller Krum.channel, 10, Krum.ctrl(10) ' reset vibrato speed to zero Krum.ctrl(11) = %False Controller Krum.channel, 11, Krum.ctrl(11) END SUB SUB Krum_Wind () STATIC slnr AS LONG STATIC udnr AS LONG IF ISFALSE Task(%Test_Krum_Wind).tog THEN Task(%Test_Krum_Wind).tog = %True DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Wind" Taskparamlabels(1) = "0/1" IF ISFALSE Task(%Test_Krum_Wind).hParam THEN MakeTaskParameterDialog %Test_Krum_Wind,1,Slider(),1,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Test_Krum_Wind).SliderNumbers(0) Slider(slnr).Cptr = CODEPTR(Krum_Wind_CB) Krum.ctrl(7) = %MM_Krum_Motor Controller Krum.channel, 7, %MM_Krum_Motor ' we still have to send a msg to the slider to set it to the corresponding value : Slider(slnr).value = %MM_Krum_Motor SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF IF udnr = %False THEN udnr = TaskEX(%Test_Krum_Wind).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Krum_MotorSwitch_UD) UDctrl(udnr).value = %False Controller Krum.channel, 66, %False Krum.ctrl(66) = %False END IF END IF stoptask %Test_Krum_Wind END SUB SUB Krum_Wind_CB () STATIC slnr AS LONG IF ISFALSE slnr THEN slnr = TaskEX(%Test_Krum_Wind).SliderNumbers(0) END IF Krum.ctrl(7) = Slider(slnr).value Controller Krum.channel, 7 ,Krum.ctrl(7) END SUB SUB Krum_MotorSwitch_UD () ' callback for motor switch LOCAL udnr AS DWORD STATIC value AS DWORD udnr = TaskEX(%Test_Krum_Wind).UpdownNumbers(0) value = UDCtrl(udnr).value IF value > %False THEN value = 1 UDctrl(udnr).value = 1 Krum.ctrl(66) = 127 SetDlgItemText Task(%Test_Krum_Wind).hparam, %GMT_TEXT0_ID + 16, "ON" & STR$(value) ELSE value = %False UDctrl(udnr).value = %False Krum.ctrl(66) = %False SetDlgItemText Task(%Test_Krum_Wind).hparam, %GMT_TEXT0_ID + 16, "Off" & STR$(value) END IF Controller Krum.channel, 66, Krum.ctrl(66) END SUB SUB Krum_Tune () ' procedure to facilitate tuning STATIC slnr AS DWORD STATIC udnr AS DWORD STATIC i AS DWORD STATIC note AS INTEGER IF ISFALSE Task(%Krum_Tune).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "tempo" ' pulse note ON/ OFF for easier tuning TaskParamLabels(1) = "Note" ' up-down IF ISFALSE Task(%Krum_Tune).hParam THEN MakeTaskParameterDialog %Krum_Tune,1,Slider(),1,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Krum_Tune).SliderNumbers(0) END IF IF udnr = %False THEN udnr = TaskEX(%Krum_Tune).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Krum_Tune_UD) UDctrl(udnr).value = Krum.Lowtes END IF Task(%Krum_Tune).tog = %True Krum.ctrl(7) = %MM_Krum_Motor Controller Krum.channel, 7, Krum.ctrl(7) Krum.ctrl(10) =0 ' no tremolo Controller Krum.channel, 10, Krum.ctrl(10) i = %False END IF IF i THEN note = Udctrl(udnr).value mPlay Krum.channel, note, 64 i = %False ELSE IF Slider(slnr).value THEN Noteoff Krum.channel, note i = %true END IF END IF Task(%Krum_Tune).freq = Slider(slnr).value / 4! IF Task(%Krum_Tune).freq = 0 THEN Task(%Krum_Tune).freq = 0.5 END SUB SUB Krum_Tune_UD () ' callback on parameter UpDowns. LOCAL note AS BYTE STATIC oldnote AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Krum_Tune).UpdownNumbers(0) note = UDCtrl(udnr).value SetDlgItemText Task(%Krum_Tune).hparam, %GMT_TEXT0_ID + 16, "N=" & STR$(note) IF (note >= Krum.Lowtes) AND (note <= Krum.Hightes) THEN IF oldnote THEN NoteOff Krum.channel, oldnote oldnote = %False END IF mPlay Krum.channel, note, 64 oldnote = note ELSE IF note < Krum.Lowtes THEN UDctrl(udnr).value = Krum.lowtes -1 END IF IF note > Krum.Hightes THEN UDctrl(udnr).value = Krum.hightes + 1 END IF END IF END SUB SUB Krum_lite1 () STATIC cnt AS LONG STATIC slnr AS LONG IF ISFALSE Task(%Krum_Lite1).tog THEN ' create a parameter window: DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Krum_Lite1).hParam THEN MakeTaskParameterDialog %Krum_lite1,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Krum_Lite1).SliderNumbers(0) Slider(slnr).value = 16 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF cnt = %False Task(%Krum_Lite1).tog = %True END IF IF ISFALSE cnt MOD 2 THEN mPlay Krum.channel , 100, 127 ELSE NoteOff Krum.channel, 100 END IF INCR cnt Task(%Krum_Lite1).freq = Slider(slnr).value IF Task(%Krum_lite1).freq < 0.5 THEN Task(%Krum_lite1).freq = 0.5 END SUB SUB Krum_lite2 () STATIC cnt AS LONG STATIC slnr AS LONG IF ISFALSE Task(%Krum_Lite2).tog THEN ' create a parameter window: DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Krum_Lite2).hParam THEN MakeTaskParameterDialog %Krum_lite2,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Krum_Lite2).SliderNumbers(0) Slider(slnr).value = 16 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF cnt = %False Task(%Krum_Lite2).tog = %True END IF IF ISFALSE cnt MOD 2 THEN mPlay Krum.channel , 101, 127 ELSE NoteOff Krum.channel, 101 END IF INCR cnt Task(%Krum_Lite2).freq = Slider(slnr).value IF Task(%Krum_lite2).freq < 0.5 THEN Task(%Krum_lite2).freq = 0.5 END SUB SUB Krum_lite3 () ' bottom light STATIC cnt AS LONG STATIC slnr AS LONG IF ISFALSE Task(%Krum_Lite3).tog THEN ' create a parameter window: DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Krum_Lite3).hParam THEN MakeTaskParameterDialog %Krum_lite3,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Krum_Lite3).SliderNumbers(0) Slider(slnr).value = 16 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF cnt = %False Task(%Krum_Lite3).tog = %True END IF IF ISFALSE cnt MOD 2 THEN mPlay Krum.channel , 102, 127 ELSE NoteOff Krum.channel, 102 END IF INCR cnt Task(%Krum_Lite3).freq = Slider(slnr).value IF Task(%Krum_lite3).freq < 0.5 THEN Task(%Krum_lite3).freq = 0.5 END SUB #IF %DEF(%Krum_Debug) SUB Krum_error () ' implemented on pic level 06.02.2006 STATIC cnt AS LONG STATIC slnr AS LONG IF ISFALSE Task(%Krum_error).tog THEN ' create a parameter window: DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Krum_error).hParam THEN MakeTaskParameterDialog %Krum_error,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Krum_error).SliderNumbers(0) Slider(slnr).value = 16 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF cnt = %False Task(%Krum_error).tog = %True END IF IF ISFALSE cnt MOD 2 THEN Controller Krum.channel , 65, 0 Krum.ctrl(65) = %False ELSE Controller Krum.channel, 65, 127 Task(%Krum_Error).freq = 10 ' pulse Krum.ctrl(65) = 127 INCR cnt EXIT SUB END IF INCR cnt Task(%Krum_Error).freq = Slider(slnr).value / 20 IF Task(%Krum_Error).freq < 0.1 THEN Task(%Krum_Error).freq = 0.1 END SUB SUB Krum_OnOff () ' only for PIC debugging. ' do not run this on the functional robot STATIC cnt AS LONG STATIC slnr AS LONG IF ISFALSE Task(%Krum_onoff).tog THEN ' create a parameter window: DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Krum_onoff).hParam THEN MakeTaskParameterDialog %Krum_onoff,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Krum_onoff).SliderNumbers(0) Slider(slnr).value = 16 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF cnt = %False Task(%Krum_onoff).tog = %True END IF IF ISFALSE cnt MOD 2 THEN Controller Krum.channel , 66, 0 Krum.ctrl(66) = %False ELSE Controller Krum.channel, 66, 127 Krum.ctrl(66) = 127 END IF INCR cnt Task(%Krum_OnOff).freq = Slider(slnr).value / 20 IF Task(%Krum_OnOff).freq < 0.1 THEN Task(%Krum_OnOff).freq = 0.1 END SUB #ENDIF SUB Krum_valve () STATIC cnt AS LONG STATIC slnr AS LONG IF ISFALSE Task(%Krum_valve).tog THEN ' create a parameter window: DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Krum_valve).hParam THEN MakeTaskParameterDialog %Krum_valve,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Krum_valve).SliderNumbers(0) Slider(slnr).value = 16 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF cnt = %False Task(%Krum_valve).tog = %True END IF IF ISFALSE cnt MOD 2 THEN Controller Krum.channel , 1, 0 Krum.ctrl(1) = %False ELSE Controller Krum.channel, 1, 127 Krum.ctrl(1) = 127 END IF INCR cnt Task(%Krum_Valve).freq = Slider(slnr).value / 20 IF Task(%Krum_Valve).freq < 0.5 THEN Task(%Krum_Valve).freq = 0.5 END SUB SUB Krum_controlroom LOCAL i AS LONG LOCAL x AS LONG IF ISFALSE hwCtrlKrum THEN DIALOG NEW 0, "Krum Control",1,81 ,675, 60, %WS_CAPTION OR %WS_POPUP OR %WS_SYSMENU TO hwCtrlKrum x = 5 FOR i = Krum.lowtes TO Krum.HighTes SELECT CASE (i MOD 12) CASE 0 CONTROL ADD CHECKBOX, hwCtrlKrum, i, "C", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 1 CONTROL ADD CHECKBOX, hwCtrlKrum, i, "C#", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 2 CONTROL ADD CHECKBOX, hwCtrlKrum, i, "D", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 3 CONTROL ADD CHECKBOX, hwCtrlKrum, i, "D#", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 4 CONTROL ADD CHECKBOX, hwCtrlKrum, i, "E", x, 24, 18, 12, %BS_PUSHLIKE x = x + 20 CASE 5 CONTROL ADD CHECKBOX, hwCtrlKrum, i, "F", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 6 CONTROL ADD CHECKBOX, hwCtrlKrum, i, "F#", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 7 CONTROL ADD CHECKBOX, hwCtrlKrum, i, "G", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 8 CONTROL ADD CHECKBOX, hwCtrlKrum, i, "G#", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 9 CONTROL ADD CHECKBOX, hwCtrlKrum, i, "A", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 10 CONTROL ADD CHECKBOX, hwCtrlKrum, i, "Bb", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 11 CONTROL ADD CHECKBOX, hwCtrlKrum, i, "B", x, 24, 18, 12, %BS_PUSHLIKE x = x + 20 END SELECT NEXT CONTROL ADD LABEL, hwCtrlKrum, 500, "Wind:", 5, 45, 30, 12 CONTROL ADD "msctls_trackbar32", hwCtrlKrum, 501, _ "Wind", 36, 45, 135, 12, %WS_CHILD OR %WS_VISIBLE OR _ %TBS_HORZ OR %TBS_BOTTOM CONTROL ADD LABEL, hwCtrlKrum, 503, "?", 174, 45, 30, 12 CONTROL ADD BUTTON, hwCtrlKrum, 600, "All Off", 206, 45, 30, 12 DIALOG SHOW MODELESS hwCtrlKrum CALL CB_Krum_Controlroom ELSE DIALOG END hwCtrlKrum hwCtrlKrum = 0 END IF END SUB CALLBACK FUNCTION CB_Krum_Controlroom LOCAL wind AS BYTE LOCAL i AS LONG LOCAL note AS BYTE SELECT CASE CBMSG CASE %WM_COMMAND SELECT CASE CBCTL CASE Krum.Lowtes TO Krum.hightes 'checkboxes CONTROL GET CHECK CBHNDL, CBCTL TO i note = CBCTL mPlay Krum.channel, note, BYVAL i CASE 600 MM_Krum_Off CONTROL HANDLE CBHNDL, 501 TO i SendMessage i, %TBM_SETPOS, %true, 0 CONTROL SET TEXT CBHNDL, 503, "0" END SELECT CASE %WM_HSCROLL, %WM_VSCROLL 'note: id doesn't correspond at all with the one given at creation IF (LOWRD(CBWPARAM) = %TB_THUMBPOSITION) OR (LOWRD(CBWPARAM) = %TB_THUMBTRACK) THEN wind = HIWRD(CBWPARAM) ELSE wind = SendMessage (CBLPARAM, %TBM_GETPOS,%Null, %Null) END IF wind = wind * 1.27 CONTROL SET TEXT CBHNDL, 503, STR$(wind) Krum.ctrl(7) = wind MM_Krum_On %MM_Motor CASE %WM_CLOSE, %WM_QUIT hwCtrlKrum = 0 MM_Krum_Off END SELECT END FUNCTION