Πίνακας περιεχομένων:

Laser Harp Synthesizer στον πίνακα Zybo: 10 βήματα (με εικόνες)
Laser Harp Synthesizer στον πίνακα Zybo: 10 βήματα (με εικόνες)

Βίντεο: Laser Harp Synthesizer στον πίνακα Zybo: 10 βήματα (με εικόνες)

Βίντεο: Laser Harp Synthesizer στον πίνακα Zybo: 10 βήματα (με εικόνες)
Βίντεο: Synth Masterclass #20 – Laser harp 2024, Ιούλιος
Anonim
Συνθετικό Laser Harp στο Zybo Board
Συνθετικό Laser Harp στο Zybo Board

Σε αυτό το σεμινάριο θα δημιουργήσουμε μια πλήρως λειτουργική άρπα λέιζερ χρησιμοποιώντας αισθητήρες IR με σειριακή διεπαφή που θα επιτρέπει στον χρήστη να αλλάξει τον συντονισμό και τον τόνο του οργάνου. Αυτή η άρπα θα είναι το ριμέικ του 21ου αιώνα του πανάρχαιου οργάνου. Το σύστημα δημιουργήθηκε χρησιμοποιώντας έναν πίνακα ανάπτυξης Xilinx Zybo μαζί με τις Vivado Design Suites. Τι θα χρειαστείτε για να ολοκληρώσετε το έργο:

  • 12 αισθητήρες IR και εκπομπούς (περισσότερο ή λιγότερο μπορούν να χρησιμοποιηθούν ανάλογα με τον αριθμό των χορδών)
  • Πίνακας ανάπτυξης Zybo Zynq-7000
  • Δωρεάν RTOS
  • Vivado Design Σουίτα
  • Σύρμα (για τη σύνδεση των αισθητήρων στην πλακέτα)
  • 3 τεμάχια σωλήνα PVC ((2) 18 ιντσών και (1) 8 ιντσών)
  • 2 αγκώνες PVC

Βήμα 1: Αποκτήστε το Demo Zybo DMA της Digilent

Η πλευρά FPGA αυτού του έργου βασίζεται σε μεγάλο βαθμό στο έργο επίδειξης που βρίσκεται εδώ. Χρησιμοποιεί άμεση πρόσβαση στη μνήμη για την αποστολή δεδομένων απευθείας από τη μνήμη στην οποία ο επεξεργαστής μπορεί να γράψει μέσω ροής AXI σε ένα μπλοκ ήχου I2S. Τα παρακάτω βήματα θα σας βοηθήσουν να ξεκινήσετε το έργο επίδειξης ήχου DMA:

  1. Μια νέα έκδοση του αρχείου του πίνακα για τον πίνακα Zybo μπορεί να είναι απαραίτητη. Ακολουθήστε αυτές τις οδηγίες για να αποκτήσετε νέα αρχεία πίνακα για το Vivado.
  2. Ακολουθήστε τα βήματα 1 και 2 στις οδηγίες αυτής της σελίδας για να ανοίξετε το έργο επίδειξης στο Vivado. Χρησιμοποιήστε τη μέθοδο Vivado και όχι την παράδοση υλικού SDK.
  3. Ενδέχεται να λάβετε ένα μήνυμα που λέει ότι ορισμένα από τα μπλοκ IP σας πρέπει να ενημερώνονται. Εάν ναι, επιλέξτε "Εμφάνιση κατάστασης IP" και, στη συνέχεια, στην καρτέλα Κατάσταση IP επιλέξτε όλα τα παλιά IP και κάντε κλικ στην επιλογή "Αναβάθμιση επιλεγμένης". Όταν τελειώσει και εμφανιστεί ένα παράθυρο που σας ρωτά αν θέλετε να δημιουργήσετε προϊόν εξόδου, προχωρήστε και κάντε κλικ στο "Δημιουργία". Εάν λάβετε ένα κρίσιμο μήνυμα προειδοποίησης, αγνοήστε το.
  4. Μεταβείτε από το σχέδιο στην καρτέλα πηγές στο Vivado για να δείτε τα αρχεία προέλευσης. Κάντε δεξί κλικ στο σχέδιο μπλοκ "design_1" και επιλέξτε "Δημιουργία περιτυλίγματος HDL". Όταν σας ζητηθεί, επιλέξτε "αντιγράψτε το περιτύλιγμα που δημιουργήθηκε για να επιτρέπονται οι επεξεργασίες χρήστη". Θα δημιουργηθεί ένα αρχείο περιτύλιξης για το έργο.
  5. Τώρα που ολοκληρώθηκαν αυτά τα κρίσιμα βήματα που κατά κάποιο τρόπο παραλείφθηκαν στο άλλο σεμινάριο, μπορείτε να επιστρέψετε στο φροντιστήριο που είχε συνδεθεί προηγουμένως και να συνεχίσετε από το βήμα 4 έως το τέλος και να βεβαιωθείτε ότι το έργο επίδειξης εκτελείται σωστά. Εάν δεν έχετε τρόπο εισαγωγής ήχου για εγγραφή, απλώς ηχογραφήστε με τα ακουστικά σας και ακούστε έναν ασαφή ήχο 5-10 δευτερολέπτων όταν πατάτε το κουμπί αναπαραγωγής. Όσο κάτι βγαίνει από την υποδοχή ακουστικών όταν πατάτε το κουμπί αναπαραγωγής, πιθανότατα λειτουργεί σωστά.

