' *************************************************************************** ' * * ' * 2000 - 2006 ' * compile with gmt.bas and _mrobots.inc * ' * Procedure declarations are in thunder.bi * ' *************************************************************************** ' 18.07.2000 : Hardware debug o.k. ' 17-18.07.2000 : coding by Kristof Lauwers ' 19-21.07 : put limitations and scalings of velo, freq, ... in lowlevel tasks ' 21.07 : bug detected in GetController > we should debug all midi in routines...! '12.08.2000 : debugged by gwr - hardware code moved to DLL '21.09.2000 :listens to metacommands. ignores unknown pieces! so new pieces have to be added in messagehandler also '12.10.2000 : run through GWR '16.10.2000 : last update before try out '07.08.2001 : rewritten for operation with NiDAQ DIO interfaces under NT ' thun_sim split of from this module. ' thunder.bi must be included!!! '!! IMPORTANT remember that the windmachine simulation resides in a separate sub windsimu!! '25.04.2002 : Code added for powerup, hardware modified. Check ports in the dll after hardware debug. '27.04.2002 : Strobo light added. '29.04.2002 : code sections moved to dll. '01.08.2002 : stormwind added to dll and this proc. '08.08.2002 : Bird added to dll and this proc. - tested o.k. ' To be done: simulator code for storm and bird. '22.04.2004 : Thunderwood repaired (IRF540 on windmachine did burn out). '24.07.2004 : listentask changed with masks. '05.09.2006 : ThunderWood - version 2: now a midi robot !!! FUNCTION InitThunder () AS LONG LOCAL m AS ASCIIZ * 40 LOCAL i AS LONG Task(%tst).naam = "PeckTest" Task(%tst).freq = 3 Task(%tst).swit= %false Task(%tst).cptr = CODEPTR(PeckerTest) Task(%tst + 1).naam = "WindXtof" ' no good as simple test proc. Task(%tst + 1).freq = 5 Task(%tst + 1).swit = %false Task(%tst + 1).cptr = CODEPTR(WindTest) Task(%tst + 2).naam = "RatchTst" Task(%tst + 2).freq = 0.4 Task(%tst + 2).cptr = CODEPTR(RatchetTest) Task(%tst + 3).naam = "ThundTst" Task(%tst + 3).freq = 10 Task(%tst + 3).cptr = CODEPTR(ThunderTest) Task(%tst + 4).naam = "ChimeTst" Task(%tst + 4).freq = 10 Task(%tst + 4).cptr = CODEPTR(ChimesTest) Task(%tst + 5).naam="RainTest" Task(%tst + 5).freq = 60 Task(%tst + 5).cptr = CODEPTR(RainTest) Task(%tst + 6).naam = "Wind" ' better as test proc. for wind. Task(%tst + 6).freq = 10 Task(%tst + 6).cptr = CODEPTR(WindTest2) Task(%tst + 7).naam = "Strobo" Task(%tst + 7).freq = 1 Task(%tst + 7).cptr = CODEPTR(Strobotest) Task(%tst + 8).naam = "Storm" Task(%tst + 8).freq = 0.98 Task(%tst + 8).cptr = CODEPTR(TW_Storm_Test) Task(%tst + 9).naam = "Bird" Task(%tst + 9).freq = 2 Task(%tst + 9).cptr = CODEPTR(TW_Bird_Test) Task(%woody).naam = "Woody" 'piece for thunderwood Task(%woody).freq = 12'16 '32 '8 Task(%woody).cptr = CODEPTR(Woody) TaskEX(%Woody).StopCptr = CODEPTR(ThunderOff) Task(%woody + 1).naam="WDStoch" Task(%woody + 1).cptr=CODEPTR(WoodStoch) Task(%woody + 1).freq=4 'was 3,2 001004 TaskEX(%Woody + 1).StopCptr = CODEPTR(ThunderOff) 'delete unecessary buttons 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(10).cptr = CODEPTR(TW_PowerUp) ButnSW(11).tag0 = "" ButnOS(3).tag = "" ButnOS(4).tag = "" ButnOS(5).tag = "" ButnOS(6).tag = "" ButnOS(8).tag = "" ButnOS(9).tag = "" ' ButnOS(7).tag = "PANIC" ' ' m = UCASE$("TW_AllOff") ' ButnOs(7).cptr = GetProcAddress(gh.gnh,m) FUNCTION = %True END FUNCTION SUB TW_PowerUp () ' buttonswitch 10 handler ' on/off switch - added 25.04.2002 STATIC onoff AS DWORD IF onoff THEN ButnSW(10).tag0 = "Pow Off" SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + 10, ButnSW(10).tag0 'ThunderWood_On %True ' on MM_ThunderWood_On ELSE ButnSW(10).tag1 = "Pow On" SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + 10, ButnSW(10).tag1 'ThunderWood_On %False ' off MM_Thunderwood_Off END IF BIT TOGGLE onoff,0 END SUB SUB Peckertest () 'test code for pecker 'sliders are for pecker speed & velo '!!!! >> results of test in file 'Pecker_Test_Results' << !!!! STATIC TaskParamLabels() AS ASCIIZ*8 STATIC slnr() AS INTEGER LOCAL i AS INTEGER IF ISFALSE Task(%tst).tog THEN DIM Slnr(7) DIM TaskParamLabels(7) FOR i = 0 TO 3 TaskParamLabels(i)="Speed"+LTRIM$(STR$(i+1)) NEXT FOR i = 4 TO 7 TaskParamLabels(i)="velo"+LTRIM$(STR$(i+1)) NEXT IF Task(%tst).hParam = %Null THEN MakeTaskParameterDialog %tst,8, Slider(),0,UdCtrl(), TaskParamLabels() END IF FOR i = 0 TO 7 slnr(i) = TaskEX(%tst).SliderNumbers(i) 'get slidernumber given in GMT-code Slider(Slnr(i)).value = 0 SendMessage Slider(Slnr(i)).h, %TBM_SETPOS,%True, Slider(Slnr(i)).value NEXT Task(%tst).tog = %True EXIT SUB END IF FOR i = 0 TO 3 IF Slider(slnr(i)).value > 2 THEN Task(ThunderWood.beattask(1) + i).freq = Slider(slnr(i)).value / 5 '.2 -> 25.4 IF ISFALSE(BIT(task(ThunderWood.beattask(1) + i).swit, %TASK_ONOFF)) THEN StartTask ThunderWood.beattask(1) + i EXIT SUB END IF ELSE StopTask ThunderWood.beattask(1) + i END IF NEXT FOR i = 4 TO 7 IF Task(ThunderWood.beattask(1) + i - 4).level <> Slider(slnr(i)).value THEN Task(ThunderWood.beattask(1) + i - 4).level = Slider(slnr(i)).value END IF NEXT END SUB SUB RatchetTest () 'TW_Ratch RND(1) * 127 END SUB SUB StroboTest () STATIC TaskParamLabels() AS ASCIIZ*8 STATIC slnr AS INTEGER STATIC OldVal AS LONG IF ISFALSE Task(%tst+7).tog THEN DIM TaskParamLabels(0) TaskParamLabels(0) = "Speed" IF ISFALSE Task(%tst + 7).hParam THEN MakeTaskParameterDialog %tst+7,1, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%tst + 7).SliderNumbers(0) 'get slidermumber given in GMT-code Slider(Slnr).value = 10 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Task(%tst+7).tog = %True END IF IF Oldval = %True THEN ' TW_Light %False OldVal =%False ELSE ' TW_Light %True OldVal = %True END IF Task(%tst+7).freq = Slider(Slnr).value / 10 IF Task(%tst+7).freq < 0.1 THEN Task(%tst+7).freq = 0.1 END SUB SUB TW_Bird_Test () ' testmodule for bird sound ' for a realistic bird sound, one should modulate the task frequency STATIC TaskParamlabels() AS ASCIIZ*8 STATIC slnr AS INTEGER IF ISFALSE Task(%tst+9).tog THEN DIM TaskParamLabels(1) TaskParamLabels(0) = "Speed" TaskParamLabels(1) = "Force" IF Task(%tst+1).hParam = %Null THEN MakeTaskParameterDialog %tst+9,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%tst+9).SliderNumbers(0) Slider(Slnr).value = 20 Slider(Slnr+1).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value Task(%tst+9).tog = %True END IF ' TW_Bird INT(.5 * Slider(slnr+1).value * SQR(RND)) ' bytes Task(%tst+9).freq = Slider(slnr).value / 10 ' 12Hz max. IF Slider(slnr+1).value THEN ' limit duty cycle to 50% IF Task(%tst+9).freq > 1000 / Slider(slnr+1).value THEN Task(%tst+9).freq = 1000/ Slider(slnr+1).value END IF Task(%tst + 9).freq = SQR(RND) * Task(%tst + 9).freq IF Task(%tst+9).freq < 0.25 THEN Task(%tst+9).freq = 0.25 END SUB SUB WindTest () 'testmodule for windmachine STATIC TaskParamLabels() AS ASCIIZ*8 STATIC slnr() AS INTEGER LOCAL i AS INTEGER LOCAL OutVal AS SINGLE 'output value to windmachine, must be single for computations done on it!!! STATIC hoek AS SINGLE STATIC eksp AS DWORD 'exponent v/d sinuskurve STATIC OldVal AS LONG STATIC speed AS BYTE IF ISFALSE Task(%tst+1).tog THEN DIM Slnr(2) DIM TaskParamLabels(2) TaskParamLabels(0) = "Speed" 'with wich an exponential sine functon proceeds through time TaskParamLabels(1) = "curve" 'exponent TaskParamLabels(2) = "MaxVal" 'maximum speed value for windmachine IF Task(%tst+1).hParam = %Null THEN MakeTaskParameterDialog %tst+1,3, Slider(),0,UdCtrl(), TaskParamLabels() END IF FOR i = 0 TO 2 slnr(i) = TaskEX(%tst+1).SliderNumbers(i) 'get slidermumber given in GMT-code Slider(Slnr(i)).value = 20 SendMessage Slider(Slnr(i)).h, %TBM_SETPOS,%True, Slider(Slnr(i)).value NEXT Task(%tst+1).tog = %True END IF hoek = hoek + Slider(slnr(0)).value / ( 1000 * Pi) 'tussen .001 en .127 halve sinussen / sec bij taskfreq 5 IF hoek >= Pi THEN hoek = %false eksp = INT(Slider(slnr(1)).value/20) IF eksp < 1 THEN eksp = 1 '1 to 6 OutVal = ABS(SIN(hoek ))^eksp OutVal = INT(OutVal * Slider(slnr(2)).value) + 4 IF OutVal < 0 THEN OutVal = 0 IF OutVal <> OldVal THEN speed = INT(OutVal) #IF %DEF (%klungSim) 'put value in startime of windsimu task ( = note) task(ThunderWood.windtask ).duur = outval #ELSE TW_Wind speed ' dll #ENDIF SetDlgItemText gh.CockPit, %GMT_msg1, " hoek " + STR$(hoek) + " curve " + STR$(eksp) + " MaxVal " + STR$(Slider(slnr(2)).value * 2) SetDlgItemText BYVAL gh.Cockpit, (%GMT_msg2),"OutPut Value: "+ STR$(OutVal) OldVal = OutVal END IF END SUB SUB WindTest2 () STATIC TaskParamLabels() AS ASCIIZ * 8 STATIC slnr AS LONG STATIC outVal AS LONG IF ISFALSE slnr THEN DIM TaskParamLabels (0) TaskParamLabels(0) = "Output" MakeTaskParameterDialog %tst+6,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%tst + 6).SliderNumbers(0) 'get slidermumber given in GMT-code END IF ' ThunderLog "windtest2" outval = 2 * Slider(slnr).value ' range 0-255 SetDlgItemText gh.Cockpit, %GMT_MSG2,"OutPut Value: "+ STR$(OutVal) #IF %DEF (%klungSim) 'put value in startime of windsimu task ( = note) IF outval > 1 THEN task(ThunderWood.windtask ).duur = outval /2 IF ISFALSE BIT(task(ThunderWood.windtask ).swit, %TASK_ONOFF) THEN StartTask ThunderWood.windtask ELSEIF BIT(task(ThunderWood.windtask ).swit, %TASK_ONOFF) THEN StopTask ThunderWood.windtask END IF #ELSE Tw_Wind OutVal ' dll - 8bit mode. #ENDIF END SUB SUB ThunderTest () STATIC TaskParamLabels() AS ASCIIZ*8 STATIC slnr() AS INTEGER LOCAL i AS INTEGER IF ISFALSE Task(%tst+3).tog THEN DIM Slnr(1) DIM TaskParamLabels(1) TaskParamLabels(0) = "Speed" TaskParamLabels(1) = "Velo " IF Task(%tst+3).hParam = %Null THEN MakeTaskParameterDialog %tst+3,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF FOR i = 0 TO 1 slnr(i) = TaskEX(%tst+3).SliderNumbers(i) 'get slidermumber given in GMT-code Slider(Slnr(i)).value = 20 SendMessage Slider(Slnr(i)).h, %TBM_SETPOS,%True, Slider(Slnr(i)).value NEXT Task(%tst+3).tog = %TRue END IF Task(ThunderWood.thundertask).freq = Slider(slnr(0)).value / 6 Task(ThunderWood.thundertask).level = Slider(slnr(1)).value IF ISFALSE task(ThunderWood.thundertask).level THEN IF BIT(task(ThunderWood.thundertask).swit, %TASK_ONOFF) THEN StopTask ThunderWood.thundertask ELSEIF ISFALSE(BIT(task(ThunderWood.thundertask).swit, %TASK_ONOFF)) THEN StartTask ThunderWood.thundertask END IF END SUB SUB ChimesTest () 'bamboo windchimes 'gmidi perc note 74 in patch 72 STATIC TaskParamLabels() AS ASCIIZ*8 STATIC slnr() AS INTEGER LOCAL i AS INTEGER IF ISFALSE Task(%tst+4).tog THEN DIM Slnr(1) DIM TaskParamLabels(1) TaskParamLabels(0) = "Speed" TaskParamLabels(1) = "Velo " IF Task(%tst+4).hParam = %Null THEN MakeTaskParameterDialog %tst+4,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF FOR i = 0 TO 1 slnr(i) = TaskEX(%tst+4).SliderNumbers(i) 'get slidermumber given in GMT-code Slider(Slnr(i)).value = 20 SendMessage Slider(Slnr(i)).h, %TBM_SETPOS,%True, Slider(Slnr(i)).value NEXT Task(%tst+4).tog = %True END IF Task(ThunderWood.chimestask).level = Slider(slnr(1)).value IF task(ThunderWood.chimestask).freq < 0.1 THEN IF BIT(task(ThunderWood.chimestask).swit, %TASK_ONOFF) THEN StopTask ThunderWood.chimestask ELSE Task(ThunderWood.chimestask).freq = Slider(slnr(0)).value / 10 IF ISFALSE(BIT(task(ThunderWood.chimestask).flags, %TASK_ONOFF)) THEN StartTask ThunderWood.chimestask END IF END SUB SUB RainTest () STATIC TaskParamLabels() AS ASCIIZ*8 STATIC slnr() AS INTEGER LOCAL i AS INTEGER IF ISFALSE Task(%tst+5).tog THEN DIM Slnr(3) DIM TaskParamLabels(3) TaskParamLabels(0) = "Speed" TaskParamLabels(1) = "MinSp" TaskParamLabels(2) = "Velo " ' scale +- 0 to 10 IF Task(%tst+5).hParam = %Null THEN MakeTaskParameterDialog %tst+5,3, Slider(),0,UdCtrl(), TaskParamLabels() END IF FOR i = 0 TO 3 slnr(i) = TaskEX(%tst+5).SliderNumbers(i) 'get slidernumber given in GMT-code Slider(Slnr(i)).value = 20 SendMessage Slider(Slnr(i)).h, %TBM_SETPOS,%True, Slider(Slnr(i)).value NEXT Task(%tst+5).tog = %True ' this was missing, a kl bug.... ' corrected 01.08.2002 gwr. END IF IF slider(slnr(0)).value > 0 THEN IF ISFALSE(BIT(task(ThunderWood.raintask).swit, %TASK_ONOFF)) THEN StartTask ThunderWood.raintask Task(ThunderWood.raintask).duur = Slider(slnr(1)).value Task(ThunderWood.raintask).tempo = Slider(slnr(0)).value Task(ThunderWood.raintask).level = Slider(slnr(2)).value ELSEIF BIT(task(ThunderWood.raintask).swit, %TASK_ONOFF) THEN StopTask ThunderWood.raintask END IF END SUB SUB TW_Storm_Test () STATIC TaskParamLabels() AS ASCIIZ*8 STATIC slnr AS INTEGER LOCAL i AS INTEGER IF ISFALSE Task(%tst+8).tog THEN DIM TaskParamLabels(0) TaskParamLabels(0) = "Speed" IF ISFALSE Task(%tst+8).hParam THEN MakeTaskParameterDialog %tst+8,1, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr= TaskEX(%tst+8).SliderNumbers(0) Slider(Slnr).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Task(%tst+8).tog = %True END IF Task(%tst+8).freq = 1 TW_Storm slider(slnr).value * 2 ' new dll procedure END SUB SUB ThunderLog(a$) 'for debug, write a$ to file tromplog.txt STATIC hDlgDb AS LONG IF ISFALSE hDlgDb THEN DIALOG NEW %HWND_DESKTOP,"Thunder debug window",1,1,200,50 TO hDlgDb CONTROL ADD LABEL, hDlgDb,1,a$,1,1,198,49 DIALOG SHOW MODELESS hDlgDb END IF CONTROL SET TEXT hDlgDb,1,a$ END SUB SUB Woody () 'piece for woodpecker - by gwr STATIC low AS DWORD STATIC tenor AS DWORD STATIC alto AS DWORD STATIC high AS DWORD STATIC progr AS DWORD STATIC gCount AS DWORD 'general counter STATIC wind AS LONG 'switches: STATIC thunder AS LONG STATIC rain AS LONG STATIC chimes AS LONG STATIC sl0 AS LONG STATIC sl1 AS LONG IF ISFALSE task(%woody).tog THEN INCR task(%woody).tog gcount = %false wind = %false thunder = %false rain = %false chimes = %false progr = %false 'slider 0 for velo 'slider 1 for speed Slider(0).minval = 1 Slider(0).maxval = 127 Slider(0).stap = 1 Slider(0).value = 60'maxNr Slider(1).minval = 1 Slider(1).maxval = 127 Slider(1).stap = 1 Slider(1).value = 6.35*(task(%woody).freq - 5) '60 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_TITLE , "" SetDlgItemText gh.Cockpit, %GMT_AUTHOR , $gwr task(ThunderWood.beattask(1)).level = 5 task(ThunderWood.beattask(2)).level = 5 task(ThunderWood.beattask(3)).level = 5 task(ThunderWood.beattask(4)).level = 5 END IF task(%woody).freq = 5 + Slider(1).value /6.35 INCR gCount IF ISFALSE low THEN task(ThunderWood.beattask(1)).level = 100 * SIN(Pi*gcount/115)^2 '115 = 23 * 5> one cycle = 23 beats task(ThunderWood.beattask(1)).level = INT(task(ThunderWood.beattask(1)).level * Slider(0).value/127) PeckerLow END IF IF ISFALSE tenor THEN task(ThunderWood.beattask(2)).level = 100 * SIN(Pi*gcount/203 )^2 ' 29 * 7> one cycle = 29 beats task(ThunderWood.beattask(2)).level = INT(task(ThunderWood.beattask(2)).level * Slider(0).value/127) PeckerTenor END IF IF ISFALSE alto THEN task(ThunderWood.beattask(3)).level = 100 * SIN(Pi*gcount/333)^2 ' 37 * 9> one cycle = 29 beats task(ThunderWood.beattask(3)).level = INT(task(ThunderWood.beattask(3)).level * Slider(0).value/127) PeckerAlto END IF IF ISFALSE high THEN task(ThunderWood.beattask(4)).level = 100 * SIN(Pi*gcount/451 )^2 ' 41 * 11> one cycle = 37 beats task(ThunderWood.beattask(4)).level = INT(task(ThunderWood.beattask(4)).level * Slider(0).value/127) PeckerHigh END IF IF (low + tenor + alto + high) = 0 THEN INCR progr SELECT CASE progr CASE 2 IF wind THEN EXIT SELECT 'start wind Wind = %true TW_Wind 5 CASE 3 'start thunder IF thunder THEN EXIT SELECT task(ThunderWood.thundertask).freq = 2 task(ThunderWood.thundertask).level = 100 StartTask ThunderWood.thundertask thunder = %true CASE 4 'start rain IF rain THEN EXIT SELECT task(ThunderWood.raintask).duur = 5 task(ThunderWood.raintask).tempo = 127 task(ThunderWood.raintask).level = 30 Rain = %true StartTask ThunderWood.raintask CASE 5 'chimes IF chimes THEN EXIT SELECT task(ThunderWood.chimestask).freq = 2 task(ThunderWood.chimestask).level = 1 chimes=%true StartTask ThunderWood.chimestask CASE 6 ' ThunderLog "the end" END SELECT END IF INCR low: INCR tenor: INCR alto: INCR high 'every x steps reset, on next step we play the note ' with gwr's original values, one cycle takes 468901 steps!... 'now we try with smaller vals > now we still have 3465 steps IF low = 5 THEN low = %false 'was 19 '!! if we change those values we als have to adapt IF tenor = 7 THEN tenor = %false 'was 23 '!! the values who determine the volume cycles IF alto = 9 THEN alto = %false 'was 29 '! (c.s.) IF high = 11 THEN high = %false 'was 37 IF (low + tenor + alto = 0) OR (low + tenor + high = 0) OR _ (low + alto + high = 0) OR (tenor + alto + high = 0) THEN TW_Ratch task(ThunderWood.beattask(1)).level+task(ThunderWood.beattask(2)).level+task(ThunderWood.beattask(3)).level+task(ThunderWood.beattask(4)).level END IF 'experiment: IF gcount MOD INT(task(%woody).freq/3) THEN EXIT SUB 'we don't need to do the following that often... IF wind THEN TW_Wind 255 * SIN(gcount/257 * Pi)^2 * SIN(gcount/76)^2 END IF IF thunder THEN '3 min cycles task(ThunderWood.thundertask ).level = 27 + 100 * ABS(SIN(Pi*gcount/1050*Pi )^2 * SIN(Pi*gcount/415)^2) ' 41 * 11> one cycle = 37 beats task(ThunderWood.thundertask).freq = 1.5+ 5 * ABS(SIN(Pi*gcount/1150 )^2 * SIN(Pi*gcount/715)^ 2) IF task(ThunderWood.thundertask).level < 40 THEN 'if level is low we stop tasks > avoid having all tasks on simultan. for a long time... Stoptask ThunderWood.thundertask ELSEIF (ISFALSE BIT(task(ThunderWood.thundertask).swit, %TASK_ONOFF)) AND (task(ThunderWood.thundertask).freq >2.2) AND (task(ThunderWood.thundertask).level >50) THEN StartTask ThunderWood.thundertask END IF IF task(ThunderWood.thundertask).freq < 2 THEN IF BIT(task(ThunderWood.thundertask).swit, %TASK_ONOFF) THEN task(ThunderWood.thundertask).freq = 2 stoptask ThunderWood.thundertask END IF ELSE IF (ISFALSE BIT(task(ThunderWood.thundertask).swit, %TASK_ONOFF)) AND (task(ThunderWood.thundertask).level >=40) THEN StartTask ThunderWood.thundertask END IF ' EXIT SUB END IF IF rain THEN '5 min cycles task(ThunderWood.raintask).tempo = 47 + 200 * ABS(SIN(gcount/540 * Pi) * SIN(Pi*gcount/197)) IF task(ThunderWood.raintask).tempo < 90 THEN Stoptask ThunderWood.raintask ELSEIF (ISFALSE BIT(task(ThunderWood.raintask).swit, %TASK_ONOFF)) AND (task(ThunderWood.raintask).tempo >100) THEN StartTask ThunderWood.raintask END IF END IF IF chimes THEN task(ThunderWood.chimestask).level =27 + 80 * SIN(gcount/68 *Pi)^2 * COS(Pi*gcount/221)^2 ThunderLog STR$(task(ThunderWood.chimestask).level) IF task(ThunderWood.chimestask).level < 50 THEN 'if level is low we stop tasks > avoid having all tasks on simultan. for a long time... Stoptask ThunderWood.chimestask ELSEIF ISFALSE BIT(task(ThunderWood.chimestask).swit, %TASK_ONOFF) THEN StartTask ThunderWood.chimestask END IF 'ThunderLog "chimes" task(ThunderWood.chimestask).freq = 2 + 2 * SIN(gcount/127)^2 * SIN(Pi*gcount/71)^2 ' EXIT SUB END IF END SUB SUB WoodStoch () ' a piece by Kristof Lauwers STATIC i AS LONG STATIC sl0 AS LONG STATIC sl1 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 hDlgWS AS LONG STATIC density AS LONG LOCAL harm AS harmtype 'piece for thwood by kl 'each 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 'note: vvery low Meta_AME can have unexpected reults! IF ISFALSE task(%woody+1).tog THEN 'this tog is resetted when task is stopped by the user... task(%woody +1).pan = 0 ' pan = 1 for end of piece, tasknr of beatertask when the according button is clicked to raise energy level task(%woody+1).tog = %true FOR i = 0 TO 8 task(ThunderWood.thundertask+i).level = 0 task(ThunderWood.thundertask+i).freq = .1 NEXT density = 64 hoekLevel = 1 hoekFreq = 1.3' 2 infNeighb = .4 DIM AME(0 TO 8) AS STATIC DOUBLE 'amount of energy DIM HighCount(0 TO 8) AS STATIC DOUBLE IF Meta_AME_thunder =0 THEN Meta_AME_Thunder = 1 'set values that remain constant... task(ThunderWood.raintask).duur=64 task(ThunderWood.raintask).tempo=64 AME(INT(RND(1)*6)) = .9 DIALOG SHOW MODELESS hDlgWS Slider(0).minval = 1 Slider(0).maxval = 100 Slider(0).stap = 1 Slider(0).value = 80'0.3 * 100 '127 * SIN(hoeklevel)^2'maxNr Slider(1).minval = 1 Slider(1).maxval = 100 Slider(1).value = 80'0.6 * 100'127 * SIN(HoekFreq)^2 'increment*10000 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_TITLE , "" SetDlgItemText gh.Cockpit, %GMT_AUTHOR , $krl END IF InfLevel = Meta_AME_Thunder * Slider(0).value / 100 InfFreq = Meta_AME_Thunder * Slider(1).value / 100 hoekLevel = hoekLevel + Pi/(95 * task(%Stochl).freq) ' 1.5 min voor 1 cyclus IF hoekLevel = Pi THEN hoekLevel = 0 hoekFreq = hoekfreq + Pi/(160 * 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 <(.1 + slider(0).value / 200) THEN InfLevel=(.1 + Slider(0).value / 200) IF inflevel >.72 THEN infLevel = .72 IF infFreq <.01 THEN infFreq = .01 INCR i FOR dummy = 0 TO 8 tekst = tekst + TRIM$(STR$(INT(AME(dummy)*1000))) + " " NEXT tekst = tekst + " - "+STR$(Meta_AME_Thunder) ThunderLog tekst IF i >8 THEN i = 0 '-1 END IF IF i=8 THEN IF AME(i) > Meta_AME_thunder * .1 THEN TW_RATCH INT(AME(i)*127*inflevel) ELSEIF i = 7 THEN 'wind IF Meta_AME_thunder > .75 THEN 'min. 1 ! TW_WIND INT(AME(i)*225*SIN(30*hoekfreq)*inflevel) ELSE TW_WIND 0 END IF ELSE task(ThunderWood.thundertask+i).level = INT( (2 * task(ThunderWood.thundertask+i).level + (127 * AME(i) * infLevel)) / 3) SELECT CASE i CASE 0, 1 IF task(ThunderWood.thundertask+i).level < 30 THEN task(ThunderWood.thundertask+i).level = 30 CASE ELSE IF task(ThunderWood.thundertask+i).level < 10 THEN task(ThunderWood.thundertask+i).level = 10 END SELECT IF i<> 2 THEN task(ThunderWood.thundertask+i).freq = (4 * task(ThunderWood.thundertask+i).freq + (.1 + 6 * AME(i) * infFreq)) / 5 IF i=2 THEN task(ThunderWood.thundertask+i).duur = (INT(127*AME(i)*infFreq)) 'for rain IF (task(ThunderWood.thundertask+i).level > 3) THEN ' IF i > 6 THEN EXIT SUB 'DBG IF ISFALSE BIT (task(ThunderWood.thundertask+i).swit,%TASK_ONOFF) THEN StartTask ThunderWood.thundertask+i : EXIT SUB ELSEIF BIT(task(ThunderWood.thundertask+i).swit, %TASK_ONOFF) THEN StopTask ThunderWood.thundertask+i END IF END IF ' ThunderLog "b" j = i - 1 DO WHILE j < 0: j = j + 7: LOOP AME(j) = AME(j) + AME(i) * (infNeighb / (2*task(%woody+1).freq)) j = i + 1 DO WHILE j > 8: j = j - 7: LOOP AME(j) = AME(j) + AME(i) * (infNeighb / (2*task(%woody+1).freq)) AME(i) = AME(i) - AME(i) * (infNeighb / task(%woody+1).freq) #IF %DEF(%klungSim) IF AME(i) < .3 THEN AME(j) = AME(j) + AME(i) 'last bit passed at once.. AME(i) = 0 StopTask ThunderWood.thundertask+i END IF #ENDIF ' ThunderLog "c" FOR j = 0 TO 8 IF AME(j) > Meta_AME_Thunder THEN AME(j) = 0 'too much energy is deadly... the energy is spread over all klungs, and a little bit is lost #IF NOT %DEF(%klungSim) 'FOR dummy = 0 TO 8 ' AME(INT(dummy)) = AME(INT(dummy)) + 0.05 'NEXT grow: dummy = RND * 8 IF dummy <4 OR dummy > 7 THEN AME(RND(1)*8)=AME(RND(0)*8)+.6 ELSE AME(RND(1)*8)=AME(RND(0)*8)+.2 GOTO grow END IF #ENDIF END IF NEXT dummy = %false FOR j = 0 TO 8 IF AME(j) < Meta_AME_Thunder/5 THEN INCR dummy NEXT IF dummy >= 7 THEN dummy = RND * 8 IF dummy <4 OR dummy > 7 THEN AME(dummy)=AME(dummy)+.6 END IF END IF 'high energy's grow automaticaly IF AME(i) > Meta_AME_Thunder/2 THEN AME(i) = AME(i) *1.09 OnCount = %false FOR j = 0 TO 8 IF AME(j)> .25 THEN INCR Oncount NEXT IF OnCount > 3 THEN ' if too much are playing the highest ae killed FOR j = 0 TO 8 IF AME(j)>.4 THEN AME(j) = %false ELSEIF AME(j)<.2 THEN AME(j)=.8 END IF NEXT END IF IF AME(i) > Meta_AME_Thunder/3 THEN 'if energy is high for a long time, we're getting tired... INCR HighCount(i) IF HighCount(i) > 4 THEN AME(i) = AME(i) - .05 END IF IF AME(i) > Meta_AME_Thunder THEN AME(i) = Meta_AME_Thunder ELSE IF AME(i) < 0 THEN AME(i) = 0 IF HighCount(i) THEN DECR highCount(i) END IF END SUB SUB ThunderOff () LOCAL i AS LONG FOR i = ThunderWood.thundertask TO ThunderWood.beattask(4) StopTask i NEXT END SUB '[EOF] _ _ _