CtkAudio allocate an audio bus

Part of the CompositionToolKit (Ctk) system. See Ctk help for more details

Class Methods

*new(numChans, bus, server) -

numChans- the number of channels to allocate. Defaults to 1.

bus - the bus id to write values to. Defaults to nil, where an id will be allocated for you.

server - and instance of Server to allocate the audio bus from. Defaults to Server.default.

bus - returns the id of the CtkAudio bus.

free - returns the bus id to the allocation pool.

Unlike CtkControl, CtkAudio object can be passed in straight to a CtkNotes arg. The bus id will be extracted for you.

Examples:

s = Server.internal.boot;

Server.default = s;

(

var pnotes, group, noisesynth, noisebus, filtbus, ampsynth, ampbus, task, env;

var cond;

cond = Condition.new;

Routine.run({

pnotes = CtkProtoNotes(

SynthDef(\noise, {arg outbus;

Out.ar(outbus, WhiteNoise.ar(1));

}),

SynthDef(\filts, {arg outbus, inbus, dur, freq, amp;

var env, envgen, src;

env = Control.names([\env]).kr(Env.newClear(8));

envgen = EnvGen.kr(env, timeScale: dur, doneAction: 2);

src = BPF.ar(In.ar(inbus), freq, 0.01);

Out.ar(outbus, Pan2.ar(src * envgen * amp, Rand(-1.0, 1.0)));

}),

SynthDef(\dels, {arg inbus, deltime, dur, amp;

var env, envgen, src;

env = Control.names([\env]).kr(Env.newClear(8));

envgen = EnvGen.kr(env, timeScale: dur, doneAction: 2);

src = CombN.ar(In.ar(inbus, 2), deltime, [deltime, Rand.new(0.01, deltime)]);

Out.ar(0, src * envgen * amp);

}),

SynthDef(\controlenv, {arg gate = 1, outbus;

var env;

env = Control.names([\env]).kr(Env.newClear(8));

Out.kr(outbus, EnvGen.kr(env, gate));

}).load(s)

);

s.sync(cond);

env = Env([0, 1, 0], [1, 4], [3, -4], 1);

group = CtkGroup.play;

noisebus = CtkAudio.new; // allocate an audio bus to route noise

filtbus = CtkAudio.new(2); // sends stereo

ampbus = CtkControl.new; // for global amp control

noisesynth = pnotes[\noise].new(addAction: \head, target: group)

.outbus_(noisebus) // a CtkAudio! No need to call .bus

.play;

ampsynth = pnotes[\controlenv].new(addAction: \head, target: group)

.outbus_(ampbus.bus) // a CtkControl... need to call .bus otherwise, it will map!

.env_(env)

.play;

task = Task({

var reltime, dur;

reltime = env.releaseTime;

dur = 10;

// schedule the release of the global envelope

SystemClock.sched(dur - reltime, {

group.release;

});

// schedule the release of the Task

SystemClock.sched(dur, {

group.freeAll;

task.stop;

});

loop({

// place the filter notes after the noisesynth

pnotes[\filts].new(addAction: \after, target: noisesynth)

.dur_(1)

.outbus_(filtbus) // route output for the delays

.inbus_(noisebus) // read in the noisebus

.env_(Env([0, 1, 0], [0.5, 0.5], \sin))

.freq_(1200.rrand(2400))

.amp_(ampbus)

.play;

pnotes[\dels].new(addAction: \tail, target: group)

.inbus_(filtbus) // read in the filtered noise

.deltime_(0.01.rrand(0.03))

.dur_(1.5)

.env_(Env([0, 1, 0], [0.5, 0.5], \sin))

.amp_(ampbus) // don't call .bus here... it will map the arg for you

.play;

0.5.wait;

})

});

task.play;

})

)

Examples that populate an instance of CtkScore. The CtkScore can then be rendered in NRT, played or saved as a file. See CtkScore for more examples.

(

var pnotes, group, noisesynth, noisebus, filtbus, ampsynth, ampbus, task, env;

var score, now;

score = CtkScore.new;

pnotes = CtkProtoNotes(

SynthDef(\noise, {arg outbus;

Out.ar(outbus, WhiteNoise.ar(1));

}),

SynthDef(\filts, {arg outbus, inbus, dur, freq, amp;

var env, envgen, src;

env = Control.names([\env]).kr(Env.newClear(8));

envgen = EnvGen.kr(env, timeScale: dur, doneAction: 2);

src = BPF.ar(In.ar(inbus), freq, 0.01);

Out.ar(outbus, Pan2.ar(src * envgen * amp, Rand(-1.0, 1.0)));

}),

SynthDef(\dels, {arg inbus, deltime, dur, amp;

var env, envgen, src;

env = Control.names([\env]).kr(Env.newClear(8));

envgen = EnvGen.kr(env, timeScale: dur, doneAction: 2);

src = CombN.ar(In.ar(inbus, 2), deltime, [deltime, Rand.new(0.01, deltime)]);

Out.ar(0, src * envgen * amp);

}),

SynthDef(\controlenv, {arg gate = 1, outbus;

var env;

env = Control.names([\env]).kr(Env.newClear(8));

Out.kr(outbus, EnvGen.kr(env, gate));

}).load(s)

);

env = Env([0, 1, 0], [1, 4], [3, -4], 1);

group = CtkGroup.new.addTo(score);

noisebus = CtkAudio.new; // allocate an audio bus to route noise

filtbus = CtkAudio.new(2); // sends stereo

ampbus = CtkControl.new; // for global amp control

noisesynth = pnotes[\noise].new(0.1, addAction: \head, target: group)

.outbus_(noisebus) // a CtkAudio! No need to call .bus

.addTo(score);

ampsynth = pnotes[\controlenv].new(1.0, 10, addAction: \head, target: group)

.outbus_(ampbus.bus) // a CtkControl... need to call .bus!

.env_(env)

.release(10 - env.releaseTime)

.addTo(score);

now = 0.0;

while({

// place the filter notes after the noisesynth

pnotes[\filts].new(1.0 + now, addAction: \after, target: noisesynth)

.dur_(1)

.outbus_(filtbus) // route output for the delays

.inbus_(noisebus) // read in the noisebus

.env_(Env([0, 1, 0], [0.5, 0.5], \sin))

.freq_(1200.rrand(2400))

.amp_(ampbus)

.addTo(score);

pnotes[\dels].new(1.0 + now, addAction: \tail, target: group)

.inbus_(filtbus) // read in the filtered noise

.deltime_(0.01.rrand(0.03))

.dur_(1.5)

.env_(Env([0, 1, 0], [0.5, 0.5], \sin))

.amp_(ampbus) // don't call .bus here... it will map the arg for you

.addTo(score);

now = now + 0.5;

now < 10;

});

// uncomment to play the CtkScore you have created

//score.play(s);

// uncomment to write the score to a soundfile

score.write("~/Desktop/test.aiff".standardizePath,

options: ServerOptions.new.numOutputBusChannels_(2));

// uncomment to save the CtkScore as a file

score.saveToFile("~/Desktop/test.sc".standardizePath);

)