Βήμα 2: Κάντε μερικές αλλαγές στο Vivado

Κάντε μερικές αλλαγές στο Vivado
Κάντε μερικές αλλαγές στο Vivado

Λοιπόν, τώρα έχετε την επίδειξη ήχου DMA της Digilent, αλλά αυτός δεν είναι ο τελικός στόχος εδώ. Πρέπει λοιπόν να επιστρέψουμε στο Vivado και να κάνουμε κάποιες αλλαγές ώστε οι αισθητήρες μας να μπορούν να συνδεθούν στις κεφαλίδες PMOD και να χρησιμοποιήσουμε την αξία τους στην πλευρά του λογισμικού.

  1. Ανοίξτε το διάγραμμα μπλοκ στο Vivado
  2. Δημιουργήστε ένα μπλοκ GPIO κάνοντας δεξί κλικ σε κενό χώρο στο μπλοκ διάγραμμα και επιλέγοντας "Προσθήκη IP" από το μενού. Βρείτε και επιλέξτε "AXI GPIO".
  3. Κάντε διπλό κλικ στο νέο μπλοκ IP και στο παράθυρο επαναπροσαρμογής IP, μεταβείτε στην καρτέλα διαμόρφωσης IP. Επιλέξτε όλες τις εισόδους και ορίστε το πλάτος σε δώδεκα, αφού θα έχουμε 12 «χορδές» στην άρπα μας και επομένως χρειαζόμαστε 12 αισθητήρες. Εάν θέλετε να χρησιμοποιήσετε λιγότερους ή περισσότερους αισθητήρες, προσαρμόστε αυτόν τον αριθμό κατάλληλα. Επίσης ορίστε τη διακοπή ενεργοποίησης.
  4. Κάντε δεξί κλικ στο νέο μπλοκ GPIO IP και επιλέξτε "εκτέλεση αυτοματοποίησης σύνδεσης". Ελέγξτε το πλαίσιο AXI και πατήστε εντάξει. Αυτό θα πρέπει να συνδέσει αυτόματα τη διεπαφή AXI, αλλά να αφήσει τις εξόδους του μπλοκ ασύνδετες.
  5. Για να δημιουργήσετε χώρο για επιπλέον διακοπή, κάντε διπλό κλικ στο μπλοκ xlconcat_0 IP και αλλάξτε τον αριθμό των θυρών από 4 σε 5. Στη συνέχεια, μπορείτε να συνδέσετε το pin ip2intc_irpt από το νέο μπλοκ GPIO στη νέα αχρησιμοποίητη θύρα στο μπλοκ xlconcat.
  6. Κάντε δεξί κλικ στην έξοδο "GPIO" του νέου μπλοκ GPIO IP και επιλέξτε "make external". Βρείτε πού πηγαίνει η γραμμή και κάντε κλικ στο μικρό πλάγιο πεντάγωνο και στα αριστερά πρέπει να ανοίξει ένα παράθυρο όπου μπορείτε να αλλάξετε το όνομα. Αλλάξτε το όνομα σε "ΑΙΣΘΗΤΗΡΕΣ". Είναι σημαντικό να χρησιμοποιείτε το ίδιο όνομα εάν θέλετε να λειτουργεί το αρχείο περιορισμών που παρέχουμε, διαφορετικά θα πρέπει να αλλάξετε το όνομα στο αρχείο περιορισμών.
  7. Πίσω στην καρτέλα πηγές, βρείτε το αρχείο περιορισμών και αντικαταστήστε το με αυτό που παρέχουμε. Μπορείτε να επιλέξετε είτε να αντικαταστήσετε το αρχείο είτε απλά να αντιγράψετε τα περιεχόμενα του αρχείου περιορισμών και να το επικολλήσετε στο περιεχόμενο του παλιού. Ένα από τα σημαντικά πράγματα που κάνει το αρχείο περιορισμών μας είναι να ενεργοποιήσουμε τις αντιστάσεις έλξης στις κεφαλίδες PMOD. Αυτό είναι απαραίτητο για τους συγκεκριμένους αισθητήρες που χρησιμοποιήσαμε, ωστόσο δεν είναι όλοι οι ίδιοι αισθητήρες. Εάν οι αισθητήρες σας απαιτούν αντίσταση ανατροπής, μπορείτε να αλλάξετε κάθε παρουσία "set_property PULLUP true" με "set_property PULLDOWN true". Εάν απαιτούν διαφορετική τιμή αντίστασης από αυτήν στον πίνακα, τότε μπορείτε να αφαιρέσετε αυτές τις γραμμές και να χρησιμοποιήσετε εξωτερικές αντιστάσεις. Τα ονόματα καρφιτσών βρίσκονται στα σχόλια στο αρχείο περιορισμών και αντιστοιχούν στις ετικέτες στο πρώτο διάγραμμα στα Zybo Schematics σελίδα που μπορείτε να βρείτε εδώ. Εάν θέλετε να χρησιμοποιήσετε διαφορετικές καρφίτσες pmod, απλώς αντιστοιχίστε τα ονόματα στο αρχείο περιορισμού με τις ετικέτες σε σχηματικό σχήμα. Χρησιμοποιούμε την κεφαλίδα PMOD JE και JD και χρησιμοποιούμε έξι ακίδες δεδομένων σε κάθε μία, παραλείποντας τις ακίδες 1 και 7. Αυτές οι πληροφορίες είναι σημαντικές όταν συνδέετε τους αισθητήρες σας. Όπως φαίνεται στο σχήμα, οι ακίδες 6 και 12 στο PMODS είναι VCC και οι ακίδες 5 και 11 αλέθονται.
  8. Αναγεννήστε το περιτύλιγμα HDL όπως πριν και αντιγράψτε και αντικαταστήστε το παλιό. Όταν ολοκληρωθεί, δημιουργήστε bitstream και εξάγετε υλικό όπως πριν και επανεκκινήστε το SDK. Εάν ερωτηθείτε αν θέλετε να αντικαταστήσετε το παλιό αρχείο υλικού, η απάντηση είναι ναι. Είναι ίσως καλύτερο να κλείσετε το SDK όταν εξάγετε υλικό, ώστε να αντικατασταθεί σωστά.
  9. Εκκινήστε το SDK.

