From e7d39bbad5df1f9fb6587eb0b5c47a0c6b0f9646 Mon Sep 17 00:00:00 2001 From: Eugene Petkevich Date: Wed, 18 May 2022 14:47:47 +0300 Subject: [PATCH] Make sample view more responsive --- extensions/classes/sampler.sc | 49 +++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/extensions/classes/sampler.sc b/extensions/classes/sampler.sc index c7c2aa4..c2beef1 100644 --- a/extensions/classes/sampler.sc +++ b/extensions/classes/sampler.sc @@ -2,7 +2,7 @@ Sampler { const freq, <>tunerSynthdefName, plotter, recSynth, playsTuner, tunerSynth, startTime, playSynth, <>data, <>sampDiv, <>avgSize; *new { | name=\default, server=nil, maxDur=10, freq=220, tunerSynthdefName=\default, synthdefName=\samplerPlay, recsynthdefName=\samplerRecord | server = server ? Server.default; @@ -10,14 +10,10 @@ Sampler { } prInit { - version.postln; - name.postln; - server.postln; - maxDur.postln; - freq.postln; - startPos = 0; duration = 0; + sampDiv = 100; + avgSize = 5; buf = Buffer.alloc(server, server.sampleRate * maxDur, 1); recsynthdef = SynthDef(recsynthdefName, {| input, buf | var sig; @@ -41,6 +37,12 @@ Sampler { Rect(Window.screenBounds.width-600,Window.screenBounds.height-180,500,100); ); plotter = Plotter.new(name, Rect(0, 0, window.bounds.width, window.bounds.height), window); + plotter.findSpecs = false; + plotter.setValue([0], false, false); + plotter.plotMode = \plines; + plotter.specs = \bipolar.asSpec; + plotter.domainSpecs = [startPos, startPos+duration, \lin, 0, 0, "se"].asSpec; + plotter.refresh; window.front; ("Сэмплер «"++name++"» готов к использованию 😊").postln; @@ -67,7 +69,17 @@ Sampler { playsTuner = false; }); buf.loadToFloatArray(startPos*buf.sampleRate, duration*buf.sampleRate, action: { |array| - { plotter.value = array; }.defer; + data = array; + // resample and calculate moving average to make plot more consistent when browsing + data = data.resamp1(data.size/sampDiv); + data = data[..data.size-avgSize].collect{|item, index| + avgSize.collect{|i| data[index+i]}.sum / avgSize; + }; + { + plotter.setValue(data, false, false); + plotter.domainSpecs = [startPos, startPos+duration, \lin, 0, 0, "se"].asSpec; + plotter.refresh; + }.defer; }); } @@ -97,15 +109,26 @@ Sampler { \duration, duration, ]; } - shiftPos { |delta=0.1| + var playData, startSample, endSample; var endPos = startPos + duration; startPos = (startPos + delta).clip(0, endPos); duration = endPos - startPos; - buf.loadToFloatArray(startPos*buf.sampleRate, duration*buf.sampleRate, action: { |array| - if (array.size == 0, {array = [0]}); - { plotter.value = array; }.defer; - }); + startSample = startPos * buf.sampleRate / sampDiv; + endSample = startSample + ((duration * buf.sampleRate) / sampDiv); + playData = data[startSample.asInteger..endSample.asInteger]; + if (playData.size == 0, {playData = [0]}); + { + plotter.setValue(playData, false, false); + plotter.domainSpecs = [startPos, startPos+duration, \lin, 0, 0, "se"].asSpec; + plotter.refresh; + }.defer; } + // syntactic sugar + /* po + si + bi + ra*/ + } \ No newline at end of file -- 2.17.1