ReaCollider - Use Reaper from within SuperCollider

Hello

Some time I ago I forked the super nice work of James Bradbury and we made this package ReaCollider which initially was made to generate projects from within SuperCollider. I just pushed an update containing documentation as well as some new features.

Features:

  • Generate Reaper Projects from SuperCollider
  • Batch convert sound files using Reaper
  • Run Reaper’s command line interface from withing SuperCollider

See the Reaper category within the SuperCollider help system for a full overview of the included classes.

13 Likes

would love to see you using this in a stream at some point!

1 Like

Good idea!

For now though there is some info in the help files

Wow! I haven’t tried this yet, but I started building things like this for both Bitwig and Reaper (probably much more simply and not as well done). BTW, I just ended up using a multi-track wav and recording to that, then bring into Reaper which works for my needs, but excited to try this out. Thanks for this!

Incredible stuff! This is going to be some magic. Can’t wait to make some sounds with it. Thanks Mads.

Cool!
Took it for a few spins. I tried to create 100,000 items at one point and after 2 hours of hanging decided to kill the process. So, I think there may be practical limitations (ha ha).

After a while I decided I wanted to
Lay out 1000 grains of the sample across 10 tracks in a density pattern determined by a sin curve (with a given frequency). Arrange the grains in such a way that they play back the sample in the correct order and at a certain speed.

3 Likes

Haha that’s so cool. Well done John!!!

If you feel like sharing some code for it here then go ahead !

Sure!
I adopted from the help files, but I found that there was a discrepancy regarding what would work to access the /sounds folder. Maybe that is an OS thing?



(
var project = ReaProj.new;
var numTracks = 10;
var tracks = numTracks.collect{|i|
	var props = ();
	// Track name
	props.put(\NAME, "supercollider_track_%".format(i));
	ReaTrack.new(props)
};

// A sound source
var aSoundSource = Platform.resourceDir +/+ "sounds/a11wlk01.wav";
var sourceInfo = SoundFile.openRead(aSoundSource).close;

~itemPlacement = 0.0;

// Add tracks
tracks.do{|track, index|
	project.addTrack(track);
};

100.do({ arg count;
	tracks.do({ arg track, index;
		var itemProperties, duration, anItem, overlap, totalCount;
		
		duration = sourceInfo.duration * 0.01;
		totalCount = count * 10 + index;
		totalCount = totalCount.linlin(0, 999, 0, 2pi);
		overlap = ( sin(totalCount * 14) ).linlin(-1, 1, 0.3, 2);
		overlap = overlap.reciprocal.postln;
		itemProperties = (
			NAME: PathName(aSoundSource).fileNameWithoutExtension,
			PLAYRATE: rrand(0.99, 1.01).asString + "0 0.000 -1",
			LOOP: "1",
			TAKEVOLPAN: rrand(-1, 1).asString + rrand(0.01, 0.1).asString + 0,
			// SOFFS: sourceInfo.duration * rrand(0.0, 1.0),
			SOFFS: sourceInfo.duration * totalCount.mod(pi/2).linlin(0, pi/2, 0, 1),
			FADEIN: "1" + (duration*0.25).asString + "0.0",
			FADEOUT: "1" + (duration*0.25).asString + "0.0"
		);
		
		~itemPlacement = ~itemPlacement + (overlap * duration);
		anItem = ReaItem.new(
			source:aSoundSource,
			start:~itemPlacement,
			length: duration,
			properties:itemProperties
		);
		track.addItem(anItem);
	});
});
// Create the project
project.write("~/test.rpp".standardizePath);

)
3 Likes

How does one go about accessing other parts of the project like this one:
<MASTERPLAYSPEEDENV
EGUID {D4629CF6-6F20-7C41-ADB2-D3B56AA3902B}
ACT 0 -1
VIS 0 1 1
LANEHEIGHT 0 0
ARM 0
DEFSHAPE 0 -1 -1

Would MASTERPLAYSPEEDENV need to be added to the chain as a “Node” that get formatted with the “<” and then have its own set of properties?