Βήμα 3: Λειτουργήστε το FreeRTOS

Το επόμενο βήμα είναι να ενεργοποιήσετε το FreeRTOS στον πίνακα Zybo.

  1. Εάν δεν έχετε ήδη αντίγραφο, κατεβάστε το FreeRTOS εδώ και εξαγάγετε τα αρχεία.
  2. Εισαγάγετε την επίδειξη FreeRTOS Zynq που βρίσκεται στη διεύθυνση FreeRTOSv9.0.0 / FreeRTOS / Demo / CORTEX_A9_Zynq_ZC702 / RTOSDemo. Η διαδικασία εισαγωγής είναι σχεδόν η ίδια όπως και για το άλλο έργο επίδειξης, ωστόσο επειδή η επίδειξη FreeRTOS Zynq βασίζεται σε άλλα αρχεία στο φάκελο FreeRTOS, δεν πρέπει να αντιγράψετε τα αρχεία στο χώρο εργασίας σας. Αντ 'αυτού, θα πρέπει να τοποθετήσετε ολόκληρο το φάκελο FreeRTOS μέσα στο φάκελο του έργου σας.
  3. Δημιουργήστε ένα νέο πακέτο υποστήριξης πλακέτας πηγαίνοντας στο "αρχείο" -> "νέο" -> "πακέτο υποστήριξης πλακέτας". Βεβαιωθείτε ότι έχει επιλεγεί αυτόνομο και κάντε κλικ στο τελείωμα. Μετά από μια στιγμή θα εμφανιστεί ένα παράθυρο, επιλέξτε το πλαίσιο δίπλα στο lwip141 (αυτό εμποδίζει την αποτυχία της μεταγλώττισης ενός από τα demos του FreeRTOS) και πατήστε OK. Αφού ολοκληρωθεί, κάντε δεξί κλικ στο έργο RTOSdemo και μεταβείτε στην ενότητα "ιδιότητες", μεταβείτε στην καρτέλα "αναφορές έργου" και επιλέξτε το πλαίσιο δίπλα στο νέο bsp που δημιουργήσατε. Ας ελπίσουμε ότι θα αναγνωριστεί, αλλά μερικές φορές το Xilinx SDK μπορεί να είναι περίεργο για τέτοια πράγματα. Εάν εξακολουθείτε να λαμβάνετε σφάλμα μετά από αυτό το βήμα ότι λείπει το xparameters.h ή κάτι τέτοιο, δοκιμάστε να επαναλάβετε αυτό το βήμα και ίσως να βγείτε και να επανεκκινήσετε το SDK.

Βήμα 4: Προσθέστε Laser Harp Code

