'VERBZREIT '031204: makle sect progress manual!! #INCLUDE "kristof\verbzr03\verbz03.inc" ' > to gmt_init !! '%dbgon = 1 GLOBAL pVrbz03 AS verbz03type PTR GLOBAL is() AS Verbz03_insamp_type 'input samples GLOBAL es() AS Verbz03_insamp_type 'envelope samples GLOBAL EnvSamples() AS ASCIIZ * 40 GLOBAL nextstatflag AS LONG GLOBAL fromnr AS LONG GLOBAL projectedtonr AS LONG GLOBAL hDbg AS LONG GLOBAL hctrl AS LONG DECLARE FUNCTION verbzrsrvr_init LIB "verbzrsrvr.dll" () AS LONG DECLARE FUNCTION WaveFile LIB "verbzrsrvr.dll" (n AS LONG) AS STRING DECLARE FUNCTION verbz03_init AS LONG DECLARE FUNCTION CBAct(param1 AS DWORD, param2 AS DWORD) AS LONG DECLARE FUNCTION Verbz_WindowedSincLPFilter(track AS LONG, BYVAL pts AS LONG, BYVAL cutoff AS SINGLE) AS LONG ' DECLARE FUNCTION Verbz_Wave2Env (BYVAL track AS LONG) AS LONG DECLARE FUNCTION Verbz_Master AS LONG DECLARE FUNCTION checklevel(fn AS ASCIIZ * 40) AS LONG DECLARE SUB sendpd LIB "verbzrsrvr.dll" (BYVAL prt AS LONG, BYVAL msg AS STRING) DECLARE SUB GranulatorMessage(BYVAL nr AS INTEGER, BYVAL fmin AS SINGLE, BYVAL fdelta AS SINGLE, BYVAL soundpct AS SINGLE, BYVAL sharpness AS SINGLE, BYVAL rdpoint AS LONG, _ BYVAL rdfwd AS LONG, BYVAL arrayname AS STRING) DECLARE SUB EnvMessage(id AS LONG, envnr AS LONG) DECLARE SUB TellDebug(b AS STRING) DECLARE CALLBACK FUNCTION statincr DECLARE CALLBACK FUNCTION statdecr FUNCTION verbz03_init AS LONG LOCAL track AS LONG DIM is(1000) DIM Es(1000) pVrbz03 = verbzrsrvr_init @pVrbz03.cpCBExe = CODEPTR(CBAct) @pVrbz03.avdt = 5000 'average time inbetween rec samples - msec @pVrbz03.lastrectime = timegettime task(%verbz03master).naam = "Master" task(%verbz03master).freq = 5 task(%verbz03master).cptr = CODEPTR(Verbz_Master) IF timegettime > 86400000 THEN MSGBOX "your computer has been running for a long time (" + STR$(timegettime/60000) + " minutes )" + $CRLF + _ "you better restart befor running VerbzReit03" 'EXIT FUNCTION END IF ' IF ISFALSE SHELL("C:\pd\bin\pd -asio -r 44100 -blocksize 64 -audiobuf 128 -open c:\pd\patches\verbzrdev\recsamp.pd -open c:\pd\patches\verbzrdev\playback.pd") THEN ' [THUIS:] IF ISFALSE SHELL("C:\pd\bin\pd -asio -r 44100 -blocksize 32 -audiobuf 40 -lib c:\pd\externals\SMLib\SMLib -open c:\pd\patches\verbzrdev\recsamp.pd -open c:\pd\patches\verbzrdev\playback.pd") THEN IF ISFALSE SHELL("C:\pd\bin\pd -asio -audiobuf 30 -lib c:\pd\externals\SMLib\SMLib -open c:\pd\patches\verbzrdev\recsamp.pd -open c:\pd\patches\verbzrdev\playback.pd") THEN MSGBOX "failed starting PD!!",,FUNCNAME$ END IF FUNCTION = 1 DIALOG NEW 0, "Thintroppoinmealways",10 ,10 , 87, 28 TO hctrl CONTROL ADD BUTTON, hctrl, 2, "<", 1, 1, 28, 12 CALL statdecr CONTROL ADD TEXTBOX, hctrl, 1 , "1", 29, 1, 28, 12, %BS_FLAT CONTROL ADD BUTTON, hctrl, 3, ">", 58, 1, 28, 12 CALL statincr CONTROL ADD TEXTBOX, hctrl, 10, "0", 1, 14, 28, 12 CONTROL ADD TEXTBOX, hctrl, 11, "0", 29, 14, 28, 12 CONTROL ADD TEXTBOX, hctrl, 12, "-", 58, 14, 28, 12 DIALOG SHOW MODELESS hctrl #IF %DEF(%dbgon) DIALOG NEW 0, "verbz03.bas debug",,,300, 100 TO hdbg CONTROL ADD TEXTBOX, hdbg, 1, "", 1, 1, 298, 98, %ES_READONLY OR %ES_MULTILINE OR %WS_VSCROLL DIALOG SHOW MODELESS hdbg Telldebug "go" #ENDIF END FUNCTION CALLBACK FUNCTION statincr nextstatflag = MIN(5, @pvrbz03.curstat + 1) CONTROL SET TEXT CBHNDL, 1, STR$(nextstatflag) END FUNCTION CALLBACK FUNCTION statdecr nextstatflag = MAX(1, @pvrbz03.curstat - 1) CONTROL SET TEXT CBHNDL, 1, STR$(nextstatflag) END FUNCTION FUNCTION verbz_master AS LONG STATIC this AS LONG STATIC oldnrec AS LONG STATIC envstep AS LONG STATIC fivestep AS LONG STATIC msg AS STRING STATIC SamplesToPlay AS LONG LOCAL track AS LONG LOCAL ip AS LONG '??0 = self? LOCAL bufasciiz AS ASCIIZ * 40 LOCAL b$ LOCAL i AS LONG LOCAL x AS SINGLE STATIC devi() AS SINGLE 'for granulators - deviation from main freq STATIC speed AS SINGLE ' " " - main freq STATIC starttime AS SINGLE STATIC lastparttime AS SINGLE STATIC chance() AS SINGLE STATIC dlyvol AS SINGLE STATIC fdbck AS SINGLE IF ISFALSE this THEN starttime = timegettime this = %verbz03master @pVrbz03.curstat = 1 '3 '1 value@DEBUG ! @pVrbz03.Avdt = 1000 SendPd %playport, "sound GMT 1" b$ = "msg GMT samplerec 1": SendPD %Playport, b$ b$ = "msg GMT r-crackles 1": SendPd %Playport, b$ GranulatorMessage 1, 10, 10, 50, 1, 1, 1000, "grs1": GranulatorMessage 2, 10, 10, 50, 1, 1, 1000, "grs2": GranulatorMessage 3, 10, 10, 50, 1, 1, 1000, "grs3" GranulatorMessage 4, 10, 10, 50, 1, 1, 1000, "grs4": GranulatorMessage 5, 10, 10, 50, 1, 1, 1000, "grs5" REDIM chance(5): REDIM devi(5) END IF CONTROL SET TEXT gh.cockpit, %GMT_TEXT0_ID + 11, STR$(@pvrbz03.nrec) + STR$(oldnrec) + STR$(@pvrbz03.curstat) IF @pvrbz03.nrec > oldnrec THEN INCR oldnrec projectedtonr = MAX(projectedtonr, @pvrbz03.nrec) CONTROL SET TEXT hctrl, 11, STR$(@pvrbz03.nrec) SELECT CASE @pvrbz03.curstat CASE 1, 2 'get envelope from new sample bufasciiz = is(@pVrbz03.nrec).naam REPLACE "/" WITH "\" IN bufasciiz track = ReadWaveData(bufasciiz): NormalizeWave WavHdr(track), 100: Verbz_Wave2Env track ES(@pVrbz03.nenv + 1).naam = "E" + TRIM$(FORMAT$(@pVrbz03.nenv + 1), "00") + ".wav" ' $wvfn + "E" + trim$(format$(@pVrbz03.nenv + 1), "00") + ".wav" ES(@pVrbz03.nenv + 1).freq = is(@pVrbz03.nrec).freq: ES(@pVrbz03.nenv + 1).duur = is(@pVrbz03.nrec).duur bufasciiz = es(@pVrbz03.nenv + 1).naam: REPLACE "/" WITH "\" IN bufasciiz b$ = CURDIR$: CHDIR $pathgmt 'c'est necessaire???? WriteAudioTrack BYREF bufasciiz, BYREF WavHdr(track) 'max asciiz * 15 !!!!! CHDIR b$ 'free GMT audio track WavHdr(track).dwflags = 0: ResizeAudioTrack track, 0 INCR fivestep: fivestep = fivestep MOD 6: fivestep = MAX(fivestep, 1) EnvMessage fivestep, @pVrbz03.nenv + 1 INCR @pVrbz03.nenv SamplesToPlay = SamplesToPlay + MAX(6, @pVrbz03.nenv) 'MIN(6, @pVrbz03.nenv) IF @pVrbz03.nenv = 1 THEN SamplesToPlay = SamplesToPlay + 5 ELSE 'low drone q factor: 33 - > 3 for samples 28 -> 50 + factor for big difference astdt<>avgdt x = 3 + (projectedtonr - @pVrbz03.nrec) * 1.36 x = x - ABS(@pVrbz03.avdt - @pVrbz03.lastdt) / 500 x = MIN(30, MAX(1, x)) b$ = "msg GMT ldq" + STR$(x): SendPd %Playport, b$: Telldebug b$ 'low drone ceilfreq 120 -> 220 for samples 28 -> 50 + factor for big difference astdt<>avgdt x = MAX(120, 220 - (projectedtonr - @pVrbz03.nrec) * 4.5) x = x + SQR(ABS(@pVrbz03.avdt - @pVrbz03.lastdt)) x = MIN(450, x) b$ = "msg GMT droneceiling" + STR$(x): SendPd %Playport, b$: Telldebug b$ END IF IF nextstatflag THEN '28 50--------COMPLETELY ARBITRARY NUMBERS - to be checked.. @pVrbz03.curstat = nextstatflag nextstatflag = 0 fivestep = 0 ' INCR @pVrbz03.curstat IF @pVrbz03.curstat = 3 THEN task(this).freq = 8 EnvMessage fivestep + 5, envstep b$ = "msg GMT r-crackles 0": SendPd %Playport, b$ fromnr = @pVrbz03.nrec: projectedtonr = fromnr + 14 ELSE b$ = "msg GMT ldq 30": SendPd %Playport, b$ b$ = "msg GMT r-lowdrone 1": SendPd %Playport, b$ fromnr = @pVrbz03.nrec: projectedtonr = fromnr + 28 END IF CONTROL SET TEXT hctrl, 10, STR$(fromnr): CONTROL SET TEXT hctrl, 12, STR$(projectedtonr) CONTROL SET TEXT gh.cockpit, %GMT_TEXT0_ID + 12, "STAT:" + STR$(@pVrbz03.curstat) TellDebug "STATUS " + STR$(@pVrbz03.curstat) + " -- @t" + FORMAT$(timegettime - starttime, "00000.0") + "---------------------------" END IF CASE 3 '50 - 64 bufasciiz = is(@pVrbz03.nrec).naam: REPLACE "/" WITH "\" IN bufasciiz track = ReadWaveData(bufasciiz): NormalizeWave WavHdr(track), 99 b$ = CURDIR$: CHDIR $pathgmt WriteAudiotrack BYREF bufasciiz, BYREF WavHdr(track) CHDIR b$ WavHdr(track).dwflags = 0: ResizeAudioTrack track, 0 INCR fivestep: fivestep = MAX(fivestep MOD 6, 1) 'avgdt should determin granu base speed, lastdt deviation of speed speed = MAX(.5, MIN(70, .5 + 70 *(is(@pVrbz03.nrec - 1).freq - 50) / 1000)) 'nput pitch dependant devi(fivestep) = MAX(0, devi(fivestep), MIN(speed, speed * ABS(@pVrbz03.avdt - @pVrbz03.lastdt) / @pVrbz03.avdt)) chance(fivestep) = MAX(chance(fivestep), MIN(95, 20 + 100 * ((@pVrbz03.avdt - %minxpectedavgdt) / (%maxxpectedavgdt - %minxpectedavgdt))^ 2 )) FOR i = 1 TO 5: chance(i) = (chance(i) + chance(fivestep)) / 2: NEXT b$ = "sample GMT " + Wavefile(@pVrbz03.lastrecnum - 1) + " grs"+ FORMAT$(fivestep, "0") + CHR$(10) SendPd %PlayPort, b$ GranulatorMessage BYVAL fivestep, speed, devi(i), chance(fivestep), -1, -1, (is(@pVrbz03.nrec - 1).duur/10), "grs" + FORMAT$(fivestep, "0") 'ok 'lowdrone Q 3.3 -> 3.3^3.75, samples 50 -> 64, logaritmic + factor for big change difference lastdt<>avgdt x = 3.3^((@pVrbz03.nrec - projectedtonr + 18) / 4.8) x = x - ABS(@pVrbz03.avdt - @pVrbz03.lastdt) / 500 x = MIN(60, MAX(1, x)) b$ = "msg GMT ldq"+ STR$(x): SendPd %Playport, b$: Telldebug b$ 'low drone ceilfreq 220 -> 646 for samples 50 -> 64 b$ = "msg GMT droneceiling" + STR$(220 + 1.4^(@pVrbz03.nrec - projectedtonr + 18)): SendPd %Playport, b$: Telldebug b$ IF nextstatflag THEN '----------new stat 'value@DEBUG !! @pVrbz03.curstat = nextstatflag nextstatflag = 0 fromnr = @pVrbz03.nrec: projectedtonr = fromnr + 20 CONTROL SET TEXT hctrl, 10, STR$(fromnr): CONTROL SET TEXT hctrl, 12, STR$(projectedtonr) 'b$ = "msg GMT samplerec 0": SendPD %Playport, b$ b$ = "msg GMT doubbufinp 1": SendPD %Playport, b$ b$ = "msg GMT r-lowdrone 0": SendPd %Playport, b$ FOR fivestep = 1 TO 5 GranulatorMessage BYVAL fivestep, 20, 10, 30, -1, -1, 100, "-" devi(fivestep) = 10 NEXT envstep = 0 CONTROL SET TEXT gh.cockpit, %GMT_TEXT0_ID + 12, "STAT:" + STR$(@pVrbz03.curstat) TellDebug "STATUS " + STR$(@pVrbz03.curstat) + " -- @t" + FORMAT$(timegettime - starttime, "00000.0") + "---------------------------" END IF CASE 4 '62 - 80 speed = MAX(5, is(@pVrbz03.nrec - 1).freq) DO WHILE speed > 30: speed = speed / 2: LOOP FOR fivestep = 1 TO 5 devi(fivestep) = .01 + devi(fivestep) * .9 'stabilizes after a very long time to .1.. - also influenced on every iter of task chance(fivestep) = MAX(chance(fivestep), MIN(97, 40 + 100 * ((@pVrbz03.avdt - %minxpectedavgdt) / (%maxxpectedavgdt - %minxpectedavgdt))^ 2 )) NEXT IF nextstatflag THEN nextstatflag = 0 fromnr = @pVrbz03.nrec: projectedtonr = fromnr + 18 @pVrbz03.curstat = nextstatflag b$ = "msg GMT mdly_on 1": SendPD %Playport, b$ ' b$ = "msg GMT mdly_invol 0.1": SendPD %Playport, b$: dlyvol = .1 ' b$ = "msg GMT mdly_fdbck 0.1": SendPD %Playport, b$: fdbck = .1 task(this).freq = 5 lastparttime = timegettime CONTROL SET TEXT gh.cockpit, %GMT_TEXT0_ID + 12, "STAT:" + STR$(@pVrbz03.curstat) CONTROL SET TEXT hctrl, 10, STR$(fromnr): CONTROL SET TEXT hctrl, 12, STR$(projectedtonr) TellDebug "STATUS " + STR$(@pVrbz03.curstat) + " -- @t" + FORMAT$(timegettime - starttime, "00000.0") + "---------------------------" END IF CASE 5 CASE ELSE END SELECT END IF SELECT CASE @pVrbz03.curstat CASE 0 'for debugging purposes only!!! CASE 1, 2 'let pd play envelopes applied on synth sounds IF (@pVrbz03.curstat = 1) AND (ISFALSE(SamplesToPlay)) THEN EXIT FUNCTION IF SamplesToPlay THEN DECR SamplesToPlay INCR fivestep: fivestep = fivestep MOD 5: IF ISFALSE fivestep THEN INCR fivestep INCR envstep: envstep = envstep MOD 54 '150 '30" at freq 5 CONTROL SET TEXT gh.cockpit, %GMT_TEXT0_ID + 13, STR$(envstep) IF envstep > @pVrbz03.nenv THEN envstep = 1 SELECT CASE envstep CASE 1, 18, 19, 20, 21, 23, 28, 35, 37, 39, 48, 50: EnvMessage fivestep, @pVrbz03.nenv CASE 2, 25, 27, 29, 31: EnvMessage fivestep, @pVrbz03.nenv - 1 CASE 3, 23, 33, 43: EnvMessage fivestep, @pVrbz03.nenv - 2 CASE 4: EnvMessage fivestep, @pVrbz03.nenv - 3 CASE 5, 27, 38, 49: EnvMessage fivestep, @pVrbz03.nenv - 4 CASE 6: EnvMessage fivestep, @pVrbz03.nenv - 5 CASE 7, 22, 24, 26: EnvMessage fivestep, @pVrbz03.nenv - 6 CASE 8, 30, 32, 34: EnvMessage fivestep, @pVrbz03.nenv - 7 CASE 9, 36, 40, 42, 45: EnvMessage fivestep, @pVrbz03.nenv - 8 CASE 10, 38, 41, 44: EnvMessage fivestep, @pVrbz03.nenv - 9 CASE 11, 46, 51: EnvMessage fivestep, @pVrbz03.nenv - 10 CASE 12, 47: EnvMessage fivestep, @pVrbz03.nenv - 11 CASE 13, 53: EnvMessage fivestep, @pVrbz03.nenv - 12 CASE 14, 52: EnvMessage fivestep, @pVrbz03.nenv - 13 CASE 15: EnvMessage fivestep, @pVrbz03.nenv - 14 CASE 16: EnvMessage fivestep, @pVrbz03.nenv - 15 CASE 17: EnvMessage fivestep, @pVrbz03.nenv - 16 END SELECT IF @pVrbz03.curstat = 2 THEN SELECT CASE envstep CASE 1, 21, 45, 49, 52: EnvMessage fivestep + 5, @pVrbz03.nenv - 17 CASE 3, 24, 47, 51, 53: EnvMessage fivestep + 5, @pVrbz03.nenv - 18 CASE 5, 26: EnvMessage fivestep + 5, @pVrbz03.nenv - 19 CASE 7, 28: EnvMessage fivestep + 5, @pVrbz03.nenv - 20 CASE 9, 31: EnvMessage fivestep + 5, @pVrbz03.nenv - 21 CASE 11, 32: EnvMessage fivestep + 5, @pVrbz03.nenv - 22 CASE 13, 33: EnvMessage fivestep + 5, @pVrbz03.nenv - 23 CASE 14, 36: EnvMessage fivestep + 5, @pVrbz03.nenv - 24 CASE 15, 38: EnvMessage fivestep + 5, @pVrbz03.nenv - 25 CASE 16, 40: EnvMessage fivestep + 5, @pVrbz03.nenv - 26 CASE 17, 42: EnvMessage fivestep + 5, @pVrbz03.nenv - 27 CASE 19, 44: EnvMessage fivestep + 5, @pVrbz03.nenv - 28 CASE 46 b$ = "sample GMT " + Wavefile(@pVrbz03.lastrecnum - 1) + " grs"+ FORMAT$(fivestep, "0") + CHR$(10) SendPd %PlayPort, b$ GranulatorMessage BYVAL fivestep, 10, 10, 10, -1, -1, (is(@pVrbz03.nrec - 1).duur/10), "grs" + FORMAT$(fivestep, "0") 'ok CASE 48 b$ = "sample GMT " + Wavefile(@pVrbz03.lastrecnum - 1) + " grs"+ FORMAT$(fivestep, "0") + CHR$(10) SendPd %PlayPort, b$ GranulatorMessage BYVAL fivestep, 20, 15, 20, -1, -1, (is(@pVrbz03.nrec - 1).duur/10), "grs" + FORMAT$(fivestep, "0") 'ok CASE 50 b$ = "sample GMT " + Wavefile(@pVrbz03.lastrecnum - 1) + " grs"+ FORMAT$(fivestep, "0") + CHR$(10) SendPd %PlayPort, b$ GranulatorMessage BYVAL fivestep, 30, 1, 50, -1, -1, (is(@pVrbz03.nrec - 1).duur/10), "grs" + FORMAT$(fivestep, "0") 'ok END SELECT 'this seems to work ok for the freqs: stat 2 slows down on input and accelerates on long pauses -> use that task(this).freq = MIN(5, MAX(@pVrbz03.avdt, (timegettime - @pVrbz03.lastrectime)) / %avgxpectedavgdt) '%avg... used to be 3000 @ 030905 ELSE 'curstat = 1 'speed roughly follows input, mainly becuz of var SamplesToPlay task(this).freq = MAX(.2, (%avgxpectedavgdt / @pVrbz03.avdt)^2 ) + LOG(MAX(1, SamplesToPlay)) '%avg... usedtb 35600 @ 030905 END IF CASE 3 'task.freq = 8 INCR envstep: envstep = envstep MOD 8 IF RND < chance(1)/800 THEN EnvMessage fivestep + 5, envstep IF ISFALSE envstep THEN FOR i = 1 TO 5 devi(i) = MAX(0, (devi(i) * .8)) ' - 1.5) chance(i) = MAX(10, chance(i) * .85): GranulatorMessage BYVAL i, -1, devi(i), chance(i), -1, -1, -1, "-" NEXT TellDebug "NEW DEVIS!" + STR$(devi(1)) +STR$(devi(2)) +STR$(devi(3)) +STR$(devi(4)) +STR$(devi(5)) END IF CASE 4 INCR envstep: IF envstep > 5 THEN envstep = 1 devi(envstep) = .01 + devi(envstep) * .9 '+ extra influence if new sample recorded - cs chance(envstep) = (18 + 10 * chance(envstep)) / 11 TellDebug "("+STR$(envstep) + " )""speed:" + STR$(speed) + " devi:" + STR$(devi(envstep)) + " chance:" + STR$(chance(envstep)) Granulatormessage envstep, speed, devi(envstep), chance(envstep), -1, 1, 1900, "buf" + FORMAT$(1 + envstep MOD 2, "0") CASE 5 INCR envstep: IF envstep > 5 THEN envstep = 1 chance(envstep) = (10 * chance(envstep) + 90)/11 speed = 25 + RND * 5 Granulatormessage envstep, speed, 1, chance(envstep), -1, 1,1900, "buf" + FORMAT$(1 + envstep MOD 2, "0") 'THE FOLLOWING WILL BE DONE MANUALLY ' dlyvol = MIN(0.48, ((timegettime - lastparttime)/120000) + MIN(1, ((timegettime - lastparttime)/10000) * SQR(is(@pVrbz03.nrec - 1).freq)/130)) ' b$ = "msg GMT mdly_invol" + STR$(dlyvol): SendPd %Playport, b$ ' Telldebug b$ + "=" + STR$(MIN(0.48, ((timegettime - lastparttime)/120000))) + " +" + STR$(MIN(1, ((timegettime - lastparttime)/10000) * SQR(is(@pVrbz03.nrec - 1).freq)/130)) ' fdbck = MIN(.47, fdbck * 1.02) ' b$ = "msg GMT mdly_fdbck" + STR$(fdbck): SendPd %Playport, b$: Telldebug b$ IF (timegettime - lastparttime) > 60000 THEN stoptask this 'GMT stops here - manaully ctrl PD patch for end.. CASE ELSE END SELECT END FUNCTION FUNCTION CBAct(param1 AS DWORD, param2 AS DWORD) AS LONG LOCAL buf$ LOCAL bufasciiz AS ASCIIZ * 40 LOCAL pString AS STRING PTR LOCAL i AS LONG SELECT CASE param1 CASE %verbz03_udpclosed MSGBOX "UDP WINDOW CLOSED", ,"ERROR" Stoptask %verbz03master CASE %verbz03_newsample pString = param2 buf$ = @pString bufasciiz = PARSE$(buf$, ",", 1) i = checklevel(bufasciiz) CONTROL SET TEXT gh.cockpit, %GMT_TEXT0_ID + 11, "duur:" + STR$(i) IF i THEN is(@pVrbz03.nrec + 1).naam = PARSE$(buf$, ",", 1) 'use nrec + 1; as soon as nrec is increased this data can be accessed by other functions.. is(@pVrbz03.nrec + 1).freq = VAL(PARSE$(buf$, ",", 2)) is(@pVrbz03.nrec + 1).duur = i @pVrbz03.lastfreq = is(@pVrbz03.nrec + 1).freq IF ISFALSE @pVrbz03.avgfreq THEN @pVrbz03.avgfreq = @pVrbz03.lastfreq @pVrbz03.avgfreq = (6 * @pVrbz03.avgfreq + @pVrbz03.lastfreq) / 7 IF @pVrbz03.lastrectime THEN @pVrbz03.avdt = MIN (%maxxpectedavgdt, (3 * @pVrbz03.avdt + (timegettime - (@pvrbz03.lastrectime + is(@pVrbz03.nrec + 1).duur))) / 4) @pVrbz03.lastdt = timegettime - @pvrbz03.lastrectime buf$ = "msg GMT avgdt" + STR$(@pVrbz03.avdt) 'for debugging SendPD %Playport, buf$ ' END IF @pVrbz03.lastrectime = timegettime INCR @pVrbz03.nrec TellDebug "Sample" + STR$(@pVrbz03.nrec + 1) + ".duur:" + STR$(is(@pVrbz03.nrec + 1).duur) ELSE KILL bufasciiz END IF ' CASE %verbz03_inpfreq ' IF param2 > 440 THEN ' param2 = param2 / 2 'usually onl happens on feedback ' telldebug "unusually high inputfreq - reset!" ' END IF ' @pVrbz03.lastfreq = param2 ' IF ISFALSE @pVrbz03.avgfreq THEN @pVrbz03.avgfreq = @pVrbz03.lastfreq ' @pVrbz03.avgfreq = (6 * @pVrbz03.avgfreq + @pVrbz03.lastfreq) / 7 ' TellDebug "inpfreq:" + STR$(@pVrbz03.lastfreq) END SELECT END FUNCTION FUNCTION checklevel(fn AS ASCIIZ * 40) AS LONG 'returns 0 if level too low/file 2 short; otherwise duration in ms LOCAL track AS LONG LOCAL einde AS DWORD LOCAL pDat AS INTEGER PTR LOCAL f AS LONG REPLACE "/" WITH "\" IN fn 'sometimes we get an headers-only file here, so we check for lof here.. f = FREEFILE OPEN "" + fn FOR INPUT AS f IF LOF(f) < 88200 THEN 'min halve seconde. CLOSE f EXIT FUNCTION ELSE CLOSE f END IF track = ReadWaveData(fn) IF track < 0 THEN EXIT FUNCTION einde = WavHdr(track).lpData + WavHdr(track).dwBufferlength pDat = WavHdr(track).lpData DO IF ABS(@pDat) > 500 THEN FUNCTION = INT(WavHdr(track).dwBufferLength / 176.4) '(4 * 44.1) WavHdr(track).dwflags = 0 ResizeAudioTrack track, 0 EXIT FUNCTION END IF INCR pDat LOOP WHILE pDat < einde WavHdr(track).dwflags = 0 ResizeAudioTrack track, 0 FUNCTION = 0 END FUNCTION FUNCTION Verbz_Wave2Env (BYVAL track AS LONG) EXPORT AS LONG 'use recurcively for better result 'gives deriberately dirty result! (for artistik purposes..) LOCAL SamCount AS LONG LOCAL pSamp AS INTEGER PTR LOCAL pPrevL AS INTEGER PTR LOCAL buf AS INTEGER LOCAL MaxSam AS LONG LOCAL pk AS LONG FUNCTION = %false MaxSam = WavHdr(track).dwBufferlength SHIFT RIGHT MaxSam, 2 'left channel --------------------- pSamp = WavHdr(track).lpData @pSamp = 0 pPrevL = pSamp INCR pSamp: INCR pSamp BIT SET SamCount, 0 DO @pSamp = INT((100*ABS(@pPrevL) + 50 * buf + ABS(@pSamp)) / 151) 'INT((500*ABS(@pPrevL) + 500 * buf + ABS(@pSamp)) / 1001) INCR pSamp: INCR pSamp INCR pPrevL: INCR pPrevL INCR SamCount LOOP WHILE SamCount < MaxSam '(MaxSam - 4000) if fade out applied 'right channel --------------------- pSamp = WavHdr(track).lpData: INCR psamp @pSamp = 0 pPrevL = pSamp INCR pSamp: INCR pSamp SamCount = 1 DO @pSamp = INT((100*ABS(@pPrevL) + 50 * buf + ABS(@pSamp)) / 151) 'INT((500*ABS(@pPrevL) + 500 * buf + ABS(@pSamp)) / 1001) INCR pSamp: INCR pSamp INCR pPrevL: INCR pPrevL INCR SamCount LOOP WHILE SamCount < MaxSam '(MaxSam - 4000) if fade out applied 'IS FADE OUT NECESSARY? - TRY WITHOUT - !! IF restored do l/r separately as above!!!!!!! ' 'fade out tail ' DO ' @pSamp = INT((100*ABS(@pPrevL) + 50 * buf + ABS(@pSamp)) / 151) 'INT((500*ABS(@pPrevL) + 500 * buf + ABS(@pSamp)) / 1001) ' @pSamp = @pSamp * ((MaxSam - Samcount) / 4000) ^ 2 '' buf = @pPrevl ' INCR pSamp ' INCR pPrevL: INCR pPrevL ' @pSamp = -@pPrevL ' @pSamp = @pSamp * ((MaxSam - Samcount) / 4000) ^ 2 ' INCR pSamp ' INCR SamCount ' LOOP WHILE SamCount < MaxSam FUNCTION = %true END FUNCTION FUNCTION Verbz_WindowedSincLPFilter(track AS LONG, BYVAL pts AS LONG, BYVAL cutoff AS SINGLE) AS LONG ' '224 pt windowed sinc lowpass filter, in place.. 'very nice with low square.. DIM h(pts) AS LOCAL SINGLE REGISTER i AS LONG REGISTER j AS LONG REGISTER mx AS EXT LOCAL arr() AS SINGLE LOCAL pdest AS INTEGER PTR ' local pdata as integer ptr ' cutoff = cutoff / %CD_SR ResizeAudioTrack track, (TrackDuration(track) + 6) DIM arr(WavHdr(track).dwBufferlength/4) pDest = WavHdr(track).lpData 'compute filter kernel FOR i = 1 TO pts IF i = pts/2 THEN h(i) = Pi2 * cutoff ITERATE FOR END IF h(i) = SIN(Pi2 * cutoff * (i - pts/2)) / (i - pts/2) '14 = nr of samples in kernel h(i) = h(i) * (.42 - .5 * COS(Pi2 * i / pts ) + .08 * COS(Pi2 * 2 * i / pts )) mx = mx + h(i) NEXT FOR i = 1 TO UBOUND(h) h(i) = h(i) / mx ' msgbox str$(h(i)) NEXT FOR j = pts/2 TO WavHdr(track).dwBufferlength / 4 - 1 FOR i = 1 TO UBOUND(h) arr(j) = arr(j) + @pDest[j * 2 - i] * h(i) mx = MAX(mx, arr(j), -arr(j)) NEXT NEXT FOR j = 0 TO UBOUND(arr) arr(j) = (arr(j) / mx) * &H6000 @pDest[j * 2] = INT(arr(j)) @pDest[j * 2 + 1] = - INT(arr(j)) NEXT END FUNCTION SUB GranulatorMessage(BYVAL nr AS INTEGER, BYVAL fmin AS SINGLE, BYVAL fdelta AS SINGLE, BYVAL soundpct AS SINGLE, BYVAL sharpness AS SINGLE, BYVAL rdpoint AS LONG, _ BYVAL rdfwd AS LONG, BYVAL arrayname AS STRING) 'sends granulator params to pd. use -1 for params you don't want to change LOCAL buf$ 'params can be negative! hence chr$ might start with "-" in stead of " " buf$ = "gran " + TRIM$(STR$(nr)) + " list " + TRIM$(STR$(fmin)) + " " + TRIM$(STR$(fdelta)) + " " + TRIM$(STR$(soundpct)) + " " + TRIM$(STR$(sharpness)) + " " buf$ = buf$ + TRIM$(STR$(rdpoint)) + " " + TRIM$(STR$(rdfwd)) + " " + arrayname + CHR$(10) Sendpd %Playport, buf$ ' TellDebug "GRANMSG: " + buf$ END SUB SUB EnvMessage(id AS LONG, envnr AS LONG) LOCAL buf$ envnr = MAX(1, envnr) ' "GMT" is ignored here.. "list" would be correct in PD, but it's ignored by the messagebox it's send to anyway ' there just needs to be smething there.. IF id < 6 THEN buf$ = "msg GMT esh_cfrq" + FORMAT$(id, "00") + STR$(es(envnr).freq) ELSE buf$ = "msg GMT esh_cfrq" + FORMAT$(id, "00") + STR$(es(envnr).freq / 4) END IF SendPd %Playport, buf$ buf$ = "msg GMT filen" + FORMAT$(id, "00") + " " + $pathgmt + es(envnr).naam + CHR$(10) '"E1.wav" + CHR$(10) SendPd %PlayPort, buf$ ' TellDebug "ENVMSG: " + buf$ END SUB SUB TellDebug (b AS STRING) #IF %DEF(%dbgon) STATIC buf AS STRING * 32000 STATIC f AS LONG STATIC init AS LONG IF ISFALSE init THEN init = %true f = FREEFILE OPEN "c:\b\pb\gmt\kristof\verbzr03\maindebuglog"+ DATE$ + ".dat" FOR OUTPUT AS f Telldebug "Start Debug at " + DATE$ + " " + TIME$ END IF PRINT #f, TIME$, b buf = TIME$ + " - " + b + $CRLF + buf CONTROL SET TEXT hdbg, 1, TRIM$(buf) #ENDIF END SUB