KXκωνσταντίνος.χαφής
2 λεπτά ανάγνωσης

Μια μηχανή ισοκρατήματος για τη βυζαντινή ψαλμωδία στο Web Audio API

Πώς το Isokratis μετατρέπει τη θεωρία της βυζαντινής μουσικής σε μηχανή σύνθεσης πραγματικού χρόνου — μοντέλο κλίμακας 72 moria, φωνές ταλαντωτή και δειγμάτων, περιβάλλοντα ADSR και μετατόπιση ύψους με τον τρόπο που την περιμένουν οι ψάλτες.

#web-audio#isokratistypescript#pwa#byzantine

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

Η θεωρία της μουσικής, κωδικοποιημένη

Η βυζαντινή ψαλμωδία δεν χρησιμοποιεί ισότονο δυτικό σύστημα. Η οκτάβα διαιρείται σε 72 ίσες μονάδες που ονομάζονται moria, και κάθε κλίμακα είναι μια ακολουθία διαστημάτων σε αυτό τον χώρο. Έτσι, αντί για σκληροκωδικοποιημένες συχνότητες, το μοντέλο δουλεύει όπως η ίδια η θεωρία:

Η επιλογή διαφορετικής κλίμακας αλλάζει μόνο τη λίστα διαστημάτων. Το ύψος προκύπτει πάντα από το τονικό κέντρο μέσω της αριθμητικής των moria, που διατηρεί όλη τη μηχανή συνεπή — και καθιστά τις μικροτονικές μετατοπίσεις φυσικές, επειδή το morium είναι ήδη η ελάχιστη μονάδα.

Το γράφημα ήχου

Η αλυσίδα σύνθεσης είναι σκόπιμα μικρή και τυποποιημένη:

AudioSource → ActiveVoice → DroneEngine → destination

Κάθε ActiveVoice είναι είτε ταλαντωτής (συνεχής τόνος) είτε δείγμα buffer (ηχογραφημένο ισοκράτημα), που διέρχεται από χαμηλοπερατό φίλτρο, στάδιο EQ και κόμβο gain με περιβάλλον ADSR. Το DroneEngine κατέχει το master gain και εκθέτει γεγονότα (start, stop, voicesChanged) ώστε το UI να μένει συγχρονισμένο χωρίς polling.

Τα σημεία που απαιτούν προσοχή:

Αποθήκευση και συγχρονισμός

Οι ρυθμίσεις και τα presets ζουν στο IndexedDB ανά χρήστη (user:123:settings), που κάνει την εφαρμογή να αισθάνεται στιγμιαία. Στον διακομιστή, μια βάση Cloudflare D1 αποθηκεύει λογαριασμούς, συνόδους και premium κατάσταση, και ο συγχρονισμός συσκευών χρησιμοποιεί stale-while-revalidate: το IndexedDB απαντά άμεσα και το API ανανεώνει στο παρασκήνιο.

Τι με έμαθε η μηχανή

Το Web Audio API είναι εκπληκτικά πλήρες για αυτή τη χρήση — το μόνο που δεν μπορείς να κάνεις είναι να αγνοήσεις τη state machine του audio thread. Κάθε ράμπα gain, κάθε έναρξη φωνής πρέπει να προγραμματιστεί, αλλιώς κροτάει. Αυτή η πειθαρχία μεταφέρεται: η ίδια φροντίδα φαίνεται και στο API, όπου η επικύρωση συνόδου κρυπτογραφείται σε cache στο Cloudflare KV με TTL, ώστε η πρώτη νότα του ψάλτη να μην καθυστερεί από round-trip στη βάση.

Αν ψάλλεις βυζαντινή μουσική, δοκίμασέ το. Αν γράφεις κώδικα ήχου, η αριθμητική των moria είναι το κομμάτι που θα αντέγραφα.