Τώρα που εισήχθη το FreeRTOS, μπορείτε να φέρετε τα αρχεία από το έργο της άρπας λέιζερ στο demo του FreeRTOS

  1. Δημιουργήστε έναν νέο φάκελο κάτω από το φάκελο src στην επίδειξη FreeRTOS και αντιγράψτε και επικολλήστε όλα τα παρεχόμενα αρχεία c εκτός από το main.c σε αυτόν το φάκελο.
  2. Αντικαταστήστε το RTOSDemo main.c με το παρεχόμενο main.c.
  3. Εάν όλα γίνονται σωστά, θα πρέπει να μπορείτε να εκτελέσετε τον κώδικα άρπας λέιζερ σε αυτό το σημείο. Για λόγους δοκιμής, η είσοδος κουμπιών που χρησιμοποιήθηκε στο έργο επίδειξης DMA χρησιμοποιείται τώρα για αναπαραγωγή ήχων χωρίς προσαρτημένους αισθητήρες (οποιοδήποτε από τα τέσσερα κύρια κουμπιά θα λειτουργήσει). Θα αναπαράγει μια συμβολοσειρά κάθε φορά που την πιέζετε και περνάει με κύκλο από όλες τις συμβολοσειρές του συστήματος σε πολλαπλές πιέσεις. Συνδέστε μερικά ακουστικά ή ηχεία στην υποδοχή ακουστικών στον πίνακα Zybo και βεβαιωθείτε ότι μπορείτε να ακούσετε τους ήχους των χορδών που περνούν όταν πατάτε ένα κουμπί.

Βήμα 5: Σχετικά με τον κώδικα

Πολλοί από εσάς που διαβάζετε αυτό το σεμινάριο είναι πιθανό εδώ να μάθετε πώς να ρυθμίσετε τον ήχο ή να χρησιμοποιήσετε το DMA για να κάνετε κάτι διαφορετικό ή να δημιουργήσετε ένα διαφορετικό μουσικό όργανο. Για το λόγο αυτό, οι επόμενες ενότητες αφιερώνουν στην περιγραφή του τρόπου με τον οποίο λειτουργεί ο παρεχόμενος κώδικας σε συνδυασμό με το υλικό που περιγράφηκε προηγουμένως για να λάβετε μια λειτουργική έξοδο ήχου χρησιμοποιώντας DMA. Εάν καταλαβαίνετε γιατί υπάρχουν τα κομμάτια κώδικα, τότε θα πρέπει να μπορείτε να τα προσαρμόσετε για ό, τι θέλετε να δημιουργήσετε.

Διακόπτει

Αρχικά θα αναφέρω πώς δημιουργούνται διακοπές σε αυτό το έργο. Ο τρόπος που το κάναμε ήταν με τη δημιουργία πρώτης μιας δομής διανυσματικού πίνακα διακοπών που παρακολουθεί το αναγνωριστικό, τον χειριστή διακοπών και μια αναφορά στη συσκευή για κάθε διακοπή. Τα αναγνωριστικά διακοπής προέρχονται από xparameters.h. Ο χειριστής διακοπών είναι μια συνάρτηση που γράψαμε για το DMA και το GPIO και η διακοπή I2C προέρχεται από το πρόγραμμα οδήγησης Xlic I2C. Η αναφορά της συσκευής δείχνει περιπτώσεις κάθε συσκευής τις οποίες αρχικοποιούμε αλλού. Κοντά στο τέλος της συνάρτησης _init_audio ένας βρόχος περνάει από κάθε στοιχείο στον πίνακα διανύσματος διακοπής και καλεί δύο συναρτήσεις, XScuGic_Connect () και XScuGic_Enable () για σύνδεση και ενεργοποίηση των διακοπών. Αναφέρονται στο xInterruptController, το οποίο είναι ένας ελεγκτής διακοπών που δημιουργήθηκε στο FreeRTOS main.c από προεπιλογή. Οπότε βασικά συνδέουμε κάθε μας διακοπή σε αυτόν τον ελεγκτή διακοπών που έχει ήδη δημιουργηθεί για εμάς από το FreeRTOS.

DMA

