' ************************************************************************* ' * < KLUNG > * ' * Klung Procedures and compositions * ' * includes tests for all midi functions * ' * Version 2 * ' ************************************************************************* ' driver and test code for Klung ' Written by Kristof Lauwers and Godfried-Willem Raes ' 05.07.00 start coding ' 18.07.00 composition by Thomas Smetryns added. ' 1.08.00 composition StochKlung added - Kristof Lauwers ' 06.08.00 simu compilation is now ready for website, with userfriendly (more or less...) interface ' 06.09.00 test: we can play a midi piece from cakewalk and let gmt listen and play it on klung ' we have to make sure that gmt gets the focus however, otherwise occasional glitches occur ' 19.09.00 listens to meta commands sent by WSB server, still to be debugged... ' ignores unknown pieces! so NEW pieces have TO be added IN messagehandler also ' IMPORTANT NOTE: id's and tasknumbers of the pieces should follow each other in the same sequence ' (lowest tasknr for lowest id, (lowest tasknr + 1 ) for (lowest id + 1)... ' 03.10.00 communication between klung & server debugged, klung simu output corrected ' 06.08.2001: NiDAQ implementation started. ' hardware code moved to g_n*h.dll ' declarations moved to klung.bi ' 11.11.2001: for Klung, Vibi and Harma. ' 24.04.2002: pincode added for start up of Klung. ' 28.07.2002: New klung piece: started... ' 30.07.2002: Klung_PlayHar procedure added in g.n*h.dll ' 10.08.2002: concert op Patersholfeesten ' 11.08.2002: revision. ' 24.07.2004: Klunglisten improved with masks. ' 25.01.2005: updated ' 18.08.2006: start upgrade to become a midi controlled robot. ' This code module is now no longer functional. ' The new code module is called : Klung.inc ' 19.08.2006: old circuitry removed from klung. New power supply build and tested. ' 21.08.2003: it compiles again - see if everything works if klung is programmed.. ' 25.08.2006: lites added. - gwr ' 01.09.2006: Klung functional again. Aftertouch still to be implemented. ' 27.08.2008: Bug reported in de Klung firmware. ' 21.11.2015: New firmware made for Klung. Now key pressure is implemented. ' Problem: was ProgChange ever used on Klung??? ' 22.11.2015: old GMT pieces need revision now! Can become a lot easier! ' conversion started... ' 24.11.2015: thomas' piece updated ' Klung type should become pKlung, the type itself in the libs... (cfr. belly etc...) 'defined in g_kons.bi: '%KlungTst = 1 ' hardware test code '%submit = %klungTst '%Klung_aftt = 2 '%Klungels = 59 ' for 'Web Strikes Back' - Slagwerk project TAAKNR CONFLICTEERT MET HOOGSTE KLUNGTASKNR!!! '%KlungelTango = 55 ' a composition for voice and Klung ' tango-end = 56 (Defined in code below) '%stochl = 53 ' for stochlung '%Klung_Gray = 57 ' new klungpiece 28.07.2002 '%Klungel_Harm = 58 ' added 11.08.2002 '%klt = 32 'start tasknr for klung ' defined below: 32 - 52 'defined in klung_bi: ' %KlungelThomas = 54 'for thomas' piece, serves as conditional compilation constant as well as tasknumber ' %Klung_lites = 63 ' added 25.08.2006 gwr GLOBAL Meta_AME_Klung AS SINGLE 'for stochlung - meta amount of energy ' -------------------------------------------------------------------------- DECLARE FUNCTION Init_Klung () AS DWORD '%klung_kl = 1 'if defined, includes KL code still to be updated. This constant should be removed when ready. FUNCTION Init_Klung () EXPORT AS DWORD LOCAL CockpitLayo AS CockpitLabels LOCAL i AS DWORD LOCAL m AS ASCIIZ * 40 LOCAL zText AS ASCIIZ * 25 LOCAL TaskParamLabels() AS ASCIIZ * 8 ReadCockpitLabelsFromFile $KlungIni, CockpitLayo Task(App.ReadSeqScoreTaskNr).cPtr = %False ' remove from cockpit. SetDlgItemText gh.Cockpit, %GMT_TITLE, "" ' heeft het zin om deze te behouden? - was nodig voor Rolands Round... gwr ' IF Klung.SeqFileTask THEN ' DIM TaskParamLabels(1) ' TaskParamLabels(0) = "Speed" ' TaskParamLabels(1) = "Velo" ' MakeTaskParameterDialog Klung.SeqFileTask,2,Slider(),0,UDctrl(),TaskParamLabels() ' Slider(TaskEx(Klung.Seqfiletask).Slidernumbers(0)).cptr = CODEPTR(Klung_Seq_UpdateSpeed) ' Slider(TaskEx(Klung.Seqfiletask).Slidernumbers(1)).cptr = CODEPTR(Klung_Seq_UpdateVelo) ' END IF App.butnSWCptr = CODEPTR(KlungButnSWHandler) App.butnOSCptr = CODEPTR(KlungButnOSHandler) ' delete buttons that are not required or functional: ButnSW(2).tag0 = "" ButnSW(3).tag0 = "" ButnSW(4).tag0 = "" ButnSW(5).tag0 = "" ButnSW(6).tag0 = "" ButnSW(7).tag0 = "" ButnSW(8).tag0 = "" ButnSW(9).tag0 = "" ButnSW(10).tag0 = "PowOff" ButnSW(10).tag1 = "Pow On" ButnSW(11).tag0 = "" ButnOS(3).tag = "Set" ButnOs(3).cptr = CODEPTR(KlungSetValues) ButnOS(4).tag = "" ButnOS(5).tag = "" ButnOS(6).tag = "" ButnOS(8).tag = "" ButnOS(9).tag = "" ' ButnOS(7).tag = "PANIC" ' ButnOs(7).cptr = GetProcAddress(gh.gnh,m) 'this reads values from the sliders and puts them into the freq and velo of the shaker tasks ' klung playing tasks ' FOR i = %klt TO %klt + 20 ' Task(i).freq = 2 '0.1 + ((i-%klt) * 0.05) ' freq van 0.1 tot 1.05 ' Task(i).level = 127 - (i-%klt) ' Task(i).Har.vel = STRING$(128,0) ' Task(i).naam = "klung" + FORMAT$(Klung.LowTes + i - %klt, "00") ' NEXT i ' Task(%klt).cptr = CODEPTR(Klung49) ' Task(%klt + 1).cptr = CODEPTR(Klung50) ' Task(%klt + 2).cptr = CODEPTR(Klung51) ' Task(%klt + 3).cptr = CODEPTR(Klung52) ' Task(%klt + 4).cptr = CODEPTR(Klung53) ' Task(%klt + 5).cptr = CODEPTR(Klung54) ' Task(%klt + 6).cptr = CODEPTR(Klung55) ' Task(%klt + 7).cptr = CODEPTR(Klung56) ' Task(%klt + 8).cptr = CODEPTR(Klung57) ' Task(%klt + 9).cptr = CODEPTR(Klung58) ' Task(%klt + 10).cptr = CODEPTR(Klung59) ' Task(%klt + 11).cptr = CODEPTR(Klung60) ' Task(%klt + 12).cptr = CODEPTR(Klung61) ' Task(%klt + 13).cptr = CODEPTR(Klung62) ' Task(%klt + 14).cptr = CODEPTR(Klung63) ' Task(%klt + 15).cptr = CODEPTR(Klung64) ' Task(%klt + 16).cptr = CODEPTR(Klung65) ' Task(%klt + 17).cptr = CODEPTR(Klung66) ' Task(%klt + 18).cptr = CODEPTR(Klung67) ' Task(%klt + 19).cptr = CODEPTR(Klung68) 'dummy ' Task(%klt + 20).cptr = CODEPTR(Klung69) #IF NOT %DEF(%klungsim) Task(%Klung_HW).cPtr = CODEPTR(Klung_HW) ' hardware test code for Klung Task(%Klung_HW).naam = "KlungHW" Task(%Klung_HW).freq = 10 Task(%Klung_HW).flags = %False Task(%Klung_HW).channel = Klung.channel ' task 0: Task(%KlungTst).cPtr = CODEPTR(KlungTest) ' test code for Klung Task(%KlungTst).naam = "Klungtst" Task(%KlungTst).freq = 10 Task(%KlungTst).channel = Klung.channel Task(%Klung_aftt).cptr = CODEPTR(Klung_TestAftertouch) Task(%Klung_aftt).naam = "TstAftt" Task(%Klung_aftt).freq = 24 Task(%Klung_aftt).channel = Klung.channel #ENDIF ' task 1 Task(%Klungels).cPtr = CODEPTR(Klungels) Task(%Klungels).freq = 0.5 Task(%Klungels).naam = "Klungels" Task(%Klungels).flags = %MIDI_TASK OR %HARM_TASK TaskEX(%Klungels).StopCptr = CODEPTR(KlungOff) ' task 2 Task(%KlungelTango).cPtr = CODEPTR(KlungTango) Task(%KlungelTango).tempo = 82 Task(%KlungelTango).freq = 20 Task(%KlungelTango).naam = "Klutango" Task(%KlungelTango).pan = 64 Task(%KlungelTango).flags = %MIDI_TASK OR %HARM_TASK ' TaskEX(%KlungelTango).StopCptr = CODEPTR(KlungOff) ' task 3 ' added 03.07.2000 Task(%KlungelTango+1).cPtr = CODEPTR(KlungTangoEnd) Task(%KlungelTango+1).tempo = 82 Task(%KlungelTango+1).freq = 20 Task(%KlungelTango+1).naam = "TangoEnd" Task(%KlungelTango+1).pan = 64 Task(%KlungelTango+1).flags = %MIDI_TASK OR %HARM_TASK ' TaskEX(%KlungelTango + 1).StopCptr = CODEPTR(KlungOff) #IF %DEF(%klungelThomas) Task(%KlungelThomas).cptr = CODEPTR(Thomas) Task(%KlungelThomas).freq= 24 Task(%KlungelThomas).naam="Thomas" TaskEX(%KlungelThomas).StopCptr = CODEPTR(KlungOff) #ENDIF Task(%Stochl).cptr = CODEPTR(Stochlung) Task(%Stochl).naam = "Stochlung" Task(%Stochl).freq = 3' 6 TaskEX(%Stochl).StopCptr = CODEPTR(KlungOff) Task(%Klung_Gray).cptr = CODEPTR(Klung_Gray) ' 10.08.2002 Task(%Klung_Gray).naam = "Grays" Task(%Klung_Gray).freq = 4 Task(%Klung_Gray).tempo = 240 Task(%Klung_Gray).pan = 64 Task(%Klung_Gray).flags = %MIDI_TASK OR %HARM_TASK TaskEX(%Klung_Gray).StopCptr = CODEPTR(KlungOff) Task(%Klungel_Harm).cptr = CODEPTR(KlungelHarm) ' 11.08.2002 Task(%Klungel_Harm).naam = "KlunHarm" Task(%Klungel_Harm).freq = 1 Task(%Klungel_Harm).level = 127 Task(%Klungel_Harm).tempo = 240 Task(%Klungel_Harm).pan = 64 Task(%Klungel_Harm).flags = %MIDI_TASK OR %HARM_TASK TaskEX(%Klungel_Harm).StopCptr = CODEPTR(KlungOff) Task(%Klung_Lites).cptr = CODEPTR(Klung_Lites) Task(%Klung_Lites).naam = "Lites" Task(%Klung_Lites).freq = 6 TaskEX(%Klung_Lites).StopCptr = CODEPTR(Klung_Lites_Off) ' Task(%MM_SysxTask).naam = "SendSysx" ' Task(%MM_SysxTask).freq = .33 ' Task(%MM_SysxTask).cptr = CODEPTR(MM_Sysx) 'in m_robots.inc 'cockpit sliders are used for velo and speed of Klung tasks SendMessage Slider(0).h, %TBM_SETPOS, %true, 20 SendMessage Slider(1).h, %TBM_SETPOS, %true, 20 SLider(0).value = 20: Slider(1).value=20 IF App.id <> %IDM_KLUNG THEN Warning "ID-fault IDM_Klung", 2000 ' this is set after selection of a piece in the main menu. CONTROL DISABLE gh.cockpit, %GMT_BUTNOS_ID + 10 ' no longer needed. FUNCTION = %True END FUNCTION SUB KlungButnSWHandler () LOCAL ButtonNr AS LONG LOCAL i AS BYTE LOCAL retval AS LONG ButtonNr = App.butnSWparam - %GMT_BUTNSW_ID SELECT CASE ButtonNr CASE 1 ' starts the promil counter. ' Starting the cockpit will at the same time block reception of sysex messages, by ' setting the blocking flags in SxThread.flags. IF ButnSW(Buttonnr).flag THEN App.MTstart = %True App.tstart = timeGetTime ' start the chronometerfunction SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + ButtonNr, "STOP" ClearMiBuf 0 ' start with a blank midi input buffer BlockSysExReception hMidiI(0) ' dll procedure ELSE App.MTstart = %False SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + ButtonNr, "CONT" END IF CASE 10 ' klung on/off switch - required! IF ButnSW(ButtonNr).Flag THEN ButnSW(ButtonNr).tag0 = "PowOff" SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + ButtonNr, ButnSW(ButtonNr).tag0 Controller Klung.channel, 66, %True Klung.ctrl(66) = %True ELSE ButnSW(ButtonNr).tag1 = "PowOn" SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + ButtonNr, ButnSW(ButtonNr).tag1 Controller Klung.channel, 66, %False Klung.ctrl(66) = %False END IF END SELECT App.butnSWparam = %False END SUB SUB KlungButnOSHandler () LOCAL ButtonNr AS LONG LOCAL i AS BYTE LOCAL retval AS LONG ButtonNr = App.butnOSparam - %GMT_BUTNOS_ID ' SELECT CASE ButtonNr ' ' none - we have cptr's for the 2 remaining buttons. ' ' END SELECT App.butnOSparam = %False END SUB SUB KlungTest () STATIC noot AS BYTE STATIC slnr AS BYTE STATIC trem AS BYTE LOCAL velo AS BYTE LOCAL tempo AS SINGLE STATIC cnt AS LONG ' tremolo counter ' note: it is desirable to rescale velocities such that their value increases with the lower notes. ' easiest is to use the klung-lookup in Klung.Vel():[ now obsolete] IF ISFALSE Task(%Klungtst).tog THEN DIM TaskParamLabels(0 TO 2) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Level" TaskParamLabels(2) = "Tremo" 'waar was deze goed voor?? IF Task(%KlungTst).hParam = %Null THEN MakeTaskParameterDialog %Klungtst,3,Slider(),0,UDctrl(),TaskParamLabels() ' we create 3 sliders. END IF noot = Slider(1).value ' lower slider in cockpit sets lowest note. IF noot < Klung.lowtes THEN noot = Klung.lowtes IF noot > Klung.hightes THEN noot = Klung.hightes slnr = TaskEX(%Klungtst).SliderNumbers(1) trem = %False Task(%Klungtst).tog = %True END IF velo = Slider(slnr).value tempo = 4! * (Slider(slnr-1).value / 128!) ' toonladder tempo : 0.03125Hz to 16Hz (MM=1.875 to 240) IF tempo < 0.031 THEN tempo = 0.031 IF ISFALSE velo THEN EXIT SUB IF (Slider(slnr+1).value / 16) > %False THEN ' do tremolo's , speed (number of shakes) adjustable with slider 3 Task(%Klungtst).freq = tempo * (Slider(slnr+1).value / 16) ' sets number of shakes per beat. ' limit the frequency to the maximum possible value: ' since we map velo directly on the pulse duration in ms, the maximum repetition rate for single notes ' should be limited to 1000/velo IF Task(%Klungtst).freq > 1000/velo THEN Task(%Klungtst).freq = 1000\velo IF ISFALSE trem THEN mPlay Klung.channel, noot, velo BIT SET trem, 0 ELSE mPlay Klung.channel, noot, velo ' shakes on and off. BIT RESET trem, 0 INCR cnt END IF IF cnt > Slider(slnr+1).value / 16 THEN INCR noot IF noot = 68 THEN INCR noot ' noot 68 bestaat niet op klung. cnt = %False trem = %False END IF ELSE cnt = %False Task(%KlungTst).freq = tempo ' just shake, no t2remolo IF ISFALSE trem THEN mPlay Klung.channel, noot, velo ' dll call BIT SET trem, 0 ELSE mPlay Klung.channel, noot, velo ' shakes on and off. BIT RESET trem, 0 INCR noot IF noot = 68 THEN INCR noot END IF END IF IF noot > Slider(0).value THEN noot = Slider(1).value ' cockpit lower slider - restart scale IF noot < Klung.lowtes THEN noot = Klung.lowtes IF noot > Klung.hightes THEN noot = Klung.hightes IF Task(%KlungTst).freq < 0.1 THEN Task(%Klungtst).freq = 0.1 END SUB SUB Klung_TestAftertouch () 'key pressure only implemented since version 2015, V3.0 STATIC att AS BYTE STATIC note AS BYTE STATIC level AS BYTE IF ISFALSE Task(%Klung_aftt).tog THEN Task(%Klung_aftt).tog = %True DIM TaskParamLabels(0 TO 2) AS ASCIIZ * 8 TaskParamLabels(0) = "Level" TaskParamLabels(1) = "aftertouch" TaskParamLabels(2) = "noot" IF Task(%Klung_aftt).hParam = %Null THEN MakeTaskParameterDialog %Klung_aftt,2,Slider(),1,UDctrl(),TaskParamLabels() note = Klung.LowTes END IF CONTROL SET TEXT gh.cockpit, %GMT_MSG1, STR$(UDCtrl(TaskEX(%Klung_aftt).UpDownNumbers(0)).value) IF UDCtrl(TaskEX(%Klung_aftt).UpDownNumbers(0)).value > Klung.HighTes THEN UDCtrl(TaskEX(%Klung_aftt).UpDownNumbers(0)).value = Klung.LowTes END IF IF UDCtrl(TaskEX(%Klung_aftt).UpDownNumbers(0)).value < Klung.LowTes THEN UDCtrl(TaskEX(%Klung_aftt).UpDownNumbers(0)).value = Klung.HighTes END IF IF note <> UDCtrl(TaskEX(%Klung_aftt).UpDownNumbers(0)).value THEN mPlay Klung.channel, note, 0 note = UDCtrl(TaskEX(%Klung_aftt).UpDownNumbers(0)).value ' msgbox str$(note) SetDlgItemText Task(%Klung_aftt).hparam, %GMT_TEXT0_ID + 16, STR$(note) KeyPress Klung.channel, note, att mPlay Klung.channel, note, level END IF IF level <> Slider(TaskEX(%Klung_aftt).SliderNumbers(0)).value THEN level = Slider(TaskEX(%Klung_aftt).SliderNumbers(0)).value mPlay Klung.channel, note, level END IF IF att <> Slider(TaskEX(%Klung_aftt).SliderNumbers(1)).value THEN att = Slider(TaskEX(%Klung_aftt).SliderNumbers(1)).value KeyPress Klung.channel, note, att END IF END SUB SUB KlungSetValues () 'sets freq and velo of all klung shaker tasks according to slider values 'relative to current max slider val as those can be changed by pieces '22.11.2015: now should use ctrl 30 LOCAL freq AS LONG LOCAL velo AS BYTE LOCAL i AS LONG freq = Slider(0).value 'velo = Slider(1).value * 127/slider(1).maxval FOR i = 49 TO 69 Controller Klung.channel, 30, freq NEXT IF velo<5 THEN FOR i = 49 TO 69 NoteOff Klung.channel, i NEXT END IF END SUB SUB Klungels () 'changed 000710 'now with decreasing steps between tasks until 1, then reset to 7, ... 'the maximum number of simult. playing tasks is parametric now: var. MaxNr, range 2 - 6; mapped on slider(0) 'if the max. number is in/decreased, a new task is started/ the oldest task is stopped 'also the process speed is parametric:increment = the step with which the task speed changes 'mapped on slider with values 10 to 200, divided by 10000 'since 000803 we use the sliders from the main cockpit 'if a task comes on its resonant speed, and it is not allowed to start a new task now (max tasks allready playing), 'the tasknumber is stored in QueUp, and the task is started when allowed. ' 22.11.2015: needs rewriting STATIC cnt AS SINGLE STATIC interv AS LONG 'interval of steps, can change STATIC increment AS SINGLE 'determines process speed STATIC MaxNr AS LONG 'of simultaneous sounding klungs STATIC history AS STRING ' characters represent sounding notes in order of appearance STATIC QueUp AS LONG 'holds the number of last task that wanted to start a note but couldnt 'to start the task when some comes free STATIC nr AS DWORD ' number of active anklungs !!! NOT recomputed anymore on every cycle 'in/decreased when note starts/stops !!!!! STATIC sl0 AS DWORD STATIC sl1 AS DWORD LOCAL hoek AS SINGLE LOCAL i AS LONG LOCAL j AS LONG LOCAL k AS LONG IF ISFALSE Task(%Klungels).tog THEN DIM Notes(Klung.lowtes TO Klung.Hightes) AS STATIC INTEGER DIM flags(Klung.lowtes TO Klung.Hightes) AS STATIC BYTE DIM cnt(Klung.lowtes TO Klung.hightes) AS STATIC SINGLE DIM velos(Klung.lowtes TO Klung.Hightes) AS STATIC INTEGER ' read most recent status file... '---> The general initalisation code has been moved to KlungInit increment = 0.00333 maxnr = 2 nr = %false QueUp=%false interv = %false'1 hoek = %false cnt = %false history="" FOR j = Klung.lowtes TO Klung.hightes RESET Notes(j) RESET Flags(j) RESET cnt(j) NEXT 'init parameter sliders 'we only have to use the sliders in simulation, otherwise we will get params sent as midi... Slider(0).minval = 2 Slider(0).maxval = 6 Slider(0).stap = 1 Slider(0).value = maxNr Slider(0).tag = "nrNotes" Slider(1).minval = 1 Slider(1).maxval = 127 'was 200 we limit to 127 to avoid complicating midi communication Slider(1).value = increment * 10000 slider(1).tag = "speed" SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER0, Slider(0).tag '"nrNots" SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER1, Slider(1).tag '"speed" SendMessage Slider(0).h, %TBM_SETRANGE,%True, MakeLong(Slider(0).minval, Slider(0).maxval) SendMessage Slider(0).h, %TBM_SETPAGESIZE,0,Slider(0).stap SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value SendMessage Slider(1).h, %TBM_SETRANGE,%True, MakeLong(Slider(1).minval, Slider(1).maxval) SendMessage Slider(1).h, %TBM_SETPOS,%True, Slider(1).value sl0 = Slider(0).value sl1 = Slider(1).value warning "slider 0:" + $CRLF+" max. nr. of notes"+$CRLF+" disabled at start of piece" warning " starts/stops a note immediately when moved" + $CRLF + "slider 1:"+$CRLF+" process speed" warning " determimines acc. and rit. speed and duration of piece" CONTROL DISABLE gh.cockpit, %GMT_SLIDE0_ID FOR i = Klung.lowtes TO Klung.hightes IF i = 68 THEN ITERATE FOR Keypress Klung.channel, i,Slider(1).value NEXT ' IF THEN ' StartTask %klt ' INCR Nr ' '@pKlungHw.Note(Klung.lowtes) = %True ' History = CHR$(Klung.lowtes) ' END IF '!!! every piece should initialise all klung frequencies, so that it works also after something else has been played Task(%Klungels).freq = 30 ' determines the ritmical granulation / precision ' as well as the speed. SetDlgItemText gh.Cockpit, %GMT_TITLE, "" Task(%Klungels).tog = %True END IF 'first slider value for MaxNr, if changed, we stop / start a new note IF Slider(0).value < Maxnr THEN DECR MaxNr IF nr > MaxNr THEN j = ASC(MID$(History,1,1)) IF j THEN NoteOff Klung.channel, j RESET Notes(j) DECR Nr History = MID$(History,2) END IF END IF IF Slider(0).value > MaxNr THEN INCR MaxNr IF nr < MaxNr THEN IF Nr = 1 THEN EXIT IF 'use normal procedure for finding next note... j = ASC(RIGHT$(History,1)) DO interv = interv - 1 IF interv < 1 THEN interv = 7 j = j + interv IF j > 69 THEN j = j - 12 ' upper limit IF j = 68 THEN j = j - 12 ' skip missing note IF j - 12 >= 49 THEN 'IF ISFALSE BIT (@pKlungHw.Flags(j-12),1) THEN j = j-12 ' if the lower note was not heard... IF ISFALSE BIT(Flags(j),1) THEN j = j-12 END IF IF ISFALSE Notes(j) THEN ' if it is not playing... IF ISFALSE Flags(j) THEN ' if this note was not heard before... mPlay Klung.channel, j,64 INCR Nr History = History + CHR$(j) 'add note to history Flags(j) = %True Notes(j) = %True EXIT LOOP ELSE ' try another note... j = j + 7 'so in 20 steps, we checked all notes INCR k ' keep track of the number of trials... END IF END IF LOOP UNTIL k > 20 END IF increment = Slider(1).value / 5000 'was 10000 bfore we put the slider maxval from 200 to 127, 'so we made it also a little faster... IF QueUp THEN 'a task wanted to start another one but couldn't at the moment. we try again now IF nr < maxNr THEN 'was 4 ' this could be a parameter j = QueUp QueUp = %false k = %False DO interv = interv - 1 IF interv < 1 THEN interv = 7 j = j + interv IF j > Klung.hightes THEN j = j - 12 ' upper limit IF j = 68 THEN j = j - 12 ' skip missing note IF j - 12 >= Klung.lowtes THEN IF ISFALSE Flags(j) THEN ' if the lower note was not heard... j = j - 12 ' select the lower note END IF END IF IF ISFALSE Notes(j) THEN ' if it is not playing... IF ISFALSE Flags(j) THEN ' if this note was not heard before... ' StartTask %klt + j - Klung.Lowtes ' Klung.Tnr(j) mPlay Klung.channel, j, Velos(j)'64 INCR Nr History = History + CHR$(j) 'add note to history notes(j) = %True flags(j)= %True EXIT LOOP ELSE ' try another note... 'kl 0907 j = j + 7 'so in 20 steps, we checked all notes INCR k ' keep track of the number of trials... END IF END IF LOOP UNTIL k > 20 END IF END IF FOR i = Klung.lowtes TO Klung.hightes IF i = 68 THEN ITERATE FOR IF Notes(i) THEN 'IF @pKlungHw.Note(i) THEN Cnt(i) = Cnt(i) + increment '@pKlungHw.Cnt(i) = @pKlungHw.Cnt(i) +increment' 0.00333 ' this increment determines process speed hoek = Cnt(i) / Task(%Klungels).freq '@pKlungHw.Cnt(i) / Task(%Klungels).freq ' KeyPress Klung.channel, i, ((SIN(Pi * hoek))^2) ' Task(%klt + i - Klung.LowTes).freq = ((SIN(Pi * hoek))^2) * (1.2 * @pKlungHw.res(i)) IF hoek > 1 THEN ' half sin^2 period ' @pKlungHw.Cnt(i) = %False ' reset counter Cnt(i) = %False ' StopTask %klt + i - Klung.LowTes 'Klung.Tnr(i) NoteOff Klung.channel, i DECR Nr history = MID$(history, 2) 'delete note from history ' @pKlungHw.Note(i) = %False Notes(i) = %False BIT RESET Flags(i),0 BIT SET Flags(i),1 ' BIT RESET @pKlungHw.Flags(i),0 ' BIT SET @pKlungHw.Flags(i),1 ' so we know that this note has already been playing. ' ' if all notes have this bit set, we will stop END IF END IF IF Notes(i) THEN '@pKlungHw.Note(i) THEN ' IF Task(Klung.Tnr(i)).freq < 0.1 THEN ' Task(Klung.Tnr(i)).freq = 0.1 ' IF Task(%klt + i - Klung.LowTes).freq < 0.1 THEN ' Task(%klt + i - Klung.LowTes).freq = 0.1 ' END IF ' Task(Klung.Tnr(i)).level = ((1 + (ABS(SIN(Pi * hoek)) * 63)) * Klung.Vel(i) ) * (0.5 + Task(%klungels).level/248!) ' how to translate this...: 'Task(%klt + i - Klung.LowTes).level = ((1 + (ABS(SIN(Pi * hoek)) * 63)) * @pKlungHw.Vel(i) ) * (0.5 + Task(%klungels).level/248!) Velos(i)= ((1 + (ABS(SIN(Pi * hoek)) * 63))) * (0.5 + Task(%klungels).level/248!) END IF NEXT i FOR i = Klung.lowtes TO Klung.hightes IF i = 68 THEN ITERATE FOR IF Notes(i) THEN ' IF Task(Klung.Tnr(i)).freq >= Klung.res(i) THEN ' so there are two chances to initialize another klung IF Task(%klt + i - Klung.LowTes).freq >= 1 THEN ' @pKlungHw.res(i) THEN ' so there are two chances to initialize another klung IF ISFALSE BIT (Flags(j),0) THEN 'BIT(@pKlungHw.Flags(i),0) THEN ' we set this bit in the playing klung, so that we ' ' know it has triggered another anklung... IF nr < maxNr THEN 'was 4 ' this could be a parameter k = %False j = i DO 'changed by kl 0907 interv = interv - 1 IF interv < 1 THEN interv = 7 j = j + interv IF j > Klung.hightes THEN j = j - 12 ' upper limit IF j = 68 THEN j = j - 12 ' skip missing note IF j - 12 >= Klung.lowtes THEN IF ISFALSE BIT (Flags(j-12),1) THEN 'ISFALSE BIT (@pKlungHw.Flags(j-12),1) THEN ' if the lower note was not heard... j = j - 12 ' select the lower note END IF END IF IF ISFALSE Notes(j) THEN ' @pKlungHw.Note(j) THEN ' if it is not playing... IF ISFALSE BIT (Flags(j),1) THEN 'BIT(@pKlungHw.Flags(j),1) THEN ' if this note was not heard before... 'StartTask %klt + j- Klung.Lowtes 'Klung.Tnr(j) Mplay Klung.channel, j, velos(j) IF Nr = 1 THEN CONTROL ENABLE gh.cockpit,%GMT_SLIDE0_ID 'enable slider0 here END IF INCR Nr History = History + CHR$(j) 'add note to history Notes(j) = %True '@pKlungHw.Note(j) = %True 'BIT SET @pKlungHw.Flags(i),0 ' set the trigger flag for the causing anklung BIT SET Flags(j),0 = %True EXIT LOOP ELSE ' try another note... 'kl 0907 j = j + 7 'so in 20 steps, we checked all notes INCR k ' keep track of the number of trials... END IF END IF LOOP UNTIL k > 20 ELSE QueUp = i BIT SET Flags(i),0 'BIT SET @pKlungHw.Flags(i),0 END IF END IF END IF END IF k = %False FOR j = Klung.lowtes TO Klung.hightes IF j <> 68 THEN IF Notes(j) THEN INCR k 'IF @pKlungHw.Note(j) THEN INCR k END IF NEXT j IF ISFALSE k THEN Task(%Klungels).tog = %False ' make it resettable. EXIT FOR END IF NEXT i END SUB SUB Stochlung () '2015.1.23 irrepairable without reenabling the old types and tasks. better write a new piece from scratch 'id: make simular algorithms for every instrument, general AME's can be distibuted between instrs STATIC i AS LONG LOCAL j AS LONG LOCAL dummy AS SINGLE LOCAL tekst AS STRING STATIC InfLevel AS SINGLE 'level = infLevel * AME STATIC infFreq AS SINGLE STATIC infNeighb AS SINGLE 'influence to 'neighbour notes', defined as fourth u/d STATIC hoekLevel AS DOUBLE STATIC hoekFreq AS DOUBLE STATIC OnCount AS DWORD ' STATIC hDlgStchl AS LONG STATIC t0 AS DWORD 'time of begin of piece STATIC oldSlider0 AS LONG STATIC oldSlider1 AS LONG STATIC density AS BYTE LOCAL harm AS harmtype LOCAL debug AS STRING 'piece for klung by kl 'each klung has an amount of energy wich influences the levl and tremolo speed 'if the AME is high enough, it is slowly passed to the notes one fifth higher / lower IF ISFALSE task(%stochl).tog THEN 'this tog is reset when task is stopped by the user... task(%stochl).pan = 0 ' pan = 1 for end of piece, tasknr of klungeltask when the according button is clicked to raise energy level task(%stochl).tog = %true density = 64 IF Meta_AME_Klung<.5 THEN Meta_AME_Klung = 1 hoekLevel = 1 hoekFreq = 1.3' 2 infNeighb = .9 '1 ' .3 DIM AME(0 TO 19) AS STATIC DOUBLE 'amount of energy DIM HighCount(0 TO 19) AS STATIC DOUBLE 'init sliders Slider(0).minval = 1 Slider(0).maxval = 100 Slider(0).stap = 1 Slider(0).value = 0.3 * 100 Slider(1).minval = 1 Slider(1).maxval = 100 Slider(1).value = 0.6 * 100 oldSlider0 = slider(0).value oldSlider1 = slider(1).value SendMessage Slider(0).h, %TBM_SETRANGE,%True, MakeLong(Slider(0).minval, Slider(0).maxval) SendMessage Slider(0).h, %TBM_SETPAGESIZE,0,Slider(0).stap SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value SendMessage Slider(1).h, %TBM_SETRANGE,%True, MakeLong(Slider(1).minval, Slider(1).maxval) SendMessage Slider(1).h, %TBM_SETPOS,%True, Slider(1).value Warning "slider 0: average velo" Warning "slider 1: speed" AME(4) = .6 AME(1)=.5 SetDlgItemText gh.Cockpit, %GMT_TITLE, "" END IF ' ' 'main ' ' 'get params from sliders & buttons and store them in UAF ' Inflevel = Slider(0).value / 100 ' InfFreq = Slider(1).value / 100 ' ' hoekLevel = hoekLevel + Pi/(90 * task(%Stochl).freq) ' 1.5 min voor 1 cyclus ' IF hoekLevel = Pi THEN hoekLevel = 0 ' hoekFreq = hoekFreq + Pi/(140 * task(%Stochl).freq) ' 2.333 min / cyclus ' IF hoekFreq > Pi THEN hoekFreq = 0 ' InfLevel = InfLevel*ABS(SIN(hoekLevel))^2 ' InfFreq = InfFreq *ABS(SIN(hoekFreq)) '^4 ' IF InfFreq >.9 THEN InfFreq=.9 ' IF InfLevel <.23 THEN InfLevel=.23 ' IF inflevel >.72 THEN infLevel = .72 ' IF infFreq <.05 THEN infFreq = .05 ' ' 'main algo ' INCR i ' IF i >19 THEN i=0 ' ' task(%klt + i).level = 127 * AME(i) * infLevel ' task(%klt + i).freq = .1 + @pKlungHw.res(49 + i) * AME(i) * infFreq ' IF task(%klt + i).level > 20 THEN ' IF ISFALSE BIT (task(%klt + i).swit,%TASK_ONOFF) THEN StartTask %klt + i: EXIT SUB ' ELSEIF task(%klt +i).swit AND %TASK_ONOFF THEN ' StopTask %klt + i ' END IF ' j = i - 7 ' DO WHILE j < 0: j = j + 12: LOOP ' AME(j) = AME(j) + AME(i) * (infNeighb / (2*task(%Stochl).freq)) ' j = i + 7 ' DO WHILE j > 19: j = j - 12: LOOP ' AME(j) = AME(j) + AME(i) * (infNeighb / (2*task(%Stochl).freq)) ' AME(i) = AME(i) - AME(i) * (infNeighb / task(%Stochl).freq) ' IF AME(i) < .3 THEN ' AME(j) = AME(j) + AME(i) 'last bit passed at once.. ' AME(i) = 0 ' StopTask %klt + i ' END IF ' IF AME(i) > Meta_AME_Klung THEN ' AME(i) = 0 'too much energy is deadly... the energy is spread over all klungs, and a little bit is lost ' FOR j = 0 TO 19 ' AME(j) = AME(j) + 0.035 ' NEXT ' END IF ' ' 'if a semitone higher / lower has a much lower ame, absorb it at once ' 'if a semitone higher/lower is only a little bit higher, lock in with it ' j = i - 1 ' IF j > 0 THEN ' IF AME(j) < AME(i) / 2 THEN ' AME(i) = AME(i) + AME (j) ' AME(j) = %false ' ELSEIF ABS(AME(j) - AME(i)) < .1 THEN ' IF AME(j) > AME(i) THEN AME(i) = AME(j) ' IF AME(i) > AME(j) THEN AME(j) = AME(i) ' END IF ' END IF ' j = j + 1 ' IF j > 19 THEN EXIT SUB ' IF AME(j) < AME(i) / 2.5 THEN ' AME(i) = AME(i) + AME (j) ' AME(j) = %false ' ELSEIF ABS(AME(j) - AME(i)) < .13 THEN ' IF AME(j) > AME(i) THEN AME(i) = AME(j) ' IF AME(i) > AME(j) THEN AME(j) = AME(i) ' END IF ' ' 'high energy's grow automaticly ' IF (AME(i) > Meta_AME_Klung/2 AND AME(i) < Meta_AME_Klung) THEN AME(i) = AME(i) *1.085 ''__________________________________________________________________________-- '' <-- this should be deleted in the final version ' OnCount = %false ' FOR j = 0 TO 19 ' IF BIT (task(%klt + j).swit, %TASK_ONOFF) THEN INCR OnCount ' NEXT '' info STR$(oncount), "" ' IF OnCount < 2 THEN ' AME(CEIL(RND*19)) = .4 + RND * 6 ' END IF ' IF OnCount > 10 THEN ' FOR j = 0 TO 19 ' AME(j) = AME(j)*.98 ' NEXT ' END IF ' ' --> ''__________________________________________________________________________-- ' ' IF (AME(i) > Meta_AME_Klung/5) THEN 'if energy is high for a long time, we're getting tired... ' INCR HighCount(i) ' ' klunglog STR$(i)+" : "+STR$(Highcount(i)) ' IF HighCount(i) > 7 THEN ' 'klunglog "stop" + STR$(i) ' AME(i) = %false'AME(i) - .07 ' END IF ' IF AME(i)>Meta_AME_Klung THEN AME(i)=Meta_AME_Klung ' ELSE ' IF AME(i) < 0 THEN AME(i) = 0 ' IF HighCount(i) THEN DECR highCount(i) ' END IF ' ''________________________________________________________________________________-- '' <-- ' ' FOR j = 0 TO 19 ' IF AME(j)>Meta_AME_Klung THEN AME(j) = Meta_AME_Klung ' NEXT '' --> ''________________________________________________________________________________-- END SUB FUNCTION StochlungEnd() AS LONG task(%stochl).pan = 1 'signal for the task to perform its end CONTROL DISABLE gh.cockpit,%GMT_TASK0_ID + 1 END FUNCTION SUB KlungelHarm () ' this compositional task uses all the individual klung-shaking tasks. ' not used yet... ' 22.11.2015: should run again... LOCAL done AS LONG LOCAL n AS DWORD STATIC tc AS INTEGER STATIC tog AS DWORD STATIC n1 AS INTEGER STATIC n2 AS INTEGER STATIC n3 AS INTEGER STATIC h AS HarmType 'heeft timerproblemen!!!! IF ISFALSE Task(%Klungel_Harm).tog THEN Slider(0).minval = 1 Slider(0).maxval = 127 Slider(0).stap = 1 Slider(0).value = 64 Slider(0).tag = "dyna" Slider(1).minval = 1 ' tempo Slider(1).maxval = 16 Slider(1).value = 2 slider(1).tag = "tempo" Task(%Klungel_Harm).Har.vel = STRING$(128,0) h.vel = STRING$(128,0) FillHarType h SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER0, Slider(0).tag SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER1, Slider(1).tag SendMessage Slider(0).h, %TBM_SETRANGE,%True, MakeLong(Slider(0).minval, Slider(0).maxval) SendMessage Slider(0).h, %TBM_SETPAGESIZE,0,Slider(0).stap SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value SendMessage Slider(1).h, %TBM_SETRANGE,%True, MakeLong(Slider(1).minval, Slider(1).maxval) SendMessage Slider(1).h, %TBM_SETPOS,%True, Slider(1).value FOR n = %klt TO %klt + 19 Task(n).level = Slider(0).value Task(n).freq = 4 NEXT n tog = %False SetDlgItemText gh.Cockpit, %GMT_TITLE, "" Task(%Klungel_Harm).tog = %True END IF CONTROL SET TEXT gh.cockpit, %GMT_AUTHOR, STR$(timegettime) IF ISFALSE BIT (tog,0) THEN Task(%Klungel_Harm).Har.vel = STRING$(128,0) n1 = GetRndNote (%md1, tc) ' minor logfile STR$(n1) warning "loop" DO n2 = GetRndNote (%md1, tc) LOOP UNTIL n2 <> n1 warning "ok" + STR$(n2) n2 = n2 + 60 n1 = n1 + 48 IF n1 = 48 THEN n1 = n1 + 12 IF n2 > Klung.hightes THEN n2 = n2 - 12 IF n2 = 68 THEN n2 = n2 - 12 IF (n1 > 48) AND (n1 < 70) THEN ' shaking tasks start at %klt for note 49 to 67, 68 not present ' task(Klung.Tnr(n1)).freq = 0.3 * (RND(1)*20) 'task(%klt + n1 - Klung.LowTes).freq = 0.3 * (RND(1)*20) KeyPress Klung.channel, n1, 1+ (RND(1)*80) ' IF task(Klung.Tnr(n1)).freq < Task(%Klungel_Harm).freq THEN task(Klung.Tnr(n1)).freq = Task(%Klungel_Harm).freq 'IF task(%klt + n1 - Klung.LowTes).freq < Task(%Klungel_Harm).freq THEN task(%klt + n1 - Klung.LowTes).freq = Task(%Klungel_Harm).freq AddNote2Har Task(%Klungel_Harm).Har, n1, Slider(0).value END IF IF (n2 > 48) AND (n2 < 70) THEN ' task(Klung.Tnr(n2)).freq = 0.3 * (RND(1)*20) 'task(%klt + n2 - Klung.LowTes).freq = 0.3 * (RND(1)*20) KeyPress Klung.channel, n2, 1+ (RND(1)*80) 'IF task(%klt + n2 - Klung.LowTes).freq < Task(%Klungel_Harm).freq THEN task(%klt + n2 - Klung.LowTes).freq =Task(%Klungel_Harm).freq AddNote2Har Task(%Klungel_Harm).Har, n2, Slider(0).value END IF ELSE ' solve chord: warning "solve" h.vel = SolveHar$ (Task(%Klungel_Harm).har, tc, 0) '0.5) Task(%Klungel_Harm).Har.vel = STRING$(128,0) n1 = StealNoteFromHar (h, n1, Klung.lowtes, Klung.hightes) n2 = StealNoteFromHar (h, n2, Klung.hightes, Klung.lowtes) IF n1 = 48 THEN n1 = n1 + 12 IF n2 > Klung.hightes THEN n2 = n2 - 12 IF n2 = 68 THEN n2 = n2 - 12 IF (n1 > 48) AND (n1 < 70) THEN 'task(%klt + n1 - Klung.LowTes).freq = 0.2 * (RND(1)*25) KeyPress Klung.channel, n1, 1+ (RND(1)*40) 'IF task(%klt + n1 - Klung.LowTes).freq < Task(%Klungel_Harm).freq THEN task(%klt + n1 - Klung.LowTes).freq = Task(%Klungel_Harm).freq AddNote2Har Task(%Klungel_Harm).Har, n1, Slider(0).value END IF IF (n2 > 48) AND (n2 < 70) THEN 'task(%klt + n2 - Klung.LowTes).freq = 0.2 * (RND(1)*25) KeyPress Klung.channel, n2, 1+ (RND(1)*40) 'IF task(%klt + n2 - Klung.LowTes).freq < Task(%Klungel_Harm).freq THEN task(%klt + n2 - Klung.LowTes).freq = Task(%Klungel_Harm).freq AddNote2Har Task(%Klungel_Harm).Har, n2, Slider(0).value END IF END IF INCR tog ' Klung_PlayHarShaking Task(%Klungel_Harm).Har ' for klung PlayHar Task(%Klungel_Harm).Har, %Klung_Channel ' midi test IF ISFALSE tog MOD 12 THEN tc = (tc + 5) MOD 12 DO SELECT CASE tc CASE 0,8,9,10,11 ' onmogelijke toonaarden worden hier geelimineerd ... tc = (tc+5) MOD 12 ITERATE DO CASE ELSE done = %True 'EXIT LOOP END SELECT LOOP UNTIL done = %True done = %False END IF Task(%Klungel_Harm).freq = Slider(1).value END SUB SUB KlungTango () ' the ... ' This tango has to be sung along with this Klung accompaniment. ' The song line can be freely improvised, in tango style. ' The tango is in D major. ' First version premiered on 04.07.2000 - for RTBF television. ' Second series of performances: Monumentendag - melle. ' Tourcoing 28/10/2001 ... ' needs upgrade 2015. STATIC TangoDance AS TangoType STATIC tik AS BYTE STATIC n() AS BYTE STATIC no() AS BYTE STATIC j AS BYTE STATIC sl0 AS DWORD STATIC sl1 AS DWORD LOCAL t AS DWORD LOCAL i AS INTEGER LOCAL dum AS STRING LOCAL COUNT AS DWORD LOCAL sig! LOCAL octave AS BYTE LOCAL nv% LOCAL tv% LOCAL tst AS DWORD LOCAL tempofaktor AS SINGLE IF ISFALSE Task(%KlungelTango).tog THEN Slider(0).minval = 1 Slider(0).maxval = 127 Slider(0).stap = 1 Slider(0).value = 60'maxNr Slider(0).tag = "velo" Slider(1).minval = 1 Slider(1).maxval = 127 Slider(1).stap = 1 Slider(1).value = 54 '60 - 07.11.2001 Slider(1).tag = "tempo" SendMessage Slider(0).h, %TBM_SETRANGE,%True, MakeLong(Slider(0).minval, Slider(0).maxval) SendMessage Slider(0).h, %TBM_SETPAGESIZE,0,Slider(0).stap SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value SendMessage Slider(1).h, %TBM_SETRANGE,%True, MakeLong(Slider(1).minval, Slider(1).maxval) SendMessage Slider(1).h, %TBM_SETPOS,%True, Slider(1).value SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER0, Slider(0).tag '"velo" SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER1, Slider(1).tag '"tempo" warning "slider 0: velocity" warning"slider 1 tempo" +$CRLF+"remember that the final chord needs to be ended manually..." TangoDance.tc = 2 '4 ' start in E major. - changed to D major 03.07.2000 TangoDance.sectioncounter = 0 ' 0, 1, 2 , 3 TangoDance.barcounter = 0 TangoDance.nrbars = 16 ' max. 20, voor een klassieke tango App.tempo = 54 ' keep it pretty slow DIM n(0 TO 6) AS STATIC BYTE DIM no(0 TO 6) AS STATIC BYTE DIM Patterns(0 TO TangoDance.nrBars-1,0 TO %RitmArraySize) AS STATIC BYTE DIM Notes(0 TO 15, 0 TO 15) AS STATIC BYTE ' actually, the scales... KlungTango_NoteData Notes() ' read the note data KlungTango_RitmeData Patterns(), TangoDance ' read rhythm data tik = %False TangoDance.barcounter = %False TangoDance.sectioncounter = %False j = %False Task(%KlungelTango).level =127 Task(%KlungelTango).channel = 0 Task(%KlungelTango).freq = (App.tempo * 4) / (60! * Patterns(0,0)) Task(%KlungelTango).tog = %True SetDlgItemText gh.Cockpit, %GMT_TITLE, "" EXIT SUB END IF GOTO TangoChords ' skip melody for now... ' we should calculate the melody after the chords, not before... DO n(3) = TangoDance.tc + Notes(TangoDance.Sectioncounter,RND(1) * 15) 'GetRndNote (%md1, TangoDance.tc) n(3) = (n(3) MOD 12) + 60 IF n(3) > 69 THEN n(3) = n(3) - 12 LOOP UNTIL (%klt + n(3) - Klung.LowTes) 'Klung.Tnr(n(3)) ' uitsturing van deze random melodie: IF n(3) <> no(3) THEN IF no(3) THEN 'StopTask %klt + no(3) - Klung.LowTes 'Klung.Tnr(no(3)) NoteOff Klung.channel, no(3) DelNote2Har Task(%KlungelTango).Har, (no(3)) 'NoteOff Task(%KlungelTango).channel, no(3) END IF 'Task(%klt + n(3) - Klung.LowTes).level = Slider(0).value '* @pKlungHw.Vel(n(3)) 'Task(%klt + n(3) - Klung.LowTes).freq = 1 + INT((RND(1)*3)) ' ??? IF n(3) THEN 'StartTask %klt + n(3) - Klung.Lowtes 'Klung.Tnr((n(3))) Keypress Klung.channel, n(3), 1 + INT((RND(1)*3)) mPlay Klung.channel , n(3), Slider(0).value ' double with midi AddNote2Har Task(%KlungelTango).Har,INT(n(3)),Slider(0).value no(3) = n(3) END IF END IF Tangochords: ' begeleiding in drieklanken tempofaktor = (Slider(1).value - 64) / 64 ' -1 TO + 1 ' range -50% to + 50% IF tempofaktor >= 0 THEN tempofaktor = 1 + tempofaktor ' 1 to 2 ELSE tempofaktor = 1 / (ABS(tempofaktor) + 1) ' 0.5 to 1 ' cockpit onderste slider END IF octave = 48 SELECT CASE tik CASE 0,1 Task(%KlungelTango).level = Slider(0).value ' cockpit bovenste slider n(0) = 12 + TangoDance.tc n(1) = octave + TangoDance.tc + Notes(TangoDance.Sectioncounter,2) n(2) = octave + TangoDance.tc + Notes(TangoDance.Sectioncounter,4) CASE 8 Task(%KlungelTango).level = 0.9 * Slider(0).value ' cockpit bovenste slider n(0) = 12 + TangoDance.tc + Notes(TangoDance.Sectioncounter,4) n(1) = octave + TangoDance.tc + Notes(TangoDance.Sectioncounter,6) n(2) = %False CASE 4, 12 Task(%KlungelTango).level = 0.6 * Slider(0).value ' cockpit bovenste slider n(0) = 12 + TangoDance.tc + Notes(TangoDance.Sectioncounter,3) n(1) = %False n(2) = %False CASE 13,14, 15 Task(%KlungelTango).level = 0.8 * Slider(0).value ' cockpit bovenste slider SELECT CASE TangoDance.barcounter CASE TangoDance.NrBars -1 ' we have to prepare for modulation now!!! SELECT CASE TangoDance.Sectioncounter CASE 0 'after section 0, we go to the dominant major, use dim7: n(0) = 12 + TangoDance.tc + Notes(TangoDance.Sectioncounter,0) n(1) = octave + TangoDance.tc + Notes(TangoDance.Sectioncounter,3)+1 ' IV+ n(2) = n(0)+ 3 CASE 1 ' go back to tonic major: n(0) = 12 + TangoDance.tc + 4 ' nieuwe leidtoon n(1) = n(0) + 4 ' alteratie n(2) = n(1) + 2 CASE 2 ' modulate to minor: n(0) = 12 + Tangodance.tc + 8 n(1) = n(0) + 6 n(2) = n(1) + 3 CASE 3 ' modulate to tc - minor n(0) = 12 + TangoDance.tc + 2 n(1) = n(0) + 2 n(2) = n(1) + 5 END SELECT CASE ELSE ' gewoon leidtoonakkoord: n(0) = 12 + TangoDance.tc + Notes(TangoDance.Sectioncounter,6)-12 ' leidtoon n(1) = octave + TangoDance.tc + Notes(TangoDance.Sectioncounter,3) ' IV n(2) = octave + TangoDance.tc + Notes(TangoDance.Sectioncounter,1) ' II END SELECT CASE 6,7 ' was 7 only before 7.11.2001 Task(%KlungelTango).level = 0.7 * Slider(0).value ' cockpit bovenste slider n(1) = 12 + TangoDance.tc + Notes(TangoDance.Sectioncounter,5) n(0) = octave + TangoDance.tc + Notes(TangoDance.Sectioncounter,2) n(2) = %False CASE ELSE Task(%KlungelTango).level = 0.5 * Slider(0).value ' cockpit bovenste slider i = n(0) MOD 8 ' 7 notes in the scale n(0) = 12 + TangoDance.tc + Notes(TangoDance.Sectioncounter, i) n(1) = octave + TangoDance.tc + Notes(TangoDance.Sectioncounter, i +2) ' third above... n(2) = octave + TangoDance.tc + Notes(TangoDance.Sectioncounter, i +4) ' fifth above... END SELECT ' limit notes to ambitus of klung: FOR i = 0 TO 2 IF n(i) THEN ' limit to klung ambitus: IF n(i) < Klung.lowtes THEN DO n(i) = n(i) + 12 LOOP UNTIL n(i) >= Klung.lowtes END IF IF n(i) > Klung.hightes THEN DO n(i) = n(i) - 12 LOOP UNTIL n(i) =< Klung.hightes END IF IF n(i) = 68 THEN n(i) = n(i) - 12 END IF ' IF ISFALSE Klung.Tnr(n(i)) THEN n(i) = %False ???? - .Tnr is nooit %false NEXT i ' eliminate identical notes: IF n(0) = n(1) THEN n(1) = %False IF n(0) = n(2) THEN n(2) = %False IF n(1) = n(2) THEN n(2) = %False ' first switch old notes off: FOR i = 0 TO 2 IF no(i) THEN 'IF BIT (Task(Kn(no(i))).swit,0) THEN StopTask Kn(no(i)) 'StopTask %klt + no(i) - Klung.LowTes 'Klung.Tnr(no(i)) NoteOff Klung.channel, no(i) '@pKlungHw.note(no(i))= %False DelNote2Har Task(%KlungelTango).Har,(no(i)) 'NoteOff Task(%KlungelTango).channel + i + 1, no(i) no(i) = %False END IF NEXT i ' new notes on: FOR i = 0 TO 2 IF n(i) THEN IF Task(%KlungelTango).level THEN 'mPlay 'Task(%klt + n(i) - Klung.LowTes).level = Task(%KlungelTango).level' * @pKlungHw.Vel(n(i)) ' scaling 'Task(%klt + n(i) - Klung.LowTes).freq = (App.Tempo * tempofaktor /60) * 4 '2 ' 2 = eights' 4 = sixteenths 'IF ISFALSE Task(Kn(n(i))).swit THEN 'StartTask %klt + n(i) - Klung.LowTes 'Klung.Tnr(n(i)) '@pKlungHw.note(n(i)) = %True KeyPress Klung.channel, n(i), (App.Tempo * tempofaktor /60) * 4 'mPlay Klung.channel, n(i),Task(%KlungelTango).level AddNote2Har Task(%KlungelTango).Har,INT(n(i)), INT(Task(%KlungelTango).level) mPlay Klung.channel, n(i),Task(%KlungelTango).level no(i)= n(i) 'END IF END IF END IF NEXT i Task(%KlungelTango).freq = (App.tempo * tempofaktor * 4) / (60! * Patterns(TangoDance.barcounter,j)) tik = tik + Patterns(TangoDance.barcounter,j) '1.... 16 INCR j IF tik = 16 THEN ' nu moet Patterns(TangoDance.barcounter,j) = %False !!! tik = %False ' so tik counts 0- 15 j = %False INCR TangoDance.barcounter IF TangoDance.barcounter = TangoDance.NrBars THEN TangoDance.barcounter = %False INCR TangoDance.Sectioncounter IF TangoDance.Sectioncounter = 4 THEN Controller Klung.channel, 123, %False StopTask %KlungelTango ' but we should Play a finale... Task(%KlungelTango + 1).freq = Task(%KlungelTango).freq 'Task(%KlungelTango).tog = %False ' make it resettable... StartTask %KlungelTango + 1 SetDlgItemText gh.Cockpit, %GMT_MSG2, "KlungelTango Finished..." & CHR$(0) ELSE TangoDance.Sectioncounter = TangoDance.Sectioncounter AND 3 END IF SELECT CASE TangoDance.SectionCounter CASE 0 TangoDance.tc = 2 ' 4 ' 0 ' deel 1 en 3: 14-20 maten tonika CASE 1 TangoDance.tc = 9 '11 '7 ' deel 2 14-20 maten dominant CASE 2 TangoDance.tc = 2 '4 '0 ' deel 1 en 3: 14-20 maten tonika CASE 3 TangoDance.tc = 11 '1 '9 ' deel 4 14-20 maten mineur END SELECT END IF SetDlgItemText gh.Cockpit, %GMT_MSG2, STR$(TangoDance.SectionCounter + 1) + "/" +STR$(TangoDance.Barcounter+ 1) END IF END SUB SUB KlungTangoEnd () EXPORT STATIC tik AS DWORD STATIC COUNT AS WORD LOCAL tempofaktor AS SINGLE LOCAL i AS INTEGER LOCAL tekst AS STRING 'restarts tango !! ' would be better to use solvechord... IF ISFALSE Task(%KlungelTango + 1).tog THEN Task(%KlungelTango + 1).tog = %True EXIT SUB END IF tempofaktor = (Slider(1).value - 64) / 64 ' -1 TO + 1 ' range -50% to + 50% IF tempofaktor >= 0 THEN tempofaktor = 1 + tempofaktor ' 1 to 2 ELSE tempofaktor = 1 / (ABS(tempofaktor) + 1) ' 0.5 to 1 ' cockpit onderste slider END IF INCR COUNT 'Klunglog STR$(count) + STR$(task(%klungelTango+1).freq) + CHR$(13)+STR$(RND) SELECT CASE COUNT CASE 8 NoteOff Klung.channel, 69 'StopTask %klt + 69 - Klung.LowTes 'Klung.Tnr(69) CASE 11 'StopTask %klt + 65 - Klung.LowTes 'Klung.Tnr(65) NoteOff Klung.channel, 65 CASE 14 'StopTask %klt + 62 - Klung.LowTes 'Klung.Tnr(62) NoteOff Klung.channel, 62 CASE 18 'StopTask %klt + 57 - Klung.Lowtes 'Klung.Tnr(57) NoteOff Klung.channel, 57 CASE 26 'StopTask %klt + 50 - Klung.LowTes 'Klung.Tnr(50) NoteOff Klung.channel, 50 StopTask %klungelTango + 1 STartTask %klungelTango ' restarts... COUNT = %false CASE 1 'start chord: ' mPlay final chord: ' first old chord off: FOR i = Klung.lowtes TO Klung.hightes IF i <> 68 THEN 'IF Task(%klt + i - Klung.LowTes).swit AND 1 THEN 'StopTask %klt + i - Klung.LowTes 'Klung.Tnr(i) NoteOff Klung.channel, i '@pKlungHw.note(i)= %False DelNote2Har Task(%KlungelTango+1).Har,i 'NoteOff Task(%KlungelTango+1).channel + i + 1, i 'END IF END IF NEXT i ' final chord on: (D- minor) Task(%klt + 50 - Klung.LowTes).level = Task(%KlungelTango).level '* @pKlungHw.Vel(50) ' scaling - Re Task(%klt + 57 - Klung.LowTes).level = Task(%KlungelTango).level '* @pKlungHw.Vel(57) ' - La Task(%klt + 62 -Klung.LowTes).level = Task(%KlungelTango).level '* @pKlungHw.Vel(62) ' - Re' Task(%klt + 65 - Klung.LowTes).level = Task(%KlungelTango).level '* @pKlungHw.Vel(65) ' - Fa' Task(%klt + 69 - Klung.LowTes).level = Task(%KlungelTango).level '* @pKlungHw.Vel(69) ' - La' ' Task(%klt + 50 - Klung.LowTes).freq = (App.Tempo * tempofaktor /60) * 2 ' 2 = eights' 4 = sixteenths ' Task(%klt + 57 - Klung.LowTes).freq = (App.Tempo * tempofaktor /60) * 3 ' triplets ' Task(%klt + 62 -Klung.LowTes).freq = (App.Tempo * tempofaktor /60) * 4 ' Task(%klt + 65 - Klung.LowTes).freq = (App.Tempo * tempofaktor /60) * 6 ' Task(%klt + 69 - Klung.LowTes).freq = (App.Tempo * tempofaktor /60) * 6 Keypress Klung.channel, 50,(App.Tempo * tempofaktor /60) * 2 ' 2 = eights' 4 = sixteenths Keypress Klung.channel, 57,(App.Tempo * tempofaktor /60) * 3 Keypress Klung.channel, 62,(App.Tempo * tempofaktor /60) * 4 Keypress Klung.channel, 65,(App.Tempo * tempofaktor /60) * 6 Keypress Klung.channel, 69,(App.Tempo * tempofaktor /60) * 6 ' StartTask %klt + 50 - Klung.LowTes ' StartTask %klt + 57 - Klung.LowTes ' StartTask %klt + 62 -Klung.LowTes ' StartTask %klt + 65 - Klung.LowTes ' StartTask %klt + 69 - Klung.LowTes mPlay Klung.channel, 50,Task(%KlungelTango).level mPlay Klung.channel, 57,Task(%KlungelTango).level mPlay Klung.channel, 62,Task(%KlungelTango).level mPlay Klung.channel, 65,Task(%KlungelTango).level mPlay Klung.channel, 69,Task(%KlungelTango).level ' @pKlungHw.note(50) = %True ' @pKlungHw.note(57) = %True ' @pKlungHw.note(62) = %True ' @pKlungHw.note(65) = %True ' @pKlungHw.note(69) = %True AddNote2Har Task(%KlungelTango).Har,50, INT(Task(%KlungelTango).level) AddNote2Har Task(%KlungelTango).Har,57, INT(Task(%KlungelTango).level) AddNote2Har Task(%KlungelTango).Har,62, INT(Task(%KlungelTango).level) AddNote2Har Task(%KlungelTango).Har,65, INT(Task(%KlungelTango).level) AddNote2Har Task(%KlungelTango).Har,69, INT(Task(%KlungelTango).level) END SELECT END SUB SUB KlungTango_RitmeData (Patterns() AS BYTE, Tango AS TangoType) EXPORT LOCAL tik AS DWORD LOCAL j AS DWORD LOCAL COUNT AS DWORD LOCAL dum AS STRING tik = %False j = %False COUNT = %False DO INCR COUNT dum = READ$(COUNT) Patterns(Tango.barcounter,j)= VAL(dum) tik = tik + Patterns(Tango.barcounter,j) INCR j IF tik = 16 THEN Patterns(Tango.barcounter,j) = %False ' afsluiter. INCR Tango.barcounter j = %False tik = %False END IF IF COUNT > DATACOUNT THEN EXIT LOOP LOOP UNTIL Tango.barcounter = 16 EXIT SUB ' ritmische patronen voor 16 maten: - 16 tikken per maat in 4/4 ' de som van elk groep moet = 16 'DATA 1 was: '3,1,2,2,4,3,1 'DATA 2 was: '1,2,1,2,2,4,3,1 'DATA 3 was: '1,2,1,2,2,3,1,2,2 'DATA 5 was: '1,2,2,5,4,2 'DATA 7 was: '1,2,2,2,3,2,3,1 'DATA 9 was: '3,3,1,1,2,3,2,1 'DATA 11 was: '3,1,4,1,1,1,1,1,2,1 'DATA 15 was: '6,2,6,2 'DATA 16 was: '1,2,11,2 ' important remark: NO COMMENTS ALLOWED IN DATA STATEMENTS !!! DATA 2,4,2,4,4 DATA 3,1,2,2,4,3,1 DATA 2,4,2,3,1,2,2 DATA 1,3,2,2,1,1,2,2,1,1 DATA 2,4,4,4,2 DATA 3,1,2,4,3,1,1,1 DATA 2,4,2,3,3,2 DATA 1,2,1,2,2,1,2,1,2,2 DATA 2,4,1,1,2,3,2,1 DATA 3,1,4,1,6,1 DATA 2,4,2,1,1,1,1,1,2,1 DATA 1,1,2,7,1,1,2,1 DATA 2,4,2,6,2 DATA 2,4,8,2 DATA 2,4,2,6,2 DATA 2,4,7,3 END SUB SUB KlungTango_NoteData (Notes() AS BYTE) EXPORT LOCAL COUNT AS LONG LOCAL i AS BYTE LOCAL j AS BYTE LOCAL dum AS STRING '//as in Songbook - mapping op note scales - Major - Major - Major - Minor COUNT = %False FOR i = 0 TO 15 j = %False DO INCR COUNT dum = READ$(COUNT) Notes(i,j)= VAL(dum) INCR j LOOP UNTIL j = 16 'IF count > DATACOUNT THEN EXIT LOOP ' error condition... NEXT i EXIT SUB DATA 00,02,04,05,07,09,11,12, 14,16,17,19,21,23,24,26 DATA 00,02,04,05,07,09,11,12, 14,16,17,19,21,23,24,26 DATA 00,02,04,05,07,09,11,12, 14,16,17,19,21,23,24,26 DATA 00,02,03,05,07,08,11,12, 14,15,17,19,20,23,24,26 DATA 00,02,04,05,07,09,11,12, 14,16,17,19,21,23,24,26 DATA 00,02,04,05,07,09,11,12, 14,16,17,19,21,23,24,26 DATA 00,02,04,05,07,09,11,12, 14,16,17,19,21,23,24,26 DATA 00,02,03,05,07,08,11,12, 14,15,17,19,20,23,24,26 DATA 00,02,04,05,07,09,11,12, 14,16,17,19,21,23,24,26 DATA 00,02,04,05,07,09,11,12, 14,16,17,19,21,23,24,26 DATA 00,02,04,05,07,09,11,12, 14,16,17,19,21,23,24,26 DATA 00,02,03,05,07,08,11,12, 14,15,17,19,20,23,24,26 DATA 00,02,04,05,07,09,11,12, 14,16,17,19,21,23,24,26 DATA 00,02,04,05,07,09,11,12, 14,16,17,19,21,23,24,26 DATA 00,02,04,05,07,09,11,12, 14,16,17,19,21,23,24,26 DATA 00,02,03,05,07,08,11,12, 14,15,17,19,20,23,24,26 END SUB SUB Klung_Gray () ' written for Patersholfeesten, august 2002. Premiere: 10.08.2002 LOCAL n AS DWORD LOCAL m AS DWORD LOCAL i AS DWORD STATIC sh AS DWORD STATIC cnt AS DWORD STATIC interval AS DWORD STATIC solve AS HarmType IF ISFALSE Task(%Klung_Gray).tog THEN 'i = %False sh = %False cnt = %False interval = 3 ' minor thirds at start Task(%Klung_Gray).freq = 2 '0.5 Slider(0).minval = 1 Slider(0).maxval = 127 Slider(0).stap = 1 Slider(0).value = 64 Slider(0).tag = "dyna" Slider(1).minval = 1 ' shaking speed Slider(1).maxval = 16 Slider(1).value = 6 slider(1).tag = "speed" Solve.Vel = STRING$(128,0) Task(%Klung_Gray).Har.vel = STRING$(128,0) SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER0, Slider(0).tag SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER1, Slider(1).tag SendMessage Slider(0).h, %TBM_SETRANGE,%True, MakeLong(Slider(0).minval, Slider(0).maxval) SendMessage Slider(0).h, %TBM_SETPAGESIZE,0,Slider(0).stap SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value SendMessage Slider(1).h, %TBM_SETRANGE,%True, MakeLong(Slider(1).minval, Slider(1).maxval) SendMessage Slider(1).h, %TBM_SETPOS,%True, Slider(1).value FOR n = %klt TO %klt + 19 Task(n).freq = Slider(1).value Task(n).level = Slider(0).value NEXT n Task(%Klung_Gray).tog = %True SetDlgItemText gh.Cockpit, %GMT_TITLE, "" 'EXIT SUB END IF i = Gray(cnt) IF sh THEN SHIFT LEFT i,sh IF BitCount(i AND &H0FFFFF&) >= 3 THEN Solve.vel = SolveHar (Task(%Klung_Gray).Har, -1, 0) END IF FOR n = 0 TO 19 '20 shakers in klung IF interval = 3 THEN m = (n * 3) MOD 20 '21 ' 0-20 ' dit is de noot... ELSE m = (n * interval) MOD 21 END IF IF m <> 19 THEN 'if m = 19 then m = 18 'bit reset i,19 IF m = 20 THEN m = 19 IF BIT(i,n) THEN ' remapped so that we change between dim7th's, augmented 5th's, fourths 'Task(%klt + m).level = MAX(Slider(0).value - m,10) 'Task(%klt + m).freq = Slider(1).value IF m <> 19 THEN AddNote2Har Task(%Klung_Gray).Har, 49 + m, MAX(Slider(0).value - m ,10) ELSE AddNote2Har Task(%Klung_Gray).Har, 69, MAX(Slider(0).value - m ,10) END IF ELSE IF m <> 19 THEN DelNote2Har Task(%Klung_Gray).Har, 49 + m ELSE DelNote2Har Task(%Klung_Gray).Har, 69 END IF END IF END IF NEXT n IF Bitcount(i AND &H0FFFFF&) =< 1 THEN IF Solve.vel <> STRING$(128,0) THEN ' for klung: 'Klung_PlayHarShaking Solve PlayHar Solve, %Klung_channel ' midi Solve.vel = STRING$(128,0) ELSE 'Klung_PlayHarShaking Task(%Klung_Gray).Har PlayHar Task(%Klung_Gray).Har, %Klung_Channel ' midi END IF ELSE 'Klung_PlayHarShaking Task(%Klung_Gray).Har PlayHar Task(%Klung_Gray).Har, %Klung_Channel ' midi END IF INCR cnt IF cnt > 15 THEN cnt = %False INCR sh IF sh > 20 THEN sh = %False INCR interval END IF END IF IF interval > 5 THEN interval = 3 'Klung_PlayHarShaking Solve stoptask %Klung_Gray END IF END SUB 'helper acro'svoor thomas stuk MACRO knon (n,k ) '!!! keypress should come first. otherwise it doesn't work KeyPress Klung.channel, Klung.LowTes + n, k mPlay Klung.channel, Klung.LowTes + n, 64 ' logfile "+++++on"+ str$(n) + str$(k) END MACRO MACRO knof(n) NoteOff Klung.channel, Klung.LowTes + n ' logfile "-----off" + str$(n) END MACRO SUB Thomas () ' this will no longer work. ' 22.11.2015: ask Kristof to recode it. in the works .. got to bar 52.. STATIC beat AS LONG STATIC measure AS LONG STATIC slow AS SINGLE STATIC medium AS SINGLE STATIC fast AS SINGLE STATIC init AS LONG LOCAL i AS LONG IF ISFALSE task(%klungelthomas).tog THEN warning FUNCNAME$ + " - some notes where removed because of timer problems!!!" ' ProgChange Klung.channel, 122 task(%klungelthomas).tog = %true task( %klungelthomas).freq= 24 FOR i = 0 TO 20 task(%klt + i).level = 60 task(%klt + i).freq = 10 NEXT Slider(0).minval = 3 Slider(0).maxval = 127 Slider(0).stap = 1 Slider(0).value = 20 Slider(1).minval = 8 Slider(1).maxval = 127 Slider(1).value = 40 SendMessage Slider(0).h, %TBM_SETRANGE,%True, MakeLong(Slider(0).minval, Slider(0).maxval) SendMessage Slider(0).h, %TBM_SETPAGESIZE,0,Slider(0).stap SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value SendMessage Slider(1).h, %TBM_SETRANGE,%True, MakeLong(Slider(1).minval, Slider(1).maxval) SendMessage Slider(1).h, %TBM_SETPAGESIZE,0,Slider(0).stap SendMessage Slider(1).h, %TBM_SETPOS,%True, Slider(1).value SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER0, "slow" SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER1, "mid" SetDlgItemText gh.Cockpit, %GMT_TITLE, "" warning "slider 0: shaking tempo of slow notes" warning "slider 1 shaking tempo of medium notes" +$CRLF+"high note shaking tempo remains constant"" measure = 1 beat=0 slow = 20 medium =40 fast = 100 END IF INCR beat IF beat = 49 THEN beat = 0 INCR measure END IF ' logfile str$(measure) + ":"+ str$(beat) CONTROL SET TEXT gh.cockpit, %GMT_MSG1, STR$(measure) + ":" + STR$(beat) + STR$(timegettime) ' IF slow <> Slider(0).value THEN slow = Slider(0).value ' END IF ' IF medium <> Slider(1).value THEN medium = Slider(1).value '' END IF CONTROL SET TEXT gh.cockpit, %GMT_MSG2, STR$(slow) + STR$(medium) SELECT CASE measure CASE 1 SELECT CASE beat CASE 1 ' Task(%klt).freq = medium '10 '' StartTask %klt knon (0, medium) CASE 37 ' StopTask %klt ' Task(%klt + 7).freq = medium ' StartTask %klt + 7 ' knof (0) knon (7, medium) END SELECT CASE 2 SELECT CASE beat CASE 13 ' StopTask %klt + 7 ' Task(%klt + 4).freq = medium ' StartTask %klt + 4 knof (7) knon (4, medium) CASE 37 ' StopTask %klt + 4 ' Task(%klt + 2).freq = medium ' StartTask %klt + 2 knof (4) knon (2, medium) END SELECT CASE 3 SELECT CASE beat CASE 1 knof (2) knon (8, medium) ' StopTask %klt + 2 ' Task(%klt + 8).freq = medium '10 ' StartTask %klt + 8 CASE 37 knof (8) ' StopTask %klt + 8 END SELECT CASE 4 SELECT CASE beat CASE 1 knon (0, medium) ' Task(%klt).freq = medium '10 ' StartTask %klt CASE 25 knof (0) ' StopTask %klt END SELECT CASE 5 SELECT CASE beat CASE 1 knon (0, medium) ' Task(%klt).freq = medium '10 ' StartTask %klt CASE 25 knof (0) knon (11, medium) ' StopTask %klt ' StartTask %klt + 11 END SELECT CASE 6 SELECT CASE beat CASE 13 knof (11) knon (14, medium) ' Stoptask %klt + 11 ' Task(%klt + 14).freq = medium ' StartTask %klt +14 CASE 25 knof (14) knon (4, medium) ' Stoptask %klt + 14 ' Task(%klt + 4).freq = medium ' StartTask %klt + 4 CASE 37 knof (4) knon (8, medium) ' Stoptask %klt + 4 ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 END SELECT CASE 7 SELECT CASE beat CASE 1 knof (8) knon (3, medium) ' Stoptask %klt + 8 ' Task(%klt + 3).freq = medium ' StartTask %klt + 3 CASE 13 knof (3) ' Stoptask %klt + 3 CASE 19 knon (6, medium) ' Task(%klt + 6).freq = medium ' StartTask %klt + 6 CASE 25 knof (6) knon (12, medium) ' Stoptask %klt + 6 ' Task(%klt + 12).freq = medium ' StartTask %klt + 12 CASE 37 knof (12) ' Stoptask %klt + 12 CASE 43 knon (8, medium) ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 END SELECT CASE 8 SELECT CASE beat CASE 1 knof (8) knon (16, medium) ' Stoptask %klt + 8 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 CASE 37 knof (16) knon (14, medium) ' Stoptask %klt + 16 ' Task(%klt + 14).freq = medium ' StartTask %klt + 14 END SELECT CASE 9 SELECT CASE beat CASE 13 knof (14) knon (11, medium) ' Stoptask %klt + 14 ' Task(%klt + 11).freq = medium ' StartTask %klt + 11 END SELECT CASE 10 SELECT CASE beat CASE 25 knof (11) ' Stoptask %klt + 11 CASE 37 knon (14, medium) ' Task(%klt + 14).freq = medium ' StartTask %klt + 14 CASE 43 knof (14) knon (16, medium) ' Stoptask %klt + 14 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 END SELECT CASE 11 ,71 SELECT CASE beat CASE 1 knof (16) knon (18, medium) knon (0, slow) knon (6, slow) knon (11, slow) ' Stoptask %klt + 16 ' Task(%klt + 18).freq = medium ' StartTask %klt + 18 ' Task(%klt ).freq = slow ' StartTask %klt ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 CASE 15 knof (18) knon (65 - Klung.LowTes, 0) knof (65 - Klung.LowTes) ' Stoptask %klt + 18 ' 'klung65 CASE 25 knon (18, medium) ' Task(%klt + 18).freq = medium ' StartTask %klt + 18 END SELECT CASE 12 ,72 SELECT CASE beat CASE 13 knof (18) knon (16, medium) ' Stoptask %klt + 18 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 CASE 25 knof (11) knon (4, slow) knof (16) knon (11, medium) ' Stoptask %klt + 11 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 ' Stoptask %klt + 16 ' Task(%klt + 11).freq = medium ' StartTask %klt + 11 CASE 37 knon (12, slow) ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 END SELECT CASE 13 ,73 SELECT CASE beat CASE 1 knof (12) knon(14, slow) knof (4) knon (8, slow) knof(0) knon (3, slow) ' Stoptask %klt + 12 '' Task(%klt + 14).freq = slow '' StartTask %klt + 14 ' Stoptask %klt + 4 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 ' Stoptask %klt ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 CASE 20 knof (11) ' Stoptask %klt + 11 CASE 43 knof (3) knof (6) knof (8) knof (14) ' Stoptask %klt + 3 ' Stoptask %klt + 6 ' Stoptask %klt + 8 ' Stoptask %klt + 14 END SELECT CASE 14 ,74 SELECT CASE beat CASE 13 knon (14, medium) ' Task(%klt + 14).freq = medium ' StartTask %klt + 14 CASE 19 knof (14) knon (16, medium) ' Stoptask %klt + 14 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 CASE 25 knof (16), medium knon (8, medium) knon (0, slow) knon (6, slow) ' Stoptask %klt + 16 ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 ' Task(%klt).freq = slow ' StartTask %klt ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 CASE 43 knof (8) knon (56 - Klung.LowTes, 0) knof (56 - Klung.LowTes) ' Stoptask %klt + 8 ' 'klung56 END SELECT CASE 15 ,75 SELECT CASE beat CASE 1 knon (8, medium) knon (4, slow) ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 CASE 13 knof (8) ' Stoptask %klt + 8 CASE 37 knof (6) knon (14, medium) knon (8, slow) ' Stoptask %klt + 6 ' Task(%klt + 14).freq = medium ' StartTask %klt + 14 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 CASE 43 knof (14) knon (16, medium) ' Stoptask %klt + 14 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 END SELECT CASE 16 ,76 SELECT CASE beat CASE 1 knof (16) knon (8, medium) knof (4) knon (6, slow) knof (8) knon (11, slow) ' Stoptask %klt + 16 ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 ' Stoptask %klt + 4 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' Stoptask %klt + 8 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 CASE 13 knof (8) knon (7, medium) ' Stoptask %klt + 8 ' Task(%klt + 7).freq = medium ' StartTask %klt + 7 CASE 37 knof (7) knon (4, medium) ' Stoptask %klt + 7 ' Task(%klt + 4).freq = medium ' StartTask %klt + 4 END SELECT CASE 17 ,77 SELECT CASE beat CASE 13 knof (4) knon (12, medium) ' Stoptask %klt + 4 ' Task(%klt + 12).freq = medium ' StartTask %klt + 12 END SELECT CASE 18 ,78 SELECT CASE beat CASE 1 knof (12) knon (14, medium) knof (6) knon (4, slow) ' Stoptask %klt + 12 ' Task(%klt + 14).freq = medium ' StartTask %klt + 14 ' Stoptask %klt + 6 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 CASE 13 knof (14) knon (16, medium) knof (11) knon (12, slow) ' Stoptask %klt + 14 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 ' Stoptask %klt + 11 ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 CASE 25 knof (16) knon (18, medium) knof (0) knon (3, slow) knof (4) knof (12) knon (8, slow) ' Stoptask %klt + 16 ' Task(%klt + 18).freq = medium ' StartTask %klt + 18 ' Stoptask %klt ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 ' Stoptask %klt + 4 '' Task(%klt + 6).freq = slow '' StartTask %klt + 6 ' Stoptask %klt + 12 '' Task(%klt + 14).freq = slow '' StartTask %klt + 14 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 END SELECT CASE 19 ,79 SELECT CASE beat CASE 7 knof (18 ) knof (3) knof (6) knof (14) knof (8) ' Stoptask %klt + 18 ' Stoptask %klt + 3 ' Stoptask %klt + 6 ' Stoptask %klt + 14 ' Stoptask %klt + 8 CASE 25 knon (11, slow) keyPress Klung.channel, Klung.LowTes, medium ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 ' Task(%klt).freq = medium END SELECT CASE 20 ,80 SELECT CASE beat CASE 7 knof (0) knon (7, medium) ' Stoptask %klt ' Task(%klt + 7).freq = medium ' StartTask %klt + 7 CASE 25 knon (4, slow) knon (6, slow) ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 END SELECT CASE 21 ,81 SELECT CASE beat CASE 1 knof (11) knon (12, slow) ' Stoptask %klt + 11 ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 CASE 15 knof (7) knon (3, medium) ' Stoptask %klt + 7 ' Task(%klt + 3).freq = medium ' StartTask %klt + 3 CASE 25 knof (3) knon (8, medium) ' Stoptask %klt + 3 ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 END SELECT CASE 22 ,82 SELECT CASE beat CASE 1 knof (4) knof (6) ' Stoptask %klt + 4 ' Stoptask %klt + 6 CASE 25 knof (12) knof (8) ' Stoptask %klt + 12 ' Stoptask %klt + 8 CASE 37 knon (49-Klung.LowTes, 0) ' klung49 CASE 43 knon (60-Klung.LowTes, 0) ' klung60 END SELECT CASE 23 ,83 SELECT CASE beat CASE 1 knon (8, medium) ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 CASE 13 knon (0, slow) ' Task(%klt).freq = slow ' StartTask %klt CASE 25 knon (7, slow) ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 CASE 37 knof (8) knon (11, medium) ' Stoptask %klt + 8 ' Task(%klt + 11).freq = medium ' StartTask %klt + 11 END SELECT CASE 24 ,84 SELECT CASE beat CASE 25 knof (11) knon (12, medium) knon (11, slow) ' Stoptask %klt + 11 ' Task(%klt + 12).freq = medium ' StartTask %klt + 12 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 CASE 37 knof (12) knon (16, medium) ' Stoptask %klt + 12 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 END SELECT CASE 25 ,85 SELECT CASE beat CASE 1 knof (16) knon (15, medium) ' Stoptask %kl + 16 ' Task(%klt + 15).freq = medium ' StartTask %klt + 15 CASE 25 knof (6) knon (4, slow) ' Stoptask %klt + 6 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 CASE 37 knof (11) knon (12, slow) ' Stoptask %klt + 11 ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 CASE 43 knof (15) Stoptask %klt + 15 END SELECT CASE 26 ,86 SELECT CASE beat CASE 1 knof (2) knon (14, slow) knof (4) knon (8, slow) knof (0) knon (3, slow) ' Stoptask %klt + 12 ' Task(%klt + 14).freq = slow ' StartTask %klt + 14 ' Stoptask %klt + 4 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 ' Stoptask %klt ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 CASE 25 knon (12, medium) ' Task(%klt + 12).freq = medium ' StartTask %klt + 12 CASE 43 knof (3) knof (6) knof (8) knof (14) ' Stoptask %klt + 3 ' Stoptask %klt + 6 ' Stoptask %klt + 8 ' Stoptask %klt + 14 END SELECT CASE 27 ,87 SELECT CASE beat CASE 13 knof (12) knon (11, medium) knon (6, slow) ' ' Stoptask %klt + 12 ' Task(%klt + 11).freq = medium ' StartTask %klt + 11 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 CASE 37 knof (11) knon (3, medium) ' Stoptask %klt + 11 ' Task(%klt + 3).freq = medium ' StartTask %klt + 3 END SELECT CASE 28 ,88 SELECT CASE beat CASE 1 knon (4, slow) ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 CASE 13 knof (6) knon (8, slow) ' Stoptask %klt + 6 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 CASE 25 knof (4) knon (6, slow) knof (8) knon (11, slow) ' Stoptask %klt + 4 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' Stoptask %klt + 8 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 CASE 37 knof (3) knon (4, medium) ' Stoptask %klt + 3 ' Task(%klt + 4).freq = medium ' StartTask %klt + 4 END SELECT CASE 29 ,89 SELECT CASE beat CASE 1 knof (4) knon (8, medium) ' Stoptask %klt + 4 ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 CASE 43 knof (4) ' Stoptask %klt + 4 END SELECT CASE 30 ,90 SELECT CASE beat CASE 25 knof (6)' knon (4, slow) ' Stoptask %klt + 6 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 CASE 37 knof (11) knon (12, slow) ' Stoptask %klt + 11 ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 END SELECT CASE 31 ,61 SELECT CASE beat CASE 1 knof (0) knon (3, slow) knof (4) knon (6, slow) knof (12) knon (14, slow) knon (8, slow) ' Stoptask %klt ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 ' Stoptask %klt + 4 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' Stoptask %klt + 12 ' Task(%klt + 14).freq = slow ' StartTask %klt + 14 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 CASE 2 TO 48 KeyPress Klung.channel, Klung.LowTes + 3, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 6, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 8, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 14, slow + (fast-slow) * beat/48 ' Task(%klt + 3).freq = Task(%klt + 3).freq + (fast - slow)/92 ' Task(%klt + 6).freq = Task(%klt + 6).freq + (fast - slow)/92 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/92 ' Task(%klt + 14).freq = Task(%klt + 14).freq + (fast - slow)/92 END SELECT CASE 32 ,62 SELECT CASE beat CASE 1 TO 48 KeyPress Klung.channel, Klung.LowTes + 3, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 6, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 8, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 14, slow + (fast-slow) * beat/48 ' Task(%klt + 3).freq = Task(%klt + 3).freq + (fast - slow)/92 ' Task(%klt + 6).freq = Task(%klt + 6).freq + (fast - slow)/92 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/92 ' Task(%klt + 14).freq = Task(%klt + 14).freq + (fast - slow)/92 END SELECT CASE 33 ,63 SELECT CASE beat CASE 1 knof (3) knof (6) knof (8) knof (14) ' Stoptask %klt + 3 ' Stoptask %klt + 6 ' Stoptask %klt + 8 ' Stoptask %klt + 14 END SELECT CASE 34 ,64 SELECT CASE beat CASE 25 knon (3, slow) knon (6, slow) knon (8, slow) knon (14, slow) ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 ' Task(%klt + 14).freq = slow ' StartTask %klt + 14 CASE 26 TO 48 KeyPress Klung.channel, Klung.LowTes + 3, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 6, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 8, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 14, slow + (fast-slow) * beat/48 ' Task(%klt + 3).freq = Task(%klt + 3).freq + (fast - slow)/184 ' Task(%klt + 6).freq = Task(%klt + 6).freq + (fast - slow)/184 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/184 ' Task(%klt + 14).freq = Task(%klt + 14).freq + (fast - slow)/184 END SELECT CASE 35 ,65 SELECT CASE beat CASE 13 knon (12, slow) ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 CASE 25 knon (4, slow) ' Task(%klt + 4).freq = slow ' ' StartTask %klt + 4 CASE 43 knon (11, slow) ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 CASE 1 TO 48 KeyPress Klung.channel, Klung.LowTes + 3, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 6, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 8, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 14, slow + (fast-slow) * beat/48 ' Task(%klt + 3).freq = Task(%klt + 3).freq + (fast - slow)/184 ' Task(%klt + 6).freq = Task(%klt + 6).freq + (fast - slow)/184 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/184 ' Task(%klt + 14).freq = Task(%klt + 14).freq + (fast - slow)/184 END SELECT CASE 36 ,66 SELECT CASE beat CASE 1 knof (3) knof (14) ' Stoptask %klt + 3 ' Stoptask %klt + 14 CASE 1 TO 48 KeyPress Klung.channel, Klung.LowTes + 4, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 6, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 8, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 12, slow + (fast-slow) * beat/48 ' Task(%klt + 4).freq = Task(%klt + 4).freq + (fast - slow)/184 ' Task(%klt + 6).freq = Task(%klt + 6).freq + (fast - slow)/184 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/184 ' Task(%klt + 11).freq = Task(%klt + 11).freq + (fast - slow)/184 ' Task(%klt + 12).freq = Task(%klt + 12).freq + (fast - slow)/184 END SELECT CASE 37 ,67 SELECT CASE beat CASE 1 knof (4) knof (8) knof (11) ' Stoptask %klt + 4 ' Stoptask %klt + 8 ' Stoptask %klt + 11 CASE 25 knon (15, slow) ' Task(%klt + 15).freq = slow ' StartTask %klt + 15 CASE 39 knon (8, slow) ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 CASE 1 TO 48 KeyPress Klung.channel, Klung.LowTes + 6, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 12, slow + (fast-slow) * beat/48 ' Task(%klt + 6).freq = Task(%klt + 6).freq - (fast - slow)/184 ' Task(%klt + 12).freq = Task(%klt + 12).freq - (fast - slow)/184 END SELECT CASE 38 ,68 SELECT CASE beat CASE 1 TO 48 KeyPress Klung.channel, Klung.LowTes + 6, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 8, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 12, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 15, slow + (fast-slow) * beat/48 ' Task(%klt + 6).freq = Task(%klt + 6).freq - (fast - slow)/184 ' Task(%klt + 12).freq = Task(%klt + 12).freq - (fast - slow)/184 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/184 ' Task(%klt + 15).freq = Task(%klt + 15).freq + (fast - slow)/184 END SELECT CASE 39 ,69 SELECT CASE beat CASE 15 knon (0, slow) knon (11, slow) ' Task(%klt).freq = slow ' StartTask %klt ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 CASE 1 TO 48 KeyPress Klung.channel, Klung.LowTes + 6, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 8, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 12, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 15, slow + (fast-slow) * beat/48 ' Task(%klt + 6).freq = Task(%klt + 6).freq - (fast - slow)/184 ' Task(%klt + 12).freq = Task(%klt + 12).freq - (fast - slow)/184 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/184 ' Task(%klt + 15).freq = Task(%klt + 15).freq + (fast - slow)/184 CASE 16 TO 48 KeyPress Klung.channel, Klung.LowTes , slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 11, slow + (fast-slow) * beat/48 ' Task(%klt).freq = Task(%klt).freq + (fast - slow)/184 ' Task(%klt + 11).freq = Task(%klt + 11).freq + (fast - slow)/184 END SELECT CASE 40 ,70 SELECT CASE beat CASE 1 knof (15) knof (12) knof (8) knof (0) knof (11) knof (6) ' Stoptask %klt + 15 ' Stoptask %klt + 12 ' Stoptask %klt + 8 ' Stoptask %klt ' Stoptask %klt + 11 ' Stoptask %klt + 6 CASE 37 knon (14, medium) ' Task(%klt + 14).freq = medium ' StartTask %klt + 14 CASE 43 knof (14) knon (16, medium) ' Stoptask %klt + 14 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 END SELECT CASE 41 SELECT CASE beat CASE 1 knof (16) knon (18, medium) knon (6, slow) knon (11, slow) ' Stoptask %klt + 16 ' Task(%klt + 18).freq = medium ' StartTask %klt + 18 ' Task(%klt ).freq = slow ' StartTask %klt ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 CASE 15 knof (18) ' Stoptask %klt + 18 'klung65 CASE 25 knon (18, medium) ' Task(%klt + 18).freq = medium ' StartTask %klt + 18 END SELECT CASE 42 SELECT CASE beat CASE 15 knof (11) knof (18) knon (8, medium) ' Stoptask %klt + 11 ' Stoptask %klt + 18 ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 CASE 25 knon (11, slow) knof (6) knon (4, slow) ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 ' Stoptask %klt + 6 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 CASE 37 knof (11) knon (12, slow) ' Stoptask %klt + 11 ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 END SELECT CASE 43 SELECT CASE beat CASE 1 knof (8) knon (11, medium) knof (12) knon (14, slow) knof (4) knon(6, slow) knof (0) knon (3, slow) ' Stoptask %klt + 8 ' Task(%klt + 11).freq = medium ' StartTask %klt + 11 ' Stoptask %klt + 12 ' Task(%klt + 14).freq = slow ' StartTask %klt + 14 ' Stoptask %klt + 4 '' Task(%klt + 6).freq = slow '' StartTask %klt + 6 ' Stoptask %klt ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 '' Task(%klt + 8).freq = slow '' StartTask %klt + 8 CASE 13 knof (11) knon (12, medium) ' Stoptask %klt + 11 ' Task(%klt + 12).freq = medium ' StartTask %klt + 12 CASE 25 knof (12) knof (15), medium ' Stoptask %klt + 12 ' Task(%klt + 15).freq = medium ' StartTask %klt + 15 CASE 39 knof (14) knon (12, slow) ' Stoptask %klt + 14 ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 END SELECT CASE 44 SELECT CASE beat CASE 1 knof (12) knon (11, slow) ' Stoptask %klt + 12 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 CASE 25 knof (15) knof (11) knof (8) knof (6) knof (3) ' Stoptask %klt + 15 ' Stoptask %klt + 11 ' Stoptask %klt + 8 ' Stoptask %klt + 6 ' Stoptask %klt + 3 CASE 37 knon (49-klung.lowtes, 0) knof (49-klung.lowtes) 'klung49 CASE 43 knon (60-klung.lowtes, 0) knof (60-klung.lowtes) 'klung60 CASE 2 TO 24 KeyPress Klung.channel, Klung.LowTes + 11,fast - (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 8, fast - (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 6, fast - (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 3, fast - (fast-slow) * beat/24 ' ' Task(%klt + 11).freq = Task(%klt + 11).freq - (slow - 1)/24 ' Task(%klt + 8).freq = Task(%klt + 8).freq - (slow - 1)/24 ' Task(%klt + 6).freq = Task(%klt + 6).freq - (slow - 1)/24 ' Task(%klt + 3).freq = Task(%klt + 3).freq - (slow - 1)/24 END SELECT CASE 45 SELECT CASE beat CASE 1 knon (6, medium) ' Task(%klt + 6).freq = medium ' StartTask %klt + 6 CASE 25 knon (0, slow) knon (4, slow) ' Task(%klt).freq = slow ' StartTask %klt ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 CASE 37 knof (6) knon (7, medium) ' Stoptask %klt + 6 ' Task(%klt + 7).freq = medium ' StartTask %klt + 7 END SELECT CASE 46 SELECT CASE beat CASE 1 knof (7) knon (6, medium) ' Stoptask %klt + 7 ' Task(%klt + 6).freq = medium ' StartTask %klt + 6 CASE 13 knof (6) ' Stoptask %klt + 6 CASE 19 knon (11, medium) ' Task(%klt + 11).freq = medium ' StartTask %klt + 11 CASE 25 knof (11) knon (9, medium) ' Stoptask %klt + 11 ' Task(%klt + 9).freq = medium ' StartTask %klt + 9 CASE 37 knof (9) Stoptask %klt + 9 CASE 43 knon (16, medium) ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 END SELECT CASE 47 SELECT CASE beat CASE 1 knof (0) knof (16) knon (15, medium) ' Stoptask %klt ' Stoptask %klt + 16 ' Task(%klt + 15).freq = medium ' StartTask %klt + 15 CASE 25 knon (8, slow) ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 CASE 37 knof (15) ' Stoptask %klt + 15 END SELECT CASE 48 SELECT CASE beat CASE 13 knon (16, medium) ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 CASE 25 knof (16) knon (11, medium) ' Stoptask %klt + 16 ' Task(%klt + 11).freq = medium ' StartTask %klt + 11 CASE 39 knof (4) knon (6, slow) ' Stoptask %klt + 4 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 END SELECT CASE 49 SELECT CASE beat CASE 1 knof (11) knon (14, medium) ' Stoptask %klt + 11 ' Task(%klt + 14).freq = medium ' StartTask %klt + 14 CASE 13 knof (4) knof (12), medium ' Stoptask %klt + 14 ' Task(%klt + 12).freq = medium ' StartTask %klt + 12 CASE 25 knof (6) knof (8) knon (11, slow) ' Stoptask %klt + 6 ' Stoptask %klt + 8 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 CASE 2 TO 24 KeyPress Klung.channel, Klung.LowTes + 8, fast - (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 6, fast - (fast-slow) * beat/24 ' Task(%klt + 6).freq = Task(%klt + 6).freq - (slow - 1)/24 ' Task(%klt + 8).freq = Task(%klt + 8).freq - (slow - 1)/24 END SELECT CASE 50 SELECT CASE beat CASE 13 knon (8, slow) ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 CASE 15 knof (12) knon (14, medium) ' Stoptask %klt + 12 ' Task(%klt + 14).freq = medium ' StartTask %klt + 14 CASE 25 knon (0, slow) knof (14) knon (6, medium) ' Task(%klt).freq = slow ' StartTask %klt ' Stoptask %klt + 14 ' Task(%klt + 6).freq = medium ' StartTask %klt + 6 END SELECT CASE 51 SELECT CASE beat CASE 13 knof (6) knon (12, medium) ' Stoptask %klt + 6 ' Task(%klt + 12).freq = medium ' StartTask %klt + 12 CASE 25 knof (0) knon (3, slow) ' Stoptask %klt ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 END SELECT CASE 52 SELECT CASE beat CASE 1 knof (12) knon (14, medium) knof (3) knon (0, slow) ' Stoptask %klt + 12 ' Task(%klt + 14).freq = medium ' StartTask %klt + 14 ' Stoptask %klt + 3 ' Task(%klt).freq = slow ' StartTask %klt CASE 15 knof (14) knon (16, medium) ' Stoptask %klt + 14 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 CASE 25 knof (0) knof (8) knof (11) knof (16) ' Stoptask %klt ' Stoptask %klt + 8 ' Stoptask %klt + 11 ' Stoptask %klt + 16 CASE 2 TO 24 KeyPress Klung.channel, Klung.LowTes, slow + (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 8, slow + (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 11, slow + (fast-slow) * beat/24 ' Task(%klt).freq = Task(%klt).freq + (fast - slow)/24 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/24 ' Task(%klt + 11).freq = Task(%klt + 11).freq + (fast - slow)/24 END SELECT CASE 53 SELECT CASE beat CASE 1 knon (0, medium) knon (16, slow) ' Task(%klt).freq = medium ' StartTask %klt ' Task(%klt + 16).freq = slow ' StartTask %klt + 16 CASE 15 knon (6, slow) knon (8, slow) ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 CASE 25 knof (0) knon (11, medium) ' Stoptask %klt ' Task(%klt + 11).freq = medium ' StartTask %klt + 11 END SELECT CASE 54 SELECT CASE beat CASE 1 knon(0, slow) ' Task(%klt).freq = slow ' StartTask %klt CASE 13 knof (11) knon(14, medium) ' Stoptask %klt + 11 ' Task(%klt + 14).freq = medium ' StartTask %klt +14 CASE 25 knof (14) knon (4, medium) ' Stoptask %klt + 14 ' Task(%klt + 4).freq = medium ' StartTask %klt + 4 CASE 37 knof(4) knon(11, medium) ' Stoptask %klt + 4 ' Task(%klt + 11).freq = medium ' StartTask %klt + 11 END SELECT CASE 55 SELECT CASE beat CASE 1 knof (16) knof (6) knof(11) knon (15,medium) ' Stoptask %klt + 16 ' Stoptask %klt + 6 ' Stoptask %klt + 11 ' Task(%klt + 15).freq = medium ' StartTask %klt + 15 CASE 13 knof(15) ' Stoptask %klt + 15 CASE 19 knon (18, medium) ' Task(%klt + 18).freq = medium ' StartTask %klt + 18 CASE 25 knof (0) knon (3, slow) knof (8) knon (6, slow) knof (18) knon (12, medium) ' Stoptask %klt ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 ' Stoptask %klt + 8 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' Stoptask %klt + 18 ' Task(%klt + 12).freq = medium ' StartTask %klt + 12 CASE 37 knof(12) ' Stoptask %klt + 12 CASE 43 knon(8, medium) ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 END SELECT CASE 56 SELECT CASE beat CASE 1 knof (8) knon (16, medium) ' Stoptask %klt + 8 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 CASE 2 TO 24 KeyPress Klung.channel, Klung.LowTes + 3, slow + (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 6, slow + (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 16, slow + (fast-slow) * beat/24 ' Task(%klt + 3).freq = Task(%klt + 3).freq + (fast - slow)/24 ' Task(%klt + 6).freq = Task(%klt + 6).freq + (fast - slow)/24 ' Task(%klt + 16).freq = Task(%klt + 16).freq + (fast - slow)/24 CASE 25 knof (3) knof (6) knof (16) ' Stoptask %klt + 3 ' Stoptask %klt + 6 ' Stoptask %klt + 16 END SELECT CASE 57 SELECT CASE beat CASE 1 knon (14, slow) ' Task(%klt + 14).freq = slow ' StartTask %klt + 14 CASE 15 knof (14) knon (12, slow) ' Stoptask %klt + 14 ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 CASE 25 knof (12) knon (8, slow) knon (3, slow) knon (6, slow) ' Stoptask %klt + 12 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 CASE 37 knon (16, medium) ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 END SELECT CASE 58 SELECT CASE beat CASE 13 knof (16) knon (19, medium) ' Stoptask %klt + 16 ' Task(%klt + 19).freq = medium ' StartTask %klt + 19 CASE 25 knof (3) knon (0, slow) knof (8) knon (4, slow) ' Stoptask %klt + 3 ' Task(%klt).freq = slow ' StartTask %klt ' Stoptask %klt + 8 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 CASE 37 knof (19) knon (18, medium) knof (6) knon (8, slow) ' Stoptask %klt + 19 ' Task(%klt + 18).freq = medium ' StartTask %klt + 18 ' Stoptask %klt + 6 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 END SELECT CASE 59 SELECT CASE beat CASE 1 knof (8) knon (11, slow) ' Stoptask %klt + 8 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 CASE 33 knof (18) knon (14, slow) ' Stoptask %klt + 18 ' Task(%klt + 14).freq = slow ' StartTask %klt + 14 END SELECT CASE 60 SELECT CASE beat CASE 25 knof (14) knof (6) knon (4, slow) ' Stoptask %klt + 14 ' Stoptask %klt + 6 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 CASE 37 knof (11) knon (12, slow) ' Stoptask %klt + 11 ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 END SELECT CASE 91 SELECT CASE beat CASE 1 knof (12) knon (14, slow) ' Stoptask %klt + 12 ' Task(%klt + 14).freq = slow ' StartTask %klt + 14 CASE 15 knon (11, slow) ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 CASE 25 knon (3, slow) knon (8, slow) ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 END SELECT CASE 92 ,94,96 SELECT CASE beat CASE 10 TO 48 KeyPress Klung.channel, Klung.LowTes, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 3, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 4, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 6, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 8, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 11, slow + (fast-slow) * beat/48 KeyPress Klung.channel, Klung.LowTes + 14, slow + (fast-slow) * beat/48 ' Task(%klt ).freq = Task(%klt ).freq + (fast - slow)/288 ' Task(%klt + 3).freq = Task(%klt + 3).freq + (fast - slow)/288 ' Task(%klt + 4).freq = Task(%klt + 4).freq + (fast - slow)/288 ' Task(%klt + 6).freq = Task(%klt + 6).freq + (fast - slow)/288 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/288 ' Task(%klt + 11).freq = Task(%klt + 11).freq + (fast - slow)/288 ' Task(%klt + 14).freq = Task(%klt + 14).freq + (fast - slow)/288 END SELECT IF ((measure = 94) OR (measure = 96)) AND beat = 0 THEN knon (0, slow) knon (3, slow) knon (4, slow) knon (6, slow) knon (8, slow) knon (11, slow) knon (14, slow) ' Task(%klt ).freq = slow ' Task(%klt + 3).freq = slow ' Task(%klt + 4).freq = slow ' Task(%klt + 6).freq = slow ' Task(%klt + 8).freq = slow ' Task(%klt + 11).freq = slow ' Task(%klt + 14).freq = slow ' StartTask %klt ' StartTask %klt + 3 ' StartTask %klt + 4 ' StartTask %klt + 6 ' StartTask %klt + 8 ' StartTask %klt + 11 ' StartTask %klt + 14 END IF CASE 93 ,95 SELECT CASE beat CASE 1 TO 24 KeyPress Klung.channel, Klung.LowTes, slow + (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 3, slow + (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 4, slow + (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 6, slow + (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 8, slow + (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 11, slow + (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 14, slow + (fast-slow) * beat/24 ' Task(%klt ).freq = Task(%klt ).freq + (fast - slow)/288 ' Task(%klt + 3).freq = Task(%klt + 3).freq + (fast - slow)/288 ' Task(%klt + 4).freq = Task(%klt + 4).freq + (fast - slow)/288 ' Task(%klt + 6).freq = Task(%klt + 6).freq + (fast - slow)/288 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/288 ' Task(%klt + 11).freq = Task(%klt + 11).freq + (fast - slow)/288 ' Task(%klt + 14).freq = Task(%klt + 14).freq + (fast - slow)/288 CASE 25 knof (0) knof (3) knof (4) knof (6) knof (8) knof (11) knof (14) ' Stoptask %klt ' Stoptask %klt + 3 ' Stoptask %klt + 4 ' Stoptask %klt + 6 ' Stoptask %klt + 8 ' Stoptask %klt + 11 ' Stoptask %klt + 14 ' task( %klungelthomas).freq= task( %klungelthomas).freq - 5 END SELECT CASE 97 SELECT CASE beat CASE 1 TO 24 KeyPress Klung.channel, Klung.LowTes, slow + (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 3, slow + (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 4, slow + (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 6, slow + (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 8, slow + (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 11, slow + (fast-slow) * beat/24 KeyPress Klung.channel, Klung.LowTes + 14, slow + (fast-slow) * beat/24 ' Task(%klt ).freq = Task(%klt ).freq + (fast - slow)/288 ' Task(%klt + 3).freq = Task(%klt + 3).freq + (fast - slow)/288 ' Task(%klt + 4).freq = Task(%klt + 4).freq + (fast - slow)/288 ' Task(%klt + 6).freq = Task(%klt + 6).freq + (fast - slow)/288 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/288 ' Task(%klt + 11).freq = Task(%klt + 11).freq + (fast - slow)/288 ' Task(%klt + 14).freq = Task(%klt + 14).freq + (fast - slow)/288 CASE 47 knof (0) knof (3) knof (4) knof (6) knof (8) knof (11) knof (14) ' Stoptask %klt ' Stoptask %klt + 3 ' Stoptask %klt + 4 ' Stoptask %klt + 6 ' Stoptask %klt + 8 ' Stoptask %klt + 11 ' Stoptask %klt + 14 task(%klungelThomas).tog = %false StopTask %klungelThomas END SELECT END SELECT END SUB 'SUB Thomas () ' ' this will no longer work. ' ' 22.11.2015: ask Kristof to recode it. ' STATIC beat AS LONG ' STATIC measure AS LONG ' STATIC slow AS SINGLE ' STATIC medium AS SINGLE ' STATIC fast AS SINGLE ' STATIC init AS LONG ' LOCAL i AS LONG ' ' IF ISFALSE task(%klungelthomas).tog THEN ' warning FUNCNAME$ + " - some notes where removed because of timer problems!!!" ' ' ProgChange Klung.channel, 122 ' task(%klungelthomas).tog = %true ' task( %klungelthomas).freq= 24 ' FOR i = 0 TO 20 ' task(%klt + i).level = 60 ' task(%klt + i).freq = 10 ' NEXT ' Slider(0).minval = 3 ' Slider(0).maxval = 10 ' Slider(0).stap = 1 ' Slider(0).value = 8 ' Slider(1).minval = 8 ' Slider(1).maxval = 20 ' Slider(1).value = 15 ' ' SendMessage Slider(0).h, %TBM_SETRANGE,%True, MakeLong(Slider(0).minval, Slider(0).maxval) ' SendMessage Slider(0).h, %TBM_SETPAGESIZE,0,Slider(0).stap ' SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value ' SendMessage Slider(1).h, %TBM_SETRANGE,%True, MakeLong(Slider(1).minval, Slider(1).maxval) ' SendMessage Slider(1).h, %TBM_SETPAGESIZE,0,Slider(0).stap ' SendMessage Slider(1).h, %TBM_SETPOS,%True, Slider(1).value ' ' ' SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER0, "slow" ' SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER1, "mid" ' SetDlgItemText gh.Cockpit, %GMT_TITLE, "" ' warning "slider 0: shaking tempo of slow notes" ' warning "slider 1 shaking tempo of medium notes" +$CRLF+"high note shaking tempo remains constant"" ' ' measure = 1 ' beat=0 ' slow = 6 ' medium =8 ' fast = 15 ' END IF ' ' INCR beat ' ' IF beat = 49 THEN ' beat = 0 ' INCR measure ' END IF ' CONTROL SET TEXT gh.cockpit, %GMT_MSG1, STR$(measure) + ":" + STR$(beat) + STR$(timegettime) ' IF slow <> Slider(0).value THEN ' slow = Slider(0).value ' END IF ' IF medium <> Slider(1).value THEN ' medium = Slider(1).value ' END IF ' CONTROL SET TEXT gh.cockpit, %GMT_MSG2, STR$(slow) + STR$(medium) ' SELECT CASE measure ' CASE 1 ' SELECT CASE beat ' CASE 1 ' Task(%klt).freq = medium '10 ' StartTask %klt ' ' CASE 37 ' StopTask %klt ' Task(%klt + 7).freq = medium ' StartTask %klt + 7 ' END SELECT ' CASE 2 ' SELECT CASE beat ' CASE 13 ' StopTask %klt + 7 ' Task(%klt + 4).freq = medium ' StartTask %klt + 4 ' CASE 37 ' StopTask %klt + 4 ' Task(%klt + 2).freq = medium ' StartTask %klt + 2 ' END SELECT ' CASE 3 ' SELECT CASE beat ' CASE 1 ' StopTask %klt + 2 ' Task(%klt + 8).freq = medium '10 ' StartTask %klt + 8 ' CASE 37 ' StopTask %klt + 8 ' END SELECT ' CASE 4 ' SELECT CASE beat ' CASE 1 ' Task(%klt).freq = medium '10 ' StartTask %klt ' CASE 25 ' StopTask %klt ' END SELECT ' CASE 5 ' SELECT CASE beat ' CASE 1 ' Task(%klt).freq = medium '10 ' StartTask %klt ' CASE 25 ' StopTask %klt ' StartTask %klt + 11 ' END SELECT ' CASE 6 ' SELECT CASE beat ' CASE 13 ' Stoptask %klt + 11 ' Task(%klt + 14).freq = medium ' StartTask %klt +14 ' CASE 25 ' Stoptask %klt + 14 ' Task(%klt + 4).freq = medium ' StartTask %klt + 4 ' CASE 37 ' Stoptask %klt + 4 ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 ' END SELECT ' CASE 7 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 8 ' Task(%klt + 3).freq = medium ' StartTask %klt + 3 ' CASE 13 ' Stoptask %klt + 3 ' CASE 19 ' Task(%klt + 6).freq = medium ' StartTask %klt + 6 ' CASE 25 ' Stoptask %klt + 6 ' Task(%klt + 12).freq = medium ' StartTask %klt + 12 ' CASE 37 ' Stoptask %klt + 12 ' CASE 43 ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 ' END SELECT ' CASE 8 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 8 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 ' CASE 37 ' Stoptask %klt + 16 ' Task(%klt + 14).freq = medium ' StartTask %klt + 14 ' END SELECT ' CASE 9 ' SELECT CASE beat ' CASE 13 ' Stoptask %klt + 14 ' Task(%klt + 11).freq = medium ' StartTask %klt + 11 ' END SELECT ' CASE 10 ' SELECT CASE beat ' CASE 25 ' Stoptask %klt + 11 ' CASE 37 ' Task(%klt + 14).freq = medium ' StartTask %klt + 14 ' CASE 43 ' Stoptask %klt + 14 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 ' END SELECT ' CASE 11 ,71 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 16 ' Task(%klt + 18).freq = medium ' StartTask %klt + 18 ' Task(%klt ).freq = slow ' StartTask %klt ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 ' CASE 15 ' Stoptask %klt + 18 ' klung65 ' CASE 25 ' Task(%klt + 18).freq = medium ' StartTask %klt + 18 ' END SELECT ' CASE 12 ,72 ' SELECT CASE beat ' CASE 13 ' Stoptask %klt + 18 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 ' CASE 25 ' Stoptask %klt + 11 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 ' Stoptask %klt + 16 ' Task(%klt + 11).freq = medium ' StartTask %klt + 11 ' CASE 37 ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 ' END SELECT ' CASE 13 ,73 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 12 '' Task(%klt + 14).freq = slow '' StartTask %klt + 14 ' Stoptask %klt + 4 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 ' Stoptask %klt ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 ' CASE 20 ' Stoptask %klt + 11 ' CASE 43 ' Stoptask %klt + 3 ' Stoptask %klt + 6 ' Stoptask %klt + 8 ' Stoptask %klt + 14 ' END SELECT ' CASE 14 ,74 ' SELECT CASE beat ' CASE 13 ' Task(%klt + 14).freq = medium ' StartTask %klt + 14 ' CASE 19 ' Stoptask %klt + 14 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 ' CASE 25 ' Stoptask %klt + 16 ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 ' Task(%klt).freq = slow ' StartTask %klt ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' CASE 43 ' Stoptask %klt + 8 ' klung56 ' END SELECT ' CASE 15 ,75 ' SELECT CASE beat ' CASE 1 ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 ' CASE 13 ' Stoptask %klt + 8 ' CASE 37 ' Stoptask %klt + 6 ' Task(%klt + 14).freq = medium ' StartTask %klt + 14 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 ' CASE 43 ' Stoptask %klt + 14 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 ' END SELECT ' CASE 16 ,76 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 16 ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 ' Stoptask %klt + 4 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' Stoptask %klt + 8 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 ' CASE 13 ' Stoptask %klt + 8 ' Task(%klt + 7).freq = medium ' StartTask %klt + 7 ' CASE 37 ' Stoptask %klt + 7 ' Task(%klt + 4).freq = medium ' StartTask %klt + 4 ' END SELECT ' CASE 17 ,77 ' SELECT CASE beat ' CASE 13 ' Stoptask %klt + 4 ' Task(%klt + 12).freq = medium ' StartTask %klt + 12 ' END SELECT ' CASE 18 ,78 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 12 ' Task(%klt + 14).freq = medium ' StartTask %klt + 14 ' Stoptask %klt + 6 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 ' CASE 13 ' Stoptask %klt + 14 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 ' Stoptask %klt + 11 ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 ' CASE 25 ' Stoptask %klt + 16 ' Task(%klt + 18).freq = medium ' StartTask %klt + 18 ' Stoptask %klt ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 ' Stoptask %klt + 4 '' Task(%klt + 6).freq = slow '' StartTask %klt + 6 ' Stoptask %klt + 12 '' Task(%klt + 14).freq = slow '' StartTask %klt + 14 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 ' END SELECT ' CASE 19 ,79 ' SELECT CASE beat ' CASE 7 ' Stoptask %klt + 18 ' Stoptask %klt + 3 ' Stoptask %klt + 6 ' Stoptask %klt + 14 ' Stoptask %klt + 8 ' CASE 25 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 ' Task(%klt).freq = medium ' END SELECT ' CASE 20 ,80 ' SELECT CASE beat ' CASE 7 ' Stoptask %klt ' Task(%klt + 7).freq = medium ' StartTask %klt + 7 ' CASE 25 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' END SELECT ' CASE 21 ,81 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 11 ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 ' CASE 15 ' Stoptask %klt + 7 ' Task(%klt + 3).freq = medium ' StartTask %klt + 3 ' CASE 25 ' Stoptask %klt + 3 ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 ' END SELECT ' CASE 22 ,82 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 4 ' Stoptask %klt + 6 ' CASE 25 ' Stoptask %klt + 12 ' Stoptask %klt + 8 ' CASE 37 ' klung49 ' CASE 43 ' klung60 ' END SELECT ' CASE 23 ,83 ' SELECT CASE beat ' CASE 1 ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 ' CASE 13 ' Task(%klt).freq = slow ' StartTask %klt ' CASE 25 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' CASE 37 ' Stoptask %klt + 8 ' Task(%klt + 11).freq = medium ' StartTask %klt + 11 ' END SELECT ' CASE 24 ,84 ' SELECT CASE beat ' CASE 25 ' Stoptask %klt + 11 ' Task(%klt + 12).freq = medium ' StartTask %klt + 12 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 ' CASE 37 ' Stoptask %klt + 12 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 ' END SELECT ' CASE 25 ,85 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 16 ' Task(%klt + 15).freq = medium ' StartTask %klt + 15 ' CASE 25 ' Stoptask %klt + 6 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 ' CASE 37 ' Stoptask %klt + 11 ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 ' CASE 43 ' Stoptask %klt + 15 ' END SELECT ' CASE 26 ,86 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 12 ' Task(%klt + 14).freq = slow ' StartTask %klt + 14 ' Stoptask %klt + 4 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 ' Stoptask %klt ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 ' CASE 25 ' Task(%klt + 12).freq = medium ' StartTask %klt + 12 ' CASE 43 ' Stoptask %klt + 3 ' Stoptask %klt + 6 ' Stoptask %klt + 8 ' Stoptask %klt + 14 ' END SELECT ' CASE 27 ,87 ' SELECT CASE beat ' CASE 13 ' Stoptask %klt + 12 ' Task(%klt + 11).freq = medium ' StartTask %klt + 11 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' CASE 37 ' Stoptask %klt + 11 ' Task(%klt + 3).freq = medium ' StartTask %klt + 3 ' END SELECT ' CASE 28 ,88 ' SELECT CASE beat ' CASE 1 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 ' CASE 13 ' Stoptask %klt + 6 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 ' CASE 25 ' Stoptask %klt + 4 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' Stoptask %klt + 8 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 ' CASE 37 ' Stoptask %klt + 3 ' Task(%klt + 4).freq = medium ' StartTask %klt + 4 ' END SELECT ' CASE 29 ,89 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 4 ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 ' CASE 43 ' Stoptask %klt + 4 ' END SELECT ' CASE 30 ,90 ' SELECT CASE beat ' CASE 25 ' Stoptask %klt + 6 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 ' CASE 37 ' Stoptask %klt + 11 ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 ' END SELECT ' CASE 31 ,61 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 ' Stoptask %klt + 4 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' Stoptask %klt + 12 ' Task(%klt + 14).freq = slow ' StartTask %klt + 14 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 ' CASE 2 TO 48 ' Task(%klt + 3).freq = Task(%klt + 3).freq + (fast - slow)/92 ' Task(%klt + 6).freq = Task(%klt + 6).freq + (fast - slow)/92 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/92 ' Task(%klt + 14).freq = Task(%klt + 14).freq + (fast - slow)/92 ' END SELECT ' CASE 32 ,62 ' SELECT CASE beat ' CASE 1 TO 48 ' Task(%klt + 3).freq = Task(%klt + 3).freq + (fast - slow)/92 ' Task(%klt + 6).freq = Task(%klt + 6).freq + (fast - slow)/92 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/92 ' Task(%klt + 14).freq = Task(%klt + 14).freq + (fast - slow)/92 ' END SELECT ' CASE 33 ,63 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 3 ' Stoptask %klt + 6 ' Stoptask %klt + 8 ' Stoptask %klt + 14 ' END SELECT ' CASE 34 ,64 ' SELECT CASE beat ' CASE 25 ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 ' Task(%klt + 14).freq = slow ' StartTask %klt + 14 ' CASE 26 TO 48 ' Task(%klt + 3).freq = Task(%klt + 3).freq + (fast - slow)/184 ' Task(%klt + 6).freq = Task(%klt + 6).freq + (fast - slow)/184 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/184 ' Task(%klt + 14).freq = Task(%klt + 14).freq + (fast - slow)/184 ' END SELECT ' CASE 35 ,65 ' SELECT CASE beat ' CASE 13 ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 ' CASE 25 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 ' CASE 43 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 ' CASE 1 TO 48 ' Task(%klt + 3).freq = Task(%klt + 3).freq + (fast - slow)/184 ' Task(%klt + 6).freq = Task(%klt + 6).freq + (fast - slow)/184 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/184 ' Task(%klt + 14).freq = Task(%klt + 14).freq + (fast - slow)/184 ' END SELECT ' CASE 36 ,66 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 3 ' Stoptask %klt + 14 ' CASE 1 TO 48 ' Task(%klt + 4).freq = Task(%klt + 4).freq + (fast - slow)/184 ' Task(%klt + 6).freq = Task(%klt + 6).freq + (fast - slow)/184 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/184 ' Task(%klt + 11).freq = Task(%klt + 11).freq + (fast - slow)/184 ' Task(%klt + 12).freq = Task(%klt + 12).freq + (fast - slow)/184 ' END SELECT ' CASE 37 ,67 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 4 ' Stoptask %klt + 8 ' Stoptask %klt + 11 ' CASE 25 ' Task(%klt + 15).freq = slow ' StartTask %klt + 15 ' CASE 39 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 ' CASE 1 TO 48 ' Task(%klt + 6).freq = Task(%klt + 6).freq - (fast - slow)/184 ' Task(%klt + 12).freq = Task(%klt + 12).freq - (fast - slow)/184 ' END SELECT ' CASE 38 ,68 ' SELECT CASE beat ' CASE 1 TO 48 ' Task(%klt + 6).freq = Task(%klt + 6).freq - (fast - slow)/184 ' Task(%klt + 12).freq = Task(%klt + 12).freq - (fast - slow)/184 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/184 ' Task(%klt + 15).freq = Task(%klt + 15).freq + (fast - slow)/184 ' END SELECT ' CASE 39 ,69 ' SELECT CASE beat ' CASE 15 ' Task(%klt).freq = slow ' StartTask %klt ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 ' CASE 1 TO 48 ' Task(%klt + 6).freq = Task(%klt + 6).freq - (fast - slow)/184 ' Task(%klt + 12).freq = Task(%klt + 12).freq - (fast - slow)/184 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/184 ' Task(%klt + 15).freq = Task(%klt + 15).freq + (fast - slow)/184 ' CASE 16 TO 48 ' Task(%klt).freq = Task(%klt).freq + (fast - slow)/184 ' Task(%klt + 11).freq = Task(%klt + 11).freq + (fast - slow)/184 ' END SELECT ' CASE 40 ,70 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 15 ' Stoptask %klt + 12 ' Stoptask %klt + 8 ' Stoptask %klt ' Stoptask %klt + 11 ' Stoptask %klt + 6 ' CASE 37 ' Task(%klt + 14).freq = medium ' StartTask %klt + 14 ' CASE 43 ' Stoptask %klt + 14 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 ' END SELECT ' CASE 41 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 16 ' Task(%klt + 18).freq = medium ' StartTask %klt + 18 ' Task(%klt ).freq = slow ' StartTask %klt ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 ' CASE 15 ' Stoptask %klt + 18 ' ' klung65 ' CASE 25 ' ' Task(%klt + 18).freq = medium ' StartTask %klt + 18 ' END SELECT ' CASE 42 ' SELECT CASE beat ' CASE 15 ' Stoptask %klt + 11 ' Stoptask %klt + 18 ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 ' CASE 25 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 ' Stoptask %klt + 6 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 ' CASE 37 ' Stoptask %klt + 11 ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 ' END SELECT ' CASE 43 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 8 ' Task(%klt + 11).freq = medium ' StartTask %klt + 11 ' Stoptask %klt + 12 ' Task(%klt + 14).freq = slow ' StartTask %klt + 14 ' Stoptask %klt + 4 '' Task(%klt + 6).freq = slow '' StartTask %klt + 6 ' Stoptask %klt ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 '' Task(%klt + 8).freq = slow '' StartTask %klt + 8 ' CASE 13 ' Stoptask %klt + 11 ' Task(%klt + 12).freq = medium ' StartTask %klt + 12 ' CASE 25 ' Stoptask %klt + 12 ' Task(%klt + 15).freq = medium ' StartTask %klt + 15 ' CASE 39 ' Stoptask %klt + 14 ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 ' END SELECT ' CASE 44 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 12 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 ' CASE 25 ' Stoptask %klt + 15 ' Stoptask %klt + 11 ' Stoptask %klt + 8 ' Stoptask %klt + 6 ' Stoptask %klt + 3 ' CASE 37 ' klung49 ' CASE 43 ' klung60 ' CASE 2 TO 24 ' Task(%klt + 11).freq = Task(%klt + 11).freq - (slow - 1)/24 ' Task(%klt + 8).freq = Task(%klt + 8).freq - (slow - 1)/24 ' Task(%klt + 6).freq = Task(%klt + 6).freq - (slow - 1)/24 ' Task(%klt + 3).freq = Task(%klt + 3).freq - (slow - 1)/24 ' END SELECT ' CASE 45 ' SELECT CASE beat ' CASE 1 ' Task(%klt + 6).freq = medium ' StartTask %klt + 6 ' CASE 25 ' Task(%klt).freq = slow ' StartTask %klt ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 ' CASE 37 ' Stoptask %klt + 6 ' Task(%klt + 7).freq = medium ' StartTask %klt + 7 ' END SELECT ' CASE 46 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 7 ' Task(%klt + 6).freq = medium ' StartTask %klt + 6 ' CASE 13 ' Stoptask %klt + 6 ' CASE 19 ' Task(%klt + 11).freq = medium ' StartTask %klt + 11 ' CASE 25 ' Stoptask %klt + 11 ' Task(%klt + 9).freq = medium ' StartTask %klt + 9 ' CASE 37 ' Stoptask %klt + 9 ' CASE 43 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 ' END SELECT ' CASE 47 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt ' Stoptask %klt + 16 ' Task(%klt + 15).freq = medium ' StartTask %klt + 15 ' CASE 25 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 ' CASE 37 ' Stoptask %klt + 15 ' END SELECT ' CASE 48 ' SELECT CASE beat ' CASE 13 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 ' CASE 25 ' Stoptask %klt + 16 ' Task(%klt + 11).freq = medium ' StartTask %klt + 11 ' CASE 39 ' Stoptask %klt + 4 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' END SELECT ' CASE 49 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 11 ' Task(%klt + 14).freq = medium ' StartTask %klt + 14 ' CASE 13 ' Stoptask %klt + 14 ' Task(%klt + 12).freq = medium ' StartTask %klt + 12 ' CASE 25 ' Stoptask %klt + 6 ' Stoptask %klt + 8 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 ' CASE 2 TO 24 ' Task(%klt + 6).freq = Task(%klt + 6).freq - (slow - 1)/24 ' Task(%klt + 8).freq = Task(%klt + 8).freq - (slow - 1)/24 ' END SELECT ' CASE 50 ' SELECT CASE beat ' CASE 13 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 ' CASE 15 ' Stoptask %klt + 12 ' Task(%klt + 14).freq = medium ' StartTask %klt + 14 ' CASE 25 ' Task(%klt).freq = slow ' StartTask %klt ' Stoptask %klt + 14 ' Task(%klt + 6).freq = medium ' StartTask %klt + 6 ' END SELECT ' CASE 51 ' SELECT CASE beat ' CASE 13 ' Stoptask %klt + 6 ' Task(%klt + 12).freq = medium ' StartTask %klt + 12 ' CASE 25 ' Stoptask %klt ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 ' END SELECT ' CASE 52 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 12 ' Task(%klt + 14).freq = medium ' StartTask %klt + 14 ' Stoptask %klt + 3 ' Task(%klt).freq = slow ' StartTask %klt ' CASE 15 ' Stoptask %klt + 14 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 ' CASE 25 ' Stoptask %klt ' Stoptask %klt + 8 ' Stoptask %klt + 11 ' Stoptask %klt + 16 ' ' CASE 2 TO 24 ' Task(%klt).freq = Task(%klt).freq + (fast - slow)/24 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/24 ' Task(%klt + 11).freq = Task(%klt + 11).freq + (fast - slow)/24 ' END SELECT ' CASE 53 ' SELECT CASE beat ' CASE 1 ' Task(%klt).freq = medium ' StartTask %klt ' Task(%klt + 16).freq = slow ' StartTask %klt + 16 ' CASE 15 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 ' CASE 25 ' Stoptask %klt ' Task(%klt + 11).freq = medium ' StartTask %klt + 11 ' END SELECT ' CASE 54 ' SELECT CASE beat ' CASE 1 ' Task(%klt).freq = slow ' StartTask %klt ' CASE 13 ' Stoptask %klt + 11 ' Task(%klt + 14).freq = medium ' StartTask %klt +14 ' CASE 25 ' Stoptask %klt + 14 ' Task(%klt + 4).freq = medium ' StartTask %klt + 4 ' CASE 37 ' Stoptask %klt + 4 ' Task(%klt + 11).freq = medium ' StartTask %klt + 11 ' END SELECT ' CASE 55 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 16 ' Stoptask %klt + 6 ' Stoptask %klt + 11 ' Task(%klt + 15).freq = medium ' StartTask %klt + 15 ' CASE 13 ' Stoptask %klt + 15 ' CASE 19 ' Task(%klt + 18).freq = medium ' StartTask %klt + 18 ' CASE 25 ' Stoptask %klt ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 ' Stoptask %klt + 8 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' Stoptask %klt + 18 ' Task(%klt + 12).freq = medium ' StartTask %klt + 12 ' CASE 37 ' Stoptask %klt + 12 ' CASE 43 ' Task(%klt + 8).freq = medium ' StartTask %klt + 8 ' END SELECT ' CASE 56 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 8 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 ' CASE 2 TO 24 ' Task(%klt + 3).freq = Task(%klt + 3).freq + (fast - slow)/24 ' Task(%klt + 6).freq = Task(%klt + 6).freq + (fast - slow)/24 ' Task(%klt + 16).freq = Task(%klt + 16).freq + (fast - slow)/24 ' CASE 25 ' Stoptask %klt + 3 ' Stoptask %klt + 6 ' Stoptask %klt + 16 ' END SELECT ' CASE 57 ' SELECT CASE beat ' CASE 1 ' Task(%klt + 14).freq = slow ' StartTask %klt + 14 ' CASE 15 ' Stoptask %klt + 14 ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 ' CASE 25 ' Stoptask %klt + 12 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 ' Task(%klt + 6).freq = slow ' StartTask %klt + 6 ' CASE 37 ' Task(%klt + 16).freq = medium ' StartTask %klt + 16 ' END SELECT ' CASE 58 ' SELECT CASE beat ' CASE 13 ' Stoptask %klt + 16 ' Task(%klt + 19).freq = medium ' StartTask %klt + 19 ' CASE 25 ' Stoptask %klt + 3 ' Task(%klt).freq = slow ' StartTask %klt ' Stoptask %klt + 8 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 ' CASE 37 ' Stoptask %klt + 19 ' Task(%klt + 18).freq = medium ' StartTask %klt + 18 ' Stoptask %klt + 6 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 ' END SELECT ' CASE 59 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 8 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 ' CASE 33 ' Stoptask %klt + 18 ' Task(%klt + 14).freq = slow ' StartTask %klt + 14 ' END SELECT ' CASE 60 ' SELECT CASE beat ' CASE 25 ' Stoptask %klt + 14 ' Stoptask %klt + 6 ' Task(%klt + 4).freq = slow ' StartTask %klt + 4 ' CASE 37 ' Stoptask %klt + 11 ' Task(%klt + 12).freq = slow ' StartTask %klt + 12 ' END SELECT ' CASE 91 ' SELECT CASE beat ' CASE 1 ' Stoptask %klt + 12 ' Task(%klt + 14).freq = slow ' StartTask %klt + 14 ' CASE 15 ' Task(%klt + 11).freq = slow ' StartTask %klt + 11 ' CASE 25 ' Task(%klt + 3).freq = slow ' StartTask %klt + 3 ' Task(%klt + 8).freq = slow ' StartTask %klt + 8 ' END SELECT ' CASE 92 ,94,96 ' SELECT CASE beat ' CASE 10 TO 48 ' Task(%klt ).freq = Task(%klt ).freq + (fast - slow)/288 ' Task(%klt + 3).freq = Task(%klt + 3).freq + (fast - slow)/288 ' Task(%klt + 4).freq = Task(%klt + 4).freq + (fast - slow)/288 ' Task(%klt + 6).freq = Task(%klt + 6).freq + (fast - slow)/288 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/288 ' Task(%klt + 11).freq = Task(%klt + 11).freq + (fast - slow)/288 ' Task(%klt + 14).freq = Task(%klt + 14).freq + (fast - slow)/288 ' END SELECT ' IF ((measure = 94) OR (measure = 96)) AND beat = 0 THEN ' Task(%klt ).freq = slow ' Task(%klt + 3).freq = slow ' Task(%klt + 4).freq = slow ' Task(%klt + 6).freq = slow ' Task(%klt + 8).freq = slow ' Task(%klt + 11).freq = slow ' Task(%klt + 14).freq = slow ' StartTask %klt ' StartTask %klt + 3 ' StartTask %klt + 4 ' StartTask %klt + 6 ' StartTask %klt + 8 ' StartTask %klt + 11 ' StartTask %klt + 14 ' END IF ' CASE 93 ,95 ' SELECT CASE beat ' CASE 1 TO 24 ' Task(%klt ).freq = Task(%klt ).freq + (fast - slow)/288 ' Task(%klt + 3).freq = Task(%klt + 3).freq + (fast - slow)/288 ' Task(%klt + 4).freq = Task(%klt + 4).freq + (fast - slow)/288 ' Task(%klt + 6).freq = Task(%klt + 6).freq + (fast - slow)/288 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/288 ' Task(%klt + 11).freq = Task(%klt + 11).freq + (fast - slow)/288 ' Task(%klt + 14).freq = Task(%klt + 14).freq + (fast - slow)/288 ' CASE 25 ' Stoptask %klt ' Stoptask %klt + 3 ' Stoptask %klt + 4 ' Stoptask %klt + 6 ' Stoptask %klt + 8 ' Stoptask %klt + 11 ' Stoptask %klt + 14 ' ' task( %klungelthomas).freq= task( %klungelthomas).freq - 5 ' END SELECT ' CASE 97 ' SELECT CASE beat ' CASE 1 TO 24 ' Task(%klt ).freq = Task(%klt ).freq + (fast - slow)/288 ' Task(%klt + 3).freq = Task(%klt + 3).freq + (fast - slow)/288 ' Task(%klt + 4).freq = Task(%klt + 4).freq + (fast - slow)/288 ' Task(%klt + 6).freq = Task(%klt + 6).freq + (fast - slow)/288 ' Task(%klt + 8).freq = Task(%klt + 8).freq + (fast - slow)/288 ' Task(%klt + 11).freq = Task(%klt + 11).freq + (fast - slow)/288 ' Task(%klt + 14).freq = Task(%klt + 14).freq + (fast - slow)/288 ' CASE 47 ' Stoptask %klt ' Stoptask %klt + 3 ' Stoptask %klt + 4 ' Stoptask %klt + 6 ' Stoptask %klt + 8 ' Stoptask %klt + 11 ' Stoptask %klt + 14 ' task(%klungelThomas).tog = %false ' StopTask %klungelThomas ' END SELECT ' END SELECT 'END SUB SUB KlungOff MM_Klung_Off %MM_Power ' resets END SUB ''seqfileplayer slider callbacks ''cannot reside in DLL because Slider() is not known there.. 'SUB Klung_Seq_UpdateSpeed ' LOCAL speed AS SINGLE ' speed = Slider(TaskEx(Klung.SeqFileTask).Slidernumbers(0)).value ' speed = .0002197 * speed^2 + .1 'slider.value 0 > .1; 64 > 1; 127 > 10 ' speed = speed * 100 ' Task(Klung.SeqFileTask).freq = speed 'END SUB 'SUB Klung_Seq_UpdateVelo ' Task(Klung.SeqFileTask).level = Slider(TaskEx(Klung.SeqFileTask).Slidernumbers(1)).value 'END SUB 'Klung shaking tasks 'MACRO Klung_Shake(noot) ' IF Klung.ctrl(noot) THEN ' Klung.ctrl(noot) = 0 ' NoteOff Klung.channel, noot ' ELSE ' KeyPress Klung.channel, noot, MAX(1, Slider(1).value/4) ' mPlay Klung.channel, noot, Slider(0).level ' END IF 'END MACRO 'SUB Klung49 () ' Klung_Shake(49) 'END SUB ' 'SUB Klung50 () ' Klung_Shake(50) 'END SUB ' 'SUB Klung51 () ' Klung_Shake(51) 'END SUB ' 'SUB Klung52 () ' Klung_Shake(52) 'END SUB ' 'SUB Klung53 () ' Klung_Shake(53) 'END SUB ' 'SUB Klung54 () ' Klung_Shake(54) 'END SUB ' 'SUB Klung55 () ' Klung_Shake(55) 'END SUB ' 'SUB Klung56 () ' Klung_Shake(56) 'END SUB ' 'SUB Klung57 () ' Klung_Shake(57) 'END SUB ' 'SUB Klung58 () ' Klung_Shake(58) 'END SUB ' 'SUB Klung59 () ' Klung_Shake(59) 'END SUB ' 'SUB Klung60 () ' Klung_Shake(60) 'END SUB ' 'SUB Klung61 () ' Klung_Shake(61) 'END SUB ' 'SUB Klung62 () ' Klung_Shake(62) 'END SUB ' 'SUB Klung63 () ' Klung_Shake(63) 'END SUB ' 'SUB Klung64 () ' Klung_Shake(64) 'END SUB ' 'SUB Klung65 () ' Klung_Shake(65) 'END SUB ' 'SUB Klung66 () ' Klung_Shake(66) 'END SUB ' 'SUB Klung67 () ' Klung_Shake(67) 'END SUB ' 'SUB Klung68 () ' Klung_Shake(68) 'END SUB ' 'SUB Klung69 () ' Klung_Shake(69) 'END SUB 'SUB Klung_PlayHarShaking (H AS HarmType) ' ' added 30.07.2002. ' ' Note off's are required, we shake all notes alternating in the tempo set in the shaking tasks ' ' adapted 22.11.2015 , except for tempo via Keypress... ' ' this must be sent in the composition code ' LOCAL i AS LONG ' LOCAL ib? ' FOR i = 50 TO 68 ' offset 1 !!! to get 49 to 69 ' ' counts notes 49 to 67 ' ' we do not have note 68 ' ib? = ASC(MID$(H.vel, i, 1)) ' IF ib? THEN ' mPlay Klung.channel, i-1, ib? ' ELSE ' NoteOff Klung.channel, i-1 ' END IF ' NEXT i ' ' now we check for note 69 ' ib? = ASC(MID$(H.vel, 70, 1)) ' IF ib? THEN ' mPlay Klung.channel, 69,ib? ' ELSE ' NoteOff Klung.channel, 69 ' END IF 'END SUB SUB Klung_Lites () STATIC slnr AS LONG STATIC cnt AS LONG IF ISFALSE Task(%Klung_Lites).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Klung_Lites).hParam THEN MakeTaskParameterDialog %Klung_Lites,1,Slider(),0,UDctrl(),TaskParamLabels() END IF slnr = TaskEX(%Klung_Lites).SliderNumbers(0) cnt = -1 Task(%Klung_Lites).tog = %True END IF NoteOff Klung.channel, 120 + cnt INCR cnt IF cnt > 3 THEN cnt = 0 mPlay Klung.channel, 120 + cnt, 127 Task(%Klung_Lites).freq = MAX(slider(slnr).value / 5, 1) END SUB SUB Klung_Lites_Off () MM_Klung_Off %MM_Lights END SUB SUB Klung_HW () ' added 11.2015 for hardware measurement of velo scaling on oscilloscope STATIC slnr, udnr, cnt, note, oldnote AS LONG IF ISFALSE Task(%Klung_HW).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Velo" TaskParamLabels(2) = "Note" IF ISFALSE Task(%Klung_HW).hParam THEN MakeTaskParameterDialog %Klung_HW,2,Slider(),1,UDctrl(),TaskParamLabels() END IF slnr = TaskEX(%Klung_HW).SliderNumbers(0) udnr = TaskEX(%Klung_HW).UpDownNumbers(0) Controller Klung.channel, 66, 127 Task(%Klung_HW).tog = %True END IF CONTROL SET TEXT gh.cockpit, %GMT_MSG1, "Note=" & STR$(UDCtrl(TaskEX(%Klung_HW).UpDownNumbers(0)).value) IF UDCtrl(udnr).value > Klung.HighTes THEN UDCtrl(udnr).value = Klung.HighTes END IF IF UDCtrl(udnr).value < Klung.LowTes THEN UDCtrl(udnr).value = Klung.Lowtes END IF note = UDCtrl(udnr).value SetDlgItemText Task(%Klung_HW).hparam, %GMT_TEXT0_ID + 16, STR$(note) IF note <> oldnote THEN NoteOff Klung.channel, oldnote oldnote = note END IF IF ISFALSE cnt THEN mPlay Klung.channel, note, Slider(slnr+1).value oldnote = note ELSE NoteOff Klung.channel, oldnote END IF INCR cnt cnt = cnt MOD 2 Task(%Klung_HW).freq = 0.1 + Slider(slnr).value / 8 END SUB '[EOF]