Skip to content

UGens for accessing long buffers with subsample accuracy

License

Notifications You must be signed in to change notification settings

elgiano/super-bufrd

 
 

Repository files navigation

super-bufrd

UGens for accessing long buffers with subsample accuracy:

  • SuperBufRd A modification of BufRd to be able to access samples with double precision
  • SuperPhasor A new phasor UGen to drive a SuperBufRd
  • SuperPhasorX A new phasor UGen to drive multiple SuperBufRds with crossfading to allow for click-free looping and position jumping
  • SuperBufFrames A modification of BufFrames
  • SuperIndex A sclang class to communicate position information with these UGens
  • SuperPlayBuf A pseudo-ugen wrapper around a SuperPhasor and SuperBufRd, similar to PlayBuf
  • SuperPlayBufDetails Same thing but outputs the phasor information as well as audio signal
  • SuperPlayBufX / SuperPlayBufXDetails Like SuperPlayBuf/SuperPlayBufDetails but offers crossfading at loop points and on jumping to a new position

Full spec / documentation of classes here

This implementation is a work in progress. If you find bugs or have feature requests please submit an issue!

Simple example usage of SuperPlayBufX pseudo-ugen

// sound file up to 2139095040 samples long (i.e. up to 12 hours long at 48k)
~buf = Buffer.read(s, "path/to/long/soundfile.wav", action: { "OK, loaded!".postln });

// wait for buffer to load then play it on a loop, mouse controls speed from 5x forward to 5x in reverse
x = { |t_trig=0, pos=#[0,0]| SuperPlayBufX.ar(2, ~buf, MouseX.kr(-5, 5), cuePos:pos, cueTrig:t_trig) }.play;

// jump to a certain position in seconds:
x.set(\pos, ~buf.atSec(230.704), \t_trig, 1);

More elaborate example with playhead

~buf = Buffer.read(s, "path/to/long/soundfile.wav", action: { "OK, loaded!".postln });

(
~synth = {
  var cuePos = \cuePos.kr([0, 0]);
  var cueTrig = \cueTrig.tr(0);
  var rate = MouseX.kr(-12, 12);
  var lpf_freq = rate.abs.linlin(1, 3, 20000, 5000); // make fast forward less grating on ears
  var sig, playhead, isPlaying;
  #sig, playhead, isPlaying = SuperPlayBufXDetails.ar(2, ~buf, rate, cuePos: cuePos, cueTrig: cueTrig);
  SendTrig.ar(Impulse.ar(10), 0, playhead[0]); // send integer component of playhead
  LPF.ar(sig, lpf_freq);
}.play;

// print the elapsed time:
OSCdef(\trig, { |msg|
  if (msg[2] == 0) {
    ("Start: %       Playhead: %       End: %".format(
      0.asTimeString,
      ~buf.atPair([msg[3], 0]).asSecs.asTimeString,
      ~buf.duration.asTimeString)
    ).postln;
  };
}, '/tr');
)

~synth.set(\cuePos, ~buf.atSec(60 * 10), \cueTrig, 1) // 10 minutes in
~synth.set(\cuePos, ~buf.atSec(60 * 40), \cueTrig, 1) // 40 minutes in
~synth.set(\cuePos, ~buf.atSec(60 * 60), \cueTrig, 1) // 1 hour in

Mac / Linux build instructions

  • On a Mac, make sure you have Xcode command-line tools installed
  • Make sure you have a copy of the SuperCollider source code

Run the following commands in a terminal:

git clone https://github.com/esluyter/super-bufrd.git
cd super-bufrd
mkdir build
cd build
cmake -DSC_PATH=/path/to/sc3source/ ..
cmake -DCMAKE_BUILD_TYPE=RELEASE ..
make

Move the super-bufrd folder into your Platform.userExtensionDir and recompile sclang.

Windows build instructions

I'm not a Windows expert, but these are the steps that worked for me on a 64-bit version of Windows 10. If you have a 32-bit version, omit the "Win64" from the first cmake line below.

  • Install git
  • Install cmake
  • Install visual studio community 2017 / Desktop development with C++
  • Make sure you have a copy of the SuperCollider source code

Run the following commands in git bash:

git clone https://github.com/esluyter/super-bufrd
cd super-bufrd
mkdir build
cd build
cmake -G "Visual Studio 15 2017 Win64" -DSC_PATH=/path/to/sc3source ..
cmake --build . --config Release

Move the super-bufrd folder into your Platform.userExtensionDir and recompile sclang.

About

UGens for accessing long buffers with subsample accuracy

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 92.0%
  • SuperCollider 6.7%
  • CMake 1.3%