Ο κωδικός προετοιμασίας DMA ξεκινά στο lh_main.c. Αρχικά δηλώνεται μια στατική παρουσία μιας δομής XAxiDma. Στη συνέχεια, στη λειτουργία _init_audio () διαμορφώνεται. Πρώτα καλείται η λειτουργία ρύθμισης παραμέτρων από το έργο επίδειξης, η οποία βρίσκεται στο dma.c. Είναι αρκετά καλά τεκμηριωμένο και προέρχεται απευθείας από το demo. Στη συνέχεια, η διακοπή συνδέεται και ενεργοποιείται. Για αυτό το έργο απαιτείται μόνο η διακοπή master-to-slave, επειδή όλα τα δεδομένα αποστέλλονται από το DMA στον ελεγκτή I2S. Εάν επιθυμείτε να ηχογραφήσετε ήχο, θα χρειαστείτε επίσης τη διακοπή slave-to-master. Η διακοπή master-to-slave καλείται όταν το DMA ολοκληρώσει την αποστολή των δεδομένων που του είπατε να στείλει. Αυτή η διακοπή είναι απίστευτα σημαντική για το έργο μας, διότι κάθε φορά που ο DMA ολοκληρώνει την αποστολή ενός buffer δειγμάτων ήχου, πρέπει να ξεκινήσει αμέσως την αποστολή του επόμενου buffer, διαφορετικά θα ακουγόταν καθυστέρηση μεταξύ των αποστολών. Μέσα στη συνάρτηση dma_mm2s_ISR () μπορείτε να δείτε πώς χειριζόμαστε τη διακοπή. Το σημαντικό μέρος είναι κοντά στο τέλος όπου χρησιμοποιούμε το xSemaphoreGiveFromISR () και το portYIELD_FROM_ISR () για να ειδοποιήσουμε την _audio_task () ότι μπορεί να ξεκινήσει την επόμενη μεταφορά DMA. Ο τρόπος με τον οποίο στέλνουμε σταθερά δεδομένα ήχου είναι εναλλάσσοντας δύο buffer. Όταν ένα buffer μεταδίδεται στο μπλοκ I2C, το άλλο buffer υπολογίζει και αποθηκεύει τις τιμές του. Στη συνέχεια, όταν η διακοπή προέρχεται από το DMA, το ενεργό buffer αλλάζει και το πιο πρόσφατα γραμμένο buffer αρχίζει να μεταφέρεται ενώ το buffer που μεταφέρθηκε προηγουμένως αρχίζει να αντικαθίσταται με νέα δεδομένα. Το βασικό μέρος της συνάρτησης _audio_task είναι το σημείο όπου καλείται το fnAudioPlay (). Το fnAudioPlay () λαμβάνει στην παρουσία DMA, το μήκος του buffer και έναν δείκτη στο buffer από το οποίο θα μεταφερθούν δεδομένα. Λίγες τιμές αποστέλλονται στους καταχωρητές I2S για να ενημερωθεί ότι έρχονται περισσότερα δείγματα. Στη συνέχεια, το XAxiDma_SimpleTransfer () καλείται να ξεκινήσει τη μεταφορά.

I2S Audio

Το audio.c και το audio.h βρίσκονται εκεί όπου πραγματοποιείται η προετοιμασία του I2S. Ο κώδικας προετοιμασίας I2S είναι ένα αρκετά συνηθισμένο κομμάτι κώδικα που επιπλέει σε διάφορα μέρη, μπορεί να βρείτε μικρές παραλλαγές από άλλες πηγές, αλλά αυτός πρέπει να λειτουργήσει. Είναι αρκετά καλά τεκμηριωμένο και δεν χρειάζεται πολύ να αλλάξει για το έργο της άρπας. Η επίδειξη ήχου DMA από την οποία προέρχεται έχει λειτουργίες για μετάβαση στο μικρόφωνο ή τις εισόδους γραμμής, ώστε να μπορείτε να τις χρησιμοποιήσετε αν χρειάζεστε αυτήν τη λειτουργία.

Σύνθεση ήχου

Για να περιγράψω πώς λειτουργεί η σύνθεση ήχου, θα παραθέσω κάθε ένα από τα μοντέλα ήχου που χρησιμοποιήθηκαν στην ανάπτυξη που οδήγησαν στην τελική μέθοδο, καθώς θα σας δώσει μια αίσθηση του γιατί γίνεται με τον τρόπο που γίνεται.

