Make sample view more responsive
authorEugene Petkevich <nasedil.genio.code@gmail.com>
Wed, 18 May 2022 11:47:47 +0000 (14:47 +0300)
committerEugene Petkevich <nasedil.genio.code@gmail.com>
Wed, 18 May 2022 11:47:47 +0000 (14:47 +0300)
extensions/classes/sampler.sc

index c7c2aa4..c2beef1 100644 (file)
@@ -2,7 +2,7 @@ Sampler {
   const <version = "33.7.4.2";
   var <name, <server, <maxDur, <>freq, <>tunerSynthdefName, <synthdefName, <recsynthdefName;
   var <buf, <recsynthdef, <playsynthdef, <startPos, <duration, <window;
-  var plotter, recSynth, playsTuner, tunerSynth, startTime, playSynth;
+  var <>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