Το προφίλ μας στο Google Plus
0

Κατασκευάστε έναν υπολογιστή, μέρος 5: Ηλεκτρικά γρατζουνίσματα

Το μικρό PC που βαλθήκαμε να κατασκευάσουμε με μερικούς μόνο μικροελεγκτές, διαθέτει και κάρτα ήχου. Μην περιμένετε ν’ ακούσετε ήχο υψηλής πιστότητας, αλλά να είστε σίγουροι ότι αν ασχοληθείτε μ’ αυτή θα κολλήσετε. Το firmware της κάρτας μπορεί να συνθέσει ηλεκτρονικές μελωδίες, σαν αυτές που συνόδευαν τα παλιά Arcade games.

Τα πρώτα PC ενσωμάτωναν μόνο ένα μικρό ηχείο, από το οποίο ακούγονταν μονότονα, βαρετά μπιπ. Εμείς βέβαια, κατασκευάζοντας τον δικό μας υπολογιστή, δεν έχουμε κανένα λόγο να περιοριστούμε στον κόσμο των PC. Την ίδια εποχή κυκλοφορούσαν και άλλοι υπολογιστές, που διέθεταν εξειδικευμένα κυκλώματα ήχου και παιχνίδια με εντυπωσιακή μουσική. Προφανώς, εκείνα τα τσιπάκια ήχου προσέφεραν στοιχειώδεις λειτουργίες και δεν θύμιζαν σε τίποτα τους σύγχρονους απογόνους τους. Σκεφτείτε ότι τα περισσότερα μπορούσαν να παράγουν μόνο τετραγωνικά ή τριγωνικά κύματα, ενώ σ’ ορισμένες περιπτώσεις προσέφεραν και πέντε-έξι υποτυπώδη εφέ. Οι προγραμματιστές της εποχής, για να συνθέσουν τις μελωδίες που συνόδευαν τα παιχνίδια συνδύαζαν τους ελάχιστους διαθέσιμους πόρους με ευφάνταστους τρόπους. Εξάλλου, πολύ συχνά κατέληγαν να χακάρουν τα τσιπ, αφού τα χρησιμοποιούσαν με τρόπους δεν είχαν προβλέψει ούτε οι κατασκευαστές τους. Κάτι τέτοιο συνέβη και με το κύκλωμα ήχου του Commodore 64, το περίφημο SID (Sound Interface Device) 6581/8580. Η τεράστια εμπορική επιτυχία του εν λόγω υπολογιστή και τα αμέτρητα παιχνίδια που κυκλοφόρησαν γι’ αυτόν, έκαναν το συγκεκριμένο κύκλωμα ιδιαίτερα δημοφιλές. Αρκεί να σας πούμε ότι υπάρχουν προγραμματιστές/μουσικοί που συνθέτουν κομμάτια για το συγκεκριμένο τσιπάκι μέχρι σήμερα. Τα περίφημα chiptunes και η σχετική σκηνή (demo scene) επηρεάστηκαν σε μεγάλο βαθμό από την ύπαρξη του SID.

Το τσιπάκι ήχου SID, επάνω στη μητρική του Commodore 64. Πρόκειται για έναν υπολογιστή που σχεδόν σαράντα χρόνια μετά διατηρεί παγκόσμιο ρεκόρ πωλήσεων.

Το τσιπάκι ήχου SID, επάνω στη μητρική του Commodore 64. Πρόκειται για έναν υπολογιστή που σχεδόν σαράντα χρόνια μετά διατηρεί παγκόσμιο ρεκόρ πωλήσεων.

Το δικό μας κύκλωμα ήχου δεν διαφέρει πολύ από εκείνα που έδιναν φωνή στους πρώτους “οικιακούς υπολογιστές”. Όπως υποψιάζεστε, και για εμάς πηγή έμπνευσης αποτέλεσε το SID. Η εν λόγω κάρτα –αν και θα έπρεπε να μιλάμε για το firmware που τρέχει στον μικροελεγκτή–, προσφέρει τέσσερα ανεξάρτητα κανάλια ήχου, που μπορούν να παίζουν ταυτόχρονα. Το ένα από αυτά παράγει μόνο τριγωνικά κύματα, τα άλλα δύο περιορίζονται σε τετραγωνικά κύματα, ενώ το τέταρτο μπορεί να παράγει μόνο θόρυβο. Επιπρόσθετα, προσφέρονται τα εφέ pitch-bend up, pitch-bend down και vibrato. Το κύκλωμα ήχου μπορεί να παίζει όποιες νότες θέλουμε, σε ένα ή και σε περισσότερα κανάλια ταυτόχρονα, εφαρμόζοντας όποιο εφέ επιθυμούμε σε κάθε νότα ξεχωριστά. Πρόκειται για ένα εξαιρετικά φτωχό αντίγραφο του SID, αλλά αν έχετε όρεξη και την απαιτούμενη έμπνευση, να είστε σίγουροι ότι θα μεγαλουργήσετε. Τι, δεν μας πιστεύετε; Αν όχι κατεβάστε το σχετικό archive από εδώ κι ακούστε τι έγραψε ένας φίλος μουσικός, “επάνω” στην κάρτα ήχου του υπολογιστή μας.

Το SID χρησιμοποιείται ακόμα και σήμερα, από τους νοσταλγούς της παλιάς ηλεκτρονικής μουσικής. Στη φωτογραφία φαίνεται το εσωτερικό του HardSID Quatro. Πρόκειται για μια εξωτερική κάρτα ήχου που στελεχώνεται από τέσσερα SID(!) και συνεργάζεται με τα περισσότερα software synthesizers που υποστηρίζουν το SID. Ναι, υπάρχουν πολλά soft-synth που υποστηρίζουν το SID και όταν δεν υπάρχει διαθέσιμο, το εξομοιώνουν.

Το SID χρησιμοποιείται ακόμα και σήμερα, από τους νοσταλγούς της παλιάς ηλεκτρονικής μουσικής. Στη φωτογραφία φαίνεται το εσωτερικό του HardSID Quatro. Πρόκειται για μια εξωτερική κάρτα ήχου που στελεχώνεται από τέσσερα SID(!) και συνεργάζεται με τα περισσότερα software synthesizers που υποστηρίζουν το SID. Ναι, υπάρχουν πολλά soft-synth που υποστηρίζουν το SID και όταν δεν υπάρχει διαθέσιμο, το εξομοιώνουν.

Αντίστροφη πορεία
Όπως είδαμε στο ξεκίνημα της σειράς, το κύκλωμα ήχου δεν περιλαμβάνει κανένα εξωτικό ολοκληρωμένο. Απαρτίζεται από έναν ATmega328 (o μικροελεγκτής του Arduino) και ένα δίκτυο αντιστάσεων, που λειτουργεί σαν υποτυπώδης DAC (Digital to Analog Converter). Μπορείτε να διαβάσετε περισσότερα για τη λειτουργία αυτού του μετατροπέα στο άρθρο “Από τη θεωρία στην πλακέτα”, του τεύχους 047.

Το 1989 κυκλοφόρησε μια κάρτα ήχου για τον δίαυλο ISA, που στηριζόταν στο SID. Παρεμπιπτόντως, ο δίαυλος ISA είναι πρόγονος του διαύλου PCI, ο οποίος με τη σειρά του είναι πρόγονος του PCI Express. Στη φωτογραφία βλέπουμε δύο κλώνους της (πανάρχαιας) κάρτας ήχου, κατασκευασμένους το 2010 από λάτρεις του SID.