Μέθοδος 1: Υπολογίζεται μια περίοδος τιμών ημιτόνου για κάθε συμβολοσειρά στην αντίστοιχη συχνότητα για τη μουσική νότα αυτής της χορδής και αποθηκεύεται σε έναν πίνακα. Για παράδειγμα, το μήκος της συστοιχίας θα είναι η περίοδος του ημιτονοειδούς κύματος στα δείγματα, που ισούται με # δείγματα / κύκλο. Εάν ο ρυθμός δειγματοληψίας είναι 48kHz και η συχνότητα σημείωσης είναι 100Hz, τότε υπάρχουν 48, 000 δείγματα/δευτερόλεπτο και 100 κύκλοι/δευτερόλεπτο που οδηγούν σε 4800 δείγματα ανά κύκλο και το μήκος της συστοιχίας θα είναι 4800 δείγματα και θα περιέχει τις τιμές ενός πλήρους περίοδος ημιτονοειδούς κύματος. Κατά την αναπαραγωγή της συμβολοσειράς, το ρυθμιστικό δείγματος ήχου συμπληρώνεται λαμβάνοντας μια τιμή από τη συστοιχία ημιτονοειδούς κύματος και τοποθετώντας την στο δείγμα ήχου ως δείγμα και, στη συνέχεια, αυξάνοντας το δείκτη στη συστοιχία ημιτονοειδούς κύματος, έτσι ώστε χρησιμοποιώντας το προηγούμενο παράδειγμα μας κατά τη διάρκεια της πορείας από 4800 δείγματα, ένας κύκλος ημιτονικού κύματος τοποθετείται στο ρυθμιστικό ήχου. Μια λειτουργία modulo χρησιμοποιείται στον δείκτη πίνακα έτσι ώστε να βρίσκεται πάντα μεταξύ 0 και του μήκους και όταν ο δείκτης πίνακα ξεπεράσει ένα συγκεκριμένο όριο (όπως δείγματα αξίας 2 δευτερολέπτων ίσως) η συμβολοσειρά απενεργοποιείται. Για να παίξετε πολλαπλές χορδές ταυτόχρονα, παρακολουθείτε ξεχωριστά τον δείκτη πίνακα κάθε συμβολοσειράς και προσθέστε την τιμή από το ημιτονοειδές κύμα κάθε συμβολοσειράς για να λάβετε κάθε δείγμα.

Μέθοδος 2: Για να δημιουργήσουμε έναν πιο μουσικό τόνο, ξεκινάμε με το προηγούμενο μοντέλο και προσθέτουμε αρμονικές σε κάθε θεμελιώδη συχνότητα. Οι αρμονικές συχνότητες είναι συχνότητες που είναι ακέραια πολλαπλάσια της θεμελιώδους συχνότητας. Σε αντίθεση με δύο ακατάλληλες συχνότητες που αθροίζονται μαζί, πράγμα που έχει ως αποτέλεσμα δύο ξεχωριστοί ήχοι να παίζονται ταυτόχρονα, όταν οι αρμονικές προστίθενται μαζί, συνεχίζει να ακούγεται σαν ένας ήχος, αλλά με διαφορετικό τόνο. Για να επιτευχθεί αυτό, κάθε φορά που προσθέτουμε την τιμή του ημιτονοειδούς κύματος στη θέση (δείκτης πίνακα % μήκος πίνακα) στο ηχητικό δείγμα, προσθέτουμε επίσης (δείκτης πίνακα 2 * % μήκος πίνακα) και (δείκτης 3 * πίνακα % μήκος πίνακα), και ούτω καθεξής για όσες αρμονικές είναι επιθυμητές. Αυτοί οι πολλαπλασιασμένοι δείκτες θα διασχίσουν το ημιτονοειδές κύμα σε συχνότητες που είναι ακέραια πολλαπλάσια της αρχικής συχνότητας. Για να επιτρέπεται περισσότερος έλεγχος του τόνου, οι τιμές κάθε αρμονικής πολλαπλασιάζονται με μια μεταβλητή που αντιπροσωπεύει την ποσότητα αυτής της αρμονικής στο συνολικό ήχο. Για παράδειγμα, το θεμελιώδες ημιτονοειδές κύμα μπορεί να έχει τις τιμές του πολλαπλασιασμένες επί 6 για να γίνει περισσότερο συντελεστής στο συνολικό ήχο, ενώ το 5ο αρμονικό μπορεί να έχει πολλαπλασιαστή 1, πράγμα που σημαίνει ότι οι τιμές του συμβάλλουν πολύ λιγότερο στον συνολικό ήχο.

Μέθοδος 3: Εντάξει, τώρα έχουμε πολύ καλό τόνο στις νότες, αλλά υπάρχει ακόμα ένα αρκετά κρίσιμο πρόβλημα: παίζουν σε σταθερή ένταση για σταθερή διάρκεια. Για να ακούγεται καθόλου σαν πραγματικό όργανο, η ένταση μιας χορδής που παίζεται πρέπει να χαλάσει ομαλά με την πάροδο του χρόνου. Για να επιτευχθεί αυτό, ένας πίνακας γεμίζει με τις τιμές μιας εκθετικής συνάρτησης που αποσυντίθεται. Τώρα, όταν δημιουργούνται τα δείγματα ήχου, ο ήχος που προέρχεται από κάθε συμβολοσειρά υπολογίζεται όπως στην προηγούμενη μέθοδο, αλλά πριν προστεθεί στο δείγμα ήχου πολλαπλασιάζεται με την τιμή στο ευρετήριο συστοιχιών αυτών των συμβολοσειρών στον πίνακα συναρτήσεων εκθετικής διάσπασης. Αυτό κάνει τον ήχο να διαχέεται ομαλά με την πάροδο του χρόνου. Όταν ο δείκτης πίνακα φτάσει στο τέλος του πίνακα διάσπασης, η συμβολοσειρά σταματά.

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

