' *************************************************************** ' * test and debug code for midi controlled robots and automats * ' * * ' *************************************************************** ' 30.05.2003: creation date of this module ' 07.01.2005: upgrade of bourdonola hardware: now we have full implementation ' of wind control, using a single PIC. ' Now lights mapped on notes 32, 33, 34, 35 ' 09.01.2005: measurements done on windcontrol. ' 13.01.2005: mapping lights finalized. ' 07.02.2005: Bourdonola PWM hardware changed. ' 17.07.2005: shares cockpit with piperola only now. DECLARE SUB Bourdonola_Test () DECLARE SUB Bourdonola_Motor_UD () DECLARE SUB Bourdonola_Tune () DECLARE SUB Bourdonola_Tune_UD () DECLARE FUNCTION Init_Bourdonola () AS LONG DECLARE SUB bourd_controlroom () DECLARE CALLBACK FUNCTION CB_bourd_Controlroom () DECLARE SUB bourdonola_lite1 () DECLARE SUB bourdonola_lite2 () DECLARE SUB bourdonola_lite3 () DECLARE SUB bourdonola_lite4 () FUNCTION Init_Bourdonola () AS LONG LOCAL retval AS LONG GetInstrumentParams Bourdonola, %IDM_BOURDONOLA retval = SetRobotPort (Bourdonola, IniFilename, hMidiO()) Task(%Test_Bourdonola).naam = "Bourdonola" Task(%Test_Bourdonola).cptr = CODEPTR(Bourdonola_Test) Task(%Test_Bourdonola).freq = 20 Task(%Test_Bourdonola).level = 127 Task(%Test_Bourdonola).channel = Bourdonola.Channel Task(%Bourdonola_Tune).naam = "Tune" Task(%Bourdonola_Tune).cptr = CODEPTR(Bourdonola_Tune) Task(%Bourdonola_Tune).freq = 10 Task(%Bourdonola_Tune).channel = Bourdonola.channel Task(%Bourdonola_Lite1).naam = "Li-ORA" Task(%Bourdonola_Lite1).cptr = CODEPTR(Bourdonola_Lite1) Task(%Bourdonola_Lite1).freq = 2 Task(%Bourdonola_Lite1).channel = Bourdonola.channel Task(%Bourdonola_Lite2).naam = "Lite2" Task(%Bourdonola_Lite2).cptr = CODEPTR(Bourdonola_Lite2) Task(%Bourdonola_Lite2).freq = 2.2 Task(%Bourdonola_Lite2).channel = Bourdonola.channel Task(%Bourdonola_Lite3).naam = "Li-WIT" Task(%Bourdonola_Lite3).cptr = CODEPTR(Bourdonola_Lite3) Task(%Bourdonola_Lite3).freq = 2.7 Task(%Bourdonola_Lite3).channel = Bourdonola.channel Task(%Bourdonola_Lite4).naam = "Li-RED" Task(%Bourdonola_Lite4).cptr = CODEPTR(Bourdonola_Lite4) Task(%Bourdonola_Lite4).freq = 3.3 Task(%Bourdonola_Lite4).channel = Bourdonola.channel ButnSW(9).tag0 = "BourdCtrl tog" ButnSW(9).tag1 = "BourdCtrl tog" ButnSW(9).cptr = CODEPTR(Bourd_Controlroom) FUNCTION = %True END FUNCTION SUB Bourdonola_Test() ' test for Bourdonola PWM motor controll STATIC i% STATIC toets% STATIC slnr AS BYTE STATIC wind AS BYTE STATIC sfz AS LONG LOCAL value AS LONG IF ISFALSE Task(%Test_Bourdonola).tog THEN LOCAL testid%, testhandle AS LONG Task(%Test_Bourdonola).tog = %True toets% = %True sfz = %False i% = Bourdonola.Lowtes DIM TaskParamLabels(0 TO 2) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Wind" TaskParamLabels(2) = "On/Off" IF ISFALSE Task(%Test_Bourdonola).hParam THEN MakeTaskParameterDialog %Test_Bourdonola,2,Slider(),1,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Test_Bourdonola).SliderNumbers(1) ' send default startup value: %MM_Bourdonola_Motor Slider(slnr).value = %MM_Bourdonola_Motor SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value UDctrl(TaskEX(%Test_Bourdonola).UpdownNumbers(0)).cptr = CODEPTR(Bourdonola_Motor_UD) UDctrl(TaskEX(%Test_Bourdonola).UpDownNumbers(0)).value = %True END IF END IF IF Slider(slnr).value <> wind THEN wind = Slider(slnr).value ' 0-127 Controller Bourdonola.channel, 1, wind Bourdonola.ctrl(1) = wind END IF IF toets% THEN Task(%Test_Bourdonola).freq = 32! * (Slider(slnr-1).value) / 128! mPlay Bourdonola.channel, i%, 64 toets% = %False ELSE NoteOff Bourdonola.channel, i% toets% = %True INCR i% IF i% > Bourdonola.Hightes THEN i% = Bourdonola.Lowtes Task(%Test_Bourdonola).freq = 32! * (Slider(slnr-1).value) / 128! END IF IF Task(%Test_Bourdonola).freq < 0.5 THEN Task(%Test_Bourdonola).freq = 0.5 END SUB SUB Bourdonola_Motor_UD () ' controls motor on off switch LOCAL n AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Test_Bourdonola).UpDownNumbers(0) n = UDCtrl(udnr).value IF n < 1 THEN UDctrl(udnr).value = 0 : n = 0 IF n > 1 THEN UDctrl(udnr).value = 1 : n = 1 IF ISFALSE n THEN Controller Bourdonola.channel, 66, %False Bourdonola.ctrl(66) = %False SetDlgItemText Task(%Test_Bourdonola).hparam, %GMT_TEXT0_ID + 16, "Off" ELSE Controller Bourdonola.channel, 66, 127 Bourdonola.ctrl(66) = %True SetDlgItemText Task(%Test_Bourdonola).hparam, %GMT_TEXT0_ID + 16, "On" END IF END SUB SUB Bourdonola_Tune () ' procedure to facilitate tuning ' initialize motor speed to 50Hz. STATIC slnr AS DWORD STATIC udnr AS DWORD STATIC wind AS DWORD STATIC value AS DWORD STATIC motor AS DWORD IF ISFALSE Task(%Bourdonola_Tune).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Wind" TaskParamLabels(1) = "Note" ' up-down IF ISFALSE Task(%Bourdonola_Tune).hParam THEN MakeTaskParameterDialog %Bourdonola_Tune,1,Slider(),1,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Bourdonola_Tune).SliderNumbers(0) END IF Slider(slnr).value = %MM_Bourdonola_Motor SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value IF udnr = %False THEN udnr = TaskEX(%Bourdonola_Tune).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Bourdonola_Tune_UD) UDctrl(udnr).value = Bourdonola.Lowtes END IF Task(%Bourdonola_Tune).tog = %True END IF IF Slider(slnr).value <> wind THEN wind = Slider(slnr).value ' 0-127 IF ISFALSE wind THEN controller bourdonola.channel, 66, 0 bourdonola.ctrl(66) = 0 ELSE IF bourdonola.ctrl(66) = %False THEN controller bourdonola.channel, 66, 127 bourdonola.ctrl(66) = %True END IF controller bourdonola.channel, 1, wind END IF END IF END SUB SUB Bourdonola_Tune_UD () ' callback on parameter UpDowns. LOCAL note AS BYTE STATIC oldnote AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Bourdonola_Tune).UpdownNumbers(0) note = UDCtrl(udnr).value SetDlgItemText Task(%Bourdonola_Tune).hparam, %GMT_TEXT0_ID + 16, "N=" & STR$(note) IF (note >= Bourdonola.Lowtes) AND (note <= Bourdonola.Hightes) THEN IF oldnote THEN NoteOff Bourdonola.channel, oldnote oldnote = %False END IF mPlay Bourdonola.channel, note, 64 oldnote = note ELSE IF note < Bourdonola.Lowtes THEN UDctrl(udnr).value = Bourdonola.lowtes -1 END IF IF note > Bourdonola.Hightes THEN UDctrl(udnr).value = Bourdonola.hightes + 1 END IF END IF END SUB SUB bourd_controlroom () LOCAL i AS LONG LOCAL x AS LONG IF ISFALSE hwCtrlbourd THEN DIALOG NEW 0, "bourdon Control",1 , 160,340, 60, %WS_CAPTION OR %WS_POPUP OR %WS_SYSMENU TO hwCtrlbourd x = 5 FOR i = bourdonola.lowtes TO bourdonola.HighTes SELECT CASE (i MOD 12) CASE 0 CONTROL ADD CHECKBOX, hwCtrlbourd, i, "C", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 1 CONTROL ADD CHECKBOX, hwCtrlbourd, i, "C#", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 2 CONTROL ADD CHECKBOX, hwCtrlbourd, i, "D", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 3 CONTROL ADD CHECKBOX, hwCtrlbourd, i, "D#", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 4 CONTROL ADD CHECKBOX, hwCtrlbourd, i, "E", x, 24, 18, 12, %BS_PUSHLIKE x = x + 20 CASE 5 CONTROL ADD CHECKBOX, hwCtrlbourd, i, "F", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 6 CONTROL ADD CHECKBOX, hwCtrlbourd, i, "F#", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 7 CONTROL ADD CHECKBOX, hwCtrlbourd, i, "G", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 8 CONTROL ADD CHECKBOX, hwCtrlbourd, i, "G#", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 9 CONTROL ADD CHECKBOX, hwCtrlbourd, i, "A", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 10 CONTROL ADD CHECKBOX, hwCtrlbourd, i, "Bb", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 11 CONTROL ADD CHECKBOX, hwCtrlbourd, i, "B", x, 24, 18, 12, %BS_PUSHLIKE x = x + 20 END SELECT NEXT CONTROL ADD LABEL, hwCtrlbourd, 500, "Wind:", 5, 45, 30, 12 CONTROL ADD "msctls_trackbar32", hwCtrlbourd, 501, _ "Wind", 36, 45, 135, 12, %WS_CHILD OR %WS_VISIBLE OR _ %TBS_HORZ OR %TBS_BOTTOM CONTROL ADD LABEL, hwCtrlbourd, 503, "?", 174, 45, 30, 12 CONTROL ADD BUTTON, hwCtrlbourd, 600, "All Off", 206, 45, 30, 12 DIALOG SHOW MODELESS hwCtrlbourd CALL CB_bourd_Controlroom ' CONTROL DISABLE hwCtrlBourd, 501 ELSE DIALOG END hwCtrlbourd hwCtrlbourd = 0 END IF END SUB CALLBACK FUNCTION CB_bourd_Controlroom ' to be checked again Kristof! 07.01.2005 gwr LOCAL wind AS BYTE LOCAL i AS LONG LOCAL note AS BYTE SELECT CASE CBMSG CASE %WM_COMMAND SELECT CASE CBCTL CASE bourdonola.Lowtes TO bourdonola.hightes 'checkboxes CONTROL GET CHECK CBHNDL, CBCTL TO i note = CBCTL mPlay bourdonola.channel, note, BYVAL i CASE 600 Controller Bourdonola.channel, 123, %False ' modified by gwr. FOR i = bourdonola.lowtes TO bourdonola.hightes ' mPlay bourdonola.channel, i, 0 CONTROL SET CHECK CBHNDL, i, 0 ' SLEEP 10 DIALOG DOEVENTS NEXT ' CONTROL HANDLE CBHNDL, 501 TO i ' SendMessage i, %TBM_SETPOS, %true, 0 ' bourdonWind bourdonola, 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) Bourdonola.ctrl(1) = wind Controller Bourdonola.channel, 1, wind CASE %WM_CLOSE, %WM_QUIT hwCtrlbourd = 0 MM_Bourdonola_Off END SELECT END FUNCTION SUB Bourdonola_Lite1 () ' test for Bourdonola light 1 - oranje licht links tussen de pijpen (Harley Davidson) STATIC i% STATIC toets% STATIC slnr AS BYTE IF ISFALSE Task(%Bourdonola_Lite1).tog THEN Task(%Bourdonola_Lite1).tog = %True toets% = %True i% = 32 DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Bourdonola_Lite1).hParam THEN MakeTaskParameterDialog %Bourdonola_Lite1,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Bourdonola_Lite1).SliderNumbers(0) END IF END IF Task(%Bourdonola_Lite1).freq = 32! * (Slider(slnr).value) / 128! IF toets% THEN mPlay Bourdonola.channel, i%, 64 Bourdonola.ctrl(i%) = 127 toets% = %False ELSE NoteOff Bourdonola.channel, i% Bourdonola.ctrl(i%) = %False toets% = %True END IF IF Task(%Bourdonola_Lite1).freq < 0.5 THEN Task(%Bourdonola_Lite1).freq = 0.5 END SUB SUB Bourdonola_Lite2 () ' test for Bourdonola light 2 - licht rechts tussen de pijpen STATIC i% STATIC toets% STATIC slnr AS BYTE IF ISFALSE Task(%Bourdonola_Lite2).tog THEN Task(%Bourdonola_Lite2).tog = %True toets% = %True i% = 33 DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Bourdonola_Lite2).hParam THEN MakeTaskParameterDialog %Bourdonola_Lite2,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Bourdonola_Lite2).SliderNumbers(0) END IF END IF Task(%Bourdonola_Lite2).freq = 32! * (Slider(slnr).value) / 128! IF toets% THEN mPlay Bourdonola.channel, i%, 64 Bourdonola.ctrl(i%) = 127 toets% = %False ELSE NoteOff Bourdonola.channel, i% Bourdonola.ctrl(i%) = %False toets% = %True END IF IF Task(%Bourdonola_Lite2).freq < 0.5 THEN Task(%Bourdonola_Lite2).freq = 0.5 END SUB SUB Bourdonola_Lite3 () ' test for Bourdonola light 3 - wit 12V/5W halogeen spotje frontaal. STATIC i% STATIC toets% STATIC slnr AS BYTE IF ISFALSE Task(%Bourdonola_Lite3).tog THEN Task(%Bourdonola_Lite3).tog = %True toets% = %True i% = 34 DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Bourdonola_Lite3).hParam THEN MakeTaskParameterDialog %Bourdonola_Lite3,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Bourdonola_Lite3).SliderNumbers(0) END IF END IF Task(%Bourdonola_Lite3).freq = 32! * (Slider(slnr).value) / 128! IF toets% THEN mPlay Bourdonola.channel, i%, 64 Bourdonola.ctrl(i%) = 127 toets% = %False ELSE NoteOff Bourdonola.channel, i% Bourdonola.ctrl(i%) = %False toets% = %True END IF IF Task(%Bourdonola_Lite3).freq < 0.5 THEN Task(%Bourdonola_Lite3).freq = 0.5 END SUB SUB Bourdonola_Lite4 () ' test for Bourdonola light 4 : Rode LED-reeks op schakelingenbakje STATIC i% STATIC toets% STATIC slnr AS BYTE IF ISFALSE Task(%Bourdonola_Lite4).tog THEN Task(%Bourdonola_Lite4).tog = %True toets% = %True i% = 35 DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Bourdonola_Lite4).hParam THEN MakeTaskParameterDialog %Bourdonola_Lite4,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Bourdonola_Lite4).SliderNumbers(0) END IF END IF Task(%Bourdonola_Lite4).freq = 32! * (Slider(slnr).value) / 128! IF toets% THEN mPlay Bourdonola.channel, i%, 64 Bourdonola.ctrl(i%) = 127 toets% = %False ELSE NoteOff Bourdonola.channel, i% Bourdonola.ctrl(i%) = %False toets% = %True END IF IF Task(%Bourdonola_Lite4).freq < 0.5 THEN Task(%Bourdonola_Lite4).freq = 0.5 END SUB '[EOF]