From b897857daec1a544699e0b4bd5219b15826d5935 Mon Sep 17 00:00:00 2001 From: Pierre Alexandre Tremblay Date: Thu, 31 Jan 2019 11:46:19 +0000 Subject: [PATCH] added example folder in the package, plus typos --- .../HelpSource/Classes/FluidBufCompose.schelp | 2 +- .../HelpSource/Classes/FluidBufHPSS.schelp | 101 +++++++++--------- .../Classes/FluidBufTransients.schelp | 5 +- .../HelpSource/Classes/FluidGain.schelp | 22 ++-- .../HelpSource/Classes/FluidHPSS.schelp | 31 +++--- .../HelpSource/Classes/FluidSTFTPass.schelp | 32 +++--- .../Classes/FluidTransientSlice.schelp | 1 - .../buffer_compositing/fileiterator.sc | 37 +++++++ .../ignore/Examples/nmf/JiT-NMF.scd | 57 ++++++++++ 9 files changed, 188 insertions(+), 100 deletions(-) create mode 100644 release-packaging/ignore/Examples/buffer_compositing/fileiterator.sc create mode 100644 release-packaging/ignore/Examples/nmf/JiT-NMF.scd diff --git a/release-packaging/HelpSource/Classes/FluidBufCompose.schelp b/release-packaging/HelpSource/Classes/FluidBufCompose.schelp index 43e9b31..01c6493 100644 --- a/release-packaging/HelpSource/Classes/FluidBufCompose.schelp +++ b/release-packaging/HelpSource/Classes/FluidBufCompose.schelp @@ -183,4 +183,4 @@ f.play; // compare with the original b.play; - :: \ No newline at end of file +:: diff --git a/release-packaging/HelpSource/Classes/FluidBufHPSS.schelp b/release-packaging/HelpSource/Classes/FluidBufHPSS.schelp index dae40e5..57e9398 100644 --- a/release-packaging/HelpSource/Classes/FluidBufHPSS.schelp +++ b/release-packaging/HelpSource/Classes/FluidBufHPSS.schelp @@ -115,55 +115,54 @@ Discussion:: EXAMPLES:: code:: - //load buffers - ( - b = Buffer.read(s,File.realpath(FluidBufHPSS.class.filenameSymbol).dirname.withTrailingSlash ++ "../AudioFiles/Tremblay-AaS-SynthTwoVoices-M.wav"); - c = Buffer.new(s); - d = Buffer.new(s); - e = Buffer.new(s); - ) - - // run with basic parameters - ( - Routine{ - t = Main.elapsedTime; - FluidBufHPSS.process(s, b.bufnum, harmBufNum: c.bufnum, percBufNum: d.bufnum); +//load buffers +( + b = Buffer.read(s,File.realpath(FluidBufHPSS.class.filenameSymbol).dirname.withTrailingSlash ++ "../AudioFiles/Tremblay-AaS-SynthTwoVoices-M.wav"); + c = Buffer.new(s); + d = Buffer.new(s); + e = Buffer.new(s); +) + +// run with basic parameters +( + Routine{ + t = Main.elapsedTime; + FluidBufHPSS.process(s, b.bufnum, harmBufNum: c.bufnum, percBufNum: d.bufnum); + s.sync; + (Main.elapsedTime - t).postln; + }.play +) + +//query and play the harmonic +c.query; +c.play; +//querry and play the percussive +d.query; +d.play; + +//nullsumming tests +{(PlayBuf.ar(1,c.bufnum))+(PlayBuf.ar(1,d.bufnum))+(-1*PlayBuf.ar(1,b.bufnum,doneAction:2))}.play + +//more daring parameters, in mode 2 +( + Routine{ + t = Main.elapsedTime; + FluidBufHPSS.process(s, b.bufnum, harmBufNum: c.bufnum, percBufNum: d.bufnum, resBufNum:e.bufnum, harmFiltSize:31, modeFlag:2, htf1: 0.005, hta1: 7.5, htf2: 0.168, hta2: 7.5, ptf1: 0.004, pta1: 26.5, ptf2: 0.152, pta2: 26.5); s.sync; - (Main.elapsedTime - t).postln; - }.play - ) - - //query and play the harmonic - c.query; - c.play; - //querry and play the percussive - d.query; - d.play; - - //nullsumming tests - {(PlayBuf.ar(1,c.bufnum))+(PlayBuf.ar(1,d.bufnum))+(-1*PlayBuf.ar(1,b.bufnum,doneAction:2))}.play - - //more daring parameters, in mode 2 - ( - Routine{ - t = Main.elapsedTime; - FluidBufHPSS.process(s, b.bufnum, harmBufNum: c.bufnum, percBufNum: d.bufnum, resBufNum:e.bufnum, harmFiltSize:31, modeFlag:2, htf1: 0.005, hta1: 7.5, htf2: 0.168, hta2: 7.5, ptf1: 0.004, pta1: 26.5, ptf2: 0.152, pta2: 26.5); - s.sync; - (Main.elapsedTime - t).postln; - }.play - ) - - //query and play the harmonic - c.query; - c.play; - //query and play the percussive - d.query; - d.play; - //query and play the residual - e.query; - e.play; - - //still nullsumming - {PlayBuf.ar(1,c.bufnum) + PlayBuf.ar(1,d.bufnum) + PlayBuf.ar(1,e.bufnum) - PlayBuf.ar(1,b.bufnum,doneAction:2)}.play; - :: - \ No newline at end of file + (Main.elapsedTime - t).postln; + }.play +) + +//query and play the harmonic +c.query; +c.play; +//query and play the percussive +d.query; +d.play; +//query and play the residual +e.query; +e.play; + +//still nullsumming +{PlayBuf.ar(1,c.bufnum) + PlayBuf.ar(1,d.bufnum) + PlayBuf.ar(1,e.bufnum) - PlayBuf.ar(1,b.bufnum,doneAction:2)}.play; +:: diff --git a/release-packaging/HelpSource/Classes/FluidBufTransients.schelp b/release-packaging/HelpSource/Classes/FluidBufTransients.schelp index 812e9a6..1e5b3dd 100644 --- a/release-packaging/HelpSource/Classes/FluidBufTransients.schelp +++ b/release-packaging/HelpSource/Classes/FluidBufTransients.schelp @@ -109,7 +109,4 @@ Routine{ (Main.elapsedTime - t).postln; }.play ) - :: - - - \ No newline at end of file +:: diff --git a/release-packaging/HelpSource/Classes/FluidGain.schelp b/release-packaging/HelpSource/Classes/FluidGain.schelp index eb54159..b039a81 100644 --- a/release-packaging/HelpSource/Classes/FluidGain.schelp +++ b/release-packaging/HelpSource/Classes/FluidGain.schelp @@ -28,14 +28,14 @@ RETURNS:: EXAMPLES:: Summing with the inverse (gain of -1) with a delay of the latency gives us CPU-expensive silence. - CODE:: - { var source = PinkNoise.ar(0.1); DelayN.ar(source,delaytime:1000/s.sampleRate) + FluidGain.ar(source,1000,-1); }.play - :: - Varying the gain at audio rate. - CODE:: - { FluidGain.ar(PinkNoise.ar(0.1), gain:LFTri.ar(1)) }.play - :: - Varying the gain at comtrol rate, in beautiful stereo. - CODE:: - { FluidGain.ar(SinOsc.ar([222,333],mul:0.1), gain:LFTri.kr([0.5,0.7])) }.play - :: +CODE:: +{ var source = PinkNoise.ar(0.1); DelayN.ar(source,delaytime:1000/s.sampleRate) + FluidGain.ar(source,1000,-1); }.play +:: +Varying the gain at audio rate. +CODE:: +{ FluidGain.ar(PinkNoise.ar(0.1), gain:LFTri.ar(1)) }.play +:: +Varying the gain at comtrol rate, in beautiful stereo. +CODE:: +{ FluidGain.ar(SinOsc.ar([222,333],mul:0.1), gain:LFTri.kr([0.5,0.7])) }.play +:: diff --git a/release-packaging/HelpSource/Classes/FluidHPSS.schelp b/release-packaging/HelpSource/Classes/FluidHPSS.schelp index deff4aa..418cbd4 100644 --- a/release-packaging/HelpSource/Classes/FluidHPSS.schelp +++ b/release-packaging/HelpSource/Classes/FluidHPSS.schelp @@ -89,24 +89,23 @@ Discussion:: EXAMPLES:: CODE:: - //load a soundfile to play - b = Buffer.read(s,File.realpath(FluidHPSS.class.filenameSymbol).dirname.withTrailingSlash ++ "../AudioFiles/Tremblay-AaS-SynthTwoVoices-M.wav"); +//load a soundfile to play +b = Buffer.read(s,File.realpath(FluidHPSS.class.filenameSymbol).dirname.withTrailingSlash ++ "../AudioFiles/Tremblay-AaS-SynthTwoVoices-M.wav"); - // run with basic parameters (left is harmonic, right is percussive) - {FluidHPSS.ar(PlayBuf.ar(1,b.bufnum,loop:1))}.play +// run with basic parameters (left is harmonic, right is percussive) +{FluidHPSS.ar(PlayBuf.ar(1,b.bufnum,loop:1))}.play - // run in mode 1 - {FluidHPSS.ar(PlayBuf.ar(1,b.bufnum,loop:1),17,31,1,0.05,40,0.1,-40)}.play +// run in mode 1 +{FluidHPSS.ar(PlayBuf.ar(1,b.bufnum,loop:1),17,31,1,0.05,40,0.1,-40)}.play - // run in mode 2m listening to - //the harmonic stream - {FluidHPSS.ar(PlayBuf.ar(1,b.bufnum,loop:1),17,31,2,0.05,40,0.1,-40, 0.1, -10, 0.2, 10)[0].dup}.play - // the percussive stream - {FluidHPSS.ar(PlayBuf.ar(1,b.bufnum,loop:1),17,31,2,0.05,40,0.1,-40, 0.1, -10, 0.2, 10)[1].dup}.play - // the residual stream - {FluidHPSS.ar(PlayBuf.ar(1,b.bufnum,loop:1),17,31,2,0.05,40,0.1,-40, 0.1, -10, 0.2, 10)[2].dup}.play +// run in mode 2m listening to +//the harmonic stream +{FluidHPSS.ar(PlayBuf.ar(1,b.bufnum,loop:1),17,31,2,0.05,40,0.1,-40, 0.1, -10, 0.2, 10)[0].dup}.play +// the percussive stream +{FluidHPSS.ar(PlayBuf.ar(1,b.bufnum,loop:1),17,31,2,0.05,40,0.1,-40, 0.1, -10, 0.2, 10)[1].dup}.play +// the residual stream +{FluidHPSS.ar(PlayBuf.ar(1,b.bufnum,loop:1),17,31,2,0.05,40,0.1,-40, 0.1, -10, 0.2, 10)[2].dup}.play - // null test (the process add a latency of ((harmFiltSize + (winSize / hopSize) - 1) * hopSize) samples - {var sig = PlayBuf.ar(1,b.bufnum,loop:1); [FluidHPSS.ar(sig,17,31, winSize:1024,hopSize:512,fftSize:2048).sum - DelayN.ar(sig, 1, ((31 + 1) * 512 / s.sampleRate))]}.play +// null test (the process add a latency of ((harmFiltSize + (winSize / hopSize) - 1) * hopSize) samples +{var sig = PlayBuf.ar(1,b.bufnum,loop:1); [FluidHPSS.ar(sig,17,31, winSize:1024,hopSize:512,fftSize:2048).sum - DelayN.ar(sig, 1, ((31 + 1) * 512 / s.sampleRate))]}.play :: - \ No newline at end of file diff --git a/release-packaging/HelpSource/Classes/FluidSTFTPass.schelp b/release-packaging/HelpSource/Classes/FluidSTFTPass.schelp index 67c6806..1bc8260 100644 --- a/release-packaging/HelpSource/Classes/FluidSTFTPass.schelp +++ b/release-packaging/HelpSource/Classes/FluidSTFTPass.schelp @@ -31,19 +31,19 @@ RETURNS:: EXAMPLES:: - Summing with the inverse (gain of -1) with a delay of the latency gives us CPU-expensive silence. - CODE:: - { var source = PinkNoise.ar(0.1); DelayN.ar(source, delaytime:1024/s.sampleRate, mul: -1) + FluidSTFTPass.ar(source, 1024, 256, 1024); }.play - :: - Larger, oversampled, FFT - CODE:: - { FluidSTFTPass.ar(PinkNoise.ar(0.1), 2048, 128, 8192) }.play - :: - Stereo Input Tests. - CODE:: - { FluidSTFTPass.ar([SinOsc.ar(222,mul: 0.1), PinkNoise.ar(Decay.ar(Impulse.ar(0.666,mul: 0.2), 0.5))], fftSize:1024)}.play - :: - Stereo Parameter Tests. - CODE:: - { FluidSTFTPass.ar(SinOsc.ar(222,mul: 0.1), [1024,8192],256,8192)}.play - :: +Summing with the inverse (gain of -1) with a delay of the latency gives us CPU-expensive silence. +CODE:: +{ var source = PinkNoise.ar(0.1); DelayN.ar(source, delaytime:1024/s.sampleRate, mul: -1) + FluidSTFTPass.ar(source, 1024, 256, 1024); }.play +:: +Larger, oversampled, FFT +CODE:: +{ FluidSTFTPass.ar(PinkNoise.ar(0.1), 2048, 128, 8192) }.play +:: +Stereo Input Tests. +CODE:: +{ FluidSTFTPass.ar([SinOsc.ar(222,mul: 0.1), PinkNoise.ar(Decay.ar(Impulse.ar(0.666,mul: 0.2), 0.5))], fftSize:1024)}.play +:: +Stereo Parameter Tests. +CODE:: +{ FluidSTFTPass.ar(SinOsc.ar(222,mul: 0.1), [1024,8192],256,8192)}.play +:: diff --git a/release-packaging/HelpSource/Classes/FluidTransientSlice.schelp b/release-packaging/HelpSource/Classes/FluidTransientSlice.schelp index 2b9ea03..326f75b 100644 --- a/release-packaging/HelpSource/Classes/FluidTransientSlice.schelp +++ b/release-packaging/HelpSource/Classes/FluidTransientSlice.schelp @@ -71,4 +71,3 @@ b = Buffer.read(s,File.realpath(FluidTransientSlice.class.filenameSymbol).dirnam }.play ) :: - diff --git a/release-packaging/ignore/Examples/buffer_compositing/fileiterator.sc b/release-packaging/ignore/Examples/buffer_compositing/fileiterator.sc new file mode 100644 index 0000000..89cf368 --- /dev/null +++ b/release-packaging/ignore/Examples/buffer_compositing/fileiterator.sc @@ -0,0 +1,37 @@ +//destination buffer +b = Buffer.alloc(s,1); +c = Array.new(); + +//this patch requests a folder and will iterate through all accepted audiofiles and concatenate them in the destination buffer. It will also yield an array with the numFrame where files start in the new buffer. + +( +var tempbuf,dest=0, fileNames; + +FileDialog.new({|selection| + var total; + fileNames = PathName.new(selection[0]) + .entries + .select({|f| + [\wav, \WAV, \mp3,\aif].includes(f.extension.asSymbol);}); + total = fileNames.size() - 1; + Routine{ + fileNames.do{|f, i| + f.postln; + ("Loading"+i+"of"+total).postln; + tempbuf = Buffer.read(s,f.asAbsolutePath); + s.sync; + c = c.add(dest); + FluidBufCompose.process(s,tempbuf.bufnum,dstStartAtA:dest,srcBufNumB:b.bufnum,dstBufNum:b.bufnum); + s.sync; + b.updateInfo(); + s.sync; + dest = b.numFrames; + }; + "load buffers done".postln; + }.play; +}, fileMode:2); +) + +b.plot +c.postln +b.play diff --git a/release-packaging/ignore/Examples/nmf/JiT-NMF.scd b/release-packaging/ignore/Examples/nmf/JiT-NMF.scd new file mode 100644 index 0000000..bb137ba --- /dev/null +++ b/release-packaging/ignore/Examples/nmf/JiT-NMF.scd @@ -0,0 +1,57 @@ +s.reboot + +//this patch does just-in-time nmf processes on buffer, faking a slightly delayed real-time version of it +//what is happening: +//a circular buffer is doing a fake real time - every half second, it sends a frame to be proceesed by NMF~, requesting 3 ranks. Because this latter process is randomly seeded and not sorted, the 3 ranks are not getting similar results each time, hence the random pan + +( +b = Buffer.alloc(s,s.sampleRate * 2); +c = Buffer.new(s,0,3); +d = Buffer.new(s,0,3); +e = Buffer.read(s,File.realpath(FluidBufNMF.class.filenameSymbol).dirname.withTrailingSlash ++ "../AudioFiles/Nicol-LoopE-M.wav"); +g = Bus.audio(s,1); +h = Buffer.loadCollection(s, Signal.rectWindow(22491).fade(0,440).fade(22049,22489,1,0).put(22490,0)); + +SynthDef(\becauseIcan,{arg bufnum = 0, nmfa = 0, nmfb = 0, input = 0, env = 0; + var head, head2, duration, audioin, halfdur; + duration = BufFrames.kr(bufnum) / 2; + halfdur = duration / 2; + head = Phasor.ar(0,1,0,duration); + head2 = (head + halfdur) % duration; + + // circular buffer writer + audioin = In.ar(input,1); + BufWr.ar(audioin,bufnum,head,0); + BufWr.ar(audioin,bufnum,head+duration,0); + + // cue the calculations via the language + SendReply.ar(head > 500, '/processplease',2); + SendReply.ar(head > (halfdur + 500), '/processplease',1); + + // read the 2 buffers with an envelop + Out.ar(0, Splay.ar(BufRd.ar(3,nmfa,head,0,1) * BufRd.ar(1,env,head,0,1)) + Splay.ar(BufRd.ar(3,nmfb,head2,0,1) * BufRd.ar(1,env,head2,0,1))); +}).add; + +SynthDef(\playa, { arg output = 0, bufnum = 0; + Out.ar(output,PlayBuf.ar(1,bufnum,loop:1)); +}).add; +) + +// instantiate the player +x = Synth(\playa,[\output, g.index, \bufnum, e.bufnum]); + +// instantiate the processor +y = Synth(\becauseIcan,[\bufnum, b.bufnum, \nmfa, c.bufnum, \nmfb, d.bufnum, \input, g.index, \env, h.bufnum], x, 'addAfter'); + +// instantiate the listener to cue the processing from the language side +( +w = OSCFunc({ arg msg; + if(msg[3]== 1, { + FluidBufNMF.process(s, b.bufnum, nFrames: 22500, dstBufNum: c.bufnum, rank: 3, fftSize: 1024, winSize: 512, hopSize: 256); + }, { + FluidBufNMF.process(s, b.bufnum, 22050, 22500, dstBufNum: d.bufnum, rank: 3, fftSize: 1024, winSize: 512, hopSize: 256); + });}, '/processplease', s.addr); +) + +// stop it all +b.free;c.free;d.free;e.free;f.free;g.free;w.clear;x.free; y.free;