Συνολικά, η σύνθεση του ήχου είναι διαισθητική, αλλά ο υπολογισμός είναι βαρύς. Η αποθήκευση ολόκληρου του ήχου της χορδής στη μνήμη θα απαιτούσε υπερβολική μνήμη, αλλά ο υπολογισμός του ημιτονοειδούς κύματος και της εκθετικής λειτουργίας μεταξύ κάθε καρέ θα χρειαζόταν πολύ καιρό για να συμβαδίσει με τον ρυθμό αναπαραγωγής ήχου. Ένας αριθμός κόλπων χρησιμοποιείται στον κώδικα για να επιταχύνει τον υπολογισμό. Όλα τα μαθηματικά εκτός από την αρχική δημιουργία των ημιτονοειδών και εκθετικών πινάκων αποσύνθεσης γίνονται σε ακέραιη μορφή, η οποία απαιτεί την εξάπλωση του διαθέσιμου αριθμητικού χώρου στην έξοδο ήχου 24 bit. Για παράδειγμα, το ημιτονοειδές τραπέζι είναι πλάτους 150, έτσι ώστε να είναι λείο αλλά όχι τόσο μεγάλο ώστε πολλές χορδές που παίζονται μαζί να προσθέσουν περισσότερα από 24 bits. Ομοίως, οι εκθετικές τιμές του πίνακα πολλαπλασιάζονται με 80 πριν στρογγυλοποιηθούν σε ακέραιους αριθμούς και αποθηκευτούν. Τα αρμονικά βάρη μπορούν να λάβουν διακριτές τιμές μεταξύ 0 και 10. Επίσης όλα τα δείγματα στην πραγματικότητα διπλασιάζονται και τα ημιτονοειδή κύματα καταγράφονται με 2, μειώνοντας ουσιαστικά το ποσοστό δειγματοληψίας στο μισό. Αυτό περιορίζει τη μέγιστη συχνότητα που μπορεί να παιχτεί, αλλά ήταν απαραίτητο για τον υπολογισμό του τρέχοντος αριθμού χορδών και αρμονικών αρκετά γρήγορα.

Η δημιουργία αυτού του μοντέλου ήχου και η λειτουργία του χρειάστηκε σημαντική προσπάθεια από την πλευρά του επεξεργαστή και θα ήταν απίστευτα δύσκολο να το δουλέψουμε από την αρχή στο fpga στο χρονικό πλαίσιο αυτού του έργου (φανταστείτε ότι πρέπει να επαναδημιουργείτε το bitstream κάθε φορά που άλλαξε ένα κομμάτι της λέξης για να δοκιμάσει τον ήχο). Ωστόσο, το να το κάνετε στο fpga θα μπορούσε πιθανότατα να είναι ένας καλύτερος τρόπος για να το κάνετε, ενδεχομένως να εξαλείψετε το ζήτημα της αδυναμίας υπολογισμού δειγμάτων αρκετά γρήγορα και να επιτρέψετε περισσότερες χορδές, αρμονικές, ακόμη και ηχητικά εφέ ή άλλες εργασίες στο πλευρά επεξεργαστή.

Βήμα 6: Καλωδίωση των αισθητήρων

Καλωδίωση των αισθητήρων
Καλωδίωση των αισθητήρων

Για τη δημιουργία των συμβολοσειρών χρησιμοποιήσαμε αισθητήρες δέσμης διακοπής IR που θα ανιχνεύσουν πότε παίζεται η συμβολοσειρά. Παραγγείλαμε τους αισθητήρες μας από τον παρακάτω σύνδεσμο. Οι αισθητήρες έχουν καλώδιο τροφοδοσίας, γείωσης και δεδομένων, ενώ οι εκπομπές έχουν μόνο καλώδιο τροφοδοσίας και γείωσης. Χρησιμοποιήσαμε τους ακροδέκτες 3,3 V και γείωσης από τις κεφαλίδες PMOD για να τροφοδοτήσουμε τόσο τους εκπομπούς όσο και τους αισθητήρες. Για να τροφοδοτήσετε όλους τους αισθητήρες και τους πομπούς, είναι απαραίτητο να συνδέσετε όλους τους αισθητήρες και τον πομπό παράλληλα. Τα καλώδια δεδομένων από τους αισθητήρες θα πρέπει το καθένα να μεταβεί στο δικό του pmod pin.

Βήμα 7: Κατασκευή του σκελετού

Κατασκευή του Σκελετού
Κατασκευή του Σκελετού