Το 1989 κυκλοφόρησε μια κάρτα ήχου για τον δίαυλο ISA, που στηριζόταν στο SID. Παρεμπιπτόντως, ο δίαυλος ISA είναι πρόγονος του διαύλου PCI, ο οποίος με τη σειρά του είναι πρόγονος του PCI Express. Στη φωτογραφία βλέπουμε δύο κλώνους της (πανάρχαιας) κάρτας ήχου, κατασκευασμένους το 2010 από λάτρεις του SID.

Η σύνθεση του ήχου, λοιπόν, πραγματοποιείται από το πρόγραμμα που τρέχει στον μικροελεγκτή και η τεχνική που επιλέξαμε γι’ αυτή τη δουλειά ονομάζεται DDS (Direct Digital Synthesis). Για να κατανοήσετε εύκολα την κεντρική ιδέα πίσω από αυτή τη μέθοδο, σκεφτείτε για λίγο την αντίστροφη διαδικασία: την ψηφιοποίηση του ήχου. Αρχικά, με τη βοήθεια ενός μικροφώνου, οι μηχανικές ταλαντώσεις που συνιστούν τον ήχο μετατρέπονται σε ηλεκτρικές ταλαντώσεις. Στη συνέχεια, αυτό το ηλεκτρικό σήμα οδηγείται σ’ έναν ADC (Analog to Digital Converter). O συγκεκριμένος μετατροπέας λαμβάνει αλλεπάλληλα δείγματα από το εισερχόμενο σήμα, με μια συχνότητα που ονομάζεται “συχνότητα δειγματοληψίας” (sampling frequency). Παρεμπιπτόντως, μια τυπική τιμή αυτού του μεγέθους είναι τα 44100Hz — όλο και κάπου θα την έχει πάρει το μάτι σας. Για κάθε δείγμα που λαμβάνει ο ADC παράγεται ένας αριθμός που περιγράφει τη στιγμιαία τιμή της τάσης. Οι αριθμοί που προκύπτουν κατ’ αυτόν τον τρόπο αποτελούν την ψηφιακή αναπαράσταση της ηλεκτρικής ταλάντωσης και, κατ’ επέκταση, περιγράφουν το αρχικό ηχητικό κύμα. Πίσω από την προηγούμενη περιγραφή κρύβονται πολλές σημαντικές λεπτομέρειες, αλλά δεν υπάρχει λόγος να επεκταθούμε. Αρκεί να έχετε υπόψη τη γενική ιδέα. Η μέθοδος DDS προβλέπει την ακριβώς αντίστροφη εργασία. Για να συνθέσουμε έναν ήχο υπολογίζουμε όλες εκείνες τις αριθμητικές τιμές, τις οποίες αν μετατρέψουμε σε τάσεις θα πάρουμε μια ηλεκτρική ταλάντωση όμοια με το ζητούμενο ηχητικό κύμα. Για παράδειγμα, αν θέλουμε να συνθέσουμε τη νότα που ονομάζεται “μεσαία Λα”, πρέπει να συνθέσουμε ένα αρμονικό κύμα συχνότητας 440Hz. Επομένως, πρέπει να ξεκινήσουμε υπολογίζοντας τις διαδοχικές τιμές μιας ημιτονοειδούς συνάρτησης. Στη συνέχεια πρέπει να μετατρέψουμε αυτές τις τιμές σε τάσεις, με κατάλληλο ρυθμό, ώστε να προκύψει μια ηλεκτρική ταλάντωση συχνότητας 440Hz.

Υλικά μιας άλλης εποχής
Περιγράφοντας τα πρώτα κυκλώματα ήχου, όπως και τις δυνατότητες του δικού μας, ενδέχεται να προέκυψαν ορισμένες απορίες. Τι σχέση έχουν τα τριγωνικά και τα τετραγωνικά κύματα με τον ήχο; Τι δουλειά έχει ο θόρυβος σε μια κάρτα ήχου;

Θεωρητικά, ο ήχος μιας νότας αποτελεί ένα απλό αρμονικό κύμα. Ακριβώς γι’ αυτό, συνηθίζουμε να λέμε ότι πρόκειται για ένα ημιτονοειδές κύμα και το περιγράφουμε μαθηματικά με τη βοήθεια κάποιας τριγωνομετρικής συνάρτησης. Ας επιστρέψουμε όμως στο θέμα μας. Οι παλιοί υπολογιστές δεν προλάβαιναν να υπολογίσουν τις διαδοχικές τιμές μιας ημιτονοειδούς συνάρτησης, ώστε να συνθέσουν το αντίστοιχο κύμα σε πραγματικό χρόνο. Έτσι, οι σχεδιαστές των κυκλωμάτων ήχου είχαν καταφύγει σε μια πονηρή λύση: Αντί να παράγουν ημιτονοειδή κύματα, παρήγαγαν τριγωνικά (triangle waves). Ο ήχος των τριγωνικών κυμάτων μοιάζει αρκετά με τον ήχο των αρμονικών, αλλά δεν είναι καθαρός. Το μεγάλο του προτέρημα είναι ότι παράγεται πανεύκολα. Σκεφτείτε ότι όλη η δουλειά του hardware περιορίζεται σε διαδοχικές προσθέσεις και αφαιρέσεις, που όπως και να το κάνουμε είναι πολύ ευκολότερες από τον υπολογισμό των τιμών μιας τριγωνομετρικής συνάρτησης. Αυτή η έκπτωση στην ποιότητα του ήχου ήταν απόλυτα αποδεκτή για την εποχή, αλλά δεν αρκούσε για να καλύψει τις σχετικές ανάγκες. Εκείνοι που συνέθεταν μουσική για τα παιχνίδια χρειάζονταν αρκετά διαφορετικά “μουσικά όργανα”. Οι σχεδιαστές του hardware βρήκαν πάλι τη λύση: τετραγωνικά κύματα (square waves). Όπως αντιλαμβάνεστε, ο ήχος αυτών των κυμάτων είναι ακόμα πιο τραχύς από τον ήχο των τριγωνικών, αλλά η χρήση τους κρύβει δυο σημαντικά πλεονεκτήματα. Αφενός, ένα τετραγωνικό κύμα παράγεται πολύ πιο εύκολα από ένα τριγωνικό, αφού σχηματίζεται από δύο μόνο τιμές. Αφετέρου, μεταβάλλοντας το duty cycle (δηλαδή τη χρονική διάρκεια της μίας στάθμης σε σχέση με την περίοδο του κύματος), η χροιά του ήχου αλλοιώνεται σε μεγάλο βαθμό και μοιάζει να προέρχεται από διαφορετικό όργανο. Ως εκ τούτου, τα τσιπάκια που παρήγαγαν τετραγωνικά κύματα προσέφεραν τον ήχο διαφορετικών οργάνων, αξιοποιώντας το ίδιο ακριβώς υποσύστημα. Για το τέλος αφήσαμε το θόρυβο. Οι μουσικοί τον χρησιμοποιούσαν για να μιμηθούν τον ήχο των τυμπάνων (με αρκετή φαντασία, ομολογουμένως) καθώς και για την ηχητική επένδυση ειδικών καταστάσεων/συμβάντων στα παιχνίδια. Γι’ αυτό το λόγο, πέρα από τον εγγενή θόρυβο που υπήρχε ούτως ή άλλως στα κυκλώματα ήχου, οι μηχανικοί ενσωμάτωναν και γεννήτριες θορύβου.

