// (re)set the source buffers
(
~low = Buffer.sendCollection(s, (Signal.sineFill(4410, Array.fill(3,0) ++ 1)));
~mid =  Buffer.sendCollection(s, (Signal.sineFill(4410, Array.fill(12,0) ++ 1)));
~high = Buffer.sendCollection(s, (Signal.sineFill(4410, Array.fill(48,0) ++ 1)));
~piano = Buffer.read(s,File.realpath(FluidBufCompose.class.filenameSymbol).dirname.withTrailingSlash ++ "../AudioFiles/Tremblay-SA-UprightPianoPedalWide.wav",0,8820);
)

// draw the buffers to see what happened
(
~low.plot;
~mid.plot;
~high.plot;
~piano.plot;
)

// define the concatenation macro
(
~concat = {
	arg x;
	if(x.class != Array,
		{
			"Error - Needs an array as argument".postln;
		}, {
			Routine{
			for (1,x.size - 1, {
				arg i;
				FluidBufCompose.process(s,x[i],destination:x[0], destStartFrame:x[0].numFrames);
			});
			"Done!".postln;
			}.play;
		}
	);
}
)
// test various combinations of concatenation
~concat.value([~low,~mid])
~concat.value([~mid,~low,~high])
~concat.value([~mid,~piano,~low])
~concat.value([~mid,~piano])

// check the buffers for the results

////////////////////////////////

// define the merging macro
(
~merge = {
	arg x;
	if(x.class != Array,
		{
			"Error - Needs an array as argument".postln;
		}, {
			Routine{
			for (1,x.size - 1, {
				arg i;
				FluidBufCompose.process(s,x[i],destination:x[0],destGain:1);
			});
			"Done!".postln;
			}.play;
		}
	);
}
)
// test various combinations of merging
~merge.value([~low,~mid])
~merge.value([~mid,~low,~high])
~merge.value([~mid,~piano,~low])
~merge.value([~mid,~piano])

// check the buffers for the results

////////////////////////////////

// define the stacking macro
(
~stack = {
	arg x;
	if(x.class != Array,
		{
			"Error - Needs an array as argument".postln;
		}, {
			Routine{
			for (1,x.size - 1, {
				arg i;
				FluidBufCompose.process(s,x[i],destination:x[0], destStartChan:x[0].numChannels);
			});
			"Done!".postln;
			}.play;
		}
	);
}
)
// test various combinations of stacking
~stack.value([~low,~mid])
~stack.value([~mid,~low,~high])
~stack.value([~mid,~piano,~low])
~stack.value([~mid,~piano])

// check the buffers for the results
