Το Isokratis είναι μια εφαρμογή εξάσκησης για ψάλτες. Ο ψάλτης χρειάζεται ένα σταθερό ισοκράτημα πάνω στο οποίο να ψάλλει, και η εφαρμογή συνθέτει αυτό το ισοκράτημα σε πραγματικό χρόνο, ενώ ο χρήστης επιλέγει κλίμακα και αρχικό φθόγγο. Η ενδιαφέρουσα μηχανική ζει σε δύο σημεία: το μουσικό μοντέλο και το γράφημα ήχου.
Η θεωρία της μουσικής, κωδικοποιημένη
Η βυζαντινή ψαλμωδία δεν χρησιμοποιεί ισότονο δυτικό σύστημα. Η οκτάβα διαιρείται σε 72 ίσες μονάδες που ονομάζονται moria, και κάθε κλίμακα είναι μια ακολουθία διαστημάτων σε αυτό τον χώρο. Έτσι, αντί για σκληροκωδικοποιημένες συχνότητες, το μοντέλο δουλεύει όπως η ίδια η θεωρία:
- 72 moria ανά οκτάβα — συντελεστής συχνότητας 2^(m/72) ανά morium
- Επτά φθόγγοι — Νη, Πα, Βου, Γα, Δι, Κε, Ζω — σε σταθερό τονικό κέντρο (Κε = 220 Hz)
- Μια κλίμακα είναι ένα διάστημα-μοτίβο· το πλέγμα φθόγγων παράγεται περιστρέφοντας αυτό το μοτίβο στην οκτάβα
Η επιλογή διαφορετικής κλίμακας αλλάζει μόνο τη λίστα διαστημάτων. Το ύψος προκύπτει πάντα από το τονικό κέντρο μέσω της αριθμητικής των moria, που διατηρεί όλη τη μηχανή συνεπή — και καθιστά τις μικροτονικές μετατοπίσεις φυσικές, επειδή το morium είναι ήδη η ελάχιστη μονάδα.
Το γράφημα ήχου
Η αλυσίδα σύνθεσης είναι σκόπιμα μικρή και τυποποιημένη:
AudioSource → ActiveVoice → DroneEngine → destination
Κάθε ActiveVoice είναι είτε ταλαντωτής (συνεχής τόνος) είτε δείγμα buffer (ηχογραφημένο ισοκράτημα), που διέρχεται από χαμηλοπερατό φίλτρο, στάδιο EQ και κόμβο gain με περιβάλλον ADSR. Το DroneEngine κατέχει το master gain και εκθέτει γεγονότα (start, stop, voicesChanged) ώστε το UI να μένει συγχρονισμένο χωρίς polling.
Τα σημεία που απαιτούν προσοχή:
- Μετατόπιση ύψους σε moria, όχι σε cents: αδρή στα ±6 και λεπτή στα ±1, έως ±30 moria συνολικά. Για ταλαντωτές είναι απλώς
frequency = tonic * 2^(m/72)· για δείγματα, ο ίδιος λόγος εφαρμόζεται στον ρυθμό αναπαραγωγής. - Περιβάλλοντα χωρίς κρότο. Οι ράμπες attack και release ακούγονται ασήμαντες μέχρι να ακούσεις το pop μιας απότομης αλλαγής gain.
- Πολυφωνία στην premium βαθμίδα — πολλαπλές φωνές ταυτόχρονα, καθεμία με δικό της envelope και φίλτρο.
Αποθήκευση και συγχρονισμός
Οι ρυθμίσεις και τα 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 είναι το κομμάτι που θα αντέγραφα.