Αρχικά συνδέσαμε την έξοδο της κάρτας ήχου του μικρού υπολογιστή, στην είσοδο της κάρτας ήχου του μεγάλου. Μετά βάλαμε τον μικρό υπολογιστή να παίξει το theme του Bubble Bobble και τον μεγάλο υπολογιστή να αποθηκεύσει το εισερχόμενο σήμα. Στην εικόνα φαίνεται ένα στιγμιότυπο της κυματομορφής. Όταν ακούς και τη μουσική, τα χοντροκομμένα τετράγωνα γίνονται ξαφνικά πολύ πιο όμορφα!

Αρχικά συνδέσαμε την έξοδο της κάρτας ήχου του μικρού υπολογιστή, στην είσοδο της κάρτας ήχου του μεγάλου. Μετά βάλαμε τον μικρό υπολογιστή να παίξει το theme του Bubble Bobble και τον μεγάλο υπολογιστή να αποθηκεύσει το εισερχόμενο σήμα. Στην εικόνα φαίνεται ένα στιγμιότυπο της κυματομορφής. Όταν ακούς και τη μουσική, τα χοντροκομμένα τετράγωνα γίνονται ξαφνικά πολύ πιο όμορφα!

Ζήτημα ποιότητας
Έχετε δει ποτέ τη σύγκριση ψηφιακών φωτογραφικών μηχανών, με βάση τα Megapixels; Περιττό να πούμε ότι μια τέτοια σύγκριση είναι πέρα ως πέρα λανθασμένη, αφού η τελική ποιότητα της εικόνας καθορίζεται κατά κύριο λόγο από το φακό. Τι να τα κάνεις τα 10 Gigapixels, αν η εικόνα που φτάνει στον αισθητήρα είναι θολή; Δεν προσπαθούμε να σας πείσουμε ότι το πλήθος των pixels είναι αδιάφορο. Η ανάλυση του αισθητήρα καθορίζει το άνω όριο στην ποιότητα των φωτογραφιών. Όμως, η ποιότητα καθορίζεται περισσότερο από τη δυνατότητα σωστής εστίασης κι από την ποσότητα του φωτός που φτάνει στον αισθητήρα. Με άλλα λόγια, τα πολλά Megapixels δεν δίνουν πάντα καλύτερες φωτογραφίες. Αναρωτιέστε γιατί αλλάξαμε θέμα; Είναι που σχεδιάζοντας τον synthesizer ο οποίος δίνει φωνή στην κάρτα ήχου, κινδυνέψαμε να πέσουμε στην ίδια παγίδα.

Η κεντρική ιδέα πίσω από τη μέθοδο DDS είναι αρκετά απλή. Όμως στο παράδειγμα που αναφέραμε υπήρχε μια ασάφεια. Τι σημαίνει η φράση “με κατάλληλο ρυθμό”; Στη διαδικασία της ψηφιοποίησης, ο ρυθμός δειγματοληψίας είναι σταθερός και η επιλογή του γίνεται σύμφωνα με το θεώρημα της δειγματοληψίας (γνωστό και ως “Θεώρημα Whittaker – Nyquist – Kotelnikov – Shannon”). Το εν λόγω θεώρημα καθορίζει μια ελάχιστη τιμή για τη συχνότητα δειγματοληψίας κι αν προσπεράσουμε τις μαθηματικές διατυπώσεις, η κεντρική ιδέα έχει ως εξής: Όσο πιο “πυκνά” είναι τα δείγματα που λαμβάνουμε, τόσο πιο πιστή θα είναι και η περιγραφή του ηχητικού κύματος. (Σ.τ.Ε. Είδατε τα μαθηματικά, που πάντα βγάζουν νόημα;) Αυτό μπορεί να το αντιληφθεί κανείς και διαισθητικά. Η συχνότητα δειγματοληψίας, λοιπόν, είναι σταθερή κι όσο μεγαλύτερη τιμή επιλέγουμε, τόσο ποιοτικότερη είναι και η αναπαράσταση του ήχου. Καλά όλα αυτά, θα πει κανείς, αλλά εμείς εξετάζουμε τη σύνθεση και όχι την ψηφιοποίηση. Όταν αναπαράγουμε ψηφιακό ήχο, τα δείγματα μετατρέπονται σε τάσεις με την ίδια συχνότητα που τα είχαμε λάβει. Έτσι δεν είναι; Εμμέσως, το θεώρημα της δειγματοληψίας εφαρμόζεται και στην αναπαραγωγή. Αν το σκεφτείτε λίγο, θα διαπιστώσετε ότι η αναπαραγωγή δεν διαφέρει ιδιαίτερα από τη σύνθεση. Στη δεύτερη περίπτωση τα δείγματα είναι κατασκευασμένα, αλλά αυτό δεν καταργεί την ανάγκη για μεγάλο και “πυκνό” πλήθος. Τελικά, φαίνεται ότι το θεώρημα της δειγματοληψίας επηρεάζει και τη σύνθεση.

Ένας emulator του θρυλικού SID. Όπως μπορείτε να αντιληφθείτε κι από την εικόνα, το SID διαθέτει τρία κανάλια και στο καθένα μπορεί να δημιουργήσει τριγωνικά, πριονωτά ή τετραγωνικά κύματα, όπως επίσης και θόρυβο. Το SID είναι υβριδικό ολοκληρωμένο κι αυτό σημαίνει ότι εκτός από το ψηφιακό τμήμα, διαθέτει και αναλογικό. Στο δεύτερο βρίσκονται διάφορα φίλτρα και ένας πρόσθετος ταλαντωτής χαμηλής συχνότητας (Low Frequency Oscillator ή LFO), που χρησιμοποιείται στα εφέ. Ολόκληρο συγκρότημα, δηλαδή! (Σ.τ.Ε. Ποιος θυμάται αυτή την ατάκα;)

Ένας emulator του θρυλικού SID. Όπως μπορείτε να αντιληφθείτε κι από την εικόνα, το SID διαθέτει τρία κανάλια και στο καθένα μπορεί να δημιουργήσει τριγωνικά, πριονωτά ή τετραγωνικά κύματα, όπως επίσης και θόρυβο. Το SID είναι υβριδικό ολοκληρωμένο κι αυτό σημαίνει ότι εκτός από το ψηφιακό τμήμα, διαθέτει και αναλογικό. Στο δεύτερο βρίσκονται διάφορα φίλτρα και ένας πρόσθετος ταλαντωτής χαμηλής συχνότητας (Low Frequency Oscillator ή LFO), που χρησιμοποιείται στα εφέ. Ολόκληρο συγκρότημα, δηλαδή! (Σ.τ.Ε. Ποιος θυμάται αυτή την ατάκα;)

