' *************************************************************************** ' * * ' * Include file for gesture controlled robots * ' * using Sonar invisible instrument and a naked player * ' * * ' * 2002-2010 * ' * Interactive compositions for the M&M ensemble * ' * by * ' * Godfried-Willem Raes * ' *************************************************************************** ' 20.03.2002: should be independent of BOM & Songbook code. ' 24.03.2002: g_indep.dll extended with statistics functions for data acquisition ' 20.04.2002: Belly support added. ' This piece needs at least the MidiMan 4x4 midi interface. ' 06.05.2002: Autosax and Harma added. ' 12.05.2002: Gero_Harma debugged and checked. ' 25.05.2002: Performace Havisax - Ittre kasteel Snoy. ' 15.06.2002: variable ini-file based port assignments added. Now code should be hardware compatible ' with other M&M orchestra settings and coding. ' 05.09.2002: performed with M&M ' 02.11.2002: Performances in Krakow, Poland ' 15.01.2003: M&M concert Ghent. ' Gero_Springer added. ' 30.01.2003: ADXL202 device support added. ' 16.04.2003: adapted to new DAQ coding in dll. ' 06.05.2003: tubi support added. ' 10.06.2003: Flex support added. ' 18.08.2003: So support added. ' 20.09.2003: Sonar control added: cockpit sliders were not in use in this code, so no changes implied. ' 06.10.2003: revisit for preparation of Vooruit performances. ' 08.10.2003: CQT device support added. - coding Vivoges started. ' 09.10.2003: further coding on harmony for violin/voice input. ' gestrobo.bi file split of from bom.bi file. ' uses newly implemented CQT control window. ' 12.10.2003: finishing code Vivoges . ' 15.10.2003: rehearsal session. ' 01.11.2003: rechecked with new DAQ coding. ' 02.11.2003: GeroStat renamed to GeroThun ' 15.12.2003: GerPuff added. (start) ' 05-09/02.2004: performances in Madrid and Aielo de Malferit (Valencia) ' 17.03.2004: orange lights (fire) added in GeroPuff. ' 19-20/03.2004: performances in Maubeuge (Borderline Festival) ' 02/03/04.2004: performances in Creteil (Paris) (Exit Festival) ' 19.05.2004: file player used with sonar for tempo extraction (Albeniz Tango met Lazara en Emilie) ' 06.07.2004: GeroHurdy added. ' 11.07.2004: GeroTrump written. Ready for test now. ' 14.07.2004: test gerohurdy & gerotrump ' 17.07.2004: test met nieuwe PIC firmware ' 20.11.2004: robot ctrl. window added. ' 30.11.2004: GeroLlor added. ' 13.03.2005: GeroPiBo debug. GeroAke added.Start implementation of GeroPipe ' 13.06.2005: start implementation of ' 28.08.2005: cqt listen now used in dll. ' 23.04.2006: start adding ' 11.09.2006: rev. for M&M performances original works - complete code run-through ' psch added. ' we have ii-code for all machines in M&M, except QT, Sire and Snar. Casta missing also. ' 12.09.2006: debug sessie nieuwe modules ' GeroCasta added ' 13.09.2006: rehearsal session gwr. ' 15.09.2006: coding adapted to new belly hardware ' 11.01.2007: to do: add Bako and adapt Rotomoton. ' 18.02.2007: Qt added. ' 10.04.2007: Xy added. ' 09.05.2007: Casta added. ' 13.09.2007: Rotomoton code revised and adapted to new implementation. ' 26.08.2008: Start provisions for coding Gero Toypi ' 01.12.2008: to be added: Heli, Korn, Bono, Ob ' 05.12.2008: Score meta-task added, for automatic instrumentation 06.12.2008 3 minute version 'Flash' ' 22.05.2008: when using qeueud timers, the startpointers to MM_xxxx_on seemed to cause crashes.. '(something to do with their optional param? startex functions are supposed to have no params ' so we removed them now. Init_MM should do the job anyway.. ' 03.06.2009: metaconstant added for used libs '#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 for use with NiDAQmx gwr. ' 08.06.2009: seems to run on \\No and on \\Xi, however with different metacompilation files... ' 20.07.2009: some code sections recycled in the Butoh compilation for 22.07.09 ' 09.10.2009: code adaptations for work with Dominica Eyckmans ' 10.10.2009: GeroFFT debugged and modified. Now it works. ' 11.10.2009: further improvements on GeroFFT coding. ' 10.01.2010: Harma/HarmO implementation change. Inversion code for Casta added. '%GeroListen = 16 '%GeroSilmon = 17 %GeroScore = 18 %GeRoPiBo = 19 ' mapping on piperola and bourdonola - non positional %GeroTrio = 21 ' mapping on Harma, Piperola/Bourdonola or Piano, Vox Humanola %GeroHaVi = 24 ' mapping op vibi,harma en autosax 12.05.2002 - Kulak %GeroRain = 25 ' 11.11.2002 mapping op dripper x,y,z ' also uses tasks 26,27,28 %Vivoges = 29 ' 07.10.2003 - violin/voice and dance : for Moniek and Emilie %GeRoFft = 31 ' made operational 10.10.2009 : For Dominica ' uses piano, harma, piperola, bourdonola and optional Humanola, Qt, Krum ' alfabetic resorting of procedures: - 32 robots implemented. ' for expansion we need another column in the cockpit %GeroAke = 32 ' 13.03.2005 %GeroSax = 33 ' y 06.05.2002 %GeroBelly = 34 ' x 18.04.2002 %GeroBourdonola = 35 ' %GeroCasta = 36 ' & %GeroFlex = 37 ' xy 2002 %GeroHarma = 38 ' 2001 - now harmO (2010) %GeroHurdy = 39 ' 06.07.2004 %GeroKlung = 40 ' xyz 23.03.2002 %GeroKrum = 41 %GeroLlor = 42 ' y 30.11.2004 %GeroPia = 43 %GeroPiperola = 44 ' '13.03.2005 %GeroPsch = 45 ' 11.09.2006 %GeroPuff = 46 ' 14.12.2003 - preliminary puffins %Gero_Qt = 47 %GeroRoto = 48 ' y 22.03.2002 %GeroSimba = 49 ' 13.09.2007 %GeroSire = 50 %GeroSpringer = 51 ' xyz 14.01.2003 %GeroSnar = 52 %GeroSo = 53 ' x 18.08.2003 %GeroThunder = 54 ' 02.03.2003 was Gerostat before 02.11.2003 %GeroToypi = 55 ' 26.08.2008 %GeroTroms = 56 ' x 21.03.2002 %GeroTrump = 57 ' 13.01.2004 %GeroTubi = 58 ' xy 07.05.2003 %GeroVacca = 59 ' 13.06.2005 %GeroVibi = 60 ' z 22.03.2002 %GeroVitello = 61 ' 23.04.2006 %GeroHumanola = 62 ' %GeroXy = 63 ' 10.04.2007 ' Xtof: %iax = 9 '61 ' 48 'for interactive midiplayer %mvrec = 10 '62 '49 'for recording of movement data %mvrec_metro = 11 '63 '50 'metronome for mover %writedat = 13 GLOBAL pADXL202 AS AccelSensDevice PTR GLOBAL CQT AS Pitch2MidiType ' used also in and in ' type extended since 09.10.2003 DECLARE CALLBACK FUNCTION CBFileFreq DECLARE SUB dummyplayer(OPT BYVAL rst AS LONG, OPT BYVAL pause AS LONG) 'we only need declaration for calldword using.. FUNCTION Gestrobo_Init () AS DWORD LOCAL CockpitLayo AS CockpitLabels LOCAL m AS ASCIIZ * 40 LOCAL i AS BYTE LOCAL j AS BYTE LOCAL p AS DWORD LOCAL cptr AS DWORD 'REDIM DFTarray(32,1) AS GLOBAL SINGLE ' for Fourier analysis - single removed 10.10.2009 IF App.id <> %ID_II_ROBOTS THEN MSGBOX "Initialisation error: wrong app.id",,FUNCNAME$ EXIT FUNCTION END IF IF ISFALSE DAQparams.id THEN FUNCTION = %False : EXIT FUNCTION DAQparams.mode = %DAQ_NI ' Initialisation of Sonar Invisible Instrument: 'p = GetSonarPointer cptr = GetProcAddress(gh.gnh, "GETSONARPOINTER") CALL DWORD cptr USING GetSonarPointer TO p sr = p DIM DataBuf3(255) AS GLOBAL INTEGER AT @sr.pb(3) ' this is only for compatibility with older code. DIM DataBuf7(255) AS GLOBAL INTEGER AT @sr.pb(7) ' still in use in GeroStat proc. 'i = Sonar_DAQ (%DAQ_DOUBLEBUFFER) ' start data acquisition cptr = GetPRocAddress(gh.gnh, "SONAR_DAQ") CALL DWORD cptr USING Sonar_DAQ(%DAQ_DOUBLEBUFFER) TO i ' initialize values for dta and dtf: @sr.noise = 0 @sr.dta = 8 ' integration depth for amplitudes returned in @sr.xys, @sr.xzs etc... @sr.ascale = 2 ' for accelleration calculation ReadCockpitLabelsFromFile $GestroboIni, CockpitLayo Task(0).naam = "" Task(0).cPtr = %False Task(App.WriteSeqScoreTaskNr).cptr = %False Task(App.WriteSeqScoreTaskNr).naam = "" ' initialisation of tasks: Task(%Sonar_VU_Task).naam = "" ' 1 Task(%Sonar_VU_Task).cPtr = GetProcAddress(gh.gnh,"SONAR_II_VU") Task(%Sonar_VU_Task).freq = 8 Task(%Sonar_VU_Task).flags = %DLL_TASK OR %PERTIM_TASK Task(%Sonar_Display_Task).naam = "" Task(%Sonar_Display_Task).cPtr = GetProcAddress(gh.gnh,"SONAR_DISPLAY") Task(%Sonar_Display_Task).freq = 20 Task(%Sonar_Display_Task).flags = %DLL_TASK OR %PERTIM_TASK Task(%Sonar_Stat_Task).naam = "" ' 13 Task(%Sonar_Stat_Task).cptr= GetProcAddress(gh.gnh, "SONAR_STATISTICS_DISPLAY") Task(%Sonar_Stat_Task).freq = 16 ' also set in dll Task(%Sonar_Stat_Task).channel = 3 ' show statistics for surface channels Task(%Sonar_Stat_Task).flags = %DLL_TASK OR %PERTIM_TASK Task(%writedat).naam = "writedata" Task(%writedat).freq = 1024/12 'DaqMX smpling rate = 1024, callback every 12 samples Task(%writedat).cptr = CODEPTR(WriteMovementData) IF CheckConditions (app, hMidiI(), hMidiO()) THEN ' for 'Vivoges' - changed 28.08.20905: now using cqt listen in dll. CQT.listentasknr = %Listen_Task Task(CQT.listentasknr).naam = "Listen" ' 16 Task(CQT.listentasknr).freq = 100 Task(CQT.listentasknr).cptr = GetProcAddress(gh.Instdll,"CQT_Listen") ' in g_lib.dll Task(CQT.listentasknr).flags = %MIDI_TASK OR %HARM_TASK OR %PERTIM_TASK OR %DLL_TASK 'Task(%GeroSilmon).naam = "SilMon" 'Task(%GeroSilmon).cptr = CODEPTR(Gero_CQT_Silmon) 'Task(%GeroSilmon).freq = 10 'Task(%GeroSilmon).flags = %PERTIM_TASK ' initialisation of tasks: Task(%GeroScore).cPtr = CODEPTR(GeroScore) Task(%GeroScore).naam = "SCORE" Task(%GeroScore).freq = 1 Task(%GeroScore).flags = %False 'TaskEX(%GeroScore).StopCptr = CODEPTR(MM_All_Off) Task(%GeroPiBo).cPtr = CODEPTR(GeRoPiBo) Task(%GeroPiBo).naam = "GeRoPiBo" Task(%GeRoPiBo).freq = 6 TaskEX(%GeRoPiBo).StopCptr = CODEPTR(GeRoPiBo_Stop) Task(%GeRoPia).cptr = CODEPTR(GeRoPia) Task(%GeRoPia).naam = "Piano" Task(%GeRoPia).freq = 8 TaskEX(%GeRoPia).StopCptr = CODEPTR(MM_Piano_Off) 'GeRoPia_Stop) Task(%GeRoTrio).cptr = CODEPTR(GeRoTrio) Task(%GeroTrio).naam = "GeRoTrio" Task(%GeroTrio).freq = 20 TaskEX(%GeroTrio).StopCptr = CODEPTR(GeRoFft_Stop) Task(%GeRoHavi).cptr = CODEPTR(GeRo_Havi) Task(%GeroHavi).naam = "GeRoHaVi" Task(%GeroHavi).freq = 20 TaskEX(%GeroHaVi).StopCptr = CODEPTR(GeRo_Havi_Stop) Task(%GeRoFft).cptr = CODEPTR(GeRoFft) Task(%GeRoFft).naam = "GeRoFft" Task(%GeRoFft).freq = 4 TaskEX(%GeRoFft).StopCptr = CODEPTR(GeRoFft_Stop) Task(%GeroThunder).cptr = CODEPTR(GeRo_Thunder) Task(%GeroThunder).naam = "Thunder" Task(%GeroThunder).freq = 8 ' TaskEX(%GeroThunder).StartCptr = CODEPTR(MM_ThunderWood_On) TaskEX(%GeroThunder).StopCptr = CODEPTR(MM_ThunderWood_Off) 'GeRo_Thunder_Stop) Task(%GeroTroms).naam = "Troms" Task(%GeroTroms).cptr = CODEPTR(Gero_Troms) Task(%GeroTroms).freq = 4 Task(%GeroRoto).naam = "Rotomoton" Task(%GeroRoto).cptr = CODEPTR(Gero_Roto) Task(%GeroRoto).freq = 4.1 ' TaskEX(%GeroRoto).startcptr = CODEPTR(MM_Rotomoton_On) TaskEX(%GeroRoto).stopcptr = CODEPTR(MM_Rotomoton_Off) Task(%GeroVibi).naam = "Vibi" Task(%GeroVibi).cptr = CODEPTR(Gero_Vibi) Task(%GeroVibi).freq = 4.2 ' TaskEX(%GeroVibi).startCptr = CODEPTR(MM_Vibi_On_Alt) Task(%GeroKlung).naam = "Klung" Task(%GeroKlung).cptr = CODEPTR(Gero_Klung) Task(%GeroKlung).freq = 3.99 ' TaskEX(%GeroKlung).startcptr = CODEPTR(MM_Klung_On) TaskEX(%GeroKlung).stopcptr = CODEPTR(MM_Klung_Off) Task(%GeroBelly).naam = "Belly" Task(%GeroBelly).cptr = CODEPTR(Gero_Belly) Task(%GeroBelly).freq = 6 ' TaskEX(%GeroBelly).startcptr = CODEPTR(MM_Belly_On) TaskEX(%GeroBelly).stopcptr = CODEPTR(MM_Belly_Off) Task(%GeroSax).naam = "AutoSax" Task(%GeroSax).cptr = CODEPTR(Gero_Sax) Task(%GeroSax).freq = 12 ' TaskEX(%GeroSax).startcptr = CODEPTR(MM_AutoSax_On) TaskEX(%GeroSax).stopcptr = CODEPTR(MM_AutoSax_Off) Task(%GeroHarma).naam = "Harma" Task(%GeroHarma).cptr = CODEPTR(Gero_Harma) Task(%GeroHarma).freq = 9 ' TaskEX(%GeroHarma).startcptr = CODEPTR(MM_Harma_On) TaskEX(%GeroHarma).stopcptr = CODEPTR(MM_Harma_Off) Task(%GeroRain).naam = "Dripper" Task(%GeroRain).cptr = CODEPTR(Gero_Dripper) Task(%GeroRain).freq = 8 'TaskEX(%GeroRain).StartCptr = codeptr(MM_Dripper_On) - non existing procedure!!! TaskEX(%GeroRain).StopCptr = CODEPTR(GeRo_Dripper_Stop) Task(%GeroRain+1).naam = "Drip03" Task(%GeroRain+2).naam = "Drip47" Task(%GeroRain+3).naam = "Drip8F" Task(%GeroRain+1).cptr = CODEPTR(Gero_Drip1) Task(%GeroRain+2).cptr = CODEPTR(Gero_Drip2) Task(%GeroRain+3).cptr = CODEPTR(Gero_Drip3) Task(%GeroRain+1).freq = 1 Task(%GeroRain+2).freq = 1 Task(%GeroRain+3).freq = 1 Task(%GeroSpringer).naam = "Springers" Task(%GeroSpringer).cptr = CODEPTR(Gero_Springer) Task(%GeroSpringer).freq = 10 TaskEX(%GeroSpringer).StopCptr = CODEPTR(MM_Springers_Off) 'TaskEX(%GeroSpringer).startcptr = codeptr(MM_Springers_On) - non existing proc. Task(%GeroFlex).naam = "Flex" Task(%GeroFlex).cptr = CODEPTR(Gero_Flex) Task(%GeroFlex).freq = 2 TaskEX(%GeroFlex).StopCptr = CODEPTR(MM_Flex_Off) 'Gero_Flex_Stop) Task(%GeroTubi).naam = "Tubi" Task(%GeroTubi).cptr = CODEPTR(Gero_Tubi) Task(%GeroTubi).freq = 4 ' TaskEX(%GeroTubi).startcptr = CODEPTR(MM_Tubi_On) TaskEX(%GeroTubi).stopCptr = CODEPTR(MM_Tubi_Off) Task(%GeroSo).naam = "So" Task(%GeroSo).cptr = CODEPTR(Gero_So) Task(%GeroSo).freq = 3 TaskEX(%GeroSo).stopcptr = CODEPTR(MM_So_Off) 'Gero_So_Stop) Task(%GeroSire).naam = "Sire" Task(%GeroSire).cptr = CODEPTR(Gero_Sire) Task(%GeroSire).freq = 3 TaskEX(%GeroSire).stopcptr = CODEPTR(MM_Sire_Off) Task(%GeroPuff).naam = "Puff" Task(%GeroPuff).cptr = CODEPTR(Gero_Puff) Task(%GeroPuff).freq = 3 TaskEX(%GeroPuff).stopcptr = CODEPTR(MM_Puff_Off) 'Gero_Puff_Stop) Task(%GeroTrump).naam = "Trump" Task(%GeroTrump).cptr = CODEPTR(Gero_Trump) Task(%GeroTrump).freq = 4 ' TaskEX(%GeroTrump).startcptr = CODEPTR(MM_Trump_On) TaskEX(%GeroTrump).stopcptr = CODEPTR(MM_Trump_Off) Task(%GeroHurdy).naam = "Hurdy" Task(%GeroHurdy).cptr = CODEPTR(Gero_Hurdy) Task(%GeroHurdy).freq = 4 TaskEX(%GeroHurdy).stopCptr = CODEPTR(MM_Hurdy_Off) Task(%GeroLlor).naam = "Llor" Task(%GeroLlor).cptr = CODEPTR(Gero_Llor) Task(%GeroLlor).freq = 4 TaskEX(%GeroLlor).stopCptr = CODEPTR(MM_Llor_Off) Task(%GeroAke).naam = "Ake" Task(%GeroAke).cptr = CODEPTR(Gero_Ake) Task(%GeroAke).freq = 4 ' TaskEX(%GeroAke).startcptr = CODEPTR(MM_Ake_On) TaskEX(%GeroAke).stopCptr = CODEPTR(MM_Ake_Off) Task(%GeroPiperola).naam = "Piperola" Task(%GeroPiperola).cptr = CODEPTR(Gero_Pipe) Task(%GeroPiperola).freq = 6 'TaskEX(%GeroPiperola).startcptr = CODEPTR(MM_Piperola_On) 'will be overridden in task code, using expression TaskEX(%GeroPiperola).stopCptr = CODEPTR(MM_Piperola_Off) Task(%GeroVacca).naam = "Vacca" Task(%GeroVacca).cptr = CODEPTR(Gero_Vacca) Task(%GeroVacca).freq = 4 'TaskEX(%GeroVacca).startcptr = Codeptr(MM_Vacca_On) 'TaskEX(%GeroVacca).stropcptr = codeptr(MM_Vacca_Off) - non existing procs. Task(%GeroVitello).naam = "Vitello" Task(%GeroVitello).cptr = CODEPTR(Gero_Vitello) Task(%GeroVitello).freq = 4 ' TaskEX(%GeroVitello).startcptr = CODEPTR(MM_Vitello_On) TaskEX(%GeroVitello).stopcptr = CODEPTR(MM_Vitello_Off) Task(%GeroPsch).naam = "Psch" Task(%GeroPsch).cptr = CODEPTR(Gero_Psch) Task(%GeroPsch).freq = 4 Task(%GeroKrum).naam = "Krum" Task(%GeroKrum).cptr = CODEPTR(Gero_Krum) Task(%GeroKrum).freq = 4 ' TaskEX(%GeroKrum).startcptr = CODEPTR(MM_Krum_On) TaskEX(%GeroKrum).stopCptr = CODEPTR(MM_Krum_Off) Task(%GeroCasta).naam = "Casta" ' both casta modules. Task(%GeroCasta).cptr = CODEPTR(Gero_Casta) Task(%GeroCasta).freq = 7 TaskEX(%GeroCasta).stopCptr = CODEPTR(MM_Casta_Off) Task(%GeroSnar).naam = "Snar" Task(%GeroSnar).cptr = CODEPTR(Gero_Snar) Task(%GeroSnar).freq = 12 TaskEX(%GeroSnar).stopcptr = CODEPTR(Gero_Snar_Off) ' geen aparte proc. voor snar. Task(%Gero_Qt).naam = "Qt" Task(%Gero_Qt).cptr = CODEPTR(Gero_Qt) '18.02.2007 Task(%Gero_Qt).freq = 4 ' TaskEX(%Gero_Qt).startcptr = CODEPTR(MM_Qt_On) TaskEX(%Gero_Qt).stopcptr = CODEPTR(MM_Qt_Off) Task(%GeroBourdonola).naam = "Bourdonola" Task(%GeroBourdonola).cptr = CODEPTR(Gero_Bourdonola) Task(%GeroBourdonola).freq = 4 ' TaskEX(%GeroBourdonola).startcptr = CODEPTR(MM_Bourdonola_On) TaskEX(%GeroBourdonola).stopcptr = CODEPTR(MM_Bourdonola_Off) Task(%GeroHumanola).naam = "VoxHumanola" Task(%GeroHumanola).cptr = CODEPTR(Gero_Humanola) Task(%GeroHumanola).freq = 4 ' TaskEX(%GeroHumanola).startcptr = CODEPTR(MM_Humanola_On) TaskEX(%GeroHumanola).stopcptr = CODEPTR(MM_Humanola_Off) Task(%Geroxy).naam = "Xy" Task(%Geroxy).cptr = CODEPTR(Geroxy) '10.04.2007 Task(%Geroxy).freq = 8 ' TaskEX(%Geroxy).startcptr = CODEPTR(MM_Xy_On) TaskEX(%Geroxy).stopcptr = CODEPTR(MM_Xy_Off) Task(%GeroSimba).naam = "Simba" Task(%GeroSimba).cptr = CODEPTR(GeroSimba) '13.09.2007 Task(%GeroSimba).freq = 8 ' TaskEX(%GeroSimba).startcptr = CODEPTR(MM_Simba_On) TaskEX(%GeroSimba).stopcptr = CODEPTR(MM_Simba_Off) Task(%GeroToypi).naam = "Toypi" ' 26.08.2008 Task(%GeroToypi).cptr = CODEPTR(GeroToypi) Task(%GeroToypi).freq = 25 ' TaskEX(%GeroToypi).startcptr = CODEPTR(MM_Toypi_On) TaskEX(%GeroToypi).stopcptr = CODEPTR(MM_Toypi_Off) Task(%Vivoges).naam = "Vivoges" Task(%Vivoges).cptr = CODEPTR(Vivoges) Task(%Vivoges).freq = 10 TaskEX(%Vivoges).stopCptr = CODEPTR(Vivoges_Stop) App.Komposduur = 1800 'interactive fileplayiing 'App.MidiPlayeTasknrr is new (20070413). as the player used to be @ readseqscoretasknr before we leave it there, but it shouldn't allways be like that in other compilations.. App.MidiPlayerTasknr = App.ReadSeqScoreTasknr Task(App.MidiPlayerTasknr).naam = "MFilePlay" Task(App.MidiPlayerTasknr).cptr = GetProcAddress(gh.instdll,"MM_MIDIPLAYER") Task(App.MidiPlayerTasknr).freq = 500 '800 ' this is too fast! use 500 or 1000, 800 has no meaning Task(App.MidiPlayerTasknr).flags = %DLL_TASK OR %PERTIM_TASK TaskEX(App.MidiPlayerTasknr).stopcptr = CODEPTR(MM_AllOff) 'for kl. mov controlled midi player: Task(%iax).naam = "IAxFileP" Task(%iax).cptr = CODEPTR(MidiPlayerInteraction) Task(%iax).freq = 24 '64 Task(%iax).flags = %PERTIM_TAsk Task(%mvrec).naam = "MovRec" Task(%mvrec).cptr = CODEPTR(Movement_record) Task(%mvrec).freq = .25 ' = everytime buffer is renewed Task(%mvrec).flags = %PERTIM_TASK Task(%mvrec_metro).naam = "metro" Task(%mvrec_metro).cptr = CODEPTR(moverec_metro) Task(%mvrec_metro).freq = 1 Task(%mvrec_metro).flags = 0 END IF ' 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 ' needed here... END IF NEXT i ' adapt the functions of the buttons in the cockpit & reorients the button handler Gestrobo_RemapCockpitButtons ' only changes contents of arrays. - o.k. ' the finalisation of the new cockpit will be handled in UpdateCockpit. ' switch off the flag for auto-patching: BIT RESET App.AutoFlags, 0 ' this suppresses automatic sending of program-change msg's m = "" SendMessage gh.Cockpit, %WM_SETTEXT,0, VARPTR(m) ' sets ports for robots automatically Init_MM 'makes all MM_xxx_On calls unnecessary ' new 20.11.2004: MM_PanicButtonWindow '(OPT BYVAL instrum$, BYVAL hParent AS LONG, BYVAL x AS LONG, BYVAL y AS LONG) AS LONG SetDlgItemText gh.Cockpit, %GMT_TITLE, "" SetDlgItemText gh.Cockpit, %GMT_AUTHOR, $gwr SetDlgItemText gh.Cockpit, %GMT_TEXT_TEMPO, STR$(App.tempo) Create_Sonar_Control_Task BYVAL sr, Slider(),UDctrl() ' task 10 (pseudotask) 20.09.2003 ' initialize the pitch 2 midi device to be used (as for and ): CQT.naam = "cqt" SetPitch2MidiPorts CQT, $gestroboIni, hMidiO(),hMidiI() ' reads all params from file Create_CQT_Control_Task BYVAL VARPTR(cqt), Slider(), UDctrl() ' task 5 (pseudotask) 08.10.2003 Task(%Sonar_Control_Task).naam = "S-Ctrl" FUNCTION = %True END FUNCTION SUB Gestrobo_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 = "Propo" ' normal map ButnSW(2).tag1 = "Invrt" ' inverted mapping (used in Casta module) ButnSW(2).cptr = %False ' read ButnSW(2).flag for use. ButnSW(3).tag0 = "" ButnSW(3).cptr = %False ButnSW(4).tag0 = "" ' creates/kills a harmony display window - = default button ButnSW(4).cptr = %False ButnSW(5).tag0 = "S-Chan" ButnSW(5).tag1 = "S-Chan" ButnSW(5).cptr = %False ButnSW(6).tag0 = "" ButnSW(6).cptr = %False ButnSW(7).tag0 = "SPECT" ' creates/kills a spectrum display window ButnSW(7).tag1 = "SpectOff" ButnSW(8).tag0 = "" '"Monitor" ButnSW(8).cptr = %False ButnSW(10).tag0 = "" ButnSW(10).cptr = %False ButnSW(11).tag0 = "ADXL202" ButnSW(11).tag1 = "ADXL OFF" ButnSW(11).cptr = %False 'codeptr(ADXL202_Button) ' ONE SHOT FUNCTIONS: ButnOS(3).tag = "ProgChange" ButnOS(3).cptr = CODEPTR(MM_ProgChangeWindow) ButnOS(9).tag = "" ' reset not very well implemented yet... problem with all local static var's in the procs. ButnOS(9).cptr = %False ButnOS(10).tag = "" ButnOS(10).cptr = %False App.butnSWCptr = CODEPTR(Gestrobo_ButnSWHandler) App.butnOSCptr = CODEPTR(Gestrobo_ButnOShandler) END SUB SUB Gestrobo_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 'Sonar_DAQ %False ' stop DAQ task in dll cptr = GetPRocAddress(gh.gnh, "SONAR_DAQ") CALL DWORD cptr USING SONAR_DAQ(%false) SetDlgItemText gh.Cockpit, %GMT_TEXT_SR, STR$(DAQparams.samplingrate(0),3) END IF IF ButnSW(ButtonNr).Flag THEN App.MTstart = %True App.tstart = timeGetTime ' start the chronometerfunction SetDlgItemText gh.Cockpit, App.butnSWparam, "STOP" IF hMidiI(0) THEN ClearMiBuf 0 ' start with a blank midi input buffer BlockSysExReception hMidiI(0) 'SxThread END IF Runtime %True ' Sonar_DAQ %DAQ_DOUBLEBUFFER cptr = GetPRocAddress(gh.gnh, "SONAR_DAQ") CALL DWORD cptr USING SONAR_DAQ(%DAQ_DOUBLEBUFFER) ELSE App.MTstart = %False SetDlgItemText gh.Cockpit, App.butnSWparam, "CONT" ' Sonar_DAQ %False cptr = GetPRocAddress(gh.gnh, "SONAR_DAQ") CALL DWORD cptr USING SONAR_DAQ(%false) END IF CASE 5 ' new button, 04.11.2003, creates a parameter window for the statistics task in the ' dll DIM TaskParamLabels(0) AS LOCAL ASCIIZ * 8 LOCAL udnr AS DWORD TaskParamLabels(0) = "channel" IF ISFALSE Task(%Sonar_Stat_Task).hParam THEN MakeTaskParameterDialog %Sonar_Stat_Task,0,Slider(),1,UDctrl(),TaskParamlabels() CONTROL ADD LABEL, Task(%Sonar_Stat_Task).hParam,-1,"Stat Channel:",1,12,100,10 END IF udnr = TaskEX(%Sonar_Stat_Task).UpDownNumbers(0) UDctrl(udnr).cptr = GetProcAddress(gh.InstDll, "SONAR_STAT_UD") UDctrl(udnr).value = 3 ' 0,1,2 UDctrl(udnr).maxval = 15 UDctrl(udnr).resetval = 3 UDctrl(udnr).minval = 0 CASE 11 IF ButnSW(ButtonNr).Flag THEN ' start ADXL202 'Open_Serial_IO 1, "ADXL202" cptr = GetProcAddress(gh.gnh, "OPEN_SERIAL_IO") CALL DWORD cptr USING Open_Serial_Io(1, "ADXL202") ' now global: static pADXL202 as AccelSensDevice PTR 'pADXL202 = GetADXL202pointer cptr = GetProcAddress(gh.gnh, "GETADXL202POINTER") CALL DWORD cptr USING GetADXL202Pointer TO pADXL202 ELSE ' stop ADXL202 'Close_Serial_IO 1, "ADXL202" cptr = GetProcAddress(gh.gnh, "CLOSE_SERIAL_IO") CALL DWORD cptr USING Close_Serial_io(1, "ADXL202") END IF END SELECT App.butnSWparam = %False ' reset END SUB SUB Gestrobo_ButnOSHandler () LOCAL ButtonNr AS LONG LOCAL i AS DWORD ' replaces the default buttonhandler for the Cockpit window in GMT. ButtonNr = App.butnOSparam - %GMT_BUTNOS_ID SELECT CASE ButtonNr CASE 0 ' 20.11. 2004 replaced by: MM_AllOff %MM_Notes CASE 10 Gestrobo_Halt 'CONTROL ENABLE hCockpit, %GMT_BUTNOS_ID + 11 END SELECT App.butnOSparam = %False ' reset END SUB SUB Gestrobo_Halt () LOCAL cptr AS DWORD ' disables all other composition/tasks ' this is activated via its codepointer in the cockpit buttons. LOCAL i AS LONG FOR i = %GeRoPiBo TO UBOUND(Task) IF BIT(Task(i).swit,%TASK_ONOFF) THEN StopTask i Task(i).tog = %False NEXT i 'Display 0,0,0,0 'cptr = GetPRocAddress(gh.gnh, "LEDDISPLAY") 'CALL DWORD cptr USING LedDisplay(0, 0, 0, 0) SetDlgItemText gh.Cockpit, %GMT_MSG1, "" SetDlgItemText gh.Cockpit, %GMT_MSG2, "" ' reset the sonar controls to the default values: @sr.noise = 0 i = TaskEX(%Sonar_Control_Task).SliderNumbers(0) SendMessage Slider(i).h, %TBM_SETPOS,%True, @sr.noise END SUB SUB GeRoPiBo () ' derived from solo in the second book of moves. ' needs ii-channels 3, 7, ' uses piperola and bourdonola STATIC oldnote AS INTEGER STATIC oldvelo AS INTEGER LOCAL note AS INTEGER LOCAL velo AS INTEGER LOCAL il% LOCAL jl% LOCAL m AS ASCIIZ * 45 STATIC slnr AS LONG IF ISFALSE Task(%GeRoPiBo).tog THEN DIM TaskParamLabels(2) AS LOCAL ASCIIZ * 8 TaskParamLabels(0) = "sens" TaskParamLabels(1) = "tempo" IF ISFALSE Task(%GeroPiBo).hParam THEN MakeTaskParameterDialog %GeroPiBo,2,Slider(),0,UDctrl(),TaskParamlabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%GeroPiBo).SliderNumbers(0) SendMessage Slider(slnr).h, %TBM_SETPOS,%True, 5 SendMessage Slider(slnr+1).h, %TBM_SETPOS,%True, 60 ' tempo Slider(slnr+1).value = 60 Slider(slnr).value = 5 END IF oldnote = %False oldvelo = %False Task(%GeRoPiBo).channel = Piperola.channel '%Piperola_Channel ' piperola & bourdonola Task(%GeRoPiBo).freq = 6 'App.tempo / 60! ' 6 Hz ' Display %GeroPiBo,0,0,0 Piperola.ctrl(7) = %MM_Piperola_Motor * 2! / 3! ' new 06.03.2005 MM_Piperola_On %MM_Motor Bourdonola.ctrl(1) = %MM_Bourdonola_Motor Controller Bourdonola.channel, 1, %MM_Bourdonola_Motor Controller Piperola.channel, 10, 5 ' set sfz mode ON - new 06.03.2005 Piperola.ctrl(10) = 5 Task(%GeRoPiBo).tog = %True END IF ' Solo instrument. Non-positional playing. Task(%GeRoPiBo).freq = Slider(slnr+1).value / 10 '/ 60! IF Task(%GeRoPiBo).freq < 1 THEN Task(%GeRoPiBo).freq = 1 jl% = @sr.xyzf ' 0 - 4095 - snelheid. SHIFT RIGHT jl%, 6 ' 0-64 note = 36 + jl% velo = @sr.xyza SHIFT RIGHT velo,4 ' 0 - 256 - 8 bits IF velo > 127 THEN velo = 127 IF velo < (Slider(slnr).value) THEN velo = %False IF oldnote THEN mPlay Task(%GeRoPiBo).channel,oldnote,%False oldnote = %false oldvelo = %False velo = %False IF piperola.ctrl(118) THEN NoteOff Piperola.channel, 118 ' rood licht piperola.ctrl(118) = %False END IF EXIT SUB END IF IF note <> oldnote THEN IF note THEN mPlay Task(%GeRoPiBo).channel, note, velo IF oldnote THEN NoteOff Task(%GeRoPiBo).channel, oldnote ', %False oldnote = note oldvelo = velo IF ISFALSE piperola.ctrl(118) THEN mPlay Piperola.channel, 118, 64 Piperola.ctrl(118) = 64 END IF ELSE ' hold... IF ISFALSE piperola.ctrl(118) THEN mPlay Piperola.channel, 118, 64 Piperola.ctrl(118) = 64 END IF END IF END SUB SUB GeRoPiBo_Stop () MM_Piperola_Off %MM_Notes Controller Piperola.channel, 10, %False Piperola.ctrl(10) = %False IF piperola.ctrl(118) THEN NoteOff Piperola.channel, 118 Piperola.ctrl(118) = %False END IF MM_Bourdonola_Off %MM_Notes END SUB SUB Gero_Bourdonola () ' derived from solo in the second book of moves. ' needs ii-channels 3, 7, ' revision of geropibo, without piperola STATIC oldnote AS INTEGER LOCAL note AS INTEGER LOCAL velo AS INTEGER LOCAL jl% LOCAL m AS ASCIIZ * 45 STATIC slnr AS LONG IF ISFALSE Task(%GeRoBourdonola).tog THEN DIM TaskParamLabels(2) AS LOCAL ASCIIZ * 8 TaskParamLabels(0) = "sens" TaskParamLabels(1) = "tempo" IF ISFALSE Task(%GeroBourdonola).hParam THEN MakeTaskParameterDialog %GeroBourdonola,2,Slider(),0,UDctrl(),TaskParamlabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%GeroBourdonola).SliderNumbers(0) SendMessage Slider(slnr).h, %TBM_SETPOS,%True, 5 SendMessage Slider(slnr+1).h, %TBM_SETPOS,%True, 60 ' tempo Slider(slnr+1).value = 60 Slider(slnr).value = 5 END IF MM_Bourdonola_On %MM_Wind oldnote = %False Task(%GeroBourdonola).channel = Bourdonola.channel 'bourdonola Task(%GeRoBourdonola).freq = 6 'App.tempo / 60! ' 6 Hz MM_Bourdonola_On %MM_Lights Task(%GeRoBourdonola).tog = %True END IF ' Solo instrument. Non-positional playing. Task(%GeRoBourdonola).freq = Slider(slnr+1).value / 10 '/ 60! IF Task(%GeRoBourdonola).freq < 1 THEN Task(%GeRoBourdonola).freq = 1 jl% = @sr.xyzf ' 0 - 4095 - snelheid. SHIFT RIGHT jl%, 7 '0-32 6 ' 0-64 note = 35 + jl% velo = @sr.xyza SHIFT RIGHT velo,4 ' 0 - 256 - 8 bits IF velo > 127 THEN velo = 127 IF velo < (Slider(slnr).value) THEN velo = %False IF oldnote THEN mPlay Bourdonola.channel,oldnote,%False oldnote = %false velo = %False EXIT SUB END IF IF note > 35 THEN IF note <> oldnote THEN IF note THEN mPlay Bourdonola.channel, note, velo IF oldnote THEN NoteOff Bourdonola.channel, oldnote ', %False oldnote = note 'cnt = %False ELSE ' hold... 'if note = 36 then ' incr cnt ' if cnt > 10 then ' NoteOff Bourdonola.channel, 36 ' oldnote = %False ' end if 'end if END IF END IF END SUB SUB GeRoPia () LOCAL faktor AS SINGLE STATIC n0 AS INTEGER STATIC n1 AS INTEGER STATIC n2 AS INTEGER STATIC slnr AS LONG IF Task(%GeRoPia).tog = %False THEN DIM TaskParamLabels(2) AS LOCAL ASCIIZ * 8 TaskParamLabels(0) = "sens" TaskParamLabels(1) = "tempo" IF ISFALSE Task(%GeroPia).hParam THEN MakeTaskParameterDialog %GeroPia,2,Slider(),0,UDctrl(),TaskParamlabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%GeroPia).SliderNumbers(0) ' the second slider is slnr + 1 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, 3 SendMessage Slider(slnr+1).h, %TBM_SETPOS,%True, 60 ' tempo Slider(slnr+1).value = 60 Slider(slnr).value = 3 END IF Task(%GeRoPia).tog = %True Task(%GeRoPia).channel = Piano.channel Task(%GeRoPia).freq = 2.4 'App.tempo / 60! ' slider(slnr+1).value / 25 END IF DIM AD(0 TO 15) AS LOCAL INTEGER IF @sr.xyze <= Slider(slnr).value THEN ' may need rescaling Task(%GeRoPia).freq = DAQparams.samplingrate(0) / 3 ' such that it reacts fast! EXIT SUB END IF AD(7) = @sr.xyzf SHIFT RIGHT AD(7), 9 ' 0-7 AD(7) = 24 + (12* AD(7)) ' oktaafligging IF AD(7) > 96 THEN AD(7) = 96 DIM ADL(0 TO 15) AS LOCAL INTEGER 'IF @sr.xe > @sr.noise THEN ADL(8) = INT(15.268 * LOG(@sr.xe)) ELSE ADL(8)=%False ' adl() : 1 - 55 'IF @sr.ye > @sr.noise THEN ADL(9) = INT(15.268 * LOG(@sr.ye)) ELSE ADL(9)=%False 'IF @sr.ze > @sr.noise THEN ADL(10) = INT(15.268 * LOG(@sr.ze)) ELSE ADL(10)=%False ' new [04.11.2003]: IF @sr.xe /2 > @sr.noise THEN ADL(8) = @sr.xe / 64 ELSE ADL(8)=%False ' 0-63 IF @sr.ye /2 > @sr.noise THEN ADL(9) = @sr.ye / 64 ELSE ADL(9)=%False IF @sr.ze/ 2 > @sr.noise THEN ADL(10) = @sr.ze / 64 ELSE ADL(10)=%False IF @sr.xyza > @sr.noise THEN ADL(3) = INT(15.268 * LOG(@sr.xyza)) ELSE ADL(3)=%False ' 0-51 IF @sr.xf > @sr.noise THEN ADL(4) = INT(15.268 * LOG(@sr.xf)) ELSE ADL(4)=%False IF @sr.yf > @sr.noise THEN ADL(5) = INT(15.268 * LOG(@sr.yf)) ELSE ADL(5)=%False IF @sr.zf > @sr.noise THEN ADL(6) = INT(15.268 * LOG(@sr.zf)) ELSE ADL(6)=%False IF @sr.xyzac <> %False THEN ADL(15) = INT((15.268 * LOG(ABS(@sr.xyzac))) * SGN(@sr.xyzac)) ' to be checked for range !!! ELSE ADL(15)= %False END IF Task(%GeroPia).Har.vel = STRING$(128,0) IF ADL(8) THEN SHIFT RIGHT ADL(4),3 n0 = AD(7) + ADL(4) AddNote2Har Task(%GeRoPia).Har,n0 , ADL(8) \ 2 ' was: \ 4 ' velo: 0- 15 ELSE DelNote2Har Task(%GeRoPia).Har, n0 END IF IF ADL(10) THEN SHIFT RIGHT ADL(6),3 n1 = AD(7) + ADL(6) AddNote2Har Task(%GeRoPia).Har,n1 , ADL(10) \ 2 ' was \ 4 ELSE DelNote2Har Task(%GeRoPia).har, n1 END IF IF ADL(9) THEN SHIFT RIGHT ADL(5),3 n2 = AD(7) + ADL(5) AddNote2Har Task(%GeRoPia).Har,n2 , ADL(9) \ 2 ' was \ 4 ELSE DelNote2Har Task(%GeRoPia).Har, n2 END IF IF (ADL(6) > 4) AND ((ADL(4) AND ADL(5)) = ADL(6)) THEN AddNote2Har Task(%GeRoPia).Har, AD(7), ADL(3) \ 4 Piano.Har(1).vel = Task(%GeRoPia).Har.vel InstrumPlay Piano 'EXIT SUB - removed for Maubeuge 19/20.03.2004 ELSE DelNote2Har Task(%GeRoPia).Har, AD(7) END IF IF ADL(5) = ADL(6) THEN AddNote2Har Task(%GeRoPia).Har, AD(7)+12, ADL(3)\4 AddNote2Har Task(%GeRoPia).Har, AD(7)-12, ADL(3)\4 END IF IF ADL(4) = ADL(5) THEN AddNote2Har Task(%GeroPia).Har, AD(7) + 7, ADL(3) \4 END IF IF ADL(4) = ADL(6) THEN AddNote2Har Task(%GeroPia).Har, AD(7)-7, ADL(3) \ 4 END IF Piano.Har(1).vel = Task(%Geropia).Har.vel InstrumPlay Piano Task(%GeRoPia).freq = (Slider(slnr+1).value / 25!) * ((ABS(ADL(15))+5) / 10!) '(App.tempo * faktor) / 60! END SUB SUB GeRofft () ' the old version, as in Songbook, crashes ' 10.10.2009: rewritten and tested o.k. ' this will inherently play slow, as we always work with a 2 second data window ' rehearsed with Dominica ' 11.10.2009: differential FFT added for faster response. ' now we use the amplitude channels but we could also use the frequency channels ' hanning window applied before doing the DFT. This doesn't lead to interesting results ' as we seem to be getting nothing but the period spectrum of the window itself back. ' 12.10.2009: further improved. ' we now work on the differential signals of body surface, but it would make more sense ' to work on the ac signals from the ii_doppler version, using the same hardware. LOCAL t AS DWORD LOCAL n AS LONG LOCAL v AS LONG LOCAL i AS LONG LOCAL pBuf AS INTEGER PTR STATIC pianoscalefactor AS SINGLE STATIC harmascalefactor AS SINGLE STATIC organscalefactor AS SINGLE STATIC cnt AS LONG STATIC slnr AS LONG STATIC udnr AS LONG STATIC wind AS SINGLE ' harma STATIC pipwind AS SINGLE ' piperola STATIC bourwind AS SINGLE ' bourdonola STATIC hanwin AS LONG ' toggle for windowing on or off. DIM dta(0 TO 255) AS LOCAL INTEGER IF ISFALSE Task(%GeRoFft).tog THEN DIM TaskParamLabels(3) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "tempo" ' implemented TaskParamLabels(1) ="dens" ' density TaskParamLabels(2) = "linlog" ' mapping 0,1,2,3 TaskParamLabels(3) = "dc/ac" IF ISFALSE Task(%GeroFFT).hParam THEN MakeTaskParameterDialog %GeroFFT,2,Slider(),2,UDctrl(),TaskParamlabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%GeroFFT).SliderNumbers(0) SendMessage Slider(slnr).h, %TBM_SETPOS,%True, 38 '64 '18 Slider(slnr).value = 36 '64 '18 ' bepaald de tempo scaling Sendmessage Slider(slnr+1).h, %TBM_SETPOS,%True, 32 '4 Slider(slnr+1).value = 32 '4 udnr = TaskEX(%GeroFFT).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(GeroFFT_UD) UDctrl(udnr).value = 2 ' 0,1 lin/log/dif/x-tra UDctrl(udnr+1).cptr = CODEPTR(GeroFFT_UD2) UDctrl(udnr+1).value = 1 ' 0 = unipolar data set ' 1 = differential bipolar data set END IF DIM sp(0 TO 128) AS STATIC INTEGER ' will contain result of FFT transform on 256 samples, 2 second window ' required for difference calculation of spectra DIM spx(0 TO 128) AS STATIC INTEGER DIM spy(0 TO 128) AS STATIC INTEGER DIM spz(0 TO 128) AS STATIC INTEGER DIM spdif(0 TO 128) AS STATIC INTEGER ' required for difference calculation with MAT DIM sx(0 TO 255) AS STATIC INTEGER DIM sy(0 TO 255) AS STATIC INTEGER DIM sz(0 TO 255) AS STATIC INTEGER pianoscalefactor = N2F(Piano.lowtes) / 0.5 ' 0.5 = laagste spektraalband harmascalefactor = n2F(HarmO.lowtes) / 0.5 organscalefactor = N2F(Bourdonola.lowtes) / 0.5 cnt = %False Piperola.ctrl(7) = %MM_Piperola_Motor MM_Piperola_On '%MM_Motor pipwind = piperola.ctrl(7) Humanola.ctrl(7) = %MM_Humanola_Motor MM_Humanola_On '%MM_Motor Bourdonola.ctrl(1) = %MM_Bourdonola_Motor bourwind = Bourdonola.ctrl(1) MM_Bourdonola_On '%MM_Motor ' MM_Harma_On MM_HarmO_on ' added 10.01.2010 MM_HarmO_On %MM_Regs wind = Harmo.ctrl(7) ' MM_Humanola_On ' MM_Krum_On ' MM_Qt_On MM_Autosax_On MM_Heli_On MM_Bono_On 'MM_Piano_On ' PREPARE LOOKUP FOR THE HANNING WINDOW: DIM Han(0 TO 255) AS STATIC SINGLE MAT Han() = CON(1) HanningWindow Han() Hanwin = %False ' done for experiment, but windowing on unipolar data makes things even worse. ' leave this one set to %False! Controller Autosax.channel, 17, 127 Controller Autosax.channel, 7, 127 Task(%GeRoFft).tog = %True END IF SELECT CASE cnt CASE 0 ' perform DFT on data-channels 0,1,2 ' the returned 128 frequency bands are 0.5, 1, 1.5,2,2.5,3, 3.5... Hz to 63.5Hz ' piano mapped on the X-vector DIM s(255) AS INTEGER AT @sr.pb(0) IF ISFALSE Hanwin THEN IF ISFALSE UdCtrl(Udnr+1).value THEN DFT_Int s(), sp() ' transform on unipolar data without windowing! ELSE ' test differential data 'for i = 0 to 254 ' dta(i) = s(i+1) - s(i) 'next i 'dta(255) = dta(254) / 2 'DFT_Int dta(), sp() MAT dta() = s() - sx() dta(0) = dta(1) /2 ' rounding edges a bit... dta(255) = dta(254) /2 DFT_Int dta(), sp() MAT sx() = s() ' save previous data END IF ELSE ' version with windowing: (on unipolar data, this makes the harmonics of the ' window itself even stronger!!!) FOR i = 0 TO 255 dta(i) = s(i) * Han(i) ' note that this is unipolar 12 bit data! d NEXT i DFT_Int dta(), sp() ' now we have the spectrum of surface changes of the moving body END IF '------------------------ Piano.Har(1).vel = STRING$(128,0) SELECT CASE UDctrl(udnr).value CASE %False ' zonder remapping: - lineair FOR i = 1 TO 127 v = MIN(sp(i)/ 32, 64) IF v THEN AddNote2Har Piano.Har(1),i,v END IF NEXT i CASE 1 ' met log rescaling naar pianotessituur: ' scalefactor = N2F(Piano.lowtes) / 0.5 FOR i = 1 TO 127 n = F2N(i * pianoscalefactor) IF n <= Piano.Hightes THEN v = MIN(sp(i)/32, 120) IF v THEN AddNote2Har Piano.Har(1), n, MAX(MIN(v * 2, 120), 12) END IF END IF NEXT i CASE 2,3 ' using the differential of the spectrum ' we consider only positive values and therefore this ought to be very ' responsive to velocity changes. MAT spdif() = sp() - spx() ' huidig spektrum - vorig spektrum MAT spx() = sp() ' save vorig spektrum FOR i = 1 TO 127 ' use LinSpec2Har ? IF spdif(i) > %False THEN n = F2N(i * pianoscalefactor) IF n <= Piano.hightes THEN v = MIN(sp(i)/32,120) IF v THEN AddNote2Har Piano.Har(1), n, MAX(MIN(v*2,120),12) END IF END IF END IF NEXT i END SELECT Instrumplay Piano CASE 1 DIM s(255) AS INTEGER AT @sr.pb(1) IF ISFALSE Hanwin THEN IF ISFALSE UDCtrl(udnr+1).value THEN DFT_Int s(), sp() ELSE 'FOR i = 0 TO 254 ' dta(i) = s(i+1) - s(i) 'NEXT i 'dta(255) = dta(254)/2 'DFT_Int dta(), sp() MAT dta() = s() - sy() dta(0) = dta(1) /2 ' rounding edges a bit... dta(255) = dta(254) /2 DFT_Int dta(), sp() MAT sy() = s() ' save previous data END IF ELSE FOR i = 0 TO 255 dta(i) = s(i) * Han(i) ' note that this is unipolar 12 bit data! NEXT i DFT_Int dta(), sp() ' now we have the spectrum of surface changes of the moving body END IF HarmO.Har(1).vel = STRING$(128,0) SELECT CASE UDctrl(udnr).value CASE 0 FOR i = 1 TO 127 v = MIN(sp(i)/ 32, 84) ' 0-4095 range , 12 bit? IF v THEN AddNote2Har HarmO.Har(1),i,v END IF NEXT i CASE 1 FOR i = 1 TO 127 n = F2N(i * harmascalefactor) IF n <= HarmO.Hightes THEN v = MIN(sp(i)/32, 120) IF v > (Slider(slnr).value / 4) + (i/32) THEN AddNote2Har HarmO.Har(1), n, v END IF END IF NEXT i CASE 2,3 MAT spdif() = sp() - spy() MAT spy() = sp() FOR i = 1 TO 127 IF spdif(i) > %False THEN n = F2N(i * harmascalefactor) IF n <= HarmO.hightes THEN v = MIN(sp(i)/32,120) IF v THEN AddNote2Har HarmO.Har(1), n, MIN(v*2,120) END IF END IF END IF NEXT i END SELECT InstrumPlay HarmO ' section for wind pressure controll: IF wind =< @sr.ya/ 32 THEN ' in this case we have an increase, and this can be done pretty fast: wind = ((wind * 5) + (@sr.ya / 32))/ 6 ELSE ' decelleration needs more integration: wind = ((wind * 15) + (@sr.ya / 32))/ 16 END IF wind = MIN(wind,100) wind = MAX(wind,25) IF INT(wind) <> HarmO.ctrl(7) THEN HarmO.ctrl(7) = wind Controller HarmO.channel, 7, HarmO.ctrl(7) END IF CASE 2 DIM s(255) AS INTEGER AT @sr.pb(2) IF ISFALSE Hanwin THEN IF ISFALSE UDctrl(udnr+1).value THEN DFT_Int s(), sp() ELSE 'FOR i = 0 TO 254 ' dta(i) = s(i+1) - s(i) 'NEXT i 'dta(255) = dta(254)/2 'DFT_Int dta(), sp() MAT dta() = s() - sz() dta(0) = dta(1) /2 ' rounding edges a bit... dta(255) = dta(254) /2 DFT_Int dta(), sp() MAT sz() = s() ' save previous data END IF ELSE FOR i = 0 TO 255 dta(i) = s(i) * Han(i) ' note that this is unipolar 12 bit data! NEXT i DFT_Int dta(), sp() ' now we have the spectrum of surface changes of the moving body END IF Piperola.Har(1).vel = STRING$(128,0) Bourdonola.Har(1).vel = STRING$(128,0) SELECT CASE UDctrl(udnr).value CASE 0 FOR i = 1 TO 127 v = sp(i)/32 IF v THEN IF i < 63 THEN AddNote2Har Bourdonola.Har(1), i, 64 ELSE AddNote2Har Piperola.Har(1), i, 64 END IF END IF NEXT i CASE 1 FOR i = 1 TO 127 n = F2N(i * organscalefactor) IF n <= Piperola.Hightes THEN v = sp(i)/32 IF v > (Slider(slnr+1).value / 4) + (i/32) THEN ' 3 + (i/8)THEN IF n =< Bourdonola.hightes THEN AddNote2Har Bourdonola.Har(1), n, v ELSEIF n <= Piperola.hightes THEN AddNote2Har Piperola.Har(1), n, v END IF END IF END IF NEXT i CASE 2,3 MAT spdif() = sp() - spz() MAT spz() = sp() FOR i = 1 TO 127 IF spdif(i) > %False THEN v = sp(i)/32 IF v > (Slider(slnr+1).value/4) + (i/32) THEN '2 + (i/8) THEN n = F2N(i * organscalefactor) IF n <= Bourdonola.hightes THEN Addnote2Har Bourdonola.Har(1), n, v ELSEIF n <= Piperola.hightes THEN Addnote2Har Piperola.Har(1), n, v END IF END IF END IF NEXT i END SELECT ' section for wind pressure controll: IF bourwind =< @sr.za/ 32 THEN ' in this case we have an increase, and this can be done pretty fast: bourwind = ((bourwind * 5) + (@sr.za / 32))/ 6 ELSE ' decelleration needs more integration: bourwind = ((bourwind * 15) + (@sr.za / 32))/ 16 END IF bourwind = MIN(bourwind,120) bourwind = MAX(bourwind,20) IF INT(bourwind) <> Bourdonola.ctrl(1) THEN Bourdonola.ctrl(1) = bourwind Controller Bourdonola.channel, 1, Bourdonola.ctrl(1) END IF InstrumPlay Bourdonola ' section for wind pressure controll: IF pipwind =< @sr.za/ 32 THEN ' in this case we have an increase, and this can be done pretty fast: pipwind = ((pipwind * 5) + (@sr.za / 32))/ 6 ELSE ' decelleration needs more integration: pipwind = ((pipwind * 15) + (@sr.za / 32))/ 16 END IF pipwind = MIN(pipwind,127) pipwind = MAX(pipwind,20) IF INT(pipwind) <> Piperola.ctrl(7) THEN Piperola.ctrl(7) = pipwind Controller Piperola.channel, 7, Piperola.ctrl(7) END IF InstrumPlay Piperola InstrumPlay Piano ' just to give note-offs END SELECT IF UDctrl(udnr).value = 3 THEN ' following section was not working ' because the strongest spectral line is always at 0 ' hence, we try to delete this one: Sp(0) = 0 : Sp(1) = 0 ' would be better to reorchestrate this for Heli, Bono and Sax because than we could use the velo's ' done 12.10.2009 i = ArrayMax_Int (Sp()) ' sterkste spektraalkomponent IF Sp(i) > 32 THEN ' anders triggeren we op ruis SELECT CASE cnt CASE 0 ' Krum.Har(1).vel = STRING$(128,0) ' IF i> 0 THEN ' n = F2N(i* organscalefactor) ' IF n>= Krum.lowtes THEN ' IF n<= Krum.hightes THEN ' AddNote2Har Krum.Har(1), n, Sp(i) / 32 ' END IF ' END IF ' END IF ' InstrumPlay Krum ' alternatief voor Heli: IF i > 0 THEN n = F2N(i* organscalefactor) - 12 IF n>= Heli.lowtes THEN AddNote2Har Heli.Har(1), n, MIN(Sp(i) / 16, 120) END IF END IF instrumPlay Heli CASE 1 'Qt.Har(1).vel = STRING$(128,0) 'IF i > 0 THEN ' n = F2N(i* organscalefactor) ' IF n >= Qt.lowtes THEN ' IF n <= Qt.hightes THEN ' AddNote2Har Qt.Har(1), n, Sp(i) / 32 ' END IF ' END IF 'END IF 'InstrumPlay Qt 'alternatief voor Bono IF i > 0 THEN n = F2N(i* organscalefactor) - 12 IF n>= Bono.lowtes THEN AddNote2Har Bono.Har(1), n, Sp(i) / 32 END IF END IF instrumPlay Bono CASE 2 ' Humanola.Har(1).vel = STRING$(128,0) ' IF i > 0 THEN ' n = F2N(i * organscalefactor) ' IF n <= Humanola.hightes THEN ' IF n >= Humanola.lowtes THEN ' AddNote2Har Humanola.Har(1), n, 64 ' END IF ' END IF ' END IF ' instrumplay Humanola 'alternatief voor sax: IF i > 0 THEN n = F2N(i* organscalefactor) IF n>= Autosax.lowtes THEN AddNote2Har Autosax.Har(1), n, MIN(Sp(i) / 16, 120) END IF END IF instrumPlay Autosax END SELECT ELSE ' instrumplay Humanola ' Instrumplay Krum ' instrumplay Qt 'Instrumplay Bono 'InstrumPlay Heli 'Instrumplay Autosax END IF END IF INCR cnt cnt = cnt MOD 3 ' for better interaction, we can also try to use @sr.xyzf 'Task(%GeRoFft).freq = MIN(MAX(i,slider(slnr).value / 3), 42) ' so freq will depend on frequency of strongest spectral component. Task(%GeRoFft).freq = (Slider(slnr).value / 128) * (MIN(MAX(@sr.xyzf/32,6),42)) ' MIN(MAX(i,slider(slnr).value / 3), 42) END SUB SUB GeroFFT_UD () ' for callback on UpDown. LOCAL n AS BYTE STATIC oldn AS BYTE n = UDCtrl(TaskEX(%GeroFFT).UpdownNumbers(0)).value n = MIN(MAX(0,n),3) ' n MOD 4 UDCtrl(TaskEX(%GeroFFT).UpdownNumbers(0)).value = n SELECT CASE n CASE %False SetDlgItemText Task(%GeroFFT).hparam, %GMT_TEXT0_ID + 16, "lin" CASE 1 SetDlgItemText Task(%GeroFFT).hparam, %GMT_TEXT0_ID + 16, "log" CASE 2 SetDlgItemText Task(%GeroFFT).hparam, %GMT_TEXT0_ID + 16, "dif" CASE 3 SetDlgItemText Task(%GeroFFT).hparam, %GMT_TEXT0_ID + 16, "di+" END SELECT ' in avoidance of stuck notes IF oldn = 3 THEN Instrumplay Bono InstrumPlay Heli Instrumplay Autosax END IF oldn = n END SUB SUB GeroFFT_UD2 () ' callback for unipolar versus bipolar data LOCAL n AS BYTE n = UDCtrl(TaskEX(%GeroFFT).UpdownNumbers(1)).value n = MIN(MAX(n,0),1) UDCtrl(TaskEX(%GeroFFT).UpdownNumbers(1)).value = n SELECT CASE n CASE %False SetDlgItemText Task(%GeroFFT).hparam, %GMT_TEXT0_ID + 17, "dca" CASE 1 SetDlgItemText Task(%GeroFFT).hparam, %GMT_TEXT0_ID + 17, "aca" CASE 2 SetDlgItemText Task(%GeroFFT).hparam, %GMT_TEXT0_ID + 17, "dcf" ' not yet implemented CASE 3 SetDlgItemText Task(%GeroFFT).hparam, %GMT_TEXT0_ID + 17, "acf" ' not yer implemented END SELECT END SUB SUB GeRoTrio () ' for piano, harma, humanola LOCAL n AS LONG LOCAL v AS LONG LOCAL i AS LONG LOCAL velo AS LONG LOCAL trig AS LONG LOCAL s AS SINGLE STATIC cnt AS LONG STATIC slnr AS LONG IF ISFALSE Task(%GeRoTrio).tog THEN DIM TaskParamLabels(0) AS LOCAL ASCIIZ * 8 TaskParamLabels(0) = "sens" IF ISFALSE Task(%GeroTrio).hParam THEN MakeTaskParameterDialog %GeroTrio,1,Slider(),0,UDctrl(),TaskParamlabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%GeroTrio).SliderNumbers(0) SendMessage Slider(slnr).h, %TBM_SETPOS,%True, 2 ' sens Slider(slnr).value = 2 END IF Task(%GeRoTrio).tog = %True cnt = %False SetDlgItemText gh.Cockpit, %GMT_MSG2, "Use param slider to increase noise floor" Harma.ctrl(7) = %MM_Harma_Motor Controller Harma.channel, 7, %MM_Harma_Motor MM_Humanola_On ' added 11.09.2006 END IF SELECT CASE cnt CASE 0 Piano.Har(1).vel = STRING$(128,0) n = @sr.xf ' 12 bit snelheid SHIFT RIGHT n, 6 ' 0-63 v = @sr.xa SHIFT RIGHT v,6 ' 0 - 63- 6 bits IF v > Slider(slnr).value THEN trig=%True AddNote2Har Piano.Har(1), 36 + n, v InstrumPlay Piano CASE 1 Harma.Har(1).vel = STRING$(128,0) n = @sr.yf ' 12 bit snelheid SHIFT RIGHT n, 6 ' 0-63 v = @sr.ya SHIFT RIGHT v,6 ' 0 - 63 - 6 bits IF v > Slider(slnr).value THEN Trig = %True AddNote2Har Harma.Har(1), 36 + n, v END IF InstrumPlay Harma CASE 2 Humanola.Har(1).vel = STRING$(128,0) n = @sr.zf SHIFT RIGHT n, 6 ' 0-63 v = @sr.za SHIFT RIGHT v,6 ' 0 - 63 - 6 bits IF v > Slider(slnr).value THEN Trig = %True AddNote2Har Humanola.Har(1), 36 + n, 64 END IF InstrumPlay Humanola END SELECT INCR cnt cnt = cnt MOD 3 IF Trig THEN Task(%GeroTrio).freq = @sr.xyzf / 128 IF Task(%GeroTrio).freq < 1 THEN Task(%GeroTrio).freq = 1 ELSE Task(%GeRoTrio).freq = 24 ' so that we get high responsiveness. END IF END SUB SUB GeRoFft_Stop MM_Piano_Off MM_Piperola_Off %MM_Notes MM_Harma_Off %MM_Notes MM_Bourdonola_Off %MM_Notes ' MM_Humanola_Off %MM_Notes ' MM_Qt_Off ' MM_Krum_Off ' MM_Humanola_Off MM_Autosax_Off MM_Heli_Off MM_Bono_Off END SUB SUB GeRo_HaVi () ' for vibi, harma , autosax - 3 vectors ' Havisax {HeavySex) LOCAL n AS LONG LOCAL v AS LONG LOCAL i AS LONG LOCAL velo AS LONG LOCAL nh AS INTEGER STATIC trig AS LONG LOCAL s AS SINGLE STATIC cnt AS LONG STATIC slnr AS LONG STATIC oldsaxnote AS LONG STATIC oldharnote AS LONG STATIC oldvibnote AS LONG STATIC h AS HarmType IF ISFALSE Task(%GeRoHaVi).tog THEN DIM TaskParamLabels(2) AS LOCAL ASCIIZ * 8 TaskParamLabels(0) = "s X" ' vibi TaskParamLabels(1) = "s Y" ' harma TaskParamLabels(2) = "s Z" ' AutoSax IF ISFALSE Task(%GeroHavi).hParam THEN MakeTaskParameterDialog %GeroHaVi,3,Slider(),0,UDctrl(),TaskParamlabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%GeroHaVi).SliderNumbers(0) SendMessage Slider(slnr).h, %TBM_SETPOS,%True, 1 ' sens Slider(slnr).value = 1 SendMessage Slider(slnr+1).h, %TBM_SETPOS,%True, 3 ' sens Slider(slnr+1).value = 3 SendMessage Slider(slnr+2).h, %TBM_SETPOS,%True, 4 ' sens Slider(slnr+2).value = 4 END IF Task(%GeRoHaVi).tog = %True cnt = %False SetDlgItemText gh.Cockpit, %GMT_MSG2, "x=vibi y=harma z=sax" Progchange Harma.channel, 15 MM_Harma_On %MM_Motor MM_Autosax_On ' added 11.09.2006 MM_Vibi_On EXIT SUB END IF SELECT CASE cnt CASE 0 Vibi.Har(1).vel = STRING$(128,0) n = @sr.xf ' 12 bit snelheid SHIFT RIGHT n, 7 ' 0-31 v = @sr.xa SHIFT RIGHT v, 5 '6 ' 0 - 63- 6 bits IF v > Slider(slnr).value THEN INCR trig AddNote2Har Vibi.Har(1), 60 + n, v '5 + v oldvibnote = 60 + n END IF InstrumPlay Vibi Task(%GeroHavi).Har.vel = SumHar$(Task(%GeroHavi).Har,Vibi.Har(1)) CASE 1 Harma.Har(1).vel = STRING$(128,0) n = @sr.yf ' 12 bit snelheid SHIFT RIGHT n, 6 ' 0-63 v = @sr.ya SHIFT RIGHT v,6 ' 0 - 63 - 6 bits IF v > Slider(slnr+1).value THEN INCR Trig AddNote2Har Harma.Har(1), 36 + n, v oldharnote = 36 + n END IF InstrumPlay Harma Task(%GeroHavi).Har.vel = SumHar$(Task(%GeroHavi).Har,Harma.Har(1)) CASE 2 ' autosax... n = @sr.zf SHIFT RIGHT n, 6 ' 0-63 v = @sr.za SHIFT RIGHT v,6 ' 0 - 63 - 6 bits IF v > Slider(slnr+2).value THEN INCR Trig mPlay AutoSax.channel, n + 36, v * 2 oldsaxnote = n + 36 AddNote2Har Task(%GeroHavi).Har, oldsaxnote, v*2 ELSE IF oldsaxnote THEN NoteOff AutoSax.channel, oldsaxnote oldsaxnote = %False DelNote2Har Task(%GeroHavi).Har, oldsaxnote END IF END IF CASE 3 ' Harma v = @sr.ya SHIFT RIGHT v,6 ' 0 - 63- 6 bits ' here we can insert something to do with the chord... Trig = %False ' reset H.vel = SolveHar$ (Task(%GeroHavi).Har, -1,0.1) ' free solution. Even smaller dissonances are taken into ' consideration (0.1)) ' now we orchestrate the returned harmony string for Harma: nh = StealNoteFromHar%(h, oldharnote, 29, 89) ' Harma IF nh > 0 THEN AddNote2Har Harma.Har(1), nh, v InstrumPlay Harma INCR trig END IF CASE 4 ' vibi v = @sr.xa SHIFT RIGHT v,5 ' ' 0 - 63- 6 bits ' here we can insert something to do with the chord... Trig = %False ' reset H.vel = SolveHar$ (Task(%GeroHavi).Har, -1,0.1) ' free solution. Even smaller dissonances are taken into ' consideration (0.1)) ' now we orchestrate the returned harmony string for Vibi: nh = StealNoteFromHar%(h, oldvibnote, 60, 96) ' Vibi IF nh > 0 THEN AddNote2Har Vibi.Har(1), nh, v InstrumPlay Vibi INCR trig END IF CASE 5 ' AutoSax v = @sr.za SHIFT RIGHT v,6 ' 0 - 63- 6 bits ' here we can insert something to do with the chord... Trig = %False ' reset H.vel = SolveHar$ (Task(%GeroHavi).Har, -1,0.1) ' free solution. Even smaller dissonances are taken into ' consideration (0.1)) ' now we orchestrate the returned harmony string for AutoSax: nh = StealNoteFromHar%(h, oldharnote, 36, 74) ' AutoSax IF nh > 0 THEN IF oldsaxnote > 0 THEN NoteOff AutoSax.channel, oldsaxnote oldsaxnote = %False DelNote2Har Task(%GeroHavi).Har, oldsaxnote END IF mPlay AutoSax.channel, nh, v * 2 oldsaxnote = nh AddNote2Har Task(%GeroHavi).Har, oldsaxnote, v*2 INCR trig END IF END SELECT INCR cnt cnt = cnt MOD 6 IF Trig THEN Task(%GeroHavi).freq = MAX(@sr.xyzf / 128, 2) ELSE Task(%GeRoHavi).freq = 24 ' so that we get high responsiveness. END IF END SUB SUB GeRo_HaVi_Stop MM_Harma_Off '%MM_Notes MM_Autosax_Off '%MM_Notes END SUB SUB Gero_Troms () LOCAL v AS LONG LOCAL velo AS LONG LOCAL note AS LONG STATIC slnr AS LONG ' midi note mapping: 24-47 ' on x-transducer IF ISFALSE Task(%GeroTroms).tog THEN DIM TaskParamLabels(1) AS LOCAL ASCIIZ * 8 TaskParamLabels(0) = "Vol" IF ISFALSE Task(%GeroTroms).hParam THEN MakeTaskParameterDialog %GeroTroms,1,Slider(),0,UDctrl(),TaskParamlabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%GeroTroms).SliderNumbers(0) SendMessage Slider(slnr).h, %TBM_SETPOS,%True, 80 Slider(slnr).value = 80 END IF 'MM_Troms_On %MM_Light mPlay Troms.channel, 18, %True mPlay Troms.channel, 19, %True mPlay Troms.channel, 20, %True Task(%GeroTroms).tog = %True END IF v = @sr.xf ' 0 - 4095 - snelheid. SHIFT RIGHT v, 7 ' 0-31 note = 20 + v IF note < 22 THEN EXIT SUB IF note < 24 THEN note = 24 IF note > 47 THEN note = 45 + (note MOD 3) ' zou ook omgekeerd kunnen... velo = @sr.xa SHIFT RIGHT velo,5 ' 0 - 127 - 7 bits mPlay %Troms_Channel, note, velo * (Slider(slnr).value / 127) SHIFT RIGHT velo,2 ' 0-31 Task(%GeroTroms).freq = SQR(v * velo) / 2 IF Task(%GeroTroms).freq < 0.25 THEN Task(%GeroTroms).freq = 0.25 IF ISFALSE velo THEN Task(%GeroTroms).freq = 20 END IF END SUB SUB Gero_Roto () ' adapted to new rotomoton implementation 2007 - 13.09.2007 LOCAL v AS LONG LOCAL velo AS LONG LOCAL note AS LONG STATIC tim AS DWORD LOCAL tnow AS DWORD LOCAL s AS SINGLE STATIC cnt AS LONG STATIC li1 AS LONG STATIC li2 AS LONG IF ISFALSE Task(%GeroRoto).tog THEN MM_Rotomoton_On Task(%GeroRoto).channel = Rotomoton.Channel cnt = 101 ' trommelteller tim = TimeGetTime Task(%GeroRoto).tog = %True END IF ' midi note mapping: 48-59 ' on y-transducer v = @sr.yf ' 0 - 4095 - snelheid. ' nu: hoe hoger de snelheid hoe lager de trommel! SHIFT RIGHT v, 7 ' 0-31 note = 60 - (v/2) ' 60 - 45 IF note < 48 THEN note = 48 + (note MOD 3) END IF velo = @sr.ya SHIFT RIGHT velo,4 ' 0 - 127 - 7 bits velo = MIN(127, velo) mPlay Rotomoton.Channel, note, velo SHIFT RIGHT velo,2 ' 0-31 SELECT CASE note + velo CASE > 60 mPlay Rotomoton.Channel, 114, 127 li1 = %True CASE > 90 mPlay Rotomoton.Channel, 115, 127 li2 = %true CASE ELSE IF li1 THEN mPlay Rotomoton.Channel, 114, %False : li1 = %False IF li2 THEN mPlay Rotomoton.Channel, 115, %False : li2 = %False END SELECT Task(%GeroRoto).freq = SQR(v * velo) '/ 2 IF Task(%GeroRoto).freq < 0.75 THEN Task(%GeroRoto).freq = 0.75 IF ISFALSE velo THEN Task(%GeroRoto).freq = 30 END IF tnow = timegettime IF tnow - tim > 200 THEN tim = tnow v = @sr.yf \ 16 '64 '128 ' IF s < 256 THEN IF cnt > 105 THEN cnt = 101 v = (3 * Rotomoton.ctrl(cnt) + v) / 4 Controller Task(%GeroRoto).channel, cnt, MIN(v,127) logfile "motor" + STR$(cnt) + ":" + STR$(v) Rotomoton.ctrl(cnt) = MIN(v,127) INCR cnt ' END IF END IF END SUB SUB Gero_Vibi () LOCAL v AS LONG LOCAL velo AS LONG LOCAL note AS LONG ' midi note mapping: 60-96 ' on z-transducer logfile FUNCNAME$ IF ISFALSE Task(%GeroVibi).tog THEN logfile "1" Task(%GeroVibi).tog = %True logfile "2" EXIT SUB END IF v = @sr.zf ' 0 - 4095 - snelheid. logfile "3" SHIFT RIGHT v, 7 ' 0-31 note = 60 + v velo = @sr.za SHIFT RIGHT velo,5 '0-127 ' 0 - 63 - 6 bits logfile "4" IF velo THEN logfile "vibi" + STR$(note) + STR$(Velo) mPlay Vibi.Channel, note, velo' * 1.5 ELSE logfile "vibi exit" EXIT SUB END IF logfile "5" SHIFT RIGHT velo,2 ' 0-31 IF velo THEN logfile "6" Task(%GeroVibi).freq = SQR(v * velo) / 2 IF Task(%GeroVibi).freq < 0.5 THEN Task(%GeroVibi).freq = 0.5 logfile "freq now" + STR$(Task(%GeroVibi).freq) ELSE Task(%GeroVibi).freq = 20 END IF logfile FUNCNAME$ + " done" END SUB SUB Gero_Klung () LOCAL v AS LONG LOCAL velo AS LONG LOCAL note AS LONG STATIC cnt AS LONG ' midi note mapping: 49-69 ' on xyz-transducer IF ISFALSE Task(%GeroKlung).tog THEN Task(%GeroKlung).tog = %True END IF v = @sr.xyzf ' 0 - 4095 - snelheid. SHIFT RIGHT v, 7 ' 0-31 note = 48 + v ' 48 is geen noot op klung. velo = @sr.xyza SHIFT RIGHT velo,5 ' 0-127 - 7 bits 11.09.2006 IF velo THEN mPlay Klung.Channel, note, velo '* 1.5 Noteoff Klung.channel, 120 + cnt INCR cnt IF cnt > 3 THEN cnt = %False mPlay Klung.channel, 120 + cnt, 64 'lampjes ELSE MM_Klung_Off %MM_Lights Task(%GeroKlung).freq = 12 EXIT SUB END IF SHIFT RIGHT velo,2 ' 1 ' 0-31 Task(%GeroKlung).freq = SQR(v * velo) / 4 IF velo THEN IF Task(%GeroKlung).freq < 0.5 THEN Task(%GeroKlung).freq = 0.5 ELSE Task(%GeroKlung).freq = 12 END IF END SUB SUB Gero_Thunder () ' rev. started 13.09.2006 ' rain, thundersheet, woodpeckers, orange light, wind machine, cricket, lightning ' ratchet , storm, bird, windchimes so all components can happen. LOCAL v AS LONG LOCAL velo AS LONG LOCAL note AS LONG LOCAL sf AS SINGLE LOCAL ss AS SINGLE ' STATIC sheet AS LONG ' STATIC wind AS LONG ' STATIC tim AS DWORD ' STATIC timw AS DWORD STATIC slnr AS LONG STATIC ratchet AS LONG STATIC lightning AS LONG ' For ThunderWood ' midi note mapping: 1-14 woodpeckers, 15 = ratchet ' on xyz-transducer IF ISFALSE Task(%GeroThunder).tog THEN DIM TaskParamLabels(3) AS LOCAL ASCIIZ * 8 Task(%GeroThunder).channel = ThunderWood.Channel TaskParamLabels(0) = "sTh" TaskParamLabels(1) = "sWi" TaskParamlabels(2) = "pek" IF ISFALSE Task(%GeroThunder).hParam THEN MakeTaskParameterDialog %GeroThunder,3,Slider(),0,UDctrl(),TaskParamlabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%GeroThunder).SliderNumbers(0) SendMessage Slider(slnr).h, %TBM_SETPOS,%True, 2 Slider(slnr).value = 2 SendMessage Slider(slnr+1).h, %TBM_SETPOS,%True, 6 Slider(slnr+1).value = 6 SendMessage Slider(slnr+2).h, %TBM_SETPOS,%True, 100 Slider(slnr+2).value = 100 END IF '' tim = timeGetTime 'imw = tim Task(%GeroThunder).tog = %True END IF v = AvgStatArr (DataBuf7(), sf, 32) ' 0 - 4095 - snelheid. - over 500ms ' sf geeft de deviatie van de normaal SHIFT RIGHT v, 8 ' 0-15 note = v velo = AvgStatArr (DataBuf3(),ss, 32) ' 0-4095 SHIFT RIGHT velo,6 ' 0 - 63 - 6 bits IF velo THEN SELECT CASE note CASE %False mPlay ThunderWood.Channel, 26, velo ' cricket CASE 1 mPlay ThunderWood.Channel, 22, velo * 2 ' bird CASE 2 TO 15 mPlay ThunderWood.channel, note-1, velo * 2 *(slider(slnr+2).value / 128!) ' woodpeckers END SELECT ELSE EXIT SUB END IF 'lightning: IF @sr.xyzf > 1500 THEN ' condition and criterium to be checked IF ISFALSE lightning THEN mPlay ThunderWood.channel, 0, 127 lightning = %True END IF ELSE IF lightning THEN NoteOff Thunderwood.channel, 0 lightning = %False END IF END IF ' stormwind: IF @sr.xyza > 200 THEN mPlay ThunderWood.channel, 25, MIN(127, @sr.xyza / 16) ELSE NoteOff ThunderWood.channel, 25 END IF ' ratchet: IF @sr.amp > 1600 THEN ' condition subject to tests IF ISFALSE ratchet THEN mPlay ThunderWood.channel, 15, 127 ratchet = %True END IF ELSE IF ratchet THEN NoteOff ThunderWood.channel, 15 ratchet = %False END IF END IF ' new code: IF ss > Slider(slnr).value THEN mPlay ThunderWood.Channel, 19, 120 ' thundersheet Controller ThunderWood.channel, 70, @sr.xa / 32 ' orange light ELSE Controller ThunderWood.channel, 70, %False END IF ' wind: ' new code: IF sf > Slider(slnr+1).value THEN Controller ThunderWood.channel, 1, MIN(sf,127) ' windmachine ELSE NoteOff ThunderWood.channel, 24 END IF SHIFT RIGHT velo,1 ' 0-31 Task(%GeroThunder).freq = SQR(v * velo) IF Task(%GeroThunder).freq < 2 THEN Task(%GeroThunder).freq = 2 ' we let it rain it this case: mPlay ThunderWood.Channel, 16, MIN(@sr.xyza, 120) ELSEIF Task(%GeroThunder).freq < 3 THEN mPlay ThunderWood.Channel, 17, 127 ' windchimes END IF END SUB SUB Gero_Belly () LOCAL v AS LONG LOCAL velo AS LONG LOCAL note AS LONG STATIC cnt AS LONG ' basically a remapping of Gero_Vibi ' midi note mapping: 68-103 ' on x-transducer ' lites added 11.09.2006 IF ISFALSE Task(%GeroBelly).tog THEN Task(%GeroBelly).tog = %True END IF v = @sr.xf ' x - 0 - 4095 - snelheid. SHIFT RIGHT v, 7 ' 0-31 note = 68 + v velo = @sr.xa SHIFT RIGHT velo,6 ' 0 - 63 - 6 bits IF velo THEN SELECT CASE note - 68 ' was case note. ' bug: discovered 16.08.2004: must be case note - 68 CASE 4,9,12,24 ' compensate for very loud bells... - this never happened. SHIFT RIGHT velo, 4 mPlay Belly.Channel, note, velo OR 1 SHIFT LEFT velo, 4 CASE ELSE mPlay Belly.Channel, note, velo END SELECT noteoff Belly.channel, 120 + cnt ' lights INCR cnt IF cnt > 4 THEN cnt = %False mPlay Belly.channel, 120+cnt, 64 ELSE MM_Belly_Off %MM_Lights Task(%GeroBelly).freq = 6 EXIT SUB END IF SHIFT RIGHT velo,1 ' 0-31 IF velo THEN Task(%GeroBelly).freq = SQR(v * velo) / 2 IF Task(%GeroBelly).freq < 0.5 THEN Task(%GeroBelly).freq = 0.5 ELSE Task(%GeroBelly).freq = 20 END IF END SUB SUB Gero_Sax () LOCAL v AS LONG LOCAL velo AS LONG LOCAL note AS LONG STATIC slnr AS LONG STATIC udnr AS LONG ' basically a remapping of Gero_Vibi ' midi note mapping: 48-88 ' on y-transducer on init. remapable with UD controller IF ISFALSE Task(%GeroSax).tog THEN DIM TaskParamLabels(1) AS LOCAL ASCIIZ * 8 TaskParamLabels(0)="volu" ' not functional yet TaskParamLabels(1)="vektor" IF Task(%GeroSax).hParam = %Null THEN MakeTaskParameterDialog %GeroSax,1, Slider(),1,UdCtrl(), TaskParamLabels() slnr = TaskEX(%GeroSax).SliderNumbers(0) udnr = TaskEX(%GeroSax).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(GeroSax_UD) UDctrl(udnr).value = 1 ' 0,1,2 Slider(slnr).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%GeroSax).channel = AutoSax.channel Task(%GeroSax).tog = %True END IF SELECT CASE UDctrl(udnr).value CASE 0 v = @sr.xf ' x - 0 - 4095 - snelheid. velo = @sr.xa CASE 1 v = @sr.yf ' y - 0 - 4095 - snelheid. velo = @sr.ya CASE 2 v = @sr.zf ' z - 0 - 4095 - snelheid. velo = @sr.za END SELECT SHIFT RIGHT v, 6 ' 0-64 note = 48 + v SHIFT RIGHT velo,5 ' 0 - 127 - 7 bits IF velo THEN mPlay Task(%GeroSax).channel, note, velo ELSE EXIT SUB END IF SHIFT RIGHT velo,2 ' 0-31 IF velo THEN Task(%GeroSax).freq = SQR(v * velo) / 2 IF Task(%GeroSax).freq < 0.5 THEN Task(%GeroSax).freq = 0.5 ELSE Task(%GeroSax).freq = 20 END IF END SUB SUB GeroSax_UD () ' for callback on UpDown. LOCAL n AS BYTE n = UDCtrl(TaskEX(%GeroSax).UpdownNumbers(0)).value n = n MOD 3 UDCtrl(TaskEX(%GeroSax).UpdownNumbers(0)).value = n SetDlgItemText Task(%GeroSax).hparam, %GMT_TEXT0_ID + 16, "K=" & STR$(n) END SUB SUB Gero_Harma () ' origineel zelfde kode als GeRoPia, op zijn beurt kopie van Minor in BOM. ' code adapted for use with Dominica Eyckmans 09.10.2009 ' 10.10.2009: test en debug sessie. ' 10.01.2010: implemented. - harma code remmed out. LOCAL faktor AS SINGLE STATIC n0 AS INTEGER STATIC n1 AS INTEGER STATIC n2 AS INTEGER STATIC slnr AS LONG STATIC wind AS SINGLE IF Task(%GeroHarma).tog = %False THEN DIM TaskParamLabels(2) AS LOCAL ASCIIZ * 8 TaskParamLabels(0) = "sens" TaskParamLabels(1) = "tempo" IF ISFALSE Task(%GeroHarma).hParam THEN MakeTaskParameterDialog %GeroHarma,2,Slider(),0,UDctrl(),TaskParamlabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%GeroHarma).SliderNumbers(0) ' the second slider is slnr + 1 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, 3 SendMessage Slider(slnr+1).h, %TBM_SETPOS,%True, 18 ' tempo Slider(slnr+1).value = 18 Slider(slnr).value = 3 END IF Task(%GeroHarma).tog = %True Task(%GeroHarma).channel = HarmO.channel Task(%GeroHarma).freq = 2.4 'App.tempo / 60! ' slider(slnr+1).value / 25 'ProgChange Harma.channel, 15 ' registers on ' MM_Harma_On %MM_Lights OR %MM_Wind MM_Harmo_On MM_HarmO_ON %MM_Regs MM_HarmO_ON %MM_Lights ' wind = Harma.ctrl(7) wind = HarmO.ctrl(7) END IF DIM AD(0 TO 15) AS LOCAL INTEGER ' new section for wind pressure controll: [09.10.2009-gwr] IF wind =< @sr.amp/ 32 THEN ' @sr.s does not work! ' in this case we have an increase, and this can be done pretty fast: wind = ((wind * 5) + (@sr.amp / 32))/ 6 ELSE ' decelleration needs more integration: wind = ((wind * 15) + (@sr.amp / 32))/ 16 END IF wind = MIN(wind,100) wind = MAX(wind,30) IF ISFALSE Task(%GeroFFT).swit THEN ' that task also controlls Harma/O wind! IF INT(wind) <> HarmO.ctrl(7) THEN 'Harma.ctrl(7) = wind 'Controller Harma.channel, 7, Harma.ctrl(7) HarmO.ctrl(7) = wind Controller HarmO.channel, 7, HarmO.ctrl(7) END IF END IF ' --------------------------------------- IF @sr.xyze < Slider(slnr).value THEN Task(%GeroHarma).freq = DAQparams.samplingrate(0) / 3 '=42 such that it reacts fast! EXIT SUB END IF AD(7) = @sr.xyzf SHIFT RIGHT AD(7), 9 AD(7) = MIN(24 + (12* AD(7)), 84) ' oktaafligging - was 36 + (12* AD(7)) ' was: IF AD(7) > 84 THEN AD(7) = 84 DIM ADL(0 TO 15) AS LOCAL INTEGER ' logaritmische scalings IF @sr.xe /2 > @sr.noise THEN ADL(8) = @sr.xe / 64 ELSE ADL(8)=%False ' range is now 0-64 IF @sr.ye /2 > @sr.noise THEN ADL(9) = @sr.ye / 64 ELSE ADL(9)=%False IF @sr.ze /2 > @sr.noise THEN ADL(10) = @sr.ze / 64 ELSE ADL(10)=%False IF @sr.xyza > @sr.noise THEN ADL(3) = INT(15.268 * LOG(@sr.xyza)) ELSE ADL(3)=%False IF @sr.xf > @sr.noise THEN ADL(4) = INT(15.268 * LOG(@sr.xf)) ELSE ADL(4)=%False IF @sr.yf > @sr.noise THEN ADL(5) = INT(15.268 * LOG(@sr.yf)) ELSE ADL(5)=%False IF @sr.zf > @sr.noise THEN ADL(6) = INT(15.268 * LOG(@sr.zf)) ELSE ADL(6)=%False IF @sr.xyzac <> %False THEN ADL(15) = INT((15.268 * LOG(ABS(@sr.xyzac))) * SGN(@sr.xyzac)) ' to be checked for range !!! ELSE ADL(15)= %False END IF Task(%GeroHarma).Har.vel = STRING$(128,0) IF ADL(8) THEN 'SHIFT RIGHT ADL(4),3 ' = /8, bringing range down to 0-8 ADL(4) = ADL(4)/ 5.3 ' range 0 - 11 - new 09.10.2009 n0 = AD(7) + ADL(4) AddNote2Har Task(%GeroHarma).Har,n0 , ADL(8) ELSE DelNote2Har Task(%GeroHarma).Har, n0 END IF IF ADL(10) THEN ADL(6) = ADL(6) / 5.3 n1 = AD(7) + ADL(6) AddNote2Har Task(%GeroHarma).Har,n1 , ADL(10) ELSE DelNote2Har Task(%GeroHarma).har, n1 END IF IF ADL(9) THEN ADL(5) = ADL(5) / 5.3 n2 = AD(7) + ADL(5) AddNote2Har Task(%GeroHarma).Har,n2 , ADL(9) ELSE DelNote2Har Task(%GeroHarma).Har, n2 END IF IF (ADL(6) > 4) AND ((ADL(4) AND ADL(5)) = ADL(6)) THEN AddNote2Har Task(%GeroHarma).Har, AD(7), ADL(3) \ 4 'Harma.Har(1).vel = Task(%GeroHarma).Har.vel 'InstrumPlay Harma HarmO.Har(1).vel = Task(%GeroHarma).Har.vel InstrumPlay HarmO EXIT SUB ELSE DelNote2Har Task(%GeroHarma).Har, AD(7) END IF IF ADL(5) = ADL(6) THEN AddNote2Har Task(%GeroHarma).Har, AD(7)+12, ADL(3)\4 AddNote2Har Task(%GeroHarma).Har, AD(7)-12, ADL(3)\4 END IF IF ADL(4) = ADL(5) THEN AddNote2Har Task(%GeroHarma).Har, AD(7) + 7, ADL(3) \4 END IF IF ADL(4) = ADL(6) THEN AddNote2Har Task(%GeroHarma).Har, AD(7)-7, ADL(3) \ 4 END IF ' Harma.Har(1).vel = Task(%GeroHarma).Har.vel ' InstrumPlay Harma HarmO.Har(1).vel = Task(%GeroHarma).Har.vel InstrumPlay HarmO Task(%GeroHarma).freq = (Slider(slnr+1).value / 25!) * ((ABS(ADL(15))+5) / 10!) END SUB SUB Gero_Springer () ' %GeroSpringer ' gesture controlled springers - implements shakers, light, springs and siren (new 11.09.2006) LOCAL n AS INTEGER LOCAL f AS INTEGER LOCAL s AS SINGLE STATIC mara1 AS BYTE STATIC mara2 AS BYTE STATIC light AS BYTE STATIC siren AS BYTE IF ISFALSE Task(%GeroSpringer).tog THEN Task(%GeroSpringer).tog = %True END IF n = @sr.amp / 16 ' @sr.s, positie onafhankelijk, zou ook te testen zijn... (22.09.2003) f = @sr.xyzf /16 IF n THEN ' new coding 11.09.2006 IF f THEN IF n > 120 THEN Bend Springers.channel, %False, f / 2 ' siren - new mapping siren = f ELSE IF siren THEN Bend Springers.channel, %False, %False siren = %False END IF END IF IF n > 70 THEN mPlay Springers.channel, 120, MIN(INT(f*3), 127) ' largest spring on springers... IF n > 60 THEN mPlay Springers.channel, 121, MIN(INT(f*2.5), 127) ' second largest spring on springers... IF n > 50 THEN mPlay Springers.channel, 122, MIN(INT(f*2),127) ' third largest spring on springers... IF n > 40 THEN mPlay Springers.channel, 123, MIN(INT(f*1.5),127) ' shortest spring ELSE IF siren THEN Bend Springers.channel, %False, %False siren = %False END IF END IF n = n /2 SELECT CASE n 'CASE > 70 ' IF f THEN mPlay Springers.channel, 120, MIN(INT(f*3), 127) ' largest spring on springers... 'CSE > 60 ' IF f THEN mPlay Springers.channel, 121, MIN(INT(f*2.5), 127) ' second largest spring on springers... 'CASE > 50 ' IF f THEN mPlay Springers.channel, 122, MIN(INT(f*2),127) ' third largest spring on springers... 'CASE > 40 ' IF f THEN mPlay Springers.channel, 123, MIN(INT(f*1.5),127) ' shortest spring CASE > 40 ' niks CASE > 30 IF mara1 THEN mPlay Springers.channel, 125, 10 'Noteoff Springers.channel, 124 mara1 = %False END IF IF mara2 THEN mPlay Springers.channel, 127, 10 'Noteoff Springers.channel, 126 mara1 = %False END IF CASE > 20 IF ISFALSE mara2 THEN mPlay Springers.channel, 126, MIN(f*5,127) '90 mara2 = %True END IF 'KeyPress Springers.channel, 126,MIN(f * 5,127) CASE > 15 IF ISFALSE mara1 THEN mPlay Springers.channel, 124, MIN(f*6,127) '100 mara1 = %True END IF 'KeyPress Springers.channel, 124,MIN(f * 6,127) END SELECT END IF 'police light IF Springers.ctrl(70) <> f THEN Controller Springers.channel, 70, f ' added 11.09.2006 Springers.ctrl(70) = f END IF f = f / 8 ' 0-16 IF f < 2 THEN f = 2 Task(%gerospringer).freq = f END SUB SUB Gero_Dripper () ' gesture controlled rain... ' we have 3 rain modules, mapped on note 0,1,2,3 - 4,5,6,7 - 8,9,10,11 LOCAL t AS LONG IF ISFALSE Task(%Gerorain).tog THEN Task(%Gerorain).tog = %True END IF IF ISFALSE Task(%gerorain+1).swit THEN StartTask %Gerorain + 1 IF ISFALSE Task(%gerorain+2).swit THEN StartTask %Gerorain + 2 IF ISFALSE Task(%gerorain+3).swit THEN StartTask %Gerorain + 3 ' dripsize mapped on body surface ' dripfrequency mapped on gesture velocity Task(%GeroRain).freq = 3 END SUB SUB Gero_Dripper_Stop () StopTask %gerorain + 1 StopTask %gerorain + 2 StopTask %gerorain + 3 Task(%GeroRain+1).freq = 3 Task(%GeroRain+2).freq = 3.1 Task(%GeroRain+3).freq = 3.2 END SUB SUB Gero_Drip1 () ' alternating drips - drip module 1 ' dripsize mapped on body surface ' dripfrequency mapped on gesture velocity LOCAL f AS SINGLE LOCAL n AS DWORD LOCAL s AS SINGLE ' standaard deviatie STATIC cnt AS DWORD n = @sr.sx / 32 IF n THEN mPlay Dripper.channel, cnt MOD 4, n END IF INCR cnt f = @sr.xf / 256 IF f < 0.5 THEN f = 0.5 Task(%GeroRain+1).freq = f END SUB SUB Gero_Drip2 () ' alternating drips - drip module 2 ' dripsize mapped on body surface ' dripfrequency mapped on gesture velocity LOCAL f AS SINGLE LOCAL n AS DWORD LOCAL s AS SINGLE STATIC cnt AS DWORD n = @sr.sy / 32 IF n THEN mPlay Dripper.channel, 4+ (cnt MOD 4), n END IF INCR cnt f = @sr.yf / 256 IF f < 0.5 THEN f = 0.5 Task(%GeroRain+2).freq = f END SUB SUB Gero_Drip3 () ' alternating drips - drip module 3 ' dripsize mapped on body surface ' dripfrequency mapped on gesture velocity LOCAL f AS SINGLE LOCAL n AS DWORD LOCAL s AS SINGLE STATIC cnt AS DWORD n = @sr.sz / 32 IF n THEN mPlay Dripper.channel, 8 + (cnt MOD 4), n END IF INCR cnt f = @sr.zf / 256 IF f < 0.5 THEN f = 0.5 Task(%GeroRain+3).freq = f END SUB SUB Gero_Flex () ' %GeroFlex ' gesture controlled flex - 10.06.2003 ' to be revised as soon as Flex is operational again LOCAL nx AS INTEGER LOCAL ny AS INTEGER LOCAL fx AS INTEGER LOCAL fy AS INTEGER LOCAL s AS SINGLE STATIC pit AS DWORD STATIC et AS DWORD STATIC pipos AS DWORD STATIC epos AS DWORD IF ISFALSE Task(%GeroFlex).tog THEN 'pit = %False 'et = %False mPlay Flex.channel, 51,%False ' stop backbow mPlay Flex.channel, 48, %False ' stop frontbow mPlay Flex.Channel, 66,%False ' release pushers frontbow mPlay Flex.Channel, 67, %False ' release pushers backbow Task(%GeroFlex).tog = %True ' @sr.dtf = 16 ' te testen - en te resetten voor andere taken!!!! @sr.dta = 16 END IF ' nx = (AvgStatArr (DataBuf0(),s,256)) / 256 ' 0-127 - funktie in g_indep.dll ' ny = (AvgStatArr (DataBuf1(),s,256)) / 256 ' we integrate over 4 seconds. ' fx = (AvgStatArr (DataBuf4(),s,256)) / 256 ' 0-127 ' fy = (AvgStatArr (DataBuf5(),s,256)) / 256 ' 0-127 nx = @sr.sx / 256 ny = @sr.sy / 256 fx = @sr.xf / 256 fy = @sr.yf / 256 nx = MIN(nx, 100) ny = MIN(ny, 100) IF nx <> pipos THEN IF TimeGetTime > pit THEN ModeMess Flex.channel,1,nx pipos = nx pit = TimeGetTime + 5000 END IF END IF IF ny <> epos THEN IF TimeGetTime > et THEN ModeMess Flex.channel,2,ny epos = ny et = TimeGetTime + 5000 END IF END IF mPlay Flex.Channel, 48, fx ' frontbow motor clockwize (49 reverses) mPlay Flex.Channel, 50, fy ' backbow clockwize (51 reverses) IF nx > 0 AND fx > 0 THEN mPlay Flex.Channel, 60, 127 ' frontbow to PiSaw (61 moves to e-saw) ELSE mPlay Flex.Channel, 60, %False ' release backbow END IF IF ny > 0 AND fy > 0 THEN mPlay Flex.Channel, 63, 127 ' backbow to eSaw (62 moves to Pi-saw) ELSE mPlay Flex.Channel, 63, %False ' release backbow END IF fx = fx / 16 ' 0-8 IF fx < 0.2 THEN fx = 0.2 Task(%geroflex).freq = fx END SUB SUB Gero_Llor () LOCAL v AS LONG LOCAL velo AS LONG LOCAL note AS LONG LOCAL licht AS WORD STATIC oldnote AS LONG ' basically a remapping of Gero_Vibi / Gero_Belly ' midi note mapping: 36-59 ' on y-transducer ' tested 13.03.2005 - gwr. ' here we do not use the pitch remapping function for Llor. ' rechecked 12.09.2006 IF ISFALSE Task(%GeroLlor).tog THEN Task(%GeroLlor).tog = %True END IF v = @sr.yf ' x - 0 - 4095 - snelheid. SHIFT RIGHT v, 7 ' 0-31 note = MIN(36 + v,59) ' 68 + v velo = @sr.ya SHIFT RIGHT velo,5 ' 0 - 127 - 7 bits IF oldnote THEN Release Llor.channel, oldnote , 28 : oldnote = %False ' we need noteoff + velo here!!! IF velo THEN SELECT CASE note - 36 CASE 0 TO 7 mPlay Llor.Channel, note, velo OR 1 oldnote = note CASE ELSE mPlay Llor.Channel, note, velo END SELECT licht = velo \ 24 ' 0-5 IF licht THEN IF ISFALSE Llor.ctrl(licht) THEN mPlay Llor.channel, licht, 127 Llor.ctrl(licht) = %True END IF END IF ELSE FOR licht = 1 TO 5 IF Llor.ctrl(licht) THEN NoteOff Llor.channel, licht Llor.ctrl(licht) = %False END IF NEXT licht EXIT SUB END IF SHIFT RIGHT velo,1 ' 0-31 IF velo THEN Task(%GeroLlor).freq = SQR(v * velo) / 2 IF Task(%GeroLlor).freq < 0.5 THEN Task(%GeroLlor).freq = 0.5 ELSE Task(%GeroLlor).freq = 20 END IF END SUB SUB Gero_Tubi () ' tested o.k. 07.05.2003 LOCAL v AS LONG LOCAL velo AS LONG LOCAL noteX AS SINGLE LOCAL noteY AS SINGLE ' midi note mapping: 72-108.5 ' on x-y -transducer IF ISFALSE Task(%GeroTubi).tog THEN Task(%GeroTubi).tog = %True 'Controller Tubi.channel, 66, 1 - handled in the taskstartcptr. END IF ' 0 - 4095 - snelheid. v = @sr.xf SHIFT RIGHT v, 7 ' 0-31 noteX = 72 + v v = @sr.yf SHIFT RIGHT v, 7 noteY = 72.5 + v velo = @sr.xa SHIFT RIGHT velo,5 '6 ' 0 - 63 - 6 bits IF velo THEN mPlay Tubi.Channel, noteX, velo END IF velo = @sr.ya SHIFT RIGHT velo, 5 '6 IF velo THEN mPlay Tubi.Channel, noteY, velo ELSE EXIT SUB END IF velo = @sr.amp SHIFT RIGHT velo, 7 ' 0-31 IF velo THEN Task(%GeroTubi).freq = SQR(v * velo) / 2 IF Task(%GeroTubi).freq < 0.5 THEN Task(%GeroTubi).freq = 0.5 ELSE Task(%GeroTubi).freq = 20 END IF END SUB SUB Gero_So () LOCAL v AS LONG LOCAL velo AS LONG LOCAL note AS LONG STATIC slnr AS LONG STATIC udnr AS LONG 'STATIC oldnote AS INTEGER STATIC TiEv AS TimedEvent ' basically a remapping of Gero_Vibi ' on x-transducer on init IF ISFALSE Task(%GeroSo).tog THEN DIM TaskParamLabels(1) AS LOCAL ASCIIZ * 8 TaskParamLabels(0)="volu" ' not functional yet TaskParamLabels(1)="vektor" IF Task(%GeroSo).hParam = %Null THEN MakeTaskParameterDialog %GeroSo,1, Slider(),1,UdCtrl(), TaskParamLabels() slnr = TaskEX(%GeroSo).SliderNumbers(0) udnr = TaskEX(%GeroSo).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(GeroSo_UD) UDctrl(udnr).value = 0 ' 0,1,2 Slider(slnr).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%GeroSo).channel = So.channel Task(%GeroSo).tog = %True Task(%GeroSo).freq = 20 TiEv.cptr = CODEPTR(Gero_So_NoteOff) InstrumPlay So So.ctrl(1) = 127 Controller So.channel, 1, So.ctrl(1) EXIT SUB END IF SELECT CASE UDctrl(udnr).value CASE 0 v = @sr.xf ' x - 0 - 4095 - snelheid. velo = @sr.xa CASE 1 v = @sr.yf ' y - 0 - 4095 - snelheid. velo = @sr.ya CASE 2 v = @sr.zf ' z - 0 - 4095 - snelheid. velo = @sr.za END SELECT SHIFT RIGHT v, 7 ' 0-32 note = So.lowtes + v SHIFT RIGHT velo,4 ' 0 - 255 - 8 bits 'velo = MIN(velo,127) ' ceil to 7 bits IF velo THEN IF ISFALSE TiEv.tid THEN AddNote2Har So.Har(1),note, MAX(velo,14) InstrumPlay So TiEv.time = MAX(1024 -(velo*4),250) ScheduleEvent TiEv 'oldnote = note END IF ELSE ' IF oldnote THEN ' So_Play So ' oldnote = %False ' END IF ' EXIT SUB END IF SHIFT RIGHT velo,2 '0-63 'was 0-31 IF velo THEN Task(%GeroSo).freq = SQR((v+1) * velo) / 2 ' max. 15.5Hz IF Task(%GeroSo).freq < 0.5 THEN Task(%GeroSo).freq = 0.5 ELSE Task(%GeroSo).freq = 20 END IF END SUB SUB GeroSo_UD () ' for callback on UpDown. LOCAL n AS BYTE n = UDCtrl(TaskEX(%GeroSo).UpdownNumbers(0)).value n = n MOD 3 UDCtrl(TaskEX(%GeroSo).UpdownNumbers(0)).value = n SetDlgItemText Task(%GeroSo).hparam, %GMT_TEXT0_ID + 16, "K=" & STR$(n) END SUB SUB Gero_Vacca () ' added 13.06.2005 - tested 08.2006 LOCAL v AS LONG LOCAL velo AS LONG LOCAL note AS LONG LOCAL vl AS SINGLE ' midi note mapping: 48-95 ' on xyz-transducer IF ISFALSE Task(%GeroVacca).tog THEN Task(%GeroVacca).tog = %True END IF v = @sr.xyzf ' 0 - 4095 - snelheid. SHIFT RIGHT v, 6 ' 0-63 note = Vacca.lowtes + v velo = @sr.xyza SHIFT RIGHT velo,5 ' 0 - 127 - 7 bits vl = velo / 128! IF velo THEN velo = VaccaNotes(note).Minvel + ((Vaccanotes(note).MaxVel - VaccaNotes(note).Minvel) * vl) mPlay Vacca.Channel, note, velo ELSE EXIT SUB END IF SHIFT RIGHT velo,2 ' 0-31 Task(%GeroVacca).freq = SQR(v * velo) / 4 IF velo THEN IF Task(%GeroVacca).freq < 0.5 THEN Task(%GeroVacca).freq = 0.5 ELSE Task(%GeroVacca).freq = 12 END IF END SUB SUB Gero_Vitello () ' added 23.04.2006 - tested 11.09.2006 ' lights added 12.09.2006 LOCAL v AS LONG LOCAL velo AS LONG LOCAL note AS LONG LOCAL vl AS SINGLE STATIC cnt AS LONG ' midi note mapping: 96-127 ' on xyz-transducer IF ISFALSE Task(%GeroVitello).tog THEN Task(%GeroVitello).tog = %True END IF v = @sr.xyzf ' 0 - 4095 - snelheid. SHIFT RIGHT v, 7 ' 0-31 note = Vitello.lowtes + v velo = @sr.xyza SHIFT RIGHT velo,5 ' 0 - 127 - 7 bits IF velo THEN 'velo = VaccaNotes(note).Minvel + ((Vaccanotes(note).MaxVel - VaccaNotes(note).Minvel) * vl) mPlay Vitello.Channel, note, velo NoteOff Vitello.channel, 12 + cnt INCR cnt IF cnt > 7 THEN cnt = %False mPlay Vitello.channel, 12 + cnt, 64 ELSE MM_Vitello_Off %MM_Lights EXIT SUB END IF SHIFT RIGHT velo,2 ' 0-31 Task(%GeroVitello).freq = SQR(v * velo) / 4 IF velo THEN IF Task(%GeroVitello).freq < 0.5 THEN Task(%GeroVitello).freq = 0.5 ELSE Task(%GeroVitello).freq = 12 END IF END SUB SUB Gero_Psch () ' written and tested 11.09.2006 ' debug and trim 12.09.2006 ' used with Dominica 10.10.2009, again in Ices, 13.01.2010 LOCAL v AS LONG LOCAL velo AS LONG LOCAL note AS LONG LOCAL vl AS SINGLE ' midi note mapping: 96-127 ' on z-transducer IF ISFALSE Task(%GeroPsch).tog THEN Task(%GeroPsch).tog = %True END IF v = @sr.zf ' 0 - 4095 - snelheid. SHIFT RIGHT v, 8 ' 0-15 note = Psch.lowtes + v velo = @sr.za SHIFT RIGHT velo,5 ' 0 - 127 - 7 bits IF velo THEN mPlay Psch.Channel, note, velo ELSE Task(%GeroPsch).freq = 12 EXIT SUB END IF SHIFT RIGHT velo,2 ' 0-31 Task(%GeroPsch).freq = SQR(v * velo) '/ 4 IF velo THEN IF Task(%GeroPsch).freq < 0.5 THEN Task(%GeroPsch).freq = 0.5 ELSE Task(%GeroPsch).freq = 12 END IF END SUB SUB Gero_Casta () ' debug and trim 12.09.2006 ' notes 113 - 127 ' extended with support for Casta Due 09.05.2007 ' 10.10.2009: used in performance with Dominica Eyckmans ' 10.01.2010: Toggle switch impemented to inverse operation in 'Ices' IF ISFALSE Task(%GeroCasta).tog THEN Task(%geroCasta).tog = %True END IF LOCAL v AS LONG LOCAL velo AS LONG LOCAL note AS LONG IF ISFALSE ButnSW(2).flag THEN ' default operation ' casta 1 module: ' on z-transducer v = @sr.zf ' 0 - 4095 - snelheid. SHIFT RIGHT v, 8 ' 0-15 note = 113 + v velo = @sr.za SHIFT RIGHT velo,5 ' 0 - 127 - 7 bits IF velo THEN mPlay Casta.Channel, note, velo END IF ' casta 2 module: ' on x and y transducer ( two wings) ' left wing v = @sr.xf SHIFT RIGHT v, 9 '0 - 7 note = 112 + v velo = @sr.xa SHIFT RIGHT velo, 5 IF velo THEN mPlay Casta2.channel, note, velo END IF ' right wing: v = @sr.yf SHIFT RIGHT v, 9 '0 - 7 note = 120 + v velo = @sr.ya SHIFT RIGHT velo, 5 IF velo THEN mPlay Casta2.channel, note, velo END IF ' new 09.05.2007: velo = MAX(@sr.xa, @sr.ya, @sr.za) SHIFT RIGHT velo,7 ' 0-31 v = MAX(@sr.xf, @sr.yf, @sr.zf) SHIFT RIGHT v, 8 ' 0-15 Task(%GeroCasta).freq = SQR(v * velo) IF velo THEN IF Task(%GeroCasta).freq < 0.5 THEN Task(%GeroCasta).freq = 0.5 ELSE Task(%GeroCasta).freq = 12 END IF ELSE ' in this case operation is inverted. The more movement, the less casta activity. ' CASTA1: 'v = @sr.zf ' 0 - 4095 - snelheid. 'SHIFT RIGHT v, 8 ' 0-15 note = 113 + (RND(1) * 15) velo = @sr.za 'logfile STR$(velo) ' following, as found out by kristof is correct: 'SHIFT RIGHT velo,5 ' 0 - 127 - 7 bits upper limit of register very seldomly reached! 'velo = MAX(0, 90 - velo) ' inversion ' for the production 'Ices' with dominica, we needed a very much higher sensitivity and thus we do: SHIFT RIGHT velo,3 velo = MAX(0, 90 - velo) ' inversion IF velo THEN mPlay Casta.Channel, note, velo END IF ' casta 2 module: ' on x and y transducer ( two wings) ' left wing note = 112 + (RND(1) * 7) velo = @sr.xa SHIFT RIGHT velo, 3 ' 5 must be set back to 5 later on velo = MAX(0, 90 - velo) IF velo THEN mPlay Casta2.channel, note, velo END IF ' right wing: note = 120 + (RND(1) * 7) velo = @sr.ya SHIFT RIGHT velo, 3 ' 5 must be set back to 5 later on velo = MAX(0, 90 - velo) IF velo THEN mPlay Casta2.channel, note, velo END IF ' tempo also inversely proportional to detected speed and amplitude: velo = MAX(@sr.xa, @sr.ya, @sr.za) SHIFT RIGHT velo,7 ' 0-31 v = MAX(@sr.xf, @sr.yf, @sr.zf) SHIFT RIGHT v, 8 ' 0-15 Task(%GeroCasta).freq = 20 - (SQR(v * velo)) IF velo THEN IF Task(%GeroCasta).freq < 0.25 THEN Task(%GeroCasta).freq = 0.25 ELSE Task(%GeroCasta).freq = 22 END IF END IF END SUB SUB Gero_Snar () ' 12.09.2006 - with snares control and rimshots LOCAL v AS LONG LOCAL velo AS LONG LOCAL note AS LONG STATIC slnr AS LONG STATIC snares AS SINGLE ' midi note mapping: 60-72, normal beaters , 73-74= rimshot, 75-77= lites ' controller 11 = snares - on y-transducer ' rimshots also on z-transducer ' on x-transducer IF ISFALSE Task(%GeroSnar).tog THEN DIM TaskParamLabels(1) AS LOCAL ASCIIZ * 8 TaskParamLabels(0) = "Vol" IF ISFALSE Task(%GeroSnar).hParam THEN MakeTaskParameterDialog %GeroSnar,1,Slider(),0,UDctrl(),TaskParamlabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%GeroSnar).SliderNumbers(0) SendMessage Slider(slnr).h, %TBM_SETPOS,%True, 80 Slider(slnr).value = 80 END IF 'MM_Troms_On %MM_Light mPlay Snar.channel, 75, %True mPlay Snar.channel, 76, %True mPlay Snar.channel, 77, %True Task(%GeroSnar).tog = %True END IF v = @sr.xf ' 0 - 4095 - snelheid. SHIFT RIGHT v, 8 ' 0-15 note = 59 + v IF note < 60 THEN snares = snares - (snares / 20) ' heavy integration, discharge IF snares < 0.1 THEN snares = %False IF snar.ctrl(11) <> snares THEN Controller Snar.channel, 11, snares END IF END IF EXIT SUB END IF snares = snares + (@sr.yf /1000) ' heavy integration, charge IF snares > 127 THEN snares = 127 IF snares <> Snar.ctrl(11) THEN Snar.ctrl(11) = snares Controller Snar.channel, 11, snares END IF velo = @sr.xa SHIFT RIGHT velo,5 ' 0 - 127 - 7 bits mPlay Snar.channel, note, velo * (Slider(slnr).value / 127) IF velo > 60 THEN IF @sr.za > @sr.xa THEN mPlay Snar.channel,73, MIN(@sr.za / 32, 127) ' rimshot END IF IF @sr.za > @sr.ya THEN mPlay Snar.channel, 74, MIN(@sr.za / 32, 127) ' rimshot END IF END IF SHIFT RIGHT velo,2 ' 0-31 Task(%GeroSnar).freq = 3 * SQR(v * velo) '/ 2 IF Task(%GeroSnar).freq < 0.5 THEN Task(%GeroSnar).freq = 0.5 IF ISFALSE velo THEN Task(%GeroSnar).freq = 20 END IF END SUB SUB Gero_Snar_Off () Controller Snar.channel, 11, %False Snar.ctrl(11) = %False mPlay Snar.channel, 75, %False mPlay Snar.channel, 76, %False mPlay Snar.channel, 77, %False END SUB SUB Gero_Qt () ' to be done ' derived from solo in the second book of moves. STATIC oldnote AS INTEGER STATIC oldvelo AS INTEGER LOCAL note AS INTEGER LOCAL velo AS INTEGER LOCAL il% LOCAL jl% LOCAL m AS ASCIIZ * 45 STATIC slnr AS LONG IF ISFALSE Task(%GeRo_qt).tog THEN DIM TaskParamLabels(2) AS LOCAL ASCIIZ * 8 TaskParamLabels(0) = "sens" TaskParamLabels(1) = "tempo" IF ISFALSE Task(%Gero_qt).hParam THEN MakeTaskParameterDialog %Gero_qt,2,Slider(),0,UDctrl(),TaskParamlabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Gero_qt).SliderNumbers(0) SendMessage Slider(slnr).h, %TBM_SETPOS,%True, 5 SendMessage Slider(slnr+1).h, %TBM_SETPOS,%True, 60 ' tempo Slider(slnr+1).value = 60 Slider(slnr).value = 5 END IF oldnote = %False oldvelo = %False Task(%GeRo_qt).channel = Qt.channel ' uses 2 channels Task(%GeRo_qt).freq = 6 'App.tempo / 60! ' 6 Hz MM_Qt_On %MM_Wind '%mm_motor is sent from init_mm allready Task(%GeRo_qt).tog = %True END IF ' Solo quartertone instrument. Non-positional playing. Task(%GeRo_Qt).freq = Slider(slnr+1).value / 10 '/ 60! IF Task(%GeRo_qt).freq < 1 THEN Task(%GeRo_qt).freq = 1 jl% = @sr.xyzf ' 0 - 4095 - snelheid. SHIFT RIGHT jl%, 5 ' 0-128 note = 36 + 36 + jl% 'later we divide. now 72 to 200 ' must become fractional midi velo = @sr.xyza SHIFT RIGHT velo,6 '4 = 0 - 256 - 8 bits , 5 = 0-128, 6 =0-64 'IF velo > 127 THEN velo = 127 IF velo < (Slider(slnr).value) THEN velo = %False IF oldnote THEN IF ISFALSE oldnote MOD 2 THEN mPlay qt.channel,oldnote/2,%False ELSE mPlay qt.channel + 1, oldnote\2, %False END IF END IF oldnote = %false oldvelo = %False velo = %False IF qt.ctrl(118) THEN MM_Qt_Off %MM_Lights ' blauw licht qt.ctrl(118) = %False END IF EXIT SUB END IF IF note <> oldnote THEN IF note THEN IF ISFALSE note MOD 2 THEN mPlay qt.channel, note\2, velo ELSE mPlay qt.channel + 1, note\2, velo END IF END IF IF oldnote THEN IF ISFALSE oldnote MOD 2 THEN NoteOff qt.channel, oldnote\2 ', %False ELSE NoteOff qt.channel + 1, oldnote\2 END IF END IF oldnote = note oldvelo = velo IF ISFALSE qt.ctrl(118) THEN MM_Qt_On %MM_Lights qt.ctrl(118) = 64 END IF ELSE ' hold... IF ISFALSE qt.ctrl(118) THEN MM_Qt_On %MM_Lights qt.ctrl(118) = 64 END IF END IF END SUB SUB Gero_Sire () ' based on the PicRada kode for sires pic ' this task is meant for using sire in an installation with 3 picrads ' in performance it can become "Sire's Pic" ' Lampjes bij bewegingsdetektie - done 18.12.2005 gwr. STATIC radcount AS LONG ' counts 0,1,2 STATIC sircount AS LONG ' counts 0,1,2,3,4,5,6,7 STATIC currentvals() AS SINGLE ' 0-23 STATIC poly() AS SINGLE 'single for integration purposes STATIC mx AS SINGLE ' STATIC f AS LONG LOCAL i AS WORD LOCAL j AS WORD LOCAL cn AS SINGLE LOCAL b$ LOCAL s AS LONG LOCAL f AS LONG IF ISFALSE task(%GeroSire).tog THEN Task(%GeroSire).tog = %true DIM currentvals(23) DIM poly(2) END IF INCR radcount 'not the intuitive way of counting, but this way each radar is polled every 3rd time the task is called.. IF radcount > 2 THEN INCR sircount sircount = sircount MOD 7 radcount = 0 END IF 'get the data: SELECT CASE radcount CASE 0 s = @sr.sx f = @sr.xf CASE 1 s = @sr.sy f = @sr.yf CASE 2 s = @sr.sz f = @sr.zf END SELECT s = s / 32 ' reduce to 7 bit f = f / 32 IF s < 2 THEN 'evt. use @sr.amp @pRadPic(radcount).amp < 2 THEN FOR j = 0 TO 7 i = 8 * radcount + j IF currentvals(i) > 0 THEN NoteOff Sire.channel, Sire.LowTes + i currentvals(i) = 0 END IF NEXT EXIT SUB ELSEIF s < 6 THEN '@pRadPic(radcount).amp < 6 THEN FOR j = 0 TO 7 i = 8 * radcount + j IF currentvals(i) > 1 THEN mPlay Sire.channel, Sire.LowTes + i, 1 currentvals(i) = 1 END IF NEXT EXIT SUB END IF ' poly(radcount) = (2 * poly(radcount) + 1 + @pRadPic(radcount).amp / 21) / 3 'was 4 * en /5 poly(radcount) = (2 * poly(radcount) + 1 + s / 21) / 3 'was 4 * en /5 IF sircount > poly(radcount) THEN FOR j = sircount TO 7 i = 8 * radcount + sircount IF currentvals(i)> 47 THEN mPlay Sire.channel, Sire.LowTes + i, 1 '0 currentvals(i) = 47 END IF NEXT EXIT SUB END IF i = 8 * radcount + sircount cn = 48 + 2 * f '@pRadPic(radcount).f '^ .8 currentvals(i) = MAX(48, (2 * currentvals(i) + cn) / 3) 'was *5 en /6 IF currentvals(i) >= 48 THEN j = Sire_Midinoot2velo(currentvals(i)) 'cn) mPlay Sire.channel, Sire.LowTes + i, HIBYT(j) 'currentvals(i) Controller Sire.channel, Sire.lowtes + i, LOBYT(j) ' lsb mx = MAX(mx, currentvals(i)) 'CONTROL SET TEXT gh.cockpit, %GMT_MSG2, STR$(mx) ELSEIF currentvals(i) > 1 THEN currentvals(i) = 1 mPlay Sire.channel, Sire.LowTes + i,1 END IF ' lampjes: - added gwr. 18.12.2005 SELECT CASE f '@pRadPic(radcount).f CASE < 4 IF sire.ctrl(84+ (radcount * 3)) THEN NoteOff Sire.channel,84 + (radcount * 3) sire.ctrl(84 + (radcount *3)) = %False END IF IF sire.ctrl(85 + (radcount *3)) THEN NoteOff Sire.channel, 85 + (radcount * 3) sire.ctrl(85 + (radcount *3)) = %False END IF IF sire.ctrl(86 + (radcount *3)) THEN NoteOff Sire.channel, 86 + (radcount * 3) sire.ctrl(86 + (radcount *3)) = %False END IF CASE < 8 IF ISFALSE sire.ctrl(84+(radcount *3)) THEN mPlay Sire.channel, 84 + (radcount * 3), %True Sire.ctrl(84+ (radcount *3)) = %True END IF IF Sire.ctrl(85+(radcount *3)) THEN NoteOff Sire.channel, 85 + (radcount * 3) Sire.ctrl(85+(radcount *3)) = %False END IF IF sire.ctrl(86 + (radcount *3)) THEN NoteOff Sire.channel, 86 + (radcount * 3) sire.ctrl(86 + (radcount *3)) = %False END IF CASE < 14 IF ISFALSE sire.ctrl(84+(radcount *3)) THEN mPlay Sire.channel, 84 + (radcount * 3), %True Sire.ctrl(84+ (radcount *3)) = %True END IF IF ISFALSE Sire.ctrl(85+(radcount *3)) THEN mPlay Sire.channel, 85 + (radcount * 3), %True Sire.ctrl(85+(radcount *3)) = %True END IF IF sire.ctrl(86 + (radcount *3)) THEN NoteOff Sire.channel, 86 + (radcount * 3) sire.ctrl(86 + (radcount *3)) = %False END IF CASE ELSE IF ISFALSE sire.ctrl(84+(radcount *3)) THEN mPlay Sire.channel, 84 + (Radcount * 3), %TRue sire.ctrl(84 + (radcount * 3)) = %True END IF IF ISFALSE sire.ctrl(85+(radcount *3)) THEN ' upward LED's mPlay Sire.channel, 85 + (Radcount * 3), %True sire.ctrl(85 + (radcount * 3)) = %True END IF IF ISFALSE sire.ctrl(86+(radcount *3)) THEN ' led spotlites mPlay Sire.channel, 86 + (Radcount * 3), %True sire.ctrl(86 + (radcount * 3)) = %True END IF END SELECT END SUB SUB Vivoges () ' violin & vocal input + dance: 2 players, split in space. ' inputs from player are in CQT_In type. ' robots used in maps on midi input: ,,,, ' dance should be mapped on: ,,,, STATIC n1 AS INTEGER STATIC n2 AS INTEGER STATIC n3 AS INTEGER LOCAL n4 AS SINGLE LOCAL nv1 AS INTEGER LOCAL nv2 AS INTEGER LOCAL velo AS BYTE STATIC slnr AS DWORD STATIC udnr AS DWORD STATIC oldsonote AS INTEGER STATIC oldpianonote AS INTEGER STATIC oldharmanote AS INTEGER STATIC oldpipnote AS INTEGER STATIC PiBo AS DWORD STATIC TiEv AS TimedEvent IF ISFALSE Task(%Vivoges).tog THEN DIM TaskParamLabels(2) AS LOCAL ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "imit" TaskParamLabels(2) = "bell" IF ISFALSE Task(%Vivoges).hParam THEN MakeTaskParameterDialog %Vivoges,1,Slider(),2,UDctrl(),TaskParamlabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Vivoges).SliderNumbers(0) SendMessage Slider(slnr).h, %TBM_SETPOS,%True, 31 ' used for tempo scaling Slider(slnr).value = 31 udnr = TaskEX(%Vivoges).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Vivoges_UD) UDctrl(udnr).value = %False ' 0,1 UDctrl(udnr+1).cptr = CODEPTR(Vivoges_UD_Bell) UDctrl(udnr+1).value = %False END IF IF ISFALSE Task(CQT.listentasknr).swit THEN starttask Cqt.listentasknr ' IF ISFALSE Task(%GeroSilmon).swit THEN starttask %GeroSilmon Task(%Vivoges).tog = %True MM_Harma_ON MM_Piperola_On MM_Bourdonola_On TiEv.cptr = CODEPTR(Gero_So_NoteOff) END IF ' monitoring: [ moved to silmon] IF UDctrl(udnr).value THEN Harma.Har(1) = Task(CQT.listentasknr).har ' imitation ON END IF SELECT CASE GetNrNotesInHar (Task(CQT.listentasknr).har) CASE %False ' no notes received nor hanging IF Oldpianonote THEN NoteOff Piano.channel, oldpianonote oldpianonote = %False END IF IF OldHarmaNote THEN ' InstrumPlay Harma NoteOff Harma.channel, oldharmanote OldHarmaNote = %False END IF IF PiBo THEN InstrumPlay Piperola Instrumplay Bourdonola PiBo = %False END IF IF oldpipnote THEN NoteOff Piperola.channel, oldpipnote oldpipnote = %False END IF CASE 1 nv1 = GetHighestNote (Task(CQT.listentasknr).Har, cqt.lowtes, cqt.hightes) IF nv1 > %False THEN n1 = SpectralNote(HIBYT(nv1),2 + (RND(1)*5), 1,%True) ' spekfak = 1 IF n1 < Harma.hightes THEN ' was <=, so we got the bell... addnote2Har Harma.har(1),n1, CQT.vol oldharmanote = n1 ' here we should delete the bell from the har-string... (this causes mike feedback...) 'InstrumPlay Harma - done at the end of the procedure END IF END IF CASE 2 ' get them: nv1 = GetHighestNote (Task(CQT.listentasknr).Har, cqt.lowtes, cqt.hightes) nv2 = GetLowestNote (Task(CQT.listentasknr).Har, cqt.lowtes, cqt.hightes) IF (nv1 > %False) AND (nv2 > %False) THEN n1 = HIBYT(nv1) n2 = HIBYT(nv2) velo = (LOBYT(nv1) + LOBYT(nv2)) / 2 ' calculate the difference tone - to be mapped on : n3 = ROUND(DifNoteF (n1,n2),0) ' SINGLE ' calculate the sum tone: n4 = SumNoteF (n1,n2) ' returns a fractional midi-note ' x-lat to suitable note for : IF n3 > So.hightes THEN DO n3 = n3 - 12 LOOP UNTIL n3 <= So.hightes END IF IF n3 < So.lowtes THEN DO n3 = n3 + 12 LOOP UNTIL n3 >= So.lowtes END IF IF ISFALSE OldSoNote THEN IF ISFALSE TiEv.tid THEN AddNote2Har So.Har(1), n3, velo InstrumPlay So TiEv.time = MAX(CQT.dur * 2,250) ScheduleEvent TiEv OldSoNote = n3 ELSE mPlay piano.channel, n3, velo oldpianonote = n3 END IF ELSE ' melodize: IF n3 > OldSoNote THEN n3 = ((OldSoNote \ 12) * 12) + (n3 MOD 12) IF n3 > So.Hightes THEN n3 = n3 - 12 ELSE n3 = ((OldSoNote \ 12) * 12) - (n3 MOD 12) IF n3 < So.Lowtes THEN n3 = n3 + 12 END IF IF ISFALSE TiEv.tid THEN AddNote2Har So.Har(1), n3, velo InstrumPlay So TiEv.Time = MAX(CQT.dur * 2, 250) ScheduleEvent TiEv OldSoNote = n3 So.ctrl(1) = 127 Controller So.channel, 1, So.ctrl(1) ELSE mPlay piano.channel, n3, velo oldpianonote = n3 END IF END IF ' now remap and x-lat the sumnote: SELECT CASE FRAC(n4) CASE < 0.25 n4 = FIX(n4) IF n4 > 66 THEN IF n4 > Piperola.hightes THEN DO n4 = n4 - 12 LOOP UNTIL n4 <= Piperola.hightes END IF mPlay Piperola.channel, n4, 64 oldpipnote = n4 ELSE IF n4 > Harma.Hightes THEN DO n4 = n4 - 12 LOOP UNTIL n4 < Harma.hightes ' was <= , so we got the F# bell. END IF AddNote2Har Harma.Har(1), n4, velo 'mPlay Harma.channel, n4, velo oldharmanote = n4 END IF CASE >0.75 ' piperola or harma n4 = FIX(n4) + 1 IF n4 > 66 THEN IF n4 > Piperola.hightes THEN DO n4 = n4 - 12 LOOP UNTIL n4 <= Piperola.hightes END IF mPlay Piperola.channel, n4, 64 oldpipnote = n4 ELSE IF n4 > Harma.Hightes THEN DO n4 = n4 - 12 LOOP UNTIL n4 <= Harma.hightes END IF 'mPlay Harma.channel, n4, velo AddNote2Har Harma.Har(1), n4, velo oldharmanote = n4 END IF CASE ELSE ' tubi quartertones. mPlay Tubi.channel, n4 - 36, velo END SELECT ELSE ' in this case we have notes out of the range... END IF CASE ELSE ' more notes... Task(%Vivoges).har.vel = SolveHar$ (Task(CQT.listentasknr).Har, F2N(CQT.Tes), 0.1) Piperola.Har(1) = Task(%Vivoges).har Bourdonola.Har(1) = Task(%Vivoges).Har InstrumPlay Piperola InstrumPlay Bourdonola PiBo = %True END SELECT IF ISFALSE UDctrl(UDnr+1).value THEN DelNote2Har Harma.Har(1),Harma.Hightes ' remove the bell, if it occurs. END IF InstrumPlay Harma ' tempo dependent on density of midi input: IF CQT.dens > 0 THEN Task(%Vivoges).freq = CQT.dens * ((1 + Slider(slnr).value) / 16) '* 2 '1.5 ' * 2 is wellicht te snel ' faktor range: 0.0625 to 8 ELSE Task(%Vivoges).freq = 0.5 END IF END SUB SUB Vivoges_Stop () MM_So_Off MM_Harma_Off MM_Piperola_Off MM_Bourdonola_Off END SUB SUB Gero_Cqt_Listen_old () ' now in dll ' listens to channels and port set in inifile LOCAL nv%, noot?, velo? STATIC Cnt() AS BYTE STATIC oldwijzer AS DWORD STATIC silenceflag AS BYTE LOCAL wijzer AS DWORD LOCAL nrevents AS LONG IF ISFALSE Task(%Listen_Task).tog THEN CQT.vol = 4 ' midi level CQT.tes = 25 ' in Hz CQT.dens = 0.1 ' in events/sec (Hz) Task(%Listen_Task).tog = %True Task(%Listen_Task).Har.vel = STRING$(128,0) ' blank buffer Task(%Listen_Task).channel = cqt.inchannel SetMidiListenChannel cqt.inchannel, %True ' new 20.12.2002 REDIM Cnt(255) ' 1 byte for every cs. - so we integrate over 2,56 seconds END IF ' This task does not do any music generation in itself. It links the real time input from a performer ' via the cqt midi-in device and writes this midi input into the harmony string of the task. ' read and remove the notes from the midi-input buffer: nv% = GetMidiNote% (cqt.inchannel, %Remove OR %Oldest) IF nv% = %NotFalse THEN EXIT SUB ' if no note came in, exit the task ELSE velo? = LOBYT (nv%) noot? = HIBYT (nv%) ' write it to the harmony-string (polyphonic) IF velo? THEN AddNote2Har Task(%Listen_task).Har, noot?,velo? ELSE DelNote2Har Task(%Listen_task).Har, noot? END IF END IF ' faster alternative: ' do ' ' loop until nv% = %NotFalse ' for testing: 'PlayHar Task(%Listen_task).Har , Task(%Listen_Task).channel ' bereken de gemiddelde geluidsterkte van de input IF velo? THEN CQT.Vol = CQT.Vol + CQT.Vol + CQT.Vol + velo? SHIFT RIGHT CQT.Vol, 2 END IF ' ' bereken de gemiddelde tessituurligging van de input IF noot? THEN CQT.tes = ((CQT.tes * 3) + N2F(noot?)) / 4 END IF ' calculate the density of the input over a timeframe of 255cs. ' The result is returned in CQT_In.dens wijzer = (timeGetTime / 10) 'MOD 256 wijzer = wijzer AND 255 IF wijzer <> oldwijzer THEN DO INCR oldwijzer oldwijzer = oldwijzer AND 255 Cnt(oldwijzer) = %False LOOP UNTIL oldwijzer = wijzer END IF Cnt(wijzer) = %True ' now count the number of events in the buffer: FOR wijzer = 0 TO 255 IF Cnt(wijzer) THEN INCR nrevents NEXT wijzer CQT.dens = (nrevents/2) / 2.56! ' express result in (events/2)/second FillHarType Task(%Listen_task).har ' silence or rest-minitoring END SUB SUB Gero_CQT_Silmon_old () ' this task increments the silence field in cqt_in, when silence is happening. ' Task(%GeroSilmon).freq = 10 IF Task(%Listen_task).har.vel = STRING$(128,0) THEN CQT.silencetimer = CQT.silencetimer + 100 ' in ms, or + 10 for cs IF CQT.notetimer THEN CQT.dur = CQT.notetimer ' remember last sound duration END IF CQT.notetimer = %False ELSE CQT.notetimer = CQT.notetimer + 100 IF CQT.silencetimer THEN CQT.rest = CQT.silencetimer ' remember last rest... END IF CQT.silencetimer = %False END IF ' monitoring in Cockpit: SetDlgItemText gh.Cockpit, %GMT_TES_ID, TRIM$(STR$(INT(cqt.tes))) SetDlgItemText gh.Cockpit, %GMT_VOL_ID, TRIM$(STR$(cqt.vol)) SetDlgItemText gh.Cockpit, %GMT_MSG1, " d=" & FORMAT$(cqt.dens,"##.#") SetDlgItemText gh.Cockpit, %GMT_MSG2, " rest=" & FORMAT$(cqt.rest,"######") & " dur=" & FORMAT$(cqt.dur,"#####") END SUB SUB Gero_So_NoteOff () ' called on expiration of the timer for so InstrumPlay So END SUB SUB Vivoges_UD () ' for callback on UpDown. LOCAL n AS BYTE n = UDCtrl(TaskEX(%Vivoges).UpdownNumbers(0)).value n = n MOD 2 UDCtrl(TaskEX(%Vivoges).UpdownNumbers(0)).value = n SetDlgItemText Task(%Vivoges).hparam, %GMT_TEXT0_ID + 16, "Im=" & STR$(n) END SUB SUB Vivoges_UD_Bell() LOCAL n AS BYTE n = UDCtrl(TaskEX(%Vivoges).UpdownNumbers(1)).value n = n MOD 2 UDCtrl(TaskEX(%Vivoges).UpdownNumbers(1)).value = n SetDlgItemText Task(%Vivoges).hparam, %GMT_TEXT0_ID + 17, "F#=" & STR$(n) END SUB SUB Gero_Puff () ' first public run 16.12.2003 ' stepping motor added 13.01.2004 ' performance with emilie 14.01.2004 ' orange lights added 17.03.2004 ' reused with dominica 15.10.2009 LOCAL v AS LONG LOCAL velo AS LONG LOCAL noteX AS SINGLE LOCAL noteY AS SINGLE STATIC lightx AS DWORD STATIC lighty AS DWORD STATIC steps AS LONG STATIC direc AS LONG STATIC fire1 AS DWORD STATIC fire2 AS DWORD ' midi note mapping: 7 - & 55- 96 ' on x-y -transducer IF ISFALSE Task(%GeroPuff).tog THEN Task(%GeroPuff).tog = %True steps = 0 direc = 1 END IF ' 0 - 4095 - snelheid. ' v = @sr.xf ' SHIFT RIGHT v, 7 ' 0-31 ' noteX = 7 + v ' 7-38 noteX = 7 + (@sr.xf / 100!) ' 7 + [0-->41] noteY = 55 + (@sr.yf / 100!) ' v = @sr.yf ' SHIFT RIGHT v, 7 ' noteY = 55 + v ' 55-93 '49,50,51,52 = stepping motor 53,54 =eye lights velo = @sr.xa SHIFT RIGHT velo,6 ' 0 - 63 - 6 bits IF velo THEN mPlay Puff.Channel, noteX, velo IF ISFALSE lightx THEN lightx = %True mPlay Puff.Channel, 53, 127 END IF ' stepper: mPlay Puff.Channel, 49 + (steps MOD 4) , velo IF direc > 0 THEN INCR steps ELSE DECR steps ELSE IF lightx THEN mPlay Puff.Channel, 53, %False lightx = %False END IF END IF ' orange lights: IF velo > 16 THEN IF ISFALSE fire1 THEN mPlay Puff.channel, 104, 64 fire1 = 104 END IF ELSE IF fire1 THEN NoteOff Puff.channel, 104 fire1 = %False END IF END IF velo = @sr.ya SHIFT RIGHT velo, 6 IF velo THEN mPlay Puff.Channel, noteY, velo IF ISFALSE lightY THEN lightY = %TRue mPlay Puff.channel, 54, 127 END IF ' stepper: mPlay Puff.Channel, 49 + (steps MOD 4), velo IF direc > 0 THEN INCR steps ELSE DECR steps ELSE IF lightY THEN lightY = %False mPlay Puff.Channel, 54, %False END IF EXIT SUB END IF IF velo > 16 THEN IF ISFALSE fire2 THEN mPlay Puff.channel, 105, 64 fire2 = 105 END IF ELSE IF fire2 THEN NoteOff Puff.channel, 105 fire2 = %False END IF END IF IF steps > 240 THEN direc = -1 ELSEIF steps < 1 THEN direc = 1 END IF velo = @sr.amp SHIFT RIGHT velo, 7 ' 0-31 IF velo THEN Task(%GeroPuff).freq = velo / 2 'SQR(v * velo) / 2 IF Task(%GeroPuff).freq < 0.5 THEN Task(%GeroPuff).freq = 0.5 ELSE Task(%GeroPuff).freq = 20 END IF END SUB SUB Gero_Trump () '%GeroTrump ' needs ii-channels 3, 7, STATIC oldnote AS INTEGER STATIC scalefactor AS SINGLE STATIC cnt AS DWORD LOCAL note AS INTEGER LOCAL velo AS INTEGER LOCAL m AS ASCIIZ * 45 STATIC slnr AS LONG 'STATIC oldwind AS DWORD IF ISFALSE Task(%GeRoTrump).tog THEN DIM TaskParamLabels(2) AS LOCAL ASCIIZ * 8 TaskParamLabels(0) = "sens" TaskParamLabels(1) = "tempo" TaskParamLabels(2) = "wind" IF ISFALSE Task(%GeroTrump).hParam THEN MakeTaskParameterDialog %GeroTrump,3,Slider(),0,UDctrl(),TaskParamlabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%GeroTrump).SliderNumbers(0) SendMessage Slider(slnr).h, %TBM_SETPOS,%True, 5 SendMessage Slider(slnr+1).h, %TBM_SETPOS,%True, 60 ' tempo SendMessage Slider(slnr+2).h, %TBM_SETPOS, %True, 20 ' wind Slider(slnr+1).value = 60 Slider(slnr).value = 5 Slider(slnr+2).value = 20 ' wind END IF MM_Trump_On %MM_Wind oldnote = %False Task(%GeRoTrump).channel = Trump.channel Task(%GeRoTrump).tog = %True Task(%GeRoTrump).freq = 6 'App.tempo / 60! ' 6 Hz scalefactor = 4095 / (trump.hightes - trump.lowtes) ' static and calculated only once END IF ' Solo instrument. Non-positional playing. IF slider(slnr+2).value <> Trump.ctrl(7) THEN Controller Trump.channel, 7, slider(slnr+2).value Trump.ctrl(7) = Slider(slnr+2).value END IF Task(%GeroTrump).tempo = 60 * (Slider(slnr+1).value / 10) ' conversion to MM IF Task(%GeroTrump).tempo < 10 THEN Task(%GeroTrump).tempo = 10 'IF Task(%GeRoTrump).freq < 1 THEN Task(%GeRoTrump).freq = 1 ' lets map over the entire and precise range of trump: 'scalefactor = 4095 / (trump.hightes - trump.lowtes) ' done on init note = Trump.lowtes + (@sr.xyzf/ scalefactor) velo = @sr.xyza SHIFT RIGHT velo,4 ' 0 - 256 - 8 bits IF velo > 127 THEN velo = 127 ' we use velo to control the on/off proportion here. IF velo < (Slider(slnr).value) THEN velo = %False IF oldnote THEN mPlay Trump.channel,oldnote,%False oldnote = %false END IF IF ISFALSE cnt THEN IF note THEN mPlay Trump.channel, note, 64 'velo trump is not velo sensitive!!! oldnote = note END IF ELSE IF oldnote THEN mPlay Trump.channel, oldnote, %False oldnote = %False END IF END IF BIT TOGGLE cnt, 0 ' as velo gets larger, we should get longer notes. With small velo, staccato. ' ===> Period = 60/ tempo IF ISFALSE cnt THEN Task(%GeroTrump).freq = 1 / ((1- (velo / 128)) * (60 / Task(%Gerotrump).tempo)) ' on freq. ELSE Task(%GeroTrump).freq = 1 / ((velo / 128) * (60 / Task(%Gerotrump).tempo)) ' off freq. END IF END SUB SUB Gero_Hurdy () ' in the works ' we have -2 notes (one on each string) ' -2 note pressure controllers ' -1 bow speed controll (Volume) ' best zou zijn 2 taken te hebben: een voor de hoge en een voor de lage snaar... ' evt. kode voor trump overnemen (met legato/staccato) LOCAL v AS LONG LOCAL velo AS LONG LOCAL note AS LONG STATIC slnr AS LONG STATIC udnr AS LONG STATIC oldnote AS INTEGER LOCAL sprange AS SINGLE LOCAL motorspeed AS DWORD ' on x-transducer on init IF ISFALSE Task(%GeroHurdy).tog THEN DIM TaskParamLabels(2) AS LOCAL ASCIIZ * 8 TaskParamLabels(0)="volu" ' bow speed lower limit TaskParamlabels(1)="M.M." ' tempo TaskParamLabels(2)="vektor" IF ISFALSE Task(%GeroHurdy).hParam THEN MakeTaskParameterDialog %GeroHurdy,2, Slider(),1,UdCtrl(), TaskParamLabels() slnr = TaskEX(%GeroHurdy).SliderNumbers(0) udnr = TaskEX(%GeroHurdy).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(GeroHurdy_UD) UDctrl(udnr).value = 0 ' 0,1,2,3 Slider(slnr).value = 40 Slider(slnr+1).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(slnr+1).value END IF Task(%GeroHurdy).channel = Hurdy.channel Task(%GeroHurdy).tog = %True Task(%GeroHurdy).freq = 4 * ((Slider(slnr+1).value + 1) / 60) ModeMess Hurdy.channel, 66, 127 'motor ON Modemess Hurdy.channel, 7, Slider(slnr).value Hurdy.ctrl(7) = Slider(slnr).value EXIT SUB END IF ' the motorspeed slider sets the minimum motor speed value ' the gesture controlable remainder of the range is than: sprange = 127- Slider(slnr).value motorspeed = Slider(slnr).value + (sprange * (@sr.xyza/ 4096!)) IF motorspeed <> Hurdy.ctrl(7) THEN Modemess Hurdy.channel, 7, motorspeed ' works o.k. Hurdy.ctrl(7) = motorspeed END IF SELECT CASE UDctrl(udnr).value ' vektor selektie CASE 0 v = @sr.xf ' x - 0 - 4095 - snelheid. velo = @sr.xa CASE 1 v = @sr.yf ' y - 0 - 4095 - snelheid. velo = @sr.ya CASE 2 v = @sr.zf ' z - 0 - 4095 - snelheid. velo = @sr.za CASE 3 ' non positional v = MAX(@sr.xf, @sr.yf,@sr.zf) velo = @sr.xyza END SELECT SHIFT RIGHT v, 7 ' 0-32 note = Hurdy.lowtes + v SHIFT RIGHT velo,4 ' 0 - 255 - 8 bits velo = MIN(velo,127) ' ceil to 7 bits ' for hurdy we would do better by using speed for bow pressure and amplitude of ' movement for bowing speed. ' pitch: use density of events in vectors ??? IF velo THEN mPlay Hurdy.channel, note, MAX(velo,1) AddNote2Har Hurdy.Har(1),note, MAX(velo,1) oldnote = note ELSE IF oldnote THEN mPlay Hurdy.channel, oldnote, %False oldnote = %False END IF END IF SHIFT RIGHT velo,2 '0-63 'was 0-31 IF velo THEN Task(%GeroHurdy).freq = SQR((v+1) * velo) / 8 ' max. 4 Hz IF Task(%GeroHurdy).freq < 0.25 THEN Task(%GeroHurdy).freq = 0.25 ELSE 'Task(%GeroHurdy).freq = 20 Task(%GeroHurdy).freq = 4 * ((Slider(slnr+1).value + 1) / 60) END IF END SUB SUB GeroHurdy_UD () ' for callback on vector UpDown. LOCAL n AS BYTE n = UDCtrl(TaskEX(%GeroHurdy).UpdownNumbers(0)).value n = n MOD 4 UDCtrl(TaskEX(%GeroHurdy).UpdownNumbers(0)).value = n SELECT CASE n CASE 0 SetDlgItemText Task(%GeroHurdy).hparam, %GMT_TEXT0_ID + 16, "X" CASE 1 SetDlgItemText Task(%GeroHurdy).hparam, %GMT_TEXT0_ID + 16, "Y" CASE 2 SetDlgItemText Task(%GeroHurdy).hparam, %GMT_TEXT0_ID + 16, "Z" CASE 3 SetDlgItemText Task(%GeroHurdy).hparam, %GMT_TEXT0_ID + 16, "XYZ" END SELECT END SUB SUB Gero_Ake () ' zelfde kode als GeroHarma, GeRoPia, op zijn beurt kopie van Minor in BOM. ' 11.09.2006: performed again with Marian LOCAL faktor AS SINGLE STATIC n0 AS INTEGER STATIC n1 AS INTEGER STATIC n2 AS INTEGER STATIC slnr AS LONG IF Task(%GeroAke).tog = %False THEN DIM TaskParamLabels(2) AS LOCAL ASCIIZ * 8 TaskParamLabels(0) = "sens" TaskParamLabels(1) = "tempo" IF ISFALSE Task(%GeroAke).hParam THEN MakeTaskParameterDialog %GeroAke,2,Slider(),0,UDctrl(),TaskParamlabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%GeroAke).SliderNumbers(0) ' the second slider is slnr + 1 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, 3 SendMessage Slider(slnr+1).h, %TBM_SETPOS,%True, 18 ' tempo Slider(slnr+1).value = 18 Slider(slnr).value = 3 END IF MM_Ake_On '%MM_Wind Task(%GeroAke).tog = %True Task(%GeroAke).channel = Ake.channel Task(%GeroAke).freq = 2.4 'App.tempo / 60! ' slider(slnr+1).value / 25 ' send wind on: ' done with startcptr. MM_Ake_On %MM_Motor OR %MM_Wind END IF DIM AD(0 TO 15) AS LOCAL INTEGER IF @sr.xyze < Slider(slnr).value THEN Task(%GeroAke).freq = DAQparams.samplingrate(0) / 3 ' such that it reacts fast! EXIT SUB END IF AD(7) = @sr.xyzf SHIFT RIGHT AD(7), 9 AD(7) = Ake.lowtes + (12* AD(7)) ' oktaafligging IF AD(7) > 84 THEN AD(7) = 84 DIM ADL(0 TO 15) AS LOCAL INTEGER IF @sr.xe /2 > @sr.noise THEN ADL(8) = @sr.xe / 64 ELSE ADL(8)=%False IF @sr.ye /2 > @sr.noise THEN ADL(9) = @sr.ye / 64 ELSE ADL(9)=%False IF @sr.ze /2 > @sr.noise THEN ADL(10) = @sr.ze / 64 ELSE ADL(10)=%False IF @sr.xyza > @sr.noise THEN ADL(3) = INT(15.268 * LOG(@sr.xyza)) ELSE ADL(3)=%False IF @sr.xf > @sr.noise THEN ADL(4) = INT(15.268 * LOG(@sr.xf)) ELSE ADL(4)=%False IF @sr.yf > @sr.noise THEN ADL(5) = INT(15.268 * LOG(@sr.yf)) ELSE ADL(5)=%False IF @sr.zf > @sr.noise THEN ADL(6) = INT(15.268 * LOG(@sr.zf)) ELSE ADL(6)=%False IF @sr.xyzac <> %False THEN ADL(15) = INT((15.268 * LOG(ABS(@sr.xyzac))) * SGN(@sr.xyzac)) ' to be checked for range !!! ELSE ADL(15)= %False END IF Task(%GeroAke).Har.vel = STRING$(128,0) IF ADL(8) THEN SHIFT RIGHT ADL(4),3 n0 = AD(7) + ADL(4) AddNote2Har Task(%GeroAke).Har,n0 , ADL(8) ELSE DelNote2Har Task(%GeroAke).Har, n0 END IF IF ADL(10) THEN SHIFT RIGHT ADL(6),3 n1 = AD(7) + ADL(6) AddNote2Har Task(%GeroAke).Har,n1 , ADL(10) ELSE DelNote2Har Task(%GeroAke).har, n1 END IF IF ADL(9) THEN SHIFT RIGHT ADL(5),3 n2 = AD(7) + ADL(5) AddNote2Har Task(%GeroAke).Har,n2 , ADL(9) ELSE DelNote2Har Task(%GeroAke).Har, n2 END IF IF (ADL(6) > 4) AND ((ADL(4) AND ADL(5)) = ADL(6)) THEN AddNote2Har Task(%GeroAke).Har, AD(7), ADL(3) \ 4 Ake.Har(1).vel = Task(%GeroAke).Har.vel InstrumPlay Ake EXIT SUB ELSE DelNote2Har Task(%GeroAke).Har, AD(7) END IF IF ADL(5) = ADL(6) THEN AddNote2Har Task(%GeroAke).Har, AD(7)+12, ADL(3)\4 AddNote2Har Task(%GeroAke).Har, AD(7)-12, ADL(3)\4 END IF IF ADL(4) = ADL(5) THEN AddNote2Har Task(%GeroAke).Har, AD(7) + 7, ADL(3) \4 END IF IF ADL(4) = ADL(6) THEN AddNote2Har Task(%GeroAke).Har, AD(7)-7, ADL(3) \ 4 END IF Ake.Har(1).vel = Task(%GeroAke).Har.vel InstrumPlay Ake Task(%GeroAke).freq = (Slider(slnr+1).value / 25!) * ((ABS(ADL(15))+5) / 10!) '(App.tempo * faktor) / 60! END SUB SUB Gero_Krum () ' zelfde kode als GeroAke, GeroHarma, GeRoPia, op zijn beurt kopie van Minor in BOM. ' 11.09.2006: performed with Marian LOCAL faktor AS SINGLE STATIC n0 AS INTEGER STATIC n1 AS INTEGER STATIC n2 AS INTEGER STATIC slnr AS LONG IF Task(%GeroKrum).tog = %False THEN DIM TaskParamLabels(2) AS LOCAL ASCIIZ * 8 TaskParamLabels(0) = "sens" TaskParamLabels(1) = "tempo" IF ISFALSE Task(%GeroKrum).hParam THEN MakeTaskParameterDialog %GeroKrum,2,Slider(),0,UDctrl(),TaskParamlabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%GeroKrum).SliderNumbers(0) ' the second slider is slnr + 1 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, 3 SendMessage Slider(slnr+1).h, %TBM_SETPOS,%True, 18 ' tempo Slider(slnr+1).value = 18 Slider(slnr).value = 3 END IF MM_Krum_On %MM_Wind Task(%GeroKrum).tog = %True Task(%GeroKrum).channel = Krum.channel Task(%GeroKrum).freq = 2.4 'App.tempo / 60! ' slider(slnr+1).value / 25 END IF DIM AD(0 TO 15) AS LOCAL INTEGER IF @sr.xyze < Slider(slnr).value THEN Task(%GeroKrum).freq = DAQparams.samplingrate(0) / 3 ' such that it reacts fast! EXIT SUB END IF AD(7) = @sr.xyzf SHIFT RIGHT AD(7), 9 AD(7) = Krum.lowtes + (12* AD(7)) ' oktaafligging IF AD(7) > 84 THEN AD(7) = 84 DIM ADL(0 TO 15) AS LOCAL INTEGER IF @sr.xe /2 > @sr.noise THEN ADL(8) = @sr.xe / 64 ELSE ADL(8)=%False IF @sr.ye /2 > @sr.noise THEN ADL(9) = @sr.ye / 64 ELSE ADL(9)=%False IF @sr.ze /2 > @sr.noise THEN ADL(10) = @sr.ze / 64 ELSE ADL(10)=%False IF @sr.xyza > @sr.noise THEN ADL(3) = INT(15.268 * LOG(@sr.xyza)) ELSE ADL(3)=%False IF @sr.xf > @sr.noise THEN ADL(4) = INT(15.268 * LOG(@sr.xf)) ELSE ADL(4)=%False IF @sr.yf > @sr.noise THEN ADL(5) = INT(15.268 * LOG(@sr.yf)) ELSE ADL(5)=%False IF @sr.zf > @sr.noise THEN ADL(6) = INT(15.268 * LOG(@sr.zf)) ELSE ADL(6)=%False IF @sr.xyzac <> %False THEN ADL(15) = INT((15.268 * LOG(ABS(@sr.xyzac))) * SGN(@sr.xyzac)) ' to be checked for range !!! ELSE ADL(15)= %False END IF Task(%GeroKrum).Har.vel = STRING$(128,0) IF ADL(8) THEN SHIFT RIGHT ADL(4),3 n0 = AD(7) + ADL(4) AddNote2Har Task(%GeroKrum).Har,n0 , ADL(8) ELSE DelNote2Har Task(%GeroKrum).Har, n0 END IF IF ADL(10) THEN SHIFT RIGHT ADL(6),3 n1 = AD(7) + ADL(6) AddNote2Har Task(%GeroKrum).Har,n1 , ADL(10) ELSE DelNote2Har Task(%GeroKrum).har, n1 END IF IF ADL(9) THEN SHIFT RIGHT ADL(5),3 n2 = AD(7) + ADL(5) AddNote2Har Task(%GeroKrum).Har,n2 , ADL(9) ELSE DelNote2Har Task(%GeroKrum).Har, n2 END IF IF (ADL(6) > 4) AND ((ADL(4) AND ADL(5)) = ADL(6)) THEN AddNote2Har Task(%GeroKrum).Har, AD(7), ADL(3) \ 4 Krum.Har(1).vel = Task(%GeroKrum).Har.vel InstrumPlay Krum EXIT SUB ELSE DelNote2Har Task(%GeroKrum).Har, AD(7) END IF IF ADL(5) = ADL(6) THEN AddNote2Har Task(%GeroKrum).Har, AD(7)+12, ADL(3)\4 AddNote2Har Task(%GeroKrum).Har, AD(7)-12, ADL(3)\4 END IF IF ADL(4) = ADL(5) THEN AddNote2Har Task(%GeroKrum).Har, AD(7) + 7, ADL(3) \4 END IF IF ADL(4) = ADL(6) THEN AddNote2Har Task(%GeroKrum).Har, AD(7)-7, ADL(3) \ 4 END IF Krum.Har(1).vel = Task(%GeroKrum).Har.vel InstrumPlay Krum Task(%GeroKrum).freq = (Slider(slnr+1).value / 25!) * ((ABS(ADL(15))+5) / 10!) '(App.tempo * faktor) / 60! END SUB SUB Gero_Humanola () ' zelfde kode als GeroAke, GeroHarma, GeRoPia, op zijn beurt kopie van Minor in BOM. ' 11.09.2006: performed with Marian LOCAL faktor AS SINGLE STATIC n0 AS INTEGER STATIC n1 AS INTEGER STATIC n2 AS INTEGER STATIC slnr AS LONG IF Task(%GeroHumanola).tog = %False THEN DIM TaskParamLabels(2) AS LOCAL ASCIIZ * 8 TaskParamLabels(0) = "sens" TaskParamLabels(1) = "tempo" IF ISFALSE Task(%GeroHumanola).hParam THEN MakeTaskParameterDialog %GeroHumanola,2,Slider(),0,UDctrl(),TaskParamlabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%GeroHumanola).SliderNumbers(0) ' the second slider is slnr + 1 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, 3 SendMessage Slider(slnr+1).h, %TBM_SETPOS,%True, 18 ' tempo Slider(slnr+1).value = 18 Slider(slnr).value = 3 END IF Task(%GeroHumanola).tog = %True Task(%GeroHumanola).channel = Humanola.channel Task(%GeroHumanola).freq = 2.4 'App.tempo / 60! ' slider(slnr+1).value / 25 MM_Humanola_On %MM_Lights OR %MM_Wind END IF DIM AD(0 TO 15) AS LOCAL INTEGER IF @sr.xyze < Slider(slnr).value THEN Task(%GeroHumanola).freq = DAQparams.samplingrate(0) / 3 ' such that it reacts fast! EXIT SUB END IF AD(7) = @sr.xyzf SHIFT RIGHT AD(7), 9 AD(7) = Humanola.lowtes + (12* AD(7)) ' oktaafligging IF AD(7) > 84 THEN AD(7) = 84 DIM ADL(0 TO 15) AS LOCAL INTEGER IF @sr.xe /2 > @sr.noise THEN ADL(8) = @sr.xe / 64 ELSE ADL(8)=%False IF @sr.ye /2 > @sr.noise THEN ADL(9) = @sr.ye / 64 ELSE ADL(9)=%False IF @sr.ze /2 > @sr.noise THEN ADL(10) = @sr.ze / 64 ELSE ADL(10)=%False IF @sr.xyza > @sr.noise THEN ADL(3) = INT(15.268 * LOG(@sr.xyza)) ELSE ADL(3)=%False IF @sr.xf > @sr.noise THEN ADL(4) = INT(15.268 * LOG(@sr.xf)) ELSE ADL(4)=%False IF @sr.yf > @sr.noise THEN ADL(5) = INT(15.268 * LOG(@sr.yf)) ELSE ADL(5)=%False IF @sr.zf > @sr.noise THEN ADL(6) = INT(15.268 * LOG(@sr.zf)) ELSE ADL(6)=%False IF @sr.xyzac <> %False THEN ADL(15) = INT((15.268 * LOG(ABS(@sr.xyzac))) * SGN(@sr.xyzac)) ' to be checked for range !!! ELSE ADL(15)= %False END IF Task(%GeroHumanola).Har.vel = STRING$(128,0) IF ADL(8) THEN SHIFT RIGHT ADL(4),3 n0 = AD(7) + ADL(4) AddNote2Har Task(%GeroHumanola).Har,n0 , ADL(8) ELSE DelNote2Har Task(%GeroHumanola).Har, n0 END IF IF ADL(10) THEN SHIFT RIGHT ADL(6),3 n1 = AD(7) + ADL(6) AddNote2Har Task(%GeroHumanola).Har,n1 , ADL(10) ELSE DelNote2Har Task(%GeroHumanola).har, n1 END IF IF ADL(9) THEN SHIFT RIGHT ADL(5),3 n2 = AD(7) + ADL(5) AddNote2Har Task(%GeroHumanola).Har,n2 , ADL(9) ELSE DelNote2Har Task(%GeroHumanola).Har, n2 END IF IF (ADL(6) > 4) AND ((ADL(4) AND ADL(5)) = ADL(6)) THEN AddNote2Har Task(%GeroHumanola).Har, AD(7), ADL(3) \ 4 Humanola.Har(1).vel = Task(%GeroHumanola).Har.vel InstrumPlay Humanola EXIT SUB ELSE DelNote2Har Task(%GeroHumanola).Har, AD(7) END IF IF ADL(5) = ADL(6) THEN AddNote2Har Task(%GeroHumanola).Har, AD(7)+12, ADL(3)\4 AddNote2Har Task(%GeroHumanola).Har, AD(7)-12, ADL(3)\4 END IF IF ADL(4) = ADL(5) THEN AddNote2Har Task(%GeroHumanola).Har, AD(7) + 7, ADL(3) \4 END IF IF ADL(4) = ADL(6) THEN AddNote2Har Task(%GeroHumanola).Har, AD(7)-7, ADL(3) \ 4 END IF Humanola.Har(1).vel = Task(%GeroHumanola).Har.vel InstrumPlay Humanola Task(%GeroHumanola).freq = (Slider(slnr+1).value / 25!) * ((ABS(ADL(15))+5) / 10!) '(App.tempo * faktor) / 60! END SUB SUB Gero_Pipe () ' derived from solo in the second book of moves. ' needs ii-channels 3, 7, ' uses piperola solo with expression controls ' written 13.03.2005 STATIC oldnote AS INTEGER STATIC oldvelo AS INTEGER LOCAL note AS INTEGER LOCAL velo AS INTEGER LOCAL il% LOCAL jl% LOCAL m AS ASCIIZ * 45 STATIC slnr AS LONG IF ISFALSE Task(%GeroPiperola).tog THEN DIM TaskParamLabels(2) AS LOCAL ASCIIZ * 8 TaskParamLabels(0) = "sens" TaskParamLabels(1) = "tempo" TaskParamLabels(2) = "wind" ' add: UD for expression controll IF ISFALSE Task(%GeroPiperola).hParam THEN MakeTaskParameterDialog %GeroPiperola,3,Slider(),0,UDctrl(),TaskParamlabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%GeroPiperola).SliderNumbers(0) SendMessage Slider(slnr).h, %TBM_SETPOS,%True, 5 SendMessage Slider(slnr+1).h, %TBM_SETPOS,%True, 72 ' tempo SendMessage Slider(slnr+2).h, %TBM_SETPOS, %True, %MM_Piperola_Motor * 2!/3! Slider(slnr+2).value = %MM_Piperola_Motor * 2!/3! Slider(slnr+1).value = 72 Slider(slnr).value = 5 END IF oldnote = %False oldvelo = %False Task(%GeroPiperola).channel = Piperola.channel Task(%GeroPiperola).tog = %True Task(%GeroPiperola).freq = 7.2 Piperola.ctrl(7) = %MM_Piperola_Motor * 2! / 3! ' new 06.03.2005 MM_Piperola_On %MM_Wind OR %MM_Lights Controller Piperola.channel, 10, 5 ' set sfz mode ON - new 06.03.2005 Piperola.ctrl(10) = 5 END IF ' Solo instrument. Non-positional playing. Task(%GeroPiperola).freq = Slider(slnr+1).value / 10 IF Task(%GeroPiperola).freq < 1 THEN Task(%GeroPiperola).freq = 1 jl% = @sr.xyzf ' 0 - 4095 - snelheid. SHIFT RIGHT jl%, 6 ' 0-64 note = Piperola.lowtes + jl% ' 60 - 124 velo = @sr.xyza SHIFT RIGHT velo,4 ' 0 - 256 - 8 bits IF velo > 127 THEN velo = 127 IF Piperola.ctrl(7) <> Slider(slnr+2).value THEN Piperola.ctrl(7) = Slider(slnr+2).value Controller Piperola.channel, 7, Piperola.ctrl(7) END IF IF velo < (Slider(slnr).value) THEN velo = %False Controller Piperola.channel, 123, %False ' all notes off 'IF oldnote THEN mPlay Piperola.channel,oldnote,%False oldnote = %false oldvelo = %False velo = %False IF piperola.ctrl(118) THEN NoteOff Piperola.channel, 118 ' rood licht piperola.ctrl(118) = %False END IF IF piperola.ctrl(119) THEN NoteOff Piperola.channel, 119 Piperola.ctrl(119) = %False ' wit licht END IF EXIT SUB END IF IF note <> oldnote THEN IF note THEN IF Piperola.ctrl(10) <> 5 THEN Piperola.ctrl(10) = 5 Controller Piperola.channel, 10, 5 END IF IF note <= Piperola.hightes THEN IF oldnote THEN NoteOff Task(%GeroPiperola).channel, oldnote ', %False mPlay Task(%GeroPiperola).channel, note, velo oldnote = note oldvelo = velo ELSE note = 120 + (Note MOD 8) IF ISFALSE Piperola.ctrl(119) THEN mPlay Piperola.channel, 119, 127 Piperola.ctrl(119) = %True END IF mPlay Piperola.channel, note, velo 'oldnote = %False END IF IF ISFALSE piperola.ctrl(118) THEN mPlay Piperola.channel, 118, 64 Piperola.ctrl(118) = 64 END IF END IF ELSE ' hold... IF ISFALSE piperola.ctrl(118) THEN mPlay Piperola.channel, 118, 64 Piperola.ctrl(118) = 64 END IF ' use aftertouch with channelpressure: Controller Piperola.channel, 10, 9 Piperola.ctrl(10) = 9 ' now send channel pressure command: AfterTouch Piperola.channel, velo END IF END SUB SUB Geroxy () ' added 10.04.2007 LOCAL v AS LONG LOCAL velo AS LONG LOCAL noteX AS SINGLE LOCAL noteY AS SINGLE STATIC lightx AS DWORD STATIC lighty AS DWORD STATIC steps AS LONG STATIC direc AS LONG STATIC fire1 AS DWORD STATIC fire2 AS DWORD ' on x-y -transducer IF ISFALSE Task(%Geroxy).tog THEN Task(%Geroxy).tog = %True steps = 0 direc = 1 END IF noteX = Xy.lowtes + (@sr.xf / 70!) ' 7 + [0-->41] noteY = Xy.lowtes + (@sr.yf / 70!) velo = @sr.xa SHIFT RIGHT velo,6 ' 0 - 63 - 6 bits IF velo THEN mPlay Xy.Channel, noteX, MIN(127, 1.2 * velo) IF ISFALSE lightx THEN lightx = %True ' mPlay Xy.Channel, 120, 127 ' mPlay Xy.Channel, 121, 127 ' mPlay Xy.Channel, 122, 127 ' mPlay Xy.Channel, 123, 127 END IF ' rotate: mPlay xy.Channel, 123 + (steps MOD 4) , velo IF direc > 0 THEN INCR steps ELSE DECR steps ELSE IF lightx THEN lightx = %False END IF END IF ' side lights: IF velo > 16 THEN IF ISFALSE fire1 THEN mPlay Xyq.channel, 124, 64 mPlay Xyq.channel, 123, 64 fire1 = 104 END IF ELSE IF fire1 THEN NoteOff Xyq.channel, 124 NoteOff Xyq.channel, 123 fire1 = %False END IF END IF velo = @sr.ya SHIFT RIGHT velo, 6 IF velo THEN mPlay Xyq.Channel, noteY, MIN(127, 1.2 * velo) IF ISFALSE lightY THEN lightY = %TRue mPlay Xyq.channel, 125, 127 END IF mPlay Xy.Channel, 120 + (steps MOD 4), velo IF direc > 0 THEN INCR steps ELSE DECR steps ELSE IF lightY THEN lightY = %False mPlay Xyq.Channel, 125, %False END IF EXIT SUB END IF IF velo > 16 THEN IF ISFALSE fire2 THEN mPlay Xyq.channel,125, 64 fire2 = 125 END IF ELSE IF fire2 THEN NoteOff Xyq.channel, 125 fire2 = %False END IF END IF IF steps > 240 THEN direc = -1 ELSEIF steps < 1 THEN direc = 1 END IF velo = @sr.amp SHIFT RIGHT velo, 7 ' 0-31 IF velo THEN Task(%Geroxy).freq = velo 'SQR(v * velo) / 2 IF Task(%Geroxy).freq < 0.5 THEN Task(%Geroxy).freq = 0.5 ELSE Task(%Geroxy).freq = 20 END IF END SUB SUB GeroSimba () ' added 13.09.2007 LOCAL v AS LONG LOCAL velo AS LONG LOCAL noteX AS SINGLE LOCAL noteY AS SINGLE STATIC lightx AS DWORD STATIC lighty AS DWORD STATIC steps AS LONG STATIC direc AS LONG STATIC fire1 AS DWORD STATIC fire2 AS DWORD ' on z-transducer IF ISFALSE Task(%GeroSimba).tog THEN Task(%GeroSimba).tog = %True steps = 0 direc = 1 END IF '----sofar---- noteX = (@sr.zf / 70!) ' [0-->41] 'noteY = Xy.lowtes + (@sr.yf / 70!) velo = @sr.za SHIFT RIGHT velo,5 ' 0 - 127 - 7 bits IF velo THEN SELECT CASE velo CASE < 20 ' motors IF notex < 20 THEN mPlay Simba.channel, 58, velo ELSE mPlay Simba.channel, 59, velo END IF CASE < 40 ' bell cimbal mPlay Simba.channel, 80, velo CASE < 60 ' hihat IF notex < 20 THEN mPlay Simba.channel, 71, velo ' close hihat ELSE mPlay Simba.channel, 65 + (velo MOD 6), velo END IF CASE < 80 ' back cymbal mPlay simba.channel, 72 + (Notex MOD 4), velo CASE < 100 ' front cymbal mPlay Simba.channel, 60 + (NoteX MOD 4), velo CASE ELSE mPlay Simba.Channel, 77 + (velo MOD 3), velo ' tambourine and castanets END SELECT IF ISFALSE lightx THEN lightx = %True END IF ' rotate: mPlay simba.Channel, 110 + (steps MOD 5) , velo ' lights IF direc > 0 THEN INCR steps ELSE DECR steps ELSE IF lightx THEN lightx = %False END IF END IF IF steps > 240 THEN direc = -1 ELSEIF steps < 1 THEN direc = 1 END IF velo = @sr.amp SHIFT RIGHT velo, 7 ' 0-31 IF velo THEN Task(%Gerosimba).freq = velo 'SQR(v * velo) / 2 IF Task(%Gerosimba).freq < 0.5 THEN Task(%Gerosimba).freq = 0.5 ELSE Task(%Gerosimba).freq = 20 END IF END SUB SUB GeroToypi () ' added 26.08.2008 - derived from GeroPuff coding ' performance: 06.12.2008 LOCAL v AS LONG LOCAL velo AS LONG LOCAL noteX AS SINGLE LOCAL noteY AS SINGLE STATIC lightx AS DWORD STATIC lighty AS DWORD STATIC steps AS LONG STATIC direc AS LONG STATIC fire1 AS DWORD STATIC fire2 AS DWORD ' midi note mapping: 72 - 107 ' on x-y -transducer IF ISFALSE Task(%GeroToypi).tog THEN Task(%GeroToypi).tog = %True steps = 0 direc = 1 END IF noteX = 72 + (@sr.xf / 114!) ' 72 + [0-->36] noteY = 72 + (@sr.yf / 114!) '49,50,51,52 = stepping motor 53,54 =eye lights velo = @sr.xa SHIFT RIGHT velo,7 ' 0-31 - 5 bits ' was :6 ' 0 - 63 - 6 bits IF velo THEN mPlay Toypi.Channel, noteX, velo ' gele lichtjes... mPlay Toypi.Channel, 60 + (steps MOD 8) , 127 IF direc > 0 THEN INCR steps ELSE DECR steps ELSE MM_Toypi_Off %MM_Lights END IF ' blue lights: IF velo > 16 THEN IF ISFALSE fire1 THEN MM_Toypi_On %MM_Blue fire1 = 104 END IF ELSE IF fire1 THEN MM_Toypi_Off %MM_Blue fire1 = %False END IF END IF velo = @sr.ya SHIFT RIGHT velo, 7 '6 IF velo THEN mPlay Toypi.Channel, noteY, velo ' geel: mPlay Toypi.Channel, 60 + (steps MOD 8), 127 IF direc > 0 THEN INCR steps ELSE DECR steps ELSE EXIT SUB END IF IF velo > 16 THEN IF ISFALSE fire2 THEN MM_Toypi_On %MM_White fire2 = 105 END IF ELSE IF fire2 THEN MM_Toypi_Off %MM_White fire2 = %False END IF END IF IF steps > 240 THEN direc = -1 ELSEIF steps < 1 THEN direc = 1 END IF velo = @sr.amp SHIFT RIGHT velo, 7 ' 0-31 IF velo THEN Task(%GeroToypi).freq = velo / 2 'SQR(v * velo) / 2 IF Task(%GeroToypi).freq < 0.5 THEN Task(%GeroToypi).freq = 0.5 ELSE Task(%GeroToypi).freq = 25 END IF END SUB SUB MidiPlayerInteraction (OPT BYVAL freq AS SINGLE) 'we couldn't analyse as much buffers as in offline version here 'as a result, the peek detection is more crude 'most old code is still here but commented out.. also cfr. parsemovemntdata.bas LOCAL i AS LONG LOCAL pseek AS LONG STATIC init AS LONG STATIC buffer() AS INTEGER STATIC hwfreq AS LONG STATIC filefreq AS SINGLE LOCAL smax AS SINGLE LOCAL estfreq AS SINGLE 'estimated freq in one analysis buffer STATIC movementfreq AS SINGLE 'moving average of estfreq LOCAL divpeek AS SINGLE LOCAL b$ IF ISFALSE init THEN DIALOG NEW %HWND_DESKTOP, "file freq MM",,,100, 14 TO hwfreq CONTROL ADD TEXTBOX, hwfreq, 1, "60", 1, 1, 60, 12, %ES_NUMBER CONTROL ADD BUTTON, hwfreq, 2, "update", 62, 1, 36, 12, %BS_FLAT CALL CBFileFreq DIALOG SHOW MODELESS hwfreq filefreq=1 init = %true movementfreq = 1 DIM buffer(512) '?511?? ' starttask %mvrec_metro DIM maxpeekhist(60) AS STATIC SINGLE 'freq ofhighest peek histo END IF CONTROL SET TEXT gh.cockpit, %GMT_TEXT0_ID + 13, STR$(@sr.xyza) + STR$(movementfreq) IF @sr.xyza < 200 THEN IF movementfreq > 0 THEN CALL DWORD Task(App.MidiPlayerTasknr).cptr USING dummyplayer (0, 1) CONTROL SET TEXT gh.cockpit, %GMT_TEXT0_ID + 12, "PAUZE!" movementfreq = -movementfreq END IF CONTROL SET TEXT gh.cockpit, %GMT_TEXT0_ID + 12, "p..." EXIT SUB ELSEIF movementfreq < 0 THEN CONTROL SET TEXT gh.cockpit, %GMT_TEXT0_ID + 12, "CONT!" movementfreq = - movementfreq CALL DWORD Task(App.MidiPlayerTasknr).cptr USING dummyplayer (0, -1) END IF ' IF freq THEN filefreq = freq / 60: DO WHILE filefreq > 2.5: filefreq = filefreq / 2: LOOP ' DIM xac(255) AS LOCAL INTEGER 'AT @sr.pb(13) '' POKE$ VARPTR(buffer(0)), PEEK$(varptr(buffer(256)), 512) '=512 bytes = 256 elements '' POKE$ VARPTR(buffer(256)), PEEK$(@sr.pb(13), 512) ' DIM corval(128) AS LOCAL LONG '' for pseek = 0 to 255 step 64 'was 64, must be even nr; 512/n 'last statement still true here??? ' 'get xac from buffer ' POKE$ VARPTR(xac(0)), PEEK$(@sr.pb(13), 512) ' PEEK$(VARPTR(buffer(pseek)), 512) ' AnalyzeMovementdata xac(), corval() ' i = movement_getmax(corval()) 'returns bins of lowest peek, lowest above average, max ' MAT maxpeekhist() = (.94) * maxpeekhist() ' INCR maxpeekhist(i) '' smax = MAX(smax, maxpeekhist(5 * i)) ''' next '' smax = 1/smax ' ' ShowHistograms slowpeekhist(), avgpeekhist(), maxpeekhist() ' DIM peeks(UBOUND(maxpeekhist)) AS LOCAL SINGLE: DIM peekvals(UBOUND(maxpeekhist)) AS LOCAL SINGLE ' FOR i = 0 TO UBOUND(maxpeekhist) ' IF maxpeekhist(i) > .2 THEN peeks(i) = i/80: peekvals(i) = maxpeekhist(i) ' NEXT ' ARRAY SORT peekvals(), TAGARRAY peeks(), DESCEND ' i = 0 ' do while estfreq < .2 ' estfreq = peeks(i) '= estimated freq in this buffer - should be integrated over time... ' incr i ' if i > 10 then ' control set text gh.cockpit, %GMT_MSG2, "no freq!!!" ' exit sub ' end if ' loop '' estfreq = i ' IF estfreq < .01 THEN EXIT SUB ' IF corval(0) < .1 THEN EXIT SUB ' 'if other peeks are close, take average, taking in account strength of peek ' IF peekvals(0) / 2 < peekvals(1) THEN ' divpeek = peekvals(0) ' estfreq = estfreq * peekvals(0) ' FOR i = 1 TO UBOUND(peekvals) ' IF peekvals(0) / 2 > peekvals(i) THEN EXIT FOR ' estfreq = estfreq + peeks(i) * peekvals(i) ' divpeek = divpeek + peekvals(i) ' NEXT ' estfreq = estfreq / divpeek ' END IF ' CONTROL SET TEXT gh.cockpit, %GMT_MSG2, STR$(estfreq) ' DO WHILE estfreq < .24: estfreq = estfreq * 2: LOOP ' DO WHILE estfreq > 3: estfreq = estfreq / 2: LOOP ' IF ISFALSE movementfreq THEN ' movementfreq = estfreq ' ' ELSEIF estfreq < (movementfreq /2) THEN 'disabled octaafsprong protectie.. - should be handled by integration... ' ' movementfreq = .9 * movementfreq + .2 * estfreq 'arbitrary integration values.. to be tested for best results ' ' ELSEIF estfreq > movementfreq * 2 THEN ' ' movementfreq = .9 * movementfreq + .05 * estfreq ' ELSE ' movementfreq = .7 * movementfreq + .3 * estfreq ' END IF ' 'maybe we will need to ignore current estfreq if it's peekval() gets too low ' b$ = "current freq:" + STR$(estfreq)+ " - average:" + STR$(movementfreq) ' task(%mvrec_metro).freq = movementfreq movementfreq = .9 * movementfreq + .1 * MIN(2, MAX(.5, @sr.xyzf/1100)) CONTROL SET TEXT gh.cockpit, %GMT_MSG1, STR$(@sr.xyzf) + STR$(movementfreq) Task(App.MidiPlayerTasknr).rit.minduur = movementfreq '@sr.xyzf '1 +(sqr(movementfreq-.3))/filefreq ' CONTROL SET TEXT gh.cockpit, %GMT_MSG1, b$ END SUB SUB dummyplayer(OPT BYVAL rst AS LONG, OPT BYVAL pause AS LONG) 'we only need declaration for calldword using.. END SUB CALLBACK FUNCTION CBFileFreq LOCAL b$ IF CBCTLMSG <> %BN_CLICKED THEN EXIT FUNCTION CONTROL GET TEXT CBHNDL, 1 TO b$ MidiPlayerInteraction VAL(b$) END FUNCTION FUNCTION AnalyzeMovementData(xac() AS INTEGER, corval() AS LONG) AS LONG 'copy from Analyzedata function in parsemovementdata.bas REGISTER i AS LONG REGISTER k AS LONG LOCAL v AS LONG LOCAL j AS LONG LOCAL fase AS LONG 'try extracting tempo from correlation. 'sr = 64 samples/second 'correlation with a square wave gave the best results.. previous attempts: see parsemovemntdata.bas REDIM corval(128) FOR j = 128 TO 6 STEP -1 'drop lowest.. nt significant... (?) fase = 0 DO v = 0 FOR i = fase TO 256 - 4 STEP 512/j '256 & 512 work well!! 128 is not enough (samplingrate 64) 'square - THIS WORKS WELL!! FOR k = 0 TO (512/j)/2 v = v + xac(i + k) v = v - xac(i + 2 * k) NEXT NEXT v = v / j IF v > corval(j) THEN corval(j) = v INCR fase LOOP UNTIL fase > j NEXT FUNCTION = VARPTR(corval(0)) END FUNCTION FUNCTION movement_getmax(BYREF corval() AS LONG) AS LONG 'copied form parsemovementdata.bas (function summary) - to be reduced - we dont need the text buffer here.. 'creates text summary, if rawflag set only str$ of bin of (lowest freq peek), (lowest freq peek above average), (max peek freq) 'corval ubound must be 128 LOCAL i AS LONG DIM tag(128) AS LONG corval(0)=0: corval(1) = 0 FOR i = 0 TO 128: tag(i) = i: NEXT ARRAY SORT corval(), TAGARRAY tag(), DESCEND FUNCTION = tag(0) END FUNCTION SUB Movement_record(OPT BYVAL flag AS LONG) 'flag = 1: start recording; 2 = stop recording; 0 keep current state ' " = 3: comments to file; 4 = new tempo 'file format: chr$(0, 0) = escape - aligned on word bounds!! - followed by 5 byte string: ' esc + "DATA:" + chr$(13, 10) = beginning of data section ' data section = dump of sonartypes (first el = ptr, never 0; hence 00 as escape) ' esc + "COMM:" + string$ + chr$(13, 10) (string$ = actual comment - read until carriage return) ' esc + "FREQ:" + frequency AS LONG (= freq of repetitive movement) 'note: datasection can be interrupted after each dumped type ' double dataheaders may occur ' we presume that samplingrate = 64 STATIC f AS LONG STATIC THIS AS LONG STATIC hw AS LONG STATIC recordingflag AS LONG LOCAL b$ LOCAL freq AS SINGLE ' local xac() as integer IF ISFALSE THIS THEN THIS = %true 'open file f = FREEFILE OPEN "movementdata_"+DATE$+".dat" FOR BINARY ACCESS WRITE LOCK WRITE AS f 'create user interaxion window DIALOG NEW 0, "Movement recording control", , ,200, 45 TO hw CONTROL ADD TEXTBOX, hw, 1, "your comments here", 1,1,150, 12 CONTROL ADD BUTTON, hw, 2, "write", 152, 1, 46, 12 CONTROL ADD CHECKBOX, hw, 10, "record", 1,30, 198, 12, %BS_PUSHLIKE CONTROL ADD TEXTBOX, hw, 20, "?", 1, 15, 98, 12 CONTROL ADD BUTTON, hw, 21, "Update tempo (Hz)", 100, 15, 98, 12 DIALOG SHOW MODELESS hw CALL CBMovRec END IF SELECT CASE flag CASE 0 IF recordingflag = 1 THEN DIM xac(255) AS LOCAL INTEGER AT @sr.pb(13) PUT f,, xac() END IF CASE 1: recordingflag = 1: PUT$ f, CHR$(0,0) + "DATA:" CASE 2: recordingflag = 0 CASE 3 CONTROL GET TEXT hw, 1 TO b$ IF LEN(b$) MOD 2 THEN b$ = b$ + " " MSGBOX "put: " + b$ PUT$ f, CHR$(0,0) + "COMM:" + b$ + CHR$(13, 10) + CHR$(0, 0) + "DATA:" CASE 4 ' MSGBOX "we should have a rhythm gen task that we ctrl here.." CONTROL GET TEXT hw, 20 TO b$: freq = VAL(b$): freq = MAX(.1, MIN(freq, 24)) CONTROL SET TEXT hw, 20, STR$(freq) PUT$ f, CHR$(0,0) + "FREQ:" PUT f,, freq PUT$ f, CHR$(0,0) + "DATA:" task(%mvrec_metro).freq = freq StartTask %mvrec_metro END SELECT END SUB SUB moverec_metro mPlay %troms_channel, 45, 64 END SUB SUB WriteMovementdata () 'how can we sinc this with the data acquisition? STATIC init AS DWORD STATIC f AS DWORD LOCAL filenam$ IF ISFALSE init THEN init = 1 f = FREEFILE filenam$ = "mov_" + PARSE$(DATE$, "-", 3) + PARSE$(DATE$, "-", 1) + PARSE$(DATE$, "-", 2) + REMOVE$(TIME$, ANY ":") + ".dat" 'mov_yyyymmddhhmmss.dat OPEN filenam$ FOR OUTPUT ACCESS WRITE LOCK WRITE AS f PRINT# f, "xa, ya, za, xf, yf, zf" END IF WRITE# f, @sr.xa,@sr.ya,@sr.za,@sr.xf,@sr.yf,@sr.zf END SUB CALLBACK FUNCTION CBMovRec () LOCAL i AS LONG SELECT CASE CBMSG CASE %WM_COMMAND SELECT CASE CBCTLMSG CASE %BN_CLICKED SELECT CASE CBCTL CASE 2: Movement_Record 3 'write comment CASE 10 'toggle recording movement data CONTROL GET CHECK CBHNDL, CBCTL TO i Movement_Record 2 - i CASE 21: Movement_Record 4 'update tempo for metronome task END SELECT END SELECT END SELECT END FUNCTION SUB GeroScore () ' this version is 'Flash' composed for 06.12.2008 , 3'12" ' second performace gwr, 13.05.2009 STATIC t AS DWORD STATIC starttime AS DWORD STATIC cnt AS DWORD LOCAL i AS INTEGER IF ISFALSE Task(%Geroscore).tog THEN starttime = TimeGetTime ' in ms cnt = 0 t = 0 IF ISFALSE Task(%Sonar_VU_Task).tog THEN starttask %Sonar_VU_Task IF ISFALSE Task(%Sonar_Display_Task).tog THEN starttask %Sonar_Display_Task Task(%Geroscore).freq = 1.0 ';3 task(%Geroscore).tog = %True EXIT SUB END IF 't = TimeGetTime - starttime ' playlist with gestrobo tasks: - this should become the score for 06.12.2008 - 3'12" ' to be implemented: display on So or Heli. SELECT CASE cnt ' t MOD 1000 ' we count in seconds CASE 1 IF ISFALSE Task(%Gerotoypi).tog THEN starttask %GeroToypi CASE 14 IF ISFALSE Task(%GeroVibi).tog THEN starttask %GeroVibi CASE 27 'IF ISFALSE Task(%GeroKlung).tog THEN starttask %GeroKlung IF ISFALSE Task(%GeroLlor).tog THEN starttask %GeroLlor CASE 40 IF ISFALSE Task(%GeroCasta).tog THEN starttask %GeroCasta CASE 42 IF Task(%GeroToypi).tog THEN stoptask %GeroToypi CASE 53 IF ISFALSE Task(%GeroSimba).tog THEN starttask %GeroSimba CASE 66 IF ISFALSE Task(%GeroThunder).tog THEN starttask %GeroThunder CASE 67 IF Task(%GeroCasta).tog THEN stoptask %Gerocasta CASE 72 IF Task(%GeroKlung).tog THEN stoptask %Geroklung IF Task(%GeroLlor).tog THEN stoptask %GeroLlor CASE 75 IF Task(%Gerosimba).tog THEN stoptask %Gerosimba CASE 79 IF ISFALSE Task(%GeroPsch).tog THEN starttask %GeroPsch CASE 80 IF Task(%GeroVibi).tog THEN stoptask %GeroVibi CASE 88 IF task(%Gerothunder).tog THEN stoptask %Gerothunder CASE 92 IF ISFALSE Task(%GeroSpringer).tog THEN starttask %GeroSpringer CASE 105 IF ISFALSE Task(%GeroTroms).tog THEN starttask %GeroTroms CASE 118 IF ISFALSE Task(%GeroPuff).tog THEN starttask %GeroPuff CASE 120 IF Task(%Gerospringer).tog THEN stoptask %Gerospringer CASE 123 IF Task(%Gerotroms).tog THEN stoptask %GeroTroms CASE 131 IF ISFALSE Task(%GeroXy).tog THEN starttask %GeroXy CASE 144 IF ISFALSE Task(%GeroVacca).tog THEN starttask %GeroVacca CASE 146 IF Task(%GeroXy).tog THEN stoptask %Geroxy CASE 157 IF ISFALSE Task(%GeroBelly).tog THEN starttask %GeroBelly CASE 160 IF ISFALSE Task(%Gero_Qt).tog THEN starttask %Gero_Qt CASE 166 IF Task(%GeroBelly).tog THEN stoptask %Gerobelly CASE 168 IF Task(%GeroVacca).tog THEN stoptask %GeroVacca CASE 180 IF Task(%Gero_Qt).tog THEN stoptask %Gero_Qt MM_Qt_Off CASE 182 IF ISFALSE Task(%GeroPsch).tog THEN starttask %GeroPsch CASE 185 MM_AllLightsOn %MM_Blue CASE 190 ' slotakkoord, punt funktie mPlay Piano.channel, 24, 100 mPlay Piano.channel, 37, 96 mPlay Piano.channel, 50, 85 mPlay Piano.channel, 63, 76 mPlay Piano.channel, 76, 68 mPlay Piano.channel, 89, 60 mPlay Piano.channel, 102, 54 CASE 191 FOR i = %GeroAke TO %GeroXy IF Task(i).tog THEN stoptask i NEXT i MM_AllOff CASE >= 192 stoptask %GeroScore END SELECT INCR cnt END SUB '[eof]