File: Score.schelp

package info (click to toggle)
supercollider 1%3A3.13.0%2Brepack-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 80,292 kB
  • sloc: cpp: 476,363; lisp: 84,680; ansic: 77,685; sh: 25,509; python: 7,909; makefile: 3,440; perl: 1,964; javascript: 974; xml: 826; java: 677; yacc: 314; lex: 175; objc: 152; ruby: 136
file content (297 lines) | stat: -rw-r--r-- 8,595 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
class:: Score
summary:: score of timed OSC commands
related:: Guides/Non-Realtime-Synthesis
categories:: Control, Server>NRT, External Control>OSC

description::
Score encapsulates a list of timed OSC commands and provides some methods for using it, as well as support for the creation of binary OSC files for non-realtime synthesis. See link::Guides/Non-Realtime-Synthesis:: for more details.

The list should be in the following format, with times in ascending order. Bundles are okay.

code::
[
[beat1, [OSCcmd1]],
[beat2, [OSCcmd2], [OSCcmd3]],
...
[beat_n, [OSCcmdn]],
[beatToEndNRT, [\c_set, 0, 0]] // finish
]
::

For NRT synthesis the final event should a dummy event, after which synthesis will cease. It is thus important that this event be timed to allow previous events to complete.

Score scheduling defaults to link::Classes/TempoClock::. A setting of code::TempoClock.default.tempo = 1 :: (60 beats per minute), may be used to express score events in seconds if desired.

ClassMethods::

private::initClass

method::new
returns a new Score object with the supplied list.

argument::list
can be an link::Classes/Array::, a link::Classes/List::, or similar object.

method::newFromFile
as link::#*new::, but reads the list in from a text file.

argument::path
a link::Classes/String:: indicating the path of the file. The file must contain a valid SC expression.

method::play
as link::#*new:: but immediately plays it. (See also the instance method below.)

argument::list
the list.

argument::server
If no value is supplied it will play on the default link::Classes/Server::.

method::playFromFile
as link::#*play::, but reads the list from a file.

method::write
a convenience method to create a binary OSC file for NRT synthesis. Does not create an instance.

argument::list
the list.

argument::oscFilePath
a link::Classes/String:: containing the desired path of the OSC file.

argument::clock
Use clock as a tempo base. code::TempoClock.default:: is used if clock is nil.

method::writeFromFile
as link::#*write:: but reads the list from a file.

argument::path
a path to a file with a list.

argument::oscFilePath
a link::Classes/String:: containing the desired path of the OSC file.

argument::clock
Use clock as a tempo base. code::TempoClock.default:: is used if clock is nil.

method::recordNRT
a convenience method to synthesize strong::list:: in non-realtime. This method writes an OSC file to strong::oscFilePath:: (you have to do your own cleanup if desired) and then starts a server app to synthesize it. For details on valid headerFormats and sampleFormats see link::Classes/SoundFile::. Use code::TempoClock.default:: as a tempo base. Does not return an instance.

argument::list
the list.

argument::oscFilePath
the path to which the binary OSC file will be written.

argument::outputFilePath
the path of the resultant soundfile.

argument::inputFilePath
an optional path for an input soundfile.

argument::sampleRate
the sample rate at which synthesis will occur.

argument::headerFormat
the header format of the output file. The default is 'AIFF'.

argument::sampleFormat
the sample format of the output file. The default is 'int16'.

argument::options
an instance of link::Classes/ServerOptions::. If not supplied the options of the default link::Classes/Server:: will be used.

argument::completionString

argument::duration

argument::action
A function to be evaluated once the NRT server has finished rendering its score.

InstanceMethods::

method::play
play the list on strong::server::, use strong::clock:: as a tempo base and quantize start time to strong::quant::. If strong::server:: is nil, then on the default server. code::TempoClock.default:: if strong::clock:: is nil. now if strong::quant:: is 0.

method::stop
stop playing.

method::write
create a binary OSC file for NRT synthesis from the list. Use strong::clock:: as a tempo base. code::TempoClock.default:: if strong::clock:: is nil.

method::score
get or set the list.

method::add
adds bundle to the list.

method::sort
sort the score time order. This is recommended to do strong::before recordNRT or write:: when you are not sure about the packet order.

method::recordNRT
synthesize the score in non-realtime. For details of the arguments see link::#*recordNRT:: above.

method::saveToFile
save the score list as a text file to strong::path::.

Examples::

subsection::NRT Examples

code::
// A sample synthDef
// Here we use store instead of add to store the compiled synthdef in Platform.defaultTempDir +/+ "synthdefs/"
// and make it available to the NRT server
(
SynthDef("helpscore", { |out, freq = 440|
	Out.ar(out,
		SinOsc.ar(freq, 0, 0.2) * Line.kr(1, 0, 0.5, doneAction: Done.freeSelf)
	)
}).store;
)

// write a sample file for testing
(
var f, g;
TempoClock.default.tempo = 1;
g = [
	[0.1, [\s_new, \helpscore, 1000, 0, 0, \freq, 440]],
	[0.2, [\s_new, \helpscore, 1001, 0, 0, \freq, 660]],
	[0.3, [\s_new, \helpscore, 1002, 0, 0, \freq, 220]],
	[1, [\c_set, 0, 0]] // finish
	];
f = File(Platform.defaultTempDir +/+ "score-test","w");
f.write(g.asCompileString);
f.close;
)