Μήπως τώρα εντοπίζετε την αναλογία με τις ψηφιακές φωτογραφικές; Το πλήθος των δειγμάτων που παράγει ένα synthesizer ανά μονάδα χρόνου, επηρεάζει την ποιότητα του παραγόμενου ήχου. Ωστόσο, αν αυτά τα δείγματα έχουν κατασκευαστεί με λανθασμένο τρόπο, τότε όσα κι αν είναι το τελικό αποτέλεσμα θα περιέχει ατέλειες. Ο ρυθμός με τον οποίο παράγονται τα δείγματα καθορίζει το άνω όριο στην ποιότητα του ήχου, αλλά δεν μπορεί να το επιβάλλει. Εν ολίγοις, δεν υπάρχει κανένας λόγος να κυνηγάμε τις μεγάλες συχνότητες. Ειδικά στην περίπτωσή μας, τα δείγματα του ήχου παράγονται από τον μικροελεγκτή σε πραγματικό χρόνο κι αυτό δεν αφήνει μεγάλα περιθώρια. Κάπως έτσι, καταλήξαμε ότι η συχνότητα παραγωγής δειγμάτων θα είναι τα 32258KHz. Αυτός ο ρυθμός είναι αισθητά μικρότερος από τα 44100Hz, που συναντάμε ως “χαμηλή” ρύθμιση στις σύγχρονες κάρτες. Ταυτόχρονα όμως είναι απόλυτα επαρκής για τους χοντροκομμένους ήχους που θα παράγει το δικό μας synthesizer. Εξάλλου, με την ίδια συχνότητα (32258KHz) θα πρέπει να παράγονται τέσσερα δείγματα –ένα για κάθε κανάλι–, γεγονός που ζορίζει τα πράγματα ακόμα περισσότερο. Παρεμπιπτόντως, νομίζουμε ότι τώρα κατανοείτε γιατί επιλέξαμε να γράψουμε τον κώδικα σε Assembly. Όπως και στην περίπτωση της δημιουργίας των scan lines από την κάρτα γραφικών, η παραγωγή των δειγμάτων απαιτεί όσο το δυνατόν πιο σταθερή συχνότητα.

Ακόμα περισσότεροι ήχοι
Τη δεκαετία του ’80, εκείνοι που συνέθεταν μουσική για τα παιχνίδια αναζητούσαν διαρκώς νέους ήχους. Η όρεξή τους ήταν αδύνατο να ικανοποιηθεί με ένα τριγωνικό κύμα και μερικά τετραγωνικά, που διαφοροποιούνταν μόνο ως προς το duty cycle. Στο κάτω κάτω, τα ίδια τα παιχνίδια απαιτούσαν ζωηρές μελωδίες, με πολλές και πλούσιες εναλλαγές στον ήχο, ικανές να εκφράσουν οτιδήποτε μπορεί να έκανε (ή να πάθαινε) ο ήρωας. Η διαρκής ανάγκη για νέους ήχους οδήγησε στη δημιουργία των πρώτων εφέ. Η ιδέα ήταν απλή: Για τη δημιουργία ενός νέου ήχου, αρκεί να πάρουμε έναν παλιό και ν’ αρχίσουμε να μεταβάλλουμε κάποιο από τα χαρακτηριστικά του με μεγάλη ταχύτητα. Συνήθως, αυτή η “μεγάλη ταχύτητα” ήταν της τάξης των 100Hz. Ας δούμε μερικά από τα εφέ που υλοποιούνταν κατ’ αυτόν τον τρόπο:

  • Tremolo: Το πλάτος του κύματος πραγματοποιεί μια ταλάντωση και η ένταση του ήχου αυξομειώνεται ταχύτατα και διαρκώς.
  • Vibrato: Σε αυτή την περίπτωση δεν ταλαντώνεται το πλάτος αλλά η συχνότητα του κύματος.
  • Glide & Portamento: Αυτά τα δύο εφέ επιδρούν και πάλι στη συχνότητα. Αυτή τη φορά όμως δεν πραγματοποιείται κάποια ταλάντωση. Η εκάστοτε νότα ξεκινά κανονικά και, λίγο πριν ολοκληρωθεί, η συχνότητα του ήχου αρχίζει να αυξάνεται (pitch-bend up) ή να μειώνεται (pitch-bend down). Όταν αυτή η μεταβολή πραγματοποιείται στο ξεκίνημα της νότας, το εφέ έχει τη γενική ονομασία glide, ενώ στην πρώτη περίπτωση έχει το όνομα portamento.

Το κύκλωμα της κάρτας ήχου. Όλη η δουλειά γίνεται στο firmware του μικροελεγκτή, που τον μετατρέπει σε synthesizer. Το δίκτυο αντιστάσεων αποτελεί τον DAC που μετατρέπει τις ψηφιακές τιμές σε τάσεις και επιτρέπει την τελική σύνθεση του ηλεκτρικού κύματος.

Το κύκλωμα της κάρτας ήχου. Όλη η δουλειά γίνεται στο firmware του μικροελεγκτή, που τον μετατρέπει σε synthesizer. Το δίκτυο αντιστάσεων αποτελεί τον DAC που μετατρέπει τις ψηφιακές τιμές σε τάσεις και επιτρέπει την τελική σύνθεση του ηλεκτρικού κύματος.

Μουσική αριθμητική
Προηγουμένως ασχοληθήκαμε με το ρυθμό παραγωγής δειγμάτων, που αποτελεί θεμελιώδες μέγεθος για ένα synthesizer. Ωστόσο, οι χρήστες ενός μουσικού οργάνου ενδιαφέρονται για έναν εντελώς διαφορετικό ρυθμό: αυτόν της μουσικής. Τώρα, μπορεί να νομίζετε ότι προσπαθούμε να μπλέξουμε δύο άσχετα πράγματα στην κουβέντα κι εν μέρει έχετε δίκιο. Ο ρυθμός της μουσικής και ο ρυθμός δειγματοληψίας αποτελούν δυο εντελώς ξένες έννοιες. Ωστόσο, σε ό,τι αφορά στη λειτουργία ενός synthesizer σε χαμηλό επίπεδο, τα συγκεκριμένα δύο μεγέθη δεν είναι άσχετα! Το ένα χτίζεται πάνω στο άλλο κι αυτό το διαπιστώνει κανείς πολύ γρήγορα, όταν προσπαθεί να υλοποιήσει ένα synthesizer από το μηδέν.

Όταν περιγράφαμε τις δυνατότητες της κάρτας ήχου, αναφέραμε ότι μπορεί να παίζει διάφορες νότες κατά παραγγελία. Αυτό σημαίνει ότι το firmware της κάρτας ήχου πρέπει να ενσωματώνει στοιχειώδεις γνώσεις μουσικής. Αν αναρωτιέστε γιατί, σκεφτείτε το εξής ερώτημα: Πόσο πρέπει να διαρκεί κάθε νότα; Από τα μαθήματα μουσικής του Γυμνασίου (δεν χρειάζεται δίπλωμα από ωδείο) γνωρίζουμε ότι η διάρκεια μιας νότας (ενός μουσικού φθόγγου, για την ακρίβεια) ονομάζεται και αξία. Γνωρίζουμε επίσης ότι οι τιμές που μπορεί να δεχτεί η αξία είναι το τέταρτο, το μισό, το ολόκληρο, το όγδοο, το δέκατο έκτο κ.λπ. Καλά όλα αυτά, θα πείτε, αλλά σε πόσο χρόνο αντιστοιχεί κάθε αξία; Η θεωρία απαντά και σ’ αυτό: Η αξία του ενός τετάρτου αντιστοιχεί σε έναν κτύπο του tempo, το μισό διαρκεί δύο κτύπους, το ολόκληρο εκτείνεται σε τέσσερεις κτύπους, το όγδοο διαρκεί για μισό κτύπο και πάει λέγοντας. Μάλιστα! Μόλις προσθέσαμε ένα ακόμα επίπεδο αφαίρεσης και απάντηση δεν πήραμε. Έχετε δίκιο, αλλά αν κάνετε λίγη υπομονή ακόμα θα απαντηθούν όλα. Τι ακριβώς είναι αυτό το tempo;

