// ------ MATHIMA 4, 21.03.12 ------ // /*=======================Μultichannel expansion!!! ============================*/ // ο πολυκαναλος ηχος στον server εχει την λογικη ενος πινακα (array), οπου καθε στοιχειο του ειναι και ενα καναλι // Αν θελω να τοποθετησω εναν μονοφωνικο ηχο στο αριστερο η στο δεξιο καναλι της στερεοφωνικης εικονας (τερμα αριστερα η τέρμα δεξιά), το δηλώνω στις αντίστοιχες θέσεις του πίνακα: { [ SinOsc.ar(200), SinOsc.ar(202) ] }.scope // stereo /* Το ιδιο μπορώ να δηλώσω αν σε ενα ugen αντικαταστησω καποιο ορισμα με εναν πινακα τιμών (το αποτελεσμα ειναι ισοδυναμο με εναν πινακα ιδιου μεγεθους οπου καθε του θεση καταλαμβανεται απο το ιδιο ugen με διαφορετικες ομως τιμες σε καθε του εμφανιση (τις τιμες εκεινες που εχω δώσει στον αρχικο πινακα)). */ // πχ το { [ SinOsc.ar(200), SinOsc.ar(202) ] }.scope // ειναι ισοδυναμο με :
{ SinOsc.ar ( [200,202]) }.scope // στα υπολοιπα ορισματα μπορώ να δώσω ειτε πινακα { SinOsc.ar ( [200,202], [ pi, 0 ] ) }.scope // το pi ειναι το γνωστο 3.14.. // ειτε μια μονο τιμη { SinOsc.ar ( [200,202], pi ) }.scope --- // Έτσι, έχουμε και λέμε: // ΜΟΝΟΦΩΝΙΚΟΣ ΗΧΟΣ (ΗΜΙΤΟΝΟ), ΑΠΟ ΤΟ ΚΑΝΑΛΙ 0, ΔΗΛ. ΑΡΙΣΤΕΡΟ: {SinOsc.ar(freq:200,mul:1)}.scope; // το ίδιο με αυτό: {SinOsc.ar(freq:200,mul:0.5) + SinOsc.ar(freq:200,mul:0.5)}.scope; // ΔΥΟ ΤΕΛΕΙΩΣ ΔΙΑΦΟΡΕΤΙΚΟΙ ΗΧΟΙ, ΚΡΕΜΜΑΣΜΕΝΟΙ ΑΚΡΙΒΩΣ ΠΑΝΩ ΣΤΟ ΚΑΘΕ ΚΑΝΑΛΙ (SinOsc αριστερά, Saw δεξιά): //Τα 200Hz τέρμα αριστερά και τα 402Hz τέρμα δεξιά: {[ SinOsc.ar(freq:200,mul:0.5), Saw.ar(freq:402,mul:0.5) ]}.scope; /* Στο επόμενο μάθημα θα δούμε πώς
μπορούμε να κάνουμε το ίδιο και με το Out, που συντάσσεται ως εξής: { Out.ar (0, SinOsc.ar(freq: [200,402],mul:0.5) ) }.scope; */ //Αν τώρα αν θέλω να μετακινώ έναν ήχο μεταξύ του αριστερού και του δεξιού καναλιού, μπορώ να μοιράζω αντίστοιχα τη μέγιστη ένταση // ΣΤΕΡΕΟΦΩΝΙΚΟΣ ΗΧΟΣ (ΗΜΙΤΟΝΟ) ΠΟΥ ΑΚΟΥΓΕΤΑΙ ΑΠΟ ΤΟ ΚΕΝΤΡΟ (ίδιος ήχος σε ίση ένταση και στα 2 κανάλια!): { [ SinOsc.ar(freq:500,mul:0.5), SinOsc.ar(freq:500,mul:0.5) ] }.scope; // ή αλλιώς: { SinOsc.ar(freq:500,mul:[0.5,0.5]) }.scope; // ή αλλιώς: { SinOsc.ar(freq:[500,500],mul:0.5) }.scope; // ΣΤΕΡΕΟΦΩΝΙΚΟΣ ΗΧΟΣ (ΗΜΙΤΟΝΟ) ΠΟΥ ΑΚΟΥΓΕΤΑΙ ΑΠΟ ΤΟ ΤΕΡΜΑ (ΠΑΝΩ ΣΤΟ ΗΧΕΙΟ) ΑΡΙΣΤΕΡΑ: { [SinOsc.ar(200, 0, 1), SinOsc.ar(200, 0, 0)] }.scope; // Παίζει ένα ημίτονο στην αριστερή έξοδο (στη δεξιά η "ένταση" είναι 0 κι
άρα δεν ακούγεται) // ΣΤΕΡΕΟΦΩΝΙΚΟΣ ΗΧΟΣ (ΗΜΙΤΟΝΟ) ΠΟΥ ΑΚΟΥΓΕΤΑΙ ΑΠΟ ΤΟ ΤΕΡΜΑ (ΠΑΝΩ ΣΤΟ ΗΧΕΙΟ) ΔΕΞΙΑ: { [SinOsc.ar (200, 0, 0), SinOsc.ar (200, 0, 1)] }.scope; // Παίζει ένα ημίτονο στη δεξιά έξοδο (στην αριστερή η "ένταση" είναι 0 κι άρα δεν ακούγεται) // ΣΤΕΡΕΟΦΩΝΙΚΟΣ ΗΧΟΣ (ΗΜΙΤΟΝΟ) ΠΟΥ ΑΚΟΥΓΕΤΑΙ ΚΑΠΟΥ ΑΝΑΜΕΣΑ ΣΤΑ ΗΧΕΙΑ (ΠΡΟΣ ΤΑ ΔΕΞΙΑ): {[ SinOsc.ar(freq:200,mul:0.2), SinOsc.ar(freq:200,mul:0.8) ]}.scope; // ημίτονο {[ Saw.ar(freq:200,mul:[0.2,0.8]}.scope; // πριονωτή // ή αλλιώς: { SinOsc.ar ( [200,200], 0, [0.2, 0.8]) }.scope; // ή αλλιώς: { SinOsc.ar(freq:200,mul:[0.2,0.8] )}.scope; // Με χρήση μεταβλητής { var i, freq=200, a=0.2; i=sinosc.ar (freq, 0, 1); [a*i,(1-a)*i]
}.scope; // σύνθετη κυματομορφή {[0.2*(SinOsc.ar(freq:500,mul:0.5)+SinOsc.ar( freq:700,mul:0.5)),0.8*(sinosc.ar(freq:500,mu l:0.5)+sinosc.ar(freq:700,mul:0.5))]}.scope; // σύνθετος ήχος // Με χρήση μεταβλητής {var i, freq1=500, freq2=700, a=0.2; i = 0.5*(SinOsc.ar(freq1)+SinOsc.ar(freq2)); [a*i,(1-a)*i]; }.scope; // PANNING, ΓΙΑ ΝΑ ΑΚΟΥΣΤΕΙ Ο ΗΧΟΣ ΣΕ ΟΠΟΙΟΔΗΠΟΤΕ ΣΗΜΕΙΟ ΜΕΤΑΞΥ ΤΩΝ ΔΥΟ ΗΧΕΙΩΝ ΜΕ ΒΑΣΗ ΤΙΣ ΣΥΝΤΕΤΑΓΜΕΝΕΣ Χ ΤΟΥ ΠΟΝΤΙΚΙΟΥ: { [ SinOsc.ar(freq:500,mul:MouseX.kr(1,0)), SinOsc.ar(freq:500,mul:MouseX.kr(0,1)) ] }.sc ope; // ή αλλιώς { [ SinOsc.ar(freq:500,mul:(1-MouseX.kr(0,1))), SinOsc.ar(freq:500,mul:MouseX.kr(0,1)) ] }.sc ope; // ή αλλιώς { SinOsc.ar ( freq:200, mul:
[MouseX.kr(0,1),MouseX.kr(1,0)]) }.scope; // ή αλλιώς { SinOsc.ar ( freq:200, mul:[mousex.kr(0,1), (1-MouseX.kr(0,1)]) }.scope; // ή αλλιώς με χρήση arg και var: { arg freq=200; var aristero, deksio; aristero = MouseX.kr(0,1); deksio = MouseX.kr(1,0); i=sinosc.ar (freq, 0, 1); [aristero*i,deksio*i] }.scope; // ή πιο έξυπνα: { arg freq=200; var aristero, deksio; aristero = MouseX.kr(0,1); i=sinosc.ar (freq, 0, 1); [aristero*i,(1-aristero)*i] }.scope; // ή: { arg freq=200; var aristero, deksio; aristero = MouseX.kr(0,1); deksio = 1 - aristero;
i=sinosc.ar (freq, 0, 1); [aristero*i,deksio*i] }.scope; /* // ή αλλιώς με χρήση του Out: { Out.ar (0, SinOsc.ar([200,200],0, [MouseX.kr(1,0),MouseX.kr(0,1)] )) }.scope; */ // Αν θέλουμε η θέση στη στερεοφωνική εικόνα να αλλάζει με (ψευδο-)τυχαίο τρόπο, μπορούμε να χρησιμοποιήσουμε μία από τις κλάσεις LFNoise1 ή LFDNoise1 (βλέπε help file για ορίσματα και τιμές): ( { a=lfnoise1.ar(4,1); // δείκτης για panning b=lfnoise1.ar(5,1); // ένταση (συνολική, και στα δύο κανάλια) f=lfnoise1.ar(17,7000,20); // συχνότητα i=sinosc.ar(f,0,b); [a*i,(1-a)*i] }.scope; ) // Δύο διαφορετικοί ήχοι, τοποθετημένοι σε
διαφορετικά σταθερά σημεία στη στερεοφωνική εικόνα: ( { var a,b,i,j,k; a=0.3; b=0.9; k=0.5; i=sinosc.ar(440,0,1); j=saw.ar(1440,1); k*[(a*i)+(b*j), ((1-a)*i)+((1-b)*j)] }.scope; ) // προσοχή στις παρενθέσεις για διασφάλιση των προτεραιοτήτων στις πράξεις!!! // Δύο διαφορετικοί ήχοι, τοποθετημένοι σε διαφορετικά μεταβλητά σημεία στη στερεοφωνική εικόνα: ( { var a,b,i,j,k; a=mousex.kr(0,1); b=mousex.kr(0.2,0.7); k=mousey.kr(0,1); i=sinosc.ar(440,0,1); j=saw.ar(1440,1); 0.5*[(a*i)+(b*j), ((1-a)*i)+((1-b)*j)] }.scope; ) // προσοχή στις παρενθέσεις για διασφάλιση των
προτεραιοτήτων στις πράξεις!!! // και αν θέλουμε οι δύο ήχοι να βρίσκονται ακριβώς συμμετρικά ως προς το κέντρο, μπορούμε να χρησιμοποιήσουμε μόνο μία παράμετρο για το panning: ( { var a,b,i,j,k; a=0.3; k=mousey.kr(0,1); i=sinosc.ar(440,0,1); j=saw.ar(1440,1); k*[(a*i)+( (1-a)*j), ((1-a)*i)+( a *j)] }.scope; ) // προσοχή στις παρενθέσεις για διασφάλιση των προτεραιοτήτων στις πράξεις!!! // μεταβλητά συμμετρικά σημεία στη στερεοφωνική εικόνα: ( { var a,b,i,j,k; a=mousex.kr(0,1); k=mousey.kr(0,1); i=sinosc.ar(440,0,1); j=saw.ar(1440,1); k*[(a*i)+( (1-a)*j), ((1-a)*i)+( a *j)] }.scope; )
// προσοχή στις παρενθέσεις για διασφάλιση των προτεραιοτήτων στις πράξεις!!!