'************************************************** '* Code for Namuda Study #31 * '* february 2013 * '* Sense * '************************************************** ' robots used in this piece: ' NOT USED CODE!!! DECLARE SUB Init_Sense () 'tijdelijk hier: TYPE Sense_Type DWORD Har AS Harmtype Tc AS INTEGER melnote AS INTEGER vol AS SINGLE normbody AS SINGLE normspeed AS SINGLE ' range 1-2 span AS BYTE ' modulated by edgy-smooth div AS INTEGER ' divider used for melody steps in function of movement speed END TYPE GLOBAL Sense AS Sense_Type %Sense_Glob = 19 %Sense_Jazz = 20 %Sense_Tango = 21 ' tango %Sense_Klar = 22 %Sense_Krum = 23 %Sense_Sax = 24 %Sense_Final = 25 DECLARE SUB Sense_Glob () DECLARE SUB Sense_jazz () DECLARE SUB SenseJazz_Stop () DECLARE SUB SenseTango () DECLARE SUB SenseKlar () DECLARE SUB SenseKrum () DECLARE SUB SenseSax () DECLARE SUB Sense_Final () DECLARE SUB Sense_Final_Stop () '------------------------------------- SUB Init_Sense () Task(%Sense_Glob).naam = "12-Glob" Task(%Sense_Glob).freq = 8 Task(%Sense_Glob).cptr = CODEPTR(Sense_Glob) Task(%Sense_Glob).flags = %False Task(%Sense_Jazz).naam = "12-jazz" Task(%Sense_Jazz).freq = 20 Task(%Sense_Jazz).cptr = CODEPTR(Sense_jazz) Task(%Sense_Jazz).flags = %False TaskEX(%Sense_Jazz).StopCptr = CODEPTR(SenseJazz_Stop) Task(%Sense_Tango).naam = "12-Tango" Task(%Sense_Tango).freq = 2 Task(%Sense_Tango).cptr = CODEPTR(SenseTango) Task(%Sense_Tango).flags = %False TaskEX(%Sense_Tango).stopcptr = CODEPTR(SenseJazz_Stop) ' no mistake! Task(%Sense_Klar).naam = "12-Klar" Task(%Sense_Klar).freq = 20 Task(%Sense_Klar).cptr = CODEPTR(SenseKlar) Task(%Sense_Klar).flags = %False Task(%Sense_Krum).naam = "12-Krum" Task(%Sense_Krum).freq = 20 Task(%Sense_Krum).cptr = CODEPTR(SenseKrum) Task(%Sense_Krum).flags = %False 'TaskEX(%Sense_Krum).startCptr = MM_Krum_On causing crash! 'TaskEX(%Sense_Krum).stopcptr = MM_Krum_Off causing crash! Task(%Sense_Sax).naam = "12-Sax" Task(%Sense_Sax).freq = 20 Task(%Sense_Sax).cptr = CODEPTR(SenseSax) Task(%Sense_Sax).flags = %False 'TaskEX(%Sense_Sax).startCptr = MM_Autosax_On causing crash 'TaskEX(%Sense_Sax).stopcptr = MM_Autosax_Off causing crash Task(%Sense_Final).naam = "12-End" Task(%Sense_Final).freq = 4 Task(%Sense_Final).cptr = CODEPTR(Sense_Final) Task(%Sense_Final).flags = %False TaskEX(%Sense_Final).stopcptr = CODEPTR(Sense_Final_Stop) IF ISFALSE Task(%Gesture_Analyser).tog THEN starttask %Gesture_Analyser IF ISFALSE Task(%Sense_Glob).tog THEN starttask %Sense_Glob Sense.Tc = 36 Sense.Har.vel = NUL$(128) Sense.span = 3 ' should be modulated by edgy smooth 1-5 (akkoord-breedte) Sense.normspeed = 1 ' tempo modulation 1-2 Sense.normbody = 0.5 ' normalized 0-1 Sense.div = 25 ' controlled with Slider(0) in cockpit END SUB SUB Sense_Glob () STATIC edgy, smooth AS LONG IF ISFALSE Task(%Sense_Glob).tog THEN Sense.div = 25 Slider(0).value = Sense.div SendMessage Slider(0).h, %TBM_SETPOS,%True, Sense.div Task(%Sense_Glob).tog = %True END IF Sense.normbody = gesture.flue_val(3) Sense.normspeed = 1 + MAX( MIN (gesture.fixspeed_val(3) / 200, 1), 0) ' loopt tussen 1 en 2 Sense.div = MAX(Slider(0).value,1) ' modulation of span in function of edgy-smooth properties IF gesture.edgy_dur(3) THEN 'if edgy, we widen the span INCR Sense.span Sense.span = MIN(Sense.span,5) edgy = %True ELSE edgy = %False 'Sense.span = 3 END IF IF gesture.smooth_dur(3) THEN DECR Sense.span Sense.span = MAX(Sense.span, 1) smooth = %True ELSE smooth = %False END IF IF ISFALSE edgy AND ISFALSE smooth THEN Sense.span = 3 END IF END SUB SUB Sense_jazz () ' first test for jazz harmony functions in g_har.dll STATIC n AS INTEGER STATIC slnr, cnt AS LONG STATIC utrig, dtrig, sens, oldn, otc AS INTEGER STATIC Fanote, Helinote, Klarnote, Kornnote, ObNote AS INTEGER IF ISFALSE Task(%Sense_Jazz).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" ' slider TaskParamLabels(1) = "Divid" ' slider IF ISFALSE Task(%Sense_Jazz).hParam THEN MakeTaskParameterDialog %Sense_Jazz,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Sense_Jazz).SliderNumbers(0) Slider(slnr).value = 16 Slider(slnr).minval = 1 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = 2 Slider(slnr+1).minval = 1 SendMessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value END IF MM_Bono_On MM_Fa_On MM_Klar_On MM_Heli_On MM_Korn_On MM_Ob_On MM_Autosax_On Task(%Sense_Jazz).freq = 1 ' this is too slow for good gesture tracking Sense.Tc = 36 oTc = Sense.Tc n = Sense.Tc + 36 oldn = n sens = 12 RESET cnt Task(%Sense_Jazz).tog = %True END IF IF gesture.speedup(3) > gesture.slowdown(3) + sens + 6 THEN n = n + (gesture.speedup_val(3)/ Sense.div) ' rising melody line IF n > 84 + (Sense.Tc MOD 12) THEN n = 84 + (Sense.Tc MOD 12) utrig = %True ELSE RESET utrig END IF IF gesture.slowdown(3)> sens THEN n = n - (gesture.slowdown_val(3) / Sense.div) ' descending melody line IF n < Sense.Tc THEN n = Sense.Tc + (n MOD 12) dtrig = %True ELSE RESET dtrig END IF IF ISFALSE dtrig AND ISFALSE utrig THEN Piano.Har(1).vel = NUL$(128) oldn = %False IF klarnote THEN mPlay Klar.channel, klarnote, %False RESET klarnote END IF ' reset the central melody note: 'n = Sense.Tc + 36 n = ((Klar.lowtes \12)* 12)+ 24 + (Sense.Tc MOD 12) ELSE IF n <> oldn THEN mPlay Klar.channel, n, 37 + (@pDoppler.ya * 90) ' melody line klarnote = n Sense.melnote = n Piano.Har(1).vel = BuildJazzChord (Sense.Tc,n, (MAX(@pDoppler.xa,@pDoppler.ya,@pDoppler.za) * 120),Sense.span) ' changes Sense.Tc! Task(%Sense_Jazz).Har.vel = Piano.Har(1).vel Sense.Har.vel = Piano.Har(1).vel IF Sense.Tc <> oTc THEN logfile STR$(oTc) & " Tc=" & STR$(Sense.tc) & " span=" & STR$(Sense.span) & FUNCNAME$ ' we suspect Tc not to change anymore... PlayDur Bono.channel, Sense.Tc, 64 + (gesture.flue_val(3) * 63), 800 IF Sense.Tc < 31 THEN Sense.Tc = Sense.Tc + 12 IF Sense.Tc > 48 THEN Sense.Tc = Sense.Tc - 12 oTc = Sense.Tc END IF oldn = n ELSE '... END IF END IF InstrumPlay Piano ' het gespeelde akkoord staat nu ook in Piano.Har(0).vel IF ISFALSE cnt MOD Slider(slnr+1).value THEN IF ISFALSE Task(%Sense_Tango).tog THEN DelNote2Har Task(%Sense_Jazz).Har, klarnote ' delete melody note DelNote2Har Task(%Sense_Jazz).Har, Sense.Tc ' delete bass ' now the harmstring can only contain 5 notes ObNote = GetHighestNote (Task(%Sense_Jazz).Har, Ob.Lowtes, Ob.Hightes) ObNote = HI(BYTE,ObNote) AddNote2Har Ob.Har(1), ObNote, (90 + (@pDoppler.za * 37)) InstrumPlay Ob DelNote2Har Task(%Sense_Jazz).Har, ObNote 'hali: HeliNote = GetLowestNote (Task(%Sense_Jazz).har, Heli.Lowtes, Heli.Hightes) HeliNote = HI(BYTE,Helinote) AddNote2Har Heli.Har(1), HeliNote, (80 + (@pDoppler.xa * 47)) InstrumPlay Heli DelNote2Har Task(%Sense_Jazz).Har, HeliNote ' now 3 notes left KornNote = GetHighestNote (Task(%Sense_Jazz).Har, Korn.Lowtes, Korn.Hightes) KornNote = HI(BYTE,KornNote) AddNote2Har Korn.Har(1), KornNote, (90 + (@pDoppler.ya * 37)) InstrumPlay Korn DelNote2Har Task(%Sense_Jazz).Har, KornNote ' 2 notes left FaNote = GetLowestNote (Task(%Sense_Jazz).har, Fa.Lowtes, Fa.Hightes) FaNote = HI(BYTE,Fanote) AddNote2Har Fa.Har(1), FaNote, (64 + (@pDoppler.za * 63)) InstrumPlay Fa DelNote2Har Task(%Sense_Jazz).Har, FaNote ' 1 note left now Autosax.Har(1) = Task(%Sense_Jazz).Har InstrumPlay Autosax Task(%Sense_Jazz).har.vel = NUL$(128) END IF END IF INCR cnt Task(%Sense_Jazz).freq = (Slider(slnr).value/ 16) * Sense.normspeed END SUB SUB SenseJazz_Stop () MM_Ob_Off %MM_Notes MM_Klar_Off %MM_Notes MM_Bono_Off %MM_Notes MM_Fa_Off %MM_Notes MM_Heli_Off %MM_Notes MM_Autosax_Off %MM_Notes MM_Korn_Off %MM_Notes MM_Spiro_Off %MM_Notes MM_Vibi_Off %MM_Notes END SUB SUB SenseTango () ' should do the accompaniment in the wind section ' taking the Harstring for the jazz task as an input ' This task should get a certain rhytm ' if this task is ON, the accompaniment section in the previous one is disabled. STATIC Obnote,HeliNote,FaNote,KornNote,Autosaxnote, Rcnt AS INTEGER STATIC tiks AS SINGLE IF ISFALSE Task(%Sense_Tango).tog THEN RESET Rcnt Task(%Sense_Tango).tempo = 30 'must be tempo for a whole bar! so MM=30 means quaver= 120 for 4/4 bars. Task(%Sense_Tango).freq = 2 'MM120 tiks = GetRitme (Task(%Sense_Tango).rit, %Tango, 0.8) Task(%Sense_Tango).tog = %True END IF IF ISFALSE Task(%Sense_Tango).Rit.pattern(Rcnt) THEN ' einde cel bereikt InstrumPlay Spiro ' avoiding stuck keys IF Obnote THEN NoteOff Ob.channel, Obnote IF Helinote THEN NoteOff Heli.channel, Helinote IF Fanote THEN NoteOff Fa.channel, Fanote IF Kornnote THEN NoteOff Korn.channel, Kornnote IF Autosaxnote THEN noteoff Autosax.channel, autosaxnote RESET Obnote, Helinote, Fanote, Kornnote, autosaxnote tiks = GetRitme (Task(%Sense_Tango).rit, %Tango,0.8) ' 0.8) 'tiks = RitmSigma!(Task(%Sense_Tango).Rit) IF tiks < 1 THEN Logfile "tiks < 1 " & FUNCNAME$ RESET Rcnt END IF ' for interactive speed: Task(%Sense_Tango).tempo = 10 * Sense.normspeed Task(%Sense_Tango).freq = (tiks * Task(%Sense_Tango).tempo ) / (60 * ABS(Task(%Sense_Tango).Rit.pattern(Rcnt))) IF Task(%Sense_Tango).Rit.pattern(Rcnt) > 0 THEN 'playing on positive values ' het tempo voor een gehele maat is frq = task(tasknr%).tempo / 60 ' zo'n gehele maat beslaat een aantal eenheden gegeven in tiks 'Task(%Sense_Tango).freq = (tiks * Task(%Sense_Tango).tempo ) / (60 * ABS(Task(%Sense_Tango).Rit.pattern(Ritmeteller%))) Task(%Sense_Tango).har.vel = Sense.har.vel ' jazz-harmony chord DelNote2Har Task(%Sense_Tango).Har, Sense.melnote ' delete melody note DelNote2Har Task(%Sense_Tango).Har, Sense.Tc ' delete bass ' now the harmstring can only contain 5 notes ObNote = GetHighestNote (Task(%Sense_Tango).Har, Ob.Lowtes, Ob.Hightes) ObNote = HI(BYTE,ObNote) AddNote2Har Ob.Har(1), ObNote, (90 + (@pDoppler.za * 37)) InstrumPlay Ob DelNote2Har Task(%Sense_Tango).Har, ObNote 'heli: HeliNote = GetLowestNote (Task(%Sense_Tango).Har, Heli.Lowtes, Heli.Hightes) HeliNote = HI(BYTE,Helinote) AddNote2Har Heli.Har(1), HeliNote, (64 + (@pDoppler.xa * 63)) InstrumPlay Heli DelNote2Har Task(%Sense_Tango).Har, HeliNote ' now 3 notes left KornNote = GetHighestNote (Task(%Sense_Tango).Har, Korn.Lowtes, Korn.Hightes) KornNote = HI(BYTE,KornNote) AddNote2Har Korn.Har(1), KornNote, (90 + (@pDoppler.ya * 37)) InstrumPlay Korn DelNote2Har Task(%Sense_Tango).Har, KornNote ' 2 notes left FaNote = GetLowestNote (Task(%Sense_Tango).Har, Fa.Lowtes, Fa.Hightes) FaNote = HI(BYTE,Fanote) AddNote2Har Fa.Har(1), FaNote, (64 + (@pDoppler.za * 63)) InstrumPlay Fa DelNote2Har Task(%Sense_Tango).Har, FaNote ' 1 note left now IF ISFALSE Task(%Sense_Sax).tog THEN Autosax.Har(1) = Task(%Sense_Tango).Har InstrumPlay Autosax ELSE Vibi.Har(1) = Task(%Sense_Tango).Har InstrumPlay Vibi END IF Spiro.Har(1) = Task(%Sense_Tango).har Instrumplay Spiro mPlay Troms.channel, 24 + (Rcnt MOD 24), MAX(@pDoppler.xa,@pDoppler.ya,@pDoppler.za) * 127 ' test voor ritme ELSE ' rest InstrumPlay Ob InstrumPlay Heli InstrumPlay Korn InstrumPlay Fa InstrumPlay Autosax END IF INCR Rcnt END SUB SUB SenseKlar () ' solo melody line for ' this works very well STATIC n AS INTEGER STATIC utrig, dtrig, sens, oldn, otc AS INTEGER STATIC Klarnote AS INTEGER IF ISFALSE Task(%Sense_Klar).tog THEN IF Task(%Sense_Krum).tog THEN StopTask %Sense_Krum ':EXIT SUB IF Task(%Sense_Jazz).tog THEN StopTask %Sense_Jazz ':EXIT SUB IF Task(%Sense_Sax).tog THEN stoptask %Sense_Sax Task(%Sense_Klar).freq = 12 ' this is too slow for good gesture tracking Sense.Tc = 36 oTc = Sense.Tc n = Sense.Tc + 36 oldn = n sens = 12 MM_So_On Controller So.channel, 7, 127 So.ctrl(7) = 127 Task(%Sense_Klar).tog = %True END IF IF gesture.speedup(3) > gesture.slowdown(3) + sens + 6 THEN n = n + (gesture.speedup_val(3)/ Sense.div) ' rising melody line IF n > 84 + (Sense.Tc MOD 12) THEN n = 84 + (Sense.Tc MOD 12) utrig = %True ELSE RESET utrig END IF IF gesture.slowdown(3)> sens THEN n = n - (gesture.slowdown_val(3) / Sense.div) ' descending melody line IF n < Sense.Tc THEN n = Sense.Tc + (n MOD 12) dtrig = %True ELSE RESET dtrig END IF IF ISFALSE dtrig AND ISFALSE utrig THEN Task(%Sense_Klar).har.vel = NUL$(128) oldn = %False IF klarnote THEN mPlay Klar.channel, klarnote, %False RESET klarnote END IF ' reset the central melody note: 'n = Sense.Tc + 36 n = ((Klar.lowtes \ 12) * 12) + (Sense.Tc MOD 12) + 24 ELSE IF n <> oldn THEN mPlay Klar.channel, n, 20+ (@pDoppler.ya * 100) ' melody line klarnote = n Sense.melnote = n Task(%Sense_Klar).Har.vel = BuildJazzChord (Sense.Tc,n, (MAX(@pDoppler.xa,@pDoppler.ya,@pDoppler.za) * 120),Sense.span) ' changes Sense.Tc! Sense.Har.vel = Task(%Sense_Klar).Har.vel IF Sense.Tc <> oTc THEN PlayDur So.channel, Sense.Tc - 12, 64 + (gesture.flue_val(3) * 63), 500 'logfile STR$(otc) & " Tc=" & STR$(Sense.Tc) & " " & Funcname$ IF Sense.Tc < 31 THEN Sense.Tc = Sense.Tc + 12 IF Sense.Tc > 48 THEN Sense.Tc = Sense.Tc - 12 oTc = Sense.Tc END IF oldn = n ELSE '...noot aanhouden END IF END IF Task(%Sense_Klar).freq = 8 * Sense.Normspeed END SUB SUB SenseKrum () ' solo melody line for STATIC n AS INTEGER STATIC utrig, dtrig, sens, oldn, otc AS INTEGER STATIC Krumnote AS INTEGER IF ISFALSE Task(%Sense_Krum).tog THEN IF Task(%Sense_Klar).tog THEN Stoptask %Sense_Klar' :exit sub IF Task(%Sense_Jazz).tog THEN StopTask %Sense_Jazz' :exit sub IF Task(%Sense_Sax).tog THEN Stoptask %Sense_Sax ': EXIT SUB Task(%Sense_Krum).freq = 1 ' this is too slow for good gesture tracking Sense.Tc = 36 oTc = Sense.Tc n = Sense.Tc + 36 oldn = n sens = 12 MM_So_On MM_Krum_On Controller So.channel, 7, 127 So.ctrl(7) = 127 Task(%Sense_Krum).tog = %True EXIT SUB END IF IF gesture.speedup(3) > gesture.slowdown(3) + sens + 6 THEN n = n + (gesture.speedup_val(3)/ Sense.div) ' rising melody line IF n > 84 + (Sense.Tc MOD 12) THEN n = 84 + (Sense.Tc MOD 12) utrig = %True ELSE RESET utrig END IF IF gesture.slowdown(3)> sens THEN n = n - (gesture.slowdown_val(3) / Sense.div) ' descending melody line IF n < Sense.Tc THEN n = Sense.Tc + (n MOD 12) dtrig = %True ELSE RESET dtrig END IF IF ISFALSE dtrig AND ISFALSE utrig THEN Task(%Sense_Krum).har.vel = NUL$(128) oldn = %False IF krumnote THEN mPlay Krum.channel, Krumnote, %False RESET krumnote END IF ' reset the central melody note: n = ((Krum.lowtes \ 12) * 12) + (Sense.Tc MOD 12) + 24 ELSE IF n <> oldn THEN mPlay Krum.channel, krumnote, %False mPlay Krum.channel, n, 64 '20+ (@pDoppler.ya * 100) ' melody line krumnote = n Sense.melnote = n Task(%Sense_Krum).Har.vel = BuildJazzChord (Sense.Tc,n, (MAX(@pDoppler.xa,@pDoppler.ya,@pDoppler.za) * 120),Sense.span) ' changes Sense.Tc! Sense.Har.vel = Task(%Sense_Krum).Har.vel IF Sense.Tc <> oTc THEN PlayDur So.channel, Sense.Tc - 12, 64 + (gesture.flue_val(3) * 63), 800 'logfile STR$(otc) & " Tc=" & STR$(Sense.Tc) & " " & FUNCNAME$ IF Sense.Tc < 31 THEN Sense.Tc = Sense.Tc + 12 IF Sense.Tc > 48 THEN Sense.Tc = Sense.Tc - 12 oTc = Sense.Tc END IF oldn = n ELSE '...noot aanhouden END IF END IF Task(%Sense_Krum).freq = 8 * Sense.normspeed END SUB SUB SenseSax () ' solo melody line for STATIC n AS INTEGER STATIC utrig, dtrig, sens, oldn, otc AS INTEGER STATIC Saxnote AS INTEGER IF ISFALSE Task(%Sense_Sax).tog THEN IF Task(%Sense_Krum).tog THEN StopTask %Sense_Krum ':EXIT SUB IF Task(%Sense_Jazz).tog THEN StopTask %Sense_Jazz ':EXIT SUB IF Task(%Sense_Klar).tog THEN stoptask %Sense_Klar ': EXIT sub Task(%Sense_Sax).freq = 12 ' this is too slow for good gesture tracking Sense.Tc = 36 oTc = Sense.Tc n = Sense.Tc + 24 oldn = n sens = 12 MM_So_On Controller So.channel, 7, 127 So.ctrl(7) = 127 Task(%Sense_Sax).tog = %True END IF IF gesture.speedup(3) > gesture.slowdown(3) + sens + 6 THEN n = n + (gesture.speedup_val(3)/ Sense.div) ' rising melody line IF n > 84 + (Sense.Tc MOD 12) THEN n = 84 + (Sense.Tc MOD 12) utrig = %True ELSE RESET utrig END IF IF gesture.slowdown(3)> sens THEN n = n - (gesture.slowdown_val(3) / Sense.div) ' descending melody line IF n < Sense.Tc THEN n = Sense.Tc + (n MOD 12) dtrig = %True ELSE RESET dtrig END IF IF ISFALSE dtrig AND ISFALSE utrig THEN Task(%Sense_Sax).har.vel = NUL$(128) oldn = %False IF saxnote THEN mPlay Autosax.channel, saxnote, %False RESET saxnote END IF ' reset the central melody note: n = ((AutoSax.lowtes \ 12) * 12) + (Sense.Tc MOD 12) + 24 ELSE IF n <> oldn THEN mPlay Autosax.channel, n, 70 + (@pDoppler.xa * 57) ' melody line saxnote = n Sense.melnote = n Task(%Sense_Sax).Har.vel = BuildJazzChord (Sense.Tc,n, (MAX(@pDoppler.xa,@pDoppler.ya,@pDoppler.za) * 120),Sense.span) ' changes Sense.Tc! Sense.Har.vel = Task(%Sense_Sax).Har.vel IF Sense.Tc <> oTc THEN ' add spiro here!!! PlayDur So.channel, Sense.Tc - 12, 64 + (gesture.flue_val(3) * 63), 600 'logfile STR$(otc) & " Tc=" & STR$(Sense.Tc) & " " & FUNCNAME$ IF Sense.Tc < 31 THEN Sense.Tc = Sense.Tc + 12 IF Sense.Tc > 48 THEN Sense.Tc = Sense.Tc - 12 oTc = Sense.Tc END IF oldn = n ELSE '...noot aanhouden END IF END IF Task(%Sense_Sax).freq = 8.0 * Sense.normspeed END SUB SUB Sense_Final () LOCAL note AS INTEGER STATIC cnt AS INTEGER IF ISFALSE Task(%Sense_Final).tog THEN IF Task(%Sense_Krum).tog THEN StopTask %Sense_Krum IF Task(%Sense_Jazz).tog THEN StopTask %Sense_Jazz IF Task(%Sense_Klar).tog THEN stoptask %Sense_Klar IF Task(%Sense_Tango).tog THEN Stoptask %Sense_Tango IF Task(%Sense_Sax).tog THEN stoptask %Sense_Sax RESET cnt Task(%Sense_Final).tog = %True END IF IF ISFALSE cnt THEN Sense.Tc = 24 + (Sense.tc MOD 12) Task(%Sense_Final).har.vel = BuildJazzChord (Sense.Tc,Sense.melnote, (MAX(@pDoppler.xa,@pDoppler.ya,@pDoppler.za) * 120),5) Sense.Har.vel = Task(%Sense_Final).Har.vel ' now orchestrate and play: note = 24 + (Sense.tc MOD 12) mPlay So.channel, note, 120 Piano.Har(1).vel = Sense.Har.vel Instrumplay Piano 'heli: Note = GetLowestNote (Sense.Har, Heli.Lowtes, Heli.Hightes) Note = HI(BYTE,note) AddNote2Har Heli.Har(1), Note, (64 + (@pDoppler.xa * 63)) InstrumPlay Heli DelNote2Har Sense.Har, note ' bono Note = GetLowestNote (Sense.Har, Bono.Lowtes, Bono.Hightes) Note = HI(BYTE,note) AddNote2Har Bono.Har(1), Note, (64 + (@pDoppler.ya * 63)) InstrumPlay Bono DelNote2Har Sense.Har, note ' fa Note = GetLowestNote (Sense.Har, Fa.Lowtes, Fa.Hightes) Note = HI(BYTE,note) AddNote2Har Fa.Har(1), Note, (64 + (@pDoppler.za * 63)) InstrumPlay Fa DelNote2Har Sense.Har, note ' sax Note = GetLowestNote (Sense.Har, Autosax.Lowtes, Autosax.Hightes) Note = HI(BYTE,note) AddNote2Har Autosax.Har(1), Note, (64 + (@pDoppler.xa * 63)) InstrumPlay Autosax DelNote2Har Sense.Har, note ' klar Note = GetLowestNote (Sense.Har, Klar.Lowtes, Klar.Hightes) Note = HI(BYTE,note) AddNote2Har Klar.Har(1), Note, (64 + (@pDoppler.ya * 63)) InstrumPlay Klar DelNote2Har Sense.Har, note ' korn Note = GetLowestNote (Sense.Har, Korn.Lowtes, Korn.Hightes) Note = HI(BYTE,note) AddNote2Har Korn.Har(1), Note, (64 + (@pDoppler.za * 63)) InstrumPlay Korn DelNote2Har Sense.Har, note ' ob Note = GetLowestNote (Sense.Har, Ob.Lowtes, Ob.Hightes) Note = HI(BYTE,note) AddNote2Har Ob.Har(1), Note, (64 + (@pDoppler.xa * 63)) InstrumPlay Ob DelNote2Har Sense.Har, note ELSE ' decrescendo decr0 Klar.ctrl(7) 'Klar.ctrl(7)= max(0,Klar.ctrl(7)) IF klar.ctrl(7) THEN Controller Klar.channel, 7, Klar.ctrl(7) ELSE MM_Klar_Off decr0 Fa.ctrl(7) 'Fa.ctrl(7) = max(0, Fa.ctrl(7)) IF fa.ctrl(7) THEN controller Fa.channel, 7, Fa.ctrl(7) ELSE MM_Fa_Off decr0 Bono.ctrl(7) 'Bono.ctrl(7) = max(0, Bono.ctrl(7)) IF Bono.ctrl(7) THEN controller Bono.channel, 7, Bono.ctrl(7) ELSE MM_Bono_Off decr0 Heli.ctrl(7) 'Heli.ctrl(7) = max(0, Heli.ctrl(7)) IF Heli.ctrl(7) THEN controller Heli.channel, 7, Heli.ctrl(7) ELSE MM_Heli_Off decr0 Autosax.ctrl(7) 'Autosax.ctrl(7) = max(0, Autosax.ctrl(7)) IF autosax.ctrl(7) THEN controller autosax.channel, 7, Autosax.ctrl(7) ELSE MM_Autosax_Off DECR0 Korn.ctrl(17) 'Korn.ctrl(17) = MAX(0, Korn.ctrl(17)) IF Korn.ctrl(17) THEN controller Korn.channel, 17, Korn.ctrl(17) ELSE MM_Korn_Off DECR0 So.ctrl(7) 'So.ctrl(7) = MAX(0, So.ctrl(7)) IF So.ctrl(7) THEN controller So.channel, 7, So.ctrl(7) ELSE MM_So_Off DECR0 Ob.ctrl(17) 'Ob.ctrl(17) = MAX(0, Ob.ctrl(17)) IF Ob.ctrl(17) THEN controller Ob.channel, 17, Ob.ctrl(17) ELSE MM_Ob_Off IF Klar.ctrl(7) + Fa.ctrl(7) + Bono.ctrl(7) + Heli.ctrl(7) + Autosax.ctrl(7) + Korn.ctrl(17) + So.ctrl(7) + Ob.ctrl(17) = 0 THEN Stoptask %Sense_Final END IF IF cnt < 24 THEN mPlay Troms.channel,24+cnt,127 - cnt END IF END IF INCR cnt END SUB SUB Sense_Final_Stop () MM_AllOff END SUB