' ****************************************** ' * * ' * test and evaluation code * ' * Prof.dr.Godfried-Willem Raes * ' * belongs to the slagwerk compilation * ' ****************************************** ' 18.02.2013: first coding. ' 19.02.2013: first tests with midihub PIC ' strange irregular behavior on PIC... ' 20.02.2013: irregular behaviour was caused by a hardware wiring error on our development board. ' Midi Hub code seems to run o.k. now. ' Version 1.0 written for the midipulse PIC. ' Separate subs added for testing low and high blocks. ' 26.02.2013: E10 socket bulbs added. ' 27.02.2013: Ratchet added, note mapping on 69. Firmware version 1.1 ' 28.02.2013: Demo code added for 'Block Temple!' gwr ' 01.03.2013: Islamic version finalized ' 02.03.2013: Christian Version finalized (3') ' 03.03.2013: Hindu version added ' Buddhist and Masonic versions as well. Further differentiation still required. %Temblo_Rep = 48 '32 ' repetition test %Temblo_Low = 49 '33 ' test 6 low temple blocks %Temblo_High = 50 '34 ' test 6 high temple blocks %Temblo_Ratchet = 51 '35 ' test ratchet %Temblo_lite1 = 53 '48 %Temblo_lite2 = 54 '49 %Temblo_lite3 = 55 '50 %Temblo_lite4 = 56 '51 %Temblo_lite5 = 57 '52 %Temblo_lite6 = 58 '53 %Temblo_lite7 = 59 '54 %Temblo_lite8 = 60 '55 %Temblo_Test = 63 ' hardware test - no rescaling: for firmware evaluation purposes ' Composition code: ' tasknumbers for 'Block Temple!' - Islamic Version %BT_meta = 0 '16 %BT1 = 17 %BT2 = 18 %BT3 = 19 %BT4 = 20 %BT5 = 21 %BT6 = 22 %BT7 = 23 %BT8 = 24 %BT9 = 25 %BT10 = 26 %BT11 = 27 %BT12 = 28 %BT_rat = 5 %BT_nrang = 30 ' angular granulation constant - for Islamic version ' tasknumbers for 'Block Temple!' - Christian Version %BT_meta_Christian = 1 '32 %BT1_Christian = 33 %BT2_Christian = 34 %BT3_Christian = 35 %BT4_Christian = 36 %BT5_Christian = 37 %BT6_Christian = 38 %BT7_Christian = 39 %BT8_Christian = 40 %BT9_Christian = 41 %BT10_Christian = 42 %BT11_Christian = 43 %BT12_Christian = 44 %BT_rat_Christian = 6 '45 %BT_nrtiks = 32 '255 ' for Christian, Hindu and Buddhist version %BT_meta_Hindu = 2 '1 %BT_meta_Buddha = 3 '2 %BT_meta_Masonic = 4 '3 %BT_rat_Hindu = 7 %BT_rat_Buddha = 8 %BT_rat_Masonic = 9 TYPE BlokTemp DWORD Freqs(12) AS SINGLE ' used in all versions starttime AS DWORD stoptime AS DWORD nrang AS DWORD ' number of steps for a single period of 2*Pi (360 degrees) - Islamic version triangle(%BT_nrang * 12) AS SINGLE ' size = 360 version AS DWORD ' for alternative versions 0 = Islamic, 1 = Christian - not used yet nrtiks AS DWORD ' for Christian version veltri(%BT_nrtiks) AS SINGLE ' Christian END TYPE GLOBAL BlockTemple AS BlokTemp DECLARE FUNCTION Init_Temblo () AS LONG DECLARE SUB Temblo_Rep () DECLARE SUB Temblo_Note_UD1 () DECLARE SUB Temblo_Low () DECLARE SUB Temblo_High () DECLARE SUB Temblo_Test () ' test for hardware velo scaling and repetition rate DECLARE SUB Temblo_lite1 () DECLARE SUB Temblo_lite2 () DECLARE SUB Temblo_lite3 () DECLARE SUB Temblo_lite4 () DECLARE SUB Temblo_lite5 () DECLARE SUB Temblo_lite6 () DECLARE SUB Temblo_lite7 () DECLARE SUB Temblo_lite8 () ' composition code for 'Block Temples!' DECLARE SUB BT_Meta () DECLARE SUB BT1 () DECLARE SUB BT2 () DECLARE SUB BT3 () DECLARE SUB BT4 () DECLARE SUB BT5 () DECLARE SUB BT6 () DECLARE SUB BT7 () DECLARE SUB BT8 () DECLARE SUB BT9 () DECLARE SUB BT10 () DECLARE SUB BT11 () DECLARE SUB BT12 () DECLARE SUB BT_rat () DECLARE SUB BT_Meta_Christian () DECLARE SUB BT1_Christian () DECLARE SUB BT2_Christian () DECLARE SUB BT3_Christian () DECLARE SUB BT4_Christian () DECLARE SUB BT5_Christian () DECLARE SUB BT6_Christian () DECLARE SUB BT7_Christian () DECLARE SUB BT8_Christian () DECLARE SUB BT9_Christian () DECLARE SUB BT10_Christian () DECLARE SUB BT11_Christian () DECLARE SUB BT12_Christian () DECLARE SUB BT_rat_Christian () DECLARE SUB BT_Meta_Hindu () DECLARE SUB BT_rat_Hindu () DECLARE SUB BT_Meta_Buddha () DECLARE SUB BT_rat_Buddha () DECLARE SUB BT_Meta_Masonic () DECLARE SUB BT_rat_Masonic () FUNCTION Init_Temblo () AS LONG LOCAL retval AS LONG LOCAL m AS ASCIIZ * 20 LOCAL i AS LONG m = " test code" Sendmessage gh.Cockpit, %WM_SETTEXT,0, VARPTR(m) ' cockpit titel Task(%Temblo_Rep).naam = "Temblo" Task(%Temblo_Rep).cptr = CODEPTR(Temblo_Rep) Task(%Temblo_Rep).freq = 2 Task(%Temblo_Rep).flags = %False Task(%Temblo_Low).naam = "T_Low" Task(%Temblo_Low).cptr = CODEPTR(Temblo_Low) Task(%Temblo_Low).freq = 2 Task(%Temblo_Low).flags = %False Task(%Temblo_High).naam = "T_High" Task(%Temblo_High).cptr = CODEPTR(Temblo_High) Task(%Temblo_High).freq = 2 Task(%Temblo_High).flags = %False Task(%Temblo_Ratchet).naam = "Ratchet" Task(%Temblo_Ratchet).cptr = CODEPTR(Temblo_Ratchet) Task(%Temblo_Ratchet).freq = 1 Task(%Temblo_Ratchet).flags = %False ' hardware tests: Task(%Temblo_Test).naam = "HardTst" Task(%Temblo_test).cptr = CODEPTR(Temblo_Test) Task(%Temblo_Test).freq = 2 Task(%Temblo_Test).flags = %False Task(%MM_SysxTask).naam = "SendSysx" Task(%MM_SysxTask).freq = .33 Task(%MM_SysxTask).cptr = CODEPTR(MM_Sysx) 'in m_robots.inc Task(%Temblo_lite1).cptr = CODEPTR(Temblo_Lite1) Task(%Temblo_lite1).naam = "Red1" ' red, side Task(%Temblo_lite1).freq = 1 Task(%Temblo_lite1).flags = %False Task(%Temblo_lite2).cptr = CODEPTR(Temblo_Lite2) Task(%Temblo_lite2).naam = "Red2" ' red, side Task(%Temblo_lite2).freq = 1 Task(%Temblo_lite2).flags = %False Task(%Temblo_lite3).cptr = CODEPTR(Temblo_Lite3) Task(%Temblo_lite3).naam = "Red3" ' red, side Task(%Temblo_lite3).freq = 1 Task(%Temblo_lite3).flags = %False Task(%Temblo_lite4).cptr = CODEPTR(Temblo_Lite4) Task(%Temblo_lite4).naam = "Blue" ' blue, underneath Task(%Temblo_lite4).freq = 1 Task(%Temblo_lite4).flags = %False Task(%Temblo_lite5).cptr = CODEPTR(Temblo_Lite5) Task(%Temblo_lite5).naam = "Wit" ' tungsten wit Task(%Temblo_lite5).freq = 1 Task(%Temblo_lite5).flags = %False Task(%Temblo_lite6).cptr = CODEPTR(Temblo_Lite6) Task(%Temblo_lite6).naam = "Toplite" ' tungsten wit top Task(%Temblo_lite6).freq = 1 Task(%Temblo_lite6).flags = %False Task(%Temblo_lite7).cptr = CODEPTR(Temblo_Lite7) ' pwm Task(%Temblo_lite7).naam = "L126" ' not connected as yet Task(%Temblo_lite7).freq = 1 Task(%Temblo_lite7).flags = %False Task(%Temblo_lite8).cptr = CODEPTR(Temblo_Lite8) ' pwm Task(%Temblo_lite8).naam = "Koepel" ' halogeen onder rode koepel Task(%Temblo_lite8).freq = 1 Task(%Temblo_lite8).flags = %False ' for 'Block Temple!' - Islamic Version: Task(%BT_meta).cptr = CODEPTR(BT_meta) Task(%BT_meta).naam = "Islamic" Task(%BT_meta).freq = 1 Task(%BT_meta).flags = %False Task(%BT1).cptr = CODEPTR(BT1) Task(%BT1).naam = "BT1" Task(%BT1).freq = 100 Task(%BT1).flags = %False Task(%BT2).cptr = CODEPTR(BT2) Task(%BT2).naam = "BT2" Task(%BT2).freq = 101 Task(%BT2).flags = %False Task(%BT3).cptr = CODEPTR(BT3) Task(%BT3).naam = "BT3" Task(%BT3).freq = 102 Task(%BT3).flags = %False Task(%BT4).cptr = CODEPTR(BT4) Task(%BT4).naam = "BT4" Task(%BT4).freq = 103 Task(%BT4).flags = %False Task(%BT5).cptr = CODEPTR(BT5) Task(%BT5).naam = "BT5" Task(%BT5).freq = 104 Task(%BT5).flags = %False Task(%BT6).cptr = CODEPTR(BT6) Task(%BT6).naam = "BT6" Task(%BT6).freq = 105 Task(%BT6).flags = %False Task(%BT7).cptr = CODEPTR(BT7) Task(%BT7).naam = "BT7" Task(%BT7).freq = 106 Task(%BT7).flags = %False Task(%BT8).cptr = CODEPTR(BT8) Task(%BT8).naam = "BT8" Task(%BT8).freq = 107 Task(%BT8).flags = %False Task(%BT9).cptr = CODEPTR(BT9) Task(%BT9).naam = "BT9" Task(%BT9).freq = 108 Task(%BT9).flags = %False Task(%BT10).cptr = CODEPTR(BT10) Task(%BT10).naam = "BT10" Task(%BT10).freq = 109 Task(%BT10).flags = %False Task(%BT11).cptr = CODEPTR(BT11) Task(%BT11).naam = "BT11" Task(%BT11).freq = 110 Task(%BT11).flags = %False Task(%BT12).cptr = CODEPTR(BT12) Task(%BT12).naam = "BT12" Task(%BT12).freq = 111 Task(%BT12).flags = %False Task(%BT_rat).cptr = CODEPTR(BT_rat) Task(%BT_rat).naam = "BT_ratI" Task(%BT_rat).freq = 8 Task(%BT_rat).flags = %False TaskEX(%BT_rat).stopcptr = CODEPTR(BT_rat_stop) ' Christian version: Task(%BT_meta_Christian).cptr = CODEPTR(BT_meta_Christian) Task(%BT_meta_Christian).naam = "Christian" Task(%BT_meta_Christian).freq = 1 Task(%BT_meta_Christian).flags = %False Task(%BT1_Christian).cptr = CODEPTR(BT1_Christian) Task(%BT1_Christian).naam = "BT1" Task(%BT1_Christian).freq = 100 Task(%BT1_Christian).flags = %False Task(%BT2_Christian).cptr = CODEPTR(BT2_Christian) Task(%BT2_Christian).naam = "BT2" Task(%BT2_Christian).freq = 101 Task(%BT2_Christian).flags = %False Task(%BT3_Christian).cptr = CODEPTR(BT3_Christian) Task(%BT3_Christian).naam = "BT3" Task(%BT3_Christian).freq = 102 Task(%BT3_Christian).flags = %False Task(%BT4_Christian).cptr = CODEPTR(BT4_Christian) Task(%BT4_Christian).naam = "BT4" Task(%BT4_Christian).freq = 103 Task(%BT4_Christian).flags = %False Task(%BT5_Christian).cptr = CODEPTR(BT5_Christian) Task(%BT5_Christian).naam = "BT5" Task(%BT5_Christian).freq = 104 Task(%BT5_Christian).flags = %False Task(%BT6_Christian).cptr = CODEPTR(BT6_Christian) Task(%BT6_Christian).naam = "BT6" Task(%BT6_Christian).freq = 105 Task(%BT6_Christian).flags = %False Task(%BT7_Christian).cptr = CODEPTR(BT7_Christian) Task(%BT7_Christian).naam = "BT7" Task(%BT7_Christian).freq = 106 Task(%BT7_Christian).flags = %False Task(%BT8_Christian).cptr = CODEPTR(BT8_Christian) Task(%BT8_Christian).naam = "BT8" Task(%BT8_Christian).freq = 107 Task(%BT8_Christian).flags = %False Task(%BT9_Christian).cptr = CODEPTR(BT9_Christian) Task(%BT9_Christian).naam = "BT9" Task(%BT9_Christian).freq = 108 Task(%BT9_Christian).flags = %False Task(%BT10_Christian).cptr = CODEPTR(BT10_Christian) Task(%BT10_Christian).naam = "BT10" Task(%BT10_Christian).freq = 109 Task(%BT10_Christian).flags = %False Task(%BT11_Christian).cptr = CODEPTR(BT11_Christian) Task(%BT11_Christian).naam = "BT11" Task(%BT11_Christian).freq = 110 Task(%BT11_Christian).flags = %False Task(%BT12_Christian).cptr = CODEPTR(BT12_Christian) Task(%BT12_Christian).naam = "BT12" Task(%BT12_Christian).freq = 111 Task(%BT12_Christian).flags = %False Task(%BT_rat_Christian).cptr = CODEPTR(BT_rat_Christian) Task(%BT_rat_Christian).naam = "BT_ratC" Task(%BT_rat_Christian).freq = 25 Task(%BT_rat_Christian).flags = %False 'TaskEX(%BT_rat_Christian).stopcptr = CODEPTR(MM_Temblo_Off) ' Hindu version Task(%BT_meta_Hindu).cptr = CODEPTR(BT_meta_Hindu) Task(%BT_meta_Hindu).naam = "Hindu" Task(%BT_meta_Hindu).freq = 1 Task(%BT_meta_Hindu).flags = %False Task(%BT_rat_Hindu).cptr = CODEPTR(BT_rat_Hindu) Task(%BT_rat_Hindu).naam = "BT_ratH" Task(%BT_rat_Hindu).freq = 25 Task(%BT_rat_Hindu).flags = %False ' Buddha version Task(%BT_meta_Buddha).cptr = CODEPTR(BT_meta_Buddha) Task(%BT_meta_Buddha).naam = "Buddha" Task(%BT_meta_Buddha).freq = 1 Task(%BT_meta_Buddha).flags = %False Task(%BT_rat_Buddha).cptr = CODEPTR(BT_rat_Buddha) Task(%BT_rat_Buddha).naam = "BT_ratB" Task(%BT_rat_Buddha).freq = 25 Task(%BT_rat_Buddha).flags = %False ' Masonic version Task(%BT_meta_Masonic).cptr = CODEPTR(BT_meta_Masonic) Task(%BT_meta_Masonic).naam = "Masonic" Task(%BT_meta_Masonic).freq = 1 Task(%BT_meta_Masonic).flags = %False Task(%BT_rat_Masonic).cptr = CODEPTR(BT_rat_Masonic) Task(%BT_rat_Masonic).naam = "BT_ratM" Task(%BT_rat_Masonic).freq = 25 Task(%BT_rat_Masonic).flags = %False FUNCTION = %True END FUNCTION SUB Temblo_Rep () ' test note repeats STATIC note AS INTEGER LOCAL velo AS INTEGER LOCAL v AS SINGLE STATIC slnr AS DWORD STATIC udnr AS DWORD IF ISFALSE Task(%Temblo_Rep).tog THEN DIM TaskParamLabels(0 TO 2) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Level" TaskParamLabels(2) = "Note" IF ISFALSE Task(%Temblo_rep).hParam THEN slnr = %False MakeTaskParameterDialog %Temblo_Rep,2,Slider(),1,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Temblo_Rep).SliderNumbers(0) UDctrl(TaskEX(%Temblo_rep).UpdownNumbers(0)).cptr = CODEPTR(Temblo_Note_UD1) ' note UDctrl(TaskEX(%Temblo_rep).UpDownNumbers(0)).value = Temblo.lowtes Task(%Temblo_rep).freq = 2 Slider(slnr).value = Task(%Temblo_rep).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 1 ' low level on init. udnr = TaskEX(%Temblo_rep).UpDownNumbers(0) END IF MM_Temblo_On ' sends ctrl 66. Task(%Temblo_rep).tog = %True END IF note = UDctrl(udnr).value v = Slider(slnr+1).value IF v THEN mPlay Temblo.channel, note, v END IF Task(%Temblo_Rep).freq = (Slider(slnr).value) / 4! END SUB SUB Temblo_Note_UD1 () ' controls the repetition note to be played. LOCAL noot AS BYTE STATIC oldnoot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Temblo_Rep).UpDownNumbers(0) noot = UDCtrl(udnr).value SELECT CASE noot CASE < Temblo.lowtes UDctrl(udnr).value = Temblo.lowtes : noot = Temblo.lowtes CASE 66,67,68, 69,70,71 IF oldnoot = 65 THEN UDctrl(udnr).value = 72 : noot = 72 IF oldnoot = 72 THEN UDctrl(udnr).value = 65 : noot = 65 CASE > Temblo.hightes UDctrl(udnr).value = Temblo.hightes : noot = Temblo.hightes END SELECT SetDlgItemText Task(%Temblo_Rep).hparam, %GMT_TEXT0_ID + 16, "N=" & STR$(noot) oldnoot = noot END SUB SUB Temblo_Test () ' test note repeats STATIC note AS INTEGER LOCAL velo AS INTEGER STATIC slnr AS DWORD STATIC udnr AS DWORD IF ISFALSE Task(%Temblo_Test).tog THEN DIM TaskParamLabels(0 TO 2) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Level" TaskParamLabels(2) = "Note" IF ISFALSE Task(%Temblo_Test).hParam THEN slnr = %False MakeTaskParameterDialog %Temblo_Test,2,Slider(),1,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Temblo_Test).SliderNumbers(0) UDctrl(TaskEX(%Temblo_Test).UpdownNumbers(0)).cptr = CODEPTR(Temblo_HWNote_UD1) ' note UDctrl(TaskEX(%Temblo_Test).UpDownNumbers(0)).value = Temblo.lowtes Task(%Temblo_Test).freq = 2 Slider(slnr).value = Task(%Temblo_Test).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 1 ' low level on init. udnr = TaskEX(%Temblo_Test).UpDownNumbers(0) END IF Task(%Temblo_Test).tog = %True END IF note = UDctrl(udnr).value velo = Slider(slnr+1).value ' for PIC test, so no rescaling here. mPlay Temblo.channel, note, velo ' we do not send noteoff commands Task(%Temblo_Test).freq = (Slider(slnr).value) / 4! END SUB SUB Temblo_HWNote_UD1 () ' controls the note to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Temblo_Test).UpDownNumbers(0) noot = UDCtrl(udnr).value IF noot < Temblo.lowtes THEN UDctrl(udnr).value = Temblo.lowtes : noot = Temblo.lowtes IF noot > Temblo.hightes THEN UDctrl(udnr).value = Temblo.hightes : noot = Temblo.hightes SetDlgItemText Task(%Temblo_Test).hparam, %GMT_TEXT0_ID + 16, "N=" & STR$(noot) END SUB SUB Temblo_Low () ' test low blocks STATIC note AS INTEGER LOCAL velo AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Temblo_Low).tog THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Level" IF ISFALSE Task(%Temblo_Low).hParam THEN slnr = %False MakeTaskParameterDialog %Temblo_Low,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Temblo_Low).SliderNumbers(0) Task(%Temblo_Low).freq = 2 Slider(slnr).value = Task(%Temblo_Low).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 1 ' low level on init. END IF note = 60 Task(%Temblo_Low).tog = %True END IF velo = Slider(slnr+1).value ' for PIC test, so no rescaling here. mPlay Temblo.channel, note, velo ' we do not send noteoff commands Task(%Temblo_Low).freq = (Slider(slnr).value) / 4! INCR note IF note > 65 THEN note = 60 END SUB SUB Temblo_High () ' test high blocks STATIC note AS INTEGER LOCAL velo AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Temblo_High).tog THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Level" IF ISFALSE Task(%Temblo_High).hParam THEN slnr = %False MakeTaskParameterDialog %Temblo_High,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Temblo_High).SliderNumbers(0) Task(%Temblo_High).freq = 2 Slider(slnr).value = Task(%Temblo_High).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 1 ' low level on init. END IF note = 72 Task(%Temblo_High).tog = %True END IF velo = Slider(slnr+1).value ' for PIC test, so no rescaling here. mPlay Temblo.channel, note, velo ' we do not send noteoff commands Task(%Temblo_High).freq = (Slider(slnr).value) / 4! INCR note IF note > 77 THEN note = 72 END SUB SUB Temblo_Ratchet () STATIC note, cnt AS INTEGER LOCAL velo AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Temblo_Ratchet).tog THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Level" IF ISFALSE Task(%Temblo_Ratchet).hParam THEN slnr = %False MakeTaskParameterDialog %Temblo_Ratchet,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Temblo_Ratchet).SliderNumbers(0) Task(%Temblo_Ratchet).freq = 1 Slider(slnr).value = Task(%Temblo_Ratchet).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 64 ' medium level on init. END IF RESET cnt note = 69 Task(%Temblo_Ratchet).tog = %True END IF IF ISFALSE cnt MOD 2 THEN velo = Slider(slnr+1).value ' for PIC test, so no rescaling here. Steers motor speed in PWM mPlay Temblo.channel, note, velo ' we have to send noteoff commands as well here ELSE NoteOff Temblo.channel, note END IF Task(%Temblo_Ratchet).freq = 0.1 + (Slider(slnr).value) / 8! INCR cnt END SUB SUB Temblo_lite1 () STATIC cnt AS DWORD STATIC slnr AS DWORD STATIC noot AS DWORD IF ISFALSE Task(%Temblo_Lite1).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Temblo_lite1).hParam THEN slnr = %False MakeTaskParameterDialog %Temblo_Lite1,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Temblo_Lite1).SliderNumbers(0) Task(%Temblo_lite1).freq = 2 Slider(slnr).value = Task(%Temblo_lite1).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF cnt = %False noot = 120 Task(%Temblo_lite1).tog = %True END IF IF ISFALSE cnt THEN mPlay Temblo.channel, noot, 127 cnt = %True ELSE NoteOff Temblo.channel, noot cnt = %False END IF Task(%Temblo_Lite1).freq = (Slider(slnr).value) / 2! END SUB SUB Temblo_lite2 () STATIC cnt AS DWORD STATIC slnr AS DWORD STATIC noot AS BYTE IF ISFALSE Task(%Temblo_Lite2).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Temblo_Lite2).hParam THEN slnr = %False MakeTaskParameterDialog %Temblo_Lite2,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Temblo_Lite2).SliderNumbers(0) Task(%Temblo_Lite2).freq = 2 Slider(slnr).value = Task(%Temblo_Lite2).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF cnt = %False noot = 121 Task(%Temblo_Lite2).tog = %True END IF IF ISFALSE cnt THEN mPlay Temblo.channel, noot, 127 cnt = %True ELSE NoteOff Temblo.channel, noot cnt = %False END IF Task(%Temblo_Lite2).freq = (Slider(slnr).value) / 2! END SUB SUB Temblo_lite3 () STATIC cnt AS DWORD STATIC slnr AS DWORD STATIC noot AS BYTE IF ISFALSE Task(%Temblo_Lite3).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Temblo_Lite3).hParam THEN slnr = %False MakeTaskParameterDialog %Temblo_Lite3,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Temblo_Lite3).SliderNumbers(0) Task(%Temblo_Lite3).freq = 2 Slider(slnr).value = Task(%Temblo_Lite3).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF cnt = %False noot = 122 Task(%Temblo_Lite3).tog = %True END IF IF ISFALSE cnt THEN mPlay Temblo.channel, noot, 127 cnt = %True ELSE NoteOff Temblo.channel, noot cnt = %False END IF Task(%Temblo_Lite3).freq = (Slider(slnr).value) / 2! END SUB SUB Temblo_lite4 () STATIC cnt AS DWORD STATIC slnr AS DWORD STATIC noot AS BYTE IF ISFALSE Task(%Temblo_Lite4).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Temblo_Lite4).hParam THEN slnr = %False MakeTaskParameterDialog %Temblo_Lite4,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Temblo_Lite4).SliderNumbers(0) Task(%Temblo_Lite4).freq = 2 Slider(slnr).value = Task(%Temblo_Lite4).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF cnt = %False noot = 123 Task(%Temblo_Lite4).tog = %True END IF IF ISFALSE cnt THEN mPlay Temblo.channel, noot, 127 cnt = %True ELSE NoteOff Temblo.channel, noot cnt = %False END IF Task(%Temblo_Lite4).freq = (Slider(slnr).value) / 2! END SUB SUB Temblo_lite5 () STATIC cnt AS DWORD STATIC slnr AS DWORD STATIC noot AS BYTE IF ISFALSE Task(%Temblo_Lite5).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Temblo_Lite5).hParam THEN slnr = %False MakeTaskParameterDialog %Temblo_Lite5,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Temblo_Lite5).SliderNumbers(0) Task(%Temblo_Lite5).freq = 2 Slider(slnr).value = Task(%Temblo_Lite5).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF cnt = %False noot = 124 Task(%Temblo_Lite5).tog = %True END IF IF ISFALSE cnt THEN mPlay Temblo.channel, noot, 127 cnt = %True ELSE NoteOff Temblo.channel, noot cnt = %False END IF Task(%Temblo_Lite5).freq = (Slider(slnr).value) / 2! END SUB SUB Temblo_lite6 () STATIC cnt AS DWORD STATIC slnr AS DWORD STATIC noot AS BYTE IF ISFALSE Task(%Temblo_Lite6).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" IF ISFALSE Task(%Temblo_Lite6).hParam THEN slnr = %False MakeTaskParameterDialog %Temblo_Lite6,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Temblo_Lite6).SliderNumbers(0) Task(%Temblo_Lite6).freq = 2 Slider(slnr).value = Task(%Temblo_Lite6).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF cnt = %False noot = 125 Task(%Temblo_Lite6).tog = %True END IF IF ISFALSE cnt THEN mPlay Temblo.channel, noot, 127 cnt = %True ELSE NoteOff Temblo.channel, noot cnt = %False END IF Task(%Temblo_Lite6).freq = (Slider(slnr).value) / 2! END SUB SUB Temblo_lite7 () ' not in use yet STATIC cnt AS DWORD STATIC slnr AS DWORD IF ISFALSE Task(%Temblo_Lite7).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Force" IF ISFALSE Task(%Temblo_Lite7).hParam THEN slnr = %False MakeTaskParameterDialog %Temblo_Lite7,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Temblo_Lite7).SliderNumbers(0) Task(%Temblo_Lite7).freq = 2 Slider(slnr).value = Task(%Temblo_Lite7).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF cnt = %False Task(%Temblo_Lite7).tog = %True END IF IF ISFALSE cnt THEN mPlay Temblo.channel, 126, Slider(slnr+1).value cnt = %True ELSE NoteOff Temblo.channel, 126 cnt = %False END IF Task(%Temblo_Lite7).freq = (Slider(slnr).value) / 2! END SUB SUB Temblo_lite8 () ' tungsten licht onder de rode koepel STATIC cnt AS DWORD STATIC slnr AS DWORD IF ISFALSE Task(%Temblo_Lite8).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Force" IF ISFALSE Task(%Temblo_Lite8).hParam THEN slnr = %False MakeTaskParameterDialog %Temblo_Lite8,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Temblo_Lite8).SliderNumbers(0) Task(%Temblo_Lite8).freq = 2 Slider(slnr).value = Task(%Temblo_Lite8).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF cnt = %False Task(%Temblo_Lite8).tog = %True END IF IF ISFALSE cnt THEN mPlay Temblo.channel, 127, Slider(slnr+1).value cnt = %True ELSE NoteOff Temblo.channel, 127 cnt = %False END IF Task(%Temblo_Lite8).freq = (Slider(slnr).value) / 2! END SUB '********************************************* ' code for 'Block Temple' - gwr temblo demo '********************************************* SUB BT_Meta () 'algorithmic demo piece for Temblo. STATIC Basefreq, shape() AS SINGLE STATIC ratchet_flag AS INTEGER LOCAL i, sum AS INTEGER LOCAL duur AS DWORD IF ISFALSE Task(%BT_meta).tog THEN MM_Temblo_On %MM_Power Blocktemple.version = %False BlockTemple.nrang = %BT_nrang '60 ' if 360 we do degree per degree, with 90 we increment in 4 degree steps Basefreq = 0.8 '1 ' 0.5 '1 ' with 90 and 8, the piece is 1 minute long ' with 360 and 1 it takes forever... (nice piano background though.) ' with 90 and 4, the piece takes 2 minutes ' with 90 and 3, it takes 2'14" (with 12div for a duodecime) ' with 120 and 3, it takes 2'56" ' with 90 and 2, it takes ' 60 and 1 ' 30 and 0.8 : 2'33" - whole tone series ' 0.8 and 30, in minor thirds gives 2' and sounds much better FOR i = 0 TO 12 'BlockTemple.Freqs(i) = BaseFreq * (2^(i/12)) ' chromatic tempi 'Blocktemple.Freqs(i) = BaseFreq * (3^(i/12)) ' duodecime in 12 parts 'Blocktemple.Freqs(i) = BaseFreq * (4^(i/12)) ' two octaves in 12 parts - whole tone series 'Blocktemple.Freqs(i) = BaseFreq * (5^(i/12)) ' duodecime in 12 parts Blocktemple.Freqs(i) = Basefreq * (2^( (i*3)/12 ) ) ' in minor thirds NEXT i ' if we want it more rhytmical we should recode this FOR i = 0 TO (12 * BlockTemple.nrang) Blocktemple.Triangle(i) = 127 NEXT i REDIM Shape(12 * BlockTemple.nrang) AT VARPTR(Blocktemple.triangle(0)) TriangleWindow Shape() ' passing BlockTemple.triangle() does not work! ' in g_indep FOR i = %BT1 TO %BT12 starttask i NEXT i RESET Task(%BT_rat).pan 'if isfalse Task(%BT_rat).pan then starttask %BT_rat 'end if BlockTemple.starttime = TimeGetTime logfile "Block Temple! start at" & TIME$ Task(%BT_meta).tog = %True EXIT SUB END IF FOR i = %BT1 TO %BT12 sum = sum + Task(i).tog NEXT i IF sum = 12 THEN EXIT SUB ELSE IF ISFALSE ratchet_flag THEN Task(%BT_rat).pan = 127 starttask %BT_rat END IF ratchet_flag = %True END IF IF ISFALSE sum THEN BlockTemple.stoptime = Timegettime logfile "Block Temple! stops at" & TIME$ logfile "Parameters:" logfile "number of angular steps:" & STR$(Blocktemple.nrang) logfile "base frequency:" & STR$(Blocktemple.Freqs(0)) duur = (Blocktemple.stoptime - Blocktemple.starttime)/ 1000 logfile "duration " & STR$(duur) & " seconds" IF Task(%BT_rat).tog THEN stopTask %BT_Rat StopTask %BT_meta END IF END SUB SUB BT1 () ' we have twelve tasks like this, one task for each block on temblo ' this is the lowest temple block STATIC cnt, velcnt, ccnt AS DWORD STATIC angle AS SINGLE ', velangle, prop AS SINGLE STATIC koepelrood, rood1, rood2, rood3, wit1, wit2,blauw AS BYTE LOCAL velo AS BYTE IF ISFALSE Task(%BT1).tog THEN ' aantal tiks per periode: Pi2 / BlockTemple.nrang RESET cnt RESET velcnt RESET koepelrood, rood1, rood2, rood3, wit1, wit2, blauw angle = Pi 'velangle = Pi ccnt = 0 Task(%BT1).tog = %True END IF angle = angle + (Pi2 * cnt / BlockTemple.nrang) ' hoekteller voor tempo 'velangle = velangle + (Pi2 * velcnt / (BlockTemple.nrang * 12)) ' hoekteller voor velocity 'velo = (1 + COS(velangle)) * 63 velo = BlockTemple.Triangle(velcnt) INCR cnt IF cnt = BlockTemple.nrang THEN RESET cnt INCR ccnt ' move to next chromatic tempo in the array END IF INCR velcnt IF velcnt >= (BlockTemple.nrang * 12) THEN RESET velcnt stoptask %BT1 END IF IF velo > 0 THEN mPlay Temblo.channel, 60, velo Task(%BT1).freq = BlockTemple.Freqs(ccnt) * (2 + COS(angle)) 'we add light code in this first beater task. 'prop = velcnt / (Blocktemple.nrang * 12!) SELECT CASE velcnt ' prop '(velcnt/(Blocktemple.nrang * 12)) 'velcnt/(%BT_nrang * 12) ' normalized, runs 0-1 CASE < Blocktemple.nrang '%BT_nrang '* 1 mPlay Temblo.channel, 127,MIN(127,BlockTemple.Triangle(velcnt) * 12) ' fade in IF ISFALSE koepelrood THEN koepelrood = %True 'logfile "koepelrood fade in" END IF CASE < (Blocktemple.nrang * 2) '(%BT_nrang * 2) IF ISFALSE rood1 THEN mPlay Temblo.channel, 120, 127 rood1= %True 'logfile "rood1" END IF CASE < (%BT_nrang * 3) IF ISFALSE rood2 THEN mPlay Temblo.channel, 121, 127 rood2= %True 'logfile "rood2" END IF CASE < (%BT_nrang * 4) IF ISFALSE rood3 THEN mPlay Temblo.channel, 122, 127 rood3= %True 'logfile "rood3" END IF CASE < (%BT_nrang * 5) IF ISFALSE wit1 THEN mPlay Temblo.channel, 124, 127 wit1 = %True 'logfile "wit1" END IF CASE < (%BT_nrang * 6) IF ISFALSE wit2 THEN mplay Temblo.channel, 125, 127 wit2 = %True 'logfile "wit2" END IF CASE < (%BT_nrang * 7) IF koepelrood THEN Noteoff Temblo.channel, 127 RESET koepelrood 'logfile "Koepelrood uit" END IF CASE < (%BT_nrang * 8) IF rood1 THEN NoteOff Temblo.channel, 120 RESET rood1 'logfile "rood1 uit" END IF CASE < (%BT_nrang * 9) IF rood2 THEN Noteoff Temblo.channel, 121 RESET rood2 'logfile "rood2 uit" END IF CASE < (%BT_nrang * 10) IF rood3 THEN Noteoff Temblo.channel, 122 RESET rood3 'logfile "rood3 uit" END IF CASE < (%BT_nrang * 11) IF wit1 THEN NoteOff Temblo.channel, 124 RESET wit1 'logfile "wit1 uit" END IF CASE < (%BT_nrang * 12) IF wit2 THEN Noteoff Temblo.channel, 125 RESET wit2 'logfile "wit2 uit" END IF IF ISFALSE blauw THEN mPlay Temblo.channel, 123, 127 blauw = %True 'logfile "Blauw" END IF END SELECT END SUB SUB BT2 () ' one task for each block on temblo STATIC cnt, velcnt, ccnt AS DWORD STATIC angle AS SINGLE ', velangle AS SINGLE LOCAL velo AS BYTE IF ISFALSE Task(%BT2).tog THEN RESET cnt RESET velcnt angle = Pi 'velangle = Pi ccnt = 1 Task(%BT2).tog = %True END IF angle = angle + (Pi2 * cnt / BlockTemple.nrang) ' hoekteller voor tempo 'velangle = velangle + (Pi2 * velcnt / (BlockTemple.nrang * 12)) ' hoekteller voor velocity 'velo = (1 + COS(velangle)) * 63 velo = BlockTemple.Triangle(velcnt) INCR cnt IF cnt = BlockTemple.nrang THEN RESET cnt INCR ccnt ' move to next chromatic tempo in the array IF ccnt > 11 THEN RESET ccnt END IF INCR velcnt IF velcnt >= (BlockTemple.nrang * 12) THEN RESET velcnt stoptask %BT2 END IF IF velo > 0 THEN mPlay Temblo.channel, 61, velo Task(%BT2).freq = BlockTemple.Freqs(ccnt) * (2 + COS(angle)) END SUB SUB BT3 () STATIC cnt, velcnt, ccnt AS DWORD STATIC angle AS SINGLE ', velangle AS SINGLE LOCAL velo AS BYTE IF ISFALSE Task(%BT3).tog THEN RESET cnt RESET velcnt angle = Pi 'velangle = Pi ccnt = 2 Task(%BT3).tog = %True END IF angle = angle + (Pi2 * cnt / BlockTemple.nrang) ' hoekteller voor tempo 'velangle = velangle + (Pi2 * velcnt / (BlockTemple.nrang * 12)) ' hoekteller voor velocity 'velo = (1 + COS(velangle)) * 63 velo = BlockTemple.Triangle(velcnt) INCR cnt IF cnt = BlockTemple.nrang THEN RESET cnt INCR ccnt ' move to next chromatic tempo in the array IF ccnt > 11 THEN RESET ccnt END IF INCR velcnt IF velcnt >= (BlockTemple.nrang * 12) THEN RESET velcnt stoptask %BT3 END IF IF velo > 0 THEN mPlay Temblo.channel, 62, velo Task(%BT3).freq = BlockTemple.Freqs(ccnt) * (2 + COS(angle)) END SUB SUB BT4 () STATIC cnt, velcnt, ccnt AS DWORD STATIC angle AS SINGLE ', velangle AS SINGLE LOCAL velo AS BYTE IF ISFALSE Task(%BT4).tog THEN RESET cnt RESET velcnt angle = Pi 'velangle = Pi ccnt = 3 Task(%BT4).tog = %True END IF angle = angle + (Pi2 * cnt / BlockTemple.nrang) ' hoekteller voor tempo 'velangle = velangle + (Pi2 * velcnt / (BlockTemple.nrang * 12)) ' hoekteller voor velocity 'velo = (1 + COS(velangle)) * 63 velo = BlockTemple.Triangle(velcnt) INCR cnt IF cnt = BlockTemple.nrang THEN RESET cnt INCR ccnt ' move to next chromatic tempo in the array IF ccnt > 11 THEN RESET ccnt END IF INCR velcnt IF velcnt >= (BlockTemple.nrang * 12) THEN RESET velcnt stoptask %BT4 END IF IF velo > 0 THEN mPlay Temblo.channel, 63, velo Task(%BT4).freq = BlockTemple.Freqs(ccnt) * (2 + COS(angle)) END SUB SUB BT5 () STATIC cnt, velcnt, ccnt AS DWORD STATIC angle AS SINGLE ', velangle AS SINGLE LOCAL velo AS BYTE IF ISFALSE Task(%BT5).tog THEN RESET cnt RESET velcnt angle = Pi 'velangle = Pi ccnt = 4 Task(%BT5).tog = %True END IF angle = angle + (Pi2 * cnt / BlockTemple.nrang) ' hoekteller voor tempo 'velangle = velangle + (Pi2 * velcnt / (BlockTemple.nrang * 12)) ' hoekteller voor velocity 'velo = (1 + COS(velangle)) * 63 velo = BlockTemple.Triangle(velcnt) INCR cnt IF cnt = BlockTemple.nrang THEN RESET cnt INCR ccnt ' move to next chromatic tempo in the array IF ccnt > 11 THEN RESET ccnt END IF INCR velcnt IF velcnt >= (BlockTemple.nrang * 12) THEN RESET velcnt stoptask %BT5 END IF IF velo > 0 THEN mPlay Temblo.channel, 64, velo Task(%BT5).freq = BlockTemple.Freqs(ccnt) * (2 + COS(angle)) END SUB SUB BT6 () STATIC cnt, velcnt, ccnt AS DWORD STATIC angle AS SINGLE ', velangle AS SINGLE LOCAL velo AS BYTE IF ISFALSE Task(%BT6).tog THEN RESET cnt RESET velcnt angle = Pi 'velangle = Pi ccnt = 5 Task(%BT6).tog = %True END IF angle = angle + (Pi2 * cnt / BlockTemple.nrang) ' hoekteller voor tempo 'velangle = velangle + (Pi2 * velcnt / (BlockTemple.nrang * 12)) ' hoekteller voor velocity 'velo = (1 + COS(velangle)) * 63 velo = BlockTemple.Triangle(velcnt) INCR cnt IF cnt = BlockTemple.nrang THEN RESET cnt INCR ccnt ' move to next chromatic tempo in the array IF ccnt > 11 THEN RESET ccnt END IF INCR velcnt IF velcnt >= (BlockTemple.nrang * 12) THEN RESET velcnt stoptask %BT6 END IF IF velo > 0 THEN mPlay Temblo.channel, 65, velo Task(%BT6).freq = BlockTemple.Freqs(ccnt) * (2 + COS(angle)) END SUB SUB BT7 () ' high blocks STATIC cnt, velcnt, ccnt AS DWORD STATIC angle AS SINGLE ', velangle AS SINGLE LOCAL velo AS BYTE IF ISFALSE Task(%BT7).tog THEN RESET cnt RESET velcnt angle = Pi 'velangle = Pi ccnt = 6 Task(%BT7).tog = %True END IF angle = angle + (Pi2 * cnt / BlockTemple.nrang) ' hoekteller voor tempo 'velangle = velangle + (Pi2 * velcnt / (BlockTemple.nrang * 12)) ' hoekteller voor velocity 'velo = (1 + COS(velangle)) * 63 velo = BlockTemple.Triangle(velcnt) INCR cnt IF cnt = BlockTemple.nrang THEN RESET cnt INCR ccnt ' move to next chromatic tempo in the array IF ccnt > 11 THEN RESET ccnt END IF INCR velcnt IF velcnt >= (BlockTemple.nrang * 12) THEN RESET velcnt stoptask %BT7 END IF IF velo > 0 THEN mPlay Temblo.channel, 72, velo Task(%BT7).freq = BlockTemple.Freqs(ccnt) * (2 + COS(angle)) END SUB SUB BT8 () ' high blocks STATIC cnt, velcnt, ccnt AS DWORD STATIC angle AS SINGLE ', velangle AS SINGLE LOCAL velo AS BYTE IF ISFALSE Task(%BT8).tog THEN RESET cnt RESET velcnt angle = Pi 'velangle = Pi ccnt = 7 Task(%BT8).tog = %True END IF angle = angle + (Pi2 * cnt / BlockTemple.nrang) ' hoekteller voor tempo 'velangle = velangle + (Pi2 * velcnt / (BlockTemple.nrang * 12)) ' hoekteller voor velocity 'velo = (1 + COS(velangle)) * 63 velo = BlockTemple.Triangle(velcnt) INCR cnt IF cnt = BlockTemple.nrang THEN RESET cnt INCR ccnt ' move to next chromatic tempo in the array IF ccnt > 11 THEN RESET ccnt END IF INCR velcnt IF velcnt >= (BlockTemple.nrang * 12) THEN RESET velcnt stoptask %BT8 END IF IF velo > 0 THEN mPlay Temblo.channel, 73, velo Task(%BT8).freq = BlockTemple.Freqs(ccnt) * (2 + COS(angle)) END SUB SUB BT9 () ' high blocks STATIC cnt, velcnt, ccnt AS DWORD STATIC angle AS SINGLE ', velangle AS SINGLE LOCAL velo AS BYTE IF ISFALSE Task(%BT9).tog THEN RESET cnt RESET velcnt angle = Pi 'velangle = Pi ccnt = 8 Task(%BT9).tog = %True END IF angle = angle + (Pi2 * cnt / BlockTemple.nrang) ' hoekteller voor tempo 'velangle = velangle + (Pi2 * velcnt / (BlockTemple.nrang * 12)) ' hoekteller voor velocity 'velo = (1 + COS(velangle)) * 63 velo = BlockTemple.Triangle(velcnt) INCR cnt IF cnt = BlockTemple.nrang THEN RESET cnt INCR ccnt ' move to next chromatic tempo in the array IF ccnt > 11 THEN RESET ccnt END IF INCR velcnt IF velcnt >= (BlockTemple.nrang * 12) THEN RESET velcnt stoptask %BT9 END IF IF velo > 0 THEN mPlay Temblo.channel, 74, velo Task(%BT9).freq = BlockTemple.Freqs(ccnt) * (2 + COS(angle)) END SUB SUB BT10 () ' high blocks STATIC cnt, velcnt, ccnt AS DWORD STATIC angle AS SINGLE ', velangle AS SINGLE LOCAL velo AS BYTE IF ISFALSE Task(%BT10).tog THEN RESET cnt RESET velcnt angle = Pi 'velangle = Pi ccnt = 9 Task(%BT10).tog = %True END IF angle = angle + (Pi2 * cnt / BlockTemple.nrang) ' hoekteller voor tempo 'velangle = velangle + (Pi2 * velcnt / (BlockTemple.nrang * 12)) ' hoekteller voor velocity 'velo = (1 + COS(velangle)) * 63 velo = BlockTemple.Triangle(velcnt) INCR cnt IF cnt = BlockTemple.nrang THEN RESET cnt INCR ccnt ' move to next chromatic tempo in the array IF ccnt > 11 THEN RESET ccnt END IF INCR velcnt IF velcnt >= (BlockTemple.nrang * 12) THEN RESET velcnt stoptask %BT10 END IF IF velo > 0 THEN mPlay Temblo.channel, 75, velo Task(%BT10).freq = BlockTemple.Freqs(ccnt) * (2 + COS(angle)) END SUB SUB BT11 () ' high blocks STATIC cnt, velcnt, ccnt AS DWORD STATIC angle AS SINGLE ', velangle AS SINGLE LOCAL velo AS BYTE IF ISFALSE Task(%BT11).tog THEN RESET cnt RESET velcnt angle = Pi 'velangle = Pi ccnt = 10 Task(%BT11).tog = %True END IF angle = angle + (Pi2 * cnt / BlockTemple.nrang) ' hoekteller voor tempo 'velangle = velangle + (Pi2 * velcnt / (BlockTemple.nrang * 12)) ' hoekteller voor velocity 'velo = (1 + COS(velangle)) * 63 velo = BlockTemple.Triangle(velcnt) INCR cnt IF cnt = BlockTemple.nrang THEN RESET cnt INCR ccnt ' move to next chromatic tempo in the array IF ccnt > 11 THEN RESET ccnt END IF INCR velcnt IF velcnt >= (BlockTemple.nrang * 12) THEN RESET velcnt stoptask %BT11 END IF IF velo > 0 THEN mPlay Temblo.channel, 76, velo Task(%BT11).freq = BlockTemple.Freqs(ccnt) * (2 + COS(angle)) END SUB SUB BT12 () ' high blocks STATIC cnt, velcnt, ccnt AS DWORD STATIC angle AS SINGLE ', velangle AS SINGLE LOCAL velo AS BYTE IF ISFALSE Task(%BT12).tog THEN RESET cnt RESET velcnt angle = Pi 'velangle = Pi ccnt = 11 Task(%BT12).tog = %True END IF angle = angle + (Pi2 * cnt / BlockTemple.nrang) ' hoekteller voor tempo 'velangle = velangle + (Pi2 * velcnt / (BlockTemple.nrang * 12)) ' hoekteller voor velocity 'velo = (1 + COS(velangle)) * 63 velo = BlockTemple.Triangle(velcnt) INCR cnt IF cnt = BlockTemple.nrang THEN RESET cnt INCR ccnt ' move to next chromatic tempo in the array IF ccnt > 11 THEN RESET ccnt END IF INCR velcnt IF velcnt >= (BlockTemple.nrang * 12) THEN RESET velcnt stoptask %BT12 END IF IF velo > 0 THEN mPlay Temblo.channel, 77, velo Task(%BT12).freq = BlockTemple.Freqs(ccnt) * (2 + COS(angle)) END SUB SUB BT_rat () ' note 69 STATIC cnt AS INTEGER STATIC velo AS BYTE IF ISFALSE Task(%BT_rat).tog THEN RESET cnt IF ISFALSE Task(%BT_rat).pan THEN velo = 127 ELSE velo = 10 END IF Task(%BT_rat).tog = %True END IF SELECT CASE Task(%BT_rat).pan CASE %False INCR cnt decr0 velo IF velo THEN mPlay Temblo.channel, 69, velo ELSE NoteOff Temblo.channel, 69 stoptask %Bt_rat END IF CASE 127 'incr velo velo = velo + 12 IF velo > 127 THEN velo = 127 mPlay Temblo.channel, 69, velo END SELECT END SUB SUB BT_rat_stop () NoteOff Temblo.channel, 69 END SUB ' Block Temples! - Christian version: SUB BT_Meta_Christian () LOCAL i, sum, duur AS LONG LOCAL Basefreq AS SINGLE STATIC Shape() AS SINGLE STATIC cnt, endcnt AS LONG STATIC koepelrood, rood1, rood2, rood3, wit1, wit2,blauw AS BYTE IF ISFALSE Task(%BT_meta_Christian).tog THEN Blocktemple.version = 1 Blocktemple.nrtiks = %BT_nrtiks ' this determines the duration of the piece ' initialize the triangle shape for the velo scalings: FOR i = 0 TO (BlockTemple.nrtiks) Blocktemple.Veltri(i) = 127 NEXT i REDIM Shape(BlockTemple.nrtiks) AT VARPTR(Blocktemple.Veltri(0)) TriangleWindow Shape() ' passing BlockTemple.triangle() does not work! ' in g_indep Basefreq = 1 endcnt = 176 ' with basefreq 0.8 we have 220" FOR i = 0 TO 12 'BlockTemple.Freqs(i) = BaseFreq * (2^(i/12)) ' chromatic tempi 'Blocktemple.Freqs(i) = BaseFreq * (3^(i/12)) ' duodecime in 12 parts 'Blocktemple.Freqs(i) = BaseFreq * (4^(i/12)) ' two octaves in 12 parts - whole tone series 'Blocktemple.Freqs(i) = BaseFreq * (5^(i/12)) ' duodecime in 12 parts Blocktemple.Freqs(i) = Basefreq * (2^( (i*3)/12 ) ) ' in minor thirds NEXT i RESET Task(%BT_rat_Christian).pan cnt = -1 starttask %BT_rat_Christian 'BlockTemple.starttime = TimeGetTime logfile "Block Temple! Christian start at" & TIME$ Task(%BT_meta_Christian).tog = %True EXIT SUB END IF IF ISFALSE Task(%BT_rat_Christian).tog THEN ' wait for the ratchet intro to end IF cnt = -1 THEN ' start the tasks... FOR i = %BT1_Christian TO %BT12_Christian starttask i NEXT i Task(%BT_rat_Christian).pan = 127 BlockTemple.starttime = TimeGetTime logfile "Block Temple! Christian main start at" & TIME$ INCR cnt ' becomes 0 EXIT SUB ELSE INCR cnt END IF ELSE EXIT SUB ' wait until the ratched intro has finished. END IF 'we add light code SELECT CASE cnt CASE < endcnt / 12 mPlay Temblo.channel, 127,MIN(127,BlockTemple.VelTri(cnt) * 12) ' fade in IF ISFALSE koepelrood THEN koepelrood = %True logfile "koepelrood fade in" END IF CASE < (endcnt * 2 / 12) IF ISFALSE rood1 THEN mPlay Temblo.channel, 120, 127 rood1= %True logfile "rood1" END IF CASE < (endcnt * 3 / 12) IF ISFALSE rood2 THEN mPlay Temblo.channel, 121, 127 rood2= %True logfile "rood2" END IF CASE < (endcnt * 4/ 12) IF ISFALSE rood3 THEN mPlay Temblo.channel, 122, 127 rood3= %True logfile "rood3" END IF CASE < endcnt * 5 / 12 IF ISFALSE wit1 THEN mPlay Temblo.channel, 124, 127 wit1 = %True logfile "wit1" END IF CASE < endcnt * 6 / 12 IF ISFALSE wit2 THEN mplay Temblo.channel, 125, 127 wit2 = %True logfile "wit2" END IF CASE < endcnt * 7/12 IF koepelrood THEN Noteoff Temblo.channel, 127 RESET koepelrood logfile "Koepelrood uit" END IF CASE < endcnt * 8/12 IF rood1 THEN NoteOff Temblo.channel, 120 RESET rood1 logfile "rood1 uit" END IF CASE < endcnt * 9 /12 IF rood2 THEN Noteoff Temblo.channel, 121 RESET rood2 logfile "rood2 uit" END IF CASE < endcnt * 10/12 IF rood3 THEN Noteoff Temblo.channel, 122 RESET rood3 logfile "rood3 uit" END IF CASE < endcnt * 11/12 IF wit1 THEN NoteOff Temblo.channel, 124 RESET wit1 logfile "wit1 uit" END IF CASE < endcnt IF wit2 THEN Noteoff Temblo.channel, 125 RESET wit2 logfile "wit2 uit" END IF IF ISFALSE blauw THEN mPlay Temblo.channel, 123, 127 blauw = %True logfile "Blauw" END IF END SELECT RESET sum FOR i = %BT1_Christian TO %BT12_Christian sum = sum + Task(i).tog ' see how many tasks are active NEXT i IF ISFALSE sum THEN BlockTemple.stoptime = Timegettime logfile "Block Temple! Christian version main stops at" & TIME$ duur = (Blocktemple.stoptime - Blocktemple.starttime)/ 1000 logfile "duration " & STR$(duur) & " seconds" Task(%BT_Rat_Christian).pan = 127 StartTask %BT_Rat_Christian ' the ratchet comes as a tail... StopTask %BT_meta_Christian END IF END SUB SUB BT1_Christian () ' block 1 on temblo STATIC cnt, velcnt, ccnt AS DWORD LOCAL velo AS BYTE IF ISFALSE Task(%BT1_Christian).tog THEN RESET cnt ccnt = 0 Task(%BT1_Christian).tog = %True END IF velo = BlockTemple.Veltri(cnt) INCR cnt IF cnt = BlockTemple.nrtiks THEN RESET cnt INCR ccnt ' move to next tempo in the array IF ccnt > 11 THEN RESET ccnt IF ccnt = 0 THEN ' back at the start... Stoptask %BT1_Christian END IF END IF IF velo > 0 THEN mPlay Temblo.channel, 60, velo Task(%BT1_Christian).freq = BlockTemple.Freqs(ccnt) END SUB SUB BT2_Christian () ' block 2 on temblo STATIC cnt, velcnt, ccnt AS DWORD LOCAL velo AS BYTE IF ISFALSE Task(%BT2_Christian).tog THEN RESET cnt ccnt = 1 Task(%BT2_Christian).tog = %True END IF velo = BlockTemple.Veltri(cnt) INCR cnt IF cnt = BlockTemple.nrtiks THEN RESET cnt INCR ccnt ' move to next tempo in the array IF ccnt > 11 THEN RESET ccnt IF ccnt = 1 THEN ' back at the start... Stoptask %BT2_Christian END IF END IF IF velo > 0 THEN mPlay Temblo.channel, 61, velo Task(%BT2_Christian).freq = BlockTemple.Freqs(ccnt) END SUB SUB BT3_Christian () ' block 3 on temblo STATIC cnt, velcnt, ccnt AS DWORD LOCAL velo AS BYTE IF ISFALSE Task(%BT3_Christian).tog THEN RESET cnt ccnt = 2 Task(%BT3_Christian).tog = %True END IF velo = BlockTemple.Veltri(cnt) INCR cnt IF cnt = BlockTemple.nrtiks THEN RESET cnt INCR ccnt ' move to next tempo in the array IF ccnt > 11 THEN RESET ccnt IF ccnt = 2 THEN ' back at the start... Stoptask %BT3_Christian END IF END IF IF velo > 0 THEN mPlay Temblo.channel, 62, velo Task(%BT3_Christian).freq = BlockTemple.Freqs(ccnt) END SUB SUB BT4_Christian () ' block 4 on temblo STATIC cnt, velcnt, ccnt AS DWORD LOCAL velo AS BYTE IF ISFALSE Task(%BT4_Christian).tog THEN RESET cnt ccnt = 3 Task(%BT4_Christian).tog = %True END IF velo = BlockTemple.Veltri(cnt) INCR cnt IF cnt = BlockTemple.nrtiks THEN RESET cnt INCR ccnt ' move to next tempo in the array IF ccnt > 11 THEN RESET ccnt IF ccnt = 3 THEN ' back at the start... Stoptask %BT4_Christian END IF END IF IF velo > 0 THEN mPlay Temblo.channel, 63, velo Task(%BT4_Christian).freq = BlockTemple.Freqs(ccnt) END SUB SUB BT5_Christian () ' block 5 on temblo STATIC cnt, velcnt, ccnt AS DWORD LOCAL velo AS BYTE IF ISFALSE Task(%BT5_Christian).tog THEN RESET cnt ccnt = 4 Task(%BT5_Christian).tog = %True END IF velo = BlockTemple.Veltri(cnt) INCR cnt IF cnt = BlockTemple.nrtiks THEN RESET cnt INCR ccnt ' move to next tempo in the array IF ccnt > 11 THEN RESET ccnt IF ccnt = 4 THEN ' back at the start... Stoptask %BT5_Christian END IF END IF IF velo > 0 THEN mPlay Temblo.channel, 64, velo Task(%BT5_Christian).freq = BlockTemple.Freqs(ccnt) END SUB SUB BT6_Christian () ' block 6 on temblo STATIC cnt, velcnt, ccnt AS DWORD LOCAL velo AS BYTE IF ISFALSE Task(%BT6_Christian).tog THEN RESET cnt ccnt = 5 Task(%BT6_Christian).tog = %True END IF velo = BlockTemple.Veltri(cnt) INCR cnt IF cnt = BlockTemple.nrtiks THEN RESET cnt INCR ccnt ' move to next tempo in the array IF ccnt > 11 THEN RESET ccnt IF ccnt = 5 THEN ' back at the start... Stoptask %BT6_Christian END IF END IF IF velo > 0 THEN mPlay Temblo.channel, 65, velo Task(%BT6_Christian).freq = BlockTemple.Freqs(ccnt) END SUB SUB BT7_Christian () ' block 7 on temblo STATIC cnt, velcnt, ccnt AS DWORD LOCAL velo AS BYTE IF ISFALSE Task(%BT7_Christian).tog THEN RESET cnt ccnt = 6 Task(%BT7_Christian).tog = %True END IF velo = BlockTemple.Veltri(cnt) INCR cnt IF cnt = BlockTemple.nrtiks THEN RESET cnt INCR ccnt ' move to next tempo in the array IF ccnt > 11 THEN RESET ccnt IF ccnt = 6 THEN ' back at the start... Stoptask %BT7_Christian END IF END IF IF velo > 0 THEN mPlay Temblo.channel, 72, velo Task(%BT7_Christian).freq = BlockTemple.Freqs(ccnt) END SUB SUB BT8_Christian () ' block 8 on temblo STATIC cnt, velcnt, ccnt AS DWORD LOCAL velo AS BYTE IF ISFALSE Task(%BT8_Christian).tog THEN RESET cnt ccnt = 7 Task(%BT8_Christian).tog = %True END IF velo = BlockTemple.Veltri(cnt) INCR cnt IF cnt = BlockTemple.nrtiks THEN RESET cnt INCR ccnt ' move to next tempo in the array IF ccnt > 11 THEN RESET ccnt IF ccnt = 7 THEN ' back at the start... Stoptask %BT8_Christian END IF END IF IF velo > 0 THEN mPlay Temblo.channel, 73, velo Task(%BT8_Christian).freq = BlockTemple.Freqs(ccnt) END SUB SUB BT9_Christian () ' block 9 on temblo STATIC cnt, velcnt, ccnt AS DWORD LOCAL velo AS BYTE IF ISFALSE Task(%BT9_Christian).tog THEN RESET cnt ccnt = 8 Task(%BT9_Christian).tog = %True END IF velo = BlockTemple.Veltri(cnt) INCR cnt IF cnt = BlockTemple.nrtiks THEN RESET cnt INCR ccnt ' move to next tempo in the array IF ccnt > 11 THEN RESET ccnt IF ccnt = 8 THEN ' back at the start... Stoptask %BT9_Christian END IF END IF IF velo > 0 THEN mPlay Temblo.channel, 74, velo Task(%BT9_Christian).freq = BlockTemple.Freqs(ccnt) END SUB SUB BT10_Christian () ' block 10 on temblo STATIC cnt, velcnt, ccnt AS DWORD LOCAL velo AS BYTE IF ISFALSE Task(%BT10_Christian).tog THEN RESET cnt ccnt = 9 Task(%BT10_Christian).tog = %True END IF velo = BlockTemple.Veltri(cnt) INCR cnt IF cnt = BlockTemple.nrtiks THEN RESET cnt INCR ccnt ' move to next tempo in the array IF ccnt > 11 THEN RESET ccnt IF ccnt = 9 THEN ' back at the start... Stoptask %BT10_Christian END IF END IF IF velo > 0 THEN mPlay Temblo.channel, 75, velo Task(%BT10_Christian).freq = BlockTemple.Freqs(ccnt) END SUB SUB BT11_Christian () ' block 11 on temblo STATIC cnt, velcnt, ccnt AS DWORD LOCAL velo AS BYTE IF ISFALSE Task(%BT11_Christian).tog THEN RESET cnt ccnt = 10 Task(%BT11_Christian).tog = %True END IF velo = BlockTemple.Veltri(cnt) INCR cnt IF cnt = BlockTemple.nrtiks THEN RESET cnt INCR ccnt ' move to next tempo in the array IF ccnt > 11 THEN RESET ccnt IF ccnt = 10 THEN ' back at the start... Stoptask %BT11_Christian END IF END IF IF velo > 0 THEN mPlay Temblo.channel, 76, velo Task(%BT11_Christian).freq = BlockTemple.Freqs(ccnt) END SUB SUB BT12_Christian () ' block 12 on temblo STATIC cnt, velcnt, ccnt AS DWORD LOCAL velo AS BYTE IF ISFALSE Task(%BT12_Christian).tog THEN RESET cnt ccnt = 11 Task(%BT12_Christian).tog = %True END IF velo = BlockTemple.Veltri(cnt) INCR cnt IF cnt = BlockTemple.nrtiks THEN RESET cnt INCR ccnt ' move to next tempo in the array IF ccnt > 11 THEN RESET ccnt IF ccnt = 11 THEN ' back at the start... Stoptask %BT12_Christian END IF END IF IF velo > 0 THEN mPlay Temblo.channel, 77, velo Task(%BT12_Christian).freq = BlockTemple.Freqs(ccnt) END SUB SUB BT_rat_Christian () ' note 69 - ratchet STATIC velo AS BYTE IF ISFALSE Task(%BT_rat_Christian).tog THEN MM_Temblo_On IF ISFALSE Task(%BT_rat_Christian).pan THEN velo = 127 ELSE velo = 10 END IF Task (%BT_rat_Christian).freq = 25 Task(%BT_rat_Christian).tog = %True END IF SELECT CASE Task(%BT_rat_Christian).pan CASE %False decr0 velo IF velo THEN mPlay Temblo.channel, 69, velo ELSE NoteOff Temblo.channel, 69 stoptask %Bt_rat_Christian logfile "into end" END IF CASE 127 INCR velo IF velo > 127 THEN velo = 127 BlockTemple.stoptime = Timegettime logfile "Block Temple! Christian version with ratchet tail stops at" & TIME$ logfile "total duration " & STR$((Blocktemple.stoptime - Blocktemple.starttime)/ 1000 ) & " seconds" RESET Task(%BT_rat_Christian).pan StopTask %BT_rat_Christian MM_Temblo_Off ELSE mPlay Temblo.channel, 69, velo END IF END SELECT END SUB SUB BT_Meta_Hindu () LOCAL i, sum, duur AS LONG LOCAL Basefreq AS SINGLE STATIC Shape() AS SINGLE STATIC cnt, endcnt AS LONG STATIC koepelrood, rood1, rood2, rood3, wit1, wit2,blauw AS BYTE IF ISFALSE Task(%BT_meta_Hindu).tog THEN Blocktemple.version = 2 Blocktemple.nrtiks = %BT_nrtiks ' this determines the duration of the piece ' initialize the triangle shape for the velo scalings: FOR i = 0 TO (BlockTemple.nrtiks) Blocktemple.Veltri(i) = 127 NEXT i REDIM Shape(BlockTemple.nrtiks) AT VARPTR(Blocktemple.Veltri(0)) TriangleWindow Shape() ' passing BlockTemple.triangle() does not work! ' in g_indep Basefreq = 1.5 endcnt = 163 ' with basefreq 1 we have 244" FOR i = 0 TO 12 Blocktemple.Freqs(i) = BaseFreq * (3^(i/12)) ' duodecime in 12 parts - sruti intervals NEXT i RESET Task(%BT_rat_Hindu).pan cnt = -1 starttask %BT_rat_Hindu logfile "Block Temple! Hindu start with ratchet at" & TIME$ Task(%BT_meta_Hindu).tog = %True EXIT SUB END IF IF ISFALSE Task(%BT_rat_Hindu).tog THEN ' wait for the ratchet intro to end IF cnt = -1 THEN ' start the tasks... FOR i = %BT1_Christian TO %BT12_Christian starttask i NEXT i Task(%BT_rat_Hindu).pan = 127 BlockTemple.starttime = TimeGetTime logfile "Block Temple! Hindu main start at" & TIME$ INCR cnt ' becomes 0 EXIT SUB ELSE INCR cnt END IF ELSE EXIT SUB ' wait until the ratched intro has finished. END IF 'we add light code SELECT CASE cnt CASE < endcnt / 12 mPlay Temblo.channel, 127,MIN(127,BlockTemple.VelTri(cnt) * 12) ' fade in IF ISFALSE koepelrood THEN koepelrood = %True logfile "koepelrood fade in" END IF CASE < (endcnt * 2 / 12) IF ISFALSE rood1 THEN mPlay Temblo.channel, 120, 127 rood1= %True logfile "rood1" END IF CASE < (endcnt * 3 / 12) IF ISFALSE rood2 THEN mPlay Temblo.channel, 121, 127 rood2= %True logfile "rood2" END IF CASE < (endcnt * 4/ 12) IF ISFALSE rood3 THEN mPlay Temblo.channel, 122, 127 rood3= %True logfile "rood3" END IF CASE < endcnt * 5 / 12 IF ISFALSE wit1 THEN mPlay Temblo.channel, 124, 127 wit1 = %True logfile "wit1" END IF CASE < endcnt * 6 / 12 IF ISFALSE wit2 THEN mplay Temblo.channel, 125, 127 wit2 = %True logfile "wit2" END IF CASE < endcnt * 7/12 IF koepelrood THEN Noteoff Temblo.channel, 127 RESET koepelrood logfile "Koepelrood uit" END IF CASE < endcnt * 8/12 IF rood1 THEN NoteOff Temblo.channel, 120 RESET rood1 logfile "rood1 uit" END IF CASE < endcnt * 9 /12 IF rood2 THEN Noteoff Temblo.channel, 121 RESET rood2 logfile "rood2 uit" END IF CASE < endcnt * 10/12 IF rood3 THEN Noteoff Temblo.channel, 122 RESET rood3 logfile "rood3 uit" END IF CASE < endcnt * 11/12 IF wit1 THEN NoteOff Temblo.channel, 124 RESET wit1 logfile "wit1 uit" END IF CASE < endcnt IF wit2 THEN Noteoff Temblo.channel, 125 RESET wit2 logfile "wit2 uit" END IF IF ISFALSE blauw THEN mPlay Temblo.channel, 123, 127 blauw = %True logfile "Blauw" END IF END SELECT RESET sum FOR i = %BT1_Christian TO %BT12_Christian sum = sum + Task(i).tog ' see how many tasks are active NEXT i IF ISFALSE sum THEN BlockTemple.stoptime = Timegettime logfile "Block Temple! Hindu version main stops at" & TIME$ duur = (Blocktemple.stoptime - Blocktemple.starttime)/ 1000 logfile "duration " & STR$(duur) & " seconds" Task(%BT_Rat_Hindu).pan = 127 StartTask %BT_Rat_Hindu ' the ratchet comes as a tail... StopTask %BT_meta_Hindu END IF END SUB SUB BT_Meta_Buddha () ' to work out further LOCAL i, sum, duur AS LONG LOCAL Basefreq AS SINGLE STATIC Shape() AS SINGLE STATIC cnt, endcnt AS LONG STATIC koepelrood, rood1, rood2, rood3, wit1, wit2,blauw AS BYTE IF ISFALSE Task(%BT_meta_Buddha).tog THEN Blocktemple.version = 3 Blocktemple.nrtiks = %BT_nrtiks ' this determines the duration of the piece ' initialize the triangle shape for the velo scalings: FOR i = 0 TO (BlockTemple.nrtiks) Blocktemple.Veltri(i) = 127 NEXT i REDIM Shape(BlockTemple.nrtiks) AT VARPTR(Blocktemple.Veltri(0)) TriangleWindow Shape() ' passing BlockTemple.triangle() does not work! ' in g_indep Basefreq = 2 endcnt = 136 ' with basefreq 1 we have 271" Blocktemple.Freqs(0) = BaseFreq Blocktemple.Freqs(1) = Basefreq * 7 / 6 Blocktemple.Freqs(2) = Basefreq * 6 / 5 Blocktemple.Freqs(3) = Basefreq * 5/4 Blocktemple.Freqs(4) = Basefreq * 4/3 Blocktemple.Freqs(5) = Basefreq * 3/2 Blocktemple.Freqs(6) = Basefreq * 5/3 Blocktemple.Freqs(7) = Basefreq * 7/4 Blocktemple.Freqs(8) = BaseFreq * 7/5 Blocktemple.Freqs(9) = Basefreq * 8/5 Blocktemple.Freqs(10) = Basefreq * 9/5 Blocktemple.Freqs(11) = Basefreq * 2 Blocktemple.freqs(12) = Basefreq * 3 RESET Task(%BT_rat_Buddha).pan cnt = -1 starttask %BT_rat_Buddha 'BlockTemple.starttime = TimeGetTime logfile "Block Temple! Buddhist start with ratchet at" & TIME$ Task(%BT_meta_Buddha).tog = %True EXIT SUB END IF IF ISFALSE Task(%BT_rat_Buddha).tog THEN ' wait for the ratchet intro to end IF cnt = -1 THEN ' start the tasks... FOR i = %BT1_Christian TO %BT12_Christian starttask i NEXT i Task(%BT_rat_Buddha).pan = 127 BlockTemple.starttime = TimeGetTime logfile "Block Temple! Buddhist main start at" & TIME$ INCR cnt ' becomes 0 EXIT SUB ELSE INCR cnt END IF ELSE EXIT SUB ' wait until the ratched intro has finished. END IF 'we add light code SELECT CASE cnt CASE < endcnt / 12 mPlay Temblo.channel, 127,MIN(127,BlockTemple.VelTri(cnt) * 12) ' fade in IF ISFALSE koepelrood THEN koepelrood = %True logfile "koepelrood fade in" END IF CASE < (endcnt * 2 / 12) IF ISFALSE rood1 THEN mPlay Temblo.channel, 120, 127 rood1= %True logfile "rood1" END IF CASE < (endcnt * 3 / 12) IF ISFALSE rood2 THEN mPlay Temblo.channel, 121, 127 rood2= %True logfile "rood2" END IF CASE < (endcnt * 4/ 12) IF ISFALSE rood3 THEN mPlay Temblo.channel, 122, 127 rood3= %True logfile "rood3" END IF CASE < endcnt * 5 / 12 IF ISFALSE wit1 THEN mPlay Temblo.channel, 124, 127 wit1 = %True logfile "wit1" END IF CASE < endcnt * 6 / 12 IF ISFALSE wit2 THEN mplay Temblo.channel, 125, 127 wit2 = %True logfile "wit2" END IF CASE < endcnt * 7/12 IF koepelrood THEN Noteoff Temblo.channel, 127 RESET koepelrood logfile "Koepelrood uit" END IF CASE < endcnt * 8/12 IF rood1 THEN NoteOff Temblo.channel, 120 RESET rood1 logfile "rood1 uit" END IF CASE < endcnt * 9 /12 IF rood2 THEN Noteoff Temblo.channel, 121 RESET rood2 logfile "rood2 uit" END IF CASE < endcnt * 10/12 IF rood3 THEN Noteoff Temblo.channel, 122 RESET rood3 logfile "rood3 uit" END IF CASE < endcnt * 11/12 IF wit1 THEN NoteOff Temblo.channel, 124 RESET wit1 logfile "wit1 uit" END IF CASE < endcnt IF wit2 THEN Noteoff Temblo.channel, 125 RESET wit2 logfile "wit2 uit" END IF IF ISFALSE blauw THEN mPlay Temblo.channel, 123, 127 blauw = %True logfile "Blauw" END IF END SELECT RESET sum FOR i = %BT1_Christian TO %BT12_Christian sum = sum + Task(i).tog ' see how many tasks are active NEXT i IF ISFALSE sum THEN BlockTemple.stoptime = Timegettime logfile "Block Temple! Buddhist version main stops at" & TIME$ duur = (Blocktemple.stoptime - Blocktemple.starttime)/ 1000 logfile "duration " & STR$(duur) & " seconds" Task(%BT_Rat_Buddha).pan = 127 StartTask %BT_Rat_Buddha ' the ratchet comes as a tail... StopTask %BT_meta_Buddha END IF END SUB SUB BT_Meta_Masonic () ' to do ' to work out further LOCAL i, sum, duur AS LONG LOCAL Basefreq AS SINGLE STATIC Shape() AS SINGLE STATIC cnt, endcnt AS LONG STATIC koepelrood, rood1, rood2, rood3, wit1, wit2, blauw AS BYTE IF ISFALSE Task(%BT_meta_Masonic).tog THEN Blocktemple.version = 4 Blocktemple.nrtiks = %BT_nrtiks ' this determines the duration of the piece ' initialize the triangle shape for the velo scalings: FOR i = 0 TO (BlockTemple.nrtiks) Blocktemple.Veltri(i) = 127 NEXT i REDIM Shape(BlockTemple.nrtiks) AT VARPTR(Blocktemple.Veltri(0)) TriangleWindow Shape() ' passing BlockTemple.triangle() does not work! ' in g_indep Basefreq = 2 endcnt = 82 ' with basefreq 2 we have 82" Blocktemple.Freqs(0) = BaseFreq ' E12 series Blocktemple.Freqs(1) = Basefreq * 1.2 Blocktemple.Freqs(2) = Basefreq * 1.5 Blocktemple.Freqs(3) = Basefreq * 1.8 Blocktemple.Freqs(4) = Basefreq * 2.2 Blocktemple.Freqs(5) = Basefreq * 2.7 Blocktemple.Freqs(6) = Basefreq * 3.3 Blocktemple.Freqs(7) = Basefreq * 3.9 Blocktemple.Freqs(8) = BaseFreq * 4.7 Blocktemple.Freqs(9) = Basefreq * 5.6 Blocktemple.Freqs(10) = Basefreq * 6.8 Blocktemple.Freqs(11) = Basefreq * 8.2 Blocktemple.freqs(12) = Basefreq * 10 RESET Task(%BT_rat_Masonic).pan cnt = -1 starttask %BT_rat_Masonic 'BlockTemple.starttime = TimeGetTime logfile "Block Temple! Masonic start with ratchet at" & TIME$ Task(%BT_meta_Masonic).tog = %True EXIT SUB END IF IF ISFALSE Task(%BT_rat_Masonic).tog THEN ' wait for the ratchet intro to end IF cnt = -1 THEN ' start the tasks... FOR i = %BT1_Christian TO %BT12_Christian starttask i NEXT i Task(%BT_rat_Masonic).pan = 127 BlockTemple.starttime = TimeGetTime logfile "Block Temple! Masonic main start at" & TIME$ INCR cnt ' becomes 0 EXIT SUB ELSE INCR cnt END IF ELSE EXIT SUB ' wait until the ratched intro has finished. END IF 'we add light code SELECT CASE cnt CASE < endcnt / 12 mPlay Temblo.channel, 127,MIN(127,BlockTemple.VelTri(cnt) * 12) ' fade in IF ISFALSE koepelrood THEN koepelrood = %True logfile "koepelrood fade in" END IF CASE < (endcnt * 2 / 12) IF ISFALSE rood1 THEN mPlay Temblo.channel, 120, 127 rood1= %True logfile "rood1" END IF CASE < (endcnt * 3 / 12) IF ISFALSE rood2 THEN mPlay Temblo.channel, 121, 127 rood2= %True logfile "rood2" END IF CASE < (endcnt * 4/ 12) IF ISFALSE rood3 THEN mPlay Temblo.channel, 122, 127 rood3= %True logfile "rood3" END IF CASE < endcnt * 5 / 12 IF ISFALSE wit1 THEN mPlay Temblo.channel, 124, 127 wit1 = %True logfile "wit1" END IF CASE < endcnt * 6 / 12 IF ISFALSE wit2 THEN mplay Temblo.channel, 125, 127 wit2 = %True logfile "wit2" END IF CASE < endcnt * 7/12 IF koepelrood THEN Noteoff Temblo.channel, 127 RESET koepelrood logfile "Koepelrood uit" END IF CASE < endcnt * 8/12 IF rood1 THEN NoteOff Temblo.channel, 120 RESET rood1 logfile "rood1 uit" END IF CASE < endcnt * 9 /12 IF rood2 THEN Noteoff Temblo.channel, 121 RESET rood2 logfile "rood2 uit" END IF CASE < endcnt * 10/12 IF rood3 THEN Noteoff Temblo.channel, 122 RESET rood3 logfile "rood3 uit" END IF CASE < endcnt * 11/12 IF wit1 THEN NoteOff Temblo.channel, 124 RESET wit1 logfile "wit1 uit" END IF CASE < endcnt IF wit2 THEN Noteoff Temblo.channel, 125 RESET wit2 logfile "wit2 uit" END IF IF ISFALSE blauw THEN mPlay Temblo.channel, 123, 127 blauw = %True logfile "Blauw" END IF END SELECT RESET sum FOR i = %BT1_Christian TO %BT12_Christian sum = sum + Task(i).tog ' see how many tasks are active NEXT i IF ISFALSE sum THEN BlockTemple.stoptime = Timegettime logfile "Block Temple! Masonic version main stops at" & TIME$ duur = (Blocktemple.stoptime - Blocktemple.starttime)/ 1000 logfile "duration " & STR$(duur) & " seconds" Task(%BT_Rat_Masonic).pan = 127 StartTask %BT_Rat_Masonic ' the ratchet comes as a tail... StopTask %BT_meta_Masonic END IF END SUB SUB BT_rat_Hindu () ' note 69 - ratchet STATIC velo AS BYTE STATIC duur, rat AS LONG IF ISFALSE Task(%BT_rat_Hindu).tog THEN MM_Temblo_On IF ISFALSE Task(%BT_rat_Hindu).pan THEN velo = %False ' 127 duur = TimeGetTime + 10000 ' 10" Task (%BT_rat_Hindu).freq = 20 ELSE RESET rat velo = 127 duur = TimegetTime + 10000 Task (%BT_rat_Hindu).freq = 6 END IF Task(%BT_rat_Hindu).tog = %True END IF SELECT CASE Task(%BT_rat_Hindu).pan CASE %False ' crescendo INCR velo IF velo > 127 THEN velo = 127 Task(%BT_rat_Hindu).freq = 1 ELSE mPlay Temblo.channel, 69, velo END IF IF TimeGetTime >= duur THEN stoptask %BT_rat_Hindu NoteOff Temblo.channel, 69 END IF CASE 127 IF timegettime < (duur - 6000) THEN IF ISFALSE rat THEN mPlay Temblo.channel, 69, 127 rat = %True END IF EXIT SUB END IF decr0 velo mPlay Temblo.channel, 69, velo IF timegettime > duur THEN IF velo = 0 THEN BlockTemple.stoptime = Timegettime logfile "Block Temple! Hindu version with ratchet tail stops at" & TIME$ logfile "total duration " & STR$((Blocktemple.stoptime - Blocktemple.starttime)/ 1000 ) & " seconds" RESET Task(%BT_rat_Hindu).pan StopTask %BT_rat_Hindu mPlay Temblo.channel, 69, velo MM_Temblo_Off END IF END IF END SELECT END SUB SUB BT_rat_Buddha () STATIC cnt, minval, stijg, daal AS LONG STATIC velo AS BYTE IF ISFALSE Task(%BT_rat_Buddha).tog THEN stijg = %True daal = %False minval = 20 RESET cnt velo = minval Task(%BT_rat_Buddha).freq = 16 Task(%BT_rat_Buddha).tog = %True END IF IF stijg THEN mPlay Temblo.channel, 69, velo INCR velo IF velo > 127 THEN velo = 127 INCR cnt RESET stijg daal = %True END IF END IF IF daal THEN mPlay Temblo.channel, 69, velo DECR velo IF velo < minval THEN velo = minval INCR cnt RESET daal stijg = %True END IF END IF IF cnt = 6 THEN NoteOff Temblo.channel, 69 stoptask %BT_rat_Buddha END IF END SUB SUB BT_rat_Masonic () STATIC cnt AS LONG STATIC velo, fcnt AS BYTE IF ISFALSE Task(%BT_rat_Masonic).tog THEN IF ISFALSE Task(%BT_rat_Masonic).pan THEN RESET cnt RESET fcnt velo = 20 ELSE fcnt = 12 RESET cnt velo = 127 END IF Task(%BT_rat_Masonic).freq = 1 'BlockTemple.Freqs(0) ' 1 ' could follow E12 series as well Task(%BT_rat_Masonic).tog = %True END IF IF ISFALSE Task(%BT_rat_Masonic).pan THEN IF ISFALSE cnt MOD 2 THEN INCR fcnt mPlay Temblo.channel, 69, velo velo = velo + 10 velo = MIN(127, velo) ELSE NoteOff Temblo.channel, 69 END IF 'Task(%BT_rat_Masonic).freq = BlockTemple.Freqs(fcnt) INCR cnt IF cnt = 24 THEN stoptask %BT_rat_Masonic END IF ELSE IF ISFALSE cnt MOD 2 THEN Decr0 fcnt mPlay Temblo.channel, 69, velo velo = velo - 10 velo = MAX(MIN(127, velo), 20) ELSE NoteOff Temblo.channel, 69 END IF 'Task(%BT_rat_Masonic).freq = BlockTemple.Freqs(fcnt) INCR cnt IF cnt = 24 THEN stoptask %BT_rat_Masonic END IF END IF END SUB 'EOF