Το tempo καθορίζει το βηματισμό μιας μελωδίας ή, αν προτιμάτε, την ταχύτητά της. Μπορούμε να το φανταζόμαστε σαν ένα ρολόι που παράγει κτύπους σε τακτά χρονικά διαστήματα και βοηθά τους μουσικούς να κρατούν ένα σταθερό ρυθμό. Οι μουσικοί χρησιμοποιούν διάφορους όρους για να χαρακτηρίζουν αυτή την ταχύτητα (Allegro, Adagio κ.ά.), αλλά υπάρχει και μια μονάδα μέτρησης που μπορεί να γίνει αντιληπτή από όλους. Ουσιαστικά, πρόκειται για το πλήθος των κτύπων ανά λεπτό (BPM από το Beats Per Minute). Ας επιστρέψουμε τώρα στο θέμα μας. Όπως είπαμε, η χρονική διάρκεια μιας νότας καθορίζεται από την αξία της κι αυτή από το tempo. Προφανώς, αυτά τα δύο μεγέθη επιλέγονται από τον συνθέτη της μελωδίας και όχι από το μουσικό όργανο. Το synthesizer αρκεί να περιλαμβάνει έναν μετρονόμο: Ένα χρονόμετρο που παράγει κτύπους, σύμφωνα με το επιλεγμένο tempo. Η διάρκεια κάθε νότας θα καθορίζεται από τους κτύπους αυτού του χρονομέτρου και την επιλεγμένη αξία.

Τα παραπάνω απαντούν στο ερώτημα για τη διάρκεια κάθε νότας, αλλά δεν τεκμηριώνουν τον αρχικό μας ισχυρισμό. Από πού κι ως πού συνδέεται ο ρυθμός της μουσικής με τον ρυθμό παραγωγής δειγμάτων; Προηγουμένως είπαμε ότι το synthesizer πρέπει να λειτουργεί και σαν χρονόμετρο. Μήπως αυτό σημαίνει ότι πρέπει να γράψουμε κώδικα για την υλοποίηση ενός ρολογιού; Κάτι τέτοιο θα ήταν εντελώς περιττό. Το synthesizer ενσωματώνει ήδη έναν μηχανισμό, ο οποίος ενεργοποιείται σε τακτά χρονικά διαστήματα και με τεράστια ακρίβεια. Αναφερόμαστε στο μηχανισμό που παράγει τα δείγματα. Τελικά, για τη διατήρηση του μουσικού ρυθμού ο μετρονόμος του synthesizer μπορεί να μετράει το χρόνο με βάση το πλήθος των δειγμάτων που έχουν παραχθεί.

Ο ήχος μετατρέπεται σε 'ηλεκτρικό κύμα' με τη βοήθεια ενός μικροφώνου. Το εν λόγω κύμα οδηγείται σε έναν ADC (Analog to Digital Converter), ο οποίος λαμβάνει δείγματα με μια συχνότητα που ονομάζεται συχνότητα δειγματοληψίας. Τα δείγματα αποτελούν την ψηφιακή αναπαράσταση του αρχικού ήχου -- σε ασυμπίεστη μορφή. Για την αναπαραγωγή του ψηφιακού ήχου χρησιμοποιείται ένας DAC (Digital to Analog Converter). Στην έξοδό του παράγονται οι τάσεις που είχαν 'δειγματιστεί' και σιγά-σιγά σχηματίζεται το αρχικό ηλεκτρικό κύμα. Η μέθοδος DDS (Direct Digital Synthesis) για τη σύνθεση ήχου προβλέπει την απομάκρυνση της πρώτης βαθμίδας και την κατασκευή των δειγμάτων με μαθηματικό τρόπο.

Ο ήχος μετατρέπεται σε “ηλεκτρικό κύμα” με τη βοήθεια ενός μικροφώνου. Το εν λόγω κύμα οδηγείται σε έναν ADC (Analog to Digital Converter), ο οποίος λαμβάνει δείγματα με μια συχνότητα που ονομάζεται συχνότητα δειγματοληψίας. Τα δείγματα αποτελούν την ψηφιακή αναπαράσταση του αρχικού ήχου — σε ασυμπίεστη μορφή. Για την αναπαραγωγή του ψηφιακού ήχου χρησιμοποιείται ένας DAC (Digital to Analog Converter). Στην έξοδό του παράγονται οι τάσεις που είχαν “δειγματιστεί” και σιγά-σιγά σχηματίζεται το αρχικό ηλεκτρικό κύμα. Η μέθοδος DDS (Direct Digital Synthesis) για τη σύνθεση ήχου προβλέπει την απομάκρυνση της πρώτης βαθμίδας και την κατασκευή των δειγμάτων με μαθηματικό τρόπο.

Μέτρηση χρόνου
Η κάρτα ήχου που σχεδιάσαμε πλαισιώνει ένα σύστημα που μοιάζει με τους υπολογιστές του ’80. Ήμασταν υποχρεωμένοι, λοιπόν, να εξασφαλίσουμε ότι θα μπορεί να παίξει όλα τα σχετικά κομμάτια. Τα παιχνίδια εκείνης της εποχής (από εκεί προέρχονται οι πιο γνωστές μελωδίες) συνοδεύονταν από μουσική με καταιγιστικό ρυθμό. Το πιο διαδεδομένο tempo ήταν τα 180BPM και ακολούθως τα 150BPM, ενώ ορισμένες φορές επιλέγονταν τα 120BPM και σπανιότερα τα 90BPM. Περιττό να πούμε ότι το synthesizer που σχεδιάσαμε υποστηρίζει αυτούς τους ρυθμούς και μόνο. Επιπρόσθετα, το synthesizer μπορεί να παίζει νότες με ελάχιστη διάρκεια το ένα τριακοστό δεύτερο (ένα όγδοο του κτύπου), καθώς οι σχετικές μελωδίες δεν περιλάμβαναν νότες με μικρότερη αξία. Όπως βλέπετε, το πρόγραμμα υποστηρίζει τέσσερεις διαφορετικές συχνότητες για τους κτύπους του tempo, ενώ για τη διάρκεια κάθε νότας πρέπει να διακρίνει και υποδιαιρέσεις των κτύπων. Χρειαζόμαστε ένα περίπλοκο χρονόμετρο… ή μήπως όχι;

