#IF %DEF(%klungsim) SUB TromsIniSim() ' to be rewritten, since troms is now a midi machine. LOCAL i AS LONG IF KlungSimulatorMode = %klungSimWav THEN StartWaveOutStream %AudioStreamCallBack END IF IF KlungSimulatorMode = %klungSimMid THEN App.AutoFlags = %false 'prevents gmt resetting the synth patches END IF ' Task(@pTroms.beattask(1)).channel = 9 'for midi, percussion channel ' task(@pTroms.beattask(1)).patch = 34 ' Task(@pTroms.beattask(1)).cptr = CODEPTR(BasTrom) ' Task(@pTroms.beattask(2)).naam = "TenorTrom" ' Task(@pTroms.beattask(2)).channel = 9 ' Task(@pTroms.beattask(2)).cptr = CODEPTR(TenorTrom) ' Task(@pTroms.beattask(3)).naam = "AltoTrom" ' Task(@pTroms.beattask(3)).channel = 9 ' Task(@pTroms.beattask(3)).cptr = CODEPTR(AltoTrom) ' Task(@pTroms.beattask(4)).naam = "LowBongo" ' Task(@pTroms.beattask(4)).channel = 9 ' Task(@pTroms.beattask(4)).cptr = CODEPTR(LowBongo) ' Task(@pTroms.beattask(5)).naam = "HighBongo" ' Task(@pTroms.beattask(5)).channel = 9 ' Task(@pTroms.beattask(5)).cptr = CODEPTR(HighBongo) ' Task(@pTroms.beattask(6)).naam = "LowMiniBongo" ' Task(@pTroms.beattask(6)).channel = 9 ' Task(@pTroms.beattask(6)).cptr = CODEPTR(LowMiniBongo) ' Task(@pTroms.beattask(7)).naam = "HighMiniBongo" ' Task(@pTroms.beattask(7)).channel = 9 ' Task(@pTroms.beattask(7)).cptr = CODEPTR(HighMiniBongo) ' ' Task(@pTroms.beat).cptr = CODEPTR(Bas1_sim) ' Task(@pTroms.beat + 1).cptr = CODEPTR(Bas2_sim) ' Task(@pTroms.beat + 2).cptr = CODEPTR(Bas3_sim) ' Task(@pTroms.beat + 3).cptr = CODEPTR(Bas4_sim) ' Task(@pTroms.beat + 4).cptr = CODEPTR(Bas5_sim) ' Task(@pTroms.beat + 5 ).cptr = CODEPTR(Bas6_sim) ' Task(@pTroms.beat + 6).cptr = CODEPTR(Tenor1_sim) ' Task(@pTroms.beat + 7).cptr = CODEPTR(Tenor2_sim) ' Task(@pTroms.beat + 8).cptr = CODEPTR(Tenor3_sim) ' Task(@pTroms.beat + 9).cptr = CODEPTR(Tenor4_sim) ' Task(@pTroms.beat + 10).cptr = CODEPTR(Alto1_sim) ' Task(@pTroms.beat + 11).cptr = CODEPTR(Alto2_sim) ' Task(@pTroms.beat + 12).cptr = CODEPTR(Alto3_sim) ' Task(@pTroms.beat + 13).cptr = CODEPTR(Alto4_sim) ' Task(@pTroms.beat + 14).cptr = CODEPTR(lbong1_sim) ' Task(@pTroms.beat + 15).cptr = CODEPTR(lbong2_sim) ' Task(@pTroms.beat + 16).cptr = CODEPTR(lbong3_sim) ' Task(@pTroms.beat + 17).cptr = CODEPTR(hbong1_sim) ' Task(@pTroms.beat + 18).cptr = CODEPTR(hbong2_sim) ' Task(@pTroms.beat + 19).cptr = CODEPTR(hbong3_sim) ' Task(@pTroms.beat + 20).cptr = CODEPTR(lmbong1_sim) ' Task(@pTroms.beat + 21).cptr = CODEPTR(lmbong2_sim) ' Task(@pTroms.beat + 22).cptr = CODEPTR(hmbong1_sim) ' Task(@pTroms.beat + 23).cptr = CODEPTR(hmbong2_sim) ' Task(%TromsETroms).cptr = CODEPTR(SimTromsETroms) ' Task(%stochr).cptr = CODEPTR(SimStochrom) ' Task(%troms_afro).cPtr = CODEPTR(SimAfroTroms) IF KlungSimulatorMode = %KlungSimMid THEN 'we need to set only one patch as all troms play on same channel (10) ' ProgChange task(@pTroms.beattask(1)).channel, task(@pTroms.beattask(1)).patch ELSE 'klunsimwav MakeTromSamples END IF 'make a cockpit with only the possibility to choose a piece for people @ home... FOR i = 0 TO UBOUND(ButnOs) ButnOs(i).tag = "" NEXT FOR i = 0 TO UBOUND(ButnSw) ButnSw(i).tag0 = "" NEXT ButnOs(0).tag = "E-Troms" 'aka TromsETroms ButnOs(1).tag = "Stochrom" ButnOs(2).tag = "AfroTrom" ButnOs(10).tag = "Submit" ButnOs(0).cptr = CODEPTR(StartETroms) ButnOs(1).cptr = CODEPTR(StartStochRom) ButnOs(2).cptr = CODEPTR(StartAfroTroms) ButnOs(10).cptr = CODEPTR(WSBSubmit) CONTROL DISABLE gh.Cockpit, %GMT_BUTNOS_ID + 10 FOR i = 0 TO 64 ' deletes all tasks in the cockpit CONTROL KILL gh.cockpit, %GMT_TASK0_ID + i NEXT task(1).cptr = CODEPTR(TromSimSkin) task(1).naam = "TrInSim" task(1).swit = %false ' %true task(1).freq = 10 StartTask 1 END SUB SUB TromSetDefaultTekst () STATIC init AS LONG LOCAL tekst AS STRING tekst = CHR$(13) +CHR$(13) +"Click one of the buttons to select a piece." + CHR$(13)+CHR$(13)+CHR$(13) tekst = tekst + " 1. by " & $gwr + CHR$(13)+CHR$(13) tekst = tekst + " 2. by " & $krl + CHR$(13) + CHR$(13) tekst = tekst + " 3. by " & $gwr +CHR$(13) + CHR$(13) ' tekst = tekst + " 4. by T" +CHR$(13) + CHR$(13) + CHR$(13) tekst = tekst + "If you have played one or more pieces, please submit your contribution by clicking the Submit button. If you're not connected to the internet you will be prompted to make a connection. This will also end " IF ISFALSE init THEN init = %true CONTROL ADD LABEL, gh.cockpit,%GMT_BUTNUSER_ID,tekst,4,2,206,270',%SS_SUNKEN ' CONTROL SET TEXT gh.cockpit,%GMT_BUTNUSER_ID,tekst ' CONTROL ADD LABEL, gh.cockpit,%GMT_BUTNUSER_ID,tekst,10,7,185,260 ELSE CONTROL SET TEXT gh.cockpit,%GMT_BUTNUSER_ID,tekst END IF END SUB SUB TromSimSkin () STATIC stat AS LONG IF ISFALSE stat THEN 'make a constant of this text... TromSetDefaultTekst stat = 1 StopTask 1 END IF END SUB SUB BasTrom () ' only used now for simulation code. - real mode uses Trom_Bas () 'notes 24 - 29 'ideal drumroll freq. using all beaters: 60 'on high freqs use velos ranging 10-20 'alternates beaters on bass drum. 'with the task.duur field you can determine wich beaters are used. 'when duur is 0 we use all beaters. otherwise the 7 lowest bits represent the beaters 'if the bit is set, the resp. beater is played LOCAL track AS LONG LOCAL trm AS DWORD trm = @pTroms.beattask(1) IF task(trm).freq > 70 THEN task(trm).freq = 70 IF task(trm).freq < .2 THEN task(trm).freq = .2 IF ISFALSE task(trm).pan THEN task(trm).pan = 24 'use pan field as counter, so it can be (re)set by other tasks INCR task(trm).pan 'count task(trm).duur = task(trm).duur AND 63 'otherwise we risk endless loops IF task(trm).duur THEN IF task(trm).freq > BitCount(task(trm).duur) * 10 THEN task(trm).freq = BitCount(task(trm).duur)*10 DO WHILE ISFALSE BIT(task(trm).duur, task(trm).pan-24) INCR task(trm).pan IF task(trm).pan > 29 THEN task(trm).pan = 24 LOOP END IF IF task(trm).pan > 29 THEN task(trm).pan = 24 SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(trm).channel, 47 '43 Play Task(trm).channel, 47, task(trm).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB END IF WavHdr(track).dwBufferLength = @pSampleHdr(task(trm).pan).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(task(trm).pan).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(trm ).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB TenorTrom () '30-33 - only simulator code 'ideal drumroll freq. using all beaters: 40 LOCAL track AS LONG IF task(@pTroms.beattask(2)).freq > 48 THEN task(@pTroms.beattask(2)).freq = 48 IF task(@pTroms.beattask(2)).freq < .2 THEN task(@pTroms.beattask(2)).freq = .2 IF ISFALSE task(@pTroms.beattask(2)).pan THEN task(@pTroms.beattask(2)).pan = 30 'use pan field, so it can be (re)set by other tasks INCR task(@pTroms.beattask(2)).pan 'count task(@pTroms.beattask(2)).duur = task(@pTroms.beattask(2)).duur AND 15 'otherwise we risk endless loops IF task(@pTroms.beattask(2)).duur THEN IF task(@pTroms.beattask(2)).freq > BitCount(task(@pTroms.beattask(2)).duur) * 9 THEN task(@pTroms.beattask(2)).freq = BitCount(task(@pTroms.beattask(2)).duur)*9 DO WHILE ISFALSE BIT(task(@pTroms.beattask(2)).duur, task(@pTroms.beattask(2)).pan-30) INCR task(@pTroms.beattask(2)).pan IF task(@pTroms.beattask(2)).pan > 33 THEN task(@pTroms.beattask(2)).pan = 30 LOOP END IF IF task(@pTroms.beattask(2)).pan > 33 THEN task(@pTroms.beattask(2)).pan = 30 SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 48'45 'indeed task(@pTroms.beattask(1)), as its the same for all troms Play Task(@pTroms.beattask(1)).channel, 48, task(@pTroms.beattask(2)).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB END IF WavHdr(track).dwBufferLength = @pSampleHdr(task(@pTroms.beattask(2)).pan).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(task(@pTroms.beattask(2)).pan).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beattask(2) ).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB AltoTrom () '34 - 37 for simulator only 'ideal drumroll freq. using all beaters: 44 LOCAL track AS LONG LOCAL trm AS DWORD trm = @pTroms.beattask(3) IF task(trm).freq > 48 THEN task(trm).freq = 48 IF task(trm).freq < .2 THEN task(trm).freq = .2 IF ISFALSE task(trm).pan THEN task(trm).pan = 34 'use pan field, so it can be (re)set by other tasks INCR task(trm).pan 'count task(trm).duur = task(trm).duur AND 15 IF task(trm).duur THEN IF task(trm).freq > BitCount(task(trm).duur) * 9 THEN task(trm).freq = BitCount(task(trm).duur)*9 DO WHILE ISFALSE BIT(task(trm).duur, task(trm).pan-34) INCR task(trm).pan IF task(trm).pan > 37 THEN task(trm).pan = 34 LOOP END IF IF task(trm).pan > 37 THEN task(trm).pan = 34 SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(0)).channel, 64'43'47 Play Task(@pTroms.beattask(0)).channel, 64, task(trm).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB END IF WavHdr(track).dwBufferLength = @pSampleHdr(task(trm).pan).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(task(trm).pan).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(trm).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB LowBongo () '38 - 40 'ideal drumroll freq. using all beaters: 25 LOCAL track AS LONG LOCAL trm AS DWORD trm = @pTroms.beattask(4) IF task(trm).freq > 30 THEN task(trm).freq = 30 IF task(trm).freq < .2 THEN task(trm).freq = .2 IF ISFALSE task(trm).pan THEN task(trm).pan = 38 'use pan field, so it can be (re)set by other tasks INCR task(trm).pan 'count task(trm).duur = task(trm).duur AND 7 IF task(trm).duur THEN IF task(trm).freq > BitCount(task(trm).duur) * 9 THEN task(trm).freq = BitCount(task(trm).duur)*9 DO WHILE ISFALSE BIT(task(trm).duur, task(trm).pan-38) INCR task(trm).pan IF task(trm).pan > 40 THEN task(trm).pan = 38 LOOP END IF IF task(trm).pan > 40 THEN task(trm).pan = 38 SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel,43'45' 48 Play Task(@pTroms.beattask(1)).channel, 43, task(trm).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB END IF WavHdr(track).dwBufferLength = @pSampleHdr(task(trm).pan).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(task(trm).pan).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(trm).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB HighBongo () '41 - 43 'ideal drumroll freq. using all beaters: 25 LOCAL track AS LONG IF task(@pTroms.beattask(5)).freq > 30 THEN task(@pTroms.beattask(5)).freq = 30 IF task(@pTroms.beattask(5)).freq < .2 THEN task(@pTroms.beattask(5)).freq = .2 IF ISFALSE task(@pTroms.beattask(5)).pan THEN task(@pTroms.beattask(5)).pan = 41 'use pan field, so it can be (re)set by other tasks INCR task(@pTroms.beattask(5)).pan 'count task(@pTroms.beattask(5)).duur = task(@pTroms.beattask(5)).duur AND 7 IF task(@pTroms.beattask(5)).duur THEN IF task(@pTroms.beattask(5)).freq > BitCount(task(@pTroms.beattask(5)).duur) * 9 THEN task(@pTroms.beattask(5)).freq = BitCount(task(@pTroms.beattask(5)).duur)*9 DO WHILE ISFALSE BIT(task(@pTroms.beattask(5)).duur, task(@pTroms.beattask(5)).pan-41) INCR task(@pTroms.beattask(5)).pan IF task(@pTroms.beattask(5)).pan > 43 THEN task(@pTroms.beattask(5)).pan = 41 LOOP END IF IF task(@pTroms.beattask(5)).pan > 43 THEN task(@pTroms.beattask(5)).pan = 41 SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 45'64 Play Task(@pTroms.beattask(1)).channel, 45, task(@pTroms.beattask(5)).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB END IF WavHdr(track).dwBufferLength = @pSampleHdr(task(@pTroms.beattask(5)).pan).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(task(@pTroms.beattask(5)).pan).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beattask(5) ).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB LowMiniBongo () ' 44, 45 'ideal drumroll freq. using all beaters: 20 LOCAL track AS LONG IF task(@pTroms.beattask(6)).freq > 22 THEN task(@pTroms.beattask(6)).freq = 22 IF task(@pTroms.beattask(6)).freq < .2 THEN task(@pTroms.beattask(6)).freq = .2 IF ISFALSE task(@pTroms.beattask(6)).pan THEN task(@pTroms.beattask(6)).pan = 44 'use pan field, so it can be (re)set by other tasks INCR task(@pTroms.beattask(6)).pan 'count IF task(@pTroms.beattask(6)).pan > 45 THEN task(@pTroms.beattask(6)).pan = 44 SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 50 Play Task(@pTroms.beattask(1)).channel, 50, task(@pTroms.beattask(6)).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB END IF WavHdr(track).dwBufferLength = @pSampleHdr(task(@pTroms.beattask(6)).pan).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(task(@pTroms.beattask(6)).pan).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beattask(6) ).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB HighMiniBongo () ' 46, 47 'ideal drumroll freq. using all beaters: 18 LOCAL track AS LONG LOCAL trm AS DWORD trm = @pTroms.beattask(7) IF task(trm).freq > 20 THEN task(trm).freq = 18 IF task(trm).freq < .2 THEN task(trm).freq = .2 IF ISFALSE task(trm).pan THEN task(trm).pan = 46 'use pan field, so it can be (re)set by other tasks INCR task(trm).pan 'count IF task(trm).pan > 47 THEN task(trm).pan = 46 SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 63 Play Task(trm).channel, 63, task(trm).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB END IF WavHdr(track).dwBufferLength = @pSampleHdr(task(trm).pan).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(task(trm).pan).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(trm ).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Bas1_sim () 'task to repeat 1 specific beater LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 47 '43 'inherits channel from BasTrom Play Task(@pTroms.beattask(1)).channel, 47, task(@pTroms.beat).level 'in midisimu all Basx are the same note CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(24).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(24).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Bas2_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 47 '43 Play Task(@pTroms.beattask(1)).channel, 47, task(@pTroms.beat + 1).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(25).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(25).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 1).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Bas3_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 47 '43 Play Task(@pTroms.beattask(1)).channel, 47, task(@pTroms.beat + 2).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(26).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(26).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 2).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Bas4_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 47 '43 Play Task(@pTroms.beattask(1)).channel, 47, task(@pTroms.beat + 3).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(27).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(27).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 3).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Bas5_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 47 '43 Play Task(@pTroms.beattask(1)).channel, 47, task(@pTroms.beat + 4).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(28).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(28).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 4).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Bas6_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 47 '43 Play Task(@pTroms.beattask(1)).channel, 47, task(@pTroms.beat + 5).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(29).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(29).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 5).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Tenor1_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 48 Play Task(@pTroms.beattask(1)).channel, 48, task(@pTroms.beat + 6).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(30).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(30).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 6).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Tenor2_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 48 '43 Play Task(@pTroms.beattask(1)).channel, 48, task(@pTroms.beat + 7).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(31).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(31).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 7).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Tenor3_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 48 '43 Play Task(@pTroms.beattask(1)).channel, 48, task(@pTroms.beat + 8).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(32).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(32).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 8).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Tenor4_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 48 '43 Play Task(@pTroms.beattask(1)).channel, 48, task(@pTroms.beat + 9).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(33).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(33).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 9).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Alto1_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 64 '43 Play Task(@pTroms.beattask(1)).channel, 64, task(@pTroms.beat + 10).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(34).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(34).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 10).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Alto2_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 64 '43 Play Task(@pTroms.beattask(1)).channel, 64, task(@pTroms.beat + 11).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(35).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(35).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 11).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Alto3_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 64 '43 Play Task(@pTroms.beattask(1)).channel, 64, task(@pTroms.beat + 12).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(36).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(36).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 12).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Alto4_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 64 '43 Play Task(@pTroms.beattask(1)).channel, 64, task(@pTroms.beat + 13).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(37).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(37).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 13).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB LBong1_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 43 Play Task(@pTroms.beattask(1)).channel, 43, task(@pTroms.beat + 14).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(38).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(38).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 14).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB LBong2_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 43 Play Task(@pTroms.beattask(1)).channel, 43, task(@pTroms.beat + 15).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(39).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(39).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 15).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB LBong3_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 43 Play Task(@pTroms.beattask(1)).channel, 43, task(@pTroms.beat + 16).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(40).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(40).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 16).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB HBong1_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 41 Play Task(@pTroms.beattask(1)).channel, 41, task(@pTroms.beat + 17).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(41).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(41).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 17).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB HBong2_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 41 Play Task(@pTroms.beattask(1)).channel, 41, task(@pTroms.beat + 18).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(42).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(42).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 18).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB HBong3_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 41 Play Task(@pTroms.beattask(1)).channel, 41, task(@pTroms.beat + 19).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(43).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(43).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 19).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB LMBong1_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 50 Play Task(@pTroms.beattask(1)).channel, 50, task(@pTroms.beat + 20).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(44).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(44).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 20).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB LMBong2_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 50 Play Task(@pTroms.beattask(1)).channel, 50, task(@pTroms.beat + 21).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(45).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(45).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 21).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB HMBong1_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 63 Play Task(@pTroms.beattask(1)).channel, 63, task(@pTroms.beat + 22).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(46).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(46).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 22).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB HMBong2_sim () LOCAL track AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid NoteOff Task(@pTroms.beattask(1)).channel, 63 Play Task(@pTroms.beattask(1)).channel, 63, task(@pTroms.beat + 23).level CASE %klungSimWav track = GetFreeAudioTrack IF track < 0 THEN EXIT SUB WavHdr(track).dwBufferLength = @pSampleHdr(47).dwBufferlength ResizeAudioTrack track, WaveDuration(WavHdr(track)) 'now we have the pointer set POKE$ WavHdr(track).lpData, PEEK$(@pSampleHdr(47).lpData, WavHdr(track).dwBufferlength) NorMalizeWave WavHdr(track), 20 + task(@pTroms.beat + 23).level * 75/127 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB StartETroms () STATIC stat AS LONG LOCAL i AS LONG LOCAL tekst AS STRING IF ISFALSE stat THEN stat = 1 tekst = CHR$(13) + "Playing ," + CHR$(13)+ CHR$(13) + "a piece by " & $gwr 'two blank lines at top causes a crash here!! no idea why... tekst = tekst + REPEAT$(3, CHR$(13)) tekst = tekst + "Push the button again to stop" tekst = tekst + REPEAT$(17, CHR$(13)) tekst = tekst + "You can control the following parameters using the sliders:" + CHR$(13) + CHR$(13) tekst = tekst + "Average velocity:" + CHR$(13)+ CHR$(13) tekst = tekst + "Average speed:" CONTROL SET TEXT gh.cockpit, %GMT_BUTNUSER_ID, tekst CONTROL DISABLE gh.cockpit, %GMT_BUTNOS_ID + 1 ' stochrom button CONTROL DISABLE gh.cockpit, %GMT_BUTNOS_ID + 2 ' afro button ' CONTROL DISABLE gh.cockpit, %GMT_BUTNOS_ID + 3 #IF %DEF(%klungsim) StoreUserAction "[TROMS]" StoreUserAction "[E_TROMS]" #ENDIF StartTask %TromsETroms ELSEIF stat = 1 THEN stat = 0 StopTask %TromsETroms #IF %DEF(%klungsim) StoreUserAction "[END E-TROMS]" #ENDIF 'FOR i = 0 TO 30 ' StopTask %trm + i 'NEXT TromsOff CONTROL ENABLE gh.cockpit, %GMT_BUTNOS_ID + 1 'was disable CONTROL ENABLE gh.cockpit, %GMT_BUTNOS_ID + 2 'CONTROL ENABLE gh.cockpit, %GMT_BUTNOS_ID + 3 CONTROL ENABLE gh.cockpit, %GMT_BUTNOS_ID + 10 #IF %DEF(%Klungsim) TromSetDefaultTekst #ENDIF END IF END SUB SUB StartAfroTroms () STATIC stat AS LONG LOCAL i AS LONG LOCAL tekst AS STRING IF ISFALSE stat THEN stat = 1 tekst = CHR$(13) + "Playing ," + CHR$(13)+ CHR$(13) + "a piece by Godfried-Willem Raes" 'two blank lines at top causes a crash here!! no idea why... tekst = tekst + REPEAT$(3, CHR$(13)) tekst = tekst + "Push the button again to stop" tekst = tekst + REPEAT$(17, CHR$(13)) tekst = tekst + "You can control the following parameters using the sliders:" + CHR$(13) + CHR$(13) tekst = tekst + "Tempo" + CHR$(13)+ CHR$(13) tekst = tekst + "Intensity" CONTROL SET TEXT gh.cockpit, %GMT_BUTNUSER_ID, tekst CONTROL DISABLE gh.cockpit, %GMT_BUTNOS_ID ' etroms CONTROL DISABLE gh.cockpit, %GMT_BUTNOS_ID + 1 ' stochrom StoreUserAction "[TROMS]" StoreUserAction "[AFROTROMS]" StartTask %Troms_Afro ELSEIF stat = 1 THEN stat = 0 StopTask %Troms_Afro StoreUserAction "[END AFROTROMS]" TromsOff CONTROL ENABLE gh.cockpit, %GMT_BUTNOS_ID 'was disable CONTROL ENABLE gh.cockpit, %GMT_BUTNOS_ID + 1 CONTROL ENABLE gh.cockpit, %GMT_BUTNOS_ID + 10 TromSetDefaultTekst END IF END SUB SUB SimAfroTroms () EXPORT ' task ' 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 BYTE ' binary pattern STATIC j AS BYTE ' rotator STATIC sl0 AS LONG STATIC sl1 AS LONG LOCAL level AS BYTE IF ISFALSE Task(%troms_Afro).tog THEN App.Tempo = 60 Task(%troms_Afro).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 FOR i = 1 TO 7 task(@pTroms.beattask(i)).pan = %false 'tasks wil reset themselves to rim NEXT 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 ' parameters: level, set Task(@pTroms.beattask(1)).level for the drums ' speed: change this tasks's frequency. ' here starts the playing algorithm: IF Sl0<>Slider(0).value THEN Sl0 = Slider(0).value StoreUserAction "SPEED "+TRIM$(STR$(SL0)) END IF IF Sl1<> Slider(1).value THEN Sl1 = Slider(1).value StoreUserAction "VELO "+TRIM$(STR$(Sl1)) END IF level = Slider(1).value ROTATE LEFT i,j IF BIT (i,0) THEN Task(@pTroms.beattask(1)).level = level: bastrom IF BIT (i,1) THEN Task(@pTroms.beattask(2)).level = level : tenortrom IF BIT (i,2) THEN Task(@pTroms.beattask(3)).level = level : altotrom IF BIT (i,3) THEN Task(@pTroms.beattask(4)).level = level : lowbongo IF BIT (i,4) THEN Task(@pTroms.beattask(5)).level = level : highbongo IF BIT (i,5) THEN Task(@pTroms.beattask(6)).level = level : lowminibongo IF BIT (i,6) THEN Task(@pTroms.beattask(7)).level = level : highminibongo ROTATE RIGHT i,j IF i < 127 THEN INCR i EXIT SUB ELSE i = 0 INCR j END IF IF j > 7 THEN j = 0 Task(%Troms_Afro).freq = Slider(0).value * 4 / 60! ' MM240, of zestienden in MM60 END SUB SUB SimTromsETroms () EXPORT STATIC count AS LONG STATIC hoek AS DWORD STATIC increm AS SINGLE STATIC sl0 AS LONG STATIC sl1 AS LONG LOCAL i AS LONG IF ISFALSE increm THEN increm = 1 IF ISFALSE Task(%TromsETroms).tog THEN Task(%TromsETroms).tog=%true Slider(0).minval = 1 Slider(0).maxval = 127 Slider(0).stap = 1 Slider(0).value = 60 Slider(0).tag = "Vol" Slider(1).minval = 5 Slider(1).maxval = 14 'bps ??? Slider(1).stap = 1 Slider(1).value = 10 Slider(1).tag = "Bps" IF KlungSimulatorMode = %KlungsimWav THEN Slider(1).minval = 2 Slider(1).maxval = 7 END IF SendMessage Slider(0).h, %TBM_SETRANGE,%True, MakeLong(Slider(0).minval, Slider(0).maxval) SendMessage Slider(0).h, %TBM_SETPAGESIZE,0,Slider(0).stap SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value SendMessage Slider(1).h, %TBM_SETRANGE,%True, MakeLong(Slider(1).minval, Slider(1).maxval) SendMessage Slider(1).h, %TBM_SETPOS,%True, Slider(1).value sl0 = Slider(0).value sl1 = Slider(1).value FOR i = 1 TO 7 task(@pTroms.beattask(i)).pan = %false 'tasks wil reset themselves to rim NEXT 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 IF sl0<>Slider(0).value THEN sl0=Slider(0).value task(%TromsETroms).level = sl0 StoreUserAction "VELO "+TRIM$(STR$(sl0)) END IF IF sl1<>Slider(1).value THEN sl1 = Slider(1).value SELECT CASE KlungSimulatorMode CASE %klungSimWav StoreUserAction "SPEED "+TRIM$(STR$(INT((sl1 - 2) * 127 / 5))) CASE ELSE StoreUserAction "SPEED "+TRIM$(STR$(INT((sl1 - 5) * 127 / 9))) END SELECT END IF task(%tromsETroms).freq = Slider(1).value INCR hoek Task(@pTroms.beattask(1)).level = ABS(SIN(Pi * hoek/160) * SIN(Pi*hoek/270) * Slider(0).value) Task(@pTroms.beattask(2)).level = ABS(SIN(Pi * hoek/161) * SIN(Pi*hoek/272) * Slider(0).value) Task(@pTroms.beattask(3)).level = ABS(SIN(Pi * hoek/162) * SIN(Pi*hoek/274) * Slider(0).value) Task(@pTroms.beattask(4)).level = ABS(SIN(Pi * hoek/163) * SIN(Pi*hoek/276) * Slider(0).value) Task(@pTroms.beattask(5)).level = ABS(SIN(Pi * hoek/164) * SIN(Pi*hoek/278) * Slider(0).value) Task(@pTroms.beattask(6)).level = ABS(SIN(Pi * hoek/165) * SIN(Pi*hoek/280) * Slider(0).value) Task(@pTroms.beattask(7)).level = ABS(SIN(Pi * hoek/166) * SIN(Pi*hoek/282) * Slider(0).value) FOR i = 1 TO 7 IF task(@pTroms.beattask(i)).level < 20 THEN task(@pTroms.beattask(i)).level = 20 NEXT begin: 'INCR count count = count + increm ' TromLog STR$(count) + CHR$(13) + STR$(increm) INCR hoek SELECT CASE count MOD 7 CASE 1 BasTrom IF (count\7 > 8) THEN increm=-increm - .2 : GOTO begin CASE 2 IF count\7 > 4 THEN GOTO begin TenorTrom CASE 3 IF count\7 > 4 THEN GOTO begin AltoTrom CASE 4 IF count\7 > 3 THEN GOTO begin LowBongo CASE 5 IF count\7 > 3 THEN GOTO begin HighBongo CASE 6 IF count\7 > 2 THEN GOTO begin LowMiniBongo CASE 0 IF count <= 0 THEN increm = - increm: GOTO begin IF count\7 > 2 THEN GOTO begin HighMiniBongo END SELECT IF increm>6 THEN count = 0 increm = increm/7 END IF END SUB SUB StartStochRom () 'initialisation window & button management piece by Kristof Lauwers STATIC stat AS LONG LOCAL i AS LONG LOCAL tekst AS STRING IF ISFALSE stat THEN stat = 1 tekst = CHR$(13) +CHR$(13) + "Playing ," + CHR$(13)+"a piece by Kristof Lauwers." tekst = tekst + REPEAT$(3, CHR$(13)) tekst = tekst + "Click the button again to stop" tekst = tekst + REPEAT$(3, CHR$(13)) tekst = tekst + "This is an organic algorythm that keeps itself going forever (or until you stop it). " tekst = tekst + "Every drum beater is assigned an energy level wich determines its speed and loudness. " tekst = tekst + "All beaters are continuously exchanging energy. " tekst = tekst + "At the beginning there's not enough energy to make any beater play. " tekst = tekst + "You have to boost the energy level of a beater (see window on the right) to start the piece. " +CHR$(13) + CHR$(13) tekst = tekst + "If this sounds way too complicated, just click some buttons on the left to try it out." tekst = tekst + REPEAT$(6, CHR$(13)) tekst = tekst + "You can control the following parameters using the sliders:" + CHR$(13) + CHR$(13) tekst = tekst + "Average note velocity:" + CHR$(13)+ CHR$(13) tekst = tekst + "Average note Speed: " CONTROL SET TEXT gh.cockpit, %GMT_BUTNUSER_ID, tekst CONTROL DISABLE gh.cockpit, %GMT_BUTNOS_ID ' etroms CONTROL DISABLE gh.cockpit, %GMT_BUTNOS_ID + 2 ' afro StoreUserAction "[TROMS]" StoreUserAction "[STOCHROM]" StartTask %Stochr ELSEIF stat = 1 THEN stat = 2 'we should offer the posibility to resume the piece here... StochRomEnd tekst = CHR$(13) + CHR$(13)+"Ending ..."+CHR$(13) CONTROL SET TEXT gh.cockpit, %GMT_BUTNUSER_ID, tekst ELSEIF stat = 2 THEN stat = 0 StopTask %TromsETroms StoreUserAction "[END STOCHROM]" StopTask %stochr TromsOff CONTROL ENABLE gh.cockpit, %GMT_BUTNOS_ID 'etroms was disable CONTROL ENABLE gh.cockpit, %GMT_BUTNOS_ID + 2 ' afro CONTROL ENABLE gh.cockpit, %GMT_BUTNOS_ID + 10 TromSetDefaultTekst END IF END SUB SUB SimStochrom () 'id: make simular algorithms for every instrument, general AME's can be distibuted between instrs 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 hDlgStchl AS LONG STATIC density AS LONG STATIC mask AS DWORD STATIC Maxi AS LONG STATIC dI AS LONG LOCAL harm AS harmtype 'piece for troms by kl 'each beater! has an amount of energy wich influences the levl and tremolo speed 'if the AME is high enough, it is slowly passed to the notes one fifth higher / lower IF ISFALSE task(%stochr).tog THEN 'this tog is resetted when task is stopped by the user... task(%stochr).pan = 0 ' pan = 1 for end of piece, tasknr of beatertask when the according button is clicked to raise energy level task(%stochr).tog = %true density = 64 hoekLevel = 1 hoekFreq = 1.3' 2 infNeighb = .9 '1 ' .3 MaxI = 24 dI = 5 IF Meta_AME_Troms < .1 THEN Meta_AME_Troms = .7 '1 DIM AME(0 TO 23) AS STATIC DOUBLE 'amount of energy DIM HighCount(0 TO 23) AS STATIC DOUBLE DIM SilentTime(0 TO 6) AS STATIC LONG FOR j = 0 TO 6 SilentTime(j)=TIMER NEXT DIALOG NEW %HWND_DESKTOP,"Stochrom parameter window",1,1,300,280 TO hDlgStchl tekst="This buttons represent the different drum beaters. The beaters are grouped by drum " tekst =tekst +" Every beater is assigned a different energy level, wich determines its speed and loudness. " tekst = tekst + "This level is displayed on the button. " tekst = tekst + "If a notes energy level is too low to make the note sound, you can boost it by clicking its button. " tekst = tekst + "You can also increase or decrease the overal energy level, or randomize all energylevels. By clicking a 'solo' button, you make the other drums shut up" CONTROL ADD LABEL, hDlgStchl,-1,tekst, 10,10,280,50,%SS_SUNKEN'%SS_ETCHEDHORZ OR %SS_LEFT FOR j = 0 TO 23 tekst =TRIM$(STR$(INT(AME(j) * 100))) ' MID$(STR$(AME(j)),1,4)'MID$(TRIM$((STR$(AME(j)))),1,4) IF j < 6 THEN CONTROL ADD BUTTON, hDlgStchl, %GMT_BUTNUSER_ID+j,tekst ,10+j*22,70,19,16,%BS_NOTIFY CALL SBC2 ELSEIF j < 10 THEN CONTROL ADD BUTTON, hDlgStchl, %GMT_BUTNUSER_ID+j, tekst,10+(j-6)*22,90,19,16,%BS_NOTIFY CALL SBC2 ELSEIF j <14 THEN CONTROL ADD BUTTON, hDlgStchl, %GMT_BUTNUSER_ID+j, tekst,10+(j-10)*22,110,19,16,%BS_NOTIFY CALL SBC2 ELSEIF j < 17 THEN CONTROL ADD BUTTON, hDlgStchl, %GMT_BUTNUSER_ID+j, tekst,10+(j-14)*22,130,19,16,%BS_NOTIFY CALL SBC2 ELSEIF j < 20 THEN CONTROL ADD BUTTON, hDlgStchl, %GMT_BUTNUSER_ID+j, tekst,10+(j-17)*22,150,19,16,%BS_NOTIFY CALL SBC2 ELSEIF j < 22 THEN CONTROL ADD BUTTON, hDlgStchl, %GMT_BUTNUSER_ID+j, tekst,10+(j-20)*22,170,19,16,%BS_NOTIFY CALL SBC2 ELSE CONTROL ADD BUTTON, hDlgStchl, %GMT_BUTNUSER_ID+j, tekst,10+(j-22)*22,190,19,16,%BS_NOTIFY CALL SBC2 END IF IF AME(j) > .5 THEN CONTROL DISABLE hDlgStchl, %GMT_BUTNUSER_ID+j task(@pTroms.beat + j).duur = %false '.duur of playing tasks indicates if button is enabled ELSE task(@pTroms.beat + j).duur = 1 END IF tekst = "Increase overal energy level" CONTROL ADD BUTTON, hDlgStchl, %GMT_BUTNUSER_ID+24, tekst, 10, 215, 107,16,%BS_NOTIFY CALL SBC2 tekst = "Decrease overal energy level" CONTROL ADD BUTTON, hDlgStchl, %GMT_BUTNUSER_ID+25, tekst, 10, 235, 107,16,%BS_NOTIFY CALL SBC2 tekst = "Randomize energy levels" CONTROL ADD BUTTON, hDlgStchl, %GMT_BUTNUSER_ID+26, tekst, 10, 255, 107,16,%BS_NOTIFY CALL SBC2 tekst = "Solo" CONTROL ADD BUTTON, hDlgStchl, %GMT_BUTNUSER_ID+27,tekst ,150,70,30,16,%BS_NOTIFY CALL SBC2 CONTROL ADD BUTTON, hDlgStchl, %GMT_BUTNUSER_ID+28,tekst ,150,90,30,16,%BS_NOTIFY CALL SBC2 CONTROL ADD BUTTON, hDlgStchl, %GMT_BUTNUSER_ID+29,tekst ,150,110,30,16,%BS_NOTIFY CALL SBC2 CONTROL ADD BUTTON, hDlgStchl, %GMT_BUTNUSER_ID+30,tekst ,150,130,30,16,%BS_NOTIFY CALL SBC2 CONTROL ADD BUTTON, hDlgStchl, %GMT_BUTNUSER_ID+31,tekst ,150,150,30,16,%BS_NOTIFY CALL SBC2 CONTROL ADD BUTTON, hDlgStchl, %GMT_BUTNUSER_ID+32,tekst ,150,170,30,16,%BS_NOTIFY CALL SBC2 CONTROL ADD BUTTON, hDlgStchl, %GMT_BUTNUSER_ID+33,tekst ,150,190,30,16,%BS_NOTIFY CALL SBC2 NEXT DIALOG SHOW MODELESS hDlgStchl 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 = 70'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 Slider(0).tag = "Vol" Slider(1).tag = "Frq" SetDlgItemText gh.Cockpit, %GMT_TITLE , "" SetDlgItemText gh.Cockpit, %GMT_AUTHOR, $krl SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER0 , Slider(0).tag SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER1 , Slider(1).tag END IF IF sl0<>Slider(0).value THEN sl0 = Slider(0).value StoreUserAction "VELO "+TRIM$(STR$(Slider(0).value)) END IF IF sl1<>Slider(1).value THEN sl1=Slider(1).value StoreUserAction "SPEED "+TRIM$(STR$(Slider(1).value)) END IF IF Slider(0).value / 100 <> Inflevel THEN Inflevel = Slider(0).value / 100 IF Slider(1).value / 100 <> InfFreq THEN InfFreq = Slider(1).value / 100 SELECT CASE task(%stochr).pan 'holds value of button communication CASE @pTroms.beat TO @pTroms.beat + 23 j = INT(( TimeGetTime - task(%stochr).starttime)/1000) AME(task(%stochr).pan - @pTroms.beattask(1) - 7) = .85 ' tekst = "50" CONTROL DISABLE hDlgStchl, %GMT_BUTNUSER_ID + task(%stochr).pan - @pTroms.beattask(1) - 7 task(task(%stochr).pan).duur = %false task(%stochr).pan = %false IF Density < 127 THEN INCR density StoreUserAction "DENSITY " + TRIM$(STR$(density)) CASE @pTroms.beat+24 'increase overal energy level j = INT(( TimeGetTime - task(%stochr).starttime)/1000) task(%stochr).pan = %false FOR j = 0 TO 23 AME(j) = AME(j) + .1 IF AME(j) > 1 THEN AME(j) = 1 NEXT IF Density < 117 THEN density = density + 10 StoreUserAction "DENSITY " + TRIM$(STR$(density)) CASE @pTroms.beat + 25 'decrease overal energy level j = INT(( TimeGetTime - task(%stochr).starttime)/1000) task(%stochr).pan = %false FOR j = 0 TO 23 AME(j) = AME(j) - .1 IF AME(j) < 0 THEN AME(j) = 0 NEXT IF density > 10 THEN density = density - 10 StoreUserAction "DENSITY " + TRIM$(STR$(density)) CASE @pTroms.beat + 26 'randomize energy levels j = INT(( TimeGetTime - task(%stochr).starttime)/1000) task(%stochr).pan = %false FOR j = 0 TO 23 AME(j) = RND(1) ^6 IF AME(j) < 0 THEN AME(j) = 0 '??! NEXT CASE @pTroms.beat + 27 task(%stochr).pan = %false FOR j = 6 TO 23: AME(j) = %false: NEXT CASE @pTroms.beat + 28 task(%stochr).pan = %false FOR j = 0 TO 5: Ame(j) = %false: NEXT FOR j = 10 TO 23: Ame(j) = %false: NEXT CASE @pTroms.beat + 29 task(%stochr).pan = %false FOR j = 0 TO 10: Ame(j) = %false: NEXT FOR j = 14 TO 23: Ame(j) = %false: NEXT CASE @pTroms.beat + 30 task(%stochr).pan = %false FOR j = 0 TO 14: Ame(j) = %false: NEXT FOR j = 17 TO 23: Ame(j) = %false: NEXT CASE @pTroms.beat + 31 task(%stochr).pan = %false FOR j = 0 TO 17: Ame(j) = %false: NEXT FOR j = 20 TO 23: Ame(j) = %false: NEXT CASE @pTroms.beat + 32 task(%stochr).pan = %false FOR j = 0 TO 20: Ame(j) = %false: NEXT FOR j = 21 TO 23: Ame(j) = %false: NEXT CASE @pTroms.beat + 33 task(%stochr).pan = %false FOR j = 0 TO 21: Ame(j) = %false: NEXT CASE 1 'end of piece FOR j = 0 TO 23 AME(j) = AME(j) * .97 NEXT ARRAY SCAN AME(), >.1, TO j IF ISFALSE j THEN 'end stochrung DIALOG SHOW STATE hDlgStchl, %SW_HIDE DIALOG END hDlgStchl FOR j = 0 TO 23 StopTask @pTroms.beat + j NEXT StartStochRom END IF CASE ELSE task(%stochr).pan = %false END SELECT FOR j = 0 TO 23 tekst = TRIM$(STR$(INT(AME(j)*100))) CONTROL SET TEXT hDlgStchl, %GMT_BUTNUSER_ID + j,tekst IF (127 * AME(j) * infLevel < 5) AND (ISFALSE task(@pTroms.beat + j).duur) THEN 'was AME(i)<.2 and task(@pTroms.beat + j).duur = 1 CONTROL ENABLE hDlgStchl, %GMT_BUTNUSER_ID + j ELSEIF (127 * AME(j) * infLevel>5) AND task(@pTroms.beat + j).duur THEN task(@pTroms.beat + j).duur = 0 CONTROL DISABLE hDlgStchl, %GMT_BUTNUSER_ID + j END IF NEXT INCR i IF i > 23 THEN i = 0 'we have a cyclus of 23 tiks where change can occur, followe by a in/decresing nr of tics w/out changes IF i >MaxI THEN TromLog STR$(MaxI) MaxI = Maxi + dI IF MaxI > 138 THEN dI = -6 IF MAxI< 24 THEN IF ISFALSE BIT (task(@pTroms.listentask).swit, %TASK_ONOFF) THEN FOR j = 0 TO 23 StopTask @pTroms.beat + j NEXT StopTask %stochr EXIT SUB END IF dI = 5: MaxI = 24 'stop here whenlistn task off?) END IF i = 0 '-1 END IF IF i > 23 THEN EXIT SUB task(@pTroms.beat + i).level = 127 * AME(i)^2 * infLevel task(@pTroms.beat + i).freq = .1 + 6 * AME(i)^2 * infFreq IF task(@pTroms.beat + i).freq < .3 THEN task(@pTroms.beat + i).freq = .3 IF task(@pTroms.beat + i).level > 5 THEN IF ISFALSE BIT (task(@pTroms.beat + i).swit,%TASK_ONOFF) THEN StartTask @pTroms.beat + i: EXIT SUB ELSEIF task(%klt +i).swit AND %TASK_ONOFF THEN StopTask @pTroms.beat + i END IF j = i - 7 DO WHILE j < 0: j = j + 19: LOOP AME(j) = AME(j) + AME(i) * (infNeighb / (2*task(%stochr).freq)) j = i + 7 DO WHILE j > 23: j = j - 16: LOOP AME(j) = AME(j) + AME(i) * (infNeighb / (2*task(%stochr).freq)) AME(i) = AME(i) - AME(i) * (infNeighb / task(%stochr).freq) IF AME(i) < .3 THEN AME(j) = AME(j) + AME(i) 'last bit passed at once.. AME(i) = 0 StopTask @pTroms.beat + i END IF IF AME(i) > Meta_AME_Troms THEN AME(i) = 0 'too much energy is deadly... the energy is spread over all klungs, and a little bit is lost FOR j = 0 TO 23 AME(j) = AME(j) + 0.03 NEXT END IF 'if a semitone higher / lower has a much lower ame, absorb it at once 'if a semitone higher/lower is only a little bit higher, lock in with it j = i - 1 IF j > 0 THEN IF AME(j) < AME(i) / 2.5 THEN AME(i) = AME(i) + AME (j) AME(j) = %false ELSEIF ABS(AME(j) - AME(i)) < .13 THEN IF AME(j) > AME(i) THEN AME(i) = AME(j) IF AME(i) > AME(j) THEN AME(j) = AME(i) END IF END IF j = j + 1 IF j > 23 THEN EXIT SUB IF AME(j) < AME(i) / 2.5 THEN AME(i) = AME(i) + AME (j) AME(j) = %false ELSEIF ABS(AME(j) - AME(i)) < .13 THEN IF AME(j) > AME(i) THEN AME(i) = AME(j) IF AME(i) > AME(j) THEN AME(j) = AME(i) END IF 'high energy's grow automaticly IF AME(i) > Meta_AME_Troms/2 THEN AME(i) = AME(i) *1.09 OnCount = %false FOR j = 0 TO 23 IF BIT (task(@pTroms.beat + j).swit, %TASK_ONOFF) THEN INCR OnCount NEXT IF OnCount > Meta_AME_Troms * 10 THEN ' if too much are playing the highest ae killed IF OnCount < 2 THEN EXIT IF FOR j = 0 TO 23 IF AME(j)>.7 THEN AME(j) = %false StopTask @pTroms.beat + j EXIT FOR END IF NEXT IF i >=23 THEN i = 0 END IF IF AME(i) > Meta_AME_Troms / 5 THEN 'if energy is high for a long time, we're getting tired... INCR HighCount(i) IF HighCount(i) > 5 THEN AME(i) = AME(i) - .06 END IF IF AME(i) > Meta_AME_Troms THEN AME(i) = Meta_AME_Troms ELSE IF AME(i) < 0 THEN AME(i) = 0 IF HighCount(i) THEN DECR highCount(i) END IF END SUB FUNCTION StochromEnd() AS LONG task(%stochr).pan = 1 'signal for the task to perform its end CONTROL DISABLE gh.cockpit,%GMT_TASK0_ID + 1 END FUNCTION CALLBACK FUNCTION SBC2 AS LONG IF CBCTLMSG <> %BN_CLICKED THEN EXIT FUNCTION IF ISFALSE task(%Stochr).pan THEN task(%stochr).pan = @pTroms.beat + CBCTL - 600 ' MSGBOX "button" +STR$(CBCTL) END FUNCTION FUNCTION MakeTromSamples () AS LONG 'makes samples for virtual trom by varispeed & filtering on source (trom.wav) 'panning low -> high = left -> right 'returns %true if succeeded, otherwise %false '!! the samples are under the GMT main directory because SaveAudioTrack uses asciiz*15 !! 'this is specific code for the 'web strikes back' project LOCAL count AS LONG LOCAL trackSource AS LONG 'tracknumber of source LOCAL trackDest AS LONG 'tracknmumber of destination LOCAL trackTemp AS LONG LOCAL interval AS LONG 'interval between source and destination, negative for lower sounds LOCAL filenam AS ASCIIZ * 15 LOCAL retval AS LONG LOCAL duration AS LONG LOCAL pWhr AS WaveHdr PTR LOCAL ssize AS DWORD LOCAL i AS LONG FUNCTION = %false DIM SampleHdr(24 TO 47) AS STATIC WaveHdr DIM pSampleHdr(24 TO 47) AS GLOBAL WaveHdr PTR filenam= "trom.wav" IF ISFALSE(ExistFile("trom.wav")) THEN 'if sample not in main dir, copy from .\troms FILECOPY ".\troms\trom.wav", "trom.wav" trackSource = ReadWaveData(filenam) KILL "trom.wav" ELSE trackSource = ReadWaveData(filenam) END IF IF TrackSource <0 THEN MSGBOX "unable to make samples. Using midi instead.." + STR$(trackSource) KlungSimulatorMode = %klungsimMid EXIT FUNCTION END IF ResizeAudioTrack trackSource, TrackDuration(trackSource) 'sic! now we're sure that trackdest wil have exactly the same bufferlength '!!! resizetrack has only ms precision, so slight dwbufferlength deviations are possible FOR count = 24 TO 47'49 TO 69 ' = notes on klung SELECT CASE count CASE 30,34,38,41,44,46,48 'new trom = new pitch trackDest = GetFreeAudioTrack IF trackDest < 0 THEN MSGBOX "unable to make samples. Using midi instead.." KlungSimulatorMode = %klungsimMid ResizeAudioTrack trackSource, %false EXIT FUNCTION END IF duration = .7 * trackDuration(trackSource) ResizeAudioTrack trackDest, duration VariSpeed WavHdr(trackSource), WavHdr(trackDest) ResizeAudioTrack trackSource, %false trackSource = trackDest ResizeAudioTrack trackSource, trackDuration(trackSource)'sic. c.s. END SELECT SELECT CASE count CASE < 30 i = 22 CASE < 34 i = 27 CASE < 38 i = 31 CASE < 41 i = 32 CASE < 44 i = 34 CASE < 46 i = 36 CASE < 48 i = 36 CASE ELSE i = 46 END SELECT trackTemp = LPF(WavHdr(trackSource), count-i) trackDest = LPF(WavHdr(trackTemp), count-i) ResizeAudioTrack trackTemp, %false ResizeAudioTrack trackDest, TrackDuration(trackSource) StereoNormaliseWave WavHdr(trackDest), 138-count,20+ count 'now save in memory as SampleHdr()... SampleHdr(count).dwBufferLength = WavHdr(trackDest).dwBufferLength Ssize = (SampleHdr(count).dwBufferlength \ 4)-1 ' reflects number of stereo samples (32 bits) SELECT CASE count CASE 24 DIM Sample24(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample24(0)) CASE 25 DIM Sample25(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample25(0)) CASE 26 DIM Sample26(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample26(0)) CASE 27 DIM Sample27(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample27(0)) CASE 28 DIM Sample28(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample28(0)) CASE 29 DIM Sample29(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample29(0)) CASE 30 DIM Sample30(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample30(0)) CASE 31 DIM Sample31(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample31(0)) CASE 32 DIM Sample32(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample32(0)) CASE 33 DIM Sample33(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample33(0)) CASE 34 DIM Sample34(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample34(0)) CASE 35 DIM Sample35(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample35(0)) CASE 36 DIM Sample36(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample36(0)) CASE 37 DIM Sample37(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample37(0)) CASE 38 DIM Sample38(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample38(0)) CASE 39 DIM Sample39(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample39(0)) CASE 40 DIM Sample40(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample40(0)) CASE 41 DIM Sample41(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample41(0)) CASE 42 DIM Sample42(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample42(0)) CASE 43 DIM Sample43(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample43(0)) CASE 44 DIM Sample44(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample44(0)) CASE 45 DIM Sample45(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample45(0)) CASE 46 DIM Sample46(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample46(0)) CASE 47 DIM Sample47(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample47(0)) END SELECT pSampleHdr(count) = VARPTR(SampleHdr(count)) POKE$ SampleHdr(count).lpData, PEEK$(WavHdr(trackDest).lpData, WavHdr(trackDest).dwbufferlength) 'clean up tracks ' SaveAudioTrack "tmp"+TRIM$(STR$(count))+".wav", trackdest ResizeAudioTrack trackDest, %false ' KlungLog STR$(trackDest) + STR$(WavHdr(trackDest).dwBufferlength) NEXT ResizeAudioTrack trackSource, %false ' MSGBOX "done" FUNCTION = %true END FUNCTION #ENDIF