' ****************************************** ' * * ' * test and evaluation code * ' ****************************************** ' 15.11.2003: module added to GMT ' 06.12.2003: further coding ' 10.12.2003: Lights test code added ' 13.12.2003: First test on Puff. It works! ' 15.12.2003: Pin4 PIC 18F252 problem in microcode... ' 16.12.2003: first try out M&M concert 16.12.2003 ' 17.12.2003: debug session in Puff PIC's ' 09.03.2004: lights added (orange) ' 30.03.2004: tuning session ' 21.04.2007: Puff power supply revision. Rotating lite added. ' 05.10.2010: Motor ctrl board and eyes changed. Sensors added. ' 06.10.2010: CC91, motor speed implemented. Calibration procedure added. %Puff_Test = 48 ' scale - quartertone scale %Puff_Tuner = 49 ' note by note test %Puff_Lights = 50 ' front light with stepping motor ('eyes') '%Puff_B4 = 51 ' 4 extra bits on board 4 %Puff_Orange = 52 ' lights %Puff_Scale = 53 ' chromatic scales %Puff_rotlite = 54 ' rotating flashlite %Puff_Red = 55 'light 120 %Puff_Eyes = 56 'eye lights 2010 %Puff_Left_Eye = 57 %Puff_Right_Eye = 58 %Puff_Motor = 59 %Puff_Calibrate = 60 DECLARE SUB Puff_Test () DECLARE SUB Puff_LoLim_UD1 () DECLARE SUB Puff_HiLim_UD2 () DECLARE SUB Puff_Lights () ' eyes DECLARE SUB Puff_Lights_Stop () DECLARE SUB Puff_Tuner () DECLARE SUB Puff_Tuner_UD1 () 'DECLARE SUB Puff_B4 () ' obsolete now 'DECLARE SUB Puff_B4_Stop () DECLARE SUB Puff_Orange () DECLARE SUB Puff_Orange_Stop () DECLARE SUB Puff_Rotlite () DECLARE SUB Puff_Rotlite_Stop () DECLARE SUB Puff_Scales () DECLARE SUB Puff_LoLim_UD3 () DECLARE SUB Puff_HiLim_UD4 () DECLARE SUB Puff_Krom_Quar () DECLARE FUNCTION Init_Puff () AS LONG DECLARE SUB Puff_Red () DECLARE SUB Puff_Red_Stop () DECLARE SUB Puff_Eyes () DECLARE SUB Puff_Eyes_Stop () DECLARE SUB Puff_Motor () DECLARE SUB Puff_Calibrate () 'CC67 FUNCTION Init_Puff () AS LONG LOCAL retval AS LONG 'GetInstrumentParams Puff, %IDM_PUFF 'retval = SetRobotport (Puff, Inifilename, hMidiO()) Task(%Puff_Test).naam = "" Task(%Puff_Test).cptr = CODEPTR(Puff_Test) Task(%Puff_Test).freq = 4 Task(%Puff_Test).flags = %False Task(%Puff_Tuner).naam = "PuffTune" Task(%Puff_Tuner).cptr = CODEPTR(Puff_Tuner) Task(%Puff_Tuner).freq = 4 Task(%Puff_Tuner).flags = %False Task(%Puff_Lights).naam = "Puflites" Task(%Puff_Lights).cptr = CODEPTR(Puff_LIghts) Task(%Puff_Lights).freq = 6 Task(%Puff_Lights).flags = %False TaskEX(%Puff_Lights).StopCptr = CODEPTR(Puff_Lights_Stop) ' Task(%Puff_B4).naam = "Puff-b4" ' Task(%Puff_B4).cptr = CODEPTR(Puff_B4) ' Task(%Puff_B4).freq = 10 ' Task(%Puff_B4).flags = %False ' TaskEX(%Puff_B4).StopCptr = CODEPTR(Puff_B4_Stop) ' Task(%Puff_Orange).naam = "Puff-Ora" Task(%Puff_Orange).cptr = CODEPTR(Puff_Orange) Task(%Puff_Orange).freq = 1 Task(%Puff_Orange).flags = %False TaskEX(%Puff_Orange).StopCptr = CODEPTR(Puff_Orange_Stop) Task(%Puff_rotlite).naam = "Puff-rot" Task(%Puff_rotlite).cptr = CODEPTR(Puff_rotlite) Task(%Puff_rotlite).freq = 1 Task(%Puff_rotlite).flags = %False TaskEX(%Puff_rotlite).StopCptr = CODEPTR(Puff_rotlite_Stop) Task(%Puff_Scale).naam = "" Task(%Puff_Scale).cptr = CODEPTR(Puff_Scales) Task(%Puff_Scale).freq = 4 Task(%Puff_Scale).flags = %False Task(%Puff_Red).naam = "Puff-Red" Task(%Puff_Red).cptr = CODEPTR(Puff_Red) Task(%Puff_Red).freq = 1 Task(%Puff_Red).flags = %False TaskEX(%Puff_Red).StopCptr = CODEPTR(Puff_Red_Stop) Task(%Puff_Eyes).naam = "Eyes" Task(%Puff_Eyes).cptr = CODEPTR(Puff_Eyes) Task(%Puff_Eyes).freq = 1 Task(%Puff_Eyes).flags = %False TaskEX(%Puff_Eyes).StopCptr = CODEPTR(Puff_Eyes_Stop) Task(%Puff_Left_Eye).naam = "L-Eye" Task(%Puff_Left_Eye).cptr = CODEPTR(Puff_Left_Eye) Task(%Puff_Left_Eye).freq = 3 Task(%Puff_Left_Eye).flags = %False TaskEX(%Puff_Left_Eye).StopCptr = CODEPTR(Puff_Eyes_Stop) Task(%Puff_Right_Eye).naam = "L-Eye" Task(%Puff_Right_Eye).cptr = CODEPTR(Puff_Right_Eye) Task(%Puff_Right_Eye).freq = 3 Task(%Puff_Right_Eye).flags = %False TaskEX(%Puff_Right_Eye).StopCptr = CODEPTR(Puff_Eyes_Stop) Task(%Puff_Motor).naam = "Motor" Task(%Puff_Motor).cptr = CODEPTR(Puff_Motor) Task(%Puff_Motor).freq = 1 Task(%Puff_Motor).flags = %False 'TaskEX(%Puff_Motor).StopCptr = CODEPTR(Puff_Eyes_Stop) Task(%Puff_Calibrate).naam = "Calib" Task(%Puff_Calibrate).cptr = CODEPTR(Puff_Calibrate) Task(%Puff_Calibrate).freq = 5 Task(%Puff_Calibrate).flags = %False FUNCTION = %TRue END FUNCTION SUB Puff_Test () STATIC j AS DWORD STATIC i AS DWORD STATIC slnr AS DWORD ' notes 55-96: normal notes ' 55,56,57,58,59,60,61,62: board 1 ' 63,64,65,66,67,68,69,70: board 2 ' 71,72,73,74,75, : board 3 ' 76,77,78,79,80, : board 4 ' 81,82,83,84,85,86,87,88: board 5 ' 98.90.91,92,93,94,95,96: board 6 ' notes 7-48 : quartertones ' 7,8,9,10,11,12,13,14 : board 1 ' 15,16,17,18,19,20,21,22: board 2 ' 23,24,25,26,27, : board 3 ' 28,29,30,31,32, : board 4 ' 33,34,35,36,37,38,39,40: board 5 ' 41,42,43,44,45.46,47,48: board 6 ' ' modified 10.12.2003: 49,50,51,52 = stepping motor 53,54 =lights ' modified: board 4, 100,101,102,103: implemented 04.2007 ' modified: board 4, notes 104 and 105: orange front and back lights IF ISFALSE Task(%Puff_Test).tog THEN DIM TaskParamLabels(0 TO 3) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Level" TaskParamLabels(2) = "LowLim" TaskParamLabels(3) = "HiLim" IF ISFALSE Task(%Puff_Test).hParam THEN slnr = %False MakeTaskParameterDialog %Puff_Test,2,Slider(),2,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Puff_Test).SliderNumbers(0) UDctrl(TaskEX(%Puff_Test).UpdownNumbers(0)).cptr = CODEPTR(Puff_LoLim_UD1) ' lowest note UDctrl(TaskEX(%Puff_Test).UpdownNumbers(1)).cptr = CODEPTR(Puff_HiLim_UD2) ' highest note UDctrl(TaskEX(%Puff_Test).UpDownNumbers(0)).value = 55 UDctrl(TaskEX(%Puff_Test).UpDownNumbers(1)).value = 96 j = 0 i = UDctrl(TaskEX(%Puff_Test).UpDownNumbers(0)).value '55 Task(%Puff_Test).freq = 2 Slider(slnr).value = Task(%Puff_Test).freq 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 j = %False Task(%Puff_Test).tog = %True END IF IF ISFALSE j THEN mPlay Puff.channel, i, Slider(slnr+1).value ' normal notes ELSE mPlay Puff.channel, i - 48 , Slider(slnr+1).value ' quartertones INCR i END IF INCR j j = j MOD 2 IF i > UDctrl(TaskEX(%Puff_Test).UpDownNumbers(1)).value THEN i = UDctrl(TaskEX(%Puff_Test).UpDownNumbers(0)).value Task(%Puff_Test).freq = 32! * (Slider(slnr).value) / 128! END SUB SUB Puff_LoLim_UD1 () ' controls the low limit of the note scale to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Puff_Test).UpDownNumbers(0) noot = UDCtrl(udnr).value IF noot < 55 THEN UDctrl(udnr).value = 55 : noot = 55 IF noot > UDctrl(udnr+1).value THEN UDctrl(udnr).value = UDctrl(udnr+1).value : noot = UDctrl(udnr).value SetDlgItemText Task(%Puff_Test).hparam, %GMT_TEXT0_ID + 16, "Lo=" & STR$(noot) END SUB SUB Puff_HiLim_UD2 () ' controls the high limit of the note scale to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Puff_Test).UpDownNumbers(1) noot = UDCtrl(udnr).value IF noot < UDctrl(udnr-1).value THEN UDctrl(udnr).value = UDctrl(udnr-1).value : noot = UDctrl(udnr).value IF noot > 96 THEN UDctrl(udnr).value = 96 : noot = 96 SetDlgItemText Task(%Puff_Test).hparam, %GMT_TEXT0_ID + 17, "Hi=" & STR$(noot) END SUB SUB Puff_Lights () 'old code,no longer functional STATIC j AS DWORD STATIC i AS DWORD STATIC cnt AS DWORD ' 200 steps is 360 degrees, but we use only 300 degrees, so 166 steps STATIC slnr AS DWORD IF ISFALSE Task(%Puff_Lights).tog THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Level" IF ISFALSE Task(%Puff_Lights).hParam THEN slnr = %False MakeTaskParameterDialog %Puff_Lights,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Puff_Lights).SliderNumbers(0) j = 0 ' used for rotation direction here i = 49 ' phases mapped on notes 49,50,51,52 cnt = 0 Task(%Puff_Lights).freq = 6 Slider(slnr).value = 6 Task(%Puff_Lights).tog = %True SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 12 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF mPlay Puff.Channel, 53, 127 ' lights on mPlay Puff.Channel, 54, 127 ' lights on END IF mPlay Puff.Channel, i, Slider(slnr+1).value SELECT CASE i CASE 52 mPlay Puff.Channel, 49, Slider(slnr+1).value CASE ELSE mPlay Puff.Channel, i+1, Slider(slnr+1).value END SELECT IF ISFALSE j THEN INCR i IF i > 52 THEN i = 49 ELSE DECR i IF i < 49 THEN i = 52 END IF INCR cnt IF cnt > 164 THEN cnt = %False : BIT TOGGLE j,0 ' keer draairichting om Task(%Puff_Lights).freq = 50! * (Slider(slnr).value) / 128! ' voor maximum koppel moet bij velo = 127 (=>80ms), tempo = 12.5 Hz (slider = 32) ' bij velo = 64 (=>40ms), tempo = 25 Hz ( slider = 64) ' bij velo = 32 (=>20ms), tempo = 50 Hz (slider = 127) END SUB SUB Puff_Lights_Stop () MM_Puff_Off %MM_White END SUB SUB Puff_Tuner () STATIC j AS DWORD STATIC i AS DWORD STATIC n AS SINGLE STATIC slnr AS DWORD LOCAL TXT AS ASCIIZ * 20 ' notes 55-96: normal notes ' 55,56,57,58,59,60,61,62: board 1 ' 63,64,65,66,67,68,69,70: board 2 ' 71,72,73,74,75, : board 3 ' 76,77,78,79,80, : board 4 ' 81,82,83,84,85,86,87,88: board 5 ' 98,90,91,92,93,94,95,96: board 6 ' notes 7-48 : quartertones ' 7,8,9,10,11,12,13,14 : board 1 ' 15,16,17,18,19,20,21,22: board 2 ' 23,24,25,26,27, : board 3 ' 28,29,30,31,32, : board 4 ' 33,34,35,36,37,38,39,40: board 5 ' 41,42,43,44,45.46,47,48: board 6 IF ISFALSE Task(%Puff_Tuner).tog THEN DIM TaskParamLabels(0 TO 2) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Level" TaskParamLabels(2) = "Note" IF ISFALSE Task(%Puff_Tuner).hParam THEN slnr = %False MakeTaskParameterDialog %Puff_Tuner,2,Slider(),1,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Puff_Tuner).SliderNumbers(0) UDctrl(TaskEX(%Puff_Tuner).UpdownNumbers(0)).cptr = CODEPTR(Puff_Tuner_UD1) UDctrl(TaskEX(%Puff_Tuner).UpDownNumbers(0)).value = 0 Task(%Puff_Tuner).freq = 2 Slider(slnr).value = 2 Slider(slnr+1).value = 4 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF Task(%Puff_Tuner).tog = %True END IF n = UDctrl(TaskEX(%Puff_Tuner).UpDownNumbers(0)).value / 2 ' 0, 0.5, 1, 1.5, 2... SELECT CASE FRAC(n) CASE > 0.4 i = 7 + FIX(n) IF i > 48 THEN i = 48 IF i < 7 THEN i = 7 TXT = "n= " & STR$(i) & " m =" & STR$(i+48.5) CASE ELSE i = 55 + FIX(n) IF i > 96 THEN i = 96 IF i < 55 THEN i = 55 TXT = "n= " & STR$(i) END SELECT SetDlgItemText Task(%Puff_Tuner).hparam, %GMT_TEXT0_ID + 16, TXT mPlay Puff.channel, i, Slider(slnr+1).value Task(%Puff_Tuner).freq = 32! * (Slider(slnr).value) / 128! END SUB SUB Puff_Tuner_UD1 () ' controls the notenumber to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Puff_Tuner).UpDownNumbers(0) noot = UDCtrl(udnr).value IF noot > 83 THEN UDctrl(udnr).value = 83 : noot = 83 END SUB 'SUB Puff_B4 () ' ' old code - for pre 2007 version of puff pics... ' ' 4 extra bits on board 4, notes 100-103 ' ' 100, 101, 102, 103 = pulsed ' STATIC j AS DWORD ' STATIC i AS DWORD ' STATIC cnt AS DWORD ' STATIC slnr AS DWORD ' IF ISFALSE Task(%Puff_B4).tog THEN ' DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 ' TaskParamLabels(0) = "Tempo" ' TaskParamLabels(1) = "Level" ' IF ISFALSE Task(%Puff_B4).hParam THEN ' slnr = %False ' MakeTaskParameterDialog %Puff_B4,2,Slider(),0,UDctrl(),TaskParamLabels() ' END IF ' IF slnr = %False THEN ' slnr = TaskEX(%Puff_B4).SliderNumbers(0) ' j = 0 ' used for rotation direction here ' i = 100 ' phases mapped on notes 100,101,102,103 ' cnt = 0 ' Task(%Puff_B4).freq = 12.5 ' Slider(slnr).value = 12.5 ' Task(%Puff_B4).tog = %True ' SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value ' Slider(slnr+1).value = 32 ' SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value ' END IF ' ' END IF ' mPlay Puff.Channel, i, Slider(slnr+1).value ' ' SELECT CASE i ' ' CASE 104 ' ' mPlay Puff.Channel, 100, Slider(slnr+1).value ' ' CASE ELSE ' ' mPlay Puff.Channel, i+1, Slider(slnr+1).value ' ' END SELECT ' IF ISFALSE j THEN ' INCR i ' IF i > 103 THEN i = 100 ' ELSE ' DECR i ' IF i < 100 THEN i = 103 ' END IF ' INCR cnt ' IF cnt > 164 THEN cnt = %False : BIT TOGGLE j,0 ' keer draairichting om ' Task(%Puff_B4).freq = 50! * (Slider(slnr).value) / 128! 'END SUB 'SUB Puff_B4_Stop () 'mPlay Puff.channel, 104, %False 'mPlay Puff.channel, 105, %False 'END SUB SUB Puff_Orange () ' 104, 105 = ON/OFF = used for orange lights STATIC i AS DWORD IF ISFALSE Task(%Puff_Orange).tog THEN i = %False Task(%Puff_Orange).tog = %True Task(%Puff_Orange).freq = 1 END IF SELECT CASE i MOD 3 CASE 0 mPlay Puff.Channel, 104, 127 ' on mPlay Puff.Channel, 105, 127 ' on CASE 1 mPlay Puff.Channel, 104, 0 ' off mPlay Puff.Channel, 105, 127 ' on CASE 2 mPlay Puff.Channel, 104, 127 ' on mPlay Puff.Channel, 105, 0 ' off END SELECT INCR i END SUB SUB Puff_Orange_Stop () MM_Puff_Off %MM_Yellow 'mPlay Puff.channel, 104, %False 'mPlay Puff.channel, 105, %False END SUB SUB Puff_rotlite () ' 100, 101, 102 = ON/OFF = used for rotating lite STATIC i AS DWORD IF ISFALSE Task(%Puff_rotlite).tog THEN i = %False Task(%Puff_rotlite).tog = %True Task(%Puff_rotlite).freq = 1 END IF IF BIT(i,0) THEN mPlay Puff.channel, 102, 127 ELSE NoteOff Puff.channel, 102 IF BIT(i,1) THEN mPlay Puff.channel, 101, 127 ELSE Noteoff Puff.channel, 101 IF BIT(i,2) THEN mPlay Puff.channel, 100, 127 ELSE Noteoff Puff.channel, 100 INCR i END SUB SUB Puff_rotlite_Stop () mPlay Puff.channel, 100, %False mPlay Puff.channel, 101, %False mPlay Puff.channel, 102, %False END SUB SUB Puff_Scales () ' added 30.03.2004 STATIC i AS DWORD STATIC slnr AS DWORD IF ISFALSE Task(%Puff_Scale).tog THEN DIM TaskParamLabels(0 TO 5) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Level" TaskParamlabels(2) = "---" TaskParamLabels(3) = "LowLim" TaskParamLabels(4) = "HiLim" TaskParamLabels(5) = "Kr-Qu" IF ISFALSE Task(%Puff_Scale).hParam THEN slnr = %False MakeTaskParameterDialog %Puff_Scale,3,Slider(),3,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Puff_scale).SliderNumbers(0) UDctrl(TaskEX(%Puff_scale).UpdownNumbers(0)).cptr = CODEPTR(Puff_LoLim_UD3) ' lowest note UDctrl(TaskEX(%Puff_scale).UpdownNumbers(1)).cptr = CODEPTR(Puff_HiLim_UD4) ' highest note UDctrl(TaskEX(%Puff_scale).UpDownNumbers(2)).cptr = CODEPTR(Puff_Krom_Quar) UDctrl(TaskEX(%Puff_scale).UpDownNumbers(0)).value = 55 UDctrl(TaskEX(%Puff_scale).UpDownNumbers(1)).value = 96 UDctrl(TaskEX(%Puff_scale).UpdownNumbers(2)).value = 0 i = UDctrl(TaskEX(%Puff_scale).UpDownNumbers(0)).value '55 Task(%Puff_scale).freq = 4 Slider(slnr).value = Task(%Puff_scale).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr).value = 6 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 6 ' low level on init. END IF Task(%Puff_Scale).tog = %True END IF ' notes 55-96: normal notes ' notes 7-48 : quartertones IF ISFALSE UDctrl(TaskEX(%Puff_scale).UpdownNumbers(2)).value THEN mPlay Puff.channel, i, Slider(slnr+1).value ' normal notes ELSE mPlay Puff.channel, i - 48 , Slider(slnr+1).value ' quartertones END IF INCR i IF i > UDctrl(TaskEX(%Puff_scale).UpDownNumbers(1)).value THEN i = UDctrl(TaskEX(%Puff_scale).UpDownNumbers(0)).value Task(%Puff_scale).freq = 32! * (Slider(slnr).value) / 128! END SUB SUB Puff_LoLim_UD3 () ' controls the low limit of the note scale to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Puff_scale).UpDownNumbers(0) noot = UDCtrl(udnr).value IF noot < 55 THEN UDctrl(udnr).value = 55 : noot = 55 IF noot > UDctrl(udnr+1).value THEN UDctrl(udnr).value = UDctrl(udnr+1).value : noot = UDctrl(udnr).value SetDlgItemText Task(%Puff_Scale).hparam, %GMT_TEXT0_ID + 16, "Lo=" & STR$(noot) END SUB SUB Puff_HiLim_UD4 () ' controls the high limit of the note scale to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Puff_Scale).UpDownNumbers(1) noot = UDCtrl(udnr).value IF noot < UDctrl(udnr-1).value THEN UDctrl(udnr).value = UDctrl(udnr-1).value : noot = UDctrl(udnr).value IF noot > 96 THEN UDctrl(udnr).value = 96 : noot = 96 SetDlgItemText Task(%Puff_Scale).hparam, %GMT_TEXT0_ID + 17, "Hi=" & STR$(noot) END SUB SUB Puff_Krom_Quar () ' controls chromatic normal scale or quartertone higher scale. LOCAL n AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Puff_Scale).UpDownNumbers(2) n = UDCtrl(udnr).value IF n < 1 THEN UDctrl(udnr).value = 0 IF n > 0 THEN UDctrl(udnr).value = 1 SetDlgItemText Task(%Puff_Scale).hparam, %GMT_TEXT0_ID + 18, "KQ=" & STR$(n) END SUB SUB Puff_Red() ' 120 = ON/OFF = used for red light STATIC i AS DWORD IF ISFALSE Task(%Puff_Red).tog THEN RESET i Task(%Puff_Red).tog = %True Task(%Puff_Red).freq = 1 END IF SELECT CASE i MOD 2 CASE 0 mPlay Puff.Channel, 120, 127 ' on CASE 1 mPlay Puff.Channel, 120, 0 ' off END SELECT INCR i END SUB SUB Puff_Red_Stop () MM_Puff_Off %MM_Red END SUB SUB Puff_Eyes() ' 121. 122 = ON/OFF = used for eye light STATIC i AS DWORD IF ISFALSE Task(%Puff_Eyes).tog THEN i = %False Task(%Puff_Eyes).tog = %True Task(%Puff_Eyes).freq = 2 END IF SELECT CASE i MOD 2 CASE 0 mPlay Puff.Channel, 121, 127 ' on mPlay Puff.Channel, 122, 0 CASE 1 mPlay Puff.Channel, 121, 0 ' off mPlay Puff.channel, 122, 127 END SELECT INCR i END SUB SUB Puff_Eyes_Stop () MM_Puff_Off %MM_White END SUB SUB Puff_Left_Eye () ' 121 = ON/OFF = used for left eye light (White 1W LED) STATIC i AS DWORD IF ISFALSE Task(%Puff_Left_Eye).tog THEN i = %False Task(%Puff_Left_Eye).tog = %True END IF SELECT CASE i MOD 2 CASE 0 mPlay Puff.Channel, 121, 127 ' on CASE 1 NoteOff Puff.Channel, 121 END SELECT INCR i END SUB SUB Puff_Right_Eye () '122 STATIC i AS DWORD IF ISFALSE Task(%Puff_Right_Eye).tog THEN i = %False Task(%Puff_Right_Eye).tog = %True END IF SELECT CASE i MOD 2 CASE 0 mPlay Puff.Channel, 122, 127 CASE 1 NoteOff Puff.Channel, 122 END SELECT INCR i END SUB SUB Puff_Motor () STATIC slnr AS LONG IF ISFALSE Task(%Puff_Motor).tog THEN DIM TaskParamLabels(0 TO 2) AS ASCIIZ * 8 TaskParamLabels(0) = "CC31" TaskParamLabels(1) = "Posit" 'cc30 TaskParamLabels(2) = "CC90" 'different interaction alogothms implemented. 'sofar 1 = integrated ' 2 = fast mapping IF ISFALSE Task(%Puff_Motor).hParam THEN slnr = %False MakeTaskParameterDialog %Puff_Motor,2,Slider(),1,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Puff_Motor).SliderNumbers(0) UDctrl(TaskEX(%Puff_Motor).UpdownNumbers(0)).cptr = CODEPTR(Puff_CC90) ' sensors UDctrl(TaskEX(%Puff_Motor).UpDownNumbers(0)).value = 0 UDctrl(TaskEX(%Puff_Motor).UpDownNumbers(0)).maxval = 12 UDctrl(TaskEX(%Puff_Motor).UpDownNumbers(0)).minval = 0 Task(%Puff_Motor).freq = 50 Slider(slnr).value = 64 'motor movement speed SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 64 ' center on init. END IF Task(%Puff_Motor).tog = %True END IF IF Puff.ctrl(30) <> slider(slnr+1).value THEN Controller Puff.channel, 30, Slider(slnr+1).value Puff.ctrl(30) = Slider(slnr+1).value END IF IF Puff.ctrl(31) <> slider(slnr).value THEN Controller Puff.Channel, 31, Slider(slnr).value Puff.ctrl(31) = Slider(slnr).value END IF END SUB SUB Puff_CC90 () ' controls the sensor PIR option. 4 algo's implemented. [06.10.2010] LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Puff_Motor).UpDownNumbers(0) Puff.ctrl(90) = UDCtrl(udnr).value Controller Puff.channel, 90, Puff.ctrl(90) SetDlgItemText Task(%Puff_Motor).hparam, %GMT_TEXT0_ID + 16, "C90=" & STR$(Puff.ctrl(90)) END SUB SUB Puff_Calibrate () 'one shot task STATIC cnt AS DWORD IF ISFALSE Task(%Puff_Calibrate).tog THEN RESET cnt Task(%Puff_Calibrate).freq = 0.2 Task(%Puff_Calibrate).tog = %True END IF SELECT CASE cnt CASE 0 Controller Puff.channel, 67, 64 'left sensor cal. CASE 1 Controller Puff.channel, 68, 64 'right sensor cal. CASE 2 Controller Puff.channel, 69, 64 'calculate center CASE 3 stoptask %Puff_Calibrate END SELECT INCR cnt END SUB