// ------ MATHIMA 2, 07.03.12 ------ // s.boot; s.makewindow.boot; // boot server! /* Αυτά θα τα δούμε αργότερα, απλώς είπα να τα συμπεριλάβω από τώρα: Server.local.options.blockSize = 16; Server.local.options.sampleRate = 44100; Server.local.makeWindow; Server.internal.makeWindow; FreqScope.new; */ /* ----------ΣΥΝΤΟΜΕΥΣΕΙΣ ΠΛΗΚΤΡΟΛΟΓΙΟΥ---------- */ // In MAC OS Cmd +... // Ctrl + Enter --> execution // Cmd +. --> stop all // Cmd + K --> recompilation // Cmd + D --> Help // Cmd + D --> Search // Cmd + ' --> colour keywords // in Windows Alt instead of Cmd... /* ΣΤΙΞΗ: // -> σχόλιο έχει ισχύ μέχρι το τέλος της γραμμής /* */ σχόλιο πολλών γραμμών, /* ότι είναι ανάμεσα είναι σχόλιο */. -> στέλνω μυνήματα/μεθόδους ; //-> σηματοδοτεί το τέλος ενός statement αυτοτελής εντολή.προσοχη: Μπορεί και να παραλειφθεί αν τρέχουμε τον κώδικα γραμμή-γραμμή, αλλά θεωρείται καλή πρακτική να το χρησιμοποιείται πάντα στο τέλος της γραμμής εντολής σε περίπτωση που αποφασίσετε να τρέξετε πολλές γραμμές μαζί! */ // ΕΙΔΗ ΜΕΤΑΒΛΗΤΩΝ: // Δεκαδικοί αριθμοί Float Numbers 2.3; // Ακέραιοι αριθμοί Integer Numbers 23; // Πίνακες Tables [1, 3.5, 7+2.5]; // Αλφαριθμητικά δεδομένα Strings "Hello Class"; // Σύμβολα symbols \Hello; 'Hello';. //-> ακολουθεί μήνυμα ή αλλιώς μία μέθοδος που εφαρμόζεται σε αυτό που προηγείται της τελείας
// Για παράδειγμα: // α "Re sis, stamatiste na milate".speak; // και ο υπολογιστής μιλάει! νομίζω ότι δεν λειτουργεί σε windows // β "Hello World".postln; // εκτύπωση στο post window. H τελεία δηλώνει εφαρμογή της μεθόδου postln εκτύπωση με αλλαγή γραμμής στο string Hello World /* στο postwindow πάντοτε βλέπω το αποτέλεσμα του τελευταίου υπολογισμού μετά από κάθε evaluation γι' αυτό και καμιά φορά βλέπω κάτι 2 φόρες - η πρώτη είναι επειδή ζήτησα να το δώ και η δεύτερη επειδή τυγχάνει να είναι ο τελευταίος υπολογισμός*/ // γ {SinOsc.ar[220,222]}.play // η τελεία καλεί την μέθοδο ar =audio rate, θα το δούμε αργότερα, η οποία ορίζεται στην κλάση SinOsc //Εκτέλεση πολλών γραμμών κώδικα μαζί: /* Με τις παρενθέσεις σηματοδοτώ την έναρξη ενός "μπλοκ" κώδικα ένα πρόγραμμα που πρέπει να εκτελεστεί όλο μαζί μονομιάς είναι πολύ εύκολο να τοποθετήσω τον δείκτη του ποντικιού αμέσως μετά την παρένθεση και να κάνω διπλό κλικ για να επιλέξω όλο το περιεχόμενο */ "Hello Class!".postln; "Be silent pls!".postln; // advanced.. \n = νέα γραμμή "Hello Class! \nbe Silent pls".postln; //ΜΕΤΑΒΛΗΤΕΣ /* Όλοι οι χαρακτήρες μεταξύ a και z εκτός του s που αναφέρεται στον server και είναι καλό να μην αλλαχτεί μπορούν να χρησιμοποιηθούν ελεύθερα σαν μεταβλητές παντού. */ // Αν προσπαθήσουμε όμως π.χ. να εκτυπώσουμε μια μεταβλητή χωρίς να τις έχουμε πρώτα δώσει τιμή, a.postln; // το πρόγραμμα θα μας βγάλει 'nil' στο postwindow! // Μπορούμε να εκχωρήσουμε τιμές στις μεταβλητές ως εξής πάντα η τιμή αναγράφεται δεξιά από το '=' και το όνομα της μεταβλητής αριστερά a.postln; // = 20 // Μπορούμε να κάνουμε και πράξεις μεταξύ τους π.χ. πρόσθεση a.postln; // = 20 c=a+b; // και το αποτέλεσμα μπορώ να το αποδώσω σε όποια μεταβλητή θέλω, π.χ. c c.postln; // και έτσι εκτυπώνω το αποτέλεσμα της πράξης στο postwindow // Ή αλλιώς θα μπορούσα αντί για τις δύο τελευταίες γραμμές: a=a+b; // το αποτέλεσμα να το εκχωρήσω στην ίδια τη μεταβλητή α και a.postln; // στη συνέχεια να το εκτυπώσω ==> Βλέπω ότι η αρχική τιμή του a έχει αντικατασταθεί με τη νέα... = 50 // Μπορώ μάλιστα να τρέξω όλες τις παραπάνω γραμμές κώδικα 'μαζί' εννοώντας όλες τη μία μετά την άλλη, χωρίς να χρειάζεται να τις τρέχω γραμμή-γραμμή..., περιορίζοντάς τες μέσα σε παρενθέσεις και στη συνέχεια τρέχοντάς τες με διπλό κλικ πίσω από τη μία από τις
δύο παρενθέσεις, ως εξής: a.postln; // = 30 a=a+b; a.postln; // = 50 /* ΠΡΟΣΟΧΗ: Οι παραπάνω μεταβλητές είναι καθολικά διαθέσιμες σε όλα τα προγράμματα. Αν θέλω κάποια μεταβλητή να αναφέρεται σε συγκεκριμένο μόνο πρόγραμμα το κάνω με τη δήλωση var στην αρχή του block κώδικα εντός των παρενθέσεων, όπως φαίνεται παρακάτω η ονομασία των μεταβλητών που ορίζω με το var πρέπει οπωσδήποτε να ξεκινούν από πεζό γράμμα. Σε αυτή την περίπτωση παρατηρούμε με τα α.postln εντός και εκτός παρενθέσεων ότι τα α που δηλώνονται με var εντός του block local variables είναι στην πραγματικότητα διαφορετικά από αυτά που είναι εκτός παρενθέσεων global variables. */ a = 10 var a,b; a = 20; b = 30; a.postln; // = 30 a=a+b; a.postln; // = 50 // Μπορώ να κάνω τα παραπάνω και με τελείως νέα ονόματα μεταβλητών: a = 10 var marinos, takis; marinos = 20; takis = 30; marinos.postln; // = 30 marinos=marinos+takis; marinos.postln; // = 50 // Επίσης μπορώ να ορίσω global μεταβλητής εκτός παρενθέσεων, δηλαδή καθολικά διαθέσιμη, πουνα αποτελείται από περισσότερα του ενός γράμματα ή αριθμούς κλπ αρκεί να ξεκινάει από ~ και πεζό γράμμα. ~marinos=5; ~marinos+4; // = 9 // ΣΥΝΑΡΤΗΣΕΙΣ // π.χ. συνάρτηση φχ=α*χ^2+5 /* Αν η ανεξάρτητη μεταβλητή μας είναι το χ με βάση το οποίο θα παίρνουμε τα διαφορετικά
αποτελέσματα της αριθμητικής παράστασης και εσωτερικά στη συνάρτηση θέλω να αλλάζω τους πολλαπλασιαστικούς παράγοντες με τους οποίους αυτή καθορίζεται όταν την τρέχω, ορίζω το χ ως argument όρισμα και το α ως variable μεταβλητή. Μεταβλητές variables είναι κατά κάποιον τρόπο οι 'σταθερές' της συνάρτησης, δηλαδή αυτά τα στοιχεία που μπορεί να αλλάζουν ΕΝΤΟΣ της συνάρτησης ανάλογα με τον αλγόριθμο δηλαδή όταν κάνω interpret τη συνάρτηση θα καθοριστεί με αυτή την τιμή, ενώ ορίσματα arguments είναι ουσιαστικά οι ανεξάρτητες μεταβλητές της συνάρτησης, δηλαδή αυτά τα στοιχεία της που ΑΦΟΥ έχω καθορίσει τη συνάρτηση και την έχω κάνει interpret δηλαδή αφού πλέον ξέρω ποια είναι η ακριβής εξίσωση/αλγόριθμος κλπ, πλέον μπορώ να την καλώ και να παίρνω το εκάστοτε αποτέλεσμα ανάλογα με την εκάστοτε τιμή του χ. */ var f; f = {arg x; a*x**2+5; // Αν τρέξουμε ξεχωριστά μόνο τη συνάρτηση από το f μέχρι το, θα πάρουμε την απάντηση 'a function' αν δεν κάναμε συντακτικό λάθος, δηλαδή θα μας πει ότι πράγματι, η συνάρτηση έχει οριστεί. f.value5; // με τη μέθοδο value λαμβάνουμε και το αποτέλεσμα της συνάρτησης f.value4.postln; // μπορούμε να χρησιμοποιησούμε και αλυσιδωτά μεθόδους, αρκεί να είναι συμβατές, δηλαδή να επιτρέπετια από το περιβάλλον // ή θα μπορούσαμε αντί για το παραπάνω να γράψουμε κατευθείαν: {arg x; a*x+2+5;}.value4; // Φυσικά μπορεί να είναι και συνάρτηση περισσότερων μεταβλητών/ορισμάτων, π.χ. φχ,ψ = 3*χ^2+ψ f = {arg x, y; a*x**2+y f.value7, 8; // Μπορώ επίσης να έχω και αρχικές default τιμές στα ορίσματα ή τις μεταβλητές, με αποτέλεσμα να μπορώ να την καλέσω και να πάρω το αποτέλεσμα ακόμα και χωρίς να δώσω κάτι. f = {arg x=2, y=5; a*x**2+y f.value; // οπότε τρέχει με τιμές x=2, y=5 f.value; // οπότε τρέχει με τιμές x=2, y=5 f.value7, 8; // οπότε τρέχει με τιμές x=7, y=8
// φχ,ψ,ζ = χ^2 + ψ^2 + ζ^2 // ΠΡΟΣΟΧΗ: Η σειρά των πράξεων στο supercollider γίνεται με τις μαθηματικές προτεραιότητες, αλλιώς σε περίπτωση ισάξιων πράξεων από αριστερά προς τα δεξιά. Καλή τακτική είναι να χρησιμοποιούμε παρενθέσεις. f = {arg x=1, y=1, z=1; var sqr1, sqr2, sqr3; sqr1 = x**2; sqr2 = y**2; sqr3 = z**2; sqr1 + sqr2 + sqr3; f.value2,3,4 // Mπορώ να χρησιμοποιήσω και αυτήν την σύνταξη, ώστε να μπορώ να παραλείψω κάποιο όρισμα αν θέλω ό,τι παραλείπω παίρνει την αρχική τιμή f.valuex: 2, y: 3, z: 4; f.valuex: 2, z: 4; // Η συνάρτηση δεν είναι ανάγκη να έχει αριθμητικό αποτέλεσμα.. κάθε άλλο!! f = {arg x; x.postln f.value"hello Class!"