#IF %DEF(%klungsim) SUB RotoIniSim LOCAL i AS LONG Task(Rotomoton.beattask(1)).cptr = CODEPTR(Roto_bas_beat) Task(Rotomoton.beattask(2)).cptr = CODEPTR(Roto_ten_beat) Task(Rotomoton.beattask(3)).cptr = CODEPTR(Roto_alt_beat) Task(Rotomoton.beattask(4)).cptr = CODEPTR(Roto_mez_beat) Task(Rotomoton.beattask(5)).cptr = CODEPTR(Roto_sop_beat) Task(Rotomoton.Motortask(1)).cptr = CODEPTR(Sim_Roto_BasMot) Task(Rotomoton.Motortask(2)).cptr = CODEPTR(Sim_Roto_TenMot) Task(Rotomoton.Motortask(3)).cptr = CODEPTR(Sim_Roto_AltMot) Task(Rotomoton.Motortask(4)).cptr = CODEPTR(Sim_Roto_MezMot) Task(Rotomoton.Motortask(5)).cptr = CODEPTR(Sim_Roto_SopMot) Task(26).cptr = CODEPTR(Rotstuk_ten_beat) Task(Rotomoton.beattask(1)).channel = 9 'for midi > percussion set Task(Rotomoton.beattask(2)).channel = 9 'for midi Task(Rotomoton.beattask(3)).channel = 9 'for midi Task(Rotomoton.beattask(4)).channel = 9 'for midi Task(Rotomoton.beattask(5)).channel = 9 'for midi Task(Rotomoton.beattask(1)).duur = 41 'used as midi note Task(Rotomoton.beattask(2)).duur = 43 'used as midi note Task(Rotomoton.beattask(3)).duur = 45 'used as midi note Task(Rotomoton.beattask(4)).duur = 47 'used as midi note Task(Rotomoton.beattask(5)).duur = 48 'used as midi note Task(Rotomoton.beattask(1)).patch = 34 'used as midi note IF KlungSimulatorMode = %KlungSimMid THEN 'we need to set only one patch as all Rotos play on same channel (6) App.AutoFlags = %false 'prevents gmt resetting the synth patches ProgChange task(Rotomoton.BeatTask(1)).channel, 0'task(Rotomoton.BeatTask(1)).patch ELSE MakeRotoSamples StartWaveOutStream %AudioStreamCallBack END IF task(1).cptr = CODEPTR(RotSimSkin) task(1).naam = "RotInSim" task(1).swit = %false ' %true task(1).freq = 10 StartTask 1 END SUB SUB RotSetDefaultTekst () STATIC init AS LONG LOCAL tekst AS STRING EXIT SUB 'no pieces yet 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 " & $gwr + 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 RotSimSkin () STATIC stat AS LONG IF ISFALSE stat THEN 'make a constant of this text... RotSetDefaultTekst stat = 1 StopTask 1 END IF END SUB FUNCTION MakeRotoSamples AS LONG LOCAL count AS LONG LOCAL tracksource AS LONG LOCAL trackdest AS LONG LOCAL sSize AS LONG LOCAL filenam AS ASCIIZ * 15 LOCAL duration AS LONG DIM SampleHdr(1 TO 5) AS STATIC WaveHdr DIM pSampleHdr(1 TO 5) AS GLOBAL WaveHdr PTR filenam= "roto.wav" IF ISFALSE(ExistFile("roto.wav")) THEN 'if sample not in main dir, copy from .\rotomoton FILECOPY ".\rootomo~1\roto.wav", "roto.wav" trackSource = ReadWaveData(filenam) KILL "roto.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 FOR count = 1 TO 5 trackDest = GetFreeAudioTrack IF trackDest < 0 THEN MSGBOX "unable to make samples. Using midi instead.." + STR$(trackSource) KlungSimulatorMode = %klungSimMid EXIT FUNCTION END IF duration = trackduration(tracksource) / 2^((5.1 * (count-3)) / 12) '"valse" kwarten ResizeAudioTrack trackDest, duration VariSpeed WavHdr(trackSource), WavHdr(trackDest) StereoNormaliseWave WavHdr(trackDest), 20 + (80/count), 20 + 80 - (80/count) SampleHdr(count).dwBufferLength = WavHdr(trackDest).dwBufferLength Ssize = (SampleHdr(count).dwBufferlength \ 4)-1 ' reflects number of stereo samples (32 bits) SELECT CASE count CASE 1 DIM Sample1(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample1(0)) CASE 2 DIM Sample2(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample2(0)) CASE 3 DIM Sample3(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample3(0)) CASE 4 DIM Sample4(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample4(0)) CASE 5 DIM Sample5(0 TO Ssize) AS STATIC DWORD SampleHdr(count).lpData = VARPTR(Sample5(0)) END SELECT POKE$ SampleHdr(count).lpData, PEEK$(WavHdr(trackDest).lpData, WavHdr(trackDest).dwbufferlength) pSampleHdr(count) = VARPTR(SampleHdr(count)) ResizeAudioTrack trackdest, %false NEXT ResizeAudioTrack trackSource, %false END FUNCTION SUB Roto_bas_beat () LOCAL track AS LONG LOCAL duration AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid IF task(Rotomoton.BeatTask(1)).freq > 4 THEN task(Rotomoton.BeatTask(1)).freq = 6 NoteOff Task(Rotomoton.beattask(1)).channel, Task(Rotomoton.beattask(1)).duur NoteCentOn Task(Rotomoton.beattask(1)).channel,_ Task(Rotomoton.beattask(1)).duur + Rotomoton.count(1) / Rotomoton.Maxstep(1), Task(Rotomoton.beattask(1)).level CASE %klungSimWav IF task(Rotomoton.BeatTask(1)).freq > 4 THEN task(Rotomoton.BeatTask(1)).freq = 4 track = GetfreeAudioTrack IF track < 0 THEN EXIT SUB duration = WaveDuration(@pSampleHdr(1)) duration = duration / ( 1 + ( Rotomoton.count(1)/Rotomoton.Maxstep(1) ) ) ResizeAudioTrack track, duration Varispeed @pSampleHdr(1), WavHdr(track) NormalizeWave WavHdr(track), 36 + task(Rotomoton.BeatTask(1)).level / 2 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Roto_ten_beat () LOCAL track AS LONG LOCAL duration AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid IF task(Rotomoton.BeatTask(2)).freq > 4 THEN task(Rotomoton.BeatTask(2)).freq = 6 NoteOff Task(Rotomoton.beattask(2)).channel, Task(Rotomoton.beattask(2)).duur NoteCentOn Task(Rotomoton.beattask(2)).channel,_ Task(Rotomoton.beattask(2)).duur + Rotomoton.count(2) / Rotomoton.Maxstep(2), Task(Rotomoton.beattask(2)).level CASE %klungSimWav IF task(Rotomoton.BeatTask(2)).freq > 4 THEN task(Rotomoton.BeatTask(2)).freq = 4 track = GetfreeAudioTrack IF track < 0 THEN EXIT SUB duration = WaveDuration(@pSampleHdr(2)) duration = duration / ( 1 + ( Rotomoton.count(2)/Rotomoton.Maxstep(2) ) ) ResizeAudioTrack track, duration Varispeed @pSampleHdr(2), WavHdr(track) NormalizeWave WavHdr(track), 36 + task(Rotomoton.BeatTask(2)).level / 2 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Roto_alt_beat () LOCAL track AS LONG LOCAL duration AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid IF task(Rotomoton.BeatTask(3)).freq > 4 THEN task(Rotomoton.BeatTask(3)).freq = 6 NoteOff Task(Rotomoton.beattask(3)).channel, Task(Rotomoton.beattask(3)).duur NoteCentOn Task(Rotomoton.beattask(3)).channel,_ Task(Rotomoton.beattask(3)).duur + Rotomoton.count(3) / Rotomoton.Maxstep(3), Task(Rotomoton.beattask(3)).level CASE %klungSimWav IF task(Rotomoton.BeatTask(3)).freq > 4 THEN task(Rotomoton.BeatTask(3)).freq = 4 track = GetfreeAudioTrack IF track < 0 THEN EXIT SUB duration = WaveDuration(@pSampleHdr(3)) duration = duration / ( 1 + ( Rotomoton.count(3)/Rotomoton.Maxstep(3)) ) ResizeAudioTrack track, duration Varispeed @pSampleHdr(3), WavHdr(track) NormalizeWave WavHdr(track), 36 + task(Rotomoton.BeatTask(3)).level / 2 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Roto_mez_beat () LOCAL track AS LONG LOCAL duration AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid IF task(Rotomoton.BeatTask(4)).freq > 4 THEN task(Rotomoton.BeatTask(4)).freq = 6 NoteOff Task(Rotomoton.beattask(4)).channel, Task(Rotomoton.beattask(4)).duur NoteCentOn Task(Rotomoton.beattask(4)).channel,_ Task(Rotomoton.beattask(4)).duur + Rotomoton.count(4) / Rotomoton.Maxstep(4), Task(Rotomoton.beattask(4)).level CASE %klungSimWav IF task(Rotomoton.BeatTask(4)).freq > 4 THEN task(Rotomoton.BeatTask(4)).freq = 4 track = GetfreeAudioTrack IF track < 0 THEN EXIT SUB duration = WaveDuration(@pSampleHdr(4)) duration = duration / ( 1 + ( Rotomoton.count(4)/Rotomoton.Maxstep(4) ) ) ResizeAudioTrack track, duration Varispeed @pSampleHdr(4), WavHdr(track) NormalizeWave WavHdr(track), 36 + task(Rotomoton.BeatTask(4)).level / 2 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Roto_sop_beat () LOCAL track AS LONG LOCAL duration AS LONG SELECT CASE KlungSimulatorMode CASE %klungSimMid IF task(Rotomoton.BeatTask(5)).freq > 4 THEN task(Rotomoton.BeatTask(5)).freq = 6 NoteOff Task(Rotomoton.beattask(5)).channel, Task(Rotomoton.beattask(5)).duur NoteCentOn Task(Rotomoton.beattask(5)).channel,_ Task(Rotomoton.beattask(5)).duur + Rotomoton.count(5) / Rotomoton.Maxstep(5), Task(Rotomoton.beattask(5)).level CASE %klungSimWav IF task(Rotomoton.BeatTask(5)).freq > 4 THEN task(Rotomoton.BeatTask(5)).freq = 4 track = GetfreeAudioTrack IF track < 0 THEN EXIT SUB duration = WaveDuration(@pSampleHdr(5)) duration = duration / ( 1 + ( Rotomoton.count(5)/Rotomoton.Maxstep(5)) ) ResizeAudioTrack track, duration Varispeed @pSampleHdr(5), WavHdr(track) NormalizeWave WavHdr(track), 36 + task(Rotomoton.BeatTask(5)).level / 2 PlayAudioTrack track, %MODULATE_VOLUME END SELECT END SUB SUB Sim_Roto_BasMot LOCAL bevel AS LONG LOCAL param AS LONG bevel = Rotomoton.command(1) AND &HFFFF0000 ' mask value param = LOWRD(Rotomoton.command(1)) ' requested end position (count value) SELECT CASE bevel CASE %Roto_Cancel Rotomoton.command(1) = %False stoptask Rotomoton.motortask(1) CASE %Roto_Reset Rotomoton.command(1) = %False CASE %Roto_SetMax Rotomoton.command(1) = 127 CASE %Roto_Percent Rotomoton.command(1) = 127 * (param / 100) CASE %Roto_Calibrate 'ignore CASE %Roto_Position, %False IF Rotomoton.count(1) = param THEN Rotomoton.command(1) = %False stoptask Rotomoton.motortask(1) END IF IF Rotomoton.count(1) > param THEN DECR Rotomoton.count(1) 'rotomoton.count will be used to determin varispeed value ELSEIF Rotomoton.count(1) < param THEN INCR Rotomoton.count(1) END IF END SELECT END SUB SUB Sim_Roto_TenMot LOCAL bevel AS LONG LOCAL param AS LONG bevel = Rotomoton.command(2) AND &HFFFF0000 ' mask value param = LOWRD(Rotomoton.command(2)) ' requested end position (count value) SELECT CASE bevel CASE %Roto_Cancel Rotomoton.command(2) = %False stoptask Rotomoton.motortask(2) CASE %Roto_Reset Rotomoton.command(2) = %False CASE %Roto_SetMax Rotomoton.command(2) = 127 CASE %Roto_Percent Rotomoton.command(2) = 127 * (param / 100) CASE %Roto_Calibrate 'ignore CASE %Roto_Position, %False IF Rotomoton.count(2) = param THEN Rotomoton.command(2) = %False stoptask Rotomoton.motortask(2) END IF IF Rotomoton.count(2) > param THEN DECR Rotomoton.count(2) 'rotomoton.count will be used to determin varispeed value ELSEIF Rotomoton.count(2) < param THEN INCR Rotomoton.count(2) END IF END SELECT END SUB SUB Sim_Roto_AltMot LOCAL bevel AS LONG LOCAL param AS LONG bevel = Rotomoton.command(3) AND &HFFFF0000 ' mask value param = LOWRD(Rotomoton.command(3)) ' requested end position (count value) SELECT CASE bevel CASE %Roto_Cancel Rotomoton.command(3) = %False stoptask Rotomoton.motortask(3) CASE %Roto_Reset Rotomoton.command(3) = %False CASE %Roto_SetMax Rotomoton.command(3) = 127 CASE %Roto_Percent Rotomoton.command(3) = 127 * (param / 100) CASE %Roto_Calibrate 'ignore CASE %Roto_Position, %False IF Rotomoton.count(3) = param THEN Rotomoton.command(3) = %False stoptask Rotomoton.motortask(3) END IF IF Rotomoton.count(3) > param THEN DECR Rotomoton.count(3) 'rotomoton.count will be used to determin varispeed value ELSEIF Rotomoton.count(3) < param THEN INCR Rotomoton.count(3) END IF END SELECT END SUB SUB Sim_Roto_MezMot LOCAL bevel AS LONG LOCAL param AS LONG bevel = Rotomoton.command(4) AND &HFFFF0000 ' mask value param = LOWRD(Rotomoton.command(4)) ' requested end position (count value) SELECT CASE bevel CASE %Roto_Cancel Rotomoton.command(4) = %False stoptask Rotomoton.motortask(4) CASE %Roto_Reset Rotomoton.command(4) = %False CASE %Roto_SetMax Rotomoton.command(4) = 127 CASE %Roto_Percent Rotomoton.command(4) = 127 * (param / 100) CASE %Roto_Calibrate 'ignore CASE %Roto_Position, %False IF Rotomoton.count(4) = param THEN Rotomoton.command(4) = %False stoptask Rotomoton.motortask(4) END IF IF Rotomoton.count(4) > param THEN DECR Rotomoton.count(4) 'rotomoton.count will be used to determin varispeed value ELSEIF Rotomoton.count(4) < param THEN INCR Rotomoton.count(4) END IF END SELECT END SUB SUB Sim_Roto_SopMot LOCAL bevel AS LONG LOCAL param AS LONG bevel = Rotomoton.command(5) AND &HFFFF0000 ' mask value param = LOWRD(Rotomoton.command(5)) ' requested end position (count value) SELECT CASE bevel CASE %Roto_Cancel Rotomoton.command(5) = %False stoptask Rotomoton.motortask(1) CASE %Roto_Reset Rotomoton.command(5) = %False CASE %Roto_SetMax Rotomoton.command(5) = 127 CASE %Roto_Percent Rotomoton.command(5) = 127 * (param / 100) CASE %Roto_Calibrate 'ignore CASE %Roto_Position, %False IF Rotomoton.count(5) = param THEN Rotomoton.command(5) = %False stoptask Rotomoton.motortask(5) END IF IF Rotomoton.count(5) > param THEN DECR Rotomoton.count(5) 'rotomoton.count will be used to determin varispeed value ELSEIF Rotomoton.count(5) < param THEN INCR Rotomoton.count(5) END IF END SELECT END SUB #ENDIF '[EOF]