'******************************************************************** '* Namuda : Diptico * '* with: Emilie De Vlam & Dominica Eyckmans * '* 21&22/07.2011 * '******************************************************************** 'íf we use task 16, it's box is checked after selecting the piece and the tasks tarts working after unchecking the box.. %gf0 = 16 %gf1 = 17 %gf2 = 18 %gf7 = 19 'switched some numbers to make the order in the cockpit more logical %gf4 = 20 %gf5 = 21 %gf6 = 22 %gf3 = 23 %gf8 = 24 %gf9 = 25 %gf10 = 26 %gf0b = 16 +16 %gf1b = 17 +16 %gf2b = 18 +16 %gf7b = 19 +16 'switched some numbers to make the order in the cockpit more logical %gf4b = 20 +16 %gf5b = 21 +16 %gf6b = 22 +16 %gf3b = 23 +16 %gf8b = 24 +16 %gf9b = 25 +16 %gf10b = 26 + 16 %punt = 27 + 16 %klu = 28 + 16 %mut = 28 'interactively mute tracks %nomovplay = 29 'play on no movement %pzcnt = 30 'pauze/continue %spdslw = 31 'speed up/slowdown %v_artbots2011 = 1 'conditional compilation for version without korn or snar FUNCTION Init_gf AS LONG ClearTasks StopTask %gf1 Task(%gf0).naam = "Dominica" Task(%gf0).cptr = CODEPTR(dummytask) Task(%gf1).naam="ColPerc" Task(%gf1).freq = 16 Task(%gf1).cptr = CODEPTR(Collision_Percussion) Task(%gf2).naam="FluBrss" Task(%gf2).freq = 12 Task(%gf2).cptr = CODEPTR(fluent_Brass) TaskEx(%gf2).StopCptr = CODEPTR(FluBrss_stop) Task(%gf3).naam="ThClBell" Task(%gf3).freq = 16 Task(%gf3).cptr = CODEPTR(Theacol_Bells) Task(%gf4).naam="SpdAeio" Task(%gf4).freq = 12 Task(%gf4).cptr = CODEPTR(Speed_aeio) TaskEx(%gf4).StopCptr = CODEPTR(MM_Aeio_Off) Task(%gf5).naam= "FrSzpri" Task(%gf5).freq = 24 Task(%gf5).cptr = CODEPTR(Freeze_springs) Task(%gf6).naam="ColPsch" Task(%gf6).freq = 256 Task(%gf6).cptr = CODEPTR(Collision_Psch) Task(%gf7).naam="EdgChrd" Task(%gf7).freq = 16 Task(%gf7).cptr = CODEPTR(Edgy_Chords) Task(%gf8).naam = "ImpWd" Task(%gf8).freq = 32 Task(%gf8).cptr = CODEPTR(Implode_wood) Task(%gf9).naam = "ExpKwk" Task(%gf9).freq = 8 Task(%gf9).cptr = CODEPTR(Explode_kwek) Task(%gf10).naam = "Sire" Task(%gf10).freq = 20 Task(%gf10).cptr = CODEPTR(Amp_sire) TaskEx(%gf10).stopcptr = CODEPTR(MM_Sire_Off) Task(%mut).naam = "ouv_mute" Task(%mut).freq = 20 Task(%mut).cptr = CODEPTR(overt_mute) Task(%nomovplay).naam = "NoMvPlay" Task(%nomovplay).freq = 20 Task(%nomovplay).cptr = CODEPTR(Nomovplay) Task(%pzcnt).naam = "PauzCont" Task(%pzcnt).freq = 20 Task(%pzcnt).cptr = CODEPTR(startstop) Task(%spdslw).naam = "SpidSlow" Task(%spdslw).freq = 20 Task(%spdslw).cptr = CODEPTR(speedupslowdown) ' Task(%gf10).naam="ColToyp" ' Task(%gf10).freq = 10 ' Task(%gf10).cptr = CODEPTR(Collision_Toypi) FUNCTION = %true Task(%gf0b).naam = "Emilie" Task(%gf0b).cptr = CODEPTR(dummytask) Task(%gf1b).naam="ColPerc" Task(%gf1b).freq = 16 Task(%gf1b).cptr = CODEPTR(Collision_PercussionB) Task(%gf2b).naam="FluBrss" Task(%gf2b).freq = 12 Task(%gf2b).cptr = CODEPTR(fluent_BrassB) TaskEx(%gf2b).StopCptr = CODEPTR(FluBrss_stop) Task(%gf3b).naam="ThClBell" Task(%gf3b).freq = 16 Task(%gf3b).cptr = CODEPTR(Theacol_BellsB) Task(%gf4b).naam="SpdAeio" Task(%gf4b).freq = 12 Task(%gf4b).cptr = CODEPTR(Speed_aeioB) TaskEx(%gf4b).StopCptr = CODEPTR(MM_Aeio_Off) Task(%gf5b).naam= "FrSzpri" Task(%gf5b).freq = 24 Task(%gf5b).cptr = CODEPTR(Freeze_springsB) Task(%gf6b).naam="ColPsch" Task(%gf6b).freq = 256 Task(%gf6b).cptr = CODEPTR(Collision_PschB) Task(%gf7b).naam="EdgChrd" Task(%gf7b).freq = 16 Task(%gf7b).cptr = CODEPTR(Edgy_ChordsB) Task(%gf8b).naam = "ImpWd" Task(%gf8b).freq = 32 Task(%gf8b).cptr = CODEPTR(Implode_woodB) Task(%gf9b).naam = "ExpKwk" Task(%gf9b).freq = 8 Task(%gf9b).cptr = CODEPTR(Explode_kwekB) Task(%gf10b).naam = "Sire" Task(%gf10b).freq = 20 Task(%gf10b).cptr = CODEPTR(Amp_sire) TaskEx(%gf10b).stopcptr = CODEPTR(MM_Sire_Off) Task(%punt).naam = "punt" Task(%punt).freq = 5 Task(%punt).cptr = CODEPTR(punt) Task(%klu).naam = "klung" Task(%klu).freq = 40 Task(%klu).cptr = CODEPTR(klungel) TaskEx(App.MidiPlayerTasknr).Stopcptr = CODEPTR(gf_fileoff) #IF %DEF(%v_artbots2011) warning "Conditional compilation for artbots version without korn and snar active.." #ENDIF END FUNCTION SUB dummytask 'dummy to allow labels for dominica and emilie END SUB '================== Dominica versions SUB Collision_Percussion 'percussion on collisions.. (casta, troms, simba) STATIC sens AS SINGLE STATIC LiOn AS LONG 'flags for lights IF ISFALSE Task(%gf1).tog THEN sens = 1.4 Progchange casta2.channel, 122 Task(%gf1).tog = 1 END IF IF Gesture.collision(0) > sens THEN mplay Casta2.channel,MAX(Casta2.LowTes, 127 - Gesture.collision(0) * 2), 10 + @pDoppler.xa * 117 mPlay Casta2.channel, 111, 127 BIT SET LiOn, 0 ELSEIF BIT (LiOn, 0) THEN mPlay Casta2.channel, 111, 0 BIT RESET LiOn, 0 END IF IF Gesture.collision(1) > sens THEN mplay Troms.channel, MAX(24, Troms.HighTes - 4 * Gesture.collision(1)), 10 + @pDoppler.ya * 117 MM_Troms_On %MM_Lights BIT SET LiOn, 1 ELSEIF BIT(LiOn, 1) THEN MM_Troms_Off %MM_Lights BIT RESET LiOn, 1 END IF IF Gesture.collision(2) > sens THEN mplay Simba.channel, CHOOSE(Gesture.collision(2) * 4, 80, 80, 80, 80, 80, 75, 74, 73, 72, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60), @pDoppler.za * 127 MM_Simba_On %MM_Lights BIT SET LiOn, 2 ELSEIF BIT(LiOn, 2) THEN MM_Simba_Off %MM_Lights BIT RESET LiOn, 2 END IF END SUB SUB Collision_Psch () 'copy from Move_Psch for Zwiep en Zwaai 'based on: Domi_Collision_Trig () ' collision detector ' here we look only into the acceleration data in order to detect collisions. ' the task frequency is 256Hz STATIC xtrig, ytrig, ztrig, strig, lites AS LONG STATIC sens AS SINGLE IF ISFALSE Task(%gf6).tog THEN 'start gesture analyser!!! IF ISFALSE Task(%Gesture_analyser).tog THEN starttask %Gesture_Analyser RESET lites sens = 1.4 '14/10 Task(%gf6).tog = %True END IF ' on collision, do something... ' sens = Slider(slnr).value / 10 IF Gesture.collision(0) > sens THEN IF ISFALSE xtrig THEN 'mPlay Troms.channel, MIN(24 + ((Gesture.collision(0))*4),48), MIN(Gesture.impact(0) * 127,127) mPlay Snar.channel, 73 + RND(1), MIN(10 + Gesture.impact(0) * 127, 127) ' should be alternating 73-74 xtrig = %True END IF ELSE RESET xtrig END IF IF Gesture.collision(1) > sens THEN IF ISFALSE ytrig THEN 'mPlay Vacca.channel, MIN(48 + ((Gesture.collision(1)) *8),88), MIN(Gesture.impact(1) * 127, 127) mPlay Psch.channel, MIN(72 + ((Gesture.collision(1))*3),83), MIN(Gesture.impact(1) * 160, 127) ytrig = %true END IF ELSE RESET ytrig END IF IF Gesture.collision(2) > sens THEN IF ISFALSE ztrig THEN ' avoiding multiple triggers on the same collision 'mPlay Thunderwood.channel, MIN(1 + ((Gesture.collision(2))*4),14), MIN(Gesture.impact(2) * 150, 127) mPlay Psch.channel, MIN(72 + ((Gesture.collision(2))*3),83), MIN(Gesture.impact(2) * 160, 127) ztrig = %True END IF ELSE RESET ztrig END IF 'added 17.04.2010 IF gesture.collision(3) THEN IF ISFALSE lites THEN 'licht MM_So_On %MM_White MM_Troms_On %MM_Lights MM_Heli_On %MM_Lights ' mPlay Thunderwood.channel, 0, 127 lites = %True END IF IF gesture.collision(3) > sens THEN 'added 13.05 IF ISFALSE strig THEN ' mPlay Troms.channel, 48,MIN(Gesture.impact(3) * 180, 127) 'cimbaal strig = %True END IF END IF ELSE IF lites THEN 'licht uit. MM_So_Off %MM_White MM_Troms_Off %MM_Lights MM_Heli_Off %MM_Lights ' mPlay Thunderwood.channel, 0, %False RESET lites END IF IF strig THEN IF gesture.collision(3) > sens THEN RESET strig END IF END IF END IF END SUB SUB Fluent_brass 'low brass with pitch bends following fluency 'we might consider taking ptiches from input harmony in stead.. STATIC sens AS SINGLE STATIC cc AS DWORD LOCAL n AS SINGLE, b AS SINGLE IF ISFALSE Task(%gf2).tog THEN sens = 0.3 '0.625 '80 / 128 'taken from robodomi.. MM_So_On MM_Bono_On MM_Fa_On Controller Fa.channel, 1, 5 Controller Fa.channel, 17, 127 Controller Fa.channel, 7, 127 Controller Heli.channel, 7, 64 'colour Controller Heli.channel, 17, 20 Controller So.channel, 18, 126 Controller So.channel, 1, 15 Controller Fa.channel, 19, 126 Controller Heli.channel, 19, 126 Controller So.channel, 19, 126 Task(%gf2).tog = 1 END IF INCR cc 'base 24/36 could be variable.. IF gesture.flue(0) > sens THEN n = MAX(12, 32 * SQR(2*(gesture.flue_val(0)))) '****** Adapt other voices in similar way if this works well.. ****** IF ISFALSE (cc MOD 6) THEN AddNote2Har So.Har(1), INT(n + .5), 127 'fixed velo to prevent re-triggers b = MAX(0, MIN(127, 64 + 64 * 2 * (n - INT(n + .5)))) ' logfile "@"+ str$(timegettime/1000) + " val:"+ str$(sqr(2*gesture.flue_val(0))) + " n:" + str$(n) + " xbend:"+ STR$(b) Bend So.channel, b, b Controller So.channel, 7, 20 + 60 * @pDoppler.xa MM_So_On %MM_Red END IF IF ISFALSE(LEN(TRIM$(So.Har(1).vel, CHR$(0)))) THEN MM_So_Off %MM_Red IF ISFALSE (cc MOD 6) THEN InstrumPlay So IF gesture.flue(1) > sens THEN n = MAX(12, 36 * SQR(2*(gesture.flue_val(1)))) IF ISFALSE (cc MOD 6) THEN AddNote2Har Heli.Har(1), INT(n + .5), 127 'fixed velo to prevent re-triggers b = MAX(0, MIN(127,64 + 64 * 2 * (n - INT(n + .5)))) logfile "@"+ STR$(timegettime/1000) + " val:"+ STR$(SQR(2*gesture.flue_val(1))) + " n:" + STR$(n) + " fix:" + STR$(INT(n + .5)) + " ybend:"+ STR$(b) Bend Heli.channel, b, b Controller Heli.channel, 17, 20 + 40 * @pDoppler.ya mPlay Heli.channel, 120, 127 'orange END IF IF ISFALSE(LEN(TRIM$(Heli.Har(1).vel, CHR$(0)))) THEN MPLay Heli.channel, 120, 0 IF ISFALSE (cc MOD 6) THEN InstrumPlay Heli IF gesture.flue(2) > sens THEN n = 36 + 36 * SQR(2*(gesture.flue_val(2))) IF ISFALSE (cc MOD 6) THEN AddNote2Har Fa.Har(1), INT(n + .5), 127 'fixed velo to prevent re-triggers ' logfile "fa"+ str$(int(n + .5)) b = MAX(0, MIN(127,64 + 64 * 2 * (n - INT(n + .5)))) logfile "zbend:"+ STR$(b) Bend Fa.channel, b, b Controller Fa.channel, 7, 100 + @pDoppler.za * 27 'according to docs 100-127 is good range ' ctrl 31 for fingered vibrato? MM_Fa_On %MM_Red END IF IF ISFALSE(LEN(TRIM$(Fa.Har(1).vel, CHR$(0)))) THEN MM_Fa_Off %MM_Lights IF ISFALSE (cc MOD 6) THEN InstrumPlay Fa END SUB SUB FluBrss_Stop Bend So.channel, 64, 64 Bend Heli.channel, 64, 64 Bend Fa.channel, 64, 64 MM_So_Off %MM_Notes MM_Heli_Off %MM_Notes MM_Fa_Off %MM_Notes END SUB SUB Theacol_Bells STATIC sens AS DWORD IF ISFALSE sens THEN sens = 1.2 IF Gesture.theacol(0) > sens THEN logfile STR$(Gesture.theacol(0)) 'gaat tot 4.xx mPlay Llor.channel, 59 - 2 * (Gesture.theacol(0) - sens), 127 * @pDoppler.xa 'llor soft END IF IF Gesture.theacol(1) > sens THEN mPlay Vacca.channel, 95 - 4 * (Gesture.theacol(1) - sens), 127 * @pDoppler.ya 'ónly highest bells.. END IF IF Gesture.theacol(2) > sens THEN mPlay Belly.channel, Belly.HighTes - 3 * (Gesture.Theacol(2) - sens), 127 * @pDoppler.za END IF ' if Gesture.theacol(3) > sens then ' ' mplay Vacca.channel, 58 - 2 * (Gesture.Theacol(3)-sens), 127 * max(@pDoppler.xa, @pDoppler.ya, @pDoppler.za) ' end if END SUB SUB Speed_aeio 'ídea: let overtones go up wile speed is going u and viceversa.. STATIC sens AS SINGLE STATIC o1 AS CURRENCY, o2 AS CURRENCY, o3 AS CURRENCY IF ISFALSE sens THEN sens = .5 'áeio inits.. Controller Aeio.channel, 7, 60 controller Aeio.channel, 64, 64 ProgChange Aeio.channel, 3 END IF IF @pDoppler.xa > .07 THEN AddNote2Har Aeio.Har(1), 36, 96 IF @pDoppler.xa > .3 THEN AddNote2Har Aeio.Har(1), 43, 96 IF @pDoppler.xa > .8 THEN mPlay Aeio.channel, 24, 100: mPlay aeio.channel, 31, 100 END IF IF @pDoppler.ya > .07 THEN AddNote2Har Aeio.Har(1), 39, 96 IF @pDoppler.ya > .3 THEN AddNote2Har Aeio.Har(1), 46, 96 IF @pDoppler.ya > .8 THEN mPlay Aeio.channel, 27, 100: mPlay aeio.channel, 34, 100 END IF IF @pDoppler.za > .07 THEN AddNote2Har Aeio.Har(1), 42, 96 IF @pDoppler.za > .3 THEN AddNote2Har Aeio.Har(1), 45, 96 IF @pDoppler.za > .8 THEN mPlay Aeio.channel, 30, 100: mPlay aeio.channel, 33, 100 END IF InstrumPlay Aeio controller Aeio.channel, 7, 64 + 64 * MAX(@pDoppler.xa, @pDoppler.ya, @pDoppler.za) IF @pDoppler.xa > .07 THEN IF (Gesture.speedup(0) > sens) AND (Gesture.speedup(0) > Gesture.SlowDown(0)) THEN o1 = o1 + .25 o1 = MIN(32, o1) 'how high can we actually go? ELSEIF (Gesture.slowdown(0) > sens) AND (Gesture.slowdown(0) > Gesture.Speedup(0)) THEN o1 = o1 - .33 o1 = MAX(1, o1) END IF Controller Aeio.channel, 100, o1 Controller Aeio.channel, 107, o1 + 3 logfile "o1:"+ STR$(o1) ELSE o1 = 1 END IF IF @pDoppler.ya > .07 THEN IF (Gesture.speedup(1) > sens) AND (Gesture.speedup(1) > Gesture.SlowDown(1)) THEN o2 = o2 + .25 o2 = MIN(32, o2) 'how high can we actually go? ELSEIF (Gesture.slowdown(1) > sens) AND (Gesture.slowdown(1) > Gesture.Speedup(1)) THEN o2 = o2 - .33 o2 = MAX(1, o2) END IF Controller Aeio.channel, 103, o2 Controller Aeio.channel, 110, o2 + 3 logfile "o2:"+ STR$(o2) ELSE o2 = 1 END IF IF @pDoppler.za > .07 THEN IF (Gesture.speedup(2) > sens) AND (Gesture.speedup(2) > Gesture.SlowDown(2)) THEN o3 = o3 + .25 o3 = MIN(32, o3) 'how high can we actually go? ELSEIF (Gesture.slowdown(2) > sens) AND (Gesture.slowdown(2) > Gesture.Speedup(2)) THEN o3 = o3 - .33 o3 = MAX(1, o3) END IF Controller Aeio.channel, 106, o3 Controller Aeio.channel, 109, o3 + 3 logfile "o3:"+ STR$(o3) ELSE o3 = 1 END IF END SUB SUB Freeze_springs 'shake lowest 3 springers on freeze STATIC cc AS DWORD INCR cc IF gesture.freeze(0) THEN mPlay Springers.channel, 36, 5 + 20 * SIN(cc/150)^2 IF gesture.freeze(1) THEN mPlay Springers.channel, 37, 5 + 20 * SIN((cc + 50)/150)^2 IF gesture.freeze(2) THEN mPlay Springers.channel, 38, 5 + 20 * SIN((cc+100)/150)^2 'maybe add some lights ? END SUB SUB Edgy_Chords LOCAL basen AS SINGLE LOCAL n AS SINGLE LOCAL i AS LONG STATIC cc AS DWORD STATIC nc1 AS DWORD, nc2 AS DWORD, nc3 AS DWORD IF ISFALSE cc THEN Controller Vibi.channel, 123, 0 Controller Vibi.channel, 64, 0 Controller Vibi.channel, 24, 0 'ís the order of these important? Controller Vibi.channel, 23, 90 ProgChange Piano.channel, 123 END IF IF Gesture.edgy_dur(0)>2 THEN 'xy IF cc >= nc1 THEN basen = 24 + gesture.edgy(0) * 5 FOR i = 1 TO 1 + @pDoppler.xf / 10 n = 65 + i * 4 n = MatchSpecNote(n, basen, 1.5 - @pDoppler.xa) AddNote2Qhar Xy.Qhar(1), n, 90 * @pDoppler.xa NEXT QInstrumPlay Xy nc1 = cc + MAX(1, 20 - @pDoppler.xf/5) END IF END IF IF (cc MOD 2) THEN IF Gesture.edgy_dur(1)>2 THEN 'vibi IF cc >= nc2 THEN basen = 24 + gesture.edgy(1) * 5 FOR i = 1 TO 1 + @pDoppler.yf / 10 n = 60 + i * 4 n = MatchSpecNote(n, basen, 1.5 - @pDoppler.ya) AddNote2har Vibi.har(1), n, 127 * @pDoppler.ya NEXT nc2 = cc + MAX(1, 25 - @pDoppler.yf/5) END IF END IF InstrumPlay Vibi END IF IF Gesture.edgy_dur(2)>3 THEN 'piano IF cc >= nc3 THEN basen = 12 + gesture.edgy(2) * 5 FOR i = 1 TO 1 + @pDoppler.zf / 10 n = 36 + i * 5 n = MatchSpecNote(n, basen, 1.5 - @pDoppler.za) AddNote2har Piano.har(1), n, 10 + 117 * @pDoppler.za NEXT nc3 = cc + MAX(1, 30 - @pDoppler.zf/5) END IF END IF InstrumPlay Piano 'end if INCR cc END SUB 'nog iets op implode/explode? SUB Implode_wood ' çopy from emilie - to be adapted STATIC xtrig, ytrig, ztrig, lites AS LONG STATIC obwind AS SINGLE STATIC oboff AS DWORD, kornoff AS DWORD LOCAL xnoot, ynoot, znoot AS CURRENCY LOCAL trig AS LONG 'LOCAL i AS DWORD STATIC sens AS SINGLE STATIC cc AS DWORD STATIC obvol, obbend AS SINGLE STATIC kornvol, kornbend AS SINGLE STATIC basenote AS SINGLE STATIC specfac AS SINGLE IF ISFALSE Task(%gf8).tog THEN 'sens = 0.117 '= 15 / 128.0 sens = 0.1 '0.001 '@pDoppler.noise '* 3 RESET xtrig, ytrig, ztrig, lites Controller Ob.channel, 17, 30 'normal = 72 Controller Ob.channel, 18, 30 Controller Ob.channel, 19, 120 obvol = 30 obbend = 64 basenote = 24 specfac = 1 Task(%gf8).tog = %True EXIT SUB END IF INCR cc ' on decreasing body surface (shrinking), do something... ' sens = Slider(slnr).value / 128.0 ' values are normalised 'with identical scaling in the property assignation procedure: [18.04.2010] IF (ISFALSE(gesture.explo(0))) AND (gesture.implo(0)> @pDoppler.noise * 2.5) AND (@pDoppler.xf > 4.5) THEN 'noise * 2, as x vector was triggering much easier then y.. IF ((cc MOD 4) = 1) AND (@pDoppler.xa > .1) THEN ' logfile "öb" + str$(timegettime/1000) xnoot = MIN(Ob.lowtes + 2 + (gesture.implo(0)* 150), Ob.Hightes) xnoot = MatchSpecNote(xnoot, Basenote, Specfac) AddNote2Har Ob.Har(1), xnoot, 127 * MIN(1,SQR(Gesture.implo_val(0))) Oboff = timegettime + 2000 + 3000 * gesture.implo(0) 'min 1 sec before we put it off when prop is false, new notes can come faster InstrumPlay Ob END IF obvol = (2 * obvol + 27 + @pDoppler.xa * 100) / 3 Controller Ob.channel, 17, obvol 'high values seldomly occur during explosion obbend = MAX(0,(2 * obbend + 64 - @pDoppler.xf) / 3) Bend Ob.channel, obbend, obbend trig = 1 ELSE IF timegettime > ObOff THEN InstrumPlay Ob Bend Ob.channel, 64,64 END IF IF (ISFALSE(gesture.explo(1))) AND (gesture.implo(1)> @pDoppler.noise * 1.5) AND (@pDoppler.yf > 4.5) THEN IF ((cc MOD 5) = 1) AND (@pDoppler.xa > .1) THEN ' logfile "öb" + str$(timegettime/1000) xnoot = MIN(Korn.lowtes + 2 + (gesture.implo(0)* 150), Ob.Hightes) xnoot = MatchSpecNote(xnoot, Basenote, Specfac) AddNote2Har Korn.Har(1), xnoot, 127 * MIN(1,SQR(Gesture.implo_val(0))) Kornoff = timegettime + 2000 + 3000 * gesture.implo(0) 'min 1 sec before we put it off when prop is false, new notes can come faster InstrumPlay Korn END IF kornvol = (2 * obvol + 27 + @pDoppler.xa * 100) / 3 Controller Korn.channel, 17, obvol 'high values seldomly occur during explosion kornbend = MAX(0,(2 * kornbend + 64 - @pDoppler.xf) / 3) Bend Korn.channel, kornbend, kornbend trig = 1 ELSE IF timegettime > kornOff THEN InstrumPlay korn Bend korn.channel, 64,64 END IF IF trig THEN ELSE specfac = .7 + RND * .6 END IF IF gesture.implo(3) > gesture.explo(3) THEN IF ISFALSE lites THEN lites = %True END IF ELSE IF lites THEN RESET lites END IF END IF END SUB SUB Explode_kwek 'krum, trump, humanola STATIC basen AS SINGLE, specfac AS SINGLE LOCAL trig AS LONG LOCAL n AS LONG, i AS LONG IF ISFALSE Task(%gf9).tog THEN Task(%gf9).tog = 1 MM_Humanola_On %MM_wind OR %MM_Motor MM_Trump_On %MM_wind OR %MM_Motor MM_Krum_On %MM_wind OR %MM_Motor basen = 48 specfac = 1 END IF IF (ISFALSE gesture.implo(0)) AND (gesture.explo(0)> @pDoppler.noise) THEN INCR trig FOR i = 1 TO 1 + 8 * @pDoppler.xa n = Humanola.HighTes - 3 * i n = MatchSpecNote(n, basen, specfac) AddNote2Har Humanola.Har(1), n, 20 NEXT END IF InstrumPlay Humanola IF (ISFALSE gesture.implo(1)) AND (gesture.explo(1)> @pDoppler.noise) THEN INCR trig FOR i = 1 TO 1 + 8 * @pDoppler.ya n = Trump.HighTes - 3 * i n = MatchSpecNote(n, basen-12, specfac) AddNote2Har Trump.Har(1), n,20 NEXT END IF InstrumPlay Trump IF (ISFALSE gesture.implo(2)) AND (gesture.explo(2)> @pDoppler.noise) THEN INCR trig FOR i = 1 TO 1 + 8 * @pDoppler.za n = Krum.HighTes - 3 * i n = MatchSpecNote(n, basen, specfac) AddNote2Har Krum.Har(1), n, 20 NEXT END IF InstrumPlay Krum IF ISFALSE trig THEN basen = 42 + RND * 6 specfac = .7 + RND * .6 END IF END SUB SUB Collision_Toypi 'toypi. change notes on collission, then keeps repeating that note as long as there's movement.. STATIC sens AS SINGLE STATIC von AS LONG STATIC n1 AS LONG, n2 AS LONG, n3 AS LONG STATIC LiOn AS LONG 'flags for lights IF ISFALSE Task(%gf1).tog THEN sens = 1.4 Progchange casta2.channel, 122 Task(%gf1).tog = 1 END IF IF Gesture.collision(0) > sens THEN BIT SET von, 0 n1 = Toypi.LowTes + gesture.collision(0) * 8 DO WHILE n1 > Toypi.highTes: n1 = n1 - 12: LOOP END IF IF Gesture.collision(1) > sens THEN BIT SET von, 1 n2 = Toypi.LowTes + gesture.collision(1) * 8 IF n2 = n1 THEN n2 = n2 + 3 DO WHILE n2 > Toypi.highTes: n2 = n2 - 12: LOOP END IF IF Gesture.collision(2) > sens THEN BIT SET von, 2 n3 = Toypi.LowTes + gesture.collision(2) * 8 IF n3 = n2 THEN n3 = n3 + 3 DO WHILE n3 > Toypi.highTes: n3 = n3 - 12: LOOP END IF IF BIT(von, 0) THEN IF @pdoppler.xa > .07 THEN mPlay Toypi.channel, n1, @pDoppler.xa * 30 ELSE BIT RESET von, 0 END IF END IF IF BIT(von, 1) THEN IF @pdoppler.ya > .07 THEN mPLAY Toypi.channel, n2, @pDoppler.ya * 30 ELSE BIT RESET von, 1 END IF END IF IF BIT(von, 2) THEN IF @pdoppler.za > .07 THEN mPLAY Toypi.channel, n2, @pDoppler.za * 30 ELSE BIT RESET von, 2 END IF END IF END SUB SUB Amp_Sire '48 - 71 STATIC cc AS DWORD STATIC sens AS SINGLE STATIC mxa AS SINGLE LOCAL s AS SINGLE INCR cc IF ISFALSE sens THEN sens = .07 mxa = 50 'max sire ampo END IF SELECT CASE (cc MOD 7) CASE 0 IF @pDoppler.xa > sens THEN mPlay Sire.channel, 48, mxa * @pDoppler.xa mPlay Sire.channel, 56, mxa * @pDoppler.xa mPlay Sire.channel, 64, mxa * @pDoppler.xa ELSE mPlay Sire.channel, 48, 0 mPlay Sire.channel, 56, 0 mPlay Sire.channel, 64, 0 END IF CASE 1 IF @pDoppler.ya > sens THEN mPlay Sire.channel, 49, mxa * @pDoppler.ya mPlay Sire.channel, 57, mxa * @pDoppler.ya mPlay Sire.channel, 65, mxa * @pDoppler.ya ELSE mPlay Sire.channel, 49, 0 mPlay Sire.channel, 57, 0 mPlay Sire.channel, 65, 0 END IF CASE 2 IF @pDoppler.za > sens THEN mPlay Sire.channel, 50, mxa * @pDoppler.za mPlay Sire.channel, 58, mxa * @pDoppler.za mPlay Sire.channel, 66, mxa * @pDoppler.za ELSE mPlay Sire.channel, 50, 0 mPlay Sire.channel, 58, 0 mPlay Sire.channel, 66, 0 END IF CASE 3 s = (@pDoppler.xa + @pDoppler.ya) / 2 IF s > sens THEN mPlay Sire.channel, 51, mxa * s mPlay Sire.channel, 59, mxa * s mPlay Sire.channel, 67, mxa * s ELSE mPlay Sire.channel, 51, 0 mPlay Sire.channel, 59, 0 mPlay Sire.channel, 67, 0 END IF CASE 4 s = (@pDoppler.xa + @pDoppler.za) / 2 IF s > sens THEN mPlay Sire.channel, 52, mxa * s mPlay Sire.channel, 59, mxa * s mPlay Sire.channel, 67, mxa * s ELSE mPlay Sire.channel, 52, 0 mPlay Sire.channel, 59, 0 mPlay Sire.channel, 67, 0 END IF CASE 6 s = (@pDoppler.ya + @pDoppler.za) / 2 IF s > sens THEN mPlay Sire.channel, 53, mxa * s mPlay Sire.channel, 60, mxa * s mPlay Sire.channel, 68, mxa * s ELSE mPlay Sire.channel, 53, 0 mPlay Sire.channel, 60, 0 mPlay Sire.channel, 68, 0 END IF CASE 7 s = (@pDoppler.xa + @pDoppler.ya + @pDoppler.za) / 3 IF s > sens THEN mPlay Sire.channel, 54, mxa * s mPlay Sire.channel, 61, mxa * s mPlay Sire.channel, 69, mxa * s ELSE mPlay Sire.channel, 54, 0 mPlay Sire.channel, 61, 0 mPlay Sire.channel, 69, 0 END IF END SELECT END SUB '================== Emilie versions =========================== SUB Collision_PercussionB 'percussion on collisions.. (casta, troms, simba) STATIC sens AS SINGLE STATIC LiOn AS LONG 'flags for lights IF ISFALSE Task(%gf1B).tog THEN sens = 1.4 Progchange casta2.channel, 122 Task(%gf1B).tog = 1 END IF IF Gesture.collision(0) > sens THEN mplay Casta2.channel,MAX(Casta2.LowTes, 127 - Gesture.collision(0) * 3), 15 + @pDoppler.xa * 112 mPlay Casta2.channel, 111, 127 BIT SET LiOn, 0 ELSEIF BIT (LiOn, 0) THEN mPlay Casta2.channel, 111, 0 BIT RESET LiOn, 0 END IF IF Gesture.collision(1) > sens THEN mplay Troms.channel, MAX(24, Troms.HighTes - 6 * Gesture.collision(1)), 10 + @pDoppler.ya * 117 logfile "troms" + STR$(Troms.HighTes - 6 * Gesture.collision(1)) MM_Troms_On %MM_Lights BIT SET LiOn, 1 ELSEIF BIT(LiOn, 1) THEN MM_Troms_Off %MM_Lights BIT RESET LiOn, 1 END IF IF Gesture.collision(2) > sens THEN mplay Simba.channel, CHOOSE(Gesture.collision(2) * 4, 80, 80, 75, 74, 73, 72, 63, 62, 61, 6, 60, 60, 60, 60), 15 + @pDoppler.za * 112 MM_Simba_On %MM_Lights BIT SET LiOn, 2 ELSEIF BIT(LiOn, 2) THEN MM_Simba_Off %MM_Lights BIT RESET LiOn, 2 END IF END SUB SUB Collision_PschB () 'copy from Move_Psch for Zwiep en Zwaai 'based on: Domi_Collision_Trig () ' collision detector ' here we look only into the acceleration data in order to detect collisions. ' the task frequency is 256Hz STATIC xtrig, ytrig, ztrig, strig, lites AS LONG STATIC sens AS SINGLE IF ISFALSE Task(%gf6B).tog THEN 'start gesture analyser!!! IF ISFALSE Task(%Gesture_analyser).tog THEN starttask %Gesture_Analyser RESET lites sens = 1.4 '14/10 Task(%gf6B).tog = %True END IF ' on collision, do something... ' sens = Slider(slnr).value / 10 IF Gesture.collision(0) > sens THEN IF ISFALSE xtrig THEN 'mPlay Troms.channel, MIN(24 + ((Gesture.collision(0))*4),48), MIN(Gesture.impact(0) * 127,127) #IF %DEF(%v_artbots2011) mPlay Thunderwood.channel, 1 + RND * 8, MIN(15 + Gesture.impact(0) * 90, 127) #ELSE mPlay Snar.channel, 73 + RND(1), MIN(15 + Gesture.impact(0) * 127, 127) ' should be alternating 73-74 #ENDIF xtrig = %True END IF ELSE RESET xtrig END IF IF Gesture.collision(1) > sens THEN IF ISFALSE ytrig THEN 'mPlay Vacca.channel, MIN(48 + ((Gesture.collision(1)) *8),88), MIN(Gesture.impact(1) * 127, 127) mPlay Psch.channel, MIN(72 + ((Gesture.collision(1))*3),83), MIN(Gesture.impact(1) * 160, 127) ytrig = %true END IF ELSE RESET ytrig END IF IF Gesture.collision(2) > sens THEN IF ISFALSE ztrig THEN ' avoiding multiple triggers on the same collision 'mPlay Thunderwood.channel, MIN(1 + ((Gesture.collision(2))*4),14), MIN(Gesture.impact(2) * 150, 127) mPlay Psch.channel, MIN(72 + ((Gesture.collision(2))*3),83), MIN(Gesture.impact(2) * 160, 127) ztrig = %True END IF ELSE RESET ztrig END IF 'added 17.04.2010 IF gesture.collision(3) THEN IF ISFALSE lites THEN 'licht MM_So_On %MM_White MM_Troms_On %MM_Lights MM_Heli_On %MM_Lights ' mPlay Thunderwood.channel, 0, 127 lites = %True END IF IF gesture.collision(3) > sens THEN 'added 13.05 IF ISFALSE strig THEN ' mPlay Troms.channel, 48,MIN(Gesture.impact(3) * 180, 127) 'cimbaal strig = %True END IF END IF ELSE IF lites THEN 'licht uit. MM_So_Off %MM_White MM_Troms_Off %MM_Lights MM_Heli_Off %MM_Lights ' mPlay Thunderwood.channel, 0, %False RESET lites END IF IF strig THEN IF gesture.collision(3) > sens THEN RESET strig END IF END IF END IF END SUB SUB Fluent_brassB 'low brass with pitch bends following fluency 'we might consider taking ptiches from input harmony in stead.. STATIC sens AS SINGLE STATIC cc AS DWORD LOCAL n AS SINGLE, b AS SINGLE IF ISFALSE Task(%gf2b).tog THEN sens = 0.625 '80 / 128 'taken from robodomi.. MM_So_On MM_Bono_On MM_Fa_On Controller Fa.channel, 1, 5 Controller Fa.channel, 17, 127 Controller Fa.channel, 7, 127 Controller Heli.channel, 7, 64 'colour Controller Heli.channel, 17, 20 Controller So.channel, 1, 15 Controller Fa.channel, 19, 120 Controller Heli.channel, 19, 120 Controller So.channel, 19, 120 Task(%gf2b).tog = 1 END IF INCR cc 'base 24/36 could be variable.. IF gesture.flue(0) > sens THEN n = 24 + 12 * SQR(2*(gesture.flue_val(0) - sens)) IF ISFALSE (cc MOD 6) THEN AddNote2Har So.Har(1), INT(n + .5), 30 'fixed velo to prevent re-triggers b = 64 + 64 * (n - INT(n + .5)) Bend So.channel, b, b Controller So.channel, 7, 40 + 80 * @pDoppler.xa MM_So_On %MM_Red END IF IF ISFALSE(LEN(TRIM$(So.Har(1).vel, CHR$(0)))) THEN MM_So_Off %MM_Red IF ISFALSE (cc MOD 6) THEN InstrumPlay So IF gesture.flue(1) > sens THEN n = 36 + 12 * SQR(2*(gesture.flue_val(1) - sens)) IF ISFALSE (cc MOD 6) THEN AddNote2Har Heli.Har(1), INT(n + .5), 127 'fixed velo to prevent re-triggers b = 64 + 64 * (n - INT(n + .5)) Bend Heli.channel, b, b Controller Heli.channel, 17, 20 + 40 * @pDoppler.ya mPlay Heli.channel, 120, 127 'orange END IF IF ISFALSE(LEN(TRIM$(Heli.Har(1).vel, CHR$(0)))) THEN MPLay Heli.channel, 120, 0 IF ISFALSE (cc MOD 6) THEN InstrumPlay Heli IF gesture.flue(2) > sens THEN n = 60 + 12 * SQR(2*(gesture.flue_val(2) - sens)) IF ISFALSE (cc MOD 6) THEN AddNote2Har Fa.Har(1), INT(n + .5), 127 'fixed velo to prevent re-triggers ' logfile "fa"+ str$(int(n + .5)) b = 64 + 64 * (n - INT(n + .5)) Bend Fa.channel, b, b Controller Fa.channel, 7, 100 + @pDoppler.za * 27 'according to docs 100-127 is good range ' ctrl 31 for fingered vibrato? MM_Fa_On %MM_Red END IF IF ISFALSE(LEN(TRIM$(Fa.Har(1).vel, CHR$(0)))) THEN MM_Fa_Off %MM_Lights IF ISFALSE (cc MOD 6) THEN InstrumPlay Fa END SUB SUB Theacol_BellsB STATIC sens AS DWORD IF ISFALSE sens THEN sens = 1.2 IF Gesture.theacol(0) > sens THEN logfile STR$(Gesture.theacol(0)) 'gaat tot 4.xx mPlay Llor.channel, 59 - 3 * (Gesture.theacol(0) - sens), 127 * @pDoppler.xa 'llor soft END IF IF Gesture.theacol(1) > sens THEN mPlay Vacca.channel, 95 - 8 * (Gesture.theacol(1) - sens), 127 * @pDoppler.ya 'ónly highest bells.. logfile "vacca"+ STR$(95 - 8 * (Gesture.theacol(1) - sens)) END IF IF Gesture.theacol(2) > sens THEN mPlay Belly.channel,102 - 6 * (Gesture.Theacol(2) - sens), 127 * @pDoppler.za logfile "belly"+ STR$(102 - 6 * (Gesture.theacol(2) - sens)) END IF ' if Gesture.theacol(3) > sens then ' ' mplay Vacca.channel, 58 - 2 * (Gesture.Theacol(3)-sens), 127 * max(@pDoppler.xa, @pDoppler.ya, @pDoppler.za) ' end if END SUB SUB Speed_aeioB 'ídea: let overtones go up wile speed is going uP and viceversa.. STATIC sens AS SINGLE STATIC o1 AS CURRENCY, o2 AS CURRENCY, o3 AS CURRENCY IF ISFALSE sens THEN sens = .5 'áeio inits.. Controller Aeio.channel, 7, 60 controller Aeio.channel, 64, 64 ProgChange Aeio.channel, 3 END IF IF @pDoppler.xa > .1 THEN AddNote2Har Aeio.Har(1), 36, 96 IF @pDoppler.xa > .3 THEN AddNote2Har Aeio.Har(1), 43, 96 IF @pDoppler.xa > .8 THEN mPlay Aeio.channel, 24, 100: mPlay aeio.channel, 31, 100 END IF IF @pDoppler.ya > .1 THEN AddNote2Har Aeio.Har(1), 39, 96 IF @pDoppler.ya > .3 THEN AddNote2Har Aeio.Har(1), 46, 96 IF @pDoppler.ya > .8 THEN mPlay Aeio.channel, 27, 100: mPlay aeio.channel, 34, 100 END IF IF @pDoppler.za > .1 THEN AddNote2Har Aeio.Har(1), 42, 96 IF @pDoppler.za > .3 THEN AddNote2Har Aeio.Har(1), 45, 96 IF @pDoppler.za > .8 THEN mPlay Aeio.channel, 30, 100: mPlay aeio.channel, 33, 100 END IF InstrumPlay Aeio controller Aeio.channel, 7, MIN(127, 64 + 64 * MAX(@pDoppler.xa, @pDoppler.ya, @pDoppler.za)) 'note xa tends to go slightly oiver 1!! IF @pDoppler.xa > .1 THEN IF (Gesture.speedup(0) > sens) AND (Gesture.speedup(0) > Gesture.SlowDown(0)) THEN o1 = o1 + .25 o1 = MIN(32, o1) 'how high can we actually go? ELSEIF (Gesture.slowdown(0) > sens) AND (Gesture.slowdown(0) > Gesture.Speedup(0)) THEN o1 = o1 - .33 o1 = MAX(1, o1) END IF Controller Aeio.channel, 100, o1 Controller Aeio.channel, 107, o1 + 3 logfile "o1:"+ STR$(o1) ELSE o1 = 1 END IF IF @pDoppler.ya > .1 THEN IF (Gesture.speedup(1) > sens) AND (Gesture.speedup(1) > Gesture.SlowDown(1)) THEN o2 = o2 + .25 o2 = MIN(32, o2) 'how high can we actually go? ELSEIF (Gesture.slowdown(1) > sens) AND (Gesture.slowdown(1) > Gesture.Speedup(1)) THEN o2 = o2 - .33 o2 = MAX(1, o2) END IF Controller Aeio.channel, 103, o2 Controller Aeio.channel, 110, o2 + 3 logfile "o2:"+ STR$(o2) ELSE o2 = 1 END IF IF @pDoppler.za > .1 THEN IF (Gesture.speedup(2) > sens) AND (Gesture.speedup(2) > Gesture.SlowDown(2)) THEN o3 = o3 + .25 o3 = MIN(32, o3) 'how high can we actually go? ELSEIF (Gesture.slowdown(2) > sens) AND (Gesture.slowdown(2) > Gesture.Speedup(2)) THEN o3 = o3 - .33 o3 = MAX(1, o3) END IF Controller Aeio.channel, 106, o3 Controller Aeio.channel, 109, o3 + 3 logfile "o3:"+ STR$(o3) ELSE o3 = 1 END IF END SUB SUB Freeze_springsB 'shake lowest 3 springers on freeze STATIC cc AS DWORD INCR cc IF gesture.freeze(0) THEN mPlay Springers.channel, 36, 5 + 20 * SIN(cc/150)^2 IF gesture.freeze(1) THEN mPlay Springers.channel, 37, 5 + 20 * SIN((cc + 50)/150)^2 IF gesture.freeze(2) THEN mPlay Springers.channel, 38, 5 + 20 * SIN((cc+100)/150)^2 'maybe add some lights ? END SUB SUB Edgy_ChordsB LOCAL basen AS SINGLE LOCAL n AS SINGLE LOCAL i AS LONG STATIC cc AS DWORD STATIC nc1 AS DWORD, nc2 AS DWORD, nc3 AS DWORD IF ISFALSE cc THEN Controller Vibi.channel, 123, 0 Controller Vibi.channel, 64, 0 Controller Vibi.channel, 24, 0 'ís the order of these important? Controller Vibi.channel, 23, 90 ProgChange Piano.channel, 123 END IF IF Gesture.edgy_dur(0)>2 THEN 'xy IF cc >= nc1 THEN basen = 24 + gesture.edgy(0) * 5 FOR i = 1 TO 1 + @pDoppler.xf / 10 n = 65 + i * 4 n = MatchSpecNote(n, basen, 1.5 - @pDoppler.xa) AddNote2Qhar Xy.Qhar(1), n, 90 * @pDoppler.xa NEXT QInstrumPlay Xy nc1 = cc + MAX(1, 20 - @pDoppler.xf/5) END IF END IF IF (cc MOD 2) THEN IF Gesture.edgy_dur(1)>2 THEN 'vibi IF cc >= nc2 THEN basen = 24 + gesture.edgy(1) * 5 FOR i = 1 TO 1 + @pDoppler.yf / 10 n = 60 + i * 4 n = MatchSpecNote(n, basen, 1.5 - @pDoppler.ya) AddNote2har Vibi.har(1), n, 127 * @pDoppler.ya NEXT nc2 = cc + MAX(1, 25 - @pDoppler.yf/5) END IF END IF InstrumPlay Vibi END IF IF Gesture.edgy_dur(2)>3 THEN 'piano IF cc >= nc3 THEN basen = 12 + gesture.edgy(2) * 5 FOR i = 1 TO 1 + @pDoppler.zf / 10 n = 36 + i * 5 n = MatchSpecNote(n, basen, 1.5 - @pDoppler.za) AddNote2har Piano.har(1), n, 10 + 117 * @pDoppler.za NEXT nc3 = cc + MAX(1, 30 - @pDoppler.zf/5) END IF END IF InstrumPlay Piano 'end if INCR cc END SUB 'nog iets op implode/explode? SUB Implode_woodB ' STATIC xtrig, ytrig, ztrig, lites AS LONG STATIC obwind AS SINGLE STATIC oboff AS DWORD, kornoff AS DWORD LOCAL xnoot, ynoot, znoot AS CURRENCY LOCAL trig AS LONG 'LOCAL i AS DWORD STATIC sens AS SINGLE STATIC cc AS DWORD STATIC obvol, obbend AS SINGLE STATIC kornvol, kornbend AS SINGLE STATIC basenote AS SINGLE STATIC specfac AS SINGLE IF ISFALSE Task(%gf8B).tog THEN 'sens = 0.117 '= 15 / 128.0 sens = 0.1 '0.001 '@pDoppler.noise '* 3 RESET xtrig, ytrig, ztrig, lites Controller Ob.channel, 17, 30 'normal = 72 Controller Ob.channel, 18, 30 Controller Ob.channel, 19, 120 Controller Heli.channel, 7, 64 obvol = 30 obbend = 64 basenote = 24 specfac = 1 Task(%gf8B).tog = %True EXIT SUB END IF INCR cc ' on decreasing body surface (shrinking), do something... ' sens = Slider(slnr).value / 128.0 ' values are normalised 'with identical scaling in the property assignation procedure: [18.04.2010] IF (ISFALSE(gesture.explo(0))) AND (gesture.implo(0)> @pDoppler.noise * 2.5) AND (@pDoppler.xf > 4.5) THEN 'noise * 2, as x vector was triggering much easier then y.. IF ((cc MOD 4) = 1) AND (@pDoppler.xa > .1) THEN ' logfile "öb" + str$(timegettime/1000) xnoot = MIN(Ob.lowtes + 2 + (gesture.implo(0)* 150), Ob.Hightes) xnoot = MatchSpecNote(xnoot, Basenote, Specfac) AddNote2Har Ob.Har(1), xnoot, 127 * MIN(1,SQR(Gesture.implo_val(0))) Oboff = timegettime + 2000 + 3000 * gesture.implo(0) 'min 1 sec before we put it off when prop is false, new notes can come faster InstrumPlay Ob END IF obvol = (2 * obvol + 27 + @pDoppler.xa * 100) / 3 Controller Ob.channel, 17, obvol 'high values seldomly occur during explosion obbend = MAX(0,(2 * obbend + 64 - @pDoppler.xf) / 3) Bend Ob.channel, obbend, obbend trig = 1 ELSE IF timegettime > ObOff THEN InstrumPlay Ob Bend Ob.channel, 64,64 END IF IF (ISFALSE(gesture.explo(1))) AND (gesture.implo(1)> @pDoppler.noise * 1.5) AND (@pDoppler.yf > 4.5) THEN IF ((cc MOD 5) = 1) AND (@pDoppler.xa > .1) THEN ' logfile "öb" + str$(timegettime/1000) xnoot = MIN(Korn.lowtes + 2 + (gesture.implo(0)* 150), Ob.Hightes) xnoot = MatchSpecNote(xnoot, Basenote, Specfac) #IF %DEF(%v_artbots2011) xnoot = MIN(xnoot, 91) AddNote2Har Heli.Har(1), xnoot, 127 * MIN(1,SQR(Gesture.implo_val(0))) InstrumPlay Heli #ELSE AddNote2Har Korn.Har(1), xnoot, 127 * MIN(1,SQR(Gesture.implo_val(0))) InstrumPlay Korn #ENDIF Kornoff = timegettime + 2000 + 3000 * gesture.implo(0) 'min 1 sec before we put it off when prop is false, new notes can come faster END IF kornvol = (2 * obvol + 27 + @pDoppler.xa * 100) / 3 #IF %DEF(%v_artbots2011) Controller Heli.channel, 17, obvol * .8 #ELSE Controller Korn.channel, 17, obvol 'high values seldomly occur during explosion #ENDIF kornbend = MAX(0,(2 * kornbend + 64 - @pDoppler.xf) / 3) #IF %DEF(%v_artbots2011) Bend Heli.channel, kornbend, kornbend #ELSE Bend Korn.channel, kornbend, kornbend #ENDIF trig = 1 ELSE #IF %DEF (%v_artbots2011) IF timegettime > kornOff THEN InstrumPlay Heli Bend Heli.channel, 64,64 #ELSE IF timegettime > kornOff THEN InstrumPlay korn Bend korn.channel, 64,64 #ENDIF END IF IF trig THEN ELSE specfac = .7 + RND * .6 END IF IF gesture.implo(3) > gesture.explo(3) THEN IF ISFALSE lites THEN lites = %True END IF ELSE IF lites THEN RESET lites END IF END IF END SUB SUB Explode_kwekB 'krum, trump, humanola STATIC basen AS SINGLE, specfac AS SINGLE LOCAL trig AS LONG LOCAL n AS LONG, i AS LONG STATIC sens AS SINGLE IF ISFALSE Task(%gf9b).tog THEN Task(%gf9b).tog = 1 MM_Humanola_On %MM_wind OR %MM_Motor MM_Trump_On %MM_wind OR %MM_Motor MM_Krum_On %MM_wind OR %MM_Motor basen = 48 specfac = 1 sens = .15 END IF IF (ISFALSE gesture.implo(0)) AND (gesture.explo(0)> sens) THEN logfile "ëxplo0:"+ STR$(gesture.explo(0)) logfile "xa:"+ STR$(@pDoppler.xa) INCR trig FOR i = 1 TO 1 + 8 * @pDoppler.xa n = Humanola.HighTes - 3 * i n = MatchSpecNote(n, basen, specfac) logfile "n:"+ STR$(n) AddNote2Har Humanola.Har(1), n, 20 NEXT END IF InstrumPlay Humanola IF (ISFALSE gesture.implo(1)) AND (gesture.explo(1)> sens) THEN INCR trig FOR i = 1 TO 1 + 8 * @pDoppler.ya n = Trump.HighTes - 3 * i n = MatchSpecNote(n, basen-12, specfac) AddNote2Har Trump.Har(1), n,20 NEXT END IF InstrumPlay Trump IF (ISFALSE gesture.implo(2)) AND (gesture.explo(2)> sens) THEN INCR trig FOR i = 1 TO 1 + 8 * @pDoppler.za n = Krum.HighTes - 3 * i n = MatchSpecNote(n, basen, specfac) AddNote2Har Krum.Har(1), n, 20 NEXT END IF InstrumPlay Krum IF ISFALSE trig THEN basen = 42 + RND * 8 specfac = .6 + RND * .8 END IF END SUB SUB punt 'íets met bellen op edgy?? LOCAL s AS LONG IF (Gesture.edgy_dur(0)>2) AND (@pDoppler.xa > .1) THEN ' INCR s mPlay Troms.channel, MIN(48, 24 + @pDoppler.xf/5), 127 * @pDoppler.xa END IF IF (gesture.edgy_dur(1) > 2) AND (@pDoppler.ya > .1) THEN INCR s mPlay Vacca.channel, 48 + @pDoppler.yf/3, 100 * @pDoppler.ya END IF IF (gesture.edgy_dur(2) > 2) AND (@pDoppler.za > .1) THEN INCR s mPlay Klung.channel, MIN(69, 49 + @pDoppler.zf/5), 127 * @pDoppler.za END IF IF s >= 2 THEN mPlay Belly.channel, MIN(102, 68 + MAX(@pDoppler.xf,@pDoppler.yf,@pDoppler.zf)/2), (@pDoppler.xa + @pDoppler.ya + @pDoppler.za) * 40 END IF Task(%punt).freq = MIN(20, 2 + MAX(@pDoppler.xf, @pDoppler.yf, @pDoppler.zf) / 12) END SUB SUB klungel STATIC cc AS LONG INCR cc SELECT CASE cc MOD 4 CASE 0: AddNote2Har Klung.Har(1), Klung.lowTes + 20 * SIN(cc/2000)^2, 20 + @pDoppler.xa * 90 CASE 1: AddNote2Har Klung.Har(1), Klung.lowTes + 20 * SIN(250 + cc/2000)^2, 20 + @pDoppler.ya * 90 CASE 2: AddNote2Har Klung.Har(1), Klung.lowTes + 20 * SIN(500 + cc/2000)^2, 20 + @pDoppler.za * 90 CASE 3: AddNote2Har Klung.Har(1), Klung.lowTes + 20 * SIN(750 + cc/2000)^2, 20 + @pDoppler.za * 90 END SELECT InstrumPlay Klung Task(%klu).freq = (8 * Task(%klu).freq + 6 + (@pDoppler.xf + @pDoppler.yf + @pDoppler.zf) / 6) / 9 END SUB ''===================== algemene procs SUB overt_mute 'mutes certain channels on no movement 'to do: solve bug in player where the quartertone half of the instrument keeps playing on mute.. STATIC track$ LOCAL maxf AS SINGLE LOCAL maxa AS SINGLE LOCAL i AS LONG STATIC stat AS LONG IF ISFALSE LEN(track$) THEN 'soecific for ouverture file.. track$=CHR$(1 TO 7, 13, 17, 18,19) 'slagwerk en piano - mute button id = 8000 + END IF IF ISFALSE Task(%mut).tog THEN Task(%mut).tog = 1 Slider(0).value = 10 SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value Slider(1).value = 4 SendMessage Slider(1).h, %TBM_SETPOS,%True, Slider(1).value Warning FUNCNAME$ + ": cockpit sliders for trigger level: 0 for amp, 1 for freq" CONTROL SET TEXT gh.cockpit, %GMT_TEXT_SLIDER0, "amp sens" CONTROL SET TEXT gh.cockpit, %GMT_TEXT_SLIDER1, "f sens" END IF maxf = MAX(@pDoppler.xf, @pDoppler.yf, @pDoppler.zf) maxa = MAX(@pDoppler.xa, @pDoppler.ya, @pDoppler.za) logfile "mxes"+ STR$(maxf) + STR$(maxa) IF maxa > Slider(0).value/100 AND maxf > Slider(1).value THEN IF stat THEN logfile "UNMUTE" CONTROL SET TEXT gh.cockpit, %GMT_AUTHOR, "UNMUTE stat = 0 MM_Sire_Off %MM_Lights FOR i = 1 TO LEN(track$) ' CONTROL SET CHECK TaskEx(App.MidiPlayerTasknr).hicon, 8000 + ASC(track$, i), 0 'this is not sufficient - we have to fake a click.. CONTROL SEND TaskEx(App.MidiPlayerTasknr).hicon, 8000 + ASC(track$, i), %BM_CLICK, 0, 0 NEXT END IF ELSE IF ISFALSE(stat) THEN stat = 1 CONTROL SET TEXT gh.cockpit, %GMT_AUTHOR, "MUTE logfile "MUTE" MM_Sire_On %MM_Lights FOR i = 1 TO LEN(track$) ' CONTROL SET CHECK TaskEx(App.MidiPlayerTasknr).hicon, 8000 + ASC(track$, i), 1 CONTROL SEND TaskEx(App.MidiPlayerTasknr).hicon, 8000 + ASC(track$, i), %BM_CLICK, 0, 0 NEXT END IF END IF END SUB SUB StartStop 'speel bij beweging, pauzeer bij stilstand LOCAL maxf AS SINGLE LOCAL maxa AS SINGLE STATIC stat AS LONG IF ISFALSE Task(%pzcnt).tog THEN Task(%pzcnt).tog = 1 Slider(0).value = 10 SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value Slider(1).value = 4 SendMessage Slider(1).h, %TBM_SETPOS,%True, Slider(1).value stat = 1 CONTROL SET TEXT gh.cockpit, %GMT_TEXT_SLIDER0, "amp sens" CONTROL SET TEXT gh.cockpit, %GMT_TEXT_SLIDER1, "f sens" Warning FUNCNAME$ + ": cockpit sliders for trigger level: 0 for amp, 1 for freq" END IF maxf = MAX(@pDoppler.xf, @pDoppler.yf, @pDoppler.zf) maxa = MAX(@pDoppler.xa, @pDoppler.ya, @pDoppler.za) IF maxa > Slider(0).value/100 AND maxf > Slider(1).value THEN IF ISFALSE stat THEN stat = 1 LOGFILE "cont" CALL DWORD Task(App.MidiPlayerTasknr).cptr USING dummyplayer (0, -1) ' staRT/çontinue.. MM_Sire_Off %MM_Lights END IF ELSE IF stat THEN stat = 0 logfile "pauze" CALL DWORD Task(App.MidiPlayerTasknr).cptr USING dummyplayer (0, 1) 'for pauze MM_Sire_On %MM_Lights END IF END IF END SUB SUB NoMovPlay 'omgekeerde startstop: speel op stilstand, pauze bij beweging LOCAL maxf AS SINGLE LOCAL maxa AS SINGLE STATIC stat AS LONG STATIC startt AS DWORD STATIC lastval AS SINGLE STATIC htrack AS DWORD LOCAL nv AS SINGLE IF ISFALSE Task(%nomovplay).tog THEN Task(%nomovplay).tog = 1 CONTROL HANDLE TaskEx(App.MidiPlayerTasknr).hicon, 2001 TO hTrack Slider(0).value = 20 SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value Slider(1).value = 10 SendMessage Slider(1).h, %TBM_SETPOS,%True, Slider(1).value Warning FUNCNAME$ + ": cockpit sliders for trigger level: 0 for amp, 1 for freq" CONTROL SET TEXT gh.cockpit, %GMT_TEXT_SLIDER0, "amp sens" CONTROL SET TEXT gh.cockpit, %GMT_TEXT_SLIDER1, "f sens" ' éxample how to update speed trackbar range [0-1000] // actually it seems only to update the bar visually, without triggering the callback!! ' SendMessage hTrack, %TBM_SETPOS, %true, 100 'we found no way to actually trigger the callback, but setting the playtask.rit.minduur works startt = timegettime END IF ''// ónly for test ' nv = 1 + MIN(1, (MAX(0, (timegettime - startt) )) / 36000) ' Task(App.MidiPlayerTasknr).rit.minduur = nv 'forcing rit.minduur from here is dirty, but it works.. ' nv = 1000 * SQR((nv-.2)/4.8) '. ======> none of the below did more then visually updating the slider without calling the callback.. ' SendMessage hTrack, %TBM_SETPOS, %true, nv 'visual update only!! ' control set text gh.cockpit, %GMT_TITLE, str$(nv) ' control set text gh.cockpit, %GMT_AUTHOR, str$(Task(App.MidiPlayerTasknr).rit.minduur) '' CONTROL SEND TaskEx(App.MidiPlayerTasknr).hicon, 2001, %TBM_SETPOS, %TRUE, int(nv) '' SendMessage htrack , %WM_HSCROLL, %SB_ENDSCROLL, 0 ', 0 ', 0 'force re-read ' '' control send TaskEx(App.MidiPlayerTasknr).hicon, 2001 , %WM_HSCROLL, int(nv * &H010000) + %TB_THUMBPOSITION, htrack ' CONTROL SEND TaskEx(App.MidiPlayerTasknr).hicon, 2001 , %WM_HSCROLL, 0, htrack ''// test done maxf = MAX(@pDoppler.xf, @pDoppler.yf, @pDoppler.zf) maxa = MAX(@pDoppler.xa, @pDoppler.ya, @pDoppler.za) IF maxa > Slider(0).value/100 AND maxf > Slider(1).value THEN 'was .1 en 4 IF ISFALSE stat THEN stat = 1 LOGFILE "pauze" CALL DWORD Task(App.MidiPlayerTasknr).cptr USING dummyplayer (0, 1) ' pauze 'specific noteoffs for walking bass.. MM_Sire_Off %MM_Lights MM_So_Off %MM_Notes MM_Qt_Off %MM_Notes MM_Piano_Off %MM_Notes MM_Korn_Off %MM_Notes MM_Fa_Off %MM_Notes END IF ELSE IF stat THEN stat = 0 logfile "cont" ' nv = 1 + MIN(1, (MAX(0, (timegettime - startt) - 20000)) / 360000) nv = 1 + MIN(1, (MAX(0, (timegettime - startt))) / 900000) CONTROL SET TEXT gh.cockpit, %GMT_AUTHOR, STR$(Task(App.MidiPlayerTasknr).rit.minduur) IF ABS(nv - lastval) > .02 THEN 'prevent too much updates on on/off flicker.. all timings are recalculated every time.. 'TO DO TO DO TO DO úpdate slider.. ' reverse formula of @pTask(@pApp.MidiPlayerTasknr).rit.minduur = .2 + 4.8 * (HIWRD(CBWPARAM)/1000)^2 ' message tos end?? window handle: @ptask(@pApp.MidiPlayerTasknr).@px.hIcon, tyrackbar id: 2001 / handle??? we dn't know here.. do we need to? lastval = nv Task(App.MidiPlayerTasknr).rit.minduur = nv 'forcing rit.minduur from here is dirty, but it works.. nv = 1000 * SQR((nv-.2)/4.8) SendMessage hTrack, %TBM_SETPOS, %true, nv 'update slider END IF CALL DWORD Task(App.MidiPlayerTasknr).cptr USING dummyplayer (0, -1) 'play MM_Sire_On %MM_Lights END IF END IF END SUB SUB SpeedUpSlowDown () STATIC spd AS SINGLE LOCAL maxf AS SINGLE LOCAL nv AS LONG STATIC htrack AS LONG IF ISFALSE Task(%spdslw).tog THEN CONTROL HANDLE TaskEx(App.MidiPlayerTasknr).hicon, 2001 TO hTrack 'window should be initialised before this task is started.. spd = 1 Task(%spdslw).tog = 1 END IF maxf = MIN(100, MAX(10, @pDoppler.xf, @pDoppler.yf, @pDoppler.zf)) 'scaling .5 - 2 'maxf = (maxf^.6666) / 10 'scaling 1 - 2 'maxf = (maxf^.33333) / 2 'gaat te snel omhoog1 maxf = 1 + (maxf - 10) / 90 logfile "raw:"+ STR$(maxf) spd = (10 * spd + maxf) / 11 logfile "spd:"+ STR$(spd) Task(App.MidiPlayerTasknr).rit.minduur = spd nv = 1000 * SQR((spd-.2)/4.8) SendMessage hTrack, %TBM_SETPOS, %true, nv 'update slider END SUB SUB gf_fileoff () 'noteoff only, for specific instruments MM_Piano_Off %MM_Notes MM_Ob_Off %MM_Notes MM_Autosax_Off %MM_Notes MM_Korn_Off %MM_Notes MM_Fa_Off %MM_Notes MM_Bono_Off %MM_Notes MM_Heli_Off %MM_Notes 'luistert niet?? controller heli.channel, 123, 1 MM_So_Off %MM_Notes MM_Bourdonola_Off %MM_Notes MM_Piperola_Off %MM_Notes MM_Qt_Off %MM_Notes MM_Harma_Off %MM_Notes MM_Harmo_Off %MM_Notes MM_Bomi_Off %MM_Notes MM_Spiro_Off %MM_Notes END SUB SUB dummyplayer(OPT BYVAL rst AS LONG, OPT BYVAL pause AS LONG) 'we only need declaration for call dword using.. END SUB