' **************************************** ' * Namuda Study #41 * ' * "White" * ' * december 2013 * ' * written for Emilie De Vlam * ' **************************************** ' 30.11.2013: first concepts written out ' 12 taken, elk 1 noot, alle noten verschillend mod 12 ' idee: Wit is een menging van alle kleuren. Hier hebben we ten allen tijde alle chromatische noten aanwezig. ' oktaafliggingen en noten wisselen doorlopend. ' gesture properties used: fluency, speedup, slowdown ' 03.12.2013: Start practical coding. ' 06.12.2013: Debug by KL ' 07.12.2013: Further coding by gwr. TYPE White_Type noot(11) AS INTEGER ' noot mod 12, if %True, the note is assigned, if %False, it's free Asa_noot AS INTEGER Korn_Noot AS INTEGER Ob_Noot AS INTEGER Autosax_Noot AS INTEGER Bono_noot AS INTEGER Fa_noot AS INTEGER Klar_noot AS INTEGER Heli_Noot AS INTEGER So_Noot AS INTEGER Horny_noot AS INTEGER Bourdonola_noot AS INTEGER Qt_Noot AS INTEGER END TYPE GLOBAL White AS White_Type %White_1 = 32 %White_2 = 33 %White_3 = 34 %White_4 = 35 %white_spiro = 37 %white_xy = 38 %white_piano = 39 %white_harmo = 41 %white_thunder = 43 DECLARE FUNCTION Init_White () AS INTEGER DECLARE FUNCTION Get_FreeNote_White () AS INTEGER DECLARE SUB White_1 () ' aSA, oB, kORN DECLARE SUB White_2 () ' Autosax, Bono, Fa DECLARE SUB White_3 () ' So, Bourdonola, Qt DECLARE SUB White_4 () ' Heli, Horny, Klar ' fill in task, active as soon as there is a free note in White.noot() : DECLARE SUB White_Fill () ' piano or spiro FUNCTION Init_White () AS INTEGER IF ISFALSE Task(%Gesture_Analyser).tog THEN starttask %Gesture_Analyser ClearTasks Task(%White_1).naam = "Wh-1" Task(%White_1).cptr = CODEPTR(White_1) Task(%White_1).freq = 40 '120 was too fast Task(%WHite_1).flags = %False TaskEX(%White_1).stopCptr = CODEPTR(White_1_Stop) Task(%White_2).naam = "Wh-2" Task(%White_2).cptr = CODEPTR(White_2) Task(%White_2).freq = 123 Task(%WHite_2).flags = %False TaskEX(%White_2).stopCptr = CODEPTR(White_2_Stop) Task(%White_3).naam = "Wh-3" Task(%White_3).cptr = CODEPTR(White_3) Task(%White_3).freq = 122 Task(%WHite_3).flags = %False TaskEX(%White_3).stopCptr = CODEPTR(White_3_Stop) Task(%White_4).naam = "Wh-4" Task(%White_4).cptr = CODEPTR(White_4) Task(%White_4).freq = 121 Task(%WHite_4).flags = %False TaskEX(%White_4).stopCptr = CODEPTR(White_4_Stop) Task(%white_spiro).naam = "Spiro" Task(%white_spiro).freq = 20 Task(%white_spiro).cptr = CODEPTR(White_Spiro) TaskEx(%white_spiro).stopcptr = CODEPTR(MM_Spiro_Off) Task(%white_xy).naam = "xy" Task(%white_xy).freq = 21 Task(%white_xy).cptr = CODEPTR(White_xy) TaskEx(%white_xy).stopcptr = CODEPTR(MM_xy_Off) Task(%white_piano).naam = "piano" Task(%white_piano).freq = 22 Task(%white_piano).cptr = CODEPTR(White_piano) TaskEx(%white_piano).stopcptr = CODEPTR(MM_piano_Off) Task(%white_harmo).naam = "harmo" Task(%white_harmo).freq = 22 Task(%white_harmo).cptr = CODEPTR(White_harmo) TaskEx(%white_harmo).stopcptr = CODEPTR(MM_harmo_Off) Task(%white_thunder).naam = "thunder" Task(%white_thunder).freq = 4 Task(%white_thunder).cptr = CODEPTR(White_thunder) TaskEx(%white_thunder).stopcptr = CODEPTR(MM_Thunderwood_Off) FUNCTION = %True END FUNCTION SUB White_1 () ' notes 1,2,3 on Ob, Korn, Asa STATIC lites AS DWORD LOCAL n AS DWORD STATIC sens AS SINGLE STATIC slnr AS DWORD IF ISFALSE Task(%White_1).tog THEN sens = 0.625 '80 / 128 MM_Ob_On MM_Korn_On MM_Asa_On controller Korn.channel, 17, 127 IF ISFALSE Task(%white_1).hParam THEN DIM TaskParamLabels(0 TO 1) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "sens" ' spectral mapping. was "speed" ' taskfreq MakeTaskParameterDialog %white_1,1,Slider(),0,UDctrl(),TaskParamLabels() ' 2 sliders! END IF IF ISFALSE slnr THEN slnr = TaskEX(%white_1).SliderNumbers(0) Slider(slnr).value = sens * 80 ' was 36 in de versie met Emilie. ' met Dominika lopen we hiermee van hoog naar laag. SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value END IF Task(%White_1).tog = %True END IF sens = Slider(slnr).value / 80 CONTROL SET TEXT gh.cockpit, %GMT_MSG1, STR$(sens) ' on fluency, do something... IF (gesture.flue(0) > sens) OR (gesture.flue(2) > sens) THEN ' derived from the percentual standard deviation (inverted) ' hoe hoger gesture.flue(0) hoe sterker de eigenschap fluency IF (gesture.flue_dur(0) MOD 8) = 1 THEN '25.04 n = Get_FreeNote_White n += ((SQR(gesture.flue_val(0)) * 48)\12) * 12 ' oktaafligging 'xof added sqr as we mostly stayed in owest octave n += 60 DO WHILE n >= Ob.HighTes: n = n - 12: LOOP IF n <> White.Ob_noot THEN 'mod 12 was missing! xof 06/12/2013 IF White.Ob_noot THEN NoteOff Ob.channel, White.Ob_noot White.noot(White.Ob_noot MOD 12) = %False ' geef noot weer vrij Bend Ob.channel, %False, 64 RESET White.Ob_noot END IF White.Ob_Noot = n mPlay Ob.channel,White.Ob_Noot, MIN(gesture.flue(0) * 64,127) END IF ELSE IF gesture.flue_dur(0) THEN 'apply pitchbend Bend Ob.channel, %False, MIN(@pDoppler.xf*4, 127 ) END IF END IF ELSE IF White.Ob_Noot THEN 'reset pitchbend: Bend Ob.channel, %False, 64 Noteoff Ob.channel, White.Ob_noot 'onderstaande twee lijnen stonden in omgekeerde volgrode, waardoor d enoot niet vrijgegeven werd! xof 06/12/2013 RESET White.noot(White.Ob_Noot MOD 12) RESET White.Ob_Noot END IF END IF 'second voice on : IF (gesture.flue(1) > sens) OR (gesture.flue(2) > sens) THEN ' derived from the percentual standard deviation (inverted) ' hoe hoger gesture.flue(0) hoe sterker de eigenschap fluency IF (gesture.flue_dur(1) MOD 8) = 1 THEN n = Get_FreeNote_White n += ((SQR(gesture.flue_val(1)) * 48)\12) * 12 ' oktaafligging n += 60 DO WHILE n > Korn.HighTes: n = n - 12: LOOP IF n <> White.Korn_Noot THEN IF White.Korn_noot THEN NoteOff Korn.channel, White.Korn_noot RESET White.noot(White.Korn_noot MOD 12) Bend Korn.channel, %False, 64 RESET White.Korn_noot END IF White.Korn_noot = n mPlay Korn.channel,White.Korn_noot, MIN(40 + gesture.flue(1) * 64,127) 'xof added 40, as korn stayed very quiet most of the time END IF ELSE IF gesture.flue_dur(1) THEN 'apply pitchbend Bend Korn.channel, %False, MIN(@pDoppler.yf*4, 127) END IF END IF ELSE IF White.Korn_noot THEN 'reset pitchbend: Bend Korn.channel, %False, 64 Noteoff Korn.channel, White.Korn_noot RESET White.noot(White.Korn_noot MOD 12) RESET White.Korn_noot END IF END IF 'add a third voice on Asa IF gesture.flue(2) > sens THEN ' derived from the percentual standard deviation (inverted) ' hoe hoger gesture.flue(0) hoe sterker de eigenschap fluency IF (gesture.flue_dur(2) MOD 8) = 1 THEN '25.04 n = Get_FreeNote_White n += ((SQR(gesture.flue_val(2)) * 48)\12) * 12 ' oktaafligging n += 48 DO WHILE n > Asa.HighTes: n = n - 12: LOOP IF n <> White.Asa_noot THEN IF White.Asa_noot THEN NoteOff Asa.channel, White.Asa_noot Bend Asa.channel, %False, 64 RESET White.noot(White.Asa_noot MOD 12) RESET White.Asa_noot END IF White.Asa_noot = n logfile "asa play" + STR$(White.Asa_noot) mPlay Asa.channel,White.Asa_noot, MIN(30 + gesture.flue(2) * 64,127) END IF ELSE IF gesture.flue_dur(2) THEN 'apply pitchbend Bend Asa.channel, %False, MIN(@pDoppler.zf *4, 127) 'gesture.flue_val(1) * 127 '64 + gesture.flue_val(3) * 63 END IF END IF ELSE IF White.Asa_noot THEN 'reset pitchbend: Bend Asa.channel, %False, 64 Noteoff Asa.channel, White.Asa_noot RESET White.noot(White.Asa_noot MOD 12) RESET White.Asa_noot END IF END IF END SUB SUB White_1_Stop () ' should also clear the notes that might be playing in the task: IF White.Asa_noot THEN RESET White.noot(White.Asa_Noot MOD 12) IF White.Korn_noot THEN RESET White.noot(White.Korn_Noot MOD 12) IF White.Ob_noot THEN RESET White.noot(White.Ob_Noot MOD 12) MM_Asa_Off MM_Ob_Off MM_Korn_Off END SUB SUB White_2 () ' autosax, bono, Fa ' on speedup STATIC xtrig, ytrig, ztrig AS LONG STATIC sens AS SINGLE STATIC slnr AS DWORD LOCAL n AS BYTE' INTEGER 'could the bug have to do with n getting higher then 127? IF ISFALSE Task(%White_2).tog THEN sens = 18 'in Hz units MM_Bono_On MM_Fa_On MM_Autosax_On 'init volumes '-> vraagje: is het de bedoeling dat white_1 en white_2 samen spelen? zo ja, dan mogen onderstaande waarden nog een stuk lager.. Controller Bono.channel, 7, 40 Controller Bono.channel, 17, 30 Controller Fa.channel, 17, 40 Controller Fa.channel, 7, 40 Controller Autosax.channel, 7, 40 Task(%White_2).tog = %True IF ISFALSE Task(%white_2).hParam THEN DIM TaskParamLabels(0 TO 1) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "sens" ' spectral mapping. was "speed" ' taskfreq MakeTaskParameterDialog %white_2,1,Slider(),0,UDctrl(),TaskParamLabels() ' 2 sliders! END IF IF ISFALSE slnr THEN slnr = TaskEX(%white_2).SliderNumbers(0) Slider(slnr).value = sens * 2 ' was 36 in de versie met Emilie. ' met Dominika lopen we hiermee van hoog naar laag. SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value END IF END IF sens = Slider(slnr).value / 2 CONTROL SET TEXT gh.cockpit, %GMT_MSG2, STR$(sens) ' on accelerating body speed ' X-vektor: ' logfile str$(xtrig) IF gesture.speedup(0) > gesture.slowdown(0) + sens THEN ' logfile "speedup" IF ISFALSE xtrig THEN ' bono n = Get_FreeNote_White n += ((gesture.speedup(0) * 1)\12) * 12 ' oktaafligging n += 36 'onderstaande beveiling is nodig! anders krijgen we soms noten > 127.. DO WHILE n > bono.HighTes: n = n - 12: LOOP logfile "bono play" + STR$(n) White.bono_noot = n mPlay Bono.channel,n, MIN(gesture.speedup_val(0) * 2, 127) xtrig = %True END IF ELSE ' logfile "no speedup" RESET xtrig IF White.bono_noot THEN ' IF ISFALSE gesture.speedup_dur(0) THEN mPlay Bono.channel, White.bono_noot, %False logfile "bono stop" + STR$(White.bono_noot) ' END IF logfile "bono reset" + STR$(White.bono_noot MOD 12) RESET White.noot(White.bono_noot MOD 12) RESET White.bono_noot END IF END IF ' IF gesture.speedup(1) > sens THEN IF gesture.speedup(1) > gesture.slowdown(1) + sens THEN IF ISFALSE ytrig THEN n= Get_FreeNote_White ' hier zat de bug! \12 ipv /12. anders spelen en resetten we een andere noot dan geregistreerd werd in white.noot.. 'xof 06/12/2013 n += ((gesture.speedup(1) * 1)\12) * 12 n += 36 ' check! DO WHILE n > autosax.HighTes: n = n - 12: LOOP White.autosax_noot = n logfile " sax play" + STR$(n) mPlay Autosax.channel,n , MIN(gesture.speedup_val(1) * 1, 127) '1 was 2 ytrig = %true END IF ELSE IF White.autosax_noot THEN ' IF ISFALSE gesture.speedup_dur(1) THEN mPlay Autosax.channel, White.autosax_noot, %False logfile "sax stop" + STR$(n) ' END IF logfile "sax reset" + STR$(White.autosax_noot MOD 12) RESET White.noot(White.autosax_noot MOD 12) RESET White.autosax_noot END IF RESET ytrig END IF IF gesture.speedup(2) > gesture.slowdown(2) + sens THEN IF ISFALSE ztrig THEN n = Get_FreeNote_White n += ((gesture.speedup(2) * 1)\12) * 12 n += 36 White.Fa_noot = n DO WHILE n > Fa.HighTes: n = n - 12: LOOP logfile "fa play" + STR$(n) mPlay Fa.channel, White.Fa_noot, MIN(gesture.speedup_val(2) * 1, 127) ' 1 was 3 -> fa was louder then any other instrument all the time! ztrig = %True END IF ELSE IF White.Fa_noot THEN ' IF ISFALSE gesture.speedup_dur(2) THEN mPlay Fa.channel, White.Fa_noot, %False logfile "fa stop" + STR$(White.Fa_noot) ' END IF logfile "fa reset " + STR$(White.fa_noot MOD 12) RESET White.noot(White.fa_noot MOD 12) RESET White.fa_noot END IF RESET ztrig END IF 'overgenomen uit de originele namuda studie: 'IF Gesture.speedup(3) > (sens * 10) THEN 'was * 6 ' IF gesture.speedup(3) > (gesture.slowdown(3) + (sens * 4)) THEN ' mPlay Llor.channel, MIN(Llor.lowtes + gesture.speedup(3) - (sens*10),Llor.Hightes), MIN(@pDoppler.zf , 127) 'experiment ' END IF 'END IF END SUB SUB White_2_Stop () IF White.Autosax_noot THEN RESET White.noot(White.Autosax_Noot MOD 12) IF White.Bono_noot THEN RESET White.noot(White.Bono_Noot MOD 12) IF White.Fa_noot THEN RESET White.noot(White.Fa_Noot MOD 12) MM_Autosax_Off MM_Bono_Off MM_Fa_Off END SUB SUB White_3 () ' rob 6 ' mapped op slowdown gestures STATIC xtrig, ytrig, ztrig AS LONG STATIC lites AS WORD STATIC sens AS SINGLE STATIC slnr AS DWORD LOCAL n AS INTEGER IF ISFALSE Task(%White_3).tog THEN sens = 12 MM_So_On MM_Bourdonola_On %MM_Wind OR %MM_Motor MM_Qt_On %MM_Wind OR %MM_Motor IF ISFALSE Task(%white_3).hParam THEN DIM TaskParamLabels(0 TO 1) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "sens" ' spectral mapping. was "speed" ' taskfreq MakeTaskParameterDialog %white_3,1,Slider(),0,UDctrl(),TaskParamLabels() ' 2 sliders! END IF IF ISFALSE slnr THEN slnr = TaskEX(%white_3).SliderNumbers(0) Slider(slnr).value = sens * 3 ' was 36 in de versie met Emilie. ' met Dominika lopen we hiermee van hoog naar laag. SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value END IF Task(%White_3).tog = %True END IF sens = Slider(slnr).value / 3 CONTROL SET TEXT gh.cockpit, %GMT_Title, STR$(Sens) IF Gesture.slowdown(0) > sens THEN ' frequency is unipolar data! - under algo1, can go up to 230 IF ISFALSE xtrig THEN ' so n = Get_FreeNote_White n += ((gesture.slowdown(0) * 1)\12) * 12 ' oktaafligging n += 12 'was 24, which made most pitches go between 30 and 48! 'onderstaande beveiling is nodig! anders krijgen we soms noten > 127.. DO WHILE n > So.HighTes: n = n - 12: LOOP logfile "So play" + STR$(n) White.So_noot = n mPlay So.channel,n, MIN(gesture.slowdown_val(0) * 1.4, 127) '1.4 was 1.7 was 2 xtrig = %True END IF ELSE RESET xtrig IF White.So_noot THEN IF ISFALSE gesture.slowdown_dur(0) THEN mPlay So.channel, White.So_noot, %False logfile "So stop" + STR$(White.So_noot) END IF logfile "So reset" + STR$(White.So_noot MOD 12) RESET White.noot(White.So_noot MOD 12) RESET White.So_noot END IF END IF IF Gesture.slowdown(1) > sens THEN IF ISFALSE ytrig THEN ' Bourdonola n = Get_FreeNote_White n += ((gesture.slowdown(1) * 1)\12) * 12 ' oktaafligging n += 36 'onderstaande beveiling is nodig! anders krijgen we soms noten > 127.. DO WHILE n > Bourdonola.HighTes: n = n - 12: LOOP logfile "Bourdonola play" + STR$(n) White.Bourdonola_noot = n mPlay Bourdonola.channel,n, MIN(gesture.slowdown_val(1) * 2, 127) ytrig = %true END IF ELSE RESET ytrig IF White.Bourdonola_noot THEN ' IF ISFALSE gesture.slowdown_dur(1) THEN '-> this caused a big cluster! mPlay Bourdonola.channel, White.Bourdonola_noot, %False logfile "Bourdonola stop" + STR$(White.Bourdonola_noot) ' END IF logfile "Bourdonola reset" + STR$(White.Bourdonola_noot MOD 12) RESET White.noot(White.Bourdonola_noot MOD 12) RESET White.Bourdonola_noot END IF END IF IF Gesture.slowdown(2) > sens THEN ' Qt IF ISFALSE ztrig THEN ' avoiding multiple triggers n = Get_FreeNote_White n += ((gesture.slowdown(2) * 1)\12) * 12 ' oktaafligging n += 36 'onderstaande beveiling is nodig! anders krijgen we soms noten > 127.. DO WHILE n > Qt.HighTes: n = n - 12: LOOP logfile "Qt play" + STR$(n) White.Qt_noot = n mPlay Qt.channel,n, MIN(gesture.slowdown_val(2) * 2, 127) 'znoot = MIN(Toypi.lowtes - sens + 2+(gesture.slowdown_val(2)/2),Toypi.hightes) 'mPlay Toypi.channel, znoot, (@pDoppler.za * 127) ztrig = %True END IF ELSE RESET ztrig IF White.Qt_noot THEN ' IF ISFALSE gesture.slowdown_dur(2) THEN mPlay Qt.channel, White.Qt_noot, %False logfile "Qt stop" + STR$(White.Qt_noot) ' END IF logfile "Qt reset" + STR$(White.Qt_noot MOD 12) RESET White.noot(White.Qt_noot MOD 12) RESET White.Qt_noot END IF END IF ' IF (gesture.slowdown(3) > sens) AND (gesture.slowdown(3) > gesture.speedup(3)) THEN ' IF ISFALSE lites THEN ' MM_Spiro_On %MM_Lights ' MM_Toypi_On %MM_Lights ' lites = %True ' END IF ' ELSE ' IF lites THEN ' MM_Spiro_Off %MM_Lights ' MM_Toypi_Off %MM_Lights ' RESET lites ' END IF ' END IF END SUB SUB White_3_Stop () IF White.Qt_noot THEN RESET White.noot(White.Qt_Noot MOD 12) IF White.Bourdonola_noot THEN RESET White.noot(White.Bourdonola_Noot MOD 12) IF White.So_noot THEN RESET White.noot(White.So_Noot MOD 12) MM_So_Off MM_Qt_Off MM_Bourdonola_Off END SUB SUB White_4 () ' mapped on exploding (grow) gestures ' Horny- Heli- Klar STATIC xtrig, ytrig, ztrig, lites AS LONG 'STATIC od AS SINGLE 'LOCAL d AS SINGLE LOCAL n AS INTEGER STATIC sens AS SINGLE STATIC slnr AS DWORD IF ISFALSE Task(%White_4).tog THEN sens = 0.1 'was 0.09 on 20.04.2010 RESET xtrig, ytrig, ztrig, lites MM_Heli_On MM_Horny_On MM_Klar_On Controller Horny.channel, 7, 127 'stays quite a bit softer then most other instruments.. Controller Klar.channel, 7, 127 IF ISFALSE Task(%white_4).hParam THEN DIM TaskParamLabels(0 TO 1) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "sens" ' spectral mapping. was "speed" ' taskfreq MakeTaskParameterDialog %white_4,1,Slider(),0,UDctrl(),TaskParamLabels() ' 2 sliders! END IF IF ISFALSE slnr THEN slnr = TaskEX(%white_4).SliderNumbers(0) Slider(slnr).value = sens * 500 ' was 36 in de versie met Emilie. ' met Dominika lopen we hiermee van hoog naar laag. SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value END IF Task(%White_4).tog = %True EXIT SUB END IF sens = Slider(slnr).value / 500 CONTROL SET TEXT gh.cockpit, %GMT_author, STR$(sens) ' on increasing body surface (exploding, growing, expanding), do something... ' we can also try IF gesture.explo_val(0) > gesture.implo_val(0) then... since these values are now commensurable IF (ISFALSE gesture.implo(0)) AND (gesture.explo(0)> @pDoppler.noise) THEN 'dur condition makes no sense as it is always fullfilled. IF ISFALSE xtrig THEN ' Horny n = Get_FreeNote_White n += ((gesture.explo(0) * 120)\12) * 12 ' oktaafligging n += 36 'onderstaande beveiling is nodig! anders krijgen we soms noten > 127.. DO WHILE n > Horny.HighTes: n = n - 12: LOOP 'logfile "Horny play" + STR$(n) White.Horny_noot = n mPlay Horny.channel,n, MIN(100 + gesture.explo_val(0) * 27, 127) 'still horny stays too soft to hear it in thsi context.. xtrig = %True END IF ELSE RESET xtrig IF White.Horny_noot THEN 'IF ISFALSE gesture.slowdown_dur(0) THEN mPlay Horny.channel, White.Horny_noot, %False 'logfile "Horny stop" + STR$(White.Horny_noot) 'END IF 'logfile "So reset" + STR$(White.So_noot MOD 12) RESET White.noot(White.Horny_noot MOD 12) RESET White.Horny_noot END IF END IF IF (ISFALSE gesture.implo(1)) AND (gesture.explo(1) > @pDoppler.noise) THEN IF ISFALSE ytrig THEN ' Heli n = Get_FreeNote_White n += ((gesture.explo(1) * 120)\12) * 12 ' oktaafligging n += 24 'onderstaande beveiling is nodig! anders krijgen we soms noten > 127.. DO WHILE n > Heli.HighTes: n = n - 12: LOOP 'logfile "Horny play" + STR$(n) White.Heli_noot = n mPlay Heli.channel,n, MIN(64 + gesture.explo_val(1) * 64, 127) ytrig = %True END IF ELSE RESET ytrig IF White.Heli_noot THEN 'IF ISFALSE gesture.slowdown_dur(0) THEN mPlay Heli.channel, White.Heli_noot, %False 'logfile "Horny stop" + STR$(White.Horny_noot) 'END IF 'logfile "So reset" + STR$(White.So_noot MOD 12) RESET White.noot(White.Heli_noot MOD 12) RESET White.Heli_noot END IF END IF IF (ISFALSE gesture.implo(2)) AND (gesture.explo(2)> @pDoppler.noise) THEN 'still too sensitive. IF ISFALSE ztrig THEN ' Klar n = Get_FreeNote_White n += ((gesture.explo(2) * 120)\12) * 12 ' oktaafligging n += 48 'onderstaande beveiling is nodig! anders krijgen we soms noten > 127.. DO WHILE n > Klar.HighTes: n = n - 12: LOOP 'logfile "Horny play" + STR$(n) White.Klar_noot = n mPlay Klar.channel,n, MIN(64 + gesture.explo_val(2) * 64, 127) ztrig = %True END IF ELSE IF White.Klar_noot THEN 'IF ISFALSE gesture.slowdown_dur(0) THEN mPlay Klar.channel, White.Klar_noot, %False 'logfile "Horny stop" + STR$(White.Horny_noot) 'END IF 'logfile "So reset" + STR$(White.So_noot MOD 12) RESET White.noot(White.Klar_noot MOD 12) RESET White.Klar_noot END IF RESET ztrig END IF ' IF (ISFALSE gesture.implo(3)) AND (gesture.explo(3) > 0.0) THEN ' IF ISFALSE lites THEN ' MM_Simba_On %MM_Lights ' lites = %True ' END IF ' ELSE ' IF lites THEN ' MM_Simba_Off %MM_Lights ' RESET lites ' END IF ' END IF END SUB SUB White_4_Stop () END SUB SUB White_Spiro LOCAL i AS LONG 'play remaining notes on spiro STATIC lastoctaves() AS DWORD STATIC init AS DWORD IF ISFALSE init THEN DIM lastoctaves(i) init = 1 END IF FOR i = 0 TO 11 IF ISFALSE white.noot(i) THEN IF lastoctaves(i) THEN AddNote2Har Spiro.Har(1), i + lastoctaves(i) * 12, 64 ELSE lastoctaves(i) = 3 + INT(RND * 4) AddNote2Har Spiro.Har(1), i + lastoctaves(i) * 12, 64 END IF ELSE RESET lastoctaves(i) END IF NEXT InstrumPlay SPiro Task(%white_spiro).freq = MIN(24, 2 + @pDoppler.xf / 10) END SUB 'xy and piano are clones of spiro SUB White_Xy LOCAL i AS LONG 'play remaining notes on Xy STATIC lastoctaves() AS DWORD STATIC init AS DWORD IF ISFALSE init THEN DIM lastoctaves(i) init = 1 END IF FOR i = 0 TO 11 IF ISFALSE white.noot(i) THEN IF lastoctaves(i) THEN AddNote2Har Xy.Har(1), i + lastoctaves(i) * 12, 30 ELSE lastoctaves(i) = 6 + INT(RND * 3) AddNote2Har Xy.Har(1), i + lastoctaves(i) * 12, 30 END IF ELSE RESET lastoctaves(i) END IF NEXT InstrumPlay Xy Task(%white_xy).freq = MIN(24, 2 + @pDoppler.yf / 10) END SUB SUB White_piano LOCAL i AS LONG 'play remaining notes on piano STATIC lastoctaves() AS DWORD STATIC init AS DWORD IF ISFALSE init THEN DIM lastoctaves(i) ProgChange Piano.channel, 123 init = 1 END IF FOR i = 0 TO 11 IF ISFALSE white.noot(i) THEN IF lastoctaves(i) THEN AddNote2Har piano.Har(1), i + lastoctaves(i) * 12, 30 ELSE lastoctaves(i) = 2 + INT(RND * 7) AddNote2Har piano.Har(1), i + lastoctaves(i) * 12, 30 END IF ELSE RESET lastoctaves(i) END IF NEXT InstrumPlay piano Task(%white_piano).freq = MIN(24, 2 + @pDoppler.zf / 10) END SUB SUB White_Harmo STATIC init AS DWORD STATIC cc AS DWORD STATIC notes() AS BYTE LOCAL i AS LONG IF ISFALSE init THEN DIM notes(11) FOR i = 0 TO 11 notes(i) = 36 + i + (INT(RND * 3) + 3 * SIN(cc/1000)^2) * 12 NEXT MM_Harmo_On %MM_Wind OR %MM_Motor Harmo.Ctrl(7) = 20 Controller Harmo.channel, 7, 20 init = 1 END IF IF RND < .04 THEN i = INT(RND * 12) notes(i) = 36 + i + INT(RND * 6) * 12 FOR i = 0 TO 11 AddNote2Har Harmo.Har(1), notes(i), 20 NEXT InstrumPlay Harmo END IF Harmo.ctrl(7) = (3 * Harmo.Ctrl(7) + 20 + 20 * @pDoppler.xa + 20 * @pDoppler.ya + 20 * @pDoppler.za) / 4 Controller Harmo.channel, 7, Harmo.ctrl(7) END SUB SUB White_Thunder STATIC cc AS DWORD IF ISFALSE cc THEN mPlay thunderwood.channel, 0, 127 END IF mPlay thunderwood.channel, 24, 80 +40 * SIN(cc/6) INCR cc END SUB FUNCTION Get_FreeNote_White () AS INTEGER ' sofar, will enter infinite loop if no note is found! STATIC i AS WORD LOCAL cnt AS WORD cnt = i DO ' logfile str$(cnt) IF ISFALSE White.noot(cnt) THEN FUNCTION = cnt logfile FUNCNAME$ + STR$(cnt) White.noot(cnt) = %True INCR i i = i MOD 12 EXIT FUNCTION ELSE INCR cnt cnt = cnt MOD 12 END IF LOOP 'incr i 'i = i mod 12 END FUNCTION