Για να δημιουργηθεί το σχήμα της άρπας, τα τρία κομμάτια χρησιμοποιούνται ως σκελετός για την τοποθέτηση των αισθητήρων και των εκπομπών. Σε ένα από τα δύο κομμάτια σωλήνα PVC 18 ιντσών ευθυγραμμίστε τους αισθητήρες και τους πομπούς με εναλλασσόμενη σειρά 1,5 ίντσες ο ένας από τον άλλο και στη συνέχεια κολλήστε τους στον σωλήνα. Στον άλλο σωλήνα PVC 18 ιντσών, ευθυγραμμίστε τους αισθητήρες και τους πομπούς με εναλλασσόμενη σειρά, αλλά φροντίστε να αντισταθμίσετε τη σειρά (δηλ. Εάν ο πρώτος σωλήνας είχε αισθητήρα πρώτα, ο δεύτερος θα πρέπει να έχει πρώτο έναν πομπό και αντίστροφα). Θα χρειαστεί να κολλήσετε μακρύτερα σύρματα στα καλώδια δεδομένων, ισχύος και γείωσης για να διασφαλίσετε ότι θα είναι σε θέση να φτάσουν στον πίνακα.

Βήμα 8: Χτίζοντας το ξύλινο εξωτερικό

Χτίζοντας το ξύλο εξωτερικά
Χτίζοντας το ξύλο εξωτερικά

Αυτό το βήμα είναι προαιρετικό αλλά συνιστάται ιδιαίτερα. Το εξωτερικό ξύλο όχι μόνο κάνει την άρπα να φαίνεται ωραία, προστατεύει επίσης τους αισθητήρες και τα καλώδια από ζημιές. Το ξύλινο πλαίσιο μπορεί να δημιουργηθεί από έναν ορθογώνιο δακτύλιο από ξύλο. Το εσωτερικό του ορθογωνίου πρέπει να έχει άνοιγμα τουλάχιστον 1-1/2 ίντσες για να ταιριάζει στο σκελετό του σωλήνα και του αισθητήρα. Μόλις κατασκευαστεί το πλαίσιο ανοίξτε δύο τρύπες που θα επιτρέψουν στα καλώδια από τον αισθητήρα και τους πομπούς να βγουν για να τα συνδέσετε με την πλακέτα.

*Σημείωση: Συνιστάται η προσθήκη σημείων πρόσβασης για να μπορείτε να αφαιρέσετε και να τοποθετήσετε το σκελετό του σωλήνα σε περίπτωση που πρέπει να γίνουν επισκευές ή να γίνουν μικρές προσαρμογές.

Βήμα 9: Μαζεύοντας όλα τα κομμάτια

Βάζοντας όλα τα κομμάτια μαζί
Βάζοντας όλα τα κομμάτια μαζί

Μόλις τελειώσουν όλα τα προηγούμενα βήματα, είναι καιρός να κατασκευάσουμε την άρπα. Πρώτα τοποθετήστε το σκελετό του σωλήνα μέσα στο ξύλινο εξωτερικό. Στη συνέχεια, συνδέστε τα καλώδια για τους αισθητήρες και τους πομπούς στη σωστή θέση στον πίνακα. Στη συνέχεια, ανοίξτε το SDK και κάντε κλικ στο κουμπί εντοπισμού σφαλμάτων για να προγραμματίσετε τον πίνακα. Μόλις προγραμματιστεί η πλακέτα, συνδέστε ένα ζευγάρι ακουστικά ή ένα ηχείο. Ανάλογα με τον αισθητήρα που καταλήγει σε ποια θύρα pmod, οι χορδές της άρπας σας θα είναι πιθανότατα εκτός λειτουργίας για αρχή. Επειδή μπορεί να είναι δύσκολο να πούμε ποιο καλώδιο πηγαίνει σε ποιον αισθητήρα όταν εμπλέκονται τόσα καλώδια, συμπεριλάβαμε έναν τρόπο χαρτογράφησης αριθμών συμβολοσειρών για διακοπή των θέσεων bit στο λογισμικό. Βρείτε "static int sensor_map [NUM_STRINGS]" και προσαρμόστε τις τιμές στον πίνακα έως ότου οι συμβολοσειρές αναπαράγονται από τη χαμηλότερη στην υψηλότερη κατά σειρά.

Το μενού μπορεί να χρησιμοποιηθεί ανοίγοντας ένα σειριακό τερματικό (π.χ. RealTerm) και ορίστε τον ρυθμό baud σε 115200 και την οθόνη σε ANSI. Μπορείτε να πλοηγηθείτε στο μενού χρησιμοποιώντας τα πλήκτρα w και s για να μετακινηθείτε πάνω και κάτω και τα πλήκτρα a και d για να αλλάξετε τις τιμές.

Βήμα 10: ΒΓΑΛΙΣΤΕ

Μόλις η άρπα είναι πλήρως λειτουργική. Κυριαρχήστε την άρπα και ακούστε τον γλυκό ήχο της δικής σας μουσικής!

Συνιστάται: