// ============== MATHIMA 5, 28.03.12 ================= // /* ----------------------------------------------------------- SYNTHESIS DEFINITION ------------------------------------------------------------------- /* ======================================= SynthDef ============================================== /* Στα προηγούμενα παραδείγματα των Synth's είχαμε τα εξής 2 ζητήματα: 1. Έπρεπε κάθε φορά να τρέχουμε το Synth για να δημιουργηθεί ΚΑΙ το 'πρότυπο' και το παράδειγμα αυτού του προτύπου 2. Δεν μπορούσαμε να απομονώσουμε την εκκίνηση και τη διακοπή διαφορετικών παραδειγμάτων ενός ίδιου Synth, αλλά κλείναμε τον συνολικό ήχο όλων μαζί. 3. Δεν μπορούσαμε να αλλάζουμε τις τιμές των χαρακτηριστικών τους π.χ. συχνότητα, φάση, πλάτος χωρίς να διακόπτουμε τον ήχο. /* για να μπορέσουμε να έχουμε ουσιαστικό έλεγχο πάνω στον ήχο πρέπει να χρησιμοποιούσουμε Synth Definitions SynthDefs και κατόπιν να παίξουμε τον ήχο με Synth Η σύνταξη είναι : SynthDef\onoma, ugen graph εδώ μέσα }.sends; Ο πιο κοινός τρόπος για να δημιουργήσουμε μεταβλητές δηλ. πράγματα που μπορούμε να αλλάξουμε στο παράδειγμα του SynthDef που θα τρέξουμε είναι να τοποθετήσουμε arguments μέσα στο UGen Graph Function έτσι ονομάζεται η συνάρτηση που τοποθετείται μέσα στο SynthDef. Αυτό μας επιτρέπει να θέσουμε διάφορες τιμές όταν δημιουργήσουμε το ίδιο το Synthesizer Synth. Αυτά δίνονται ως πίνακες στο δεύτερο όρισμα του Synth. Ο πίνακας περιέχει ζευγάρια από ονόματα&τιμές μεταβλητών. Ένας βασικός μπούσουλας template : SynthDef"onoma", arg a=, b= ; // εδώ δηλώνουμε τα ορίσματα, ενδεχομένως και με αρχικές τιμές var sound; sound =... ; // εδώ αρχίζουμε να διαρθρώνουμε ugens. Out.ar0, sound }.sends x=synth"onoma"; y=synth"onoma",[\a,,\b,...]; y.set\b,...; x.free; y.free; /* ΠΑΡΑΔΕΙΓΜΑ //Σε συνάρτηση: x = SinOsc.ar660, 0, 0.2 // Το αντίστοιχο SynthDef: y = SynthDef.new"tutorial-SinOsc", Out.ar0, SinOsc.ar440, 0, 0.2 /* ============================ SCHEDULING ======================= // πως προγραμματίζω κάτι να γίνει στο μέλλον: SystemClock.schedχρόνος σε δευτερόλεπτα,..κώδικας εδώ.. ; nil }; // αν δεν βάλω το nil ο κώδικας θα εκτελείται διαρκώς ανα διαστήματα ίσα με τον χρόνο που έχω δώσει // ή.. κώδικας εδώ.. }.defer χρόνος σε δευτερόλεπτα // πως να δουλέψω με μια λογική 'παρτιτούρας' /* SynthDef"synth1",..}.sends; SynthDef"synth2",..}.sends; a = Synth"synth", [\..,..,\..,..] }.defer1; a.set\.., }.defer3 a.free}.defer5; b = Synth"synth2", [\..,..]}.defer2;... /* ΠΑΡΑΔΕΙΓΜΑ SynthDef"sine", arg freq=200, vol=1, pan=0; var sound; sou = vol*sinosc.arfreq; sound = Pan2.arsou, pan ; Out.ar0, sound; }.sends;
a = Synth"sine" }; a.set\freq,240}.defer1; a.set\pan,1}.defer3; a.free}.defer5; //ΠΡΟΣΟΧΗ, γιατί το SynthDef είναι κάτι που τρέχουμε μόνο μία φορά και άρα σε κάποια πράγματα έχει περιορισμούς. Π.χ. στη χρήση ψευδο-τυχαίων παραμέτρων. Δείτε τις διαφορές σε συνάρτηση και SynthDef εδώ: // first with a Function. Note the random frequency each time 'play' is called. f = SinOsc.ar440 + 200.rand, 0, 0.2 }; x = f.play; y = f.play; z = f.play; x.free; y.free; z.free; // Now with a SynthDef. No randomness! SynthDef"tutorial-NoRand", Out.ar0, SinOsc.ar440 + 200.rand, 0, 0.2 }.sends; x = Synth"tutorial-NoRand"; y = Synth"tutorial-NoRand"; z = Synth"tutorial-NoRand"; x.free; y.free; z.free; //ΣΤΑ SynthDef ΕΙΝΑΙ ΑΠΑΡΑΙΤΗΤΗ Η ΧΡΗΣΗ ΤΟΥ OUT!!! /* ============================================ OUT ============================================== /* Το Out,ar, γράφει ένα ηχητικό σήμα σε ένα ή σε έναν πίνακα από buses, τα οποία αντιστοιχούν στα κανάλια. το πρώτο όρισμά του είναι ο αριθμός της εξόδου απο όπου θα βγει ο ήχος 0 είναι η πρώτη, το δεύτερο ο ήχος που θα αναπαραχθεί, αν ο ήχος είναι πολυκάναλος τότε τα υπόλοιπα κανάλια θα αναπαραχθούν από τις αμέσως επόμενες εξόδους: Out.arkanali/a, sima; // kai an theloume na to akousoume: Out.arkanali/a, sima // akoma perissotero an theloume na spasoume ti sunartisi se kommatia, mporoume na poume oti // ena Ugen pou paragei ixo, p.x. to SinOsc.ar300,0,1 tha to xrisimopoiisoume ws sima mesa stin Ugen Out auto to sima tha einai pou tha bgei apo kapoia eksodo. Mporoume to SinOsc na to dwsoume prwta se mia metabliti, p.x. wave = SinOsc.ar300,0,1; // Sti sunexeia auto to wave einai to sima pou tha bgei apo tin Out, opou tin eksodo ti dinoume ws orisma: arg eksodos=1, sfreq=300, smul=1; var wave; wave = SinOsc.arsfreq,0,smul; Out.areksodos, wave; //Για παράδειγμα τα παρακάτω: /* ΕΝΑΣ ΗΧΟΣ ΕΞΕΡΧΕΤΑΙ ΜΟΝΟ ΑΠΟ ΤΟ ΑΡΙΣΤΕΡΟ ΚΑΝΑΛΙ //Το: SinOsc.ar200 }.scope // ή αλλιώς: SinOsc.ar[200,0] }.scope //είναι ισόδυναμό με το: [SinOsc.ar200, SinOsc.ar0] }.scope //και επίσης ισοδύναμο με το: Out.ar 0, SinOsc.ar200 // Δρομολογεί ένα ημίτονο στην αριστερή έξοδο /* ΕΝΑΣ ΗΧΟΣ ΕΞΕΡΧΕΤΑΙ ΜΟΝΟ ΑΠΟ ΤΟ ΔΕΞΙΟ ΚΑΝΑΛΙ //Το: SinOsc.ar[0,200] }.scope //είναι ισόδυναμό με το: [SinOsc.ar0, SinOsc.ar200] }.scope //και επίσης ισοδύναμο με το: Out.ar 1, SinOsc.ar200 // Δρομολογεί ένα ημίτονο στη δεξιά έξοδο //το παρακάτω Pan2 δεν προλάβαμε να το καλύψουμε στις 04.04.12, αλλά όποιος το καταλαβαίνει και θέλει, μπορεί να το χρησιμοποιήσει στην εργασία /* ========================= PAN2 ============================= // Αν θέλω να τοποθετήσω έναν μονοφωνικό ήχο σε οποιοδήποτε ενδιάμεσο σημείο της στερεοφωνικής εικόνας, μπορώ να κάνω χρήση του Ugen Pan2, η σύνταξη του οποίου είναι: Pan2.ar ήχος, θέση στο φάσμα - η θέση στη στερεοφωνική εικόνα είναι ένας αριθμός από το -1 έως το +1 όπου -1 ισοδυναμεί με τελείως αριστερά, +1 τελείως δεξιά και οι ενδιάμεσες τιμές κάπου ενδιάμεσα. // π.χ. για το κέντρο: Pan2.ar SinOsc.ar200, 0 // για αριστερά:
Pan2.ar SinOsc.ar200, -1 // για δεξιά: Pan2.ar SinOsc.ar200, 1 // τυχαία μετακίνηση του ήχου μεταξύ των καναλιών: Pan2.ar SinOsc.ar200, LFDNoise1.ar1, 1 // Χρησιμοποιώντας το MouseX και το Pan2 ελέγχουμε τη στερεοφωνική εικόνα δυναμικά Pan2.ar SinOsc.ar200, MouseX.kr-1,1 // Θα μπορούσαμε βέβαια να χρησιμοποιήσουμε το LFDNoise1 και για τη συχνότητα του ταλαντωτή: Pan2.arSinOsc.arLFDNoise1.ar4, 500, 450, LFDNoise1.ar2,1 /* Tha mporousame kalista na akousoume kai ton idio ton ixo apeutheias LFNoise1.ar200, 1 //το παρακάτω Mix δεν προλάβαμε να το καλύψουμε στις 04.04.12, αλλά όποιος το καταλαβαίνει και θέλει, μπορεί να το χρησιμοποιήσει στην εργασία /* ========================== MIX =============================== // Μπορώ επίσης να πάρω δύο σήματα, να τα μιξάρω και να βγάλω το ίδιο πράγμα και από τις δύο εξόδους, οπότε τελικά είναι μονοφωνικό το σήμα!!! // αν λοιπόν με τον παρακάτω τρόπο έχω δύο διαφορετικά σήματα στα δύο κανάλια, ~sound = SinOsc.ar[200, 1350], mul:0.5; Out.ar0, ~sound; //, στο παρακάτω μιξάρω τα σήματα αυτά δηλάδη τα προσθέτω μεταξύ τους και μετά τα στέλνω ισόποσα και στις δύο εξόδους, οπότε τα ακούω στη μέση: ~sound = Mix.arSinOsc.ar[200, 350], mul:0.5; Out.ar0, [~sound, ~sound]; // Mix in mono με διαφορετικές σχετικές εντάσεις Mix.ar SinOsc.ar[200, 400], mul:[0.5, 0.3] }.scope // mix in mono // ή αλλιώς ~sound = Mix.arSinOsc.ar[200, 350], mul:0.5; Out.ar[0,1], ~sound; // μεταβολή των σχετικών εντάσεων με 'τυχαίο' τρόπο ~sound = Mix.arSinOsc.ar[200,350], mul:lfdnoise1.kr3,0.5; Out.ar[0,1], ~sound; // μεταβολή και των δύο συχνοτήτων με 'τυχαίο' τρόπο ~sound = Mix.arSinOsc.ar[LFDNoise1.kr4,500,200,LFDNoise1.kr2,1000,50], mul:lfdnoise1.kr3,0.5; Out.ar[0,1], ~sound; // Mixing με 4 συχνότητες ~sound = Mix.arSinOsc.ar[200, 350, 400, 600], mul:0.25; Out.ar0, [~sound, ~sound]; // Λίγο πιο οργανωμένα με τη χρήση μεταβλητών: ~ixos = SinOsc.ar [50,120,315,600,70,800,122], 0, 0.1 ; //πολυφωνικός ~ixos2 = Mix.ar ~ixos ; //μονοφωνικός θα ακουγόταν στο αριστερό κανάλι ως έχει ~ixos3 = Pan2.ar~ixos2, -0.3; // ο προηγούμενος μονοφωνικός τοποθετημένος τώρα στη στερεοφωνία Out.ar0,~ixos3 //στέλνω αυτόν τον στερεοφωνικό πλέον ξεκινώντας από την έξοδο 0 κανάλια: 0,1 // Χρησιμοποιώντας το MouseX και το Pan2 ελέγχουμε τη στερεοφωνική εικόνα δυναμικά ~sound = Mix.arSinOsc.ar[200,400,500], mul:0.3; Out.ar0, Pan2.ar~sound, MouseX.kr-1,1; // Λίγο πιο οργανωμένα με τη χρήση μεταβλητών: ~ixos = SinOsc.ar [50,120,315,600,70,800,122], 0, 0.1 ; //πολυφωνικός
~ixos2 = Mix.ar ~ixos ; //μονοφωνικός θα ακουγόταν στο αριστερό κανάλι ως έχει ~mouse = MouseX.kr-1,1 ~ixos3 = Pan2.ar~ixos2, ~mouse; // ο προηγούμενος μονοφωνικός τοποθετημένος τώρα στη στερεοφωνία ανάλογα με τη θέση του ποντικιού Out.ar0,~ixos3 //στέλνω αυτόν τον στερεοφωνικό πλέον ξεκινώντας από την έξοδο 0 κανάλια: 0,1 // Δημιουργία πριονωτής κυματομορφής με Mix ενός πίνακα σχετικών συχνοτήτων και εντάσεων! Mix a=1,3..13; f=100; SinOsc.ar f*a, 0, 1/a /* Αν δεν κάναμε Mix, όπως φαίνεται παρακάτω, θα ακουγόταν κάθε ημίτονο και σε άλλο κανάλι φυσικά σε ένα σύστημα με 2 κανάλια εξόδου, ακούμε μόνο τα 2 πρώτα a=1,3..13; f=100; SinOsc.ar f*a, 0, 1/a // ΤΕΤΡΑΓΩΝΙΚΗ: // Approximating a square wave using tables f = 200; // base frequency a = [f, f*3, f*5, f*7, f*9, f*11] // odd harmonics only // odd harmonics with amplitudes 1/N in order to produce a square wave Mix.arSinOsc.ara, mul: [1, 1/3, 1/5, 1/7, 1/9, 1/11] // Or even better f = 200; // base frequency c = 1,3..11 // try this also -> c = 1,3..99 c*f // frequency array 1/c // amplitude array Mix.arSinOsc.arc*f, mul:1/c //1. sinewave SinOsc.ar1,3..13*50,0,1/1,3..1 // Τυχαία κίνηση ήχου ~sound = Mix.arSinOsc.ar[200,400,500], mul:0.3; Out.ar0, Pan2.ar~sound, LFDNoise1.kr3; /*ΔΙΑΦΟΡΑ ΠΑΡΑΔΕΙΓΜΑΤΑ //Παρακάτω θα βρείτε διάφορα παραδειγματάκια, έτσι για να σας δώσουν ιδέες. Ούτε κάποια συγκεκριμένη ύλη καλύπτουν, ούτε είναι τίποτα φοβερό. Επίσης, δεν θα ήθελα να τα χρησιμοποιήσετε αυτούσια - είναι απλώς έτσι, για να σας δώσουν ιδέες, πόσα πράγματα μπορείτε να κάνετε με αυτά που ήδη ξέρετε. /*--------------BEATS-------------- // ένας τρόπος... i=sinosc.ar75, mul:0.1; e=env.perc0, 1; k=impulse.kr4; //εξάγει τιμές=1 4 φορές/δευτερόλεπτο, το οποίο χρησιμοποιείται για να trig-άρεται κάθε τόσο η περιβάλλουσα a a=envgen.kre,gate:k; //δες τι κάνει το gate μέσα στο EnvGen ανοιγόκλειμα πύλης για περιβάλλουσα i * a // Εδώ απλώς χρησιμοποιούμε μια περιβάλλουσα που έχουμε φτιάξει εμείς με το Env.new και δίνουμε για χρόνο εξέλιξης της περιβάλλουσας το αντίστροφο του ρυθμού του Impulse οπότε όσο μεγαλύτερος αυτός ο ρυθμός, τόσο πιο σύντομη η περιβάλλουσα, για να μην υπάρχει περίπτωση επικάλυψης των διαδοχικών beat και άρα παραμόρφωση f=10; i=sinosc.ar175, mul:0.5; e=env.new[0,1,0.9,0], [0.05,0.45, 0.5],[-5,0,-5]; k=impulse.krf; a=envgen.kre,gate:k,timescale:1/f; i * a
// Εδώ ο ρυθμός του Impulse έχει αντικατασταθεί από τις οριζόντιες τιμές του ποντικιού: f=mousex.kr1,50; i=sinosc.ar175, mul:0.1; e=env.new[0,1,0.9,0], [0.05,0.45, 0.5],[-5,0,-5]; k=impulse.krf; a=envgen.kre,gate:k,timescale:1/f; i * a // Το ίδιο με πριν, αλλά με τυχαίες συχνότητες μεταξύ 50-1000Hz, που αλλάζουν με την ίδια συχνότητα 4φορές/δευτερόλεπτο k=lfdnoise1.kr4,950,50; i=sinosc.ark, mul:0.1; e=env.perc0, 1; k=impulse.kr4; a=envgen.kre,gate:k; i * a // Το ίδιο με πριν, αλλά με τυχαίο panning, που αλλάζει επίσης με την ίδια συχνότητα 4φορές/δευτερόλεπτο p=lfdnoise1.kr4,1; k=lfdnoise1.kr4,950,50; i=sinosc.ark, mul:0.1; e=env.perc0, 1; k=impulse.kr2; a=envgen.kre,gate:k; i * a * [p,1-p] // Όλα τα παραπάνω είναι προτιμότερο να μπουν σε SynthDef...: SynthDef"mine", arg sfreq=1000,pulse=4; p=lfdnoise1.krpulse,1; i=sinosc.arp*sfreq, mul:0.1; e=env.perc0, 1; k=impulse.kr0.5*pulse; a=envgen.kre,gate:k; o=envgen.krenv.linen1, 2, 3, 0.6,doneAction:2; Out.ar0,i * a * o * [p,1-p] }.sends; x=synth.new"mine"; y=synth.new"mine",[\sfreq,320,\pulse,9]; x.free; y.free; /*--------------RESONZ FILTER-------------- // Με Dust2: Resonz.arDust2.ar5, 300, 0.001, 100 + Resonz.arDust2.ar5, 600, 0.001, 100 + Resonz.arDust2.ar5, 900, 0.001, 100 * 3.reciprocal}.play // Τhis is equivalent to the previous: n = 3; // 99 f = 300; Mix.filln, arg i ; Resonz.arDust2.ar5, f * i+1, 0.001, 100 * n.reciprocal} }.play // borrowed from Chapter 3, The SC Book, MIT Press // Με WhiteNoise: i=impulse.ar5*whitenoise.arenvgen.krenv.perc0.05, 1, 1, -4; Resonz.ari, 300, 0.001, 100 + Resonz.ari, 600, 0.001, 100 +
Resonz.ari, 900, 0.001, 100 * 3.reciprocal}.play i=whitenoise.arenvgen.krenv.perc0.05, 1, 1, -4; Resonz.ari, 300, 0.001, 100 + Resonz.ari, 312, 0.001, 100* 2.reciprocal}.play i=whitenoise.arenvgen.krenv.perc0.05, 1, 1, -4,gate:Impulse.ar5; Resonz.ari, 300, 0.001, 100 + Resonz.ari, 312, 0.001, 100 + Resonz.ari, 600, 0.001, 100 + Resonz.ari, 608, 0.001, 100 + Resonz.ari, 900, 0.001, 100 + Resonz.ari, 905, 0.001, 100 * 6.reciprocal}.play n=6; f=300; j=whitenoise.arenvgen.krenv.perc0.05, 1, 1, -4,gate:Impulse.ar5; Mix.filln, arg i; Resonz.arj, f+2*i*i+1, 0.001, 100*n.reciprocal} /*-------------------ROYTINES------------------- // Αυτά δεν προλάβαμε να τα δείξουμε, αλλά για όποιον ενδιαφέρεται... 10.do arg a; a = a + 1; a.reciprocal.postln }; var func, arr, ffreq=100; SynthDef"example3", arg sfreq=ffreq,pulse=4; p=lfdnoise1.krpulse,1; i=sinosc.arp*sfreq, mul:0.1; e=env.perc0, 1; k=impulse.kr0.5*pulse; a=envgen.kre,gate:k; o=envgen.krenv.n1, 2, 3, 0.6,doneAction:2; Out.ar0,i * a * o * [p,1-p] }.sends; func = arg fores; var pitch; Routine.new fores.do arg fores, index, fr; fr=fores*index+1*ffreq; fr.postln; Synth.new"example3", [\sfreq, fr, \dur, 1]; "-----------------".postln; 6.6.wait; }; }; }; arr = 1,3..11; //Θα μπορούσαμε να το γράψουμε και έτσι: // arr = [ 1, 3, 5, 7, 9, 11]; func.valuearr.play;
// Σημείωση: // Δίνοντας στις fores έναν πίνακα, η επανάληψη εκτελείται όσο είναι το μέγεθος του πίνακα, ενώ το περιεχόμενό του χρησιμοποιείται εκεί που έχουμε δώσει την παράμετρο όρισμα fores, αφού το fores παίρνει την τιμή του arr που έχει δοθεί ως όρισμα μέσα στο func.value. Ουσιαστικά, αυτό που κάνουμε είναι ότι τοποθετούμε μια ρουτίνα μέσα σε μια συνάρτηση, έτσι ώστε να μπορούμε να έχουμε wait λόγω της ρουτίνας δεν υπάρχει η δυνατότητα αυτή στη συνάρτηση και χρήση ορισμάτων λόγω της συνάρτησης δεν υπάρχει απ'αυθείας στη ρουτίνα. Δίνοντας το ίδιο ή διαφορετικό όνομα στα ορίσματα της ρουτίνας και της συνάρτησης, περνάμε με τη μέθοδο value τιμές μέσω της συνάρτησης στη ρουτίνα. Στο wait έχω δώσει τιμή 6.6sec, γιατί τόσο διαρκεί η περιβάλλουσα του Synth. // Σημείωση: // Εδώ η συχνότητα αλλάζει σε κάθε instance του Synth. var func, arr, ffreq=100, ttime=1; SynthDef"example3", arg sfreq=ffreq,pulse=4,stime=ttime; p=lfdnoise1.krpulse,1; i=sinosc.arp*sfreq, mul:0.1; e=env.perc0, 1; k=impulse.kr0.5*pulse; a=envgen.kre,gate:k; o=envgen.krenv.linen1, 2, 3, 0.6,timeScale:stime,doneAction:2; Out.ar0,i * a * o * [p,1-p] }.sends; func = arg fores; var pitch; Routine.new fores.do arg fores, index, fr; fr=fores*index+1*ffreq; fr.postln; ttime=fores; Synth.new"example3", [\sfreq, fr, \stime, ttime]; "-----------------".postln; ttime.postln; ttime.wait; }; }; }; arr = 1,3..11; //Θα μπορούσαμε να το γράψουμε και έτσι: // arr = [ 1, 3, 5, 7, 9, 11]; func.valuearr.play; var func, arr, ffreq=200, ttime=1; SynthDef"example3", arg sfreq=ffreq,pulse=4,stime=ttime; p=lfdnoise1.krpulse,1; i=sinosc.arp*sfreq, mul:0.1; e=env.perc0, 1; k=impulse.kr0.5*pulse; a=envgen.kre,gate:k; o=envgen.krenv.linen0.1, 0.25, 0.6, 0.05,timeScale:stime,doneAction:2; Out.ar0,i * a * o * [p,1-p] }.sends; func = arg fores; var pitch; Routine.new fores.do arg fores, index, fr, dur; "-------".post; index+1.post; "o----------".postln; fr=fores*index+1*ffreq; "freqeuncy: ".post;fr.post;" Hz".postln; ttime=10.rand+1;
"duration: ".post;ttime.post;" sec".postln; Synth.new"example3", [\sfreq, fr, \stime, ttime, \pulse, 100/ttime]; 0.5*ttime.wait; }; }; }; arr = 1,3..9; //Θα μπορούσαμε να το γράψουμε και έτσι: // arr = [ 1, 3, 5, 7, 9, 11]; func.valuearr.play; // Άλλο παράδειγμα ρουτίνας απλώς καθυστέρηση διαδικασιών // Next we combine all the above using a Routine just for fun ~myroutine = Routine n = 10; f = 150; FreeVerb.arMix.filln, arg i ; Resonz.arDust2.ar2, f * i+1, 0.001, 100 * n.reciprocal}, 0.5, 0.5, 0.5, 7.dup; 4.wait; SinOsc.ar75, mul:0.1.tanh * EnvGen.krEnv.perc0, 1, gate: Impulse.kr4 SinOsc.ar150, mul:0.1 * EnvGen.krEnv.perc0, 1, gate: Impulse.kr1}.plays,1}.defer0.01; 4.wait; SinOsc.ar75*1.5, mul:0.1.tanh * EnvGen.krEnv.perc0, 2, gate: Impulse.kr1}.play}.defer0.1; 4.wait; Pan2.arHPF.arPinkNoise.ar0.5 * EnvGen.krEnv.perc0, 0.01, gate: Impulse.kr8, 10000, TChoose.krImpulse.kr8, [-1,1] }; ~myroutine.play; // play the routine /* ================================================================ /* ====================ΠΡΟΣΘΕΤΑ, ΕΚΤΟΣ ΥΛΗΣ======================= /* ================================================================ /* ====================== MICROPHONE INPUT ========================== // Using a Microphone with SoundIn Το SoundIn μας επιτρέπει να πάρουμε το σήμα από κάποια είσοδο της κάρτας ήχου του υπολογιστή. - > SoundIn.arbus, mul, add // το bus καθορίζει την είσοδο ή τις εισόδους από της οποίες θα διαβάσουμε, 0 είναι η πρώτη είσοδος της κάρτας ήχου. // χρησιμοποιείστε το built-in μικρόφωνο, φορέστε ακουστικά για να αποφύγετε το feedback SynthDef"input0", var sig; sig = SoundIn.ar0; Out.ar0, sig; }.sends; x = Synth"input0"; s.meter // για να δείτε ποιες εισόδους & εξόδους χρησιμοποιείτε κάθε φορά x.free;
/* ======================= SAMPLE =========================== // ΑΝΑΠΑΡΑΓΩΓΗ ΗΧΗΤΙΚΟΥ ΔΕΙΓΜΑΤΟΣ /*Το πρώτο όρισμα του PlayBuf είναι ο αριθμός των καναλιών του αρχείου που έχουμε φορτώσει στον buffer 2 αν είναι stereo. Το δεύτερο όρισμα είναι ο δείκτης του buffer που θα χρησιμοποιηθεί. Το τρίτο rate καθορίζει την ταχύτητα που θα παίξει το δείγμα 1: η συχνότητα δειγματοληψίας του server, 2: μία οκτάβα πάνω, 0.5 μία οκτάβα κάτω. Το τέταρτο trigger κάνει το PlayBuf να παίξει από το startpos αυτό μπορεί να συμβεί όταν ένα σήμα περάσει από το αρνητικό στο θετικό μέρος. Το πέμπτο startpos δηλώνει ένα sample frame από το οποίο αρχίζει να παίζει Το έκτο loop λουπάρει το αρχείο 1==true, 0==false // Ενός καναλιού για μονοφωνικό b = Buffer.reads, "sounds/bahauddin_l.wav"; // φορτώνει ένα αρχείο που βρίσκεται μέσα στο φάκελο sounds του SC. SynthDef"playBuf1", arg out = 0, bufnum = 0, rate = 1, amp=0.6; Out.arout, amp * PlayBuf.ar1, bufnum, rate, loop:1 }.sends; c=synth"playbuf1",[\bufnum,b, \rate,0.5]; // παίζει στην ταχύτητα δειγματοληψίας του server. c.set\rate,0.5 // οκτάβα πάνω c.set\rate,1.5 // πέμπτη καθαρή πάνω c.free; // ελευθερώνει το Synth // Δύο καναλιών για στερεοφωνία d = Buffer.reads, "sounds/kaz.wav"; // φορτώνει ένα αρχείο που βρίσκεται μέσα στο φάκελο sounds του SC. SynthDef"playBuf1", arg out = 0, bufnum = 0, rate = 1, amp=0.6; Out.arout, amp * PlayBuf.ar2, bufnum, rate, loop:1 }.sends; e=synth"playbuf1",[\bufnum,b, \rate,0.5]; // παίζει στην ταχύτητα δειγματοληψίας του server. e.set\rate,0.5 // οκτάβα πάνω e.set\rate,1.5 // πέμπτη καθαρή πάνω e.free; // ελευθερώνει το Synth