//convert it to a binary OSC file for use with NRT
Score.writeFromFile(Platform.defaultTempDir +/+ "score-test", Platform.defaultTempDir +/+ "test.osc");
::

From the command line, the file can then be rendered from within the build directory:

code::
scsynth -N test.osc _ test.aif 44100 AIFF int16 -o 1
::

Score also provides methods to do all this more directly:

code::
(
var f, o;
g = [
	[0.1, [\s_new, \helpscore, 1000, 0, 0, \freq, 440]],
	[0.2, [\s_new, \helpscore, 1001, 0, 0, \freq, 660],
		[\s_new, \helpscore, 1002, 0, 0, \freq, 880]],
	[0.3, [\s_new, \helpscore, 1003, 0, 0, \freq, 220]],
	[1, [\c_set, 0, 0]] // finish
	];
o = ServerOptions.new.numOutputBusChannels = 1; // mono output
Score.recordNRT(g, Platform.defaultTempDir +/+ "help-oscFile", Platform.defaultTempDir +/+ "helpNRT.aiff", options: o); // synthesize
)
::

subsection::Real-time Examples

code::
s.boot; // boot the default server

// A sample synthDef
(
SynthDef("helpscore", { |out, freq = 440|
	Out.ar(out,
		SinOsc.ar(freq, 0, 0.2) * Line.kr(1, 0, 0.5, doneAction: Done.freeSelf)
	)
}).store;
)

// write a sample file for testing
(
var f, g;
TempoClock.default.tempo = 1;
g = [
	[0.1, [\s_new, \helpscore, 1000, 0, 0, \freq, 440]],
	[0.2, [\s_new, \helpscore, 1001, 0, 0, \freq, 660],
		[\s_new, \helpscore, 1002, 0, 0, \freq, 880]],
	[0.3, [\s_new, \helpscore, 1003, 0, 0, \freq, 220]],
	[1, [\c_set, 0, 0]] // finish
	];
f = File(Platform.defaultTempDir +/+ "score-test","w");
f.write(g.asCompileString);
f.close;
)

z = Score.newFromFile(Platform.defaultTempDir +/+ "score-test");

// play it on the default server
z.play;

// change the list
(
x = [
[0.0, [ \s_new, \helpscore, 1000, 0, 0, \freq, 1413 ]],
[0.1, [ \s_new, \helpscore, 1001, 0, 0, \freq, 712 ]],
[0.2, [ \s_new, \helpscore, 1002, 0, 0, \freq, 417 ]],
[0.3, [ \s_new, \helpscore, 1003, 0, 0, \freq, 1238 ]],
[0.4, [ \s_new, \helpscore, 1004, 0, 0, \freq, 996 ]],
[0.5, [ \s_new, \helpscore, 1005, 0, 0, \freq, 1320 ]],
[0.6, [ \s_new, \helpscore, 1006, 0, 0, \freq, 864 ]],
[0.7, [ \s_new, \helpscore, 1007, 0, 0, \freq, 1033 ]],
[0.8, [ \s_new, \helpscore, 1008, 0, 0, \freq, 1693 ]],
[0.9, [ \s_new, \helpscore, 1009, 0, 0, \freq, 410 ]],
[1.0, [ \s_new, \helpscore, 1010, 0, 0, \freq, 1349 ]],
[1.1, [ \s_new, \helpscore, 1011, 0, 0, \freq, 1449 ]],
[1.2, [ \s_new, \helpscore, 1012, 0, 0, \freq, 1603 ]],
[1.3, [ \s_new, \helpscore, 1013, 0, 0, \freq, 333 ]],
[1.4, [ \s_new, \helpscore, 1014, 0, 0, \freq, 678 ]],
[1.5, [ \s_new, \helpscore, 1015, 0, 0, \freq, 503 ]],
[1.6, [ \s_new, \helpscore, 1016, 0, 0, \freq, 820 ]],
[1.7, [ \s_new, \helpscore, 1017, 0, 0, \freq, 1599 ]],
[1.8, [ \s_new, \helpscore, 1018, 0, 0, \freq, 968 ]],
[1.9, [ \s_new, \helpscore, 1019, 0, 0, \freq, 1347 ]],
[2.0, [\c_set, 0, 0]] // finish
];

z.score_(x);
)

// play it
z.play;

// play and stop after one second
(
z.play;
SystemClock.sched(1.0, {z.stop;});
)
::

subsection::creating Score from a pattern

code::
(
SynthDef("helpscore", { |out, freq = 440|
    Out.ar(out,
        SinOsc.ar(freq, 0, 0.2) * Line.kr(1, 0, 0.5, doneAction: Done.freeSelf)
    )
}).store;
)

// new pattern
(
p = Pbind(
    \instrument, \helpscore,
    \dur, Prand([0.3, 0.5], inf),
    \freq, Prand([200, 300, 500],inf)
);
)

// make a score from the pattern, 4 beats long
z = p.asScore(4.0);
z.score.postcs;
z.play;

// rendering a pattern to sound file directly:
// render the pattern to wav (4 beats)
p.render(Platform.defaultTempDir +/+ "asScore-Help.wav", 4.0);
::