-
Notifications
You must be signed in to change notification settings - Fork 0
/
tutorial #0
475 lines (246 loc) · 9.51 KB
/
tutorial #0
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
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
////////////////////////////////////////////////////////////////////
/////////// SuperCollider Workshop #0 - Zaklady jazyka
////////////////////////////////////////
///////////// Super zvuky v SuperCollideri///////////////////
/////////////////////////////////////////////////Fero Kiraly///////////////////////////
////////////////////////////////////////////////////////////////
/////////////// OBSAH //////////////////
////////////////////////////////////////
//0) Spustanie programu, zatvorky, bodkociarka
//1) Komentare, post window
//2) Premenne
//3) Objekt
//4) Funkcie
//5) Audio server
//// 0)
/////////////////////Spustanie programu, zatvorky, bodkociarka
///////////////////////////////
/*
Bodkociarka ";" je znak, ktory sa pouziva na oddelenie jednotlivych prikazov.
Na zaklade bodkociarky vie interpret ( jazyka sclang ) ze po kadial sa ma na kod divat ako na jednu instrukciu.
Na konci kazdeho riadku by sme mali dat bodkociarku.
Ak tak neuribime, dostaneme chybu v post window, a prikaz sa neudeje.
Cast kodu ktoru dame do okruhlych zatvoriek sa vola "blok kodu"
Dvojklik mysou hned za prvu zatvtorku, a cely blok kodu sa oznaci.
Stlac Linux & Win: Ctrl + Enter / Mac: cmd + enter a blok sa vykona
tento blok kodu vypise do post window nejake vety
vsimni si rozdiel medzi tymyto dvoma prikazmi:
post
postln
To 'ln' znamena line -> riadok
*/
(
"Ak si spustil tento blok programu, tak ".post; (44+77).post; " je vysledkom suctu 44 a 77".postln;
"Toto je novy riadok - tento riadok bude vypisany v post window 2x. Interpret jazyka sclang vypise vzdy posledny prikaz este raz.".postln;
)
// Ctrl + Shift + P -> vycisti post window
// nasledujuci blok obsahuje chybu (syntax error). Pozri do post window.
// vies ju najst ?
(
(456 * 8).postln
42.postln;
)
// Ak vlozime kurzor hocikam na riadok a stlacime Shift + Enter, vykona sa tento riadok
(456 * 8).postln; 42.postln; "Toto sa vypise 2x".postln;
/*
Kod sa da teda spustat dvoma moznostami. Bud jeden riadok alebo cely blok
shift + enter ---> spusta priamo riadok alebo oznacene miesto( riadky alebo cast textu)
ctrl + enter ---> spusti cely blok;
*/
//// 1)
////////////////////// Komentare, post window //////////////
//////////////////////////////
// toto je komentar ( 1 riadok)
/*
aj toto je komentar
( moze byt lubovolny pocet riadkov)
komentar je lubovolny text, ktory si sclamng nevsima, takze toto je ok:
*/
(
var abc;
/*
bla bla
*/
"kominar je v kostole".postln; // dalsi koment
)
// post window je textovy vystup z jazyka, kde nam sclang dava vediet co sa deje, etc..
// post window je velmi uzitocny pomocnik aj pre nas
// mozeme si tam nechat vypisat to co potrebuje vidiet, skontrolovat , atp...
(
"Tato".post; // Nieco napis
"Veta".post;
"Ma".post;
"V".post;
"Sebe".post;
"Lepidlo".post;
)
(
"".postln;
"Mr.Paris, full power to thrusters!".postln; // Nieco napis a chod na dalsi riadok
"Yes, ma'am.".postln
)
3 + 5 // tento riadok vypise v post window vysledok rovnice
3 + 5 * 3 // vysledok bude 24 a nie 18 (ako by sme cakali) SC vyhodnocuje cisla po sebe
3 + ( 5 * 3 ) // ak to chceme tak ako sme sa ucili v skole, treba dat zatvorky
// 2)
//////////////////////// Premenne / Variables ///
///////////////////////////
// SuperCollider dokaze pracovat s roznym typom dat:
42 // Cele cislo / Integer
3.141592 // Cislo s desatinnou ciarkou / Float
[ 1979, "zemiaky", \symbol, "naj si mango!", pi] // Pole / Array
"Ak spistis tento riadok, tak vsetko bude inak."// Retazec znakov / String
// a potom este audio signal, rozne objekty, atp..
// premenna je nieco ako 'ulozisko', kde si dame nieco co budeme este potrebivat
a = 3; // dali sme cislo 3 do premennej "a"
// to ci do premennej dame cislo, retazec, array.. je jedno. Nemusi o tom dopredu vediet co sa na nu chysta.
a = "hello"; // teraz v nej bude retazec
a = 0.333312; // a teraz cislo s desatinnou ciarkou
a = [ 1979, "zemiaky", \symbol, "daj si mango!", pi]; // A teraz nas zoznam zakladych veci pre zivot.
a // spusti tento riadok a uvidis v post window co premenna 'a' obsahuje
// ak a obsahuje Array, k jej jednotlivym polozkam sa dostamene ak pridame hranate zatvorky s indexom,
// SuperCollider zacina ratat od 0
a[0] // index nula je prvy prvok pola --> 1979
a[1] // druhy prvok - "zemiaky"
//...
// lokalne premenne - su deklarovane v ramci bloku kodu, alebo funkcie
// z "vonka" ich vidiet nie je
// definujeme ich klucivym slovom 'var'
(
var stroj, hriadel = 5, auto; // vsetko su premenne.
var b,a = 56;
auto = 3; // danie hodnoty 3 do nej
b = 5.6;
c = a * b;
c.postln;
)
auto // auto bola definovana ako lokalna premenna v bloku ( vyzsie), mimo bloku je to nedefinovane --> nil
b // pozri co je tu
a // a tu bude nase stare 'a' z hora
// 'a' je globalna premenna. SC ma defaulte rezervovane vsetky male pismena abecedy pre globalne premenne
// je to dobra vec pre rychle skusanie kodu
// pri vyvoji realnych aplikacii, je dobre mat premennu pomenovanu podla toho co zo sebou "nesie'.
// Ak potrebujeme globalnu premennu s dlhym nazvom (viac ako jeden znak), pouzijeme pred nou znak tildy "~"
~tuMamDoleziteCislo = 440;
~tuMamDoleziteCislo // vypis ho
///// 3)
/////////////////////////// Objekt, Help
/////////////////////////////////////////////////
// v SC Objektovo orientovany jazyk. Vsetko v nom je objekt a mozeme nim 'manipulovat' pomocou metod (messages)
3.cubed // objekt CELE CISLO (Integer) - 3 - a aplikovana metoda 'cubed' , teda kubicky, teda "na tretiu"
3.sqrt // odmocnina
3.reciprocal // 1 / 3
3.neg // * -1
3.0 // je stale 3, ale chapana ako cislo z desatinnou ciarkou (float)
3.0.round(2) // zaokruhli 3 na najblizsi nasobok 2
[1,2,3,4,5] // toto je Array
[1,2,3,4,5] + 2 // jednoducha matematicka operacia s kazdym prvkom pola
[1,2,3,4,5].mirror // vyskusaj
[1,2,3,4,5].sramble // ERROR, je tam typo chyba ma byt:
[1,2,3,4,5].scramble
[1,2,3,4,5].at(2) // vypis prvok v indexom (poradim) 2. !!! v computer music sa pocitat zacina od NULY,
// teda .at(2) vypise do post window treti prvok. 0,1,2 . teda trojku.
[1,5,23,8,-23,4].plot
// random generators
/////////////
10.rand;
10.0.rand; // vidis rozdiel?
2.rand2;
rrand(50,60);
[5,8,95,63].choose;
// Supercollider ma velmy dobry Help system, ktory stoji za to studovat. Ak sa chceme dostat k dokumentacii urciteho prikazu
// staci man na nom kurzor a stlacit Ctrl + d
///// 4)
///////////////////////////// Funkcie //////////
/////////////////////////////////////////////
/*
Funkcia je blok kodu, ktory chceme pouzivat v nasej aplikacii viac krat. Aby sme tento kod nemuseli pistat
vsade tam kde ho potrebujeme (moze to byt niekolko vela riaddkov...), tak si z neho vytvorime funkciu,
a dame jej nazov.
Potom tam v aplikacii kde ho chceme pouzit nak napiseme ina nazovFunkcie.value(arg...) a funkcia sa po spusteni vykona na prislusnom mieste
Koncept funkcie je asi v kazdom programovacom jazyku.
Funkcie su vzdy v { .... }
- mozu obsahovat svoje vlastne premenne - var
- mozu obsahovat argumenty - arg - nieco ako premenna, akurat z bonusom, ze argument mozeme menit aj "z vonku"
- vykonavaju sa pomocou metody ".value"
- ich navratova hodnota je ich posledny prikaz (riadok)
*/
(
a = {
arg pocet = 100, cislo = 100; // da sa defaultne nastavit ake maju byt hodnoty ak sa funkcia spusti bez ich zadania
( {cislo.rand} ! pocet ).postln ;
"Hello".postln;
}
)
a.value()
a.value(5,2) // 5 a 2 su 'custom' argmenty funkcie a
~funkciaCoNiecoRobi
(
~funkciaCoNiecoRobi = {
arg x = 5, y = 8;
var vysledok;
vysledok = x + y;
vysledok.postln;
}
)
~funkciaCoNiecoRobi
c = ~funkciaCoNiecoRobi.value(1,1)
//// 5)
///////////////// Audio server //////////
////////////////////////////////////////
// SC sa sklada z troch casti:
// IDE - to je tento program kde pisete kod, mate pristup k helpu a post windowu
// SClang - jazyk supercollideru - tomu sa ucime porozumiet
// SCsynth - svaty gral, hlavny audio engine SC. SClang komunikuje s SCsynth pomocou protokolu OSC
// Ak chceme pouzivat zvuk, najprv musime teda spustit zvukovy engine - SCsynth - audio server
Server.local.boot
Server.local.quit
// audio server ma rozne options, medzi nimi je napriklad aj pocet vstupnych a vystupnych kanalov
Server.local.options.numInputBusChannels = 2
Server.local.options.numOutputBusChannels = 2
// pre audio server SC defaultne rezervuje premennu 's'
s.boot
s.quit
s.freeAll // zastavi prehravanie vsetkych zvukov
// DOLEZITA klavaesova skratka je Ctrl + . = s.freeAll
// Audio server mozeme spustit aj pomocou klavesovej skratky Ctrl + B
s.sampleRate
// nasledujuca funkcia:
// freq:
// LFNoise0.kr(8) = nahodne cislo v rozsahu (-1.0. 1.0 ) 8x za sekundu
// .range(200,800) = zmen rozsah z (-1,1) na (200,800)., koli tomu lebo je to frekvencia v Hz, tak to potrebujeme dostat do pocutelneho spektra
// .round(100) = zaokruhli na stovky
// takze vysledok budu nahodne cisla z tohoto zoznamu [200,300,400,500, 600, 700, 800], co je vlastne
// 200Hz a jeho 6 alikvot
(
a = {
SinOsc.ar(
freq:LFNoise0.kr(8).range(200,800).round(100), // frekvencia
mul: SinOsc.kr(4).range(0.2,0.8) // hlasitost
) * 0.2 // est jedna hlasitost - cele je to stisene
}.play
)
a.free // zastavi prehravanie zvuku a 'uvolni' sa Synth z pamati
{LFNoise0.kr(4)}.plot(1) // plot nakresli graf
{SinOsc.ar(LFNoise0.kr(4) * 4) }.plot(10)
(
{
[
LFNoise0.kr(8),
SinOsc.kr(1),
LFSaw.kr(1),
LFTri.kr(1),
LFPulse.kr(1),
WhiteNoise.kr()
]
}.plot(1,bounds:Rect(400,80,500,700))
)
(
{
[
LFNoise0.kr(4),
SinOsc.kr(1),
SinOsc.kr(1) + SinOsc.kr(2)
]
}.plot(1)
)