'***************************************************** '* g_ctrl * '* code module for all wired interfaces * '* using midi as output format * '* , , , * '* by * '* dr.Godfried-Willem Raes * '* demo code by * '* Kristof Lauwers * '***************************************************** ' 31.12.2007: Creation date of this code module ' 04.01.2008: Moves of code from interfaces to this module. ' 05.01.2008: resource files and libs updated for this module. ' 04.02.2008: further work on demo code by gwr. ' 05.02.2008: Sire's Hands - demo gwr ' covered interfaces: ' CQT pitch to midi convertor - connected to MIDI input ' AXE3 acceleration sensor, replacing Godfried's Egg (would require Nidaq) and ADXL202 accelleration sensor '- connected to the serial port (original code saved in serial_adxl202.inc. ' HANDY pressure pad input device. %Axe3ListenTaskNr = 2 ' 23.10.2007 %Handy_listen = 3 ' 30.12.2007 %Hands1 = 43 ' pressure pad demo on Troms. %Handy_Mon = 45 %Handy_sire = 46 %ax3_monitor = 53 'debug ' following to be rewritten for the new midi version. %Demo_ADXL202 = 56 ' demonstrates use of Analog Devices development board for the ' ADXL202 acceleration sensing device as a musical controller. ' This hardware requires the serial port at 38400 Baud %ADXL_piahar = 57 ' mapping op player piano and harma %ADXL_vibour = 58 ' mapping on vibi and bourdonola %ax3_vitello = 59 ' piece for vitello and axe3 sensor on request by moniek '---------------------------------------------------- ' Globals: ' new version: - for AXE3 GLOBAL pAXE3 AS Axe_Type PTR ' new version 23.10.2007 ' for : 30.12.2007 GLOBAL pHandy AS HandySensor PTR ' in g_lib - g_midi.inc #IF %DEF(%Serial_ADXL) GLOBAL pADXL202 AS AccelSensDevice PTR ' old serial version (to be removed) #INCLUDE "C:\b\pb\gmt\demos\serial_adxl202.inc" ' backup for old version #ENDIF DECLARE FUNCTION Init_Controllers () AS LONG ' following should be overwritten: (new version!) DECLARE SUB Demo_ADXL () DECLARE SUB Demo_ADXL_Stop () DECLARE SUB ADXL_piahar () ' M&M 13.02.2003 DECLARE SUB ADXL_Vibour () '----------------------------------------------- DECLARE SUB Hands1 () ' first test for Handy DECLARE SUB Handy_Mon () ' demo for moniek DECLARE SUB Handy_Mon_Stop () DECLARE SUB Handy_Sire () ' Sire's Hands - gwr demo DECLARE SUB Handy_Sire_Stop () FUNCTION Init_Controllers () AS LONG LOCAL i AS DWORD LOCAL pmask AS QUAD PTR pmask = SetMidiListenChannel (15, %False) ' returns pointer FOR i = 0 TO 255 BIT RESET @pmask, i 'reset 4 quads!! NEXT i ' init for the AXE3 sensor: pAxe3 = GetAX3Sensorpointer (0, %Axe3Listentasknr) IF ISFALSE pAxe3 THEN Warning "Initialisation failure for AXE3 sensor" END IF ' init for : pHandy = GetHandySensorPointer (0, %Handy_Listen) IF ISFALSE pHandy THEN Warning "Initialisation failure for sensorpads" END IF IF pAXE3 THEN ' INTERFACE: AXE3 Task(%Demo_ADXL202).naam = "ADXL202" ' = 24 Task(%Demo_ADXL202).cptr = CODEPTR(Demo_ADXL) Task(%Demo_ADXL202).freq = 10 TaskEx(%Demo_ADXL202).stopCptr = CODEPTR(Demo_ADXL_Stop) Task(%ADXL_piahar).naam = "AD_piha" ' = 24 Task(%ADXL_piahar).cptr = CODEPTR(ADXL_piahar) Task(%ADXL_piahar).freq = 10 TaskEx(%ADXL_piahar).stopCptr = CODEPTR(Demo_ADXL_Stop) Task(%ADXL_vibour).naam = "AD_vibo" ' = 24 Task(%ADXL_vibour).cptr = CODEPTR(ADXL_Vibour) Task(%ADXL_Vibour).freq = 10 TaskEx(%ADXL_Vibour).stopCptr = CODEPTR(Demo_ADXL_Stop) END IF IF pHandy THEN Task(%Hands1).naam ="Hands1" ' mapping on troms Task(%Hands1).freq = 30 Task(%Hands1).cptr = CODEPTR(Hands1) Task(%Handy_Mon).naam = "HanMon" ' 'Handy Mon' Task(%Handy_Mon).freq = 25 Task(%Handy_Mon).cptr = CODEPTR(Handy_Mon) TaskEX(%Handy_Mon).stopCptr = CODEPTR(Handy_Mon_Stop) Task(%Handy_Sire).naam = "HanSir" ' demo on Sire : 'Sires Hands' Task(%Handy_Sire).freq = 25 Task(%Handy_Sire).cptr = CODEPTR(Handy_Sire) TaskEX(%Handy_Sire).stopCptr = CODEPTR(Handy_Sire_Stop) END IF IF ISFALSE hMidiI(0) OR ISFALSE hMidiO(0) THEN ' midi I/O devices should have been selected ButnSW(0).tag0 = "" ButnSW(0).cPtr = %False END IF ButnOs(1).tag="" ButnOs(1).cptr = %False ButnOs(2).tag = "ProgChange" ButnOs(2).cptr = CODEPTR(MM_ProgchangeWindow) i = Init_MM () ' in g_mm.inc MM_PanicButtonWindow '(OPT BYVAL instrum$, BYVAL hParent AS LONG, BYVAL x AS LONG, BYVAL y AS LONG) AS LONG Task(%ax3_monitor).naam = "Ax3_Mon" Task(%ax3_monitor).cptr = GetProcAddress(loadlibrary("g_glib.dll"),"AXE3_MON") 'loadlibrary, not getmodulehandle as module was not loaded yet.. Task(%ax3_monitor).freq = 48 Task(%ax3_vitello).naam="AxVitello" Task(%ax3_vitello).freq = 100 Task(%ax3_vitello).cptr=CODEPTR(AxVitello) FUNCTION = %True END FUNCTION SUB ADXL_piahar () ' map this one on the left hand and vibour on the right hand. LOCAL retval AS DWORD LOCAL x AS DWORD LOCAL y AS DWORD STATIC oldx AS DWORD STATIC oldy AS DWORD LOCAL s AS SINGLE LOCAL v AS INTEGER IF ISFALSE Task(%ADXL_piahar).tog THEN Task(%ADXL_piahar).tog = %True END IF x = 64 + (@pAxe3.acclX * 24) x = MAX (0,x) x = MIN (127,x) IF x <> oldx THEN IF oldx THEN Noteoff Piano.channel, oldx ' nieuwe versie in radialen: v = MIN(127,64 + (@pAxe3.tiltlX * 28.6)) ' 64 + ((Pi/2)* 28.6) mPlay Piano.channel, x, v oldx = x END IF y = 64 + (@pAxe3.acclY * 24) y = MAX (0,y) y = MIN (127,y) IF y <> oldy THEN IF oldy THEN Noteoff Harma.channel, oldy ' harma v = MIN(127,64 + (@pAxe3.tiltlY * 28.6 )) mPlay Harma.channel, y, v oldy = y END IF Task(%ADXL_piahar).freq = 2 + (ABS(@pAxe3.dalY) * 4) END SUB SUB ADXL_Vibour () ' mapped on the right hand sensor LOCAL retval AS DWORD LOCAL x AS DWORD LOCAL y AS DWORD STATIC oldx AS DWORD STATIC oldy AS DWORD LOCAL s AS SINGLE LOCAL v AS INTEGER IF ISFALSE Task(%ADXL_vibour).tog THEN MM_Piperola_On MM_Bourdonola_On Task(%ADXL_vibour).tog = %True END IF x = 77 + (@pAxe3.accRX * 12) x = MAX (0,x) x = MIN (127,x) IF x <> oldx THEN IF oldx THEN NoteOff Vibi.channel, oldx ' vibi - noteoff not really required unless dampers are used. v = MIN(127,64 + (@pAxe3.tiltRX * 28.6)) mPlay Vibi.channel, x, v/2 oldx = x END IF y = 64 + (@pAxe3.accRY * 24) y = MAX (0,y) y = MIN (127,y) IF y <> oldy THEN IF oldy THEN NoteOff Piperola.channel, oldy ' bourdonola-piperola v = MIN(127,64 + (@pAxe3.tiltRY * 28.6 )) mPlay Piperola.channel, y, v oldy = y END IF Task(%ADXL_vibour).freq = 2 + (ABS(@pAxe3.daRY) * 4) END SUB SUB Demo_ADXL () ' from piperola.inc (removed from there 20.05.2004) ' note: ADXL serial device is used in Flexing, act in Technofaustus. ' in the process of change to AXE3 device ' translated but not tested yet. ' This mapping is on the left hand sensor only. LOCAL retval AS DWORD LOCAL x AS DWORD LOCAL y AS DWORD STATIC oldx AS DWORD STATIC oldy AS DWORD LOCAL s AS SINGLE LOCAL v AS INTEGER IF ISFALSE Task(%Demo_ADXL202).tog THEN IF Task(%ADXL_piahar).swit THEN EXIT SUB IF Task(%ADXL_vibour).swit THEN EXIT SUB Starttask %Axe3Listentasknr ' retval = Open_Serial_IO (1, "ADXL202") ' note: global pADXL202 as AccelSensDevice PTR ' IF ISFALSE retval THEN ' Stoptask %Demo_ADXL202 ' EXIT SUB ' END IF ' pADXL202 = GetADXL202pointer ' in g_n*h.dll ' de databuffers kunnen gebruikt worden alsvolgt: ' DIM xb(@pADXL202.samplingrate) AS STATIC INTEGER AT VARPTR(@pADXL202.Xbuf) ' DIM yb(@pADXL202.samplingrate) AS STATIC INTEGER AT VARPTR(@pADXL202.Ybuf) ' hiermee hebben we een buffer van 1 sekonde gedimensioneerd. ' Merk op dat de meest recente data vooraan staan in het array! ' nu: DIM Lx(%PicRadBufSize) AS STATIC WORD AT VARPTR(@pAxe3.plx) Task(%Demo_ADXL202).tog = %True END IF x = 64 + (@pAxe3.accLX * 24) ' check new scaling!!! x = MAX (0,x) x = MIN (127,x) IF x <> oldx THEN IF oldx THEN NoteOff 0, oldx v = MIN(127,64 + (@pAxe3.tiltlX * 28.6)) ' now in rad. mPlay 0,x,v oldx = x END IF y = 64 + (@pAxe3.acclY * 24) y = MAX (0,y) y = MIN (127,y) IF y <> oldy THEN IF oldy THEN NoteOff 1, oldy v = MIN(127,64 + (@pAxe3.tiltlY * 28.6 )) mPlay 1,y,v oldy = y END IF ' for monitoring: SetDlgItemText gh.Cockpit, %GMT_MSG1, "tilt x=" & STR$(@pAxe3.tiltlX) ' pitch - in rad. SetDlgItemText gh.Cockpit, %GMT_MSG2, "tilt y=" & STR$(@pAxe3.tiltlY) ' roll - in rad. END SUB SUB Demo_ADXL_Stop () ' old code: ' LOCAL retval AS DWORD ' retval = Close_Serial_IO (1, "ADXL202") ' in g_n*h.dll END SUB SUB Hands1 () ' Handy Troms ' first test for the new pressure pad playing device ' test on troms STATIC cnt AS DWORD IF ISFALSE Task(%Hands1).tog THEN IF ISFALSE Task(%Handy_Listen).swit THEN starttask %Handy_Listen cnt = %False MM_Troms_On Task(%Hands1).freq = 16 Task(%Hands1).tog = %True END IF IF @pHandy.a(1) THEN 'linkerpink mPlay Troms.channel, 46 + (cnt MOD 2), @pHandy.a(1) INCR cnt END IF IF @pHandy.a(10) THEN 'rechterpink mPlay Troms.channel, 44 + (cnt MOD 2), @pHandy.a(10) INCR cnt END IF IF @phandy.a(2) THEN 'linker ringvinger mPlay Troms.channel, 41 + (cnt MOD 3), @pHandy.a(2) INCR cnt END IF IF @pHandy.a(9) THEN ' rechterringvinger mPlay Troms.channel, 38 + (cnt MOD 3), @pHandy.a(9) INCR cnt END IF IF @pHandy.a(3) THEN ' linker middelvinger mPlay Troms.channel, 34 + (cnt MOD 5), @pHandy.a(3) INCR cnt END IF IF @pHandy.a(8) THEN ' rechter middelvinger mPlay Troms.channel, 30 + (cnt MOD 5), @pHandy.a(8) INCR cnt END IF IF @pHandy.a(4) THEN ' linkerwijsvinger mPlay Troms.channel, 24 + (cnt MOD 7), @pHandy.a(4) INCR cnt END IF IF @pHandy.a(7) THEN ' rechterwijsvinger mPlay Troms.channel, 48, @pHandy.a(7) ' cimbaal END IF ' duimwitches mapped on lights IF @pHandy.a(5) <> Troms.ctrl(18) THEN ' linkerduim mPlay Troms.channel, 18, @pHandy.a(5) Troms.ctrl(18) = @pHandy.a(5) END IF IF @pHandy.a(6) <> Troms.ctrl(19) THEN ' rechterduim mPlay Troms.channel, 19, @pHandy.a(6) Troms.ctrl(19) = @pHandy.a(6) END IF END SUB SUB Hands2 () ' Handy Simba ' mapping on Simba END SUB SUB Handy_Mon () ' handy piece for moniek ' for the new pressure pad playing device STATIC cnt AS DWORD STATIC rotwit AS LONG DIM nn(10) AS STATIC CUR DIM vn(10) AS STATIC CUR LOCAL rot AS LONG LOCAL d AS SINGLE IF ISFALSE Task(%Handy_Mon).tog THEN IF ISFALSE Task(%Handy_Listen).swit THEN starttask %Handy_Listen cnt = %False MM_Troms_On MM_Rotomoton_On 'MM_Simba_On MM_Harma_On MM_Vitello_On 'MM_Psch_On Task(%Handy_Mon).freq = 16 Task(%Handy_Mon).tog = %True END IF ' first we implement two pads for Harma: IF @pHandy.a(1) THEN 'linkerpink IF nn(2) THEN DO nn(1) = INT( ((nn(2) MOD 12)+ 24) + ((RND(1)^2) * (@pHandy.a(1) / 2))) nn(1) = MIN(Harma.hightes-1, nn(1)) d = HH_DipDis (nn(1), nn(2),0) ' test new function LOOP UNTIL d < 0.35 ELSE nn(1) = 29 + ((Gray(cnt)) MOD 24) END IF IF nn(1) <> vn(1) THEN NoteOff Harma.channel, vn(1) mPlay Harma.channel, nn(1), 80 vn(1) = nn(1) END IF Harma.ctrl(7) = ((Harma.ctrl(7) * 9) + @pHandy.a(1)) / 10 Controller Harma.channel, 7, Harma.ctrl(7) INCR cnt ELSE IF ISFALSE @pHandy.a(2) THEN DECR Harma.ctrl(7) END IF IF Harma.ctrl(7) > 28 THEN Controller Harma.channel, 7, Harma.ctrl(7) END IF IF Harma.ctrl(7) < 0 THEN Harma.ctrl(7) = 0 IF ISFALSE Harma.ctrl(7) THEN IF vn(1) THEN Noteoff Harma.channel, vn(1) vn(1) = %False END IF IF vn(2) THEN NoteOff Harma.channel, vn(2) vn(2) = %False END IF END IF END IF IF @phandy.a(2) THEN 'linker ringvinger - Harma 2e noot IF Harma.ctrl(7) < @pHandy.a(2) THEN INCR Harma.ctrl(7) Controller Harma.channel, 7, Harma.ctrl(7) END IF IF nn(1) THEN DO nn(2) = INT(nn(1) + ((RND(1)^2) *( @pHandy.a(2)/2))) nn(2) = MIN(Harma.hightes-1, nn(2)) d = HH_DipDis (nn(1), nn(2),0) ' test new function LOOP UNTIL d < 0.35 ELSE nn(2) = 29 + ((Gray(cnt)) MOD 24) END IF IF nn(2) <> vn(2) THEN Noteoff Harma.channel, vn(2) mPlay Harma.channel, nn(2), 80 vn(2) = nn(2) END IF INCR cnt ELSE IF vn(2) THEN NoteOff Harma.channel, vn(2) vn(2) = %False END IF END IF ' twee pads gemapt op rotomoton: IF @pHandy.a(3) THEN ' linker & rechter middelvinger ' a(8) = rechts = tromkeuze ' a(3) = velspanning rot =48 + (@pHandy.a(8) / 10) ' 48 - 59 mPlay Rotomoton.channel, rot, 120 'MIN(48 + @pHandy.a(8)/ 3, @pHandy.a(3) SELECT CASE rot CASE < 51 ' lowest drum 48-50 Controller Rotomoton.channel, 101, @pHandy.a(3) CASE < 54 Controller Rotomoton.channel, 102, @pHandy.a(3) CASE < 56 Controller Rotomoton.channel, 103, @pHandy.a(3) CASE < 58 Controller Rotomoton.channel, 104, @pHandy.a(3) CASE < 60 Controller Rotomoton.channel, 105, @pHandy.a(3) END SELECT IF ISFALSE rotwit THEN MM_Rotomoton_On %MM_White rotwit = %True END IF IF @pHandy.a(8) THEN MM_Rotomoton_On %MM_Blue ELSE IF rotwit THEN MM_Rotomoton_Off %MM_Lights rotwit = %False END IF END IF ' twee pads op Psch: IF @pHandy.a(4) THEN ' linkerwijsvinger - psch blik ' rechterwijsvinger = dynamiek mPlay Psch.channel, MIN(72 + (@pHandy.a(4)/6),87), @pHandy.a(7) INCR cnt END IF ' twee pads op troms: IF (@pHandy.a(10)> 0) AND (@pHandy.a(9)>0) THEN 'rechterpink = trom 'rechterringvinger = sterkte mPlay Troms.channel, 23 + (@pHandy.a(10) / 5), @pHandy.a(9) INCR cnt END IF ' duimswitch mapped on snar IF @pHandy.a(5) THEN ' linkerduim mPlay Snar.channel, 60 + (cnt MOD 15), @pHandy.a(5) INCR cnt END IF ' duimswitch mapped om Vitello: IF @pHandy.a(6) THEN ' rechterduim mPlay Vitello.channel, 96 + (cnt MOD 32), @pHandy.a(6) END IF END SUB SUB Handy_Mon_Stop () MM_Troms_Off MM_Vitello_Off 'MM_Snar_Off MM_Harma_Off %MM_Notes 'MM_Psch_Off END SUB SUB Handy_Sire () ' premiered on 07.02.2008 STATIC sr1 AS LONG STATIC sr2 AS LONG STATIC sr3 AS LONG STATIC sr4 AS LONG STATIC sr5 AS LONG STATIC sr6 AS LONG STATIC sr7 AS LONG STATIC sr8 AS LONG STATIC kn AS LONG STATIC sp AS LONG STATIC cnt AS LONG STATIC brake AS LONG STATIC red AS LONG STATIC wit AS LONG DIM v(8) AS STATIC LONG LOCAL i AS LONG IF ISFALSE Task(%Handy_Sire).tog THEN IF ISFALSE Task(%Handy_Listen).swit THEN starttask %Handy_Listen sr1 = 48 ' 48,49,50,51 sr2 = 52 ' 52,53,54,55 sr3 = 56 ' 56,57,58 sr4 = 59 ' 59,60,61 sr5 = 62 ' 62,63 sr6 = 64 ' 64,65,66 sr7 = 67 ' 67,68,69 sr8 = 70 ' 70,71 kn = 0 sp = 0 cnt = 0 Controller Sire.channel, 123, %False Controller Korn.channel, 17, 110 Controller Korn.channel, 18, 120 Controller Korn.channel, 25, 20 MM_Springers_On MM_Sire_On brake = %False '%True FOR i = 1 TO 8 v(i) = %False NEXT i red = %False Task(%Handy_Sire).tog = %True END IF IF v(1) <> @pHandy.a(1) THEN mPlay Sire.channel, sr1, %False v(1) = @pHandy.a(1) IF v(1) THEN mPlay Sire.channel, sr1, v(1) ELSE mPlay Sire.channel, sr1, brake INCR sr1 IF sr1 > 51 THEN sr1 = 48 END IF END IF ' old coding: 'IF @pHandy.a(1) THEN ' mPlay Sire.channel, sr1, @pHandy.a(1) ' Sire.ctrl(1) = %False 'ELSE ' IF sire.ctrl(1) <> 1 THEN ' mPlay Sire.channel, sr1, brake ' sire.ctrl(1) = 1 ' INCR sr1 ' IF sr1 > 51 THEN sr1 = 48 ' END IF 'END IF IF @pHandy.a(2) THEN mPlay Sire.channel, sr2, @pHandy.a(2) sire.ctrl(2) = %False ELSE IF sire.ctrl(2) <> 1 THEN mPlay Sire.channel, sr2, brake sire.ctrl(2) = 1 INCR sr2 IF sr2 > 55 THEN sr2 = 52 END IF END IF IF @pHandy.a(3) THEN mPlay Sire.channel, sr3, @pHandy.a(3) sire.ctrl(3) = %False ELSE IF sire.ctrl(3) <> 1 THEN mPlay Sire.channel, sr3, brake sire.ctrl(3) = 1 INCR sr3 IF sr3 > 58 THEN sr3 = 56 END IF END IF IF @pHandy.a(4) THEN mPlay Sire.channel, sr4, @pHandy.a(4) sire.ctrl(4) = %False ELSE IF sire.ctrl(4) <> 1 THEN mPlay Sire.channel, sr4, brake sire.ctrl(4) = 1 INCR sr4 IF sr4 > 61 THEN sr4 = 59 END IF END IF IF @pHandy.a(7) THEN mPlay Sire.channel, sr5, @pHandy.a(7) sire.ctrl(5) = %False ELSE IF sire.ctrl(5) <> 1 THEN mPlay Sire.channel, sr5, brake sire.ctrl(5) =1 INCR sr5 IF sr5 > 63 THEN sr5 = 62 END IF END IF IF @pHandy.a(8) THEN mPlay Sire.channel, sr6, @pHandy.a(8) sire.ctrl(6) = %False ELSE IF sire.ctrl(6) <> 1 THEN mPlay sire.channel, sr6, brake sire.ctrl(6) = 1 INCR sr6 IF sr6 > 66 THEN sr6 = 64 END IF END IF IF @pHandy.a(9) THEN mPlay Sire.channel, sr7, @pHandy.a(9) sire.ctrl(7) = %False ELSE IF sire.ctrl(7) <> 1 THEN mPlay sire.channel, sr7, brake sire.ctrl(7) = 1 INCR sr7 IF sr7 > 69 THEN sr7 = 67 END IF END IF IF @pHandy.a(10) THEN mPlay Sire.channel, sr8, @pHandy.a(10) sire.ctrl(8) = %False ELSE IF sire.ctrl(8) <> 1 THEN mPlay sire.channel, sr8, brake sire.ctrl(8) = 1 INCR sr8 IF sr8 > 71 THEN sr8 = 70 END IF END IF ' licht in funktie van aantal sirenes: FOR i = 1 TO 8 IF ISFALSE sire.ctrl(i) THEN IF ISFALSE sire.ctrl(83 +i) THEN mPlay Sire.channel,83 + i, 127 sire.ctrl(83+i) = %True END IF ELSE IF sire.ctrl(83+i) THEN NoteOff Sire.channel, 83 + i sire.ctrl(83+i) = %False END IF END IF NEXT i ' duim1 gemapt op : 'pitch 48-84 IF ISFALSE (cnt MOD 2) THEN '(1 + (RND(1) * 3))) THEN IF @pHandy.a(5) THEN IF kn THEN mPlay Korn.channel, kn, %False kn = %False END IF i = MAX(@pHandy.a(7),@pHandy.a(8),@pHandy.a(9), @pHandy.a(10) ) i = i/ 4 ' 0-31 kn = i+ 46 mPlay Korn.channel, kn, 110 ELSE IF kn THEN mPlay Korn.channel, kn, %False kn = %False END IF IF wit THEN MM_Korn_Off %MM_Lights wit = %False END IF END IF ELSE IF ISFALSE wit THEN MM_Korn_On %MM_White wit = %True END IF END IF ' duim2 gemapt op de sirene van : IF @pHandy.a(6) THEN IF ISFALSE sp THEN mPlay Springers.channel, 24, 1 sp = %TRue END IF i = MAX(@pHandy.a(1),@pHandy.a(2),@pHandy.a(3), @pHandy.a(4) ) 'mPlay Springers.channel, 24, i ' ? function of i Bend Springers.channel, 0, i ' lsb - msb 'sp = %True ELSE IF sp THEN mPlay Springers.channel, 24, %False Bend Springers.channel, 0, 0 sp = %False END IF END IF ' beide duimen: alle rood licht aan: IF (@pHandy.a(5) > 0) AND (@pHandy.a(6) > 0) THEN IF ISFALSE red THEN MM_AllLightsOn %MM_Red red = %True END IF ELSE IF red THEN MM_AllLightsOff ' no parameter yet... %MM_Red red = %False END IF END IF INCR cnt END SUB SUB Handy_Sire_Stop () MM_Sire_Off MM_Korn_Off MM_Springers_Off END SUB SUB AxVitello 'elke hand op helft van vitello ' x richting -> noot (lineair) ' TO DO y richting: speed ' velo: @ acceleratie, neemt af als zelfde noot herhaald wordt STATIC lnl AS BYTE 'last note STATIC lnr AS BYTE STATIC nxtl AS DWORD 'next time STATIC nxtr AS DWORD STATIC velol AS SINGLE 'single voor integratie STATIC velor AS SINGLE STATIC cc AS DWORD LOCAL n AS BYTE IF ISFALSE cc THEN 'init MM_Vitello_On ProgChange Vitello.channel, 122 lnl = Vitello.HighTes + Vitello.lowtes / 2 lnr = lnl END IF INCR cc CONTROL SET TEXT gh.cockpit, %GMT_MSG1, STR$(cc) + STR$(nxtl) + STR$(nxtr) 'left n = (Vitello.HighTes + Vitello.LowTes) / 2 - (vitello.HighTes-Vitello.LowTes) * (@pAxe3.tiltlx + 1) / 4 IF (cc >= nxtl) OR (MAX(ABS(@pAxe3.Acclx), ABS(@pAxe3.accly))>1)THEN ' OR (n <> lnl) THEN '.9 wordt soms bereikt als je de sensor schuin houdt zonder veel te bewegen.. 'new next time @ tiltly nxtl = cc + MAX(20, 15 * (1 + (1-MIN(1, ABS(@pAxe3.tiltly)))^2 * 10)) '+ MAX(15, 180 - SQR(ABS(@pAxe3.tiltly)) * 165) ' 40 'IIF(@pAxe3.tiltly > 0, cc + 200 - 190 * @pAxe3.tiltly, cc + 20) logfile "new nextl" + STR$(nxtl) + " @" + STR$(cc) + " -tilt:" + STR$(@pAxe3.tiltly) IF (n <> lnl) OR (ABS(@pAxe3.Tiltly) > 0.1) THEN 'geen tilt = geen klank, kleine tilt en nieuwe noot = klank, grote tilte = altijd klank velol = IIF(lnl = n, MAX(14, velol * .9), MAX(1, ABS(@pAxe3.acclx), ABS(@pAxe3.accly)) * 16) 'msch kunnen we de ax hiervoor beter leakymaxen? ' IF ISFALSE cc MOD 100 THEN velol = (velol + 120) / 2 lnl = n mPlay Vitello.channel, n, velol logfile "play. tiltlx, ly:" +STR$(@pAxe3.tiltlx) + STR$(@pAxe3.Tiltly) +" - velo:" + STR$(velol) CONTROL SET TEXT gh.cockpit, %GMT_MSG2, "L" + STR$(n) + STR$(velol) + STR$(@pAxe3.tiltlx)+ STR$(@pAxe3.acclx) + STR$(@pAxe3.accly) ELSE logfile "don't play. tiltlx=" + STR$(@pAxe3.tiltlx) END IF END IF IF @pAxe3.tiltlx > 2.5 THEN mPlay Vitello.channel, 44, velol IF @pAxe3.tiltly > 2.5 THEN mPlay Vitello.channel, 45, velol 'right n = (Vitello.HighTes + Vitello.LowTes) / 2 + (vitello.HighTes-Vitello.LowTes) * (@pAxe3.tiltrx + 1) / 4 IF (cc >= nxtr) OR (MAX(ABS(@pAxe3.Accrx), ABS(@pAxe3.accry))>1) THEN 'OR (n <> lnr) THEN logfile "Acc's" + STR$(@pAxe3.Accrx) + STR$(@pAxe3.accry) 'new next time @ tiltly nxtr = cc + MAX(20, 15 * (1 + (1-MIN(1,ABS(@pAxe3.tiltry)))^2 * 10)) ' cc + MAX(15, 180 - SQR(ABS(@pAxe3.tiltry)) * 165) ' 40 'IIF(@pAxe3.tiltly > 0, cc + 200 - 190 * @pAxe3.tiltly, cc + 20) logfile "new nextr" + STR$(nxtr) + " @" + STR$(cc) + " -tilt:" + STR$(@pAxe3.tiltry) IF (n <> lnr) OR (ABS(@pAxe3.Tiltry) > 0.1) THEN 'geen tilt = geen klank, kleine tilt en nieuwe noot = klank, grote tilte = altijd klank velor = IIF(lnr = n, MAX(14, velor * .9), MAX(.25, ABS(@pAxe3.accrx), ABS(@pAxe3.accry)) * 20) 'msch kunnen we de ax hiervoor beter leakymaxen? ' IF ISFALSE cc MOD 100 THEN velor = (velor + 120) / 2 lnr = n mPlay Vitello.channel, n, velor logfile "play. tiltrx, ry:" +STR$(@pAxe3.tiltrx) + STR$(@pAxe3.Tiltry) +" - velo:" + STR$(velor) CONTROL SET TEXT gh.cockpit, %GMT_MSG2, "R" + STR$(n) + STR$(velor) + STR$(@pAxe3.tiltrx)+ STR$(@pAxe3.accrx) + STR$(@pAxe3.accry) ELSE logfile "don't play. tiltrx=" + STR$(@pAxe3.tiltrx) END IF END IF IF @pAxe3.tiltrx > 2.5 THEN mPlay Vitello.channel, 46, velor IF @pAxe3.tiltry > 2.5 THEN mPlay Vitello.channel, 47, velor END SUB