Περιγραφή
Η δυναμική αλγοριθμική παρτιτούρα βρίσκεται στη καρδιά του ετερογενούς συστήματος GEA. Είναι αυτή που καθορίζει την χρονική δομή. Η χρονική δομή είναι ένα σύνολο απο συμβάντα που κάθε ένα αυτά μπορεί να είναι μια αλλαγή στο σύστημα του ήχου ή της εικόνας, που έχει άμεσα ή έμεσα ενα ηχητικό η ένα οπτικό ή ένα οπτικοακουστικό αποτέλεσμα. Παράδειγμα είναι να αρχίζει να παίζει ένας ήχος ή να αλλάξει ένταση ή αντίστοιχα στα γραφικά να εμφανιστεί ένα τετράγωνο ή να αλλάξει χρώμα.
Παράδειγμα χρήσης της Δυναμικής Αλγοριθμικής Παρτιτούρας
Hicaz makam with drones
Στο παράδειγμα θα προσπαθήσουμε να αναπαραγάγουμε έναν ισοκράτη του οποίου η συχνότητα θα αλλάζει μέσα στη πορεία του χρόνου.
Αρχικά δημιουργούμε SuperCollider έναν ισοκράτη
SynthDef( \drone, {|freq1= 110, freq2= 220, freq3= 440, fmod1= 0.11, fmod2= 0.22, fmod3= 0.33, fmoda1= 1, fmoda2=1,fmoda3= 1, pmod1= 0.1, pmod2= 0.2, pmod3= 0.3, amod1= 0.01, amod2= 0.02, amod3= 0.03,amoda1= 0.05, amoda2= 0.05, amoda3= 0.05, smod= 0.13, smoda= 5, smodm= 6, smodaa=8,smodmm=50, cmod= 1.2, cmoda= 0.6, room= 20, reverb= 5, damp= 1, input= 0.5, spread= 25, dry=0, early= 1, tail= 1, amp= 0.7| Out.ar(0, Limiter.ar( LeakDC.ar( GVerb.ar( Splay.ar( SinOsc.ar([freq1, freq2, freq3]+SinOsc.ar([fmod1, fmod2, fmod3], 0, [fmoda1, fmoda2, fmoda3]), SinOsc.ar([pmod1, pmod2, pmod3], 0, 2pi), SinOsc.ar([amod1, amod2, amod3], 0, [amoda1, amoda2, amoda3])), SinOsc.ar( SinOsc.ar( SinOsc.ar(smod, 0, smoda, smodm), 0, smodaa, smodmm), 0, 1, 1), amp, SinOsc.ar(cmod, 0, cmoda) ), room, reverb, damp, input, spread, dry, early, tail))))} ).add
Αρχικά θα υλοποιήσουμε το σκοπό μας μέσω του fork
. Για την εύκολη και σωστή χωρίς τυπογραφικά λάθη χρησή του fork
θα δημιουργήσουμε ένα YASnippet στο emacs στο υποφάκελο sc-mode, όπου υπάρχουν πολλά ήδη χρήσιμα snippets.
Έτσι πλέον δημιουργώ ;ena fork
:
x = Synth(\drone) //: ~waitTime = 2.5; //: { x.set([\freq1, 0.5*Perde.dugiah], [\freq2, 0.25*Perde.dugiah], [\freq3, Perde.dugiah]); ~waitTime.wait; x.set([\freq1, 0.5*Perde.dik_kiourdi], [\freq2, 0.25*Perde.dik_kiourdi], [\freq3, Perde.dik_kiourdi]); ~waitTime.wait; x.set([\freq1, 0.5*Perde.nim_hicaz], [\freq2, 0.25*Perde.nim_hicaz], [\freq3, Perde.nim_hicaz]); ~waitTime.wait; x.set([\freq1, 0.5*Perde.neva], [\freq2, 0.25*Perde.neva], [\freq3, Perde.neva]); ~waitTime.wait; x.set([\freq1, 0.5*Perde.huseini], [\freq2, 0.25*Perde.huseini], [\freq3, Perde.huseini]); ~waitTime.wait; x.set([\freq1, 0.5*Perde.evits], [\freq2, 0.25*Perde.evits], [\freq3, Perde.evits]); ~waitTime.wait; x.set([\freq1, 0.5*Perde.gerdanie], [\freq2, 0.25*Perde.gerdanie], [\freq3, Perde.gerdanie]); ~waitTime.wait; x.set([\freq1, 0.5*Perde.muhagier], [\freq2, 0.25*Perde.muhagier], [\freq3, Perde.muhagier]); }.fork //:
Yuruk Semai
Το πρόβλημα που θα προσπαθήσουμε να λύσουμε να δημιουργήσουμε έναν μουσικό κομμάτι του οποίου θα μπορούμε να αλλάξουμε τη δομή ενώ αυτό εκτελείται. Το κομμάτι που θα χρησιμοποιήσουμε είναι το ακόλουθο:
- Εκτελούμε τον παρακάτω κώδικα βήμα προς βήμα
~yuruk = SC_Score.new; // Create new Score ~yuruk.dests = [Dests.addr1]; // Add a destination ~yuruk.title = '/yuruk'; // Add a title ~yuruk.tags = (1..6); // Define the metro (6/8) ~yuruk.step = [1, 1, 1, 1, 1, 1]/1; // Define the bpm 1sec -> 1/8 ~yuruk.loop; // play the score add loop it!
Τώρα αν εκτυπώσουνε όλα τα μηνύματα του στέλνει ο Server μας (OSCFunc.trace(true)
) θα διαπιστώσουμε οτι αποστέλνονται μηνύματα κάθε δευτερόλεπτο με όνομα /yuruk
και περιεχόμενο το αύξων αριθμό των tag
.
OSC Message Received: time: 15120.391949858 address: a NetAddr(127.0.0.1, 57120) recvPort: 57120 msg: [ /yuruk, 5 ] OSC Message Received: time: 15121.38636016 address: a NetAddr(127.0.0.1, 57120) recvPort: 57120 msg: [ /yuruk, 6 ]
Ανάλυση του κώδικα
The AlgorithmicDynamicScore.sc file contains all the classes that Algorithmic Dynamic Score is needed. Those classes are:
- ScoreDefinition - Καθορισμός των track
- ScoreImplementation - Φόρτωση των απαραίτητων ανταποκριτών για την εκτέλεση track
- Dests - Ομαδοποίηση διευθήνσεων που περιμένουν τα μηνύματα της αλγοριθμικής παρτιτούρας
- ProxyPatternScore - Δημιουργία κενού pattern (πυρήνας αλγοριθμικής παρτιτούρας)
- RespTags - Πρότυπο αυτοματοποίησης εισαγωγής ανταποκριτών (responder)
Ο κώδικας της Δυναμικής Αλγοριθμικής Παρτιτούρας βρίσκεται στη δεξαμενή (repository) του github 1.
Αρμοδιότητες
Η υλοποίηση της δομής γίνεται με την δημιουργία ενός κετρικού χρονικού εξυπηρετητή (Time Server) που θα τον ονομάσουμε Maestro. Ο Maestro καθορίζει και ελεγχει την χρονική δομή καθώς και σημασιολογικά στοιχεία της σύνθεσης σχετικά με την εξέλιξη της σύνθεσης μέσα στο χρόνο. Αναλυτικότερα έχει τις παρακάτω αρμοδιότητες:
- καθορίζει την τιμή των bangs/min (bpm)
- μετράει τα bangs απο την αρχή που άρχισε να τρέχει
- μετράει τα bangs απο την τελευταία αλλαγή του tempo
- μετράει τον χρόνο που πέρασε απο την αρχή άρχισε να τρέχει
- μετράει τον χρόνο που πέρασε απο την τελευταία αλλαγή
- καθορίζει δομές επανάληψεις (μέτρα).
- καθορισμός ισχυρών και ασθενών bangs στη μετρική δομή απο την θεωρία της μουσικής
- μετράει τα μέτρα που έχουν περάσει
- δυνατότητα αλλαγής bpm
- δυνατότητα αλλαγής δομής επανάληψης μετά το πέρας το τρέχοντα κύκλου
- δυνατότητα ένταξης λειτουργίών
- μέσα στη δομή επανάληψης
- στο επόμενο bang
- σε πραγματικό χρόνο
- ~playTrack1.tags = [1,2,3,4].reverse; //scramble όταν τελιώνει το μέτρο
Παράδειγμα
Παράδειγμα για τον καθορισμό επαναληπτικής δομής 4 βημάτων, στέλνει τα ακόλουθα μηνύματα μεσα στο ρυθμό:
[\metro1,\bang1], [\metro1,\bang2], [\metro1,\bang3], [\metro1,\bang4], [\metro2,\bang1], [\metro2,\bang2] κ.τ.λ.
Λέξεις Κλειδιά
- Προκαθορισμένη Δομή στο Χρόνο
- Ζωντανή Παρτιτούρα
- Real-time Notation
- Αλγοριθμική Σημειογραφία