Σχεδιάζοντας το μετρονόμο αντιληφθήκαμε γρήγορα ότι πρέπει να μετράει το χρόνο σε υποδιαιρέσεις του κτύπου κι όχι σε ολόκληρους κτύπους. Επιπρόσθετα, αποφασίσαμε ότι αυτές οι υποδιαιρέσεις θα έχουν σταθερή συχνότητα. Με αυτόν τον τρόπο, ο κώδικας του μετρονόμου απλοποιήθηκε αρκετά και την ίδια στιγμή το synthesizer απέκτησε μεγάλη ευελιξία: Για να αλλάξουμε το ρυθμό αναπαραγωγής, αρκεί να αλλάξουμε την αντιστοιχία μεταξύ κτύπων και υποδιαιρέσεων του κτύπου. Μην ανησυχείτε αν αυτή η περιγραφή σας προκάλεσε σύγχυση. Θα εξετάσουμε δυο παραδείγματα και θα καταλάβετε αμέσως τι εννοούμε. Η συχνότητα που επιλέξαμε για τις υποδιαιρέσεις των κτύπων είναι τα 192Hz. Στο ρυθμό των 90BPM, οι κτύποι επαναλαμβάνονται με συχνότητα 1,5Hz. Επομένως, όταν επιλέγεται ο συγκεκριμένος ρυθμός, ο κώδικας του μετρονόμου θεωρεί ότι ένας κτύπος αντιστοιχεί σε 128 υποδιαιρέσεις (192Hz / 128 = 1,5Hz). Ας δούμε και την περίπτωση που επιλέγονται τα 192BPM. Σε αυτό το ρυθμό οι κτύποι επαναλαμβάνονται με συχνότητα 3Hz. Αυτή τη φορά, ο μετρονόμος του synthesizer θεωρεί ότι ένας κτύπος αντιστοιχεί σε 64 υποδιαιρέσεις (192Hz / 64 = 3Hz). Με παρόμοιο τρόπο –σαν πολλαπλάσιο των υποδιαιρέσεων του κτύπου–, ορίσαμε και όλες τις αξίες (διάρκειες) για κάθε υποστηριζόμενο ρυθμό. Έτσι, κάθε φορά που αλλάζει το tempo, το μόνο που διαφοροποιείται στον κώδικα είναι ένας πίνακας με τις αντιστοιχίες ανάμεσα σε διάρκειες και υποδιαιρέσεις του κτύπου.

Όσο μεγαλύτερη είναι η συχνότητα δειγματοληψίας, τόσο πιο πιστή είναι η αναπαράσταση του ηλεκτρικού κύματος. Στην περίπτωση της σύνθεσης, όμως, η μεγάλη 'πυκνότητα' δειγμάτων δεν μπορεί να εγγυηθεί την ποιότητα. Ο σημαντικότερος παράγοντας αφορά στην κατασκευή των δειγμάτων. Αν υπάρχουν σφάλματα εκεί, το τελικό κύμα θα περιέχει παράσιτα.

Όσο μεγαλύτερη είναι η συχνότητα δειγματοληψίας, τόσο πιο πιστή είναι η αναπαράσταση του ηλεκτρικού κύματος. Στην περίπτωση της σύνθεσης, όμως, η μεγάλη “πυκνότητα” δειγμάτων δεν μπορεί να εγγυηθεί την ποιότητα. Ο σημαντικότερος παράγοντας αφορά στην κατασκευή των δειγμάτων. Αν υπάρχουν σφάλματα εκεί, το τελικό κύμα θα περιέχει παράσιτα.

Αναπαραγωγή
Κάπου εδώ είναι πιθανό να μπουχτίσατε με τις ατελείωτες αναλύσεις. Πότε θα περάσουμε στο ψητό και θα μιλήσουμε για τον κώδικα; Ε, λοιπόν, η συζήτηση για την ουσία του κώδικα έχει ξεκινήσει προ πολλού. Περιττό να πούμε ότι με όσα προηγήθηκαν μπορείτε να κατανοήσετε το πιο σημαντικό τμήμα του προγράμματος: Τη συνάρτηση που παίζει μουσική! Όταν λειτουργεί ο υπολογιστής, ο χρήστης μπορεί να περιγράφει μικρές μελωδίες και να τις αντιστοιχεί στα διαθέσιμα κανάλια. Προφανώς, κάθε μελωδία απαρτίζεται από νότες. Για κάθε νότα, ο χρήστης δηλώνει οκτάβα, διάρκεια και, αν το επιθυμεί, εφέ. Το πώς επιτυγχάνονται όλα αυτά δεν θα μας απασχολήσει τώρα. Σημασία έχει ότι όταν ζητάμε από την κάρτα ήχου (το synthesizer) να παίξει την αποθηκευμένη μελωδία, οι νότες για κάθε κανάλι βρίσκονται ήδη στη μνήμη, η μία μετά την άλλη. Η αναπαραγωγή πραγματοποιείται από τη συνάρτηση ονόματι play (περιμένατε άλλη ονομασία;) που βρίσκεται στο ομώνυμο αρχείο (play.asm).

Η συνάρτηση play ξεκινά με την κλήση της init_music_data, η οποία αρχικοποιεί μια σειρά βοηθητικών μεταβλητών. Για την ώρα μπορείτε να την αγνοήσετε. Η αναπαραγωγή αυτή καθ’ αυτή πραγματοποιείται στο βρόχο με το εμπνευσμένο όνομα play_loop. Εκ πρώτης ο κώδικας μοιάζει ακατανόητος, αλλά δεν κάνει τίποτα διαφορετικό απ’ όσα έχουμε πει. Αρχικά υπολογίζονται 166 νέα δείγματα, μέσα σ’ έναν μικρότερο βρόχο που φροντίζει να εισάγει τις απαραίτητες καθυστερήσεις.

sample_loop:
	rcall samples
	ldi tmp3, 116
	rcall delay
	nop
	nop
	dec loop_cnt
	brne sample_loop
	nop

Οι καθυστερήσεις είναι κατάλληλα υπολογισμένες, ώστε τα δείγματα να παράγονται με την επιθυμητή συχνότητα των 32258Hz. Ακολουθεί ο υπολογισμός ενός δείγματος και αμέσως μετά καλείται η συνάρτηση update, μία φορά για καθένα από τα τρία πρώτα κανάλια:

rcall samples
ldi channel_data, ch1_data
rcall update
ldi channel_data, ch2_data
rcall update
ldi channel_data, ch3_data
rcall update
nop
nop
ldi tmp3, 22
rcall delay

Αυτή τη φορά εισάγονται μικρότερες καθυστερήσεις, αφού ο χρόνος μέχρι το επόμενο δείγμα “γεμίζει” με την εκτέλεση της update εις τριπλούν. Το πρόγραμμα συνεχίζεται με τον υπολογισμό ενός ακόμα δείγματος, την κλήση της update για το τέταρτο κανάλι, καθώς και δύο ελέγχους. Ουσιαστικά, τσεκάρουμε αν εξαντλήθηκαν οι νότες για όλα τα κανάλια, καθώς και το αν ο επεξεργαστής έστειλε την εντολή διακοπής. Και στις δύο αυτές περιπτώσεις, η αναπαραγωγή πρέπει σταματά. Διαφορετικά, ο βρόχος play_loop εκτελείται από την αρχή. Εννοείται ότι η κλήση της update (για το τέταρτο κανάλι) και οι έλεγχοι που περιγράψαμε διαρκούν ακριβώς όσο πρέπει, ώστε όταν συνεχίζεται η αναπαραγωγή το επόμενο δείγμα να υπολογίζεται στον προβλεπόμενο χρόνο (με συχνότητα 32258Hz).

Πολύ συχνά, οι όροι tremolo και vibrato χρησιμοποιούνται αδιακρίτως. Στην πραγματικότητα πρόκειται για δύο εντελώς διαφορετικά εφέ. Το tremolo προβλέπει την περιοδική μεταβολή του πλάτους, ενώ το vibrato αναφέρεται στην περιοδική μεταβολή της συχνότητας.

