' ************************************************* ' < G O R G O N I O > * ' ************************************************* ' 30.06.1999: adapted to PBcc32 version 2.0 ' 22.09.1999: second performance. - autoswitch off added. (has bug...) ' 23.03.2000: ported to version 5.00 ' 30.07.2001: compiles into gmt_alg.exe ' 29.06.2002: changed. ' 06.11.2004: adapted to g_mm.inc ' 08.01.2005: adapted to new bourdonola ' 21.01.2007: rechecked with new harmlibs. ' 21.04.2008: 'O.G.' code added, for orchestral glitches ' this piece to be premiered on april 24th, M&M concert at .Logos %GorgonioBaseTaskNr = 48 '55 %Glit1 = 32 ' for glitches o.g. GLOBAL Toets() AS SINGLE DECLARE SUB PiperSincs () DECLARE SUB PiperCos () DECLARE SUB VoxHuCos () DECLARE SUB VoxHumSincs () DECLARE SUB PianoSolve () DECLARE SUB Castagnets () DECLARE SUB Drumkit () DECLARE SUB InitGorgelSincs () DECLARE FUNCTION GorgelInit () AS DWORD DECLARE SUB ButnSW_GorgonioStartStop () DECLARE SUB Glit1 () ' for 'O.G.' (Orchestral Glitches) FUNCTION GorgelInit () AS DWORD LOCAL tasknr AS INTEGER, lb AS BYTE LOCAL aantal AS BYTE, i AS BYTE, j AS BYTE LOCAL CockpitLayo AS CockpitLabels FUNCTION = %False IF ISFALSE hMidiO(0) THEN ErrorMidiOut EXIT FUNCTION END IF ReadCockpitLabelsFromFile $GORGONIOINI, CockpitLayo Init_MM () MM_PanicButtonWindow 'required to be able to use the MM() array! REDIM Toets(Piano.lowtes TO Piano.hightes)AS GLOBAL SINGLE ' global - for player piano support App.Komposduur = 420 aantal = 9 lb = %GorgonioBaseTaskNr ' number of the lowest numbered task. ' for gorgola festival... Task(lb).naam = "PiperSin" Task(lb).Cptr=CODEPTR(PiperSincs) Task(lb).channel = Piperola.channel '2 Task(lb).level= 127 Task(lb).patch = 85 ' for code dev. only Task(lb).freq = 26 Task(lb).starttime = 0 Task(lb).stoptime = App.Komposduur / 3 Task(lb).duur = Task(lb).stoptime 'Task(lb).switch = %True Task(lb+1).naam = "VoxHuSin" Task(lb+1).Cptr = CODEPTR(VoxHumSincs) Task(lb+1).channel =Humanola.channel' 1 Task(lb+1).level = 127 Task(lb+1).patch = 92 ' chapel organ Task(lb+1).freq = 20.5 Task(lb+1).starttime = 0 Task(lb+1).stoptime = App.Komposduur / 7 Task(lb+1).duur = App.Komposduur / 7 Task(lb+2).naam = "PianoSol" Task(lb+2).Cptr = CODEPTR(PianoSolve) Task(lb+2).channel =Piano.channel ' 0 Task(lb+2).level =127 Task(lb+2).patch = 60 ' harp Task(lb+2).freq = 21 Task(lb+2).tempo = 72 Task(lb+2).starttime = -1 :'0 Task(lb+2).stoptime = 1000 ' App.Komposduur /7 'Task(lb+2).duur = App.Komposduur /7 Task(lb+3).naam = "PiperCos" Task(lb+3).Cptr=CODEPTR(PiperCos) Task(lb+3).channel = Piperola.channel '2 Task(lb+3).level= 127 Task(lb+3).patch = Task(lb).patch Task(lb+3).freq = 22 Task(lb+3).starttime = 0 Task(lb+3).stoptime = App.Komposduur/ 3 Task(lb+3).duur = App.Komposduur /3 'Task(lb+3).switch = %True Task(lb+4).naam = "VoxHuCos" ' task 59 Task(lb+4).Cptr=CODEPTR(VoxHuCos) Task(lb+4).channel = Humanola.channel '2 Task(lb+4).level= 127 Task(lb+4).patch = Task(lb + 1).patch Task(lb+4).freq = 23 Task(lb+4).starttime = 0 Task(lb+4).stoptime = App.Komposduur /5 Task(lb+4).duur = App.Komposduur / 5 Task(lb+5).naam = "Clappers" ' task 60 Task(lb+5).Cptr = CODEPTR(Castagnets) Task(lb+5).channel =Humanola.channel '1 Task(lb+5).level= 127 Task(lb+5).patch = Task(lb + 1).patch Task(lb+5).freq = 80 Task(lb+5).starttime = 0 Task(lb+5).stoptime = 1000 Task(lb+5).duur = App.Komposduur Task(lb+5).tempo= 72 Task(lb+6).naam = "DrumKit" ' task 61 Task(lb+6).Cptr = CODEPTR(Drumkit) Task(lb+6).channel = Piperola.channel '2 Task(lb+6).level= 127 Task(lb+6).patch = Task(lb).patch Task(lb+6).freq = 81 Task(lb+6).starttime = 0 Task(lb+6).stoptime = 1000 Task(lb+6).duur = App.Komposduur Task(lb+6).tempo= 72 Task(lb+7).naam = "PipSin2" ' task 62 Task(lb+7).Cptr = CODEPTR(Pipersin2) Task(lb+7).channel =Piperola.channel ' 2 Task(lb+7).level= 127 Task(lb+7).patch = Task(lb).patch Task(lb+7).freq = 81 Task(lb+7).starttime = 0 Task(lb+7).stoptime = App.Komposduur /5 Task(lb+7).duur = App.Komposduur /5 Task(lb+7).tempo= 72 FOR Tasknr= lb TO lb + aantal SetDlgItemText gh.Cockpit,%GMT_TASK0_ID + Tasknr,BYCOPY Task(Tasknr).naam Task(TaskNr).Har.vel = STRING$(128, 0) NEXT Tasknr FOR i = 1 TO aantal Task(lb+ (i-1)).flags = Task(lb + (i-1)).flags OR %MIDI_TASK OR %SCORE_TASK NEXT i i = 0 j = 0 DO IF lb + i <> lb + 2 THEN IF lb+ i <> lb + 5 THEN IF lb + i <> lb + 6 THEN ' exclude the pianotask, since this one solves the chord... ' exclude the clappers and non-pitched percussion... Task(lb+i).flags = Task(lb+i).flags OR %HARM_TASK INCR j END IF END IF END IF INCR i LOOP UNTIL i = aantal ' glitches 'OG' code: Task(%Glit1).naam = "Glit1" Task(%Glit1).cptr = CODEPTR(Glit1) Task(%Glit1).freq = 500 Task(%Glit1).flags = %False TaskEX(%Glit1).stopcptr = CODEPTR(MM_AllOff) ButnSW(1).cptr = CODEPTR(ButnSW_GorgonioStartStop) ButnOS(1).tag = "HumOf" ButnOS(2).tag = "PipOf" ButnOS(3).tag = "PiaOf" ButnOS(1).cptr = CODEPTR(MM_Humanola_Off) ButnOS(2).cptr = CODEPTR(MM_Piperola_Off) ButnOS(3).cptr = CODEPTR(MM_Piano_Off) FUNCTION = %TRue END FUNCTION SUB ButnSW_GorgonioStartStop () LOCAL ButtonNr AS LONG LOCAL i AS BYTE LOCAL retval AS LONG ButtonNr = App.ButnSwparam - %GMT_BUTNSW_ID IF ButnSW(Buttonnr).flag THEN App.MTstart = %True App.tstart = timeGetTime ' start the chronometerfunction SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + ButtonNr, "STOP" IF hMidiI(0) THEN ClearMiBuf 0 ' start with a blank midi input buffer BlockSysExReception hMidiI(0) 'SxThread ' dll proc END IF StartTask %GorgonioBaseTaskNr StartTask %GorgonioBaseTaskNr + 3 Promil %True Runtime %True StartTask App.GlobalHarmonyTaskNr ELSE App.MTstart = %False Promil %False SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + ButtonNr, "CONT" END IF App.butnSwparam = %False END SUB SUB PiperSincs () LOCAL noot?, Snc!, AantalCycli AS BYTE, hoek! STATIC oldnoot? , cnt?, refnote? , tog?, tasknr% IF tog? = %False THEN refnote? = 72 tasknr%= %GorgonioBaseTaskNr ' 55 tog? = %True oldnoot? = %False END IF AantalCycli = 3 ' 17 ' 4 ' ' 13, 11 IF Tprop!(tasknr%) =< 0 THEN EXIT SUB hoek! = (Tprop!(tasknr%) -0.5!) * (2! * Pi2 * AantalCycli) Snc! = Sinc(hoek!) IF Snc! > 0 THEN noot? = refnote? + (Snc! * (Piperola.hightes - refnote?)) ELSE noot? = refnote? + (Snc! *4!* (refnote? - Piperola.lowtes)) END IF IF Getpromil% > Task(tasknr%).stoptime THEN INCR cnt? refnote? = refnote? + 4 IF refnote? > Piperola.hightes THEN refnote? = Piperola.hightes Task(tasknr%).starttime = Task(tasknr%).stoptime Task(tasknr%).stoptime = Task(tasknr%).starttime + Task(tasknr%).duur IF Task(tasknr%).stoptime > 1000 THEN Task(tasknr%).stoptime = 1000 DelNote2Har Piperola.Har(0), (oldnoot?) DelNote2Har Task(tasknr%).Har, (oldnoot?) PlayHar Piperola.Har(0), Piperola.channel oldnoot? = %False 'StopTask tasknr% END IF IF noot? <> oldnoot? THEN IF oldnoot? THEN DelNote2Har Task(tasknr%).Har, BYCOPY oldnoot? AddNote2Har Task(tasknr%).Har, BYCOPY noot?, BYCOPY Task(tasknr%).level IF oldnoot? THEN DelNote2Har Piperola.Har(0), BYCOPY oldnoot? AddNote2Har Piperola.Har(0), BYCOPY noot?, BYCOPY Task(tasknr%).level PlayHar Piperola.Har(0), Piperola.channel oldnoot? = noot? Task(tasknr%).freq = Task(tasknr%).freq * 1.5 ' autoregulator ELSE Task(tasknr%).freq = Task(tasknr%).freq * 0.8 IF Task(tasknr%).freq < 3 THEN Task(tasknr%).freq = 3 END IF IF Getpromil% > 1000 THEN StopTask tasknr% END IF END SUB SUB PiperCos () LOCAL noot?, Snc!, AantalCycli AS BYTE, hoek! STATIC oldnoot? , cnt?, refnote? , tog?, tasknr% IF tog? = %False THEN refnote? = 72 tasknr%= %GorgonioBaseTaskNr + 3 ' 58 tog? = %True oldnoot? = %False END IF AantalCycli = 3 ' 17 ' 4 ' ' 13, 11 IF Tprop!(tasknr%) < 0 THEN EXIT SUB hoek! = (Tprop!(tasknr%) -0.5!) * (2! * Pi2 * AantalCycli) Snc! = Cosc(hoek!) IF Snc! > 0 THEN noot? = refnote? + (Snc! * (Piperola.hightes - refnote?)) ELSE noot? = refnote? + (Snc! * (refnote? - Piperola.lowtes)) END IF IF Getpromil% > Task(tasknr%).stoptime THEN INCR cnt? refnote? = refnote? + 4 IF refnote? > Piperola.hightes THEN refnote? = Piperola.hightes Task(tasknr%).starttime = Task(tasknr%).stoptime Task(tasknr%).stoptime = Task(tasknr%).starttime + Task(tasknr%).duur IF Task(tasknr%).stoptime > 1000 THEN Task(tasknr%).stoptime = 1000 DelNote2Har Piperola.Har(0), (oldnoot?) DelNote2Har Task(tasknr%).Har, (oldnoot?) PlayHar Piperola.Har(0), Piperola.channel oldnoot? = %False 'StopTask tasknr% END IF IF noot? <> oldnoot? THEN IF oldnoot? THEN DelNote2Har Task(tasknr%).Har, BYCOPY oldnoot? AddNote2Har Task(tasknr%).Har, BYCOPY noot?, BYCOPY Task(tasknr%).level IF oldnoot? THEN DelNote2Har Piperola.Har(0), BYCOPY oldnoot? AddNote2Har Piperola.Har(0), BYCOPY noot?, BYCOPY Task(tasknr%).level PlayHar Piperola.Har(0), Piperola.channel oldnoot? = noot? Task(tasknr%).freq = Task(tasknr%).freq * 1.5 ' autoregulator ELSE Task(tasknr%).freq = Task(tasknr%).freq * 0.8 IF Task(tasknr%).freq < 3 THEN Task(tasknr%).freq = 3 END IF IF Getpromil% > 1000 THEN StopTask tasknr% END IF END SUB SUB PiperSin2 () LOCAL noot?, Snc!, AantalCycli AS BYTE, hoek! STATIC oldnoot? , cnt?, refnote? , tog?, tasknr% IF tog? = %False THEN refnote? = 72 tasknr%= %GorgonioBaseTaskNr + 7 ' 62 tog? = %True oldnoot? = %False END IF AantalCycli = 5 ' 17 ' 4 ' ' 13, 11 IF Tprop!(tasknr%) =< 0 THEN EXIT SUB hoek! = (Tprop!(tasknr%) -0.5!) * (2! * Pi2 * AantalCycli) Snc! = Sinc(hoek!) IF Snc! > 0 THEN noot? = refnote? + (Snc! * (Piperola.hightes - refnote?)) ELSE noot? = refnote? + (Snc! *4!* (refnote? - Piperola.lowtes)) END IF IF Getpromil% > Task(tasknr%).stoptime THEN INCR cnt? refnote? = refnote? + 4 IF refnote? > Piperola.hightes THEN refnote? = Piperola.hightes Task(tasknr%).starttime = Task(tasknr%).stoptime Task(tasknr%).stoptime = Task(tasknr%).starttime + Task(tasknr%).duur IF Task(tasknr%).stoptime > 1000 THEN Task(tasknr%).stoptime = 1000 DelNote2Har Piperola.Har(0), (oldnoot?) DelNote2Har Task(tasknr%).Har, (oldnoot?) PlayHar Piperola.Har(0), Piperola.channel oldnoot? = %False 'StopTask Tasknr% END IF IF noot? <> oldnoot? THEN IF oldnoot? THEN DelNote2Har Task(tasknr%).Har, BYCOPY oldnoot? AddNote2Har Task(tasknr%).Har, BYCOPY noot?, BYCOPY Task(tasknr%).level IF oldnoot? THEN DelNote2Har Piperola.Har(0), BYCOPY oldnoot? AddNote2Har Piperola.Har(0), BYCOPY noot?, BYCOPY Task(tasknr%).level PlayHar Piperola.Har(0) , Piperola.channel oldnoot? = noot? Task(tasknr%).freq = Task(tasknr%).freq * 1.5 ' autoregulator ELSE Task(tasknr%).freq = Task(tasknr%).freq * 0.8 IF Task(tasknr%).freq < 3 THEN Task(tasknr%).freq = 3 END IF IF Getpromil% > 1000 THEN StopTask tasknr% END IF END SUB SUB VoxHumSincs () LOCAL noot?, Snc!, AantalCycli AS BYTE, hoek! STATIC oldnoot? , cnt?, refnote? , tog?, tasknr% IF tog? = %False THEN refnote? = 60 tasknr%= %GorgonioBaseTaskNr + 1 ' 56 tog? = %True oldnoot? = %False END IF AantalCycli = 7 '6 ' 17 ' 4 ' ' 13, 11 IF Tprop!(tasknr%) < 0 THEN EXIT SUB hoek! = (Tprop!(tasknr%) -0.5!) * (2! * Pi2 * AantalCycli) Snc! = Sinc(hoek!) IF Snc! > 0 THEN noot? = refnote? + (Snc! * (Humanola.hightes - refnote?)) ELSE noot? = refnote? + (Snc! *4!* (refnote? - Humanola.lowtes)) ' sinc is assymetrisch!!! END IF IF Getpromil% > Task(tasknr%).stoptime THEN INCR cnt? refnote? = refnote? + 5 IF refnote? >= Humanola.hightes THEN refnote? = (refnote? MOD 12) + (Humanola.hightes - 12) Task(tasknr%).starttime = Task(tasknr%).stoptime Task(tasknr%).stoptime = Task(tasknr%).starttime + Task(tasknr%).duur IF Task(tasknr%).stoptime > 1000 THEN Task(tasknr%).stoptime = 1000 DelNote2Har Humanola.Har(0), (oldnoot?) DelNote2Har Task(tasknr%).Har, (oldnoot?) PlayHar Humanola.Har(0), Humanola.channel oldnoot? = %False 'StopTask Tasknr% END IF IF noot? <> oldnoot? THEN IF oldnoot? THEN DelNote2Har Task(tasknr%).Har, BYCOPY oldnoot? AddNote2Har Task(tasknr%).Har, BYCOPY noot?, BYCOPY Task(tasknr%).level IF oldnoot? THEN DelNote2Har Humanola.Har(0), BYCOPY oldnoot? AddNote2Har Humanola.Har(0), BYCOPY noot?, BYCOPY Task(tasknr%).level PlayHar Humanola.Har(0), Humanola.channel oldnoot? = noot? Task(tasknr%).freq = Task(tasknr%).freq * 1.5 ' autoregulator ELSE Task(tasknr%).freq = Task(tasknr%).freq * 0.8 IF Task(tasknr%).freq < 3 THEN Task(tasknr%).freq = 3 END IF IF Getpromil% > 1000 THEN StopTask tasknr% END IF END SUB SUB VoxHuCos () LOCAL noot?, Snc!, AantalCycli AS BYTE, hoek! STATIC oldnoot? , cnt?, refnote? , tog?, tasknr% IF tog? = %False THEN refnote? = 60 tasknr%= %GorgonioBaseTaskNr + 4 ' 59 tog? = %True oldnoot? = %False END IF AantalCycli = 5 ' 5 '6 ' 17 ' 4 ' ' 13, 11 IF Tprop!(tasknr%) < 0 THEN EXIT SUB hoek! = (Tprop!(tasknr%) -0.5!) * (2! * Pi2 * AantalCycli) Snc! = Cosc(hoek!) IF Snc! > 0 THEN noot? = refnote? + (Snc! * (Humanola.hightes - refnote?)) ELSE noot? = refnote? + (Snc! * (refnote? - Humanola.lowtes)) END IF IF Getpromil% > Task(tasknr%).stoptime THEN INCR cnt? refnote? = refnote? + 5 IF refnote? >= Humanola.hightes THEN refnote? = (refnote? MOD 12) + (Humanola.hightes - 12) Task(tasknr%).starttime = Task(tasknr%).stoptime Task(tasknr%).stoptime = Task(tasknr%).starttime + Task(tasknr%).duur IF Task(tasknr%).stoptime > 1000 THEN Task(tasknr%).stoptime = 1000 DelNote2Har Humanola.Har(0), (oldnoot?) DelNote2Har Task(tasknr%).Har, (oldnoot?) PlayHar Humanola.Har(0), Humanola.channel oldnoot? = %False 'StopTask Tasknr% END IF IF noot? <> oldnoot? THEN IF oldnoot? THEN DelNote2Har Task(tasknr%).Har, BYCOPY oldnoot? AddNote2Har Task(tasknr%).Har, BYCOPY noot?, BYCOPY Task(tasknr%).level IF oldnoot? THEN DelNote2Har Humanola.Har(0), BYCOPY oldnoot? AddNote2Har Humanola.Har(0), BYCOPY noot?, BYCOPY Task(tasknr%).level PlayHar Humanola.Har(0), Humanola.channel oldnoot? = noot? Task(tasknr%).freq = Task(tasknr%).freq * 1.5 ' autoregulator ELSE Task(tasknr%).freq = Task(tasknr%).freq * 0.8 IF Task(tasknr%).freq < 3 THEN Task(tasknr%).freq = 3 END IF IF Getpromil% > 1000 THEN StopTask tasknr% END IF END SUB SUB PianoSolve () STATIC Ritmeteller%, tasknr% , HarV1 AS HarmType , starttempo AS SINGLE, solvenoot? LOCAL tiks!, i AS BYTE, hoek!, Snc! IF tasknr% = %False THEN tasknr% = %GorgonioBaseTaskNr + 2 ' 57 HarV1.vel = STRING$(128,0) starttempo = Task(tasknr%).tempo solvenoot? = 48 END IF IF Getpromil% > 1010 THEN StopTask tasknr% END IF IF Task(tasknr%).Rit.pattern(Ritmeteller%) = 0 THEN Ritmeteller% = 0 ' Task(tasknr%).tempo = starttempo * (1 + Tprop!(tasknr%)) 'Iprop2Rit App.GlobalHarmonyTasknr, tasknr% , 2 Iprop2Rit Task(App.GlobalHarmonyTasknr).Har, Tasknr%, 2 END IF tiks! = RitmSigma!(Task(tasknr%).Rit) IF tiks! <= 0 THEN EXIT SUB Task(tasknr%).freq = (tiks! * Task(tasknr%).tempo ) / (60 * ABS(Task(tasknr%).Rit.pattern(Ritmeteller%))) IF Task(tasknr%).Rit.pattern(Ritmeteller%) < 0 THEN Task(tasknr%).Har.vel = STRING$(128,0) ELSE IF Task(App.GlobalHarmonyTasknr).Har.vel <> STRING$(128, 0) THEN Task(tasknr%).Har.vel = SolveHar$ (Task(App.GlobalHarmonyTasknr).Har, BYCOPY solvenoot?, 0.05) solvenoot? = 48 - INT((COS(Tang!(tasknr%)) * 12!)) 'IF Tprop!(tasknr%) < 0 THEN EXIT SUB hoek! = (Tprop!(tasknr%) -0.5!) * (2! * Pi2) Snc! = ABS(Sinc(hoek!)) ' rescale velocities: FOR i= 1 TO 128 MID$(Task(tasknr%).Har.vel, i, 1) = CHR$(ASC(MID$(Task(tasknr%).Har.vel, i, 1))* Snc!) NEXT i ELSE Task(tasknr%).Har.vel = STRING$(128,0) END IF END IF INCR Ritmeteller% IF Task(tasknr%).Har.vel <> HarV1.vel THEN IF Task(tasknr%).Har.vel <> Task(App.GlobalHarmonyTasknr).Har.vel THEN PlayHar Task(tasknr%).Har, Task(tasknr%).channel IF Task(tasknr%).Har.vel <> STRING$(128,0) THEN HarV1.vel = Task(tasknr%).Har.vel END IF END IF END IF END SUB SUB Castagnets () STATIC tasknr%, tog? , Ritmeteller%, pat? LOCAL tiks!, i? IF tog? = %False THEN tasknr%= %GorgonioBaseTaskNr + 5 ' 60 tog? = %True Task(tasknr%).tempo = 72 pat? = 7 ' 4 bits END IF IF Task(tasknr%).Rit.pattern(Ritmeteller%) = 0 THEN Ritmeteller%= %False 'Iprop2Rit App.GlobalHarmonyTasknr, tasknr%, 2 ' binary Iprop2Rit Task(App.GlobalHarmonyTasknr).Har, Tasknr%, 2 pat? = 7 END IF tiks! = RitmSigma!(Task(tasknr%).Rit) IF tiks! <=0 THEN EXIT SUB Task(tasknr%).freq = (tiks! * Task(tasknr%).tempo) / (60* ABS(Task(tasknr%).Rit.pattern(Ritmeteller%))) IF Task(tasknr%).Rit.pattern(Ritmeteller%) < 0 THEN ' rust FOR i? = 120 TO 127 DelNote2Har Humanola.Har(0), BYCOPY i? NEXT i? PlayHar Humanola.Har(0), Humanola.channel ELSE ' mPlay FOR i? = 0 TO pat? AddNote2Har Humanola.Har(0), 120 + i?, BYCOPY Task(tasknr%).level NEXT i? PlayHar Humanola.Har(0), Humanola.channel IF pat? > 0 THEN DECR pat? ' = (pat? - 1) ELSE pat? = 7 END IF END IF INCR Ritmeteller% END SUB SUB Drumkit () STATIC tasknr%, tog? , Ritmeteller%, pat?, oldpat? LOCAL tiks!, i? IF tog? = %False THEN tasknr%= %GorgonioBaseTaskNr + 6 ' 61 tog? = %True Task(tasknr%).tempo = 36 pat? = 3 ' 4 bits END IF IF Task(tasknr%).Rit.pattern(Ritmeteller%) = 0 THEN Ritmeteller%= %False 'Iprop2Rit App.GlobalHarmonyTasknr, tasknr%, 3 ' ternary Iprop2Rit Task(App.GlobalHarmonyTasknr).Har, Tasknr%, 3 pat? = 3 END IF tiks! = RitmSigma!(Task(tasknr%).Rit) IF tiks! <=0 THEN EXIT SUB Task(tasknr%).freq = (tiks! * Task(tasknr%).tempo) / (60* ABS(Task(tasknr%).Rit.pattern(Ritmeteller%))) IF Task(tasknr%).Rit.pattern(Ritmeteller%) < 0 THEN ' rust IF oldpat? > %False THEN DelNote2Har Piperola.Har(0), BYCOPY oldpat? oldpat? = %False PlayHar Piperola.Har(0), Piperola.channel END IF ELSE ' mPlay AddNote2Har Piperola.Har(0), 120 + pat?, BYCOPY Task(tasknr%).level PlayHar Piperola.Har(0), Piperola.channel oldpat? = 120 + pat? IF pat? > 0 THEN DECR pat? ' = (pat? - 1) ELSE pat? = 3 END IF END IF INCR Ritmeteller% END SUB '---------------------------------------------------------------------- ' glitches code SUB Glit1 () STATIC ins AS LONG STATIC n AS CUR LOCAL v AS WORD STATIC cnt AS DWORD STATIC slnr AS LONG LOCAL r AS SINGLE IF ISFALSE Task(%glit1).tog THEN DIM TaskParamLabels(2) AS ASCIIZ * 8 TaskParamLabels(0) = "Velo" TaskParamLabels(1) = "Freq" TaskParamLabels(2) = "Prob" ProgChange Piano.channel, 122 ProgChange Xy.channel, 122 ProgChange Belly.channel, 122 ProgChange Thunderwood.channel, 122 ProgChange Troms.channel, 122 PRogChange Klung.channel, 0 ProgChange Bako.channel, 122 ProgChange Vacca.channel, 122 IF ISFALSE Task(%glit1).hParam THEN MakeTaskParameterDialog %glit1,3,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%glit1).SliderNumbers(0) Slider(slnr).value = 1 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = 100 SendMessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value Slider(slnr+2).value = 64 Sendmessage Slider(slnr+2).h, %TBM_SETPOS, %True, Slider(slnr+2).value END IF cnt = %False MM_Piperola_On MM_Krum_On MM_Qt_On MM_Xy_On MM_Harma_On MM_Humanola_On MM_Korn_On MM_Belly_On MM_Vitello_On MM_Bourdonola_On MM_Bono_On MM_So_On MM_Klung_On MM_Tubi_On MM_Ake_On MM_Hurdy_On MM_Sire_On MM_Thunderwood_On 'MM_Snar_On MM_Troms_On MM_Rotomoton_On 'MM_Vacca_On MM_Trump_On MM_Llor_On 'MM_Casta_On MM_Simba_On MM_Bako_On Task(%glit1).freq = 100 Task(%glit1).tog = %True END IF ' ins = rnd(1) * UBOUND(MM()) ' array of pointers to the orchestra musician types ' ' n = @MM(ins).lowtes + (rnd(1) * (@MM(ins).hightes - @MM(ins).lowtes)) v = Slider(slnr).value '8 IF ISFALSE cnt MOD 2 THEN ins = RND(1) * UBOUND(MM()) ' array of pointers to the orchestra musician types 'r = 64 / max(slider(slnr+2).value,1) 'r = r / 8 ' 8 - 0.0625 ' stochastic distribution exponent ' of in een enkele stap: r = 8 / MAX(slider(slnr+2).value,1) ' 8 - 0.0625 ' here we can make it interactive by using sonar global amplitude instead of the slider n = @MM(ins).lowtes + ((RND(1)^r) * (@MM(ins).hightes - @MM(ins).lowtes)) ' random note within range mPlay @MM(ins).channel, n, v Task(%glit1).freq = MAX(Slider(slnr+1).value * 5,1) ELSE Noteoff @MM(ins).channel, n Task(%glit1).freq = MAX(Slider(slnr+1).value,1) END IF INCR cnt END SUB '[EOF]