' *********************************************************** ' * * ' * QUAD RADAR * ' * Microwave radar invisible instrument implementation * ' * Prof.dr.Godfried-Willem Raes * ' *********************************************************** ' new type added: RadarType ' Type for microwave radar devices, see g_type.inc (cfr. Quadrada) ' All data acquisition is now in g_nih.dll ($g_h_dll) ' 13.02.2003: First public try out of Study nr. 1 using 64S/s ['Slow et Ruhig'] ' 15.02.2003: System changed to operate on 128S/s, for movement speed up to 4m/s. ' 21.02.2003: position determination debugged o.k. new radar screen proc. works. ' 24.02.2003: radar-type changed: now includes coordinate data. ' 03.03.2003: further refining performed. ' 07.03.2003: Premiere of 'Catpaws' - Enschede. Moniek Darge ' 09.03.2003: new math implemented. ' 11.03.2003: rehearsal session ' 13.03.2003: premiere 'Wandering quadrada space' ' 16.03.2003: speed calculation changed. ' 21.03.2003: surface calculation changed. ' 23.03.2003: Hardware changed so the output is now 20dB higher. This was done to overcome the ' problems NiDAQ has with DC offsets when using higher gains. ' 24.03.2003: Wandering to be checked again after changes in dll. ' 30-31.03.2003: extensive testing and demo: ' 01.04.2003: code speeded up in radar callback. Old code sections, unused or rejected, removed from dll. ' 03.04.2003: performance of 'Wandering Quadrada Space', HAM at Logos Tetrahedron ' 09.04.2003: performance by Emilie De Vlam ' 18.08.2003: Support for added. ' 21.08.2003: new performance of 'Wandering Quadrada Space', at Logos Tetrahedron ' 19.09.2003: display monitor code moved to g_h.dll ' 20.09.2003: control interface moved to g_main.inc (in g_lib.dll) ' 24.09.2003: measurement results for ranges added in comments of procedure Quadradar_monitorall. ' with default init settings for parameters. ' Wandering Quadrada space becomes a section in Technofaustus, so we copied the code in there. ' 07.10.2003: Wandering Quadrada Space can now become another piece. ' 15.10.2003: Wandering changed: less clusters than in Faust version. Also, here we have a fixed and ' longer duration. ' 14.03.2004: Puff added. - radar 0 ' 15.03.2004: Vibi + a bit of Belly added - radar 3 ' 17.03.2004: stop code for puff added. ' 22.03.2004: Radars A and D: 150 Ohm resistors added in series with outputs to prevent cable oscillations. ' 23.03.2004: first try out of Quadrada Vectorial ' 24.03.2004: further improvements added in Quadrada Vectorial ' 17.04.2004: code revision. Vectorial 2. ' 20.04.2004: second try out with Vectorial code. ' 13.07.2004: to be added: support for trump and hurdy ' 17.07.2004: Trump added. Hurdy start implementation. ' 06.11.2004: adapted to g_mm.inc ' 19.03.2005: checked again after changes and new compiler. Seems working and o.k. ' 21.03.2005: Vectors added for Harma/Ake and Llor/Belly. To do: Troms, Flex, Rotomoton, Springers, Sire ' 11.04.2005: Llor mapping function added. ' 14.04.2005: Quadrada Vectorial performance with Nicoletta Branchini ' 13.04.2005: Start coding for "Wet" (using new dripper) , study #10 ' 02.11.2005: coding for "Wet" finished. To be tested. ' start coding for Vacca.#11 ' 05.11.2005: rehearsal session Qua Vacca with Marian De Schryver. ' to do: Quadrada implementation for ' 24.04.2006: added : Quadrada Study #12 ' 15.09.2006: code adapted to new belly hardware. ' 11.01.2007: to do: add Bako,Rotomoton ' 14.01.2007: Xy added - Study # 13 ' Qt added - Study # 14 ' Puff, Xy and Qt can be played together they are mapped on different vectors. ' 09.05.2007: Casta Uno en Casta Due added. Study #15 ' 13.09.2007: Start adding study #16: Rotomoton "Rotom" Quadrada Study #16 ' 02.09.2008: Now compiles under PBWin 9.0 Toypi code to be written ' 17.04.2009: rehearsal of Catpaws with Angela Rawlings ' 19.04.2009: Harma added in vector4 task of quadrada vectorial, for Angela. ' 03.05.2009: Quadra-Korn coding added. ' 03.06.2009: $g_h_dll contant added. '#IF NOT %DEF($g_h_dll) ' #IF %DEF(%NiDAQ) ' $g_h_dll = "g_nih.dll" ' #ELSEIF %DEF(%g_NiDAQmx) ' $g_h_dll = "g_nxh.dll" ' #ELSE ' $g_h_dll = "g_noh.dll" ' #ENDIF '#ENDIF ' 07.06.2009: adapted to use NiDAQmx hardware and software. ' 08.06.2009: seems running on \\No %QuadRadar_Monitor0 = 1 ' 0 and 3 do display and VU in dll %Quadradar_Monitor1 = 2 ' 4 = noise control task %Quadradar_Monitor2 = 5 %Quadradar_Monitor3 = 6 ' 7 - time, 8 = MT speed , 9 = Promil ' 10-11 are free now %Quadradar_MonitorAll = 12 %Quadradar_Checkrange = 13 %Quadradar_TestParams = 14 ' Musical application code: %Quadra_Korn = 18 ' 03.05.2009 ' Quadrada Vectors = Quadrada Study #5 -------------------------------------------- ' This study does not require a square setup of the radar sensors. ' The study can be started by clicking any of the four playing tasks. ' The common vektor task will be activated automatically. %QuadRadar_Test0 = 32 ' puff %Quadradar_test1 = 33 ' thunderwood %Quadradar_Test2 = 34 ' piano, humanola, trump %Quadradar_Test3 = 35 ' vibi, belly, hurdy %Quadradar_Vectors = 36 ' plays bourdonola, piperola, So '------------------------------------------------------------------------------------ ' Quadrada Vectorial Study #8 %QuadrAke = 38 ' "QuAke" #8 - 2005 Ake & Harma %QuadraLlor = 39 ' "Qua Llor" #9 - 2005 Llor & Belly '----------------------------------------------------------------------------------- ' Quadrada Study Nr.10: "Wet" %QuaWet = 40 ' Quadrada Study Nr.15: "Qua Casta" %QuaCasta = 41 ' Quadrada Study Nr.16: "Qua Rotom" %Qua_Roto = 42 ' Quadrada Study Nr.17: "Qua Simba" %Qua_Simba = 43 ' to be written still %Qua_Toypi = 44 ' to be written still !!! ' Quadrada Study Nr.1: "Slow et Ruhig" %Quadrada_1 = 48 ' study nr. 1 - voice 1: player piano %Quadrada_2 = 49 ' - voice 2: bourdonola, vibi, piperola %Quadra_Xy = 50 %Quadra_Qt = 51 %Quadra_1 = 53 ' study nr. 3 - square setup "CatPaws" [kattepoten] ' uses: piano '----------------------------------------------------------------------------------- ' copied to technofaustus (code starting point for 'Wandern', became a different piece!): %Quadra_2 = 54 ' study #4 - "Wandering Quadrada Space" ' uses: Piperola, Humanola, Sax, Harma, Springers, Bourdonola, Troms, ThunderWood, Klung, Vibi ' So %Wander_Harma = %Quadra_2 + 1 ' 55 Harma task for Wandering Quadrada Space %Wander_Human = %Quadra_2 + 2 ' 56 Vox Humanola task for Wandering Quadrada Space %Wander_Piper = %Quadra_2 + 3 ' 57 %Wander_Bourd = %Quadra_2 + 4 ' 58 %Wander_Trio = %Quadra_2 + 5 ' 59 '----------------------------------------------------------------------------------- ' Quadrada Study Nr.11: "Qua Vacca" - 11.2005 %Quadra_Vacca = 60 '----------------------------------------------------------------------------------- ' Quadrada Study Nr.6: "Qua Puff" %Quadra_Puff = 61 '----------------------------------------------------------------------------------- ' Quadrada Study Nr.7: "Qua Vibi" %Quadra_Vibi = 62 ' Quadrada Study #12: "Qua Vitello" - 24.04.2006 %Quadra_Vitello = 63 TYPE quadradar_vectors DWORD spekfak AS SINGLE ' 0.1 - 2 snelheid AS SINGLE ' from radars body AS SINGLE ' from radars - integrated! tempo AS DWORD ' 30 - 280 - from slider okt AS DWORD ' octave position for note tc AS DWORD ' mod 12 value noteF AS SINGLE ' fractional note! noteQ AS SINGLE ' quartertone noteI AS INTEGER ' integer note END TYPE GLOBAL pr() AS RadarType PTR GLOBAL qvek AS Quadradar_Vectors DECLARE FUNCTION Quadradar_Init () AS DWORD ' Quadrada Vectors: ' premiered 23.02.2004 DECLARE SUB QuadRadar_Test0() ' 32 study for Puff DECLARE SUB Quadradar_Puff_Stop () DECLARE SUB QuadRadar_Test1() ' study for Klung and Tubi DECLARE SUB QuadRadar_Test2() ' study for Piano, Vox Humanola , Trump DECLARE SUB QuadRadar_Test3() ' study for Vibi and some Belly and Hurdy DECLARE SUB Quadradar_Vek () ' global params for above. DECLARE SUB Quadradar_Vek_Stop () DECLARE FUNCTION speed2tempofaktor (BYVAL vector AS LONG) AS SINGLE ' ----------------- DECLARE SUB QuadRadar_Monitor0 () ' A DECLARE SUB QuadRadar_Monitor1 () ' B DECLARE SUB QuadRadar_Monitor2 () ' C DECLARE SUB QuadRadar_Monitor3 () ' D DECLARE SUB QuadRadar_MonitorAll () DECLARE SUB Quadradar_TestParams () DECLARE SUB QuadRadar_ReMapCockpitButtons () DECLARE SUB Quadradar_ButnSWHandler () DECLARE SUB QuadRadar_ButnOSHandler () DECLARE SUB Quadrada_1 () ' #1: "Slow et Ruhig" DECLARE SUB Quadrada_2 () DECLARE SUB Quadra_1 () ' #2: "CatPaws" ' copied and modified in Technofaustus, this is the original version. DECLARE SUB Quadra_2 () ' #4: "Wandering quadrada space" DECLARE SUB Wander_Stop () DECLARE SUB Wander_Harma () DECLARE SUB Wander_Human () DECLARE SUB Wander_Piper () DECLARE SUB Wander_Bourd () DECLARE SUB Wander_Trio () ' end copy DECLARE SUB Quadra_Puff () DECLARE SUB Quadra_Vibi () DECLARE SUB QuadrAke () ' Ake and Harma - 21.03.2005 DECLARE SUB QuadrAke_Stop () DECLARE SUB QuadraLlor () ' Llor and Belly - 21.03.2005 DECLARE SUB QuadraWet () ' Dripper - 13.04.2005 / 02.11.2005 DECLARE SUB Quadra_Vacca () ' 02.11.2005 DECLARE SUB Quadra_Vitello () ' 24.04.2006 DECLARE SUB Quadra_Xy () ' 14.04.2007 DECLARE SUB Quadra_Qt () ' 14.04.2007 DECLARE SUB Quadra_Casta () ' 09.05.2007 #15 DECLARE SUB Quadra_Rotomoton () ' 13.09.2007 #16 ' to do: DECLARE SUB Quadra_Simba () ' to be written still DECLARE SUB Quadra_Korn () ' started coding 03.05.2009 ' following removed 07.06.2009: 'DECLARE FUNCTION Calibrate_E_Series_dummy(BYVAL a%, BYVAL b&, BYVAL c&, BYVAL d#) AS INTEGER 'dummy for call dword FUNCTION QuadRadar_Init () AS DWORD LOCAL CockpitLayo AS CockpitLabels LOCAL m AS ASCIIZ * 40 LOCAL i AS DWORD LOCAL j AS DWORD LOCAL p AS DWORD LOCAL cptr AS DWORD DIM pr(4) AS GLOBAL RadarType PTR IF App.id <> %ID_QUADRADAR THEN MSGBOX "Initialisation error: wrong app.id",,FUNCNAME$ EXIT FUNCTION END IF IF ISFALSE DAQparams.id THEN MSGBOX "You must select a DAQ device for this composition",, FUNCNAME$ FUNCTION = %False EXIT FUNCTION END IF DAQparams.mode = %DAQ_NI FOR i = 0 TO 4 'p = GetRadarPointer (i) ' in g_nih.dll cptr = GetPRocAddress(gh.gnh, "GETRADARPOINTER") CALL DWORD cptr USING GetRadarPointer(i) TO p pr(i) = p ' set noise level: @pr(i).noise = 3 ' changable with sliders in GUI param window. '@pr(i).dt = 32 ' integration window, in number of samples. (determines responsiveness) ' with the zerocross procedure, it sets the number of below noise samples before a global zero input is ' returned: @pr(i).dt = 4 ' can be changed with upper right Up Down control @pr(i).sfakt = 2 ' divisor for surface value in dll. - changable with second UD/ control @pr(i).dta = 15 ' integration time for slow amplitudes used for position determination with %Zerocross algo ' set params for data acquisition & math: ' @pr(i).params can be: %SIGNCHANGE, %DFT, %ZeroCross, %DFT ,%IsolWave, %ISOLPERIOD @pr(i).params = %ZEROCROSS ' new version 28.03.2003 @pr(i).setup = %SQUARE NEXT i ReadCockpitLabelsFromFile $QuadradaIni, CockpitLayo Task(%Radar_VU_Task).naam = "" ' 1 Task(%Radar_VU_Task).cPtr = GetProcAddress(gh.gnh,"RADAR_II_VU") ' in g_nih.dll Task(%Radar_VU_Task).freq = 16 Task(%Radar_VU_Task).flags = %DLL_TASK OR %PERTIM_TASK Task(%Radar_VU_Task).patch = %False ' used to display different param displays. Task(%Radar_Display_Task).naam = "" ' 2 Task(%Radar_Display_Task).cPtr = GetProcAddress(gh.gnh,"RADAR_DISPLAY") ' now in g_nih.dll Task(%Radar_Display_Task).freq = 16 ' set in DLL. Task(%Radar_Display_Task).flags = %DLL_TASK OR %PERTIM_TASK Task(%Radar_Display_Task).patch = %False ' used to switch between place and wave displays for all channels ' for numbers 1 to 8. Task(App.WriteSeqScoreTaskNr).cptr = %False Task(App.WriteSeqScoreTaskNr).naam = "" ' individual vektors: placement is irrelevant. No cosine corrections used in coding. Task(%Quadradar_test0).naam = "0=Puff" ' Vektor A: single transducer Task(%Quadradar_test0).cptr = CODEPTR(QuadRadar_Test0) ' puff Task(%QuadRadar_test0).freq = 4 TaskEX(%Quadradar_test0).StopCptr = CODEPTR(MM_Puff_Off) Task(%Quadradar_test1).naam = "1=Tubi" ' Vektor B tubi, klung, thunderwood Task(%Quadradar_test1).cptr = CODEPTR(QuadRadar_Test1) Task(%QuadRadar_test1).freq = 4 Task(%Quadradar_test2).naam = "2=Piano" ' Vektor C piano, humanola, trump Task(%Quadradar_test2).cptr = CODEPTR(QuadRadar_Test2) Task(%QuadRadar_test2).freq = 4 Task(%Quadradar_test3).naam = "3=Vibi" ' Vektor D vibi, autosax, belly Task(%Quadradar_test3).cptr = CODEPTR(QuadRadar_Test3) Task(%QuadRadar_test3).freq = 4 Task(%QuadrAke).naam = "1=Ak-Ha" ' Vektor A ake, harma Task(%QuadrAke).cptr = CODEPTR(QuadrAke) Task(%QuadrAke).freq = 2 TaskEx(%QuadrAke).stopcptr = CODEPTR(QuadRake_Stop) Task(%QuadraLlor).naam = "2=Ll-Bel" ' Vektor B Llor, Belly Task(%QuadraLlor).cptr = CODEPTR(QuadraLlor) Task(%QuadraLlor).freq = 4 TaskEx(%QuadraLlor).stopcptr = CODEPTR(MM_Llor_Off) Task(%Quadradar_Vectors).naam = "Vectors" Task(%Quadradar_Vectors).cptr = CODEPTR(Quadradar_Vek) Task(%Quadradar_Vectors).freq = 4 TaskEX(%Quadradar_Vectors).stopcptr = CODEPTR(Quadradar_Vek_Stop) '----------------------------------------------------------------------------------- Task(%QuadRadar_Monitor0).naam = "monitor0" Task(%QuadRadar_monitor0).cptr = CODEPTR(QuadRadar_Monitor0) Task(%QuadRadar_monitor0).freq = 8 Task(%QuadRadar_Monitor1).naam = "monitor1" Task(%QuadRadar_monitor1).cptr = CODEPTR(QuadRadar_Monitor1) Task(%QuadRadar_monitor1).freq = 8 Task(%QuadRadar_Monitor2).naam = "monitor2" Task(%QuadRadar_monitor2).cptr = CODEPTR(QuadRadar_Monitor2) Task(%QuadRadar_monitor2).freq = 8 Task(%QuadRadar_Monitor3).naam = "monitor3" Task(%QuadRadar_monitor3).cptr = CODEPTR(QuadRadar_Monitor3) Task(%QuadRadar_monitor3).freq = 8 Task(%QuadRadar_MonitorAll).naam = "moni-All" Task(%QuadRadar_monitorAll).cptr = CODEPTR(QuadRadar_MonitorAll) Task(%QuadRadar_monitorAll).freq = 8 Task(%QuadRadar_Checkrange).naam = "range" Task(%QuadRadar_checkrange).cptr = CODEPTR(QuadRadar_Checkrange) Task(%QuadRadar_checkrange).freq = 16 Task(%Quadradar_Testparams).naam = "params" Task(%Quadradar_Testparams).freq = 4 Task(%Quadradar_Testparams).cptr= CODEPTR(QuadRadar_TestParams) Task(%Quadrada_1).naam = "Study 1x" ' single transducer Task(%Quadrada_1).cptr = CODEPTR(Quadrada_1) Task(%Quadrada_1).freq = 6 Task(%Quadrada_2).naam = "Study 1y" Task(%Quadrada_2).cptr = CODEPTR(Quadrada_2) Task(%Quadrada_2).freq = 6 Task(%Quadra_1).naam = "CatPaws" ' needs square setup Task(%Quadra_1).cptr = CODEPTR(Quadra_1) Task(%Quadra_1).freq = 7 ' "Wandering Quadrada Space": Task(%Quadra_2).naam = "Wander" Task(%Quadra_2).cptr = CODEPTR(Quadra_2) Task(%Quadra_2).freq = 20 TaskEX(%Quadra_2).StopCptr = CODEPTR(Wander_Stop) Task(%Wander_Harma).cptr = CODEPTR(Wander_Harma) Task(%Wander_Harma).freq = 3 Task(%Wander_Harma).naam = "Wan_Har" Task(%Wander_Human).cptr = CODEPTR(Wander_Human) Task(%Wander_Human).freq = 4 Task(%Wander_Human).naam = "Wan_Hum" Task(%Wander_Piper).cptr = CODEPTR(Wander_Piper) Task(%Wander_Piper).freq = 5 Task(%Wander_Piper).naam = "Wan_Pip" Task(%Wander_Bourd).cptr = CODEPTR(Wander_Bourd) Task(%Wander_Bourd).freq = 6 Task(%Wander_Bourd).naam = "Wan_Bou" Task(%Wander_Trio).cptr = CODEPTR(Wander_Trio) Task(%Wander_Trio).freq = 6 Task(%Wander_Trio).naam = "Wan_3Oh" ' end wandering tasks. Task(%Quadra_Puff).cptr = CODEPTR(Quadra_Puff) Task(%Quadra_Puff).freq = 4 Task(%Quadra_Puff).naam = "" TaskEX(%Quadra_Puff).stopcptr = CODEPTR(MM_Puff_Off) 'Quadradar_Puff_Stop) Task(%Quadra_Vibi).cptr = CODEPTR(Quadra_Vibi) Task(%Quadra_Vibi).freq = 4 Task(%Quadra_Vibi).naam = "" Task(%QuaWet).cptr = CODEPTR(QuadraWet) Task(%QuaWet).freq = 20 Task(%QuaWet).naam = "Wet" Task(%Quadra_Vacca).cptr = CODEPTR(Quadra_Vacca) Task(%Quadra_Vacca).freq = 12 Task(%Quadra_Vacca).naam = "" Task(%Quadra_Vitello).cptr = CODEPTR(Quadra_Vitello) Task(%Quadra_Vitello).freq = 12 Task(%Quadra_Vitello).naam = "" TaskEX(%Quadra_Vitello).startcptr = CODEPTR(MM_VItello_ON) TaskEX(%Quadra_Vitello).stopcptr = CODEPTR(MM_Vitello_Off) Task(%Quadra_Xy).cptr = CODEPTR(Quadra_Xy) Task(%Quadra_Xy).freq = 12 Task(%Quadra_Xy).naam = "" TaskEX(%Quadra_Xy).startcptr = CODEPTR(MM_Xy_ON) TaskEX(%Quadra_Xy).stopcptr = CODEPTR(MM_Xy_Off) Task(%Quadra_Qt).cptr = CODEPTR(Quadra_Qt) Task(%Quadra_Qt).freq = 12 Task(%Quadra_Qt).naam = "" TaskEX(%Quadra_Qt).startcptr = CODEPTR(MM_Qt_ON) TaskEX(%Quadra_Qt).stopcptr = CODEPTR(MM_Qt_Off) Task(%QuaCasta).cptr = CODEPTR(Quadra_Casta) Task(%QuaCasta).freq = 12 Task(%QuaCasta).naam = "" TaskEX(%QuaCasta).startcptr = CODEPTR(MM_Casta_ON) TaskEX(%QuaCasta).stopcptr = CODEPTR(MM_Casta_Off) Task(%Qua_Roto).cptr = CODEPTR(Quadra_Rotomoton) Task(%Qua_Roto).freq = 12 Task(%Qua_Roto).naam = "" TaskEX(%Qua_Roto).startcptr = CODEPTR(MM_Rotomoton_ON) TaskEX(%Qua_Roto).stopcptr = CODEPTR(MM_Rotomoton_Off) Task(%Quadra_Korn).naam = "" Task(%Quadra_Korn).cptr = CODEPTR(Quadra_Korn) Task(%Quadra_Korn).freq = 24 IF CheckConditions (app, hMidiI(), hMidiO()) THEN ' for later... END IF Daqparams.channel = %DAQ_RADAR ' stop DAQ task in dll cptr = GetProcAddress(gh.gnh, "RADAR_DAQ") CALL DWORD cptr USING Radar_DAQ(%false) ' override settings from InitGlobalVariables in main module: App.GlobalHarmonyTaskNr = 15 ' FOR i = 0 TO UBOUND(Task) ' IF ISFALSE Task(i).flags AND %DLL_TASK THEN ' IF i > 15 THEN Task(i).flags = Task(i).flags OR %MIDI_TASK ' IF i > App.GlobalHarmonyTaskNr THEN Task(i).flags = Task(i).flags OR %HARM_TASK ' END IF ' NEXT i ' adapt the functions of the buttons in the cockpit & reorients the button handler QuadRadar_RemapCockpitButtons ' the finalisation of the new cockpit will be handled in UpdateCockpit. ' switch off the flag for auto-patching: BIT RESET App.AutoFlags, 0 ' RESETs bit 0 (%AUTOPATCH) ' this suppresses automatic sending of program-change msg's m = "" SendMessage gh.Cockpit, %WM_SETTEXT,0, VARPTR(m) ' DAQparams.samplingrate(0) = 128 ' should be set in the dll... SetDlgItemText gh.Cockpit, %GMT_TEXT_SR, STR$(DAQparams.samplingrate(0),3) ' + "S/s" Init_MM ' 20.11.2004: MM_PanicButtonWindow ' 20.09.2003: create a GUI user controll window for all relevant radar params: Create_Radar_Control_Task (BYVAL pr(0), Slider(),UDCtrl()) ' in g_main.inc !!! (g_lib.dll) SetDlgItemText gh.Cockpit, %GMT_TITLE, "" SetDlgItemText gh.Cockpit, %GMT_AUTHOR, $gwr FUNCTION = %True END FUNCTION SUB Quadradar_Monitor0 () 'SetDlgItemText gh.Cockpit, %GMT_MSG1, "faze=" & STR$(@pr(0).phase,3) & " xt=" & STR$(@pr(0).xt,3) & " yt=" & STR$(@pr(0).yt,3) SetDlgItemText gh.Cockpit, %GMT_MSG1, "s=" & FORMAT$(@pr(0).s,"###.#") & " l=" & FORMAT$(@pr(0).l,"#.##") '& " ly=" & format$(@pr(0).ly,"#.##") SetDlgItemText gh.Cockpit, %GMT_MSG2, " amp=" & FORMAT$(@pr(0).amp,"####") & " xf=" & FORMAT$(@pr(0).xf,"###") & " vf=" & FORMAT$(@pr(0).vf,"###") END SUB SUB Quadradar_Monitor1 () 'SetDlgItemText gh.Cockpit, %GMT_MSG1, "faze=" & STR$(@pr(0).phase,3) & " xt=" & STR$(@pr(0).xt,3) & " yt=" & STR$(@pr(0).yt,3) SetDlgItemText gh.Cockpit, %GMT_MSG1, "s=" & FORMAT$(@pr(1).s,"###.#") & " l=" & FORMAT$(@pr(1).l,"#.##") '& " ly=" & format$(@pr(1).ly,"#.##") SetDlgItemText gh.Cockpit, %GMT_MSG2, " amp=" & FORMAT$(@pr(1).amp,"####") & " xf=" & FORMAT$(@pr(1).xf,"###") & " vf=" & FORMAT$(@pr(1).vf,"###") END SUB SUB Quadradar_Monitor2 () 'SetDlgItemText gh.Cockpit, %GMT_MSG1, "faze=" & STR$(@pr(0).phase,3) & " xt=" & STR$(@pr(0).xt,3) & " yt=" & STR$(@pr(0).yt,3) SetDlgItemText gh.Cockpit, %GMT_MSG1, "s=" & FORMAT$(@pr(2).s,"###.#") & " l=" & FORMAT$(@pr(2).l,"#.##") '& " ly=" & format$(@pr(2).ly,"#.##") SetDlgItemText gh.Cockpit, %GMT_MSG2, " amp=" & FORMAT$(@pr(2).amp,"####") & " xf=" & FORMAT$(@pr(2).xf,"###") & " vf=" & FORMAT$(@pr(2).vf,"###") END SUB SUB Quadradar_Monitor3 () 'SetDlgItemText gh.Cockpit, %GMT_MSG1, "faze=" & STR$(@pr(0).phase,3) & " xt=" & STR$(@pr(0).xt,3) & " yt=" & STR$(@pr(0).yt,3) SetDlgItemText gh.Cockpit, %GMT_MSG1, "s=" & FORMAT$(@pr(3).s,"###.#") & " l=" & FORMAT$(@pr(3).l,"#.##") '& " ly=" & format$(@pr(3).ly,"#.##") SetDlgItemText gh.Cockpit, %GMT_MSG2, " amp=" & FORMAT$(@pr(3).amp,"####") & " xf=" & FORMAT$(@pr(3).xf,"###") & " vf=" & FORMAT$(@pr(3).vf,"###") END SUB SUB Quadradar_MonitorAll () SetDlgItemText gh.Cockpit, %GMT_MSG1, "speed=" & FORMAT$(@pr(4).v,"###.#") & " body=" & FORMAT$(@pr(4).s,"###")& " acc=" & FORMAT$(@pr(4).acc,"#.###") ' SetDlgItemText gh.Cockpit, %GMT_MSG2, " x=" & STR$(x,3) & " y=" & STR$(y,3) & " ang=" & STR$(a,3) SetDlgItemText gh.Cockpit, %GMT_MSG2, "fastv=" & FORMAT$(@pr(4).vf,"###") & " facc=" & FORMAT$(@pr(4).acf,"#.###") END SUB SUB Quadradar_Checkrange () ' test for effective used range on ADC inputs - only required for development of the hardware. ' 24.09.2003 returns 518 for all 4 channels, with size in a square of ca. 4 meters side. ' this reduces our potential resolution to 10 bits IF ISFALSE Task(%Quadradar_Checkrange).tog THEN STATIC m1 AS DWORD STATIC m2 AS DWORD STATIC m3 AS DWORD STATIC m4 AS DWORD m1 = %False m2 = %False m3 = %false m4 = %False Task(%Quadradar_Checkrange).tog = %True END IF DIM b(255) AS LOCAL INTEGER AT (@pr(0).pxbuf) m1 = MAX(ABS(b(255)),m1) DIM b(255) AS LOCAL INTEGER AT (@pr(0).pybuf) m1 = MAX(ABS(b(255)),m1) DIM b(255) AS LOCAL INTEGER AT (@pr(1).pxbuf) m2 = MAX(ABS(b(255)),m2) DIM b(255) AS LOCAL INTEGER AT (@pr(1).pybuf) m2 = MAX(ABS(b(255)),m2) DIM b(255) AS LOCAL INTEGER AT (@pr(2).pxbuf) m3 = MAX(ABS(b(255)),m3) DIM b(255) AS LOCAL INTEGER AT (@pr(2).pybuf) m3 = MAX(ABS(b(255)),m3) DIM b(255) AS LOCAL INTEGER AT (@pr(3).pxbuf) m4 = MAX(ABS(b(255)),m4) DIM b(255) AS LOCAL INTEGER AT (@pr(3).pybuf) m4 = MAX(ABS(b(255)),m4) SetDlgItemText gh.Cockpit, %GMT_MSG1, "max1=" & STR$(m1,4) & " max2=" & STR$(m2,4) SetDlgItemText gh.Cockpit, %GMT_MSG2, "max3=" & STR$(m3,4) & " max4=" & STR$(m4,4) ' at 12 bit bipolar, overflow will be >= 2047 END SUB SUB Quadradar_TestParams () IF ISFALSE Task(%Quadradar_TestParams).tog THEN STATIC m1 AS SINGLE STATIC m2 AS SINGLE STATIC m3 AS SINGLE STATIC m4 AS SINGLE STATIC m5 AS SINGLE STATIC m6 AS SINGLE STATIC m7 AS SINGLE m1 = %False m2 = %False m3 = %false m4 = %False m5 = %False m6 = %False m7 = %False Task(%Quadradar_TestParams).tog = %True END IF ' measured 24.09.2003 - gwr dressed naked ' conditions: square setup, sides 350cm m1 = MIN(@pr(0).acc, @pr(1).acc, @pr(2).acc, @pr(3).acc, @pr(4).acc,m1) ' smallest acceleration = -14.4 -20.8 m2 = MAX(@pr(0).acc, @pr(1).acc, @pr(2).acc, @pr(3).acc, @pr(4).acc,m2) ' largest acceleration = +8.8 +8.8 m3 = MAX(@pr(0).vf, @pr(1).vf, @pr(2).vf, @pr(3).vf, @pr(4).vf,m3) ' largest fast speed: limit = 46 64 m4 = MAX(@pr(0).s, @pr(1).s, @pr(2).s, @pr(3).s, @pr(4).s,m4) ' largest surface = 152 154 m5 = MAX(@pr(0).v, @pr(1).v, @pr(2).v, @pr(3).v, @pr(4).v,m5) ' largest slow speed = 17.1 17.1 m6 = MIN(@pr(0).acf, @pr(1).acf, @pr(2).acf, @pr(3).acf, @pr(4).acf,m6) ' smallest fast acceleration= -35.6 -78.9 m7 = MAX(@pr(0).acf, @pr(1).acf, @pr(2).acf, @pr(3).acf, @pr(4).acf,m7) ' largest fast acceleration = +27.2 +30.5 SetDlgItemText gh.Cockpit, %GMT_MSG1, "acc-=" & FORMAT$(m1,"##.#") & " acc+=" & FORMAT$(m2,"##.#") & " acf-=" & FORMAT$(m6,"##.#") & " acf+=" & FORMAT$(m7,"##.#") SetDlgItemText gh.Cockpit, %GMT_MSG2, "vfmax=" & FORMAT$(m3,"###") & " smax=" & FORMAT$(m4,"###") & " svmax=" & FORMAT$(m5,"##.#") END SUB SUB Quadradar_Vek () ' Study #5: "Quadrada Vectorial" - no setup requirements. ' works in connection with %Quadradar_test0 to %Quadradar_test3 ' uses cockpit sliders. ' So implementation adapted 13.09.2007. ' checked with angela rawlings 17.04.2009 LOCAL cnt AS DWORD STATIC k AS DWORD STATIC oldnote AS INTEGER STATIC oldsonote AS INTEGER STATIC oldpipnote AS INTEGER STATIC IntegratedSpeed AS SINGLE STATIC IntegratedBody AS SINGLE IF ISFALSE Task(%Quadradar_Vectors).tog THEN Task(%Quadradar_Vectors).freq = 4 SetDlgItemText gh.Cockpit, %GMT_TITLE, "" 'SetDlgItemText gh.Cockpit, %GMT_AUTHOR, $gwr 'SetDlgItemText gh.Cockpit, %GMT_TEMPO_ID, STR$(App.tempo) '%GMT_TEXT_SLIDER0= %GMT_TEXT0_ID + 14 '%GMT_TEXT_SLIDER1= %GMT_TEXT0_ID + 15 SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER0, "Spekfak" SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER1, "MM" IntegratedSpeed = 0 IntegratedBody = 0 qvek.body = 0 MM_So_On MM_Piperola_On MM_Bourdonola_On MM_Qt_On ' new, 01.05.2009 Piperola.ctrl(10) = 5 Controller Piperola.channel, 10, Piperola.ctrl(10) ' sfz mode. new 06.03.2005 Task(%Quadradar_Vectors).tog = %True END IF ' average movement speed from all sensors active in the piece: 'speed = @pr(0).xf + @pr(0).yf + @pr(1).xf + @pr(1).yf + @pr(2).xf + @pr(2).yf + @pr(3).xf + @pr(3).yf ' better: cnt = %False qvek.snelheid = %False qvek.body = %False IF Task(%Quadradar_test0).swit THEN qvek.snelheid = MAX(@pr(0).xf,@pr(0).yf) qvek.body = @pr(0).amp '@pr(0).s ' 11 bit, integrated over @pr(0).dta time window ' practical range is 0 - 1173 if we move extreme close ' to the radars. Normal values do not exceed 337. INCR cnt END IF IF Task(%Quadradar_test1).swit THEN qvek.snelheid = qvek.snelheid + MAX(@pr(1).xf,@pr(1).yf) qvek.body = qvek.body + @pr(1).amp '@pr(1).s INCR cnt END IF IF Task(%Quadradar_test2).swit THEN qvek.snelheid = qvek.snelheid + MAX(@pr(2).xf,@pr(2).yf) qvek.body = qvek.body + @pr(2).amp '@pr(2).s INCR cnt END IF IF Task(%Quadradar_test3).swit THEN qvek.snelheid = qvek.snelheid + MAX(@pr(3).xf,@pr(3).yf) qvek.body = qvek.body + @pr(3).amp '@pr(3).s INCR cnt END IF ' qvek.snelheid = MAX(@pr(0).xf,@pr(0).yf) + MAX(@pr(1).xf,@pr(1).yf) + MAX(@pr(2).xf,@pr(2).yf)+ MAX(@pr(3).xf,@pr(3).yf) qvek.snelheid = qvek.snelheid / cnt ' 0-64 qvek.body = qvek.body / cnt ' 11 bit, theoretical maximum value. Practical 8-1173 ' for normal movement, we have values rarely exceeding 7bit qvek.body = SQR(qvek.body) * 4 ' scaling ' reduce to 7 bit: ' qvek.body = qvek.body / 16 ' 7 bit qvek.spekfak = (slider(0).value / 128!) * 2 ' 0-2 IF qvek.spekfak < 0.1 THEN qvek.spekfak = 0.1 qvek.tempo = 30 + (slider(1).value * 2) ' MM tempo range 30 to 284 IntegratedSpeed = ((IntegratedSpeed * 11!) + qvek.snelheid) / 12! qvek.noteF = SpectralNoteF (0, IntegratedSpeed, qvek.spekfak, %ExpSpec) ' integration added 24.03.2004 IntegratedBody = ((IntegratedBody * 11!) + qvek.body) / 12! IF oldnote THEN NoteOff Bourdonola.channel, oldnote : oldnote = %False 'qvek.noteI : oldnote = %False IF oldpipnote THEN NoteOff Piperola.channel, oldpipnote : oldpipnote = %False IF ISFALSE cnt THEN EXIT SUB SELECT CASE FRAC(qvek.noteF) CASE < 0.25 qvek.noteQ = FIX(qvek.noteF) qvek.noteI = qvek.noteQ CASE < 0.50 qvek.noteQ = FIX(qvek.noteF) + 0.5! qvek.noteI = FIX(qvek.noteF) CASE > 0.75 qvek.noteQ = FIX(qvek.noteF) + 1 qvek.noteI = qvek.noteQ CASE ELSE qvek.noteQ = FIX(qvek.noteF) + 0.5! qvek.noteI = FIX(qvek.noteF) + 1 END SELECT qvek.okt = qvek.noteI \ 12 qvek.tc = qvek.noteI MOD 12 'Spectralnote (0,qvek.speed, qvek.spekfak) ' mod 12 ? ' for test: IF oldSoNote AND (qvek.noteI <> oldSoNote) THEN NoteOff So.channel, oldSoNote oldsonote = %False END IF IF qvek.noteI >= bourdonola.lowtes THEN IF qvek.noteI <= bourdonola.hightes THEN mplay Bourdonola.channel, qvek.noteI,64 oldnote = qvek.noteI ELSEIF qvek.noteI <= piperola.hightes THEN mPlay piperola.channel, qvek.noteI, MIN(IntegratedBody, 127) ' was 64 - changed 06.03.2005 oldpipnote = qvek.noteI END IF ELSEIF qvek.noteI >= So.lowtes THEN IF IntegratedBody > 10 THEN ' IF ISFALSE So.ctrl(1) THEN ' MM_So_On %MM_Wind ' So.ctrl(1) = %MM_So_Motor ' END IF IF ISFALSE k MOD 4 THEN mPlay So.channel, qvek.noteI, MIN(IntegratedBody, 64) oldsonote = qvek.noteI END IF ELSE IF oldsonote THEN ' this had a note bug - now so.lowtes = 12 NoteOff So.channel, oldsonote oldsonote = %False END IF END IF ELSE IF oldsonote THEN NoteOff So.channel, oldsonote oldsonote = %False END IF END IF INCR k ' for debugging: (finding maximum range for pr().amp: STATIC oldmax AS INTEGER STATIC oldmin AS INTEGER LOCAL amp AS INTEGER ' amp = MAX(@pr(0).amp,@pr(1).amp,@pr(2).amp,@pr(3).amp) ' cannot exceed 1448, practical: <=1173 (24.03.2004) amp = qvek.body IF amp > oldmax THEN 'SetDlgItemText gh.Cockpit, %GMT_MSG1, "amp0=" & FORMAT$(@pr(0).amp,"####") & " amp1=" & FORMAT$(@pr(1).amp,"####") 'SetDlgItemText gh.Cockpit, %GMT_MSG2, "amp2=" & FORMAT$(@pr(2).amp,"####") & " amp3=" & FORMAT$(@pr(3).amp,"####") SetDlgItemText gh.Cockpit, %GMT_MSG2, "bodymax=" & FORMAT$(amp,"####") ' returns 78 as max. oldmax = amp END IF IF amp < oldmin THEN SetDlgItemText gh.Cockpit, %GMT_MSG1, "bodymin=" & FORMAT$(amp,"####") oldmin = amp END IF END SUB SUB Quadradar_Vek_Stop () LOCAL i AS INTEGER IF Task(%Quadradar_test0).swit THEN stoptask %Quadradar_test0 IF Task(%Quadradar_test1).swit THEN stoptask %Quadradar_test1 IF Task(%Quadradar_test2).swit THEN stoptask %Quadradar_test2 IF Task(%Quadradar_test3).swit THEN stoptask %Quadradar_test3 MM_Bourdonola_Off MM_So_Off MM_Humanola_Off MM_Qt_Off SetDlgItemText gh.Cockpit, %GMT_TITLE, "" ' reset title InstrumAllNotesOff Piano MM_Piperola_Off Controller Piperola.channel, 10, %False Piperola.ctrl(10) = %False END SUB SUB QuadRadar_Test0() ' task 32, eerste vektor van Quadrada Vectorial - MAPPING ON ' modified 14.03.2004: Dag van de Technologie: demo voor radar gestuurde Puff. Uses a single transducer ' 17.03.2004: orange lights added ' 22.03.2004: now one of the vektors in Quadrada Vectors , original code moved to Quadra_Puff ' 23.03.2004: first try out with Emilie De Vlam ' 17.04.2009: rechecked with angela rawlings STATIC note1 AS DWORD STATIC note2 AS DWORD STATIC velo1 AS DWORD STATIC velo2 AS DWORD STATIC oldnote1 AS DWORD STATIC oldnote2 AS DWORD LOCAL p AS INTEGER PTR LOCAL spn AS SINGLE IF ISFALSE Task(%Quadradar_test0).tog THEN IF ISFALSE Task(%Quadradar_Vectors).swit THEN Starttask %Quadradar_Vectors Task(%Quadradar_test0).tog = %True Task(%Quadradar_test0).channel = Puff.channel END IF IF @pr(0).xf THEN ' doppler frequency, not angle corrected! ' spectral mapping: spn = SpectralnoteF (48 + qvek.tc, @pr(0).xf / 2, qvek.spekfak, %ExpSpec) SELECT CASE FRAC(spn) CASE < 0.25 note1 = FIX(spn) CASE > 0.75 note1 = FIX(spn) + 1 CASE ELSE note1 = FIX(spn) - 48 'fix(spn) + 0.5! END SELECT ELSE note1 = %False END IF IF @pr(0).yf THEN ' spectral: spn = SpectralnoteF (48 + qvek.tc, @pr(0).yf / 2, qvek.spekfak, %ExpSpec) SELECT CASE FRAC(spn) CASE < 0.25 note2 = FIX(spn) CASE > 0.75 note2 = FIX(spn) + 1 CASE ELSE note2 = FIX(spn) - 48 'FIX(spn) + 0.5! END SELECT ELSE note2 = %False END IF velo1 = MIN(SQR(@pr(0).amp)*4, 127) 'MIN(@pr(0).s, 127) velo2 = velo1 ' velo2 = MIN(SQR(@pr(0).amp)*4, 127) 'MIN(@pr(0).s, 127) ' puff lights (orange) IF velo1 > 14 THEN mPlay Puff.channel, 104, 64 oldnote1 = 104 ELSE IF oldnote1 THEN noteoff Puff.channel, 104 oldnote1 = %False END IF END IF IF velo1 > 18 THEN mPlay Puff.channel, 105, 64 oldnote2 = 105 ELSE IF oldnote2 THEN NoteOff Puff.channel, 105 oldnote2 = %False END IF END IF IF note1 THEN IF velo1 THEN mPlay Puff.channel,note1, velo1 '(velo1 / 2) OR 1 END IF END IF IF note2 THEN IF velo1 THEN IF note2 <> note1 THEN mPlay Puff.channel, note2, velo1 '(velo2 / 2) OR 1 END IF END IF END IF Task(%Quadradar_test0).freq = (qvek.tempo / 60!) * Speed2TempoFaktor(0) END SUB SUB QuadRadar_Test1() ' mapped on tubi-klung-thunderwood ' quadrada vectorial, task 33 STATIC note1 AS DWORD STATIC note2 AS DWORD STATIC velo1 AS DWORD STATIC velo2 AS DWORD LOCAL spn1 AS SINGLE LOCAL spn2 AS SINGLE IF ISFALSE Task(%Quadradar_test1).tog THEN IF ISFALSE Task(%Quadradar_Vectors).swit THEN Starttask %Quadradar_Vectors Task(%Quadradar_test1).tog = %True END IF IF @pr(1).xf THEN spn1 = SpectralNoteF (48 + qvek.tc, @pr(1).xf / 2, qvek.spekfak, %ExpSpec) ELSE spn1 = %False END IF IF @pr(1).yf THEN spn2 = SpectralNoteF (48 + qvek.tc, @pr(1).yf / 2, qvek.spekfak, %ExpSpec) ELSE spn2 = %False END IF velo1 = MIN(SQR(@pr(1).amp)* 6, 127) ' was pr(1).s velo2 = velo1 'MIN(@pr(1).amp, 127) ' assignatie noten naar automaten: SELECT CASE FRAC(spn1) CASE < 0.25 note1 = FIX(spn1) IF note1 <= Klung.hightes THEN mPlay Klung.channel, note1, velo1 ELSE mPlay Tubi.channel, note1, (velo1 / 2) OR 1 END IF CASE > 0.75 note1 = FIX(spn1) + 1 IF note1 <= Klung.hightes THEN mPlay Klung.channel, note1, velo1 ELSE mPlay Tubi.channel, note1, (velo1 / 2) OR 1 END IF CASE ELSE note1 = FIX(spn1) - 48 ' ok ' tubi note mPlay Tubi.channel, note1, (velo1 / 2) OR 1 END SELECT SELECT CASE FRAC(spn2) CASE < 0.25 note2 = FIX(spn2) IF note2 <= Klung.hightes THEN IF note2 <> note1 THEN mPlay Klung.channel, note2, velo2 ELSE IF note2 <> note1 THEN mPlay Tubi.channel, note2, (velo2 / 2) OR 1 END IF CASE > 0.75 note2 = FIX(spn2) + 1 IF note2 <= Klung.hightes THEN IF note2 <> note1 THEN mPlay Klung.channel, note2, velo2 ELSE IF note2 <> note1 THEN mPlay Tubi.channel, note2, (velo2 / 2) OR 1 END IF CASE ELSE note2 = FIX(spn2) -48 '36 ' tubi note IF note2 <> note1 THEN mPlay Tubi.channel, note2, (velo2 / 2) OR 1 END SELECT IF note1 THEN IF note1 = note2 THEN mPlay Thunderwood.channel, 1+ (note1 MOD 14), (velo1 + velo2) / 2 ' ratched problem!!! END IF END IF Task(%Quadradar_test1).freq = (qvek.tempo / 60!) * Speed2TempoFaktor(1) END SUB SUB QuadRadar_Test2() ' becomes piano - humanola ' trump added 14.07.2004 - now remapped on Qt 01.05.2009 STATIC note1 AS DWORD STATIC note2 AS DWORD STATIC note3 AS DWORD STATIC velo1 AS DWORD STATIC velo2 AS DWORD STATIC velo3 AS DWORD STATIC oldnote1 AS DWORD STATIC oldnote2 AS DWORD STATIC oldnote3 AS DWORD IF ISFALSE Task(%Quadradar_test2).tog THEN IF ISFALSE Task(%Quadradar_Vectors).swit THEN Starttask %Quadradar_Vectors Task(%Quadradar_test2).tog = %True Trump.ctrl(7) = %MM_Trump_Motor MM_Humanola_On %MM_Motor Modemess Trump.channel, 7, Trump.ctrl(7) Modemess Trump.channel, 66, 127 ' motor ON END IF IF @pr(2).xf THEN note1 = SpectralNote (24 + qvek.tc, @pr(2).xf / 2, qvek.spekfak, %ExpSpec) ELSE note1 = %False END IF IF @pr(2).yf THEN note2 = SpectralNote (36 + qvek.tc, @pr(2).yf / 2, qvek.spekfak, %ExpSpec) ELSE note2 = %False END IF IF (@pr(2).xf AND @pr(2).yf) THEN note3 = SpectralNote (24 + qvek.tc, (@pr(2).xf + @pr(2).yf)/4, qvek.spekfak, %ExpSpec) ELSE note3 = %False END IF velo1 = MIN(SQR(@pr(2).amp) * 6, 127) ' was pr(2).s. We cannot use @pr(2).xal / yal velo2 = velo1 'MIN(@pr(2).amp, 127) velo3 = velo1 IF note1 <> oldnote1 THEN IF oldnote1 THEN Noteoff piano.channel, oldnote1 oldnote1 = %False END IF IF note1 AND (note1 < Piano.hightes) THEN IF velo1 THEN mPlay Piano.channel,note1, velo1 oldnote1 = note1 END IF END IF END IF IF note2 <> oldnote2 THEN IF oldnote2 THEN NoteOff humanola.channel, oldnote2 oldnote2 = %False END IF IF note2 THEN IF velo2 > 4 THEN IF note2 < Humanola.hightes THEN mPlay Humanola.channel, note2, 64 'velo2 oldnote2 = note2 END IF END IF END IF END IF ' new added for trump 14.07.2004: - now Qt (01.05.2009) IF note3 <> oldnote3 THEN IF oldnote3 THEN 'NoteOff trump.channel, oldnote3 NoteOff Qt.channel, oldnote3 oldnote3 = %False END IF IF note3 THEN IF velo3 > 4 THEN 'IF note3 =< Trump.hightes THEN IF note3 =< Qt.hightes THEN 'IF note3 >= Trump.lowtes THEN IF note3 >= Qt.lowtes THEN 'mPlay Trump.channel, note3, 64 'velo2 mPlay Qt.channel, note3, velo2 oldnote3 = note3 END IF END IF END IF END IF END IF Task(%Quadradar_test2).freq = (qvek.tempo / 60!) * Speed2TempoFaktor(2) END SUB SUB QuadRadar_Test3() ' should become vibi-belly-autosax - sax to be done! ' Hurdy may be added as well. ' 06.11.2005: Hurdy implemented. ' 19.04.2009: Hurdy doubled with harma for Angela Rawlings STATIC note1 AS DWORD STATIC note2 AS DWORD STATIC velo1 AS DWORD STATIC velo2 AS DWORD STATIC hurdy_noot AS DWORD STATIC hurdy_tim AS DWORD IF ISFALSE Task(%Quadradar_test3).tog THEN IF ISFALSE Task(%Quadradar_Vectors).swit THEN Starttask %Quadradar_Vectors ' send motor coding! ' send belly matching code Controller Hurdy.channel, 67, %False ' clockwize rotation Controller Hurdy.channel, 66, 127 ' motor ON Controller Hurdy.channel, 65, 127 ' start motor on reception of note MM_Harma_On Task(%Quadradar_test3).tog = %True END IF IF @pr(3).xf THEN note1 = SpectralNote(48 + qvek.tc, @pr(3).xf / 3, qvek.spekfak, %ExpSpec) '48 was 60 - verander om ook noten op laagste snaar hudy te krijgen ELSE note1 = %False END IF IF @pr(3).yf THEN note2 = SpectralNote(48 + qvek.tc, @pr(3).yf / 3, qvek.spekfak, %ExpSpec) ' spectral 48 was 60 - verander om ook noten op laagste snaar hudy te krijgen ELSE note2 = %False END IF logfile "note1" + STR$(note1) + " - notes" + STR$(note2) velo1 = MIN(SQR(@pr(3).amp) * 5, 127) ' which is allways < 56... was pr(3).s velo2 = velo1 ' MIN(@pr(3).amp, 127) ' Controller Hurdy.channel, 7, MIN(127, 80 + velo1) '60 + (velo1 / 2) ' bow speed IF note1 THEN IF velo1 THEN IF note1 >= Vibi.lowtes AND note1 <= Vibi.hightes THEN mPlay Vibi.channel,note1, velo1 ELSEIF note1 >= Belly.lowtes AND note1 <= Belly.hightes THEN ' mPlay Belly.channel, note1, velo1 PlayBelly note1, velo1, 25 END IF IF (note1 - 12) >= Hurdy.LowTes AND (note1 -12) < 64 THEN '<= Hurdy.HighTes then IF ISFALSE Hurdy_noot THEN Controller Hurdy.channel, 7, MIN(127, 90 + velo1) '60 + (velo1 / 2) ' bow speed Controller Hurdy.channel, 1, 60 + MIN(127, velo1 + 30) ' prepulse mPlay Hurdy.channel, note1 - 12, (MAX(2 * velo1, 22)) mPlay Hurdy.channel, 0, 64 ' logfile "1.hurdy:" + STR$(note1) + STR$(MAX(2 * velo1, 22)) Hurdy_noot = note1 -12 Hurdy_tim = TimeGetTime + 2000 ' doubling for Harma: Controller Harma.channel, 7, MIN(100, 20 + velo1) mPlay Harma.channel, note1 - 12, 64 '------ END IF END IF END IF END IF IF note2 THEN IF velo2 THEN IF note2 <> note1 THEN IF (note2 >= Vibi.lowtes) AND (note2 <= Vibi.Hightes) THEN mPlay Vibi.channel, note2,velo2 ELSEIF (note2 >= Belly.lowtes) AND (note2 <= Belly.Hightes) THEN 'mPlay Belly.channel, note2, velo2 PlayBelly note2, velo2, 25 END IF IF note2 >= 64 AND note2 <= Hurdy.HighTes THEN IF ISFALSE Hurdy_noot THEN Controller Hurdy.channel, 7, MIN(127, 90 + velo2) '60 + (velo1 / 2) ' bow speed Controller Hurdy.channel, 2, 60 + MIN(127, 30 + velo2) ' prepulse mPlay Hurdy.channel, note2, (MAX(2 * velo2, 22)) mPlay Hurdy.channel, 1, 64 ' logfile "3.hurdy:" + STR$(note2) + STR$(MAX(2 * velo2, 22)) Hurdy_noot = note2 Hurdy_tim = TimeGetTime + 2000 ' doubling for Harma: Controller Harma.channel, 7, MIN(100, 20 + velo2) mPlay Harma.channel, note2, 64 '-------------------- END IF END IF END IF END IF END IF IF (TimeGetTime > Hurdy_tim) AND (Hurdy_Noot > 0) THEN ' NoteOff Hurdy.channel, Hurdy_noot IF Hurdy_Noot < 64 THEN mPlay Hurdy.channel, 0, 0 mPlay Hurdy.channel, Hurdy.LowTes, 1 ' = tangenten los mPlay Hurdy.channel, Hurdy.LowTes, 0 ' for harma: NoteOff Harma.channel, Hurdy_noot ELSE mPlay Hurdy.channel, 1, 0 mPlay Hurdy.channel, 64, 1 mPlay Hurdy.channel, 64, 0 ' for harma: Noteoff Harma.channel, Hurdy_noot END IF ' mPlay Hurdy.channel, Hurdy_Noot, 0 ' logfile "hurdyoff" + STR$(hurdy_noot) Hurdy_noot = %False END IF Task(%Quadradar_test3).freq = (qvek.tempo / 60!) * Speed2TempoFaktor(3) END SUB SUB QuadRadar_ReMapCockpitButtons () LOCAL i AS LONG IF ISFALSE hMidiI(0) THEN ButnSW(0).tag0 = "" ' midi-in must be on for sqt devices END IF ButnSW(1).tag0 = "START" ' start/stop toggle - only used for chrono and general watch... ButnSW(1).tag1 = "STOP" ButnSW(1).cPtr= %False ButnSW(2).tag0 = "" ButnSW(2).cptr = %False ButnSW(3).tag0 = "" ButnSW(3).cptr = %False ButnSW(4).tag0 = "" ButnSW(4).cptr = %False ButnSW(5).tag0 = "" ButnSW(5).cptr = %False ButnSW(6).tag0 = "" ButnSW(6).cptr = %False ButnSW(7).tag0 = "Screen On" ' creates/kills a spectrum display window - used to display waveform ButnSW(7).tag1 = "Screen Off" ' or radar screen ButnSW(8).tag0 = "" ButnSW(8).cptr = %False ButnSW(10).tag0 = "" ButnSW(10).cptr = %False ButnSW(11).tag0 = "" ButnSW(11).cptr = %False ' ONE SHOT FUNCTIONS: ButnOS(10).tag = "Calib" 'calibrate DAQ card. DAQ task will be switched OFF !!! ButnOS(10).cptr = %False App.butnSWCptr = CODEPTR(Quadradar_ButnSWHandler) App.butnOSCptr = CODEPTR(Quadradar_ButnOShandler) END SUB SUB Quadradar_ButnSWHandler () LOCAL ButtonNr AS LONG LOCAL i AS DWORD LOCAL m AS ASCIIZ * 10 LOCAL cptr AS DWORD STATIC init AS DWORD ' replaces the default buttonhandler for the Cockpit window in GMT. ' This proc is called through its codepointer only! ButtonNr = App.butnSWparam - %GMT_BUTNSW_ID SELECT CASE ButtonNr CASE 1 ' starts the promil counter. IF ISFALSE init THEN init = %True 'Radar_DAQ %False ' stop DAQ task in dll cptr = GetPRocAddress(gh.gnh, "RADAR_DAQ") CALL DWORD cptr USING Radar_DAQ(%false) END IF SetDlgItemText gh.Cockpit, %GMT_TEXT_SR, STR$(DAQparams.samplingrate(0),3)' + "S/s db" ' appears under freq groupbox in cockpit dialog IF ButnSW(ButtonNr).Flag THEN App.MTstart = %True App.tstart = timeGetTime ' start the chronometerfunction IF hMidiI(0) THEN ClearMiBuf 0 ' start with a blank midi input buffer BlockSysExReception hMidiI(0) 'SxThread END IF ' Radar_DAQ %DAQ_DOUBLEBUFFER cptr = GetPRocAddress(gh.gnh, "RADAR_DAQ") CALL DWORD cptr USING Radar_DAQ(%DAQ_DOUBLEBUFFER) SetDlgItemText gh.Cockpit, App.butnSWparam, "STOP" Runtime %True ELSE ' stop running pieces: FOR i = %Quadradar_Test0 TO %Quadradar_Vectors ' Quadrada Vectorial IF Task(i).swit THEN Stoptask i NEXT i App.MTstart = %False SetDlgItemText gh.Cockpit, App.butnSWparam, "CONT" ' Radar_DAQ %False cptr = GetPRocAddress(gh.gnh, "RADAR_DAQ") CALL DWORD cptr USING Radar_DAQ(%false) END IF END SELECT App.butnSWparam = %False ' reset END SUB SUB QuadRadar_ButnOSHandler () LOCAL stat AS INTEGER LOCAL ButtonNr AS LONG LOCAL i AS DWORD LOCAL cptr AS DWORD LOCAL h AS DWORD ' replaces the default buttonhandler for the Cockpit window in GMT. ' This proc is called through its codepointer only! ButtonNr = App.butnOSparam - %GMT_BUTNOS_ID SELECT CASE ButtonNr CASE 0 MM_AllOff ' added 20.11.2004 CASE 1 CASE 2 CASE 3 CASE 4 CASE 5 CASE 6 CASE 7 CASE 8 CASE 9 CASE 10 ' Radar_DAQ %False ' stop DAQ task in dll cptr = GetPRocAddress(gh.gnh, "RADAR_DAQ") CALL DWORD cptr USING Radar_DAQ(%false) 'stat = Calibrate_E_Series (DAQparams.id, %ND_SELF_CALIBRATE,%ND_NI_DAQ_SW_AREA,10.0) ' h = LoadLibrary("nidaq32.dll") ' cptr = GetPRocAddress(h, "CALIBRATE_E_SERIES") ' CALL DWORD cptr USING Calibrate_E_Series_dummy(DAQparams.id, %ND_SELF_CALIBRATE,%ND_NI_DAQ_SW_AREA,10.0) TO stat 'i = NIDAQErrorHandler(stat,"Calibration error in Quadrada",0) ' Radar_DAQ %DAQ_DOUBLEBUFFER ' restart DAQ task in dll cptr = GetPRocAddress(gh.gnh, "RADAR_DAQ") CALL DWORD cptr USING Radar_DAQ(%DAQ_DOUBLEBUFFER) END SELECT App.butnOSparam = %False ' reset END SUB SUB Quadrada_1 () ' study nr. 1 for QuadRadar ' Ruhig et Slow ' LOCAL i AS LONG STATIC note1 AS DWORD STATIC velo1 AS DWORD STATIC oldnote1 AS DWORD LOCAL p AS INTEGER PTR IF ISFALSE Task(%Quadrada_1).tog THEN Task(%Quadrada_1).tog = %True END IF IF @pr(0).xf THEN i = RND(1) * 3! IF note1 THEN note1 = ((note1 * i) + MIN(@pr(0).xf * 2, 127) ) / (i+1) ' non cosine corrected doppler freqs. ELSE note1 = MIN(@pr(0).xf * 2, 127) END IF ELSE note1 = %False END IF velo1 = MIN(@pr(0).s * 2, 127) ' positional !!! IF note1 <> oldnote1 THEN Delnote2Har Piano.Har(1), oldnote1 oldnote1 = %False IF velo1 THEN AddNote2Har Piano.Har(1), note1, velo1 oldnote1 = note1 InstrumPlay Piano END IF END IF Task(%Quadrada_1).freq = @pr(0).Xf IF Task(%Quadrada_1).freq > 16 THEN task(%Quadrada_1).freq = 16 IF Task(%Quadrada_1).freq < 3 THEN Task(%Quadrada_1).freq = 3 END SUB SUB Quadrada_2 () ' study nr. 1 for QuadRadar ' Ruhig et Slow ' ' uses B radar, but requires the square setup of all 4 radars. LOCAL i AS LONG STATIC note2 AS DWORD STATIC velo2 AS DWORD STATIC oldnote2 AS DWORD STATIC cnt AS DWORD LOCAL p AS INTEGER PTR IF ISFALSE Task(%Quadrada_2).tog THEN cnt = %False Task(%Quadrada_2).tog = %True 'Piperola.ctrl(7) = 127 MM_Piperola_On MM_Bourdonola_On END IF IF @pr(1).xf THEN IF note2 THEN i = RND(1) * 2! note2 = ((note2 * i)+ MIN(@pr(1).xf * 2, 127) ) / (i+1) ELSE note2 = MIN(@pr(1).xf * 2, 127) END IF ELSE note2 = %False END IF velo2 = MIN((@pr(1).s * 2), 127) IF note2 <> oldnote2 THEN DelNote2Har Bourdonola.Har(1), oldnote2 DelNote2Har Vibi.Har(1), oldnote2 Delnote2Har Piperola.Har(1), oldnote2 oldnote2 = %False IF velo2 THEN SELECT CASE note2 CASE < 62 AddNote2Har Bourdonola.Har(1), note2, velo2 InstrumPlay Bourdonola cnt = %False CASE < 91 AddNote2Har Vibi.Har(1), note2, velo2 InstrumPlay Vibi IF cnt > 24 THEN InstrumAllNotesOff Bourdonola InstrumAllnotesOff Piperola cnt = %False END IF CASE ELSE AddNote2Har Piperola.Har(1), note2, velo2 InstrumPlay Piperola cnt = %False END SELECT oldnote2 = note2 ELSE Instrumplay Bourdonola Instrumplay Piperola END IF END IF INCR cnt Task(%Quadrada_2).freq = (Task(%Quadrada_2).freq + Task(%Quadrada_2).freq + @pr(1).xf) / 3 IF Task(%Quadrada_2).freq > 16 THEN task(%Quadrada_2).freq = 16 IF Task(%Quadrada_2).freq < 3 THEN Task(%Quadrada_2).freq = 3 END SUB SUB Quadra_1 () ' Study nr 3. ' "Kattepoten" - - demonstrates use of positional information ' absolute speed of movement ' absolute body surface moving ' absolute fast speed of gesture ' rehearsed with angela rawlings 17.04.2009 , 05.05.2009... ' rehearsed with Helen White 05.05.2009, with a dialog written and spoken by Helen STATIC n1 AS BYTE STATIC n2 AS BYTE STATIC n3 AS BYTE STATIC n4 AS BYTE STATIC H AS harmtype IF ISFALSE Task(%Quadra_1).tog THEN ProgChange Piano.channel, %False H.vel = STRING$(128,0) Task(%Quadra_1).tog = %True END IF IF ISFALSE @pr(4).v THEN ' absolute slow speed IF Piano.Har(1).vel <> STRING$(128,0) THEN Piano.Har(1).vel = SolveHar$ (Piano.Har(1), -1, 0) InstrumPlay Piano Piano.Har(1).vel = STRING$(128,0) Task(%Quadra_1).freq = 2 EXIT SUB END IF Piano.Har(1).vel = STRING$(128,0) InstrumPlay Piano n1 = %False n2 = %False n3 = %False n4 = %False Task(%Quadra_1).freq = 6 EXIT SUB END IF IF ISFALSE @pr(4).s THEN EXIT SUB ' total body surface IF n1 THEN delnote2har piano.Har(1), n1 IF n2 THEN delnote2Har piano.Har(1), n2 IF n3 THEN delnote2har piano.har(1), n3 IF n4 THEN delnote2Har piano.har(1), n4 ' here pitches are positional , the chords represent the positional uncertainty of the acquired data. IF @pr(0).pc.real > -1 THEN n1 = 64 + (@pr(0).pc.real * 44!) ELSE IF @pr(2).pc.real > -1 THEN n1 = 64 + (@pr(2).pc.real * 44!) ELSE n1 = %False END IF END IF IF @pr(0).pc.imag > -1 THEN n2 = 64 + (@pr(0).pc.imag * 44!) ELSE IF @pr(2).pc.imag > -1 THEN n2 = 64 + (@pr(2).pc.imag * 44!) ELSE n2 = %False END IF END IF IF @pr(1).pc.real > -1 THEN n3 = 64 + (@pr(1).pc.real * 44!) ELSE IF @pr(3).pc.real > -1 THEN n3 = 64 + (@pr(3).pc.real * 44!) ELSE n3 = %False END IF END IF IF @pr(1).pc.imag > -1 THEN n4 = 64 + (@pr(1).pc.imag * 44!) ELSE IF @pr(3).pc.imag > -1 THEN n4 = 64 + (@pr(3).pc.imag * 44!) ELSE n4 = %False END IF END IF IF n1 =< Piano.HighTes AND n1 >= Piano.Lowtes THEN AddNote2Har Piano.Har(1), n1, MIN(@pr(0).s , 127) END IF IF n2 =< Piano.HighTes AND n2 >= Piano.Lowtes THEN AddNote2Har Piano.Har(1), n2, MIN(@pr(1).s , 127) END IF IF n3 =< Piano.HighTes AND n3 >= Piano.Lowtes THEN AddNote2Har Piano.Har(1), n3, MIN(@pr(2).s , 127) END IF IF n4 =< Piano.HighTes AND n4 >= Piano.Lowtes THEN AddNote2Har Piano.Har(1), n4, MIN(@pr(3).s , 127) END IF InstrumPlay Piano Task(%Quadra_1).freq = MIN(@pr(4).vf/2,30) ' absolute speed, with cosine correction IF Task(%Quadra_1).freq < 4 THEN Task(%Quadra_1).freq = 4 END SUB ' from here copied to Technofaustus: SUB Quadra_2 () ' topological mapping of instrumentation ' 'Wandering Quadrada Space' - study Nr 4. ' to allow the performer to take position on stage, this piece starts only 10 seconds after ' activation of its task. ' may later become part of ' harma moved to separate task ' humanola idem. LOCAL t AS DWORD STATIC tn AS BYTE STATIC st AS DWORD STATIC cnt AS DWORD STATIC i AS DWORD IF ISFALSE Task(%Quadra_2).tog THEN ' send belly controller... [changed on coding 15.09.2006] MM_Belly_On MM_Vibi_On 'Modemess Belly.channel, 4, 25 ' deviation range 'Modemess Belly.channel, &H44,0 ' set belly to absolute mapping (no pitch matching) ProgChange Harma.channel, 15 ' regs. on Controller Vibi.channel, 66, 127 Modemess Vibi.channel, 20, 70 ' diatonic motor ModeMess Vibi.channel, 21, 74 ' chromatic motor st = TimeGetTime cnt = %False i = %False Task(%Quadra_2).duur = 482 ' 8'00" Task(%Quadra_2).tog = %True EXIT SUB END IF t = timeGettime - st IF t < 10000 THEN EXIT SUB ' percussive instruments : Vibi, Belly, Troms, Klung, ThunderWood, Springers at start. IF @pr(4).acc <> %False THEN ' Troms plays only when the position changes. Its input comes from the slow acceleration of the body. tn = 36 + @pr(4).acc IF tn > 127 THEN tn = 127 IF tn < 0 THEN tn = 0 mPlay %Troms_channel, tn, MIN(@pr(4).s/2, 127) ELSE GOTO Wander_Score END IF IF @pr(4).s THEN ' orchestrated space: SELECT CASE @pr(4).pl.ang CASE < -Pi/2 ' -90 to -180 graden tn = MIN(@pr(4).vf,23) IF tn > %False THEN mPlay ThunderWood.Channel, tn, MIN(ABS(@pr(4).pl.mag * 127), 127) END IF IF ABS(@pr(4).pl.mag) < 0.1 THEN mPlay Springers.Channel, 120, 127 END IF CASE < %False ' 0 to -90 graden IF ABS(@pr(4).pl.mag) < 0.1 THEN mPlay Springers.Channel, 121, 127 ELSE mPlay Vibi.Channel, MIN(60 + @pr(4).vf,127), MIN(ABS(@pr(4).pl.mag * 127), 64) END IF CASE < Pi/2 ' 0 to 90 graden ' kwadrant 0-1 IF ABS(@pr(4).pl.mag) < 0.1 THEN mPlay Springers.Channel, 122, 127 ELSE 'if @pr(?).acf <> %False then ' here we better state a condition so that vf must exceed a certain minimum... 'mPlay Belly.channel,MAX(102 - @pr(4).vf, 0), MIN(ABS(@pr(4).pl.mag * 60), 60) PlayBelly MAX(102 - @pr(4).vf, 0), MIN(ABS(@pr(4).pl.mag * 60), 60), 25 'end if END IF CASE < Pi ' 90 to 180 graden IF ABS(@pr(4).pl.mag) < 0.1 THEN mPlay Springers.Channel, 123, 127 ELSE mPlay Klung.Channel,MIN(49 + @pr(4).vf,127), MIN(ABS(@pr(4).pl.mag * 127), 127) END IF CASE < (3*Pi)/4 ' 180 to 270 graden - does not seem to happen. mPlay Vibi.Channel, MIN(60 + @pr(4).vf * 2,127), MIN(ABS(@pr(4).pl.mag * 127), 64) IF ABS(@pr(4).pl.mag) < 0.1 THEN mPlay Springers.Channel, 120, 127 END IF CASE ELSE ' 270 to 360 graden mPlay ThunderWood.Channel, MIN(@pr(4).vf,23), MIN(ABS(@pr(4).pl.mag * 127), 127) IF ABS(@pr(4).pl.mag) < 0.1 THEN mPlay Springers.Channel, 121, 127 END IF END SELECT END IF Wander_Score: ' should become separate tasks! SELECT CASE t 'timegetTime - st CASE > 480000 ' 8'00" = end IF cnt <=12 THEN Task(%Wander_Harma).pan = 3 cnt = 13 EXIT SUB END IF IF cnt <= 13 THEN InstrumAllNotesOff AutoSax cnt = 14 EXIT SUB END IF IF cnt <= 14 THEN ' the very end... cnt = 15 StopTask %Quadra_2 EXIT SUB END IF CASE > 455000 ' 7'35" to 8'00" INCR i mPlay Springers.Channel, 120 + (i MOD 4),MIN(@pr(i MOD 4).s,127) IF cnt <= 11 THEN Task(%Wander_Harma).pan = 2 cnt = 12 END IF CASE > 450000 ' 7'30" to 7'35" INCR i mPlay Springers.Channel, 120 + (i MOD 4),MIN(@pr(i MOD 4).s,127) IF cnt <= 10 THEN AutoSax.Har(1).vel = STRING$(128,0) InstrumAllNotesOff AutoSax END IF cnt = 11 Task(%Wander_piper).pan = 3 ' here? CASE > 445000 ' 7'25" to 7'30" IF cnt <= 9 THEN Task(%Wander_Human).pan = 3 ' will stop END IF cnt = 10 CASE > 440000 ' 7'20" to 7'25" IF cnt <= 8 THEN Task(%Wander_Bourd).pan = 2 cnt = 9 END IF Task(%Wander_Human).pan = 2 CASE > 435000 ' 7'15" to 7'20" IF cnt <= 7 THEN Task(%Wander_Piper).pan = 2 cnt = 8 END IF Task(%Wander_Human).pan = 1 CASE > 420000 ' 7'00" to 7'15" = 15 sekonden IF ISFALSE Task(%Wander_Human).swit THEN Task(%Wander_Human).pan = %False ' Vox Humanola taak. starttask %Wander_Human END IF cnt = 7 CASE > 370000 ' 6'10" to 7'00 = 50 sekonden ' no notes off, this should build up a big cluster Task(%Wander_Harma).pan = 1 Task(%Wander_Piper).pan = 1 Task(%Wander_Bourd).pan = 1 IF @pr(3).vf > %False THEN mPlay AutoSax.channel, MIN(48 + @pr(3).vf,126), MIN(@pr(3).s,127) END IF cnt = 5 CASE > 310000 '5'10" to 6'10" = 1 minuut IF ISFALSE Task(%Wander_Harma).swit THEN Task(%Wander_Harma).pan = 0 ' to transfer timing info starttask %Wander_Harma END IF IF @pr(3).vf > %False THEN mPlay AutoSax.channel, MIN(48 + @pr(3).vf,126), MIN(@pr(3).s,127) ELSE InstrumAllNotesOff AutoSax END IF IF cnt <= 3 THEN Task(%Wander_Piper).pan = 0 Task(%Wander_Bourd).pan = 0 IF Task(%Wander_Trio).swit THEN StopTask %Wander_Trio IF ISFALSE Task(%Wander_Piper).swit THEN starttask %Wander_Piper IF ISFALSE Task(%Wander_Bourd).swit THEN starttask %Wander_Bourd cnt = 4 END IF CASE > 250000 ' 4'10" to 5'10" - met sax IF cnt <= 2 THEN Controller Harma.channel, 66, 127 Harma.ctrl(66) = 127 Modemess Harma.channel, 7, 90 ' preparation Harma.ctrl(7) = 90 ProgChange Harma.channel, 15 cnt = 3 END IF ' autosax, in de buurt van D IF @pr(3).vf > %False THEN mPlay AutoSax.channel, MIN(48 + @pr(3).vf,126), MIN(@pr(3).s, 127) '@pr(3).xa ELSE InstrumAllNotesOff AutoSax END IF CASE > 190000 ' 3'10" to 4'10" IF cnt <= 1 THEN IF ISFALSE Task(%Wander_Trio).swit THEN Starttask %Wander_Trio cnt = 2 END IF CASE ELSE ' 0 - 3'10" cnt = 1 END SELECT Task(%Quadra_2).freq = @pr(4).vf / 2 ' was without / 2 - we could also take v instead of vf IF Task(%Quadra_2).freq < 4 THEN Task(%Quadra_2).freq = 4 END SUB SUB Wander_Stop () LOCAL i AS DWORD Harma.Har(1).vel = STRING$(128,0) ' Instrumplay Harma ModeMess Harma.channel, 123, 0 ' Progchange Harma.Channel, %False MM_Piperola_Off %MM_Notes OR %MM_Wind ' FOR i = 60 TO 108 ' mPlay Piperola.Channel , i, 64 ' SLEEP 10 ' mPlay Piperola.Channel , i , %False ' NEXT i Piperola.Har(1).vel = STRING$(128,0) InstrumAllNotesOff AutoSax END SUB SUB Wander_Harma () ' taak voor 'Wandering Quadrada Space' STATIC i AS DWORD IF ISFALSE task(%Wander_Harma).tog THEN i = %False ProgChange Harma.channel, 15 Task(%Wander_Harma).freq = 3 Task(%Wander_Harma).tog = %True END IF SELECT CASE Task(%Wander_Harma).pan CASE %False IF @pr(2).vf > %False THEN Harma.Har(1).vel = Harma.Har(0).vel AddNote2Har Harma.Har(1), MIN(29 + (@pr(2).vf * 2),120), 64 InstrumPlay Harma ELSE 'InstrumAllNotesOff Harma Harma.Har(1).vel = STRING$(128,0) Modemess Harma.channel, 123, %False 'Instrumplay Harma END IF CASE 1 IF @pr(2).vf > %False THEN Harma.Har(1).vel = Harma.Har(0).vel AddNote2Har Harma.Har(1), MIN(29 + (@pr(2).vf * 2),120), 70 InstrumPlay Harma ELSE IF ISFALSE i MOD 2 THEN ' in Faust-Wandern it's i mod 4 Harma.Har(1).vel = SolveHar (Harma.Har(0),-1,0) Instrumplay Harma END IF INCR i END IF CASE 2 Modemess Harma.channel, 7, 16 ' blazer OFF CASE 3 Harma.Har(1).vel = STRING$(128,0) ' Instrumplay Harma Modemess Harma.channel, 123,0 'InstrumAllNotesOff Harma stoptask %Wander_Harma END SELECT END SUB SUB Wander_Human () ' Wandering Quadrada Space - Task for Vox Humanola STATIC i AS DWORD IF ISFALSE Task(%Wander_Human).tog THEN i = %False Task(%Wander_Human).tog = %True Task(%Wander_Human).freq = 4 'Humanola.ctrl(7) = %False ' to make sure it restarts the motor on task on/offs 'HumanolaWind Humanola MM_Humanola_Off %MM_Motor END IF ' humanola proc. SELECT CASE Task(%Wander_Human).pan CASE %False IF ISFALSE Humanola.ctrl(7) THEN 'mPlay Humanola.channel, 6, 64 'Humanola.ctrl(7) = 127 ' 'HumanolaWind Humanola MM_Humanola_On %MM_Motor END IF IF @pr(0).vf > %False THEN Humanola.Har(1).vel = Humanola.Har(0).vel AddNote2Har Humanola.Har(1), MIN(36 + @pr(0).vf,119),64 ' was vf * 3 InstrumPlay Humanola ELSE IF ISFALSE i MOD 2 THEN ' in Faust it's i mod 5 Humanola.Har(1).vel = SolveHar (Humanola.Har(0), -1, 0) InstrumPlay Humanola END IF INCR i END IF CASE 1 IF ISFALSE Humanola.ctrl(7) THEN mPlay Humanola.channel, 6, 64 Humanola.ctrl(7) = 64 END IF IF @pr(0).vf > %False THEN Humanola.Har(1).vel = Humanola.Har(0).vel ' new 14.03 AddNote2Har Humanola.Har(1), MIN(36 + @pr(0).vf,119),64 ' was vf * 3 InstrumPlay Humanola ELSE IF ISFALSE i MOD 2 THEN ' in Faust it's i mod 5 Humanola.Har(1).vel = SolveHar (Humanola.Har(0), -1, 0) InstrumPlay Humanola END IF INCR i END IF CASE 2 IF ISFALSE Humanola.ctrl(7) THEN 'mPlay Humanola.channel, 6, 64 'Humanola.ctrl(7) = 127 '64 'HumanolaWind Humanola MM_Humanola_On %MM_Motor END IF IF @pr(0).vf > %False THEN Humanola.Har(1).vel = Humanola.Har(0).vel ' NEW 14.03.2003 AddNote2Har Humanola.Har(1), MIN(36 + @pr(0).vf ,119),64 ' was vf * 3 InstrumPlay Humanola ELSE IF ISFALSE i MOD 2 THEN ' i mod 5 in Faust Wandern Humanola.Har(1).vel = SolveHar (Humanola.Har(0), -1, 0) InstrumPlay Humanola END IF INCR i END IF CASE 3 Task(%Wander_Human).pan = 4 CASE > 92 Humanola.Har(1).vel = STRING$(128,0) InstrumPlay Humanola ' InstrumAllNotesOff Humanola IF Humanola.ctrl(7) THEN 'NoteOff Humanola.channel, 6 ' motor off 'Humanola.ctrl(7) = %False 'HumanolaWind Humanola MM_Humanola_Off %MM_Motor END IF Stoptask %Wander_Human CASE > 3 IF ISFALSE Humanola.ctrl(7) THEN 'mPlay Humanola.channel, 6, 64 'Humanola.ctrl(7) = 127 '64 'HumanolaWind Humanola MM_Humanola_On %MM_Motor END IF mPlay Humanola.Channel, Task(%Wander_Human).pan + 32, 64 SLEEP 8 mPlay Humanola.Channel, Task(%Wander_Human).pan + 32, %False INCR Task(%Wander_Human).pan END SELECT END SUB SUB Wander_Piper () STATIC i AS DWORD IF ISFALSE Task(%Wander_Piper).tog THEN i = %False Task(%Wander_Piper).tog = %True MM_Piperola_Off %MM_Motor OR %MM_Notes END IF SELECT CASE Task(%Wander_piper).pan CASE 0 IF Piperola.ctrl(7) THEN MM_Piperola_Off %MM_Motor END IF Task(%Wander_Piper).freq = 1 Piperola.Har(1).vel = STRING$(128,0) Instrumplay Piperola CASE 1 IF ISFALSE piperola.ctrl(7) THEN MM_Piperola_ON %MM_Motor END IF Task(%Wander_Piper).freq = 6 ' no notes off, this should build up a big cluster IF @pr(1).vf > %False THEN Piperola.Har(1).vel = Piperola.Har(0).vel ' 14.03 AddNote2Har Piperola.Har(1), MIN(60 + @pr(1).vf,119), 64 InstrumPlay Piperola ELSE ' IF ISFALSE i MOD 2 THEN ' i mod 4 in Faust Piperola.Har(1).vel = SolveHar (Piperola.Har(0),-1,0) Instrumplay Piperola ' END IF ' INCR i END IF CASE 2 Piperola.Har(1).vel = STRING$(128,0) Instrumplay Piperola Task(%Wander_Piper).freq = 0.5 CASE 3 MM_Piperola_Off %MM_Motor StopTask %Wander_piper END SELECT END SUB SUB Wander_Bourd () ' task in 'Wandering Quadrada Space' STATIC i AS DWORD IF ISFALSE Task(%Wander_Bourd).tog THEN i = %False Task(%Wander_Bourd).tog = %True MM_Bourdonola_On END IF SELECT CASE Task(%Wander_Bourd).pan CASE %False Bourdonola.Har(1).vel = STRING$(128,0) Instrumplay Bourdonola Task(%Wander_Bourd).freq = 0.8 CASE 1 IF @pr(1).vf > %False THEN Bourdonola.Har(1).vel = Bourdonola.Har(0).vel ' 14.03 AddNote2Har Bourdonola.Har(1), MIN(35 + @pr(1).vf,62), 64 InstrumPlay Bourdonola ELSE ' IF ISFALSE i MOD 3 THEN ' in Faust-Wandern Bourdonola.Har(1).vel = SolveHar (Bourdonola.Har(0),-1, 0) Instrumplay Bourdonola ' END IF ' INCR i END IF Task(%Wander_Bourd).freq = 5 CASE 2 'Bourdonola.Har(1).vel = STRING$(128,0) 'Instrumplay Bourdonola Task(%Wander_Bourd).freq = 0.66 Task(%Wander_Bourd).pan = 3 CASE > 41 '59 Bourdonola.Har(1).vel = STRING$(128,0) Stoptask %Wander_Bourd CASE > 2 mPlay Bourdonola.Channel, Task(%Wander_Bourd).pan + 33, 64 ' was + 21 SLEEP 8 mPlay Bourdonola.Channel, Task(%Wander_Bourd).pan + 33, %False INCR Task(%Wander_Bourd).pan END SELECT END SUB SUB Wander_Trio () ' part of 'Wandering Quadrada Space' ' , ' added 18.08.2003 , code checked 13.09.2007 LOCAL i AS LONG STATIC note AS DWORD STATIC velo AS DWORD STATIC cnt AS DWORD STATIC oldnote AS DWORD STATIC tso AS DWORD STATIC oldsonote AS INTEGER IF ISFALSE Task(%Wander_Trio).tog THEN cnt = %False Task(%Wander_Trio).tog = %True MM_PIperola_On MM_Bourdonola_On MM_So_On END IF IF @pr(4).vf THEN IF note THEN i = RND(1) * 2! note = ((note * i)+ MIN(@pr(4).vf , 127) ) / (i+1) ELSE note = MIN(24 + @pr(4).vf, 127) END IF ELSE note = %False END IF velo = MIN(@pr(4).s, 127) IF note <> oldnote THEN DelNote2Har Bourdonola.Har(1), oldnote Delnote2Har Piperola.Har(1), oldnote IF velo THEN SELECT CASE note CASE < 22 'So.lowtes INCR cnt CASE < Bourdonola.Lowtes IF ISFALSE tso THEN oldsonote = note mPlay So.channel, note, velo tso = timeGetTime + 1000 END IF CASE < 63 AddNote2Har Bourdonola.Har(1), note, 64 'velo InstrumPlay Bourdonola oldnote = note cnt = %False CASE < Piperola.Hightes IF ISFALSE Piperola.ctrl(7) THEN MM_Piperola_On %MM_Motor END IF AddNote2Har Piperola.Har(1), note, 64 'velo InstrumPlay Piperola oldnote = note cnt = %False CASE ELSE INCR cnt END SELECT ELSE IF cnt > 10 THEN Bourdonola.Har(1).vel = STRING$(128,0) Piperola.Har(1).vel = STRING$(128,0) Instrumplay Bourdonola Instrumplay Piperola cnt = %False END IF END IF END IF IF tso THEN IF timeGetTime > tso THEN IF oldsonote THEN Noteoff So.channel, oldsonote: oldsonote = %False tso = %False END IF END IF INCR cnt Task(%Wander_Trio).freq = (Task(%Wander_Trio).freq + Task(%Wander_Trio).freq + @pr(4).vf) / 3 IF Task(%Wander_Trio).freq > 16 THEN task(%Wander_Trio).freq = 16 IF Task(%Wander_Trio).freq < 3 THEN Task(%Wander_Trio).freq = 3 END SUB SUB Birada () ' should use 2 diagonals of the quadra setup. May also be done with 2 nude performers. ' study nr. 2 ' should use Piperola, Bourdonola, Harma, Vox Humanola, Ake, Trump END SUB FUNCTION speed2tempofaktor (BYVAL vector AS LONG) AS SINGLE ' used in Quadrada Vectors ' MM tempo range 30 to 284 LOCAL snelheid AS LONG ' speed is now reserved word in PB snelheid = MAX(@pr(vector).xf, @pr(vector).yf) SELECT CASE snelheid CASE > 44 '54 FUNCTION = 8 ' thirtyseconds freq becomes 4Hz minimum, 37Hz max. 4 ' zestienden CASE > 34 '46 FUNCTION = 6 ' triplet sixteens. Freq becomes 3Hz minimum, 28.4Hz max. 3 ' triolen CASE > 24 '36 FUNCTION = 4 '2 ' achtsten CASE > 16 '24 FUNCTION = 2 '1 ' vierden CASE > 8 '16 FUNCTION = 1 ' freq becomes 0.5 to 4.7Hz ' 0.5 ' halven CASE > 4 '8 FUNCTION = 0.5 ' 0.33 ' gepunte halven CASE ELSE FUNCTION = 0.33 '0.25 ' helen END SELECT END FUNCTION SUB Quadra_Puff () ' "Qua Puff" , quadrada study #6 ' requires the quadrada setup, unlike Quadrada Vectorial. ' modified 14.03.2004: Dag van de Technologie: demo voor radar gestuurde Puff. Uses a single transducer ' 17.03.2004: orange lights added STATIC note1 AS DWORD STATIC note2 AS DWORD STATIC velo1 AS DWORD STATIC velo2 AS DWORD STATIC oldnote1 AS DWORD STATIC oldnote2 AS DWORD LOCAL p AS INTEGER PTR IF ISFALSE Task(%Quadra_puff).tog THEN Task(%Quadra_Puff).tog = %True Task(%Quadra_Puff).channel = Puff.channel END IF IF @pr(0).xf THEN ' doppler frequency, not angle corrected! note1 = 55 + MIN(@pr(0).xf , 41) ' normal notes ELSE note1 = %False END IF IF @pr(0).yf THEN note2 = 7 + MIN(@pr(0).yf, 41) ' quartertones ELSE note2 = %False END IF velo1 = MIN(@pr(0).s, 127) velo2 = MIN(@pr(0).s, 127) ' puff lights (orange) IF velo1 > 10 THEN mPlay Puff.channel, 104, 64 oldnote1 = 104 ELSE IF oldnote1 THEN noteoff Puff.channel, 104 oldnote1 = %False END IF END IF IF velo2 > 10 THEN mPlay Puff.channel, 105, 64 oldnote2 = 105 ELSE IF oldnote2 THEN NoteOff Puff.channel, 105 oldnote2 = %False END IF END IF IF note1 THEN IF velo1 THEN mPlay Puff.channel,note1, velo1 'oldnote1 = note1 END IF END IF IF note2 THEN IF velo2 THEN mPlay Puff.channel, note2,velo2 'oldnote2 = note2 END IF END IF Task(%Quadra_Puff).freq = MAX(@pr(0).Xf,@pr(0).yf) IF Task(%Quadra_Puff).freq > 16 THEN task(%Quadra_Puff).freq = 16 IF Task(%Quadra_Puff).freq < 2 THEN Task(%Quadra_Puff).freq = 2 END SUB SUB QuadRa_Vibi() ' "Qua Vibi", quadrada study #7 ' should become vibi-belly-autosax - belly and sax to be done! STATIC note1 AS DWORD STATIC note2 AS DWORD STATIC velo1 AS DWORD STATIC velo2 AS DWORD STATIC oldnote1 AS DWORD STATIC oldnote2 AS DWORD LOCAL p AS INTEGER PTR IF ISFALSE Task(%Quadra_Vibi).tog THEN Task(%Quadra_Vibi).tog = %True Noteoff Vibi.channel, Note1 NoteOff Vibi.channel, Note2 ' send controllers for vibi!!! MM_Vibi_On END IF IF @pr(3).xf THEN note1 = 60 + MIN(@pr(3).xf , 36) ' doppler frequency, not angle corrected! - vibi-range ELSE note1 = %False END IF IF @pr(3).yf THEN 'note2 = MIN(@pr(3).yf * 4, 127) note2 = 60 + MIN(@pr(3).yf, 36) ELSE note2 = %False END IF velo1 = MIN(@pr(3).s, 127) velo2 = MIN(@pr(3).s, 127) ' IF note1 <> oldnote1 THEN ' IF oldnote1 THEN ' Noteoff 6, oldnote1 ' oldnote1 = %False ' END IF IF note1 THEN IF velo1 THEN mPlay Vibi.channel,note1, velo1 'oldnote1 = note1 END IF END IF ' END IF ' IF note2 <> oldnote2 THEN ' IF oldnote2 THEN ' NoteOff 7, oldnote2 ' oldnote2 = %False ' END IF IF note2 THEN IF velo2 THEN IF note2 <> note1 THEN mPlay Vibi.channel, note2,velo2 'oldnote2 = note2 ELSE 'mPlay Belly.channel, note2, velo2 PlayBelly note2, velo2, 25 END IF END IF END IF ' END IF Task(%Quadra_Vibi).freq = MAX(@pr(3).Xf,@pr(3).yf) IF Task(%Quadra_Vibi).freq > 14 THEN task(%Quadra_Vibi).freq = 14 IF Task(%Quadra_Vibi).freq < 2 THEN Task(%Quadra_Vibi).freq = 2 END SUB SUB QuadrAke () ' Quadrada study for Ake and Harma 'Qua Ake' study ' one of the vektors in Quadrada Vectors ' use Harma and Ake STATIC note1 AS DWORD STATIC note2 AS DWORD STATIC velo1 AS DWORD STATIC velo2 AS DWORD STATIC oldnote1 AS DWORD STATIC oldnote2 AS DWORD STATIC Harmalowoct AS INTEGER STATIC cnt AS DWORD LOCAL p AS INTEGER PTR LOCAL spn AS SINGLE IF ISFALSE Task(%QuadrAke).tog THEN IF ISFALSE Task(%Quadradar_Vectors).swit THEN Starttask %Quadradar_Vectors HarmalowOct = (Harma.lowtes \ 12) * 12 MM_Harma_On ake.ctrl(7) = %False Controller Ake.channel, 7, ake.ctrl(7) 'zuigwind ake.ctrl(1) = %MM_Ake_Motor controller Ake.channel, 1, %MM_Ake_Motor cnt = %False Task(%QuadrAke).tog = %True END IF ' kleine overlappende klustertjes, met ritmiek: SELECT CASE cnt MOD 8 CASE %False MM_Harma_Off %MM_Notes CASE 4 MM_Ake_Off %MM_Notes END SELECT IF @pr(0).xf THEN ' doppler frequency, not angle corrected! ' spectral mapping on Harma: spn = SpectralnoteF ( HarmalowOct + qvek.tc, @pr(0).xf / 2, qvek.spekfak, %ExpSpec) SELECT CASE FRAC(spn) CASE < 0.45 note1 = FIX(spn) CASE ELSE '> 0.45 note1 = FIX(spn) + 1 END SELECT ELSE note1 = %False END IF IF @pr(0).yf THEN ' spectral: - on Ake spn = SpectralnoteF (12 + qvek.tc, @pr(0).yf / 2, qvek.spekfak, %ExpSpec) SELECT CASE FRAC(spn) CASE < 0.50 note2 = FIX(spn) CASE ELSE '> 0.75 note2 = FIX(spn) + 1 END SELECT ELSE note2 = %False END IF velo1 = MIN(SQR(@pr(0).amp)*4, 127) 'MIN(@pr(0).s, 127) velo2 = velo1 ' velo2 = MIN(SQR(@pr(0).amp)*4, 127) 'MIN(@pr(0).s, 127) ' Harma lights IF velo1 > 14 THEN mPlay Harma.channel, 93, 64 oldnote1 = 93 ELSE IF oldnote1 THEN noteoff Harma.channel, 93 oldnote1 = %False END IF END IF IF velo1 > 18 THEN mPlay Harma.channel, 94, 64 oldnote2 = 94 ELSE IF oldnote2 THEN NoteOff Harma.channel, 94 oldnote2 = %False END IF END IF IF note1 THEN IF velo1 THEN mPlay Harma.channel,note1, velo1 '(velo1 / 2) OR 1 END IF END IF IF note2 THEN IF velo1 THEN IF note2 <> note1 THEN mPlay Ake.channel, note2, velo1 '(velo2 / 2) OR 1 END IF END IF END IF INCR cnt Task(%QuadrAke).freq = (qvek.tempo / 60!) * Speed2TempoFaktor(0) END SUB SUB QuadrAke_Stop MM_Ake_Off %MM_Notes OR %MM_Motor MM_Harma_Off %MM_Notes OR %MM_Motor END SUB SUB QuadraLlor () ' - Quadrada Study for Llor & Belly - M&M 12.04.2005 ? ' rev. 13.04.2005 ' played 08.11.2005 STATIC note1 AS DWORD STATIC note2 AS DWORD STATIC velo1 AS DWORD STATIC velo2 AS DWORD STATIC oln1 AS INTEGER STATIC oln2 AS INTEGER LOCAL spn1 AS SINGLE LOCAL spn2 AS SINGLE IF ISFALSE Task(%QuadraLlor).tog THEN IF ISFALSE Task(%Quadradar_Vectors).swit THEN Starttask %Quadradar_Vectors 'Controller Belly.channel, &H044, 1 ' mapping on 'Controller Belly.channel, 4,35 ' pitch deviation in cents '[changed in coding 15.09.2006] MM_Belly_On mPlay Llor.channel, 1, 127 mPlay Llor.channel, 2, 127 mPlay Llor.channel, 3, 127 mPlay Llor.channel, 4, 127 mPlay Llor.channel, 5, 127 Task(%QuadraLlor).tog = %True END IF IF @pr(1).xf THEN spn1 = SpectralNoteF (24 + qvek.tc, @pr(1).xf / 2, qvek.spekfak, %ExpSpec) ELSE spn1 = %False END IF IF @pr(1).yf THEN spn2 = SpectralNoteF (24 + qvek.tc, @pr(1).yf / 2, qvek.spekfak, %ExpSpec) ELSE spn2 = %False END IF IF oln1 THEN IF oln1 < 43 THEN Release Llor.channel, oln1, 30 END IF oln1 = %False ' release code added 10.04.2005 END IF IF oln2 THEN IF oln2 < 43 THEN Release Llor.channel, oln2, 30 '75 END IF oln2 = %False END IF velo1 = MIN(SQR(@pr(1).amp)* 6, 127) ' was pr(1).s velo2 = velo1 ' MIN(@pr(1).amp, 127) ' assignatie noten naar automaten: oln1 = PlayLlor (spn1, velo1,15) ' 15 cents deviation allowable here. IF ISFALSE oln1 THEN ' Llor could not play it... , try belly - pitch mapping must be ON SELECT CASE FRAC(spn1) CASE < 0.49 note1 = FIX(spn1) 'mPlay Belly.channel, note1, (velo1 / 2) OR 1 PlayBelly note1, (velo1/2) OR 1, 35 CASE ELSE note1 = FIX(spn1) + 1 'mPlay Belly.channel, note1, (velo1 / 2) OR 1 PlayBelly note1, (velo1/2) OR 1, 35 END SELECT END IF oln2 = PlayLlor (spn2, velo2,15) IF ISFALSE oln2 THEN ' Llor could not mPlay it... SELECT CASE FRAC(spn2) CASE < 0.50 note2 = FIX(spn2) IF note2 <> note1 THEN 'mPlay Belly.channel, note2, (velo2 / 2) OR 1 PlayBelly note2, (velo2 /2) OR 1, 35 END IF CASE ELSE note2 = FIX(spn2) + 1 IF note2 <> note1 THEN 'mPlay Belly.channel, note2, (velo2 / 2) OR 1 PlayBelly note2, (velo2/2) OR 1, 35 END IF END SELECT END IF Task(%QuadraLlor).freq = (qvek.tempo / 60!) * Speed2TempoFaktor(1) END SUB SUB QuadraWet () ' %QuaWet ' performance composition by Godfried-Willem Raes - 13.04.2005 ' for Dripper and a naked body. (Butoh dance) ' for Emilie D Vlam LOCAL b1 AS DWORD LOCAL i AS DWORD IF ISFALSE Task(%Quawet).tog THEN IF ISFALSE Task(%Quadradar_Vectors).swit THEN Starttask %Quadradar_Vectors Task(%QuaWet).tog = %True END IF IF @pr(0).xf THEN ' doppler frequency, not angle corrected! - dripper 1 DO b1 = RND(1) * 4 LOOP UNTIL bitcount (b1) = MIN(@pr(0).xf/ 5 , 4) FOR i = 0 TO 3 IF BIT (b1,i) THEN mPlay Dripper.channel, i , MIN(@pr(0).s, 127) ' notes 0,1,2,3 END IF NEXT i END IF IF @pr(1).xf THEN ' doppler frequency, not angle corrected! - dripper 2 DO b1 = RND(1) * 4 LOOP UNTIL bitcount (b1) = MIN(@pr(1).xf/ 5 , 4) FOR i = 0 TO 3 IF BIT (b1,i) THEN mPlay Dripper.channel, i+ 4 , MIN(@pr(1).s, 127) ' notes 4,5,6,7 END IF NEXT i END IF IF @pr(2).xf THEN ' doppler frequency, not angle corrected! - dripper 3 DO b1 = RND(1) * 4 LOOP UNTIL bitcount (b1) = MIN(@pr(2).xf/ 5 , 4) FOR i = 0 TO 3 IF BIT (b1,i) THEN mPlay Dripper.channel, i+ 8 , MIN(@pr(2).s, 127) ' notes 8,9,10,11 END IF NEXT i END IF IF @pr(3).xf THEN ' doppler frequency, not angle corrected! - dripper 4 - special case, may have only 1 drip! DO b1 = RND(1) * 4 LOOP UNTIL bitcount (b1) = MIN(@pr(3).xf/ 5 , 4) FOR i = 0 TO 3 IF BIT (b1,i) THEN mPlay Dripper.channel, i+ 12 , MIN(@pr(3).s, 127) ' notes 12,13,14,15 END IF NEXT i END IF Task(%QuaWet).freq = MAX(@pr(0).Xf,@pr(0).yf, @pr(1).xf, @pr(1).yf, @pr(2).xf, @pr(2).yf, @pr(3).xf, @pr(4).yf) IF Task(%QuaWet).freq > 16 THEN task(%QuaWet).freq = 16 IF Task(%QuaWet).freq < 2 THEN Task(%QuaWet).freq = 2 END SUB SUB QuadRa_Vacca() ' "Qua Vacca", quadrada study #9 'debugging by kl 20051103: 'na vervangen van slechte kabel werkt alles goed.. STATIC note1 AS DWORD STATIC note2 AS DWORD STATIC velo1 AS DWORD STATIC velo2 AS DWORD STATIC oldnote1 AS DWORD STATIC oldnote2 AS DWORD LOCAL p AS INTEGER PTR IF ISFALSE Task(%Quadra_Vacca).tog THEN Task(%Quadra_Vacca).tog = %True 'logfile "", FUNCNAME$ END IF IF @pr(3).xf THEN note1 = 48 + MIN(@pr(3).xf , 47) '47 was 48, maar vacca.hightes = 95 - doppler frequency, not angle corrected! - vacca-range ' logfile "xf, note1" + STR$(@pr(2).xf) + STR$(note1) ELSE note1 = %False END IF IF @pr(3).yf THEN note2 = 48 + MIN(@pr(3).yf, 47) '47 was 48 ' logfile "yf, note2" + STR$(@pr(2).yf) + STR$(note2) ELSE note2 = %False END IF velo1 = MIN(@pr(3).s , 127) velo2 = MIN(@pr(3).s , 127) ' logfile "velo" + STR$(2 * SQR(@pr(2).s)) IF note1 THEN IF velo1 THEN mPlay Vacca.channel,note1, velo1 END IF END IF IF note2 THEN IF velo2 THEN IF note2 <> note1 THEN mPlay Vacca.channel, note2,velo2 END IF END IF END IF ' Task(%Quadra_Vacca).freq = MAX(@pr(3).Xf,@pr(3).yf) 'changed kl 20051103, as .xf goes up to 40 (peek values up to 64 reported earlier where due to oscillations) Task(%Quadra_Vacca).freq = MAX(@pr(3).Xf,@pr(3).yf) / 2 ' logfile "freq:" + STR$(Task(%Quadra_Vacca).freq) IF Task(%Quadra_Vacca).freq > 16 THEN task(%Quadra_Vacca).freq = 16 IF Task(%Quadra_Vacca).freq < 2 THEN Task(%Quadra_Vacca).freq = 2 END SUB SUB QuadRa_Vitello() ' "Qua Vitello", quadrada study #10 STATIC note1 AS DWORD STATIC note2 AS DWORD STATIC velo1 AS DWORD STATIC velo2 AS DWORD STATIC oldnote1 AS DWORD STATIC oldnote2 AS DWORD LOCAL p AS INTEGER PTR IF ISFALSE Task(%Quadra_Vitello).tog THEN Task(%Quadra_Vitello).tog = %True 'logfile "", FUNCNAME$ END IF IF @pr(2).xf THEN note1 = 96 + MIN(@pr(2).xf , 31) ' doppler frequency, not angle corrected! ' logfile "xf, note1" + STR$(@pr(2).xf) + STR$(note1) ELSE note1 = %False END IF IF @pr(2).yf THEN note2 = 96 + MIN(@pr(2).yf, 31) ' logfile "yf, note2" + STR$(@pr(2).yf) + STR$(note2) ELSE note2 = %False END IF velo1 = MIN(@pr(2).s , 127) velo2 = MIN(@pr(2).s , 127) ' logfile "velo" + STR$(2 * SQR(@pr(2).s)) IF note1 THEN IF velo1 THEN mPlay Vitello.channel,note1, velo1 END IF END IF IF note2 THEN IF velo2 THEN IF note2 <> note1 THEN mPlay Vitello.channel, note2,velo2 END IF END IF END IF IF (note1 AND note2) THEN mPlay Vitello.channel, 12 + ((velo1 + velo2)/ 43), 127 ELSE MM_Vitello_Off %MM_Lights END IF ' Task(%Quadra_Vitello).freq = MAX(@pr(3).Xf,@pr(3).yf) 'changed kl 20051103, as .xf goes up to 40 (peek values up to 64 reported earlier where due to oscillations) Task(%Quadra_Vitello).freq = MAX(@pr(2).Xf,@pr(2).yf) / 2 ' logfile "freq:" + STR$(Task(%Quadra_Vitello).freq) IF Task(%Quadra_Vitello).freq > 16 THEN task(%Quadra_Vitello).freq = 16 IF Task(%Quadra_Vitello).freq < 2 THEN Task(%Quadra_Vitello).freq = 2 END SUB SUB Quadra_Xy () ' "Qua Xy" , quadrada study #13 ' requires the quadrada setup, unlike Quadrada Vectorial. ' Uses a single transducer: nr.1 : the next one after the one used with quadra-puff STATIC note1 AS DWORD STATIC note2 AS DWORD STATIC velo1 AS DWORD STATIC velo2 AS DWORD STATIC oldnote1 AS DWORD STATIC oldnote2 AS DWORD LOCAL p AS INTEGER PTR IF ISFALSE Task(%Quadra_Xy).tog THEN Task(%Quadra_Xy).tog = %True Task(%Quadra_Xy).channel = Xy.channel END IF IF @pr(0).xf THEN ' doppler frequency, not angle corrected! note1 = Xy.lowtes + MIN(@pr(1).xf , Xy.hightes - Xy.lowtes) ' normal notes ELSE note1 = %False END IF IF @pr(1).yf THEN note2 = Xy.lowtes + MIN(@pr(1).yf, Xy.hightes - Xy.lowtes) ' quartertones ELSE note2 = %False END IF velo1 = MIN(@pr(1).s, 127) velo2 = MIN(@pr(1).s, 127) ' lights (red) IF velo1 > 10 THEN MM_Xy_On %MM_Red oldnote1 = %True ELSE IF oldnote1 THEN MM_Xy_Off %MM_Lights oldnote1 = %False END IF END IF IF velo2 > 10 THEN MM_Xy_On %MM_White oldnote2 = %True ELSE IF oldnote2 THEN MM_Xy_Off %MM_Lights oldnote2 = %False END IF END IF IF note1 THEN IF velo1 THEN mPlay Xy.channel,note1, velo1 END IF END IF IF note2 THEN IF velo2 THEN mPlay Xyq.channel, note2,velo2 END IF END IF Task(%Quadra_Xy).freq = MAX(@pr(1).Xf,@pr(1).yf) IF Task(%Quadra_Xy).freq > 20 THEN task(%Quadra_Xy).freq = 20 IF Task(%Quadra_Xy).freq < 2 THEN Task(%Quadra_Xy).freq = 2 END SUB SUB Quadra_Qt () ' "Qua Qt" , quadrada study #14 ' requires the quadrada setup, unlike Quadrada Vectorial. ' Uses two transducers: nr.2and 3 : the next one after the ones used with quadra-puff and quadra Xy STATIC note1 AS DWORD STATIC note2 AS DWORD STATIC velo1 AS DWORD STATIC velo2 AS DWORD STATIC oldnote1 AS DWORD STATIC oldnote2 AS DWORD LOCAL p AS INTEGER PTR IF ISFALSE Task(%Quadra_Qt).tog THEN Task(%Quadra_Qt).tog = %True Task(%Quadra_Qt).channel = Qt.channel END IF IF note1 THEN NoteOff Qt.channel, note1 END IF IF @pr(2).xf THEN ' doppler frequency, not angle corrected! note1 = Qt.lowtes + MIN(@pr(2).xf , Qt.hightes - Qt.lowtes) ' normal notes ELSE note1 = %False END IF IF note2 THEN NoteOff Qt.channel, note2 END IF IF @pr(3).yf THEN note2 = Qt.lowtes + MIN(@pr(3).xf, Qt.hightes - Qt.lowtes) ' quartertones ELSE note2 = %False END IF velo1 = MIN(@pr(2).s, 127) velo2 = MIN(@pr(3).s, 127) ' lights (red) IF velo1 > 10 THEN MM_Qt_On %MM_Blue oldnote1 = %True ELSE IF oldnote1 THEN MM_Qt_Off %MM_Lights oldnote1 = %False END IF END IF IF velo2 > 10 THEN MM_Qt_On %MM_Blue oldnote2 = %True ELSE IF oldnote2 THEN MM_Qt_Off %MM_Lights oldnote2 = %False END IF END IF IF note1 THEN IF velo1 THEN mPlay Qt.channel,note1, velo1 END IF END IF IF note2 THEN IF velo2 THEN mPlay Qtq.channel, note2,velo2 END IF END IF Task(%Quadra_Qt).freq = MAX(@pr(2).Xf,@pr(2).yf,@pr(3).xf, @pr(3).yf) IF Task(%Quadra_Qt).freq > 12 THEN task(%Quadra_Qt).freq = 12 IF Task(%Quadra_Xy).freq < 1 THEN Task(%Quadra_Xy).freq = 1 END SUB SUB Quadra_Casta () ' performance composition by Godfried-Willem Raes - 09.05.2007 ' for two Casta modules and one or two naked bodies. (Butoh dance) LOCAL b1 AS DWORD LOCAL i AS DWORD IF ISFALSE Task(%QuaCasta).tog THEN IF ISFALSE Task(%Quadradar_Vectors).swit THEN Starttask %Quadradar_Vectors Task(%QuaCasta).tog = %True END IF IF @pr(0).xf THEN ' doppler frequency, not angle corrected! - Casta 1 DO b1 = RND(1) * 7 LOOP UNTIL bitcount (b1) = MIN(@pr(0).xf/ 5 , 7) FOR i = 0 TO 6 IF BIT (b1,i) THEN mPlay Casta.channel, 113+ i , MIN(@pr(0).s, 127) ' notes 113,114,115,116,117,118,119 END IF NEXT i END IF IF @pr(1).xf THEN ' doppler frequency, not angle corrected! - casta 1 DO b1 = RND(1) * 8 LOOP UNTIL bitcount (b1) = MIN(@pr(1).xf/ 5 , 8) FOR i = 0 TO 7 IF BIT (b1,i) THEN mPlay Casta.channel, 120 + i , MIN(@pr(1).s, 127) ' notes 120-127 END IF NEXT i END IF IF @pr(2).xf THEN ' doppler frequency, not angle corrected! - casta 2 - left wing DO b1 = RND(1) * 8 LOOP UNTIL bitcount (b1) = MIN(@pr(2).xf/ 5 , 8) FOR i = 0 TO 7 IF BIT (b1,i) THEN mPlay Casta2.channel, 112+i , MIN(@pr(2).s, 127) ' notes 112-119 END IF NEXT i END IF IF @pr(3).xf THEN ' doppler frequency, not angle corrected! - casta 2 - right wing DO b1 = RND(1) * 8 LOOP UNTIL bitcount (b1) = MIN(@pr(3).xf/ 5 , 8) FOR i = 0 TO 7 IF BIT (b1,i) THEN mPlay Casta2.channel, 120+i , MIN(@pr(3).s, 127) ' notes 120-127 END IF NEXT i END IF Task(%QuaCasta).freq = MAX(@pr(0).Xf,@pr(0).yf, @pr(1).xf, @pr(1).yf, @pr(2).xf, @pr(2).yf, @pr(3).xf, @pr(4).yf) IF Task(%QuaCasta).freq > 32 THEN task(%QuaCasta).freq = 32 IF Task(%QuaCasta).freq < 2 THEN Task(%QuaCasta).freq = 2 END SUB SUB Quadra_Rotomoton () ' added 13.09.2007 ' using all 4 vectors. ' requires the quadrada setup, unlike Quadrada Vectorial. STATIC velo1 AS DWORD STATIC velo2 AS DWORD STATIC oldnote1 AS DWORD STATIC oldnote2 AS DWORD STATIC cnt AS DWORD 'LOCAL p AS INTEGER PTR IF ISFALSE Task(%Qua_Roto).tog THEN cnt = %False Task(%Qua_Roto).tog = %True Task(%Qua_Roto).channel = Rotomoton.channel END IF ' motor pitch controls: IF @pr(0).xf THEN ' doppler frequency, not angle corrected! IF ISFALSE cnt MOD 5 THEN Controller Rotomoton.channel, 102 ,MIN(@pr(0).xf,127) ' tenor drum Rotomoton.ctrl(102) = MIN(@pr(0).xf,127) END IF mPlay Rotomoton.channel, 51 + MIN(2,@pr(0).s /42), MIN(@pr(0).s, 127) ELSE INCR cnt END IF IF @pr(1).xf THEN IF cnt MOD 5 = 1 THEN Controller Rotomoton.channel, 103, MIN(@pr(1).xf,127) ' alto Rotomoton.ctrl(103) = MIN(@pr(1).xf,127) END IF mPlay Rotomoton.channel, 54 + MIN(1,@pr(1).s /64), MIN(@pr(1).s, 127) ELSE INCR cnt END IF IF @pr(2).xf THEN IF cnt MOD 5 = 2 THEN Controller Rotomoton.channel, 104, MIN(@pr(2).xf,127) ' mezzo Rotomoton.ctrl(104) = MIN(@pr(2).xf,127) END IF mPlay Rotomoton.channel, 56 + MIN(1,@pr(2).s /64), MIN(@pr(2).s, 127) ELSE INCR cnt END IF IF @pr(3).xf THEN IF cnt MOD 5 = 3 THEN Controller Rotomoton.channel, 105, MIN(@pr(3).xf,127) ' soprano Rotomoton.ctrl(105) = MIN(@pr(3).xf,127) END IF mPlay Rotomoton.channel, 58 + MIN(1,@pr(3).s /64), MIN(@pr(3).s, 127) ELSE INCR cnt END IF ' bass drum: IF @pr(4).v THEN IF cnt MOD 5 = 4 THEN Controller Rotomoton.channel, 101, MIN(@pr(4).v, 127) Rotomoton.ctrl(101) = MIN(@pr(4).v, 127) END IF 'Controller Rotomoton.channel, 101, (Rotomoton.ctrl(102) + Rotomoton.ctrl(103) + Rotomoton.ctrl(104) + Rotomoton.ctrl(105))/ 4 'Rotomoton.ctrl(101) = (Rotomoton.ctrl(102) + Rotomoton.ctrl(103) + Rotomoton.ctrl(104) + Rotomoton.ctrl(105))/ 4 mPlay Rotomoton.channel, 48 + MIN(2,@pr(4).s /42), MIN(@pr(4).s, 127) END IF INCR cnt velo1 = MIN(@pr(4).s, 127) velo2 = MIN(@pr(4).s, 127) ' lights (blue) IF velo1 > 10 THEN MM_Rotomoton_On %MM_Blue oldnote1 = %True ELSE IF oldnote1 THEN MM_Rotomoton_Off %MM_Lights oldnote1 = %False END IF END IF IF velo2 > 64 THEN MM_Rotomoton_On %MM_White oldnote2 = %True ELSE IF oldnote2 THEN MM_Rotomoton_Off %MM_Lights oldnote2 = %False END IF END IF Task(%Qua_Roto).freq = MAX(@pr(3).Xf,@pr(3).yf) IF Task(%Qua_Roto).freq > 13 THEN task(%Quadra_Xy).freq = 13 ' to be tested. IF Task(%Qua_Roto).freq < 2 THEN Task(%Quadra_Xy).freq = 2 END SUB SUB Quadra_Korn () ' requires square setup - korn performs a movement tracking ballet STATIC cnt AS DWORD STATIC topo_left AS SINGLE STATIC topo_right AS SINGLE STATIC topo_up AS SINGLE STATIC topo_down AS SINGLE STATIC oldnoot AS INTEGER LOCAL horpos AS INTEGER LOCAL verpos AS INTEGER LOCAL noot AS INTEGER LOCAL velo AS INTEGER IF ISFALSE Task(%Quadra_Korn).tog THEN cnt = %False MM_Korn_On topo_left = 64 + @pr(0).s + @pr(3).s topo_right = 64 + @pr(1).s + @pr(2).s Task(%Quadra_Korn).freq = 16 Task(%Quadra_KOrn).tog = %True END IF ' calculate integrated position of movement on stage (left right on stage area) topo_left = ((topo_left * 24) + @pr(0).amp + @pr(3).amp ) /26.0 ' low pass and integrator 1 second topo_right = ((topo_right * 24) + @pr(1).amp + @pr(2).amp ) / 26.0 horpos = 64 + (topo_left - topo_right) horpos = MAX(0,horpos) horpos = MIN(127, horpos) IF horpos <> Korn.ctrl(21) THEN IF ISFALSE cnt MOD 8 THEN ' 2 times a second Controller Korn.channel, 21, horpos Korn.ctrl(21) = horpos END IF END IF ' calculate integrated position of movement on stage (front back area) ' when movement is in the back, korn should move downwards ' when movement is in the front, korn should erect topo_up = ((topo_up * 18) + @pr(0).amp + @pr(2).amp ) /20.0 ' low pass and integrator 1 second topo_down = ((topo_down * 18) + @pr(1).amp + @pr(3).amp ) / 20.0 verpos = 64 + (topo_up - topo_down) verpos = MAX(0,verpos) verpos = MIN(127, verpos) noot = 58 IF verpos <> Korn.ctrl(22) THEN IF ISFALSE cnt MOD 9 THEN Controller Korn.channel, 22, verpos Korn.ctrl(22) = verpos IF Korn.ctrl(124) THEN mPlay Korn.channel, 124, %False ' wit uit Korn.ctrl(124) = %False END IF IF ISFALSE Korn.ctrl(125) THEN mPlay Korn.channel, 125, 64 ' blauw aan Korn.ctrl(125) = %True END IF END IF ELSE IF ISFALSE Korn.ctrl(124) THEN mPlay Korn.channel, 124, 64 ' wit aan Korn.ctrl(124) = %True END IF IF Korn.ctrl(125) THEN mPlay Korn.channel, 125, %False ' blauw uit Korn.ctrl(125) = %False END IF END IF ' nootjes: IF ISFALSE cnt MOD INT((4 - (@pr(4).acc * 3))) THEN ' acc range is -1 to + 0.5 velo = MAX(@pr(0).amp, @pr(1).amp, @pr(2).amp, @pr(3).amp) velo = MIN(SQR(velo)* 8, 127) ' on body mass - was *6 noot = MAX(@pr(0).xf, @pr(1).xf, @pr(2).xf, @pr(3).xf) noot = MAX(noot, @pr(4).vf) ' integrated value IF noot THEN noot = Korn.lowtes + MIN(noot , 47) noot = MIN(91, noot) ELSE noot = %False END IF IF (velo> 0) AND (noot > 0) THEN mPlay Korn.channel, noot, velo oldnoot = noot mPlay Korn.channel, 126, 64 mPlay Korn.channel, 127, 64 ELSE IF oldnoot THEN mPlay Korn.channel, oldnoot, %False oldnoot = %False mPlay Korn.channel, 126, %False mPlay Korn.channel, 127, %False 'Controller Korn.channel, 123, %False END IF END IF END IF INCR cnt SetDlgItemText gh.Cockpit, %GMT_MSG1, "left " & FORMAT$(topo_left,"###.#") & " right " & FORMAT$(topo_right,"###.#") SetDlgItemText gh.Cockpit, %GMT_MSG2, "front " & FORMAT$(topo_up,"###.#") & " back " & FORMAT$(topo_down,"###.#") END SUB 'EOF