Πολύ συχνά, οι όροι tremolo και vibrato χρησιμοποιούνται αδιακρίτως. Στην πραγματικότητα πρόκειται για δύο εντελώς διαφορετικά εφέ. Το tremolo προβλέπει την περιοδική μεταβολή του πλάτους, ενώ το vibrato αναφέρεται στην περιοδική μεταβολή της συχνότητας.

Αναρωτιέστε που πήγαν όλα αυτά που λέγαμε για τις υποδιαιρέσεις των κτύπων και την τήρηση του επιλεγμένου ρυθμού; Κάθε φορά που υπολογίζονται 168 δείγματα, ο κώδικας που εξετάσαμε εκτελεί τη συνάρτηση update για κάθε κανάλι. Ξέρουμε επίσης ότι τα δείγματα παράγονται με συχνότητα 32258Hz. Επομένως, η συνάρτηση update εκτελείται για κάθε κανάλι με συχνότητα 32258Hz / 168. Αυτή η διαίρεση μας δίνει 192.002Hz. Σας θυμίζει τίποτα αυτό το νούμερο; Είναι η συχνότητα επανάληψης των υποδιαιρέσεων των κτύπων. Ας ρίξουμε μια ματιά στη συνάρτηση update (βρίσκεται στο ομώνυμο αρχείο — καμία πρωτοτυπία). Αρχικά, φορτώνονται όλες οι παράμετροι για τη νότα που αναπαράγεται στο εκάστοτε κανάλι. Μεταξύ άλλων, θα δείτε ότι φορτώνεται και ένα μέγεθος που το ονομάζουμε duration. Πρόκειται για τη διάρκεια της νότας, εκφρασμένη σε υποδιαιρέσεις του κτύπου. Κάθε φορά που εκτελείται η συνάρτηση update (δηλαδή σε κάθε υποδιαίρεση του κτύπου), η προαναφερθείσα τιμή μειώνεται. Όταν μηδενιστεί, θεωρούμε ότι η διάρκεια της νότας έληξε και ο κώδικας φροντίζει να φορτώσει την επόμενη νότα. Με τη λήψη της νέας νότας, το μέγεθος duration λαμβάνει μια νέα τιμή που εκφράζει, σε υποδιαιρέσεις του κτύπου, τη συνολική αξία της νότας. Στο τέλος της ίδιας συνάρτησης (update) εφαρμόζεται και το όποιο εφέ. Αυτό σημαίνει ότι η τροποποίηση των παραμέτρων που προβλέπει κάθε εφέ, πραγματοποιείται με συχνότητα 192Hz.

Εύλογο ερώτημα…
Αν εξακολουθείτε να έχετε ερωτηματικά για το πώς διατηρείται ο εκάστοτε ρυθμός και πώς εκφράζονται κάθε φορά οι αξίες, θα σας προτείναμε να ρίξετε μια ματιά στο αρχείο melody.asm. Στις γραμμές 102 έως 108 ορίζουμε έναν πίνακα, ο οποίος εκφράζει όλες τις αξίες τον φθόγγων σε υποδιαιρέσεις του κτύπου, σε κάθε ρυθμό. Μελετώντας όμως τον πίνακα ενδέχεται να δημιουργηθεί μια καινούργια απορία. Θα περίμενε κανείς να έχουμε ορίσει με τέτοιον τρόπο τις υποδιαιρέσεις του κτύπου, ώστε μία υποδιαίρεση να αντιστοιχεί στη μικρότερη αξία (1/32) του γρηγορότερου ρυθμού (180BPM). Αφού αυτή η είναι μικρότερη διάρκεια που μπορεί να έχουμε σε οποιαδήποτε περίπτωση, γιατί δεν την αντιστοιχίσαμε σε μία μόνο υποδιαίρεση; Αν και αυτό θα έμοιαζε καλή ιδέα, υπάρχουν τουλάχιστον δύο λόγοι για τους οποίους θα μας δημιουργούσε προβλήματα. Κατ’ αρχάς, αν στη μικρότερη αξία αντιστοιχούσαμε μια υποδιαίρεση και όχι οκτώ, θα έπρεπε να μειώσουμε τη συχνότητα των υποδιαιρέσεων κατά οκτώ φορές. Αυτό σημαίνει ότι η συνάρτηση update θα έπρεπε να καλείται 24 φορές το δευτερόλεπτο και όχι 192, γεγονός που θα την καθιστούσε ακατάλληλη για την εφαρμογή των εφέ. Άρα το πρόγραμμα θα έπρεπε να εκτελεί την update κάθε X δείγματα και μια ξεχωριστή συνάρτηση για τα εφέ κάθε Y δείγματα. Εν ολίγοις, ο βρόχος play_loop θα περιπλεκόταν αρκετά. Ο δεύτερος λόγος είναι ακόμα πιο ζόρικος στην αντιμετώπιση. Μπορεί να μην έχουμε πει τίποτα μέχρι στιγμής, αλλά το μικρό μας synthesizer εφαρμόζει σε κάθε νότα ένα υποτυπώδες περίγραμμα έντασης (volume envelope ή volume contour). Στο ξεκίνημα κάθε νότας πραγματοποιείται μια μικρή αύξηση της έντασης και στο τελείωμα μια σύντομη μείωση. Έτσι οι νότες διακρίνονται καλύτερα και δεν μοιάζουν μ’ ένα συνεχόμενο σφύριγμα. Μπορείτε να διαβάσετε περισσότερα για τα περιγράμματα έντασης στο άρθρο “Arduino Sound Master: Κύμα μέσα στο κύμα” (τεύχος 017). Αν στα 180BPM οι νότες με αξία 1/32 διαρκούσαν ακριβώς μια υποδιαίρεση του κτύπου, η συνάρτηση update θα εκτελούνταν μόνο μια φορά για κάθε τέτοια νότα και δεν θα προλάβαινε να υλοποιήσει το περίγραμμα έντασης. Εδώ που τα λέμε, το ίδιο πρόβλημα θα προέκυπτε και για τις λίγο μεγαλύτερες αξίες, όπως και για παραπλήσιες αξίες σε μικρότερα tempo. Μπορεί το περίγραμμα που έχουμε υλοποιήσει να είναι απλούστατο, αλλά ο σχηματισμός του απαιτεί οκτώ βήματα. Επομένως, η μικρότερη αξία (η πιο σύντομη νότα) έπρεπε να εκτείνεται σε τουλάχιστον οκτώ υποδιαιρέσεις του κτύπου.

Σύνθεση κύματος
Ο τίτλος της παραγράφου ενδέχεται να προκαλεί σύγχυση. Μα, δεν το εξαντλήσαμε αυτό το θέμα; Η αλήθεια είναι πως όχι. Συζητήσαμε για το ρυθμό των δειγμάτων, αλλά δεν είπαμε κουβέντα για το πώς παράγονται. Ο υπολογισμός μερικών αριθμητικών τιμών που σχηματίζουν ένα τριγωνικό ή ένα τετραγωνικό κύμα δεν αποτελεί μεγάλη πρόκληση. Στην πρώτη περίπτωση, οι τιμές πρέπει αρχικά να ακολουθούν μια ανοδική πορεία και στη συνέχεια μια μειούμενη, πάντα με τον ίδιο ρυθμό. Στη δεύτερη περίπτωση αρκούν μερικές τιμές σε μια συγκεκριμένη στάθμη και, ακολούθως, λίγες ακόμα σε μιαν άλλη στάθμη. Η πρόκληση δεν εντοπίζεται στους υπολογισμούς, αλλά στο πλήθος τους: Πόσα δείγματα πρέπει να υπολογίζουμε σε κάθε περίοδο του κύματος; Αν υπολογίζουμε πάρα πολλά, το κύμα θα μοιάζει “απλωμένο” και η συχνότητά του θα είναι χαμηλή. Αντιθέτως, αν υπολογίζουμε λίγα, το κύμα θα μοιάζει “συμπυκνωμένο” και η συχνότητά του θα είναι αυξημένη. Μπερδευτήκατε; Ας το πάρουμε αλλιώς.

