' *************************************************************** ' * test and debug code for midi controlled robots and automats * ' * and * ' * 1996 - 2007 * ' *************************************************************** '02.05.2007 separated from voxhumanola.inc, casta2 test added ' problem: no more instrument %IDM_ constants available!!! - solved gwr 02.05.2007 '05.05.2007: solo pieces for casta added '06.05.2007: afrocasta added. '10.05.2007: Grays casta2 code revision. %Test_Castagnets = 57 ' double defined in mplayer - humanola %Test_Castagnets2 = 58 %Casta2_lite = 59 %casta2rep = 60 %Casta_Noot = 63 ' solo demo pieces: %Casta_Grays = 32 ' solo piece gwr - uses tasks 32 and 33 for casta 2 ' tasks 34 - 35 casta 1 ' more pieces can be derived from dripper code. %Afro_Casta = 36 ' casta 2 - complementary pattern optional on casta1 %Casta_Ritmes = 37 ' casta 2 - to do %Casta_Scale = 38 DECLARE SUB VoxHumanola_Castagnets () DECLARE SUB VoxHumanola_Castagnets_Stop () DECLARE SUB Casta_UD () DECLARE SUB Casta2_Lite () DECLARE SUB Casta_Grays () DECLARE SUB Casta_Grays_R () DECLARE SUB Casta_Grays_1L () DECLARE SUB Casta_Grays_1R () DECLARE SUB Casta_GRays_Off () DECLARE SUB AfroCasta () DECLARE SUB Casta_Ritmes () DECLARE FUNCTION Casta_PlayFreq (BYVAL note AS CUR, BYVAL velo AS BYTE, BYVAL duration AS DWORD) AS LONG DECLARE SUB Casta_Noot () ' hidden task for note playing DECLARE SUB Casta_Scale () ' test for note playing DECLARE SUB Casta2_Repeat DECLARE SUB Casta2_rep_test_ud () FUNCTION Init_Casta () AS LONG GetInstrumentParams Casta, %IDM_CASTA GetInstrumentParams Casta2, %IDM_CASTA2 Task(%Test_Castagnets).naam = "Cas1tst" Task(%Test_Castagnets).cptr = CODEPTR(VoxHumanola_Castagnets) Task(%Test_Castagnets).freq = 20 Task(%Test_Castagnets).level = 127 Task(%Test_Castagnets).channel = casta.Channel TaskEX(%Test_Castagnets).stopCptr = CODEPTR(VoxHumanola_Castagnets_Stop) Task(%Test_Castagnets2).naam = "Cas2tst" Task(%Test_Castagnets2).cptr = CODEPTR(Castagnets2) Task(%Test_Castagnets2).freq = 20 Task(%Test_Castagnets2).level = 127 Task(%Test_Castagnets2).channel = casta2.Channel Task(%Casta2_Lite).naam = "Cas2Lit" Task(%Casta2_Lite).cptr = CODEPTR(Casta2_Lite) Task(%Casta2_lite).freq = 10 TaskEX(%Casta2_Lite).stopcptr = CODEPTR(MM_Casta_Off) Task(%MM_SysxTask).naam = "SendSysx" Task(%MM_SysxTask).freq = .33 Task(%MM_SysxTask).cptr = CODEPTR(MM_Sysx) 'in m_robots.inc ' casta solo demo stukje Task(%Casta_Grays).naam = "Grays_L" Task(%Casta_Grays).cptr = CODEPTR(Casta_Grays) Task(%Casta_Grays).freq = 16 TaskEX(%Casta_GRays).stopCptr = CODEPTR(Casta_GRays_Off) Task(%Casta_Grays+1).naam = "Grays_R" Task(%Casta_Grays+1).cptr = CODEPTR(Casta_Grays_R) Task(%Casta_Grays+1).freq = 16 ' TaskEX(%Casta_GRays+1).stopcptr = CODEPTR(Casta_Grays_Off) Task(%Casta_Grays+2).naam = "Grays1L" Task(%Casta_Grays+2).cptr = CODEPTR(Casta_Grays_1L) Task(%Casta_Grays+2).freq = 16 Task(%Casta_Grays+3).naam = "Grays1R" Task(%Casta_Grays+3).cptr = CODEPTR(Casta_Grays_1R) Task(%Casta_Grays+3).freq = 16 Task(%Afro_Casta).naam = "AfroCast" Task(%Afro_Casta).cptr = CODEPTR(Afrocasta) Task(%Afro_Casta).freq = 16 TaskEX(%Afro_Casta).stopCptr = CODEPTR(Casta_GRays_Off) Task(%Casta_Ritmes).naam = "Ritmes" Task(%Casta_Ritmes).cptr = CODEPTR(Casta_Ritmes) Task(%Casta_Ritmes).freq = 16 Task(%Casta_Scale).naam = "Scale" Task(%Casta_Scale).cptr = CODEPTR(Casta_Scale) Task(%Casta_Scale).freq = 1 Task(%casta2rep).naam = "Cst2Rep" Task(%casta2rep).cptr = CODEPTR(casta2_repeat) Task(%casta2rep).freq = 1 'interactive fileplayiing App.MidiPlayerTasknr = App.ReadSeqScoreTasknr Task(App.ReadSeqScoreTasknr).naam = "MFilePlay" Task(App.ReadSeqScoreTasknr).cptr = GetProcAddress(GetModuleHandle("g_lib.dll"),"MM_MIDIPLAYER") Task(App.ReadSeqScoreTasknr).freq = 500 '800 ' this is too fast! use 500 or 1000, 800 has no meaning Task(App.ReadSeqScoreTasknr).flags = %DLL_TASK OR %PERTIM_TASK TaskEX(App.ReadSeqScoreTasknr).stopcptr = GetProcAddress(GetModuleHandle("g_lib.dll"),"MIDIPLAYERSTOP") Clapping_Music_Init Task(%Casta_Noot).naam = "C_Note" Task(%Casta_Noot).cptr = CODEPTR(Casta_Noot) Task(%Casta_Noot).freq = 1 Task(%Casta_Noot).flags = %HIDDEN_TASK ' ProgChange Casta2.Channel, 122 - not yet implemented ' ProgChange Casta.channel, 122 SetDlgItemText gh.Cockpit, %GMT_TITLE , "" SetDlgItemText gh.Cockpit, %GMT_AUTHOR , $gwr FUNCTION = %True END FUNCTION SUB VoxHumanola_Castagnets () ' changed 20.06.2005 / 11.07.2005 STATIC i% STATIC udnr AS LONG STATIC slnr AS LONG LOCAL value AS LONG LOCAL velo AS BYTE IF ISFALSE Task(%Test_Castagnets).tog THEN Task(%Test_Castagnets).tog = %True i% = 113 DIM TaskParamLabels(2) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamlabels(1) = "Velo" TaskParamLabels(2) = "prog" IF ISFALSE Task(%Test_Castagnets).hParam THEN MakeTaskParameterDialog %Test_Castagnets,2,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Test_Castagnets).SliderNumbers(0) END IF IF ISFALSE udnr THEN udnr = TaskEX(%Test_Castagnets).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Casta_UD) UDctrl(udnr).value = %False END IF END IF velo = Slider(slnr+1).value mPlay Casta.channel, i%, velo INCR i% IF i% > 127 THEN i% = 113 Task(%Test_Castagnets).freq = (Slider(slnr).value) / 2! IF Task(%Test_Castagnets).freq < 0.5 THEN Task(%Test_Castagnets).freq = 0.5 END SUB SUB Casta_UD () ' callback on UD for prog.changes LOCAL prg AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Test_Castagnets).UpdownNumbers(0) prg = UDCtrl(udnr).value IF prg = 1 THEN prg = 122 UDCtrl(udnr).value = 122 ELSEIF prg < 122 THEN prg = %False UDctrl(udnr).value = %False END IF IF prg > 127 THEN prg = 127 UDctrl(udnr).value = 127 END IF SetDlgItemText Task(%Test_Castagnets).hparam, %GMT_TEXT0_ID + 16, "p=" & STR$(prg) ProgChange casta.channel, prg END SUB SUB VoxHumanola_Castagnets_Stop () ' reset casta mapping: ProgChange Humanola.channel, %False 'xof remark: do we really want this?! END SUB SUB Castagnets2 () ' changed 20.06.2005 / 11.07.2005 STATIC i% STATIC udnr AS LONG STATIC slnr AS LONG LOCAL value AS LONG LOCAL velo AS BYTE IF ISFALSE Task(%Test_Castagnets2).tog THEN Task(%Test_Castagnets2).tog = %True i% = 113 DIM TaskParamLabels(2) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamlabels(1) = "Velo" TaskParamLabels(2) = "prog" IF ISFALSE Task(%Test_Castagnets2).hParam THEN MakeTaskParameterDialog %Test_Castagnets2,2,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Test_Castagnets2).SliderNumbers(0) END IF IF ISFALSE udnr THEN udnr = TaskEX(%Test_Castagnets2).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Casta2_UD) UDctrl(udnr).value = %False END IF END IF velo = Slider(slnr+1).value mPlay Casta2.channel, i%, velo INCR i% IF i% > Casta2.Hightes THEN i% = Casta2.Lowtes Task(%Test_Castagnets2).freq = (Slider(slnr).value) / 2! IF Task(%Test_Castagnets2).freq < 0.5 THEN Task(%Test_Castagnets2).freq = 0.5 END SUB SUB Casta2_UD () ' callback on UD for prog.changes LOCAL prg AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Test_Castagnets2).UpdownNumbers(0) prg = UDCtrl(udnr).value IF prg = 1 THEN prg = 122 UDCtrl(udnr).value = 122 ELSEIF prg < 122 THEN prg = %False UDctrl(udnr).value = %False END IF IF prg > 127 THEN prg = 127 UDctrl(udnr).value = 127 END IF SetDlgItemText Task(%Test_Castagnets2).hparam, %GMT_TEXT0_ID + 16, "p=" & STR$(prg) ProgChange casta2.channel, prg END SUB SUB Casta2_Lite () STATIC i AS LONG ' IF i MOD 2 THEN ' NoteOff Casta2.channel, 111 ' ELSE mPlay Casta2.channel, 111, 1 + (i MOD 127) 'RND(1) * 127 ' END IF INCR i END SUB '-------------------------------------------------------------------------------------------------------- 'small demo piece for Casta Due - "Grays for Casta" ' gwr 05.05.2007 - 06.05.2007 ' 'Vlam & Co' zou ook goede titel zijn. SUB Casta_Grays () ' modified 10.05.2007 STATIC cnt AS DWORD STATIC factor AS SINGLE LOCAL i AS DWORD LOCAL gcnt AS DWORD LOCAL gncnt AS DWORD IF ISFALSE task(%Casta_Grays).tog THEN Slider(0).tag = "velo" slider(0).value = 16 Slider(1).tag = "freq" slider(1).value = 64 slider(0).minval = 1 slider(0).maxval = 120 slider(1).minval = 1 slider(1).maxval = 127 SendMessage Slider(0).h, %TBM_SETRANGE,%True, MakeLong(Slider(0).minval, Slider(0).maxval) 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 SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER1 , Slider(1).tag SetDlgItemText gh.Cockpit, %GMT_TITLE , "" SetDlgItemText gh.Cockpit, %GMT_AUTHOR , $gwr IF ISFALSE Task(%Casta_Grays + 1).swit THEN StartTask %Casta_Grays + 1 cnt = 0 factor = 1 Task(%Casta_GRays).tog = %True END IF ' versie 1: 'IF bitcount(LOBYT(gray(cnt))) THEN ' mPlay Casta2.channel, 111 + bitcount(LOBYT(gray(cnt))), slider(0).value 'END IF ' beter alternatief: - versie 2: gcnt = gray(cnt) gncnt = gray(cnt+1) FOR i = 0 TO 7 IF BIT(gcnt,i) <> BIT(gncnt,i) THEN mPlay Casta2.channel, 112 + i, slider(0).value NEXT i INCR cnt ' versie 1: ' IF ISFALSE LOBYT(gray(cnt)) THEN factor = ABS(SIN(cnt / 256!)) / 4! ' 0- 0.25 ' task(%Casta_Grays).freq = 1 + (slider(1).value * factor) ' 1 - 33 ' versie 2: factor = (SIN(cnt / 256!)) / 2! '-0.5 to + 0.5 ' IF ISFALSE cnt MOD 16 THEN task(%Casta_Grays).freq = MAX(1,(slider(1).value / 2) + (slider(1).value * factor)) ' 1 - 32 ' ' END IF ' IF task(%Casta_Grays).freq > 32 THEN ' IF task(%Casta_Grays).freq = task(%Casta_Grays + 1).freq THEN ' stoptask %Casta_GRays ' END IF ' END IF END SUB SUB Casta_Grays_R () STATIC cnt AS DWORD STATIC factor AS SINGLE LOCAL i AS DWORD LOCAL gcnt AS DWORD LOCAL gncnt AS DWORD IF ISFALSE task(%Casta_Grays+1).tog THEN IF ISFALSE task(%Casta_Grays).swit THEN StartTask %Casta_Grays cnt = 0 factor = 1 Task(%Casta_GRays+1).tog = %True END IF ' versie 1: 'IF bitcount(LOBYT(gray(cnt))) THEN ' 'mPlay Casta2.channel, 120 + LOBYT(gray(cnt)), slider(0).value ' mPlay Casta2.channel, 119 + bitcount(LOBYT(gray(cnt))), slider(0).value 'END IF ' beter alternatief: - versie 2: gcnt = gray(cnt) gncnt = gray(cnt+1) FOR i = 0 TO 7 IF BIT(gcnt,i) <> BIT(gncnt,i) THEN mPlay Casta2.channel, 120 + i, slider(0).value NEXT i INCR cnt 'versie 1: 'IF ISFALSE LOBYT(gray(cnt)) THEN factor = ABS(COS(cnt / 256!)) / 4 ' 0- 0.25 'Task(%Casta_Grays+1).freq = 1 + (slider(1).value * factor) ' 1 - 33 ' versie 2: factor = (COS(cnt / 256!)) / 2! ' 8! '-0.125 0- 0.125 ' IF ISFALSE cnt MOD 16 THEN task(%Casta_Grays+1).freq = MAX(1,(slider(1).value/2) + (slider(1).value * factor)) ' 1 - 32 ' END IF ' IF casta2.ctrl(111) <> (Slider(0).value + slider(1).value) / 2 THEN casta2.ctrl(111) = (Slider(0).value + slider(1).value) / 2 mPlay Casta2.channel, 111, casta2.ctrl(111) ' lampjes END IF END SUB SUB Casta_Grays_1L () STATIC cnt AS DWORD STATIC factor AS SINGLE LOCAL i AS DWORD LOCAL gcnt AS DWORD LOCAL gncnt AS DWORD IF ISFALSE task(%Casta_Grays+2).tog THEN IF ISFALSE task(%Casta_Grays).swit THEN StartTask %Casta_Grays cnt = 128 factor = 1 Task(%Casta_GRays+2).tog = %True END IF gcnt = gray(cnt) gncnt = gray(cnt+1) FOR i = 0 TO 6 IF BIT(gcnt,i) <> BIT(gncnt,i) THEN mPlay Casta.channel, 113 + i, slider(0).value NEXT i INCR cnt factor = (SIN(cnt / 256!)) / 2! ' IF ISFALSE cnt MOD 16 THEN task(%Casta_Grays+2).freq = MAX(1,(slider(1).value/2) + (slider(1).value * factor)) ' 1 - 32 ' END IF END SUB SUB Casta_Grays_1R () STATIC cnt AS DWORD STATIC factor AS SINGLE LOCAL i AS DWORD LOCAL gcnt AS DWORD LOCAL gncnt AS DWORD IF ISFALSE task(%Casta_Grays+3).tog THEN IF ISFALSE task(%Casta_Grays).swit THEN StartTask %Casta_Grays cnt = 128 factor = 1 Task(%Casta_GRays+3).tog = %True END IF gcnt = gray(cnt) gncnt = gray(cnt+1) FOR i = 0 TO 7 IF BIT(gcnt,i) <> BIT(gncnt,i) THEN mPlay Casta.channel, 120 + i, slider(0).value NEXT i INCR cnt factor = (COS(cnt / 256!)) / 2! ' IF ISFALSE cnt MOD 16 THEN task(%Casta_Grays+3).freq = MAX(1,(slider(1).value/2) + (slider(1).value * factor)) ' 1 - 32 ' END IF END SUB SUB Casta_Grays_Off () LOCAL i AS LONG MM_Casta_Off %MM_Lights 'StopTask %Casta_Grays IF task(%Casta_Grays+1).swit THEN StopTask %Casta_Grays + 1 IF task(%Casta_Grays+2).swit THEN StopTask %Casta_Grays + 2 IF task(%Casta_Grays+3).swit THEN StopTask %Casta_Grays + 3 FOR i = 112 TO 127 STEP 4 mPlay Casta2.channel, i, 64 mPlay Casta.channel, i, 127 SLEEP 10 NEXT i END SUB SUB AfroCasta () ' similar code as used for troms and dripper ' this piece can be interrupted and restarted any time. It will restart where it left off... ' it has only the parameters speed and velocity. STATIC i AS WORD 'BYTE ' 16 bit binary pattern STATIC j AS WORD 'BYTE ' rotator STATIC sl0 AS LONG STATIC sl1 AS LONG LOCAL level AS BYTE LOCAL n AS LONG LOCAL ud AS LONG IF ISFALSE Task(%afro_casta).tog THEN App.Globton = %False App.Tempo = 60 Task(%afro_casta).tog = %true Slider(0).minval = 10 ' tempo slider Slider(0).maxval = 120 Slider(0).resetval = App.Tempo Slider(0).tag = "MM" Slider(0).stap = 1 Slider(1).minval = 5 ' level slider Slider(1).maxval = 127 Slider(1).stap = 1 Slider(1).value = 80 Slider(1).tag = "Vol" 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 SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER0 , Slider(0).tag SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER1 , Slider(1).tag END IF ' here starts the playing algorithm: level = Slider(1).value '* 2 ROTATE LEFT i,j FOR n = 0 TO 15 IF BIT (i,n) THEN mPlay Casta2.channel, 112 + n, level 'IF Drip_Debug THEN ' DelNote2Har Task(%afro_casta).Har,NoteMap(n) '60+n ' AddNote2Har Task(%afro_casta).Har,NoteMap(n), Task(%Drip_piano).level 'MIN(level, 127) ' 'mPlay Task(%afro_casta).channel,60 + n, MIN(level, 127) 'END IF ELSE mPlay Casta.channel, 112 + n, level 'IF Drip_Debug THEN ' DelNote2Har Task(%afro_casta).Har, NoteMap(n) ' 'NoteOff Task(%afro_casta).channel, 60+n 'END IF END IF NEXT n ' IF Drip_Debug THEN ' PlayHar Task(%afro_casta).Har, Task(%afro_casta).channel ' END IF ROTATE RIGHT i,j j = (i \ 128) MOD 16 '12 INCR i ' IF i >4095 THEN i = %False - will overflow on 16 bits anyway. ' transpose Notemap: ' IF i THEN ' IF ISFALSE (i MOD 256) THEN ' IF NoteMap(0) > 34 THEN ud = -1 ELSE ud = 1 ' FOR n = 0 TO 11 ' NoteMap(n) = NoteMap(n) + (j* ud) ' NEXT n ' App.Globton = (24 + (j*ud)) MOD 12 ' END IF ' END IF Task(%afro_casta).freq = Slider(0).value * 4 / 60! ' MM240, of zestienden in MM60 END SUB SUB Casta_Ritmes () ' 10.05.2007 ' moet ooit flamenco worden... LOCAL note AS BYTE STATIC tiks! STATIC Ritmeteller AS LONG STATIC runcounter AS DWORD STATIC slnr AS DWORD IF ISFALSE Task(%Casta_Ritmes).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamlabels(1) = "Velo" IF ISFALSE Task(%Casta_Ritmes).hParam THEN MakeTaskParameterDialog %Casta_Ritmes,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Casta_Ritmes).SliderNumbers(0) END IF Task(%Casta_Ritmes).Rit.pattern(0) = %False Task(%Casta_Ritmes).tog = %True note = 112 INCR runcounter progchange casta2.channel, 115 'for debug midi woodblock patch END IF ' test for new ritme procs. in g_mus.dll IF ISFALSE SGN(Task(%Casta_Ritmes).Rit.pattern(Ritmeteller)) THEN Ritmeteller = %False SELECT CASE runcounter MOD 4 CASE %False tiks! = GetRitme (Task(%Casta_Ritmes).Rit, %Milonga, slider(0).value / 128!) CASE 1 ' first one tiks! = GetRitme (Task(%Casta_Ritmes).Rit, %Salsa, slider(0).value / 128!) CASE 2 tiks! = GetRitme (Task(%Casta_Ritmes).Rit, %BossaNova, slider(0).value / 128!) CASE 3 tiks! = GetRitme (Task(%Casta_Ritmes).Rit, %March, slider(0).value / 128!) END SELECT END IF Task(%Casta_Ritmes).tempo = MAX(slider(slnr).value,20) '/ 4 'App.tempo /4 ' immers in 4/4 ' het tempo voor een gehele maat is frq = task(tasknr%).tempo / 60 ' zo'n gehele maat beslaat een aantal eenheden gegeven in tiks! Task(%Casta_Ritmes).freq = (tiks! * Task(%Casta_Ritmes).tempo ) / (60! * ABS(Task(%Casta_Ritmes).Rit.pattern(Ritmeteller))) IF Task(%Casta_Ritmes).Rit.pattern(Ritmeteller) > 0 THEN note = 112 + (RND(1) * 16) mPlay Casta2.channel, note, MAX(20,127 - Ritmeteller) * (Slider(slnr+1).value / 128) ELSEIF Task(%Casta_Ritmes).Rit.pattern(Ritmeteller) < 0 THEN ' niks END IF INCR Ritmeteller END SUB SUB Casta_Scale () LOCAL retval AS LONG STATIC slnr AS DWORD LOCAL faktor AS SINGLE STATIC noot AS INTEGER LOCAL velo AS BYTE IF ISFALSE Task(%Casta_Scale).tog THEN noot = 24 DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamlabels(1) = "Velo" IF ISFALSE Task(%Casta_Scale).hParam THEN MakeTaskParameterDialog %Casta_Scale,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Casta_Scale).SliderNumbers(0) END IF Task(%Casta_Scale).tog = %True END IF velo = Slider(slnr+1).value faktor = (128! - Slider(slnr).value)/ 128 ' 1 to 0.0078 retval = Casta_PLayFreq (noot, velo, 900 * faktor) ' 7ms tot 900 ms IF retval THEN INCR noot ELSE noot = 24 Task(%Casta_Scale).freq = 1 / faktor ' 1000 ms, dus telkens 100ms rust 1Hz min -128Hz max. END SUB FUNCTION Casta_PlayFreq (BYVAL noot AS CUR, BYVAL velo AS BYTE, BYVAL duration AS DWORD) AS LONG ' for Casta2 only STATIC f AS SINGLE IF Task(%Casta_Noot).swit THEN stoptask %Casta_Noot f = NF2F(noot) IF f > 256 THEN FUNCTION = %False : EXIT FUNCTION IF ISFALSE duration THEN FUNCTION = %False : EXIT FUNCTION Task(%Casta_Noot).freq = f Task(%Casta_Noot).level = velo Task(%Casta_Noot).starttime = TimeGetTime Task(%Casta_Noot).stoptime = TimeGetTime + duration Task(%Casta_Noot).duur = duration StartTask %Casta_Noot FUNCTION = %True END FUNCTION SUB Casta_Noot () ' hidden task for playing the casta frequency ' called by Casta_PlayFreq function if successfull STATIC i AS LONG IF ISFALSE Task(%Casta_Noot).tog THEN i = 112 Task(%Casta_Noot).tog = %True END IF mPlay Casta2.channel, i, Task(%Casta_Noot).level INCR i IF i > 127 THEN i = 112 IF TimeGetTime >= Task(%Casta_Noot).stoptime THEN stoptask %Casta_Noot END SUB SUB Casta2_repeat () STATIC TaskParamLabels() AS ASCIIZ*8 STATIC slnr AS INTEGER STATIC udnr AS INTEGER IF ISFALSE Task(%casta2rep).tog THEN DIM TaskParamLabels(2) TaskParamLabels(0)="Speed" TaskParamLabels(1)="velo" TaskParamLabels(2)="Note" MakeTaskParameterDialog %casta2rep,2, Slider(),1,UdCtrl(), TaskParamLabels() slnr = TaskEX(%casta2rep).SliderNumbers(0) 'get slidernumber given in GMT-code Slider(Slnr).value = 5 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(Slnr+1).value = 1 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value udnr = TaskEX(%casta2rep).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Casta2_rep_Test_UD) UDctrl(udnr).value = Casta.LowTes Task(%casta2rep).tog = %True 'EXIT SUB END IF Task(%casta2rep).freq = MAX(.2, Slider(slnr).value / 5) mPlay casta2.channel, UdCtrl(udnr).value, Slider(slnr+1).value END SUB SUB Casta2_rep_test_ud () LOCAL udnr AS DWORD udnr = TaskEX(%casta2rep).UpdownNumbers(0) IF ISFALSE(UdCtrl(udnr).value) THEN UdCtrl(udnr).value = Casta.LowTes IF UdCtrl(udnr).value > Casta.HighTes THEN UdCtrl(udnr).value = Casta.LowTes IF UdCtrl(udnr).value < Casta.LowTes THEN UdCtrl(udnr).value = Casta.HighTes SetDlgItemText Task(%casta2rep).hparam, %GMT_TEXT0_ID + 16, STR$(UDCtrl(udnr).value) END SUB 'EOF