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;
}
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;
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;
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;
});
}
\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