Ο ρυθμός με τον οποίο παράγονται τα δείγματα είναι σταθερός (32258Hz). Με τον ίδιο ρυθμό τροφοδοτούνται στον DAC και μετατρέπονται σε τάσεις. Πώς μπορούμε να σχηματίσουμε ένα κύμα με συχνότητα 440Hz; Για να πετύχουμε κάτι τέτοιο, πρέπει να υπολογίζουμε 73 δείγματα για κάθε περίοδο. Προσπεράστε την επιλογή του 73 και σκεφτείτε αυτό: Αν κάθε δείγμα παράγεται με συχνότητα 32258Hz, τότε κάθε ομάδα των 73 δειγμάτων παράγεται με συχνότητα 32258Hz / 73. Με άλλα λόγια, κάθε περίοδος του κύματος που συνθέτουμε θα παράγεται με συχνότητα 441,8Hz. Μπορεί να μην πετύχαμε τα 440Hz με εντυπωσιακή ακρίβεια, αλλά κανένα αφτί δεν θα ακούσει τη διαφορά :) Νομίζουμε ότι τώρα καταλαβαίνετε πώς προέκυψε το 73: Διαιρέσαμε τη συχνότητα παραγωγής των δειγμάτων με τη συχνότητα που θέλαμε να σχηματίσουμε.

Ένας κλασικός αναλογικός μετρονόμος, με κουρδιστήρι. Όταν βρίσκεται σε χρήση, το διαφανές καπάκι της πρόσοψης απομακρύνεται και η μεταλλική ράβδος πραγματοποιεί ταλαντώσεις. Κάθε φορά που φτάνει σε κάποιο άκρο, ακούγεται ένας κτύπος. Μετακινώντας το μικρό βαρίδι μπορούμε να ρυθμίσουμε τον επιθυμητό ρυθμό.

Ένας κλασικός αναλογικός μετρονόμος, με κουρδιστήρι. Όταν βρίσκεται σε χρήση, το διαφανές καπάκι της πρόσοψης απομακρύνεται και η μεταλλική ράβδος πραγματοποιεί ταλαντώσεις. Κάθε φορά που φτάνει σε κάποιο άκρο, ακούγεται ένας κτύπος. Μετακινώντας το μικρό βαρίδι μπορούμε να ρυθμίσουμε τον επιθυμητό ρυθμό.

Τελικά, ούτε κι αυτό το πρόβλημα μοιάζει δύσκολο. Κάθε φορά που πρέπει να συνθέσουμε μια νότα, αρκεί να διαιρέσουμε το 32258 με τη συχνότητα της νότας. Το αποτέλεσμα της διαίρεσης αντιστοιχεί στο πλήθος των δειγμάτων που πρέπει να υπολογίζουμε ανά περίοδο. Χρήσιμη διαπίστωση, αλλά το πρόβλημα δεν λύνεται τόσο εύκολα. Τώρα που ξέρουμε πόσα δείγματα χρειαζόμαστε, πρέπει να βρούμε κι έναν τρόπο να τα υπολογίσουμε. Βασικά, πρέπει να διαιρέσουμε την περίοδο του εκάστοτε κύματος σε τόσα τμήματα, όσα είναι και τα απαιτούμενα δείγματα. Για το σκοπό αυτό μπορούμε να επιστρατεύσουμε έναν μετρητή, που θα δείχνει σε ποιο στάδιο της περιόδου βρισκόμαστε. Ο συγκεκριμένος μετρητής μπορεί να παρομοιαστεί με τη φάση ενός αρμονικού κύματος και, εδώ που τα λέμε, στην ορολογία των synthesizer ονομάζεται ακριβώς έτσι: φάση (phase). Ας επιστρέψουμε στο πρόβλημα όμως. Για να χωρίσουμε την περίοδο σ’ ένα αυθαίρετο πλήθος τμημάτων, αρκεί να ορίσουμε το κατάλληλο βήμα προσαύξησης για τη φάση. Για παράδειγμα, αν χρειαζόμαστε Κ δείγματα ανά περίοδο και ο μετρητής (η φάση) κυμαίνεται στο διάστημα από 0 (αρχή της περιόδου) έως Ζ (τέλος της περιόδου), αρκεί να χωρίσουμε το μέγεθος Ζ σε Κ ίσα μέρη. Το αποτέλεσμα αυτής της διαίρεσης θα μας δώσει το βήμα προσαύξησης της φάσης, που πολύ συχνά αποκαλείται και phase delta. (Ψαρωτικό, δεν μπορείτε να πείτε.) Ο κώδικας, λοιπόν, για να συνθέσει την περίοδο ενός κύματος, πρέπει να κάνει τα εξής: Αρχικά μηδενίζει τον μετρητή που αντιστοιχεί στη φάση. Ακολούθως, κάθε φορά που πρέπει να υπολογιστεί ένα δείγμα, προσθέτει στη φάση το phase delta. Έτσι προκύπτει η νέα τιμή της φάσης, σύμφωνα με την οποία παράγεται το νέο δείγμα. Όταν η φάση φτάσει στη μέγιστη τιμή, η περίοδος του κύματος θεωρείται ολοκληρωμένη και η διαδικασία ξεκινά από την αρχή, για το σχηματισμό της επόμενης περιόδου. Αν ανοίξετε το αρχείο melody.asm, θα δείτε ότι δημιουργούμε στη μνήμη προγράμματος έναν πίνακα τιμών με το όνομα deltas (γραμμές 5 έως 83). Σε αυτόν τον πίνακα έχουμε αποθηκεύσει όλες τις τιμές του phase delta για κάθε νότα, για κάθε οκτάβα. Έτσι, όταν η κάρτα ήχου πρέπει να συνθέσει μια νότα, δεν χρειάζεται να υπολογίσει το απαιτούμενο πλήθος δειγμάτων, ούτε το βήμα προσαύξησης της φάσης. Όλες αυτές οι πράξεις έχουν γίνει από εμάς και το πρόγραμμα μπορεί να καταπιαστεί με την ουσία: τη σύνθεση του κύματος δείγμα προς δείγμα.

Μη νομίζετε ότι η μελέτη της κάρτας ήχου τελειώνει εδώ. Μπορεί να εξετάσαμε τα πιο ζόρικα τμήματα του κώδικα, αλλά δεν έχουμε πει τίποτα για τη γενική διάρθρωση του προγράμματος. Στο επόμενο τεύχος θα ολοκληρώσουμε τη μελέτη και θα εξετάσουμε ένα πολύ πιο διασκεδαστικό ζήτημα: Την κατασκευή ενός προγράμματος που διευκολύνει τους μουσικούς να συνθέτουν αριστουργήματα, ειδικά για την κάρτα μας :D

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων