CtkScore a system for rendering Scores with the Ctk objects.

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

Class Methods

*new(events) - where events are instances of CtkNote, CtkGroup, CtkBuffer, CtkEvent, CtkControl or even

another CtkScore. Any number of initial events may be passed in at creation time.

add(events) - where events are instances of CtkNote, CtkGroup, CtkBuffer, CtkEvent, CtkControl or another

CtkScore. Any number of events may added.

score - returns the Score that is created as part of CtkScore.

saveToFile(path) - saves the Score associated with this instance of CtkScore to 'path'

play(server, clock, quant) - plays this instance of CtkScore on server. An optional clock and quant may be

passed in. See the Score helpfile for more information. See below for more details on CtkBuffer

management.

write(path, duration, sampleRate, headerFormat, sampleFormat, options) - renders the CtkScore in NRT

mode to 'path'. 'duration' defaults to 'nil' and will render the entire CtkScore. 'sampleRate' defaults

to '44100', headerFormat to 'AIFF' and 'sampleFormat' to 'int16'. 'options' can be an instance of

ServerOptions.

Notes on playing CtkScore -

When CtkScore.play is called, the CtkScore is rendered fully before performance starts (and may cause

a delay. Events that are instances of CtkBuffer are also allocated to the Server before performance starts

to ensure they are ready for use. This, too, may cause a slight delay.

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

(

var scpn, score, grainfun, gliss;

scpn = CtkProtoNotes(

SynthDef(\control, {arg outbus, rate, low, hi;

Out.kr(outbus, LFNoise2.kr(rate).range(low, hi))

}),

SynthDef(\test, {arg freq, amp, dur;

var env, envgen, src;

env = Env([0, 1, 0], [0.5, 0.5], \sin);

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

src = BPF.ar(WhiteNoise.ar(amp), freq, 0.01, amp * envgen);

Out.ar(0, Pan2.ar(src, Rand(-1.0, 1.0)));

})

);

score = CtkScore.new;

/*

creates a granular gesture of duration. Each grain is 0.1 seconds long, new grain every 0.02 seconds

*/

grainfun = {arg starttime, duration, ampenv, lowfreq, hifreq;

var now, note, thisgroup;

now = 0;

ampenv.times = ampenv.times.normalizeSum * duration; // scale the Env's time to the gestures

thisgroup = CtkGroup.new(starttime, duration + 2).addTo(score);

while({

// create a note... add it to the CtkScore

note = scpn[\test].new(starttime + now, 0.1, target: thisgroup)

.freq_(lowfreq.rrand(hifreq))

.amp_(ampenv[now])

.dur_(0.1).addTo(score);

now = now + 0.02;

now < duration;

});

};

gliss = {arg starttime, duration, rate, lowfreq, hifreq;

var cbus, control, note;

cbus = CtkControl.new;

control = scpn[\control].new(starttime, duration)

.outbus_(cbus.bus)

.rate_(rate)

.low_(lowfreq)

.hi_(hifreq)

.addTo(score);

note = scpn[\test].new(starttime, duration, \tail, 1)

.freq_(cbus)

.amp_(2)

.dur_(duration)

.addTo(score);

};

grainfun.value(1, 10, Env([0, 1, 0], [0.5, 0.5], [3, -5]), 440, 880);

grainfun.value(4, 4, Env([0, 1, 0], [0.5, 0.5], [3, -5]), 4400, 8800);

grainfun.value(6, 12, Env([0, 1, 0], [0.5, 0.5], [3, -5]), 300, 400);

grainfun.value(3, 10, Env([0, 1, 0], [0.5, 0.5], [3, -5]), 200, 200);

grainfun.value(1.5, 20, Env([0, 1, 0], [0.5, 0.5], [3, -5]), 7000, 7100);

5.do({arg i;

var j;

j = i + 1;

gliss.value(3 + (i + 4), 10.rrand(7), j.reciprocal, 440 * j, 880 * j);

});

// 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, 22,

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

// uncomment to save the CtkScore as a file

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

)

/*

* working with a 'parent' score - manipulating CtkScore objects

*/

s.boot;

o = ServerOptions.new.numOutputBusChannels_(1);

// the 'parent' score

a = CtkScore.new;

b = CtkScore.new;

z = CtkSynthDef(\test, {arg freq, dur;

Out.ar(0, SinOsc.ar(freq, 0, XLine.kr(0.1, 0.0001, dur)))

});

t = 0.0;

while({

b.add(z.new(t, 0.1).freq_(440).dur_(0.1));

t = t + 0.1;

t < 5.0;

});

a.add(b);

a.saveToFile("~/Desktop/test.sc".standardizePath)

a.write("~/Desktop/test.aiff".standardizePath, options: o);

p = Player.new("~/Desktop/test.aiff".standardizePath).gui

// make a copy of b with an offset of 2.05 seconds

c = b.copy;

c.offset(2.05);

// alter the freq , durations and the dur parameter of c's notes

c.notes.do({arg me;

me.setDuration(0.11).dur_(0.11).freq_(me.freq * 2)

});

// add it to the score

a.add(c);

a.write("~/Desktop/test.aiff".standardizePath, options: o);

p = Player.new("~/Desktop/test.aiff".standardizePath).gui;

// let's alter the score 'c'...

c.notes.do({arg me;

me.freq_(me.freq * (1 + 0.25.rand2));

});

// offset it another 0.123 seconds

c = c.offset(0.123);

a.write("~/Desktop/test.aiff".standardizePath, options: o);

p = Player.new("~/Desktop/test.aiff".standardizePath).gui;