' ****************************************** ' * * ' * test and evaluation code * ' ****************************************** ' 02.03.2005: module added to GMT ' 07.03.2005: first edits. ' 18.04.2005: first coding attempts. ' 20.04.2005: test run. Inifiles updated with port settings. ' dataset analysed and transfer functions calculated. ' When finished, they should find a place in g_indep.dll ' 27.04.2005: first sketch for a sire_play function in g_midi.inc ' all 3 sire pic's programmed. ' 29.04.2005: pitch functions improved. ' 18.04.2005: "Sires Pic" code checked. (installatieversie) ' 30.09.2005: First set of 3 LED spotlights added in hardware. ' 15.11.2005: three more LED lites added. ' 10.08.2021: In what compilation do we have this robot? 'demo en test procs. %Radar_listen = 17 ' 9.45GHz system Picra - tasknr. transferred to dll (g_lib.dll - g_midi.inc) %Sire_Test = 32 %Sire_Seq = 33 %Sire_Random = 34 %Sire_Scale = 35 ' chromatic scale over the 3 modules %Sire1 = 37 %Sire2 = 38 %Sire3 = 39 %Sire1_lights = 41 ' 30.09.2005 %Sire2_lights = 42 %Sire3_Lights = 43 '%Sire_install = 47 'declared in sire_pics - leave it open here '%MM_Sire_res = 9 '10 ' internal resolution of the PIC firmware PWM ' moved to g_kons.bi %sire_tunetest = 51 GLOBAL pRadPic() AS RadarPicController PTR ' in g_lib.dll - g_midi.inc #INCLUDE "c:\b\pb\gmt\robots\sire\sire_pics.inc" 'must be preceeded by the declaration for pRadPic DECLARE FUNCTION Init_Sire () AS LONG DECLARE SUB Sire_Test () DECLARE SUB Sire_Sequence () DECLARE SUB Sire_Random () DECLARE SUB Sire_Scale () DECLARE SUB Sire1 () DECLARE SUB Sire2 () DECLARE SUB Sire3 () DECLARE SUB Sire1_Lites () DECLARE SUB Sire1_Lites_Off () DECLARE SUB Sire2_Lites () DECLARE SUB Sire2_Lites_Off () DECLARE SUB Sire3_Lites () DECLARE SUB Sire3_Lites_Off () 'DECLARE FUNCTION Velo2MidiNoot (BYVAL velo AS INTEGER) AS SINGLE moved to g_mm.inc --> g_indep.inc 'DECLARE FUNCTION MidiNoot2Velo (BYVAL noot AS SINGLE) AS WORD FUNCTION Init_Sire () AS LONG LOCAL i AS LONG LOCAL retval AS LONG LOCAL pmask AS QUAD PTR LOCAL CockpitLayo AS CockpitLabels ' msgbox funcname$ pmask = SetMidiListenChannel (15, %False) ' returns pointer FOR i = 0 TO 255: BIT RESET @pmask, i: NEXT i 'reset 4 quads!! DIM pRadPic(7) AS GLOBAL RadarPicController PTR FOR i = 0 TO 2 '(%MaxNr of devices...) pRadPic(i) = GetPicRadarPointer (i, %Radar_listen, 256 * i + i) ' dev.nr, listentasknr, port/channel word IF ISFALSE pRadPic(i) THEN IF i < 3 THEN ' FUNCTION = %False Warning "failed intialising radpics! Starting up sire controls but Picradar tasks won't work and may crash!",2000 ' EXIT FUNCTION ' here we need at least 3 devices ELSE REDIM PRESERVE pRadPic(i-1) AS GLOBAL RadarPicController PTR EXIT FOR END IF END IF NEXT i Create_PicRadar_Control (Slider(), UDctrl()) ' create user interface for the PIC listen-task ' hardware tests: Task(%Sire_Test).naam = "Sire" Task(%Sire_test).cptr = CODEPTR(Sire_Test) Task(%Sire_Test).freq = 4 Task(%Sire_Test).flags = %False TaskEX(%Sire_Test).StopCptr = CODEPTR(MM_Sire_Off) Task(%Sire_Seq).naam = "Sekwens" Task(%Sire_Seq).cptr = CODEPTR(Sire_Sequence) Task(%Sire_Seq).freq = 1 Task(%Sire_Seq).flags = %False TaskEX(%Sire_Seq).StopCptr = CODEPTR(MM_Sire_Off) Task(%Sire_Random).naam = "Random" Task(%Sire_Random).cptr = CODEPTR(Sire_Random) Task(%Sire_Random).freq = 3 Task(%Sire_Random).flags = %False TaskEX(%Sire_Random).StopCptr = CODEPTR(MM_Sire_Off) Task(%Sire_Scale).naam = "Scale" Task(%Sire_Scale).cptr = CODEPTR(Sire_Scale) Task(%Sire_Scale).freq = 0.5 Task(%Sire_Scale).flags = %False TaskEX(%Sire_Scale).StopCptr = CODEPTR(MM_Sire_Off) Task(%Sire_Install).naam = "SiresPic" Task(%Sire_install).cptr = CODEPTR(Sire_Installatie) Task(%Sire_install).freq = 32 Task(%Sire_install).flags = %False TaskEx(%Sire_install).StopCptr = CODEPTR(MM_Sire_Off) Task(%Sire1).naam = "Sire 1" Task(%Sire1).cptr = CODEPTR(Sire1) Task(%Sire1).freq = 24 Task(%Sire1).flags = %False TaskEx(%Sire1).StopCptr = CODEPTR(MM_Sire_Off) Task(%Sire2).naam = "Sire 2" Task(%Sire2).cptr = CODEPTR(Sire2) Task(%Sire2).freq = 24 Task(%Sire2).flags = %False TaskEx(%Sire2).StopCptr = CODEPTR(MM_Sire_Off) Task(%Sire3).naam = "Sire 3" Task(%Sire3).cptr = CODEPTR(Sire3) Task(%Sire3).freq = 24 Task(%Sire3).flags = %False TaskEx(%Sire3).StopCptr = CODEPTR(MM_Sire_Off) Task(%Sire1_Lights).naam = "Lites1" Task(%Sire1_Lights).cptr = CODEPTR(Sire1_Lites) Task(%Sire1_Lights).freq = 2.5 Task(%Sire1_Lights).flags = %False TaskEX(%Sire1_Lights).StopCptr = CODEPTR(Sire1_Lites_Off) Task(%Sire2_Lights).naam = "Lites2" Task(%Sire2_Lights).cptr = CODEPTR(Sire2_Lites) Task(%Sire2_Lights).freq = 2.45 Task(%Sire2_Lights).flags = %False TaskEX(%Sire2_Lights).StopCptr = CODEPTR(Sire2_Lites_Off) Task(%Sire3_Lights).naam = "Lites3" Task(%Sire3_Lights).cptr = CODEPTR(Sire3_Lites) Task(%Sire3_Lights).freq = 2.40 Task(%Sire3_Lights).flags = %False TaskEX(%Sire3_Lights).StopCptr = CODEPTR(Sire3_Lites_Off) Task(%sire_tunetest).naam = "tune_chk" Task(%sire_tunetest).cptr = CODEPTR(Sire_tunetest) Task(%sire_tunetest).freq = 8 TaskEx(%sire_tunetest).StopCptr = CODEPTR(MM_AllOff) 'also used qt for reference.. '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"),"MIDIPLAYERSTOP") FUNCTION = %True END FUNCTION SUB Sire_Test () STATIC sirencounter AS BYTE STATIC note AS BYTE STATIC slnr AS DWORD STATIC udnr AS DWORD STATIC lsb AS BYTE STATIC faktor AS WORD ' aantal bits dat we naar links moeten schuiven ' met het lsb in funktie van de PWM resolutie LOCAL fracnote AS SINGLE LOCAL wrd AS WORD IF ISFALSE Task(%Sire_Test).tog THEN DIM TaskParamLabels(0 TO 3) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Pitch" ' pitch TaskParamLabels(2) = "Siren" ' number of the siren TaskParamLabels(3) = "fine" ' pitch lsb IF ISFALSE Task(%Sire_Test).hParam THEN slnr = %False MakeTaskParameterDialog %Sire_Test,2,Slider(),2,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Sire_Test).SliderNumbers(0) udnr = TaskEX(%Sire_Test).UpdownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Sire_nr_UD1) UDctrl(udnr+1).cptr = CODEPTR(Sire_fine_UD2) ' lsb control for pitch UDctrl(udnr).value = Sire.lowtes ' siren number UDctrl(udnr+1).value = 0 Task(%Sire_Test).freq = 2 Slider(slnr).value = Task(%Sire_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 faktor = 7 - (%MM_sire_res - 7) ' bij 10 bits is dit 4 Task(%Sire_Test).tog = %True END IF IF sirencounter <> UDctrl(udnr).value + Sire.lowtes THEN sirencounter = UDctrl(udnr).value + Sire.lowtes note = Slider(slnr+1).value mPlay Sire.channel, sirencounter, note Controller Sire.channel, sirencounter, %False Sire.ctrl(sirencounter) = %False END IF IF lsb <> UDctrl(udnr+1).value THEN lsb = UDctrl(udnr+1).value Sire.ctrl(sirencounter) = lsb SHIFT LEFT Sire.ctrl(sirencounter), faktor Controller Sire.channel, sirencounter, Sire.ctrl(sirencounter) END IF IF note <> Slider(slnr+1).value THEN note = Slider(slnr+1).value mPlay Sire.channel, sirencounter, note END IF fracnote = Sire_Velo2MidiNoot(note) + (Sire.ctrl(sirencounter) / 128) SetDlgItemText gh.Cockpit, %GMT_MSG1, "Noot=" & STR$(fracnote) ' also test the inverse function: wrd = Sire_MidiNoot2Velo(fracnote) SetDlgItemText gh.Cockpit, %GMT_MSG2, "velo msb =" & STR$(HIBYT(wrd)) & " ctrl lsb=" & STR$(LOBYT(wrd)) Task(%Sire_Test).freq = MAX(1,16! * (Slider(slnr).value) / 128!) END SUB SUB Sire_nr_UD1 () ' callback on parameter UpDowns. LOCAL udnr AS DWORD udnr = TaskEX(%Sire_Test).UpdownNumbers(0) IF UDctrl(udnr).value <= %False THEN UDctrl(udnr).value = %False SetDlgItemText Task(%Sire_Test).hparam, %GMT_TEXT0_ID + 16, STR$(Udctrl(udnr).value) ELSE UDctrl(udnr).value = MIN(UDctrl(udnr).value, 23) SetDlgItemText Task(%Sire_Test).hparam, %GMT_TEXT0_ID + 16, STR$(Udctrl(udnr).value) END IF END SUB SUB Sire_Fine_UD2 () ' adapts to PWM resolution in PIC firmware. LOCAL udnr AS DWORD LOCAL RANGE AS WORD RANGE = 2^ (%MM_sire_res - 7) ' bij 10 bit is dit 3 bits lsb, of 8 udnr = TaskEX(%Sire_Test).UpdownNumbers(1) IF UDctrl(udnr).value <= %False THEN UDctrl(udnr).value = %False SetDlgItemText Task(%Sire_Test).hparam, %GMT_TEXT0_ID + 17, STR$(Udctrl(udnr).value) ELSE UDctrl(udnr).value = MIN(UDctrl(udnr).value, RANGE-1) SetDlgItemText Task(%Sire_Test).hparam, %GMT_TEXT0_ID + 17, STR$(Udctrl(udnr).value) END IF END SUB SUB Sire_Sequence () ' plays all sirens in a sequence. ' usefull for 'Le Cacquet des Femmes' STATIC i AS INTEGER STATIC slnr AS LONG IF ISFALSE Task(%Sire_Seq).tog THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Pitch" ' pitch IF ISFALSE Task(%Sire_Seq).hParam THEN slnr = %False MakeTaskParameterDialog %Sire_Seq,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Sire_Seq).SliderNumbers(0) END IF Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 48 Sendmessage Slider(Slnr+1).h, %TBM_SETPOS, %TRue, Slider(slnr+1).value i = Sire.lowtes Task(%Sire_Seq).tog = %True END IF NoteOff Sire.channel, i INCR i IF i > Sire.hightes THEN i = Sire.lowtes mPlay Sire.channel, i, Slider(slnr+1).value Task(%Sire_Seq).freq = MAX(1,16! * (Slider(slnr).value) / 128!) END SUB SUB Sire_Random () ' plays all sirens at random with control over distributions STATIC i AS INTEGER STATIC slnr AS LONG STATIC s AS DWORD LOCAL faktor AS SINGLE LOCAL nf AS SINGLE IF ISFALSE Task(%Sire_Random).tog THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "dens" IF ISFALSE Task(%Sire_Random).hParam THEN slnr = %False MakeTaskParameterDialog %Sire_Random,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Sire_Random).SliderNumbers(0) END IF i = 0 Task(%Sire_Random).tog = %True END IF faktor = 1 + (Slider(slnr+1).value / 25.5) ' 0-5.98 nf = (RND(1) ^ faktor) * 127 ' hoe groter de faktor hoe waarschijnlijker kleine waarden zijn s = RND(1) * (2^24) 'for i = 0 to 23 IF BIT (s,i) THEN mPlay Sire.channel, Sire.lowtes + i, MIN(FIX(nf),127) Controller Sire.channel, Sire.lowtes + i, INT((FRAC(nf) * 100)) ELSE NoteOff Sire.channel, Sire.lowtes + i END IF 'next i INCR i IF i > 23 THEN i = 0 Task(%Sire_Random).freq = MAX(1,RND(1) * Slider(slnr).value / 8!) END SUB SUB Sire_Scale () ' test for playing a chromatic scale LOCAL wrd AS WORD STATIC i AS INTEGER STATIC j AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Sire_Scale).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Sire_Scale).hParam THEN slnr = %False MakeTaskParameterDialog %Sire_Scale,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Sire_Scale).SliderNumbers(0) END IF i = 48 j = 0 Task(%Sire_Scale).tog = %True END IF wrd = Sire_MidiNoot2Velo(i) mPlay Sire.channel, Sire.lowtes + j, HIBYT(wrd) ' msb Controller Sire.channel, Sire.lowtes + j, LOBYT(wrd) ' lsb SetDlgItemText gh.Cockpit, %GMT_MSG1, "noot =" & STR$(i) INCR i IF i > 84 THEN NoteOff Sire.channel, Sire.lowtes+j i = 48 INCR j IF j > 23 THEN j = 0 END IF END IF SetDlgItemText gh.Cockpit, %GMT_MSG2, "velo msb =" & STR$(HIBYT(wrd)) & " ctrl lsb=" & STR$(LOBYT(wrd)) Task(%Sire_Test).freq = MAX(0.25,Slider(slnr).value / 4) END SUB SUB Sire1 () STATIC sirencounter AS BYTE STATIC note AS BYTE STATIC slnr AS DWORD STATIC udnr AS DWORD STATIC lsb AS BYTE STATIC faktor AS WORD ' aantal bits dat we naar links moeten schuiven ' met het lsb in funktie van de PWM resolutie LOCAL fracnote AS SINGLE LOCAL wrd AS WORD IF ISFALSE Task(%Sire1).tog THEN DIM TaskParamLabels(0 TO 4) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Pitch" ' pitch TaskParamLabels(2) = "ctrl20" TaskParamLabels(3) = "Siren" ' number of the siren TaskParamLabels(4) = "fine" ' pitch lsb IF ISFALSE Task(%Sire1).hParam THEN slnr = %False MakeTaskParameterDialog %Sire1,3,Slider(),2,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Sire1).SliderNumbers(0) udnr = TaskEX(%Sire1).UpdownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Sire1_nr_UD1) UDctrl(udnr+1).cptr = CODEPTR(Sire1_fine_UD2) ' lsb control for pitch UDctrl(udnr).value = Sire.lowtes ' siren number UDctrl(udnr+1).value = 0 Task(%Sire1).freq = 24 Slider(slnr).value = Task(%Sire1).freq 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 = 32 SendMessage Slider(slnr+2).h, %TBM_SETPOS, %True, 32 Sire.ctrl(20) = 32 END IF faktor = 7 - (%MM_sire_res - 7) ' bij 10 bits is dit 4 , bij 9 bits 5 Task(%Sire1).tog = %True END IF IF Slider(slnr+2).value <> Sire.ctrl(20) THEN Controller Sire.channel, 20, Slider(slnr+2).value Sire.ctrl(20) = Slider(slnr+2).value END IF IF sirencounter <> UDctrl(udnr).value THEN sirencounter = UDctrl(udnr).value note = Slider(slnr+1).value mPlay Sire.channel, sirencounter, note Controller Sire.channel, sirencounter, %False Sire.ctrl(sirencounter) = %False END IF IF lsb <> UDctrl(udnr+1).value THEN lsb = UDctrl(udnr+1).value Sire.ctrl(sirencounter) = lsb SHIFT LEFT Sire.ctrl(sirencounter), faktor Controller Sire.channel, sirencounter, Sire.ctrl(sirencounter) END IF IF note <> Slider(slnr+1).value THEN note = Slider(slnr+1).value mPlay Sire.channel, sirencounter, note END IF fracnote = Sire_Velo2MidiNoot(note) + (Sire.ctrl(sirencounter) / 128) SetDlgItemText gh.Cockpit, %GMT_MSG1, "Noot=" & STR$(fracnote) ' also test the inverse function: wrd = Sire_MidiNoot2Velo(fracnote) SetDlgItemText gh.Cockpit, %GMT_MSG2, "velo msb =" & STR$(HIBYT(wrd)) & " ctrl lsb=" & STR$(LOBYT(wrd)) Task(%Sire1).freq = MAX(1,16! * (Slider(slnr).value) / 128!) END SUB SUB Sire1_nr_UD1 () ' callback on parameter UpDowns. LOCAL udnr AS DWORD udnr = TaskEX(%Sire1).UpdownNumbers(0) IF UDctrl(udnr).value <= Sire.lowtes THEN UDctrl(udnr).value = Sire.lowtes SetDlgItemText Task(%Sire1).hparam, %GMT_TEXT0_ID + 16, STR$(Udctrl(udnr).value) ELSE UDctrl(udnr).value = MIN(UDctrl(udnr).value, Sire.lowtes + 7) SetDlgItemText Task(%Sire1).hparam, %GMT_TEXT0_ID + 16, STR$(Udctrl(udnr).value) END IF END SUB SUB Sire1_fine_UD2 () ' adapts to PWM resolution in PIC firmware. LOCAL udnr AS DWORD LOCAL RANGE AS WORD RANGE = 2^ (%MM_sire_res - 7) ' bij 10 bit is dit 3 bits lsb, of 8 udnr = TaskEX(%Sire1).UpdownNumbers(1) IF UDctrl(udnr).value <= %False THEN UDctrl(udnr).value = %False SetDlgItemText Task(%Sire1).hparam, %GMT_TEXT0_ID + 17, STR$(Udctrl(udnr).value) ELSE UDctrl(udnr).value = MIN(UDctrl(udnr).value, RANGE-1) SetDlgItemText Task(%Sire1).hparam, %GMT_TEXT0_ID + 17, STR$(Udctrl(udnr).value) END IF END SUB SUB Sire2 () STATIC sirencounter AS BYTE STATIC note AS BYTE STATIC slnr AS DWORD STATIC udnr AS DWORD STATIC lsb AS BYTE STATIC faktor AS WORD ' aantal bits dat we naar links moeten schuiven ' met het lsb in funktie van de PWM resolutie LOCAL fracnote AS SINGLE LOCAL wrd AS WORD IF ISFALSE Task(%Sire2).tog THEN DIM TaskParamLabels(0 TO 4) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Pitch" ' pitch TaskParamLabels(2) = "ctrl21" TaskParamLabels(3) = "Siren" ' number of the siren TaskParamLabels(4) = "fine" ' pitch lsb IF ISFALSE Task(%Sire2).hParam THEN slnr = %False MakeTaskParameterDialog %Sire2,3,Slider(),2,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Sire2).SliderNumbers(0) udnr = TaskEX(%Sire2).UpdownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Sire2_nr_UD1) UDctrl(udnr+1).cptr = CODEPTR(Sire2_fine_UD2) ' lsb control for pitch UDctrl(udnr).value = Sire.lowtes + 8 ' siren number UDctrl(udnr+1).value = 0 Task(%Sire2).freq = 24 Slider(slnr).value = Task(%Sire2).freq 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 = 32 SendMessage Slider(slnr+2).h, %TBM_SETPOS, %True, 32 Sire.ctrl(21) = 32 END IF faktor = 7 - (%MM_sire_res - 7) ' bij 10 bits is dit 4 , bij 9 bits 5 Task(%Sire2).tog = %True END IF IF Slider(slnr+2).value <> Sire.ctrl(21) THEN Controller Sire.channel, 21, Slider(slnr+2).value Sire.ctrl(21) = Slider(slnr+2).value END IF IF sirencounter <> UDctrl(udnr).value THEN sirencounter = UDctrl(udnr).value note = Slider(slnr+1).value mPlay Sire.channel, sirencounter, note Controller Sire.channel, sirencounter, %False Sire.ctrl(sirencounter) = %False END IF IF lsb <> UDctrl(udnr+1).value THEN lsb = UDctrl(udnr+1).value Sire.ctrl(sirencounter) = lsb SHIFT LEFT Sire.ctrl(sirencounter), faktor Controller Sire.channel, sirencounter, Sire.ctrl(sirencounter) END IF IF note <> Slider(slnr+1).value THEN note = Slider(slnr+1).value mPlay Sire.channel, sirencounter, note END IF fracnote = Sire_Velo2MidiNoot(note) + (Sire.ctrl(sirencounter) / 128) SetDlgItemText gh.Cockpit, %GMT_MSG1, "Noot=" & STR$(fracnote) ' also test the inverse function: wrd = Sire_MidiNoot2Velo(fracnote) SetDlgItemText gh.Cockpit, %GMT_MSG2, "velo msb =" & STR$(HIBYT(wrd)) & " ctrl lsb=" & STR$(LOBYT(wrd)) Task(%Sire2).freq = MAX(1,16! * (Slider(slnr).value) / 128!) END SUB SUB Sire2_nr_UD1 () ' callback on parameter UpDowns. LOCAL udnr AS DWORD udnr = TaskEX(%Sire2).UpdownNumbers(0) IF UDctrl(udnr).value <= Sire.lowtes+8 THEN UDctrl(udnr).value = Sire.lowtes+8 SetDlgItemText Task(%Sire2).hparam, %GMT_TEXT0_ID + 16, STR$(Udctrl(udnr).value) ELSE UDctrl(udnr).value = MIN(UDctrl(udnr).value, Sire.lowtes+15) SetDlgItemText Task(%Sire2).hparam, %GMT_TEXT0_ID + 16, STR$(Udctrl(udnr).value) END IF END SUB SUB Sire2_fine_UD2 () ' adapts to PWM resolution in PIC firmware. LOCAL udnr AS DWORD LOCAL RANGE AS WORD RANGE = 2^ (%MM_sire_res - 7) ' bij 10 bit is dit 3 bits lsb, of 8 udnr = TaskEX(%Sire2).UpdownNumbers(1) IF UDctrl(udnr).value <= %False THEN UDctrl(udnr).value = %False SetDlgItemText Task(%Sire2).hparam, %GMT_TEXT0_ID + 17, STR$(Udctrl(udnr).value) ELSE UDctrl(udnr).value = MIN(UDctrl(udnr).value, RANGE-1) SetDlgItemText Task(%Sire2).hparam, %GMT_TEXT0_ID + 17, STR$(Udctrl(udnr).value) END IF END SUB SUB Sire3 () STATIC sirencounter AS BYTE STATIC note AS BYTE STATIC slnr AS DWORD STATIC udnr AS DWORD STATIC lsb AS BYTE STATIC faktor AS WORD ' aantal bits dat we naar links moeten schuiven ' met het lsb in funktie van de PWM resolutie LOCAL fracnote AS SINGLE LOCAL wrd AS WORD IF ISFALSE Task(%Sire3).tog THEN DIM TaskParamLabels(0 TO 4) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Pitch" ' pitch TaskParamLabels(2) = "ctrl22" TaskParamLabels(3) = "Siren" ' number of the siren TaskParamLabels(4) = "fine" ' pitch lsb IF ISFALSE Task(%Sire3).hParam THEN slnr = %False MakeTaskParameterDialog %Sire3,3,Slider(),2,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Sire3).SliderNumbers(0) udnr = TaskEX(%Sire3).UpdownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Sire3_nr_UD1) UDctrl(udnr+1).cptr = CODEPTR(Sire3_fine_UD2) ' lsb control for pitch UDctrl(udnr).value = Sire.lowtes + 16 ' siren number UDctrl(udnr+1).value = 0 Task(%Sire3).freq = 24 Slider(slnr).value = Task(%Sire3).freq 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 = 32 SendMessage Slider(slnr+2).h, %TBM_SETPOS, %True, 32 Sire.ctrl(22) = 32 END IF faktor = 7 - (%MM_sire_res - 7) ' bij 10 bits is dit 4 , bij 9 bits 5 Task(%Sire3).tog = %True END IF IF Slider(slnr+2).value <> Sire.ctrl(22) THEN Controller Sire.channel, 22, Slider(slnr+2).value Sire.ctrl(22) = Slider(slnr+2).value END IF IF sirencounter <> UDctrl(udnr).value THEN sirencounter = UDctrl(udnr).value note = Slider(slnr+1).value mPlay Sire.channel, sirencounter, note Controller Sire.channel, sirencounter, %False Sire.ctrl(sirencounter) = %False END IF IF lsb <> UDctrl(udnr+1).value THEN lsb = UDctrl(udnr+1).value Sire.ctrl(sirencounter) = lsb SHIFT LEFT Sire.ctrl(sirencounter), faktor Controller Sire.channel, sirencounter, Sire.ctrl(sirencounter) END IF IF note <> Slider(slnr+1).value THEN note = Slider(slnr+1).value mPlay Sire.channel, sirencounter, note END IF fracnote = Sire_Velo2MidiNoot(note) + (Sire.ctrl(sirencounter) / 128) SetDlgItemText gh.Cockpit, %GMT_MSG1, "Noot=" & STR$(fracnote) ' also test the inverse function: wrd = Sire_MidiNoot2Velo(fracnote) SetDlgItemText gh.Cockpit, %GMT_MSG2, "velo msb =" & STR$(HIBYT(wrd)) & " ctrl lsb=" & STR$(LOBYT(wrd)) Task(%Sire3).freq = MAX(1,16! * (Slider(slnr).value) / 128!) END SUB SUB Sire3_nr_UD1 () ' callback on parameter UpDowns. LOCAL udnr AS DWORD udnr = TaskEX(%Sire3).UpdownNumbers(0) IF UDctrl(udnr).value <= Sire.lowtes+16 THEN UDctrl(udnr).value = Sire.lowtes+16 SetDlgItemText Task(%Sire3).hparam, %GMT_TEXT0_ID + 16, STR$(Udctrl(udnr).value) ELSE UDctrl(udnr).value = MIN(UDctrl(udnr).value, Sire.hightes) SetDlgItemText Task(%Sire3).hparam, %GMT_TEXT0_ID + 16, STR$(Udctrl(udnr).value) END IF END SUB SUB Sire3_fine_UD2 () ' adapts to PWM resolution in PIC firmware. LOCAL udnr AS DWORD LOCAL RANGE AS WORD RANGE = 2^ (%MM_sire_res - 7) ' bij 10 bit is dit 3 bits lsb, of 8 udnr = TaskEX(%Sire3).UpdownNumbers(1) IF UDctrl(udnr).value <= %False THEN UDctrl(udnr).value = %False SetDlgItemText Task(%Sire3).hparam, %GMT_TEXT0_ID + 17, STR$(Udctrl(udnr).value) ELSE UDctrl(udnr).value = MIN(UDctrl(udnr).value, RANGE-1) SetDlgItemText Task(%Sire3).hparam, %GMT_TEXT0_ID + 17, STR$(Udctrl(udnr).value) END IF END SUB SUB Sire1_Lites () STATIC i AS INTEGER LOCAL j AS INTEGER IF ISFALSE Task(%Sire1_Lights).tog THEN i = %False Task(%Sire1_Lights).tog = %True END IF ' 84,85,86 SELECT CASE i MOD 3 CASE %False Noteoff Sire.channel, 86 mPlay Sire.channel, 84, 127 CASE %True mPlay Sire.channel, 85, 127 Noteoff Sire.channel, 84 CASE 2 mPlay Sire.channel, 86, 127 NoteOff Sire.channel, 85 END SELECT INCR i END SUB SUB Sire1_Lites_Off () LOCAL i AS INTEGER FOR i = 84 TO 86 NoteOff Sire.channel, i NEXT i END SUB SUB Sire2_Lites () STATIC i AS INTEGER LOCAL j AS INTEGER IF ISFALSE Task(%Sire2_Lights).tog THEN i = %False Task(%Sire2_Lights).tog = %True END IF ' 87,88,89 SELECT CASE i MOD 3 CASE %False Noteoff Sire.channel, 89 mPlay Sire.channel, 87, 127 CASE %True mPlay Sire.channel, 88, 127 Noteoff Sire.channel, 87 CASE 2 mPlay Sire.channel, 89, 127 NoteOff Sire.channel, 88 END SELECT INCR i END SUB SUB Sire2_Lites_Off () LOCAL i AS INTEGER FOR i = 87 TO 89 NoteOff Sire.channel, i NEXT i END SUB SUB Sire3_Lites () STATIC i AS INTEGER LOCAL j AS INTEGER IF ISFALSE Task(%Sire3_Lights).tog THEN i = %False Task(%Sire3_Lights).tog = %True END IF ' 90,91,92 SELECT CASE i MOD 3 CASE %False Noteoff Sire.channel, 92 mPlay Sire.channel, 90, 127 CASE %True mPlay Sire.channel, 91, 127 Noteoff Sire.channel, 90 CASE 2 mPlay Sire.channel, 92, 127 NoteOff Sire.channel, 91 END SELECT INCR i END SUB SUB Sire3_Lites_Off () LOCAL i AS INTEGER FOR i = 90 TO 92 NoteOff Sire.channel, i NEXT i END SUB SUB Sire_TuneTest () 'test voor sire_play functie, die onnauwkeuriger ijkt te worden met verouderen.. STATIC sirencounter AS BYTE STATIC note AS BYTE STATIC slnr AS DWORD STATIC udnr AS DWORD STATIC lsb AS BYTE STATIC faktor AS WORD ' aantal bits dat we naar links moeten schuiven ' met het lsb in funktie van de PWM resolutie LOCAL fracnote AS SINGLE LOCAL wrd AS WORD IF ISFALSE Task(%Sire_tuneTest).tog THEN DIM TaskParamLabels(0 TO 3) AS ASCIIZ * 8 MM_qt_On %MM_Wind OR %MM_Motor 'we use qt for reference TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Pitch" ' pitch TaskParamLabels(2) = "Siren" ' number of the siren IF ISFALSE Task(%Sire_Test).hParam THEN slnr = %False MakeTaskParameterDialog %Sire_tuneTest,1,Slider(),2,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Sire_tuneTest).SliderNumbers(0) udnr = TaskEX(%Sire_tuneTest).UpdownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Sire_tt_UD1) UDctrl(udnr+1).cptr = CODEPTR(Sire_tt_UD2) ' lsb control for pitch UDctrl(udnr).value = 60 UDctrl(udnr+1).value = 0 Task(%Sire_tuneTest).freq = 2 Slider(slnr).value = Task(%Sire_TuneTest).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 ' faktor = 7 - (%MM_sire_res - 7) ' bij 10 bits is dit 4 Task(%Sire_TuneTest).tog = %True END IF MM_Sire_Off Sire_Play UDctrl(udnr).value, 0, UDCtrl(udnr + 1).value, 0 Sire_Play UDctrl(udnr).value, 64, UDCtrl(udnr + 1).value, 0 MM_Qt_Off %MM_Notes mPlay Qt.channel, UDCtrl(udnr).value, 64 Task(%Sire_Test).freq = MAX(1,16! * (Slider(slnr).value) / 128!) END SUB SUB Sire_tt_UD1 () 'pitch ' callback on parameter UpDowns. LOCAL udnr AS DWORD udnr = TaskEX(%Sire_tuneTest).UpdownNumbers(0) IF UDctrl(udnr).value <= 48 THEN UDctrl(udnr).value = 48 SetDlgItemText Task(%Sire_tuneTest).hparam, %GMT_TEXT0_ID + 16, STR$(Udctrl(udnr).value) ELSE UDctrl(udnr).value = MIN(UDctrl(udnr).value, 84) SetDlgItemText Task(%Sire_tuneTest).hparam, %GMT_TEXT0_ID + 16, STR$(Udctrl(udnr).value) END IF END SUB SUB Sire_tt_UD2 () 'sirennr ' adapts to PWM resolution in PIC firmware. LOCAL udnr AS DWORD ' LOCAL RANGE AS WORD ' RANGE = 2^ (%MM_sire_res - 7) ' bij 10 bit is dit 3 bits lsb, of 8 udnr = TaskEX(%Sire_tuneTest).UpdownNumbers(1) IF UDctrl(udnr).value <= %False THEN UDctrl(udnr).value = %False SetDlgItemText Task(%Sire_tuneTest).hparam, %GMT_TEXT0_ID + 17, STR$(Udctrl(udnr).value) ELSE UDctrl(udnr).value = MIN(UDctrl(udnr).value, 23) SetDlgItemText Task(%Sire_tuneTest).hparam, %GMT_TEXT0_ID + 17, STR$(Udctrl(udnr).value) END IF END SUB ' EOF