' *************************************************** ' * Namuda study 01.2017 * ' *************************************************** 'voor januari 2017 - beginnen '%edgtp = 16 %smtinti = 78 %sm2qt = 19 %impp = 20 %xpSpi = 21 %ccast = 22 %spxv =23 %slchi = 24 %d3pn = 25 %cllor = 27 ' gwr 18.10.2017 %ll48 = 28 %ll49 = 29 %ll50 = 30 %ll51 = 31 %ll52 = 32 %ll53 = 33 %ll54 = 34 %ll55 = 35 %ll56 = 36 %kcol_tinti = 37 %KoudChi_demod = 40 %koud_tinti = 38 %KoudChi_US = 39 ' has callback sliders for manual control %KoudChi_Expo = 41 %KoudChi_Shake = 42 %KoudChi_Vibrate = 43 ' surface mapping %KoudChi_Vibrate_F = 44 ' speed and accel. mapping %KoudChi_fmMod = 45 ' fm modulation gesture controlled %KoudChi_Amp = 46 ' surface mapping on demodulation amplitude ' manual test en control procedures: %KoudChi_Vib = 47 %Trill_Collision = 48 '%thcwd = 49 %trill_smhy = 50 %eisppos = 52 %eislspir = 53 %EiExplPosBo = 54 %eismpos = 55 %eicolpos = 56 %thcwd = 57 %edgtp = 58 FUNCTION init_begin AS LONG Task(%edgtp).naam ="EdgToyp" Task(%edgtp).freq = 12 Task(%edgtp).cptr = CODEPTR(B_EdgyToypi) Task(%impp).naam="ImplPuf" Task(%impp).freq = 14 Task(%impp).cptr = CODEPTR(B_ImploPuff) Task(%ccast).naam="ColCast" Task(%ccast).freq = 15 Task(%ccast).cptr = CODEPTR(B_collisionCasta) Task(%spxv).naam="SpXiVi" Task(%spxv).freq = 8 Task(%spxv).cptr = CODEPTR(B_SpeedXyVi) Task(%d3pn).naam="D3Piano" Task(%d3pn).freq = 10 Task(%d3pn).cptr = CODEPTR(B_d3pi) TaskEx(%d3pn).stopcptr = CODEPTR(MM_Piano_Off) Task(%thcwd).naam="ThcTmb" Task(%thcwd).freq= 9 Task(%thcwd).cptr = CODEPTR(B_TheaColWd) Task(%xpspi).naam="ExpSpir" Task(%xpspi).freq = 10 Task(%xpspi).cptr = CODEPTR(B_ExplSpi) TaskEx(%xpSpi).stopcptr = CODEPTR(MM_Spiro_Off) Task(%slchi).naam="SloChi" Task(%slchi).freq = 4 'controls shaking, so shouldn't go too fast Task(%slchi).cptr = CODEPTR(B_SloChi) TaskEx(%slchi).stopcptr = CODEPTR(MM_Chi_Off) Task(%smtinti).naam="SmtTint"' Task(%smtinti).freq = 5 Task(%smtinti).cptr = CODEPTR(B_SmTinti) TaskEx(%smtinti).stopcptr = CODEPTR(MM_Tinti_Off) Task(%sm2qt).naam="SmtQt"' Task(%sm2qt).freq = 5 Task(%sm2qt).cptr = CODEPTR(B_SmQt) TaskEx(%sm2qt).stopcptr = CODEPTR(MM_Qt_Off) Task(%cllor).naam="CoLlor" Task(%cllor).freq = 15 Task(%cllor).cptr = CODEPTR(B_collisionLlor) Task(%ll48).naam= "llor48" Task(%ll48).freq = 10 Task(%ll48).cptr = CODEPTR(Llor48) Task(%ll49).naam= "llor49" Task(%ll49).freq = 10 Task(%ll49).cptr = CODEPTR(Llor49) Task(%ll50).naam= "llor50" Task(%ll50).freq = 10 Task(%ll50).cptr = CODEPTR(Llor50) Task(%ll51).naam= "llor51" Task(%ll51).freq = 10 Task(%ll51).cptr = CODEPTR(Llor51) Task(%ll52).naam= "llor52" Task(%ll52).freq = 10 Task(%ll52).cptr = CODEPTR(Llor52) Task(%ll53).naam= "llor53" Task(%ll53).freq = 10 Task(%ll53).cptr = CODEPTR(Llor53) Task(%ll54).naam= "llor54" Task(%ll54).freq = 10 Task(%ll54).cptr = CODEPTR(Llor54) Task(%ll55).naam= "llor55" Task(%ll55).freq = 10 Task(%ll55).cptr = CODEPTR(Llor55) Task(%ll56).naam= "llor56" Task(%ll56).freq = 10 Task(%ll56).cptr = CODEPTR(Llor56) Task(%KoudChi_expo).naam = "Chiexpo" ' laukhuff shakes, with fixed demodulation Task(%KoudChi_expo).cptr = CODEPTR(KChi_expo) Task(%KoudChi_expo).freq = 20 Task(%KoudChi_expo).flags = %False TaskEX(%KoudChi_expo).stopcptr = CODEPTR(KChi_expo_stop) Task(%KoudChi_shake).naam = "ChiShake" ' laukhuff shakes, with fixed demodulation Task(%KoudChi_shake).cptr = CODEPTR(KChi_shake) Task(%KoudChi_shake).freq = 20 Task(%KoudChi_shake).flags = %False 'TaskEX(%KoudChi_shake).stopcptr = CODEPTR(KChi_expo_stop) Task(%KoudChi_fmMod).naam = "Chi_Mod" ' ringmodulator multiplier Task(%KoudChi_fmMod).cptr = CODEPTR(KChi_fmMod) ' gesture controlled on speed Task(%KoudChi_fmMod).freq = 18 Task(%KoudChi_fmMod).flags = %False Task(%KoudChi_Vibrate).naam = "Chi_VibS" ' gesture controlled vibrator Task(%KoudChi_Vibrate).cptr = CODEPTR(KChi_Vibrate) ' gesture controlled on body surface Task(%KoudChi_Vibrate).freq = 10 Task(%KoudChi_Vibrate).flags = %False TaskEX(%KoudChi_Vibrate).stopcptr = CODEPTR(KChi_Vibrate_stop) Task(%KoudChi_Vibrate_F).naam = "Chi_VibF" ' gesture controlled vibrator Task(%KoudChi_Vibrate_F).cptr = CODEPTR(KChi_Vibrate_F) ' gesture controlled on speed and accelleration Task(%KoudChi_Vibrate_F).freq = 10 Task(%KoudChi_Vibrate_F).flags = %False TaskEX(%KoudChi_Vibrate_F).stopcptr = CODEPTR(KChi_Vibrate_stop) Task(%KoudChi_Vib).naam = "Chi_Vibr" Task(%KoudChi_Vib).cptr = CODEPTR(KChi_Vib) Task(%KoudChi_Vib).freq = 10 Task(%KoudChi_Vib).flags = %False TaskEX(%KoudChi_Vib).stopcptr = CODEPTR(KChi_Vibrate_stop) Task(%KoudChi_Demod).naam = "Demod" Task(%KoudChi_Demod).cptr = CODEPTR(KChi_Demod) Task(%KoudChi_Demod).freq = 25 Task(%KoudChi_Demod).flags = %False Task(%KoudChi_US).naam = "Freq" Task(%KoudChi_US).cptr = CODEPTR(KChi_US) Task(%KoudChi_US).freq = 4 Task(%KoudChi_US).pan = 0 ' used for pitchbend msb Task(%KoudChi_US).level = 0 ' used for pitchbend lsb Task(%KoudChi_US).flags = %False Task(%KoudChi_Amp).naam = "Ampli" ' interactive amplitude on body surface Task(%KoudChi_Amp).cptr = CODEPTR(KChi_Amp) Task(%KoudChi_Amp).freq = 20 Task(%KoudChi_Amp).flags = %False Task(%koud_tinti).naam="SpuTinti" Task(%koud_tinti).freq = 8 Task(%koud_tinti).cptr = CODEPTR(koud_tinti) TaskEx(%Gebroed_spd).stopcptr = CODEPTR(MM_Tinti_Off) Task(%kcol_tinti).naam= "TintiCol" Task(%kcol_tinti).cptr = CODEPTR(kcol_tinti) Task(%kcol_tinti).freq = 18 Task(%Trill_Collision).naam = "CollPerc" Task(%Trill_Collision).cptr = CODEPTR(Trill_Collision) Task(%Trill_Collision).freq = 40 '256 '128 '72 Task(%Trill_Collision).flags = %PERTIM_Task ' %False Task(%trill_smhy).naam = "Smthybr" 'voor trilplaat concert Task(%trill_smhy).freq = 8 Task(%trill_smhy).cptr = CODEPTR(Smthhybr) Task(%eisppos).naam = "SpdPos" Task(%eisppos).freq = 12 Task(%eisppos).cptr = CODEPTR(Ei_SpPos) Task(%eislspir).naam = "SlSpir" Task(%eislspir).freq = 7 Task(%eislspir).cptr = CODEPTR(Ei_slSpir) Task(%EiExplPosBo).naam = "XplPosBo" Task(%EiExplPosBo).freq = 9 Task(%EiExplPosBo).cptr = CODEPTR(Ei_ExplPosBo) Task(%eismpos).naam = "SmPos" Task(%eismpos).freq = 4 Task(%eismpos).cptr = CODEPTR(Ei_SmPos) Task(%eicolpos).naam = "ColPos" Task(%eicolpos).freq = 5 Task(%eicolpos).cptr = CODEPTR(Ei_ColPos) Pos_.hightes = 127 'ávoid lights being filtered out from har FUNCTION = 1 END FUNCTION SUB B_EdgyToypi () 'toypi STATIC noot AS CURRENCY STATIC wind AS SINGLE STATIC trig AS SINGLE IF ISFALSE trig THEN trig = .1 END IF IF gesture.edgy_dur(3) THEN 'if edgy, we select the piano IF @pDoppler.xa > trig THEN noot = MIN(toypi.lowtes + 3 + (gesture.edgy(0) *28 ), toypi.hightes) AddNote2Har Toypi.Har(1), noot,@pDoppler.xa * 100 END IF IF @pDoppler.ya > trig THEN noot = MIN(toypi.lowtes + 3 + (gesture.edgy(1) *28 ), toypi.hightes) AddNote2Har Toypi.Har(1), noot,@pDoppler.xa * 100 END IF IF @pDoppler.za >trig THEN noot = MIN(toypi.lowtes + 3 + (gesture.edgy(2) *28 ), toypi.hightes) AddNote2Har Toypi.Har(1), noot,@pDoppler.xa * 100 END IF InstrumPlay Toypi MM_Toypi_On %MM_Lights ELSE MM_Toypi_Off END IF END SUB SUB B_ImploPuff () STATIC trig AS SINGLE IF ISFALSE trig THEN trig = .1 END IF IF (@pDoppler.xa > trig) AND (ISFALSE(gesture.explo(0))) AND (gesture.implo(0)> @pDoppler.noise) THEN AddNote2Har Puff.har(1), 55 + @pDoppler.xf/10, 2 + SQR(@pDoppler.xa) * 30 END IF IF (@pDoppler.ya > trig) AND (ISFALSE(gesture.explo(1))) AND (gesture.implo(1)> @pDoppler.noise) THEN AddNote2Har Puff.har(1), 55 + @pDoppler.yf/10, 2 + SQR(@pDoppler.ya) * 30 END IF IF (@pDoppler.za > trig) AND(ISFALSE(gesture.explo(2))) AND (gesture.implo(2)> @pDoppler.noise) THEN AddNote2Har Puff.har(1), 55 + @pDoppler.zf/10, 2 + SQR(@pDoppler.za) * 0 END IF InstrumTransposeToRange Puff, 55, 96 InstrumPlay Puff END SUB SUB B_collisionCasta () STATIC sens AS SINGLE STATIC cc AS DWORD IF ISFALSE sens THEN sens = 1.2 '1.8 - was te ongevoelig voor wat emilie er op deed END IF IF Gesture.collision(2) > sens THEN mPlay Casta2.channel, Casta2.LowTes + (cc MOD 16), 10 + @pDoppler.za * 30 END IF IF Gesture.collision(1) > sens THEN mPlay Casta.channel, Casta.LowTes + (cc MOD 15), 40 + @pDoppler.ya * 87 END IF IF Gesture.collision(0) > sens THEN mPlay Temblo.channel, 72 + cc MOD 6, + 40 + @pDoppler.xa * 87 END IF INCR cc END SUB SUB B_collisionLlor () ' moet anders: hoogte bel moet funktie zijn van beweging... STATIC sens AS SINGLE STATIC cc, cnt AS DWORD IF ISFALSE sens THEN sens = 1.2 END IF IF Gesture.collision(2) > sens THEN mPlay Llor.channel, Llor.LowTes + (cc MOD 25), 10 + @pDoppler.za * 30 END IF IF Gesture.collision(1) > sens THEN mPlay Llor.channel, Llor.LowTes + (cc MOD 25), 40 + @pDoppler.ya * 87 END IF IF Gesture.collision(0) > sens THEN mPlay Llor.channel, Llor.lowtes + 12 + (cc MOD 12), + 40 + @pDoppler.xa * 87 END IF INCR cc END SUB SUB B_SpeedXyVi () 'repeats on toypi/xy/vibi STATIC sens AS SINGLE STATIC nx AS CURRENCY, ny AS CURRENCY IF ISFALSE sens THEN sens = 18 MM_Xy_On END IF IF gesture.speedup(0) > gesture.slowdown(0) + sens THEN ' logfile str$(gesture.speedup(2)) nx = MIN(Vibi.HighTes,(3 * nx + Vibi.Lowtes + (gesture.speedup(0) - sens) / 2) / 4) mPlay Vibi.channel, nx, @pDoppler.xa * 127 ELSE nx = Vibi.LowTes + RND * 5 END IF IF gesture.speedup(1) > gesture.slowdown(1) + sens THEN ny = MIN(Xy.HighTes, (3 * ny + 65 + (gesture.speedup(1) - sens) / 2) / 4) mPlay Xy.channel, ny, 15 + @pDoppler.ya * 100 ELSE ny = Xy.LowTes + RND * 5 END IF END SUB SUB B_d3pi () '"jerk" STATIC cc AS DWORD LOCAL sens AS SINGLE IF ISFALSE cc THEN Slider(0).value = 15 ' 63 '90 '64 '40 '2 '64 SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value warning "slider 0 for piano trigger level" cc = 1 END IF ' INCR cc logfile "d3" + STR$(Gesture.ds3(0))+ STR$(Gesture.ds3(1))+ STR$(Gesture.ds3(2)) sens = Slider(0).value / 100 CONTROL SET TEXT gh.cockpit, %GMT_MSG1, "trig:" + STR$(sens) ' IF BIT(cc, 0) THEN IF gesture.ds3(0) > sens THEN AddNote2Har Piano.Har(1), 24 + 24 * (gesture.ds3(0) - .2), @pDoppler.xa * 100 IF gesture.ds3(1) > sens THEN AddNote2Har Piano.Har(1), 48 + 24 * (gesture.ds3(1) - .2), @pDoppler.ya * 100 IF gesture.ds3(2) > sens THEN AddNote2Har Piano.Har(1), 72 + 24 * (gesture.ds3(3) - .2), @pDoppler.za * 100 ' END IF InstrumPlay Piano END SUB SUB B_TheaColWd () STATIC c1 AS LONG, c2 AS LONG IF ((@pDoppler.xa > .05) AND (gesture.theacol(0) > .03)) THEN c1 = c1 + 5 IF (c1 > 6) AND (c1 < 12) THEN c1 = c1 + 6 c1 = c1 MOD 18 ' mPlay Temblo.channel, Temblo.lowtes + c1, @pDoppler.xa * 127 IF ((@pDoppler.xa > .15) AND (gesture.theacol(0) > .13)) THEN mPlay thunderwood.channel, 1 + c2, @pDoppler.ya * 127 mPlay thunderwood.channel, 19, @pDoppler.ya * 127 END IF IF ((@pDoppler.ya > .05) AND (gesture.theacol(1) > .03)) THEN c2 = (c2 + 4) MOD 13 IF ((@pDoppler.ya > .15) AND (gesture.theacol(1) > .13)) THEN mPlay thunderwood.channel, 1 + c2, @pDoppler.ya * 127 mPlay thunderwood.channel, 19, @pDoppler.ya * 127 END IF END SUB SUB B_ExplSpi () 'piano LOCAL note AS CURRENCY IF (ISFALSE gesture.implo(0)) AND (gesture.explo(0)> @pDoppler.noise * 3) AND (@pDoppler.xf > 30) THEN note = Spiro.LowTes + gesture.Explo(0) * 130 AddNote2Har Spiro.Har(1), note, 100 AddNote2Har Spiro.Har(1), note + 3 + INT(RND * 3), 100 END IF IF (ISFALSE gesture.implo(1)) AND (gesture.explo(1)> @pDoppler.noise * 3) AND (@pDoppler.yf > 30) THEN note = Spiro.LowTes + gesture.Explo(1) * 130 AddNote2Har Spiro.Har(1), note, 100 AddNote2Har Spiro.Har(1), note + 3 + INT(RND * 3), 100 END IF IF (ISFALSE gesture.implo(2)) AND (gesture.explo(2)> @pDoppler.noise * 3) AND (@pDoppler.zf > 30) THEN note = Spiro.LowTes + gesture.Explo(2) * 130 AddNote2Har Spiro.Har(1), note, 100 AddNote2Har Spiro.Har(1), note + 3 + INT(RND * 3), 100 END IF InstrumTransposeToRange Spiro InstrumPlay Spiro END SUB SUB B_SloChi () STATIC non AS DWORD 'why does modulation not work? cc 65,7,8 and 31 should be enough?? IF ISFALSE Task(%slChi).tog THEN Controller Chi.channel, 66,127 Controller Chi.channel, 65, 127 ' Chi.ctrl(31) = 60 Controller Chi.channel, 31, Chi.ctrl(31) Controller Chi.channel, 7, 120 Controller Chi.channel, 8, 110 Task(%slchi).tog = %True END IF ' shake on slowdown IF Gesture.slowdown(3) > Gesture.speedup(3) + 1 THEN KeyPress Chi.channel, 98, MIN(127, @pDoppler.xf + @pDoppler.yf) mPlay Chi.channel, 98, MIN((@pDoppler.xa + @pDoppler.ya) * 63, 127) Chi.ctrl(31) = (3 * Chi.ctrl(31) + MIN(76, @pDoppler.xf + @pDoppler.yf)) / 4 Controller Chi.channel, 31, chi.ctrl(31) ' logfile "cc31"+ str$(chi.ctrl(31)) 'values ar eok non = 1 ELSEIF non THEN NoteOff Chi.channel, 98 non = 0 END IF END SUB SUB B_SmTinti () STATIC n AS INTEGER STATIC mtv AS SINGLE IF ISFALSE n THEN n = tinti.lowtes MM_Tinti_On Controller Tinti.channel, 66,127 Controller Tinti.channel, 65, 127 controller Tinti.channel, 7, 100 Controller Tinti.channel, 8, 100 controller Tinti.channel, 30, 90 Tinti.ctrl(31) = 10 mtv = .1 'amp trigger value (freeze itself is 0/1 END IF IF (gesture.smooth_dur(3)) AND (MAX(@pDoppler.xa, @pdoppler.ya, @pDoppler.za) > .1) THEN AddNote2Har Tinti.Har(1), n, MAX(@pDoppler.xa, @pdoppler.ya, @pDoppler.za) * 100 n = n + CHOOSE(1 + INT(RND * 4), -1, 0 ,0, 1) IF n < Tinti.Lowtes THEN n = n + 12 IF n > Tinti.Hightes THEN n = n - 12 END IF InstrumPlay Tinti Tinti.ctrl(31) = (3 * Tinti.ctrl(31) + MIN(28, @pDoppler.xf + @pDoppler.yf)) / 4 controller Tinti.channel, 31, Tinti.ctrl(31) END SUB SUB B_Smqt () ' moduleren? STATIC cont AS LONG IF (gesture.smooth_dur(3)) AND (MAX(@pDoppler.xa, @pdoppler.ya, @pDoppler.za) > .1) THEN ' Qt.Qhar(1).vel = Qt.Qhar(0).vel AddNote2qHar Qt.qhar(1), MIN(qt.HighTes, Qt.LowTes + .7 * SQR(@pDoppler.xf)), 20 AddNote2QHar Qt.Qhar(1), MIN(qt.HighTes,Qt.LowTes + .7 * SQR(@pDoppler.yf)), 20 AddNote2Qhar Qt.Qhar(1), MIN(qt.HighTes,Qt.LowTes + .7 * SQR(@pDoppler.zf)), 20 AddNote2qHar Qt.qhar(1), MIN(qt.HighTes,Qt.LowTes + @pDoppler.xf/2), 20 AddNote2QHar Qt.Qhar(1), MIN(qt.HighTes,Qt.LowTes + @pDoppler.yf/2), 20 AddNote2Qhar Qt.Qhar(1), MIN(qt.HighTes,Qt.LowTes + @pDoppler.zf/2), 20 QInstrumPlay Qt INCR cont cont = MIN(cont, 100) ELSE ' warning "reset" + str$(timegettime) ' Qt.Qhar(0).vel = "" IF cont THEN DECR cont IF ISFALSE cont THEN QInstrumPlay Qt END IF END IF CONTROL SET TEXT gh.cockpit, %GMT_MSG1, STR$(cont) CONTROL SET TEXT gh.cockpit, %GMT_MSG2, STR$(MAX(@pDoppler.xa, @pdoppler.ya, @pDoppler.za)) controller Qt.Channel, 7, 13 + (@pDoppler.xa + @pDoppler.ya + @pDoppler.za) * 30 END SUB '***'quick and dirty soft note repeats on llor for Herst 2017 SUB Llor48 () Task(%ll48).freq = MAX(4, MIN(20, Slider(0).value/8)) mPlay Llor.channel, 48, 14 END SUB SUB Llor49 () Task(%ll49).freq = MAX(4, MIN(20, Slider(0).value/7)) mPlay Llor.channel, 49, 14 END SUB SUB Llor50 Task(%ll50).freq = MAX(4, MIN(20, Slider(0).value/7.5)) mPlay Llor.channel, 50, 20 END SUB SUB Llor51 () Task(%ll51).freq = MAX(4, MIN(20, Slider(0).value/8.5)) mPlay Llor.channel, 51, 18 END SUB SUB Llor52 () Task(%ll52).freq = MAX(4, MIN(20, Slider(0).value/7.3)) mPlay Llor.channel, 52, 32 END SUB SUB Llor53 () Task(%ll53).freq = MAX(4, MIN(20, Slider(0).value/6.5)) mPlay Llor.channel, 53, 18 END SUB SUB Llor54 () Task(%ll54).freq = MAX(4, MIN(20, Slider(0).value/7.7)) mPlay Llor.channel, 54, 18 END SUB SUB Llor55 () Task(%ll55).freq = MAX(4, MIN(20, Slider(0).value/6.8)) mPlay Llor.channel, 55, 40 END SUB SUB Llor56 () Task(%ll56).freq = MAX(4, MIN(20, Slider(0).value/7.5)) mPlay Llor.channel, 56, 18 END SUB SUB KChi_Expo () '03.04.2016: works o.k. but needs some fine tuning ' start interaction on gesture ' audio fade in. '17.04.2016: improved. STATIC cnt, cnt1, noteflag ,kp, freq AS DWORD STATIC t AS SINGLE IF ISFALSE Task(%KoudChi_Expo).tog THEN ' set ultrasonic demodulation frequency to a value without interference with ' the 40kHz invisible instrument t = timegettime Controller Chi.channel, 31, 48 Bend Chi.channel, 5, 12 ' lsb 0 to 11 is ok, msb 12 ' if we want to manualy modulate this, we need the %KoudChi_US task on ' therefore we have to publish these values to that task: Chi.ctrl(31) = 48 Task(%KoudChi_US).pan = 12 'msb Task(%KoudChi_US).level = 5 'lsb IF ISFALSE Task(%KoudChi_US).tog THEN starttask %KoudChi_US freq = Chi_GetFreq (48, 12, 5) ' in g_file dll Controller Chi.channel, 7, %False ' volume uit Controller Chi.channel, 8, 2 Chi.ctrl(7) = %False Chi.ctrl(8) = 2 'Chi.ctrl(31) = 48 Controller Chi.channel, 65, 127 ' mute off, audio on Chi.ctrl(65) = 127 RESET cnt, cnt1, noteflag, kp logfile " expo start " & STR$((timegettime - t)/1000) ' can give negative values!!! logfile " Frequency = " & STR$(freq) & " Hz Time=" & TIME$ Task(%KoudChi_Expo).tog = %True END IF ' shaking as a function of gesture IF Gesture.speedup(3) > Gesture.slowdown(3) + 1 THEN IF MIN(Gesture.speedup(3), 127) <> kp THEN kp = MIN(Gesture.speedup(3), 127) ' shaking frequency as a function of accelleration KeyPress Chi.channel, 98, kp END IF mPlay Chi.channel, 98, MIN((@pDoppler.xa + @pDoppler.ya) * 63, 127) ' amplitude as function of surface noteflag = %True ELSE IF noteflag THEN NoteOff Chi.channel, 98 RESET noteflag END IF END IF SELECT CASE cnt CASE %False ' fade in INCR cnt1 IF cnt1 < 128 THEN Task(%KoudChi_Expo).freq = 2 ' takes about 30" Controller Chi.channel, 7, cnt1 ' volume Chi.ctrl(7) = cnt1 IF 2 + (cnt1/2) <> Chi.ctrl(8) THEN Controller Chi.channel, 8, MIN(127,2 + (cnt1/2)) ' carrier volume pwm Chi.ctrl(8) = MIN(127,2 + (cnt1/2)) END IF ELSE INCR cnt logfile " intro end of the fade in " & STR$((timegettime - t)/1000) EXIT SUB END IF CASE ELSE stoptask %KoudChi_Expo END SELECT END SUB SUB KChi_Expo_Stop () NoteOff Chi.channel, 98 ' stop shaking Keypress Chi.channel, 98, %False ' reset the shaking frequency IF ISFALSE Task(%KoudChi_Shake).tog THEN starttask %KoudChi_Shake IF ISFALSE Task(%KoudChi_US).tog THEN starttask %KoudChi_US END SUB SUB KChi_fmMod () ' with gesture controlled modulation of the carrier frequency ' Fmod ~ 1/speed ' the higher the body movement the lower the modulation frequency ' moving the chimes should make use of a separate task for shaking, for vibrating or for motor command. ' 09.04.2016: Integration added. ' 10.04.2016: test and debug session ' 17.04.2016: sliders added , start with large integration values STATIC f, sf AS SINGLE STATIC msb, lsb, cc31 AS BYTE STATIC oldpb AS WORD STATIC slnr, minf, maxf AS LONG IF ISFALSE Task(%KoudChi_fmMod).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Freq" TaskParamLabels(1) = "Integ" IF ISFALSE Task(%KoudChi_fmMod).hParam THEN slnr = %False MakeTaskParameterDialog %KoudChi_fmMod,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%KoudChi_fmMod).SliderNumbers(0) Slider(slnr).value = 20 Slider(slnr).minval = 1 Slider(slnr).maxval = 100 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value ' taskfrequency Slider(slnr+1).value = 100 Slider(slnr+1).minval = 1 Slider(slnr+1).maxval = 120 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value 'integration depth END IF Task(%KoudChi_fmMod).freq = Slider(slnr).value ' =20 logfile " Chi_fmMod started " & TIME$ Controller Chi.channel, 65, 127 ' mute off, audio on chi.ctrl(65) = 127 sf = Slider(slnr+1).value ' integration parameter maxf = 0 minf = 40000 'f = 37479 - (2489 + (gesture.fixspeed_val(3) * 166)) ' fixspeed_val range:0-200, *166 = 0-33200 f = 37479 - (2489 + (gesture.fixspeed_val(3) * 360)) ' fixspeed_val range:0-200, *166 = 0-33200 IF Task(%KoudChi_US).tog THEN stoptask %KoudChi_US ' stops only the display of freqs in the cockpit ' the task sliders are served in callback's Task(%KoudChi_fmMod).tog = %True END IF sf = Slider(slnr+1).value ' integratie diepte 'f = ((f * (sf-1)) + (37479 - (2489 + (gesture.fixspeed_val(3) * 166)))) / sf ' checked: does not go lower than 14900 Hz. f = ((f * (sf-1)) + (37479 - (2489 + (gesture.fixspeed_val(3) * 360)))) / sf IF f < 2489 THEN EXIT SUB ' omrekening naar waarden voor CC31, msb en lsb: cc31 = Chi_SetFreq (f, msb, lsb) ' lib function in g_file.dll IF cc31 THEN IF cc31 <> Chi.ctrl(31) THEN Controller Chi.channel, 31, cc31 Chi.ctrl(31) = cc31 Bend Chi.channel, lsb, msb ' for debug only: IF f > maxf THEN logfile " max frequency = " & STR$(INT(f)) & " time= " & TIME$ maxf = f END IF IF f < minf THEN logfile " min frequency = " & STR$(INT(f)) & " time= " & TIME$ minf = f END IF ELSE IF (msb * 128) + lsb <> oldpb THEN oldpb = (msb * 128) + lsb Bend Chi.channel, lsb, msb IF f > maxf THEN logfile " max frequency = " & STR$(INT(f)) & " time= " & TIME$ maxf = f END IF IF f < minf THEN logfile " min frequency = " & STR$(INT(f)) & " time= " & TIME$ minf = f END IF END IF END IF ELSE ' should we reset? END IF ' we can modulate the amplitude as well with ctr 7 and 8 with Chi_Amp Task(%KoudChi_fmMod).freq = slider(slnr).value END SUB SUB KChi_Vibrate () ' here the vibrator should be controlled by global body surface movement STATIC t,cnt AS DWORD STATIC vibr_minvel, vibr_maxvel AS INTEGER STATIC vel, oldvel, oldpres AS BYTE IF ISFALSE Task(%KoudChi_Vibrate).tog THEN vibr_minvel = 30 '40 vibr_maxvel = 52 '105 t = timegettime RESET cnt logfile " Chi_Vibrate on surface data started " & TIME$ 'STR$((timegettime - t)/1000) Task(%KoudChi_Vibrate).tog = %True END IF vel = MIN(vibr_minvel + (gesture.flue_val(3) * (vibr_maxvel- vibr_minvel)), 127) IF ISFALSE cnt THEN IF vel <> oldpres THEN Keypress Chi.channel, 99, vel oldpres = vel END IF ELSE IF vel <> oldvel THEN mPlay Chi.channel, 99, vel oldvel = vel END IF END IF INCR cnt cnt = cnt MOD 2 END SUB SUB KChi_Vibrate_F () ' here the vibrator should be controlled by global speed of movement and acceleration STATIC t,cnt AS DWORD STATIC vibr_minvel, vibr_maxvel AS INTEGER LOCAL vel, pres AS BYTE STATIC oldvel, oldpres AS BYTE IF ISFALSE Task(%KoudChi_Vibrate_F).tog THEN vibr_minvel = 30 '40 vibr_maxvel = 52 '105 t = timegettime RESET cnt logfile " Chi_Vibrate_F on speed and accelleration started " & TIME$ 'STR$((timegettime - t)/1000) Task(%KoudChi_Vibrate_F).tog = %True END IF vel = MIN(vibr_minvel + (gesture.velocity(3) * (vibr_maxvel- vibr_minvel)), 127) ' gesture.velocity is normalized pres = MAX(0,MIN(vibr_minvel + (gesture.accelleration(3) * (vibr_maxvel- vibr_minvel)), 127)) ' positive max. normalized IF ISFALSE cnt THEN IF pres <> oldpres THEN Keypress Chi.channel, 99, pres oldpres = pres END IF ELSE IF vel <> oldvel THEN mPlay Chi.channel, 99, vel oldvel = vel END IF END IF INCR cnt cnt = cnt MOD 2 END SUB SUB KChi_Vibrate_Stop () ' common stop proc. for vibrator tasks Keypress Chi.channel, 99, %False ' should also cause a note-off NoteOff Chi.channel, 99 Controller Chi.channel, 7, 0 logfile " Chi_Vibrate stop at " & TIME$ END SUB SUB KChi_Shake () ' Laukhuff solenoid ' as in expo task ' can follow after the end of expo. Start is automated after expo. ' shaking as a function of gesture accel en decel STATIC kp, sens, noteflag AS DWORD IF ISFALSE Task(%KoudChi_Shake).tog THEN RESET kp sens = 3 Task(%KoudChi_Shake).tog = %True END IF IF Gesture.speedup(3) > Gesture.slowdown(3) + sens THEN IF MIN(Gesture.speedup(3), 127) <> kp THEN kp = MIN(Gesture.speedup(3), 127) KeyPress Chi.channel, 98, kp END IF mPlay Chi.channel, 98, MIN((@pDoppler.xa + @pDoppler.ya) * 63, 127) noteflag = %True ELSE IF noteflag THEN NoteOff Chi.channel, 98 RESET noteflag END IF END IF END SUB SUB KChi_Vib () ' mapped on note 99 - vibrator motor ' steered with slow pwm via solid state opto-relay on AC (velo byte) ' key pressure implemented for automatic repeats ' task to be called by other processes. ' this procedure is not interactive! STATIC note, velo, keypres AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%KoudChi_vib).tog THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Velo" TaskParamLabels(1) = "K-pres" IF ISFALSE Task(%KoudChi_vib).hParam THEN slnr = %False MakeTaskParameterDialog %KoudChi_Vib,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%KoudChi_Vib).SliderNumbers(0) Slider(slnr).value = 10 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 0 END IF note = 99 Task(%KoudChi_Vib).tog = %True END IF IF velo <> Slider(slnr).value THEN mPlay Chi.channel, note,slider(slnr).value velo = slider(slnr).value END IF IF keypres <> Slider(slnr+1).value THEN keypres = Slider(slnr+1).value Keypress Chi.channel, note, keypres END IF END SUB SUB KChi_Demod () ' test controller 7 and 8 ' controls the VCA and the mute switch ' manual! ' the interactive procedure is Chi_Amp! ' do not use both tasks together! ' 17.04.2016: modified to work with callback sliders LOCAL velo AS INTEGER STATIC slnr, udnr AS DWORD IF ISFALSE Task(%KoudChi_Demod).tog THEN DIM TaskParamLabels(2) AS ASCIIZ * 8 TaskParamLabels(0) = "Volume" TaskParamlabels(1) = "cc8" TaskParamlabels(2) = "Mute" IF ISFALSE Task(%KoudChi_Demod).hParam THEN slnr = %False MakeTaskParameterDialog %KoudChi_demod,2,Slider(),1,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%KoudChi_Demod).SliderNumbers(0) Slider(slnr).value = Chi.ctrl(7) Slider(slnr).cptr = CODEPTR(C7_slider) SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = Chi.ctrl(8) slider(slnr+1).cptr = CODEPTR(c8_slider) SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE udnr THEN udnr = TaskEX(%KoudChi_Demod).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(KChi_Mute) IF Chi.ctrl(65) THEN UDCtrl(udnr).value = 1 ELSE UDCtrl(udnr).value = %False END IF UDctrl(udnr).maxval = 1 UDctrl(udnr).minval = 0 END IF ' MM_Chi_On Task(%KoudChi_Demod).tog = %True END IF IF Slider(slnr).value <> Chi.ctrl(7) THEN Chi.ctrl(7) = Slider(slnr).value controller Chi.channel, 7, Chi.ctrl(7) END IF IF Slider(slnr+1).value <> Chi.ctrl(8) THEN Chi.ctrl(8) = Slider(slnr+1).value controller Chi.channel, 8, Chi.ctrl(8) END IF END SUB SUB KChi_Mute () ' controls the mute switch LOCAL udnr AS DWORD LOCAL mute AS BYTE udnr = TaskEX(%KoudChi_Demod).UpDownNumbers(0) mute = UDCtrl(udnr).value SetDlgItemText Task(%KoudChi_Demod).hparam, %GMT_TEXT0_ID + 16, "Mute=" & STR$(mute) Controller Chi.channel, 65, mute Chi.ctrl(65) = mute END SUB SUB KChi_US () ' controller 31 and pitchbend ' controls the base frequency for the ultrasound emitter / demodulator ' in chromatic steps. cfr. Chi webpage. ' with sliders for pitchbend in 14 bits ' should not be used together with Chi_fmMod. ' callback sliders added such that combined functions become possible STATIC slnr, flag, lsb, msb, freq AS DWORD STATIC note AS CUR IF ISFALSE Task(%KoudChi_US).tog THEN DIM TaskParamLabels(2) AS ASCIIZ * 8 TaskParamLabels(0) = "CC31" TaskParamlabels(1) = "msb" TaskParamlabels(2) = "lsb" IF ISFALSE Task(%KoudChi_US).hParam THEN slnr = %False MakeTaskParameterDialog %KoudChi_US,3,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%KoudChi_US).SliderNumbers(0) IF ISFALSE Chi.ctrl(31) THEN Slider(slnr).value = 76 ' operational range is 39 to 76 Chi.ctrl(31) = 76 Controller Chi.channel, 31, 76 ELSE Slider(slnr).value = Chi.ctrl(31) END IF Slider(slnr).minval = 39 Slider(slnr).maxval = 76 Slider(slnr).cptr = CODEPTR(C31_slider) SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = Task(%KoudChi_US).pan ' misuse of these fields -msb Slider(slnr+1).cptr = CODEPTR(msb_slider) SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value Slider(slnr+2).value = Task(%KoudChi_US).level ' lsb Slider(slnr+2).cptr = CODEPTR(lsb_slider) SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, Slider(Slnr+2).value ' Controller Chi.channel, 31, 76 ' Bend Chi.channel, 0, 0 RESET lsb, msb, flag END IF Task(%KoudChi_US).tog = %True END IF IF Slider(slnr).value <> Chi.ctrl(31) THEN Chi.ctrl(31) = Slider(slnr).value ' controller Chi.channel, 31, Chi.ctrl(31) END IF IF slider(slnr+1).value <> msb THEN msb = slider(slnr+1).value flag = %True END IF IF slider(slnr+2).value <> lsb THEN lsb = slider(slnr+2).value flag = %True END IF IF flag THEN Bend Chi.channel, lsb, msb END IF ' we can calculate the exact frequency now as: freq = Chi_GetFreq (Chi.ctrl(31), msb, lsb) ' and display it: SetDlgItemText gh.Cockpit, %GMT_MSG1, "Freq= " & STR$(freq) note = F2NF (freq) SetDlgItemText gh.Cockpit, %GMT_MSG2, "N=" & FORMAT$(note,"###.##") END SUB SUB KChi_Amp () ' amplitude of the demodulation controlled by moving body surface ' 10.04.2016: debug session ' must use long integration times ' 17.04.2016: Improvement is possible here. STATIC cc7, cc8 AS SINGLE STATIC s7, s8 AS SINGLE STATIC oc7, oc8 AS WORD IF ISFALSE Task(%KoudChi_Amp).tog THEN Controller Chi.channel, 65, 127 Chi.ctrl(65) = 127 'cc7 = SQR(Gesture.flue_val(3)) * 127 'cc8 = SQR(Gesture.ds1(3)) * 1270 cc7 = Gesture.flue_val(3) * 384 cc8 = SQR(Gesture.ds1(3)) * 1200 s7 = 50 ' integration constants - could become 2 slider controls s8 = 50 RESET oc7, oc8 logfile " Chi_Amp started" & TIME$ Task(%KoudChi_Amp).tog = %True END IF ' integration: 'cc7 = ((cc7 * (s7-1)) + (gesture.flue_val(3) * 127) )/ s7 ' hoogste opgetekende piek = 44 'cc7 = ((cc7 * (s7-1)) + (SQR(gesture.flue_val(3)) * 127) )/ s7 ' never larger than 68, lowest values too high now cc7 = ((cc7 * (s7-1)) + (gesture.flue_val(3) * 384) )/ s7 CC7 = MIN(127,cc7) IF Chi.ctrl(7) <> INT(cc7) THEN Controller Chi.channel, 7, cc7 ' body surface amplitude Chi.ctrl(7) = cc7 IF Chi.ctrl(7) > oc7 THEN logfile " cc7= " & STR$(cc7) oc7 = Chi.ctrl(7) END IF END IF ' integration: 'cc8 = ((cc8 * (s8-1)) + (gesture.ds1(3) * 127) )/ s8 ' hoogste opgetekende piek = 8 'cc8 = ((cc8 * (s8-1)) + (SQR(gesture.ds1(3)) * 1270) )/ s8 ' clipt cc8 = ((cc8 * (s8-1)) + (SQR(gesture.ds1(3)) * 1200) )/ s8 cc8 = MAX(0,MIN(127,cc8)) IF Chi.ctrl(8) <> INT(cc8) THEN Controller Chi.channel, 8, cc8 ' maximum of the first derivative of body surface Chi.ctrl(8) = cc8 IF Chi.ctrl(8) > oc8 THEN logfile " cc8= " & STR$(cc8) oc8 = Chi.ctrl(8) END IF END IF END SUB SUB koud_tinti () 'speed up: tinti STATIC n1 AS BYTE STATIC playing AS BYTE IF ISFALSE n1 THEN n1 = (Tinti.LowTes + Tinti.HighTes) / 2 ' MM_Tinti_On Controller Tinti.channel, 7, 1 Controller tinti.channel, 8, 100 END IF IF (gesture.speedup(3) > gesture.slowdown(3)) AND (MAX(@pDoppler.xa, @pDoppler.ya, @pDoppler.za) > .04) THEN playing = 1 n1 = n1 + CHOOSE(1 + INT(RND * 6), -2, -1, 1, 1, 1,2) IF n1 > Tinti.HighTes THEN n1 = Tinti.LowTes 'jump ver and back betweeen edges of range IF n1 < Tinti.LowTes THEN n1 = Tinti.HighTes PlayDur Tinti.channel, n1, MIN(127, Gesture.speedup(3)), 3200 - (@pDoppler.xa + @pDoppler.ya + @pDoppler.za) * 1000 'lower amp ->longer notes Controller Tinti.channel, 7, MIN(127, Gesture.speedup(3)) Controller Tinti.channel,30, MIN(127, MAX(@pDoppler.xf, @pdoppler.yf, @pDoppler.zf)) ELSEIF playing THEN RESET playing Controller Tinti.channel, 123, 127 Controller Tinti.channel, 31, 12 + RND * 14 Controller Tinti.channel, 7, 1 END IF END SUB SUB kcol_tinti () 'collision STATIC sens AS SINGLE STATIC cc AS DWORD LOCAL flag AS LONG IF ISFALSE sens THEN sens = 1.2 Controller Tinti.channel, 30, 100 INCR cc END IF IF Gesture.collision(0) > sens THEN mPlay Tinti.channel, MIN(127, 89 + @pDoppler.xf/4), @pDoppler.xa * 127: INCR flag IF Gesture.collision(1) > sens THEN mPlay Tinti.channel, MIN(127, 89 + @pDoppler.yf/4), @pDoppler.ya * 127: INCR flag IF Gesture.collision(2) > sens THEN mPlay Tinti.channel, MIN(127, 89 + @pDoppler.zf/4), @pDoppler.za * 127: INCR flag IF ISFALSE flag THEN Controller Tinti.channel,123,0: EXIT SUB logfile STR$(flag) Controller Tinti.channel, 31, INT(12 + 16 * ABS(SIN(cc/600)) ) Controller Tinti.channel, 7, 40 + (@pDoppler.xa + @pDoppler.ya + @pDoppler.za) * 25 END SUB SUB Trill_Collision () STATIC xtrig, ytrig, ztrig, strig, lites AS LONG STATIC sens AS SINGLE IF ISFALSE Task(%trill_Collision).tog THEN 'start gesture analyser!!! IF ISFALSE Task(%Gesture_analyser).tog THEN starttask %Gesture_Analyser MM_Thunderwood_On MM_Heli_On RESET lites sens = 2 '1.4 '14/10 Task(%Collision_Trigger).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(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) 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 Smthhybr () 'hybr on smooth STATIC mintrigval AS SINGLE ' STATIC hybrdur AS DWORD STATIC basenote AS BYTE STATIC specfac AS SINGLE STATIC sens AS SINGLE LOCAL n AS SINGLE IF ISFALSE mintrigval THEN sens = .5 mintrigval = .05 specfac = 0.75 basenote = 24 MM_Hybr_On Controller Hybr.channel, 19, 125 END IF logfile FUNCNAME$ + STR$(@pDoppler.xa) + STR$(gesture.smooth(0)) 'smooth -> hybr overtones IF (@pDoppler.xa>mintrigval) AND (gesture.smooth(0)>sens) THEN 'cance to chage basenote IF RND > .95 THEN INCR basenote IF basenote > 30 THEN basenote = 18 ELSEIF RND > .95 THEN DECR basenote IF basenote < 18 THEN basenote = 30 END IF n = hybr.Lowtes + @pDoppler.xf / 4 n = MatchSpecNote(n, basenote, specfac) logfile STR$(n) AddNote2Har hybr.har(1), n, SQR(@pDoppler.xa) * 127 AddNote2Har hybr.har(1), n + 12, @pDoppler.xa * 127 ' hybrdur = 0 END IF IF (@pDoppler.ya > mintrigval) AND (gesture.smooth(1)>sens) THEN IF RND > .8 THEN sens = (6 * sens + .2 + .7 * RND) / 7 END IF n = hybr.Lowtes + 3 + @pDoppler.yf / 4 n = MatchSpecNote(n, basenote, specfac) logfile STR$(n) AddNote2Har hybr.har(1), n, SQR(@pDoppler.ya) * 127 AddNote2Har hybr.har(1), n + 12, @pDoppler.ya * 127 ' hybrdur = 0 END IF IF (@pDoppler.xa > mintrigval) AND (gesture.smooth(0)>sens) THEN n = hybr.Lowtes + 6 + @pDoppler.zf / 4 n = MatchSpecNote(n, basenote, specfac) logfile STR$(n) AddNote2Har hybr.har(1), n, SQR(@pDoppler.za) * 127 AddNote2Har hybr.har(1), n + 12, @pDoppler.za * 127 ' hybrdur = 0 END IF logfile "play.." InstrumPlay hybr ' hybrdur = timegettime + 500 + 6 * (@pDoppler.xa + @pDoppler.ya + @pDoppler.za) hybr.ctrl(7) = MAX(15, (5 * hybr.ctrl(7) + 127 * ((@pDoppler.xa) + (@pDoppler.ya) + (@pDoppler.za))) / 8) Controller hybr.channel, 7, hybr.ctrl(7) END SUB ' voor robotorkest Ei 2018 --------------------------------------------------------------------------------- SUB Ei_SpPos () STATIC sensU AS LONG IF ISFALSE sensU THEN sensU = 40 '44 MM_pos_On %MM_Motor OR %MM_Wind END IF LOCAL n AS SINGLE ' speeduppos logfile FUNCNAME$ + STR$(gesture.speedup(0)) + STR$(Gesture.Slowdown(0)) IF gesture.speedup(0) > Gesture.Slowdown(0) + sensU THEN n = pos_.LowTes + @pDoppler.xf/4 AddNote2Har pos_.Har(1), n, 20 AddNote2Har pos_.Har(1), 120, 127 END IF IF gesture.speedup(1) > Gesture.Slowdown(1) + sensU THEN n = pos_.LowTes + @pDoppler.yf/4 AddNote2Har pos_.Har(1), n, 20 AddNote2Har pos_.Har(1), 121, 127 END IF IF gesture.speedup(2) > Gesture.Slowdown(2) + sensU THEN n = pos_.LowTes + @pDoppler.zf/4 AddNote2Har pos_.Har(1), n, 20 AddNote2Har pos_.Har(1), 124, 127 END IF InstrumPlay pos_ Controller pos_.channel, 7, MAX(25, (5 * Qt.ctrl(7) + 110 * ((@pDoppler.xa)^.6 + (@pDoppler.ya)^.6 + (@pDoppler.za)^.6)) / 8) END SUB SUB Ei_SlSpir () STATIC sens AS LONG IF ISFALSE sens THEN sens = 20 END IF LOCAL n AS SINGLE ' speeduppos logfile FUNCNAME$ + STR$(gesture.speedup(0)) + STR$(Gesture.Slowdown(0)) IF (gesture.slowdown(0) > sens) THEN n = Spiro.LowTes + @pDoppler.xf/4 AddNote2Har Spiro.Har(1), n, 20 END IF IF (gesture.slowdown(1) > sens) THEN n = spiro.LowTes + @pDoppler.yf/4 AddNote2Har Spiro.Har(1), n, 20 END IF IF (gesture.slowdown(2) > sens) THEN n = spiro.LowTes + @pDoppler.zf/4 AddNote2Har spiro.Har(1), n, 20 END IF InstrumPlay spiro END SUB SUB Ei_ExplPosBo () STATIC d() AS LONG STATIC cc AS DWORD LOCAL i AS LONG DIM d(3) STATIC init AS DWORD IF ISFALSE init THEN MM_Pos_On %MM_Motor OR %MM_Wind MM_Bomi_On %MM_Motor OR %MM_Wind MM_Piperola_On %MM_Wind OR %MM_Motor init = 1 ARRAY ASSIGN d() = 72, 84, 48, 48 END IF INCR cc IF (gesture.explo(0) > @pDoppler.noise) AND (@pDoppler.xa > .12) THEN FOR i = 0 TO INT(SQR(gesture.explo(0)) * 8) AddNote2Har pos_.Har(1), d(0) + i, 20 AddNote2Har pos_.Har(1), d(0) - i, 20 AddNote2Har pos_.Har(1), 122, 127 NEXT ELSE d(0) = 60 + INT(cc/10) MOD 24 END IF InstrumTransposeToRange pos_ InstrumPlay pos_ IF (gesture.explo(1) > @pDoppler.noise) AND (@pDoppler.ya > .12) THEN FOR i = 0 TO INT(SQR(gesture.explo(1)) * 8) AddNote2Har bomi.Har(1), d(1) + i, 20 AddNote2Har bomi.Har(1), d(1) - i, 20 AddNote2Har pos_.Har(1), 123, 127 NEXT ELSE d(1) = 72 + INT(cc/11) MOD 24 END IF InstrumTransposeToRange bomi InstrumPlay bomi IF (gesture.explo(2) > @pDoppler.noise) AND (@pDoppler.za > .12) THEN FOR i = 0 TO INT(SQR(gesture.explo(2)) * 8) AddNote2Har piperola.Har(1), d(1) + i, 20 AddNote2Har piperola.Har(1), d(1) - i, 20 NEXT ELSE d(2) = 72 + INT(cc/13) MOD 24 END IF InstrumTransposeToRange piperola InstrumPlay piperola END SUB SUB Ei_Smpos () ' moduleren? STATIC cont AS LONG STATIC init AS DWORD IF ISFALSE init THEN MM_Pos_On %MM_WIND OR %MM_Motor init = 1 END IF IF (gesture.smooth_dur(3)) AND (MAX(@pDoppler.xa, @pdoppler.ya, @pDoppler.za) > .1) THEN ' pos_.Qhar(1).vel = pos_.Qhar(0).vel AddNote2Har pos_.har(1), MIN(pos_.HighTes,pos_.LowTes + @pDoppler.xf/2), 20 AddNote2Har pos_.har(1), MIN(pos_.HighTes,pos_.LowTes + @pDoppler.yf/2), 20 AddNote2har pos_.har(1), MIN(pos_.HighTes,pos_.LowTes + @pDoppler.zf/2), 20 AddNote2Har Pos_.Har(1), 120 + INT(RND * 5), 127 'lights InstrumPlay pos_ INCR cont cont = MIN(cont, 100) ELSE ' warning "reset" + str$(timegettime) ' pos_.Qhar(0).vel = "" IF cont THEN DECR cont IF ISFALSE cont THEN InstrumPlay pos_ END IF END IF controller pos_.Channel, 7, 13 + (@pDoppler.xa + @pDoppler.ya + @pDoppler.za) * 30 END SUB SUB Ei_ColPos () STATIC sens AS SINGLE LOCAL i AS LONG LOCAL d AS LONG IF ISFALSE sens THEN sens = 1.4 '80 / 128 END IF IF MAX(gesture.collision(0), gesture.collision(1), gesture.collision(2)) > sens THEN d = RND * 6 AddNote2Har pos_.Har(1), pos_.Lowtes + d, 20 FOR i = 1 TO 30 * (@pDoppler.xa + @pDoppler.ya + @pDoppler.za) STEP 5 AddNote2Har pos_.Har(1), pos_.LowTes + i + d, 20 NEXT AddNote2Har Pos_.Har(1), 120 + INT(RND * 5), 127 'lights controller pos_.channel, 7, 50 + 20 * (@pDoppler.xa + @pDoppler.ya + @pDoppler.za) END IF InstrumPlay pos_ END SUB