From 8cb639c1bd94c94992bc1b7ccedd51aa5461fc4a Mon Sep 17 00:00:00 2001 From: bonamin Date: Wed, 25 Feb 2026 21:29:56 +0200 Subject: [PATCH] First Production Push --- .env.example | 4 + .gitignore | 8 +- SecondaryApps/MelodyBuilders/all_melodies.txt | 1 - .../MelodyBuilders/builtin_melodies.txt | 26 - .../MelodyBuilders/convert_to_bin.py | 215 -- .../MelodyBuilders/convert_to_builtin.py | 300 -- SecondaryApps/MelodyBuilders/melodies.h | 475 --- .../melodies_in_binary/1N_Esperinos_Adam.bsm | Bin 64 -> 0 bytes .../melodies_in_binary/3N_MiaMia.bsm | Bin 192 -> 0 bytes .../SpeedCalc/melodies_in_txt/melodies.txt | 3 - SecondaryApps/SpeedCalc/requirements.txt | 3 - SecondaryApps/SpeedCalc/speedcalc.py | 1067 ------ backend/builder/service.py | 5 +- backend/config.py | 3 + backend/devices/models.py | 9 +- backend/devices/service.py | 46 +- backend/mqtt_data.db | Bin 0 -> 700416 bytes data/.gitkeep | 0 docker-compose.yml | 4 + .../devices/Strikers/striker_size_1.png | Bin 0 -> 9308 bytes .../devices/Strikers/striker_size_2.png | Bin 0 -> 11354 bytes .../devices/Strikers/striker_size_3.png | Bin 0 -> 13765 bytes .../devices/Strikers/striker_size_4.png | Bin 0 -> 15465 bytes .../devices/Strikers/striker_size_5.png | Bin 0 -> 16698 bytes .../devices/Strikers/striker_size_6.png | Bin 0 -> 18969 bytes .../public/image-assets/certified_logo.png | Bin 0 -> 31930 bytes frontend/src/devices/DeviceDetail.jsx | 3304 ++++++++++++++--- frontend/src/devices/DeviceForm.jsx | 10 +- frontend/src/devices/DeviceList.jsx | 7 - frontend/src/index.css | 934 +++++ frontend/src/layout/Header.jsx | 2 +- frontend/vite.config.js | 7 + 32 files changed, 3714 insertions(+), 2719 deletions(-) delete mode 100644 SecondaryApps/MelodyBuilders/all_melodies.txt delete mode 100644 SecondaryApps/MelodyBuilders/builtin_melodies.txt delete mode 100644 SecondaryApps/MelodyBuilders/convert_to_bin.py delete mode 100644 SecondaryApps/MelodyBuilders/convert_to_builtin.py delete mode 100644 SecondaryApps/MelodyBuilders/melodies.h delete mode 100644 SecondaryApps/SpeedCalc/melodies_in_binary/1N_Esperinos_Adam.bsm delete mode 100644 SecondaryApps/SpeedCalc/melodies_in_binary/3N_MiaMia.bsm delete mode 100644 SecondaryApps/SpeedCalc/melodies_in_txt/melodies.txt delete mode 100644 SecondaryApps/SpeedCalc/requirements.txt delete mode 100644 SecondaryApps/SpeedCalc/speedcalc.py create mode 100644 data/.gitkeep create mode 100644 frontend/public/devices/Strikers/striker_size_1.png create mode 100644 frontend/public/devices/Strikers/striker_size_2.png create mode 100644 frontend/public/devices/Strikers/striker_size_3.png create mode 100644 frontend/public/devices/Strikers/striker_size_4.png create mode 100644 frontend/public/devices/Strikers/striker_size_5.png create mode 100644 frontend/public/devices/Strikers/striker_size_6.png create mode 100644 frontend/public/image-assets/certified_logo.png diff --git a/.env.example b/.env.example index 9378b3a..1e0af00 100644 --- a/.env.example +++ b/.env.example @@ -17,3 +17,7 @@ MOSQUITTO_PASSWORD_FILE=/etc/mosquitto/passwd # App BACKEND_CORS_ORIGINS=["http://localhost:5173"] DEBUG=true + +# Local file storage (override if you want to store data elsewhere) +SQLITE_DB_PATH=./mqtt_data.db +BUILT_MELODIES_STORAGE_PATH=./storage/built_melodies diff --git a/.gitignore b/.gitignore index 2b352ba..236a97e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,11 @@ .env firebase-service-account.json +# Persistent runtime data (lives outside docker, not in git) +/data/* +!/data/.gitkeep +!/data/built_melodies/.gitkeep + # Python __pycache__/ *.pyc @@ -20,5 +25,4 @@ dist/ .DS_Store Thumbs.db -MAIN-APP-REFERENCE/ -SecondaryApps/ \ No newline at end of file +.MAIN-APP-REFERENCE/ \ No newline at end of file diff --git a/SecondaryApps/MelodyBuilders/all_melodies.txt b/SecondaryApps/MelodyBuilders/all_melodies.txt deleted file mode 100644 index 77a8f8b..0000000 --- a/SecondaryApps/MelodyBuilders/all_melodies.txt +++ /dev/null @@ -1 +0,0 @@ -Esperinos-Adamn-1k: 1,0,1,0,1,0,0,0,1,0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0 Esperinos-Eortastikos-1k: 1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0 Orthros-1k: 1,0,1,0,1,1,0 Doksologia-1k: 1,0,1,1,0,1,0 Panigiriko-1k: 1,1,1,0,1,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,1,0,1,0 Xarmosino-1k: 1,0,1,1,1,1,1,0 Despotiko-1k: 1,1,1,1,1,1,1,1,1,1,0,0 Katixitiko-1k: 1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0 Penthimo-Koino-1k: 1,0,0,0,0,0,0,1,1,0,0,0,0,0,0 Penthimo-Meg-Par-1k: 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0 Esperinos-Adam-kamp2-2k: 2,2,2,0,2,2,2,0,2,2,2,2,2,2,2,0 Esperinos-Adam-kamp1-2k: 1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,0 Esperinos-Eortastikos-2k: 1,2,1,2,1,2,0,0,1,2,1,2,1,2,0,0,1,2,1,2,1,2,1,2,1,2,1,2,1,2,0,0 Orthros-2k: 1,0,2,0,1,2,0 Doksologia-2k: 1,2,1,0,1,2,1,0,1,2,1,2,1,2,1,0 Panigiriko-2k: 1,0,0,2,0,0,1,0,0,2,0,0,1,0,0,2,0,0,1,0,0,2,0,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2 Xarmosyno-2k: 1,1,2,2,1,2,1,2 Agioritiko-2k: 1,2,1,1,2,1,1,2,1,1,2,1,2 MiaMia-2k: 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,1,2,1,1,2,1,2,2,1,1,2,1,1,2,1,1,1,2,1,1,2,1,2,2,1,1,2,1,1,2,1,1,1,2,1,1,2,1,2,2,1,1,2,1,1,2,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2 Penthimo-Koino-2k: 1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0 Penthimo-Meg-Par-2k: 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0 Erotastiko-2k: 1,2,1,2 Doksologia-2k: 2,0,1,2,0,1,0,2,0,1,2,0,1,0,2,0,1,2,0,1,0,2,1,2,1,2,0,1,0 Doksologia-Pan-2k: 2,0,2,2,0,2,0 Talanto-2k: 1,1,1,2,1,1,1,2,1,2,1,2,1,1,1,2 Katixitiko-2k: 2,0,2,0,2,0,2,0,2,0,0,0,0,0,0,0 Esperinos-Adam-kamp3-3k: 3,3,3,0,3,3,3,0,3,3,3,3,3,3,3,0 Esperinos-Eortastikos-3k: 2,3,2,3,2,3,0,0,2,3,2,3,2,3,0,0,2,3,2,3,2,3,2,3,2,3,2,3,2,3,0,0 Orthros-2k: 1,0,2,0,1,2,0 Doksologia-3k: 1,2,3,0,1,2,3,0,1,2,1,2,1,2,3,0 Panigiriko-3k: 1,0,0,2,0,0,3,0,0,1,0,0,2,0,0,3,0,0,1,0,0,2,0,0,3,0,1,0,2,0,3,0,1,0,2,0,3,0,1,0,2,0,3,0,1,0,2,0,3,0,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3 Xarmosyno-3k: 1,2,3,1,2 Agioritiko-3k: 2,1,0,0,2,1,0,0,2,1,2,1,2,1,0,1,2,1,0,1,2,1,0,1,2,1,2,1,2,1,0,1,2,1,0,1,2,1,0,1,2,1,2,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,2,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,2,1,2,1,3 MiaMia-3k: 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2 Penthimo-Meg-Par-3k: 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,3,3,0,0,0,0,0,0 Esperinos-Panigirikos-3k: 1,2,1,2,1,3,0,0,1,2,1,2,1,3,0,0,1,2,1,2,1,2,1,2,1,2,1,2,1,3,0,0 Doksologia-3k: 1,0,2,1,0,3+1,0,1,0,2,1,0,3+1,0,1,0,2,1,0,3+1,0,1,2,1,2,1,0,3+1,0 Doksologia-Pan-3k: 1,2,2+1,1,2,3+1 Katixitiko-3k: 3,0,3,0,3,0,3,0,3,0,0,0,0,0,0,0 Doksologia-4k: 2,3,4,0,2,3,4,0,2,3,2,3,2,3,4,0 Panigiriko-4k: 2,0,0,3,0,0,4,0,0,2,0,0,3,0,0,4,0,0,2,0,0,3,0,0,4,0,2,0,3,0,4,0,2,0,3,0,4,0,2,0,3,0,4,0,2,0,3,0,4,0,2,3,4,2,3,4,2,3,4,2,3,4,2,3,4,2,3,4,2,3,4,2,3,4,2,3,4,2,3,4,2,3,4,2,3,4,2,3,4,2,3,4,2,3,4,2,3,4,2,3,4,2,3,4,2,3,4,2,3,4 Xarmosyno-4k: 1,2,3,4,2,3 Agioritiko-4k: 2,1,0,0,2,1,0,0,2,1,2,1,2,1,0,1,2,1,0,1,2,1,0,1,2,1,2,1,2,1,0,1,2,1,0,1,2,1,0,1,2,1,2,1,2,1,3,1,2,1,0,3+1,2,1,0,3+1,2,1,0,3+1,2,1,2,3+1,2,1,4,3+1,2,1,0,3+1,2,1,0,3+1,2,1,2,3+1,2,1,4+1,2,1,3+1,2,1,4+2,2,1,3+2,2,1,4+1,2,1,3+1,2,1,4+2,2,1,3+2,2,1,4+1 MiaMia-4k: 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,2,3,4+1,3,2,1,2,3,4+1,3,2,1,2,3,4+1,3,2,1,2,3,4+1,3,2,1,2,3,4+1,3,2,1,2,3,4+1,3,2,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2 Penthimo-Meg-Par-4k: 2,0,0,0,0,0,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,3,3,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,4,0,0,0,0,0,0,4,0,0,0,0,0,0,4,4,0,0,0,0,0,0 Esperinos-Pan-4k: 2,3,2,3,2,4,0,0,2,3,2,3,2,4,0,0,2,3,2,3,2,3,2,3,2,3,2,3,2,4,0,0 Doksologia-4k: 2,0,3,2,0,4+1,0,2,0,3,2,0,4+1,0,2,0,3,2,0,4+1,0,2,3,2,3,2,0,4+1,0 Xarmosyno-4k: 1,2,3,4+1,2,1,3,4+1 1B-test: 1 \ No newline at end of file diff --git a/SecondaryApps/MelodyBuilders/builtin_melodies.txt b/SecondaryApps/MelodyBuilders/builtin_melodies.txt deleted file mode 100644 index c228cb5..0000000 --- a/SecondaryApps/MelodyBuilders/builtin_melodies.txt +++ /dev/null @@ -1,26 +0,0 @@ -Doxology_Traditional: 1,2,1,2,1,3,0,0,1,2,1,2,1,4,0,0,1,2,1,2,1,2,1,2,1,2,1,3,1,4,0,0 -Doxology_Alternative: 1,0,2,3,0,4+5,0,1,0,2,3,0,4+5,0,1,0,2,3,0,4+5,0,1,2,1,2,3,0,4+5,0 -Doxology_Festive: 2,3,4+1,3,2,3,5+1,3,2,3,6+1,3,2,3,5+1,3 -Vesper_Traditional: 1,2,3,0,1,2,3,0,1,2,1,2,1,2,3,0 -Vesper_Alternative: 1,2,0,0,1,2,0,0,1,3,0,0,0,0,0,0,1,2,0,0,1,2,0,0,1,4,0,0,0,0,0,0,1,2,0,0,1,2,0,0,1,2,0,0,1,2,0,0,1,2,0,0,1,3,0,0,1,4,0,0,0,0,0,0 -Catehetical: 1,2,3,4,5 -Orthros_Traditional: 1,0,2,0,3,4,0,5,0,6,0,7,8,0 -Orthros_Alternative: 1,0,2,1,0,2,0,1,0,1,2,1,0,3,0 -Mournfull_Toll: 1,0,0,0,0,0,0,1,0,0,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,4,0,0,0,0,0,0,4,0,0,0,0,0,0 -Mournfull_Toll_Alternative: 1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,3,0,0,0,0,0,0,3,3,0,0,0,0,0,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,4,0,0,0,0,0,0,4,4,0,0,0,0,0,0 -Mournfull_Toll_Meg_Par: 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,3,3,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,4,0,0,0,0,0,0,4,0,0,0,0,0,0,4,4,0,0,0,0,0,0 -Sematron: 1,1,1,2,1,1,1,4,1,1,1,2,1,3,1,4 -Sematron_Alternative: 1,1,1,2,1,1,1,4,1,2,1,3,1,1,1,4 -Athonite_1_2_Voices: 1,2,1,1,2,1,1,2,1,1,2,1,2 -Athonite_3_Voices: 2,1,0,0,2,1,0,0,2,1,2,1,2,1,0,1,2,1,0,1,2,1,0,1,2,1,2,1,2,1,0,1,2,1,0,1,2,1,0,1,2,1,2,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,2,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,2,1,2,1,3 -Athonite_3_4_Voices: 2,1,0,0,2,1,0,0,2,1,2,1,2,1,0,1,2,1,0,1,2,1,0,1,2,1,2,1,2,1,0,1,2,1,0,1,2,1,0,1,2,1,2,1,2,1,3,1,2,1,0,3+1,2,1,0,3+1,2,1,0,3+1,2,1,2,3+1,2,1,4,3+1,2,1,0,3+1,2,1,0,3+1,2,1,2,3+1,2,1,4+1,2,1,3+1,2,1,4+2,2,1,3+2,2,1,4+1,2,1,3+1,2,1,4+2,2,1,3+2,2,1,4+1 -Athonite_4_8_Voices: 2,1,0,0,2,1,0,0,2,1,2,1,2,1,0,1,2,1,0,1,2,1,0,1,2,1,2,1,2,1,0,1,2,1,0,1,2,1,0,1,2,1,2,1,2,1,3,1,2,1,0,3+1,2,1,0,3+1,2,1,0,3+1,2,1,2,3+1,2,1,4,3+1,2,1,0,3+1,2,1,0,3+1,2,1,2,3+1,2,1,4+1,2,1,5+1,2,1,6+2,2,1,8+1,2,1,4+2,2,1,7+1,2,1,5+2,2,1,6+1,2,1,8+2,2,1,4+1,2,1,7+2,2,1,5+1,2,1,6+2,2,1,8+1,2,1,4+2,2,1,7+1,2,1,0,3+1,2,1,0,3+1,2,1,2,3+1,2,1,0,0,0 -OneByOne_2_3_Voices: 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2 -OneByOne_4_8_Voices: 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,2,3,4,3,2,5+1,2,3,4,3,2,6+1,2,3,4,3,2,7+1,2,3,4,3,2,8+1,2,3,4,3,2,7+1,2,3,4,3,2,6+1,2,3,4,3,2,7+1,2,3,4,3,2,8+1,2,3,4,3,2,7+1,2,3,4,3,2,6+1,2,3,4,3,2,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,3,1,2,1,2,1,2,1,2,1,2,1,2,1,0 -Festive_1Voice: 1,1,1,0,1,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,1,0,1,0 -Festive_4Voices: 1,2,3,4+1,2,1,3,4+1 -Festive_5Voices: 1,2,3,2,1,2,1,2,4,2,1,2,1,2,3,2,1,2,1,2,5,2,1,2 -Festive_5Voice_Alternative: 3,2,4,1,3,3,2,4,1,5,3,2,4,1,3,3,2,4,1,5+1,3,2,4,1,3,3,2,4,1,5+1,3,2,4,1,3+1,3,2,4,1,5+1,3,2,4,1,3+1,3,2,4,1,5+1,3,2,4,1,3,3,2,4,1,5,3,2,4,1,3,3,2,4,1,5 -Festive_6Voices: 1,2,3,2,1,2,1,2,4,2,1,2,1,2,3,2,1,2,1,2,5,2,1,2,1,2,4+1,2,1,2,5+1,2,1,2,3+1,2,1,2,6+1,2,1,2,4+1,2,1,2,5+1,2,1,2,3+1,2,1,2,6+1,2,1,2,4+1,2,1,2,5+1,2,1,2,3+1,2,1,2,6+1,2,1,2 -Festive_8Voices: 1,2,3,4,5,6,7,8 -Ormilia: 2,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,1,0,1,2,1,0,1,2,1,0,1,0,1,0,1,2,1,2,1,2,1,2,1,0,1,0,1,0,1,0,1,2,4+1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,3+1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,4+1,0,1,2,3+1,0,1,2,4+1,0,1,2,3+1,0,1,2,5+1,2,1,2,6+1,2,1,2,5+1,2,1,2,6+1,2,7+1,2,8+1,2,4+1,2,7+1,2,8+1,2,4+1,2,7+1,2,8+1,2,3+1,2,1,0 \ No newline at end of file diff --git a/SecondaryApps/MelodyBuilders/convert_to_bin.py b/SecondaryApps/MelodyBuilders/convert_to_bin.py deleted file mode 100644 index f61815a..0000000 --- a/SecondaryApps/MelodyBuilders/convert_to_bin.py +++ /dev/null @@ -1,215 +0,0 @@ -#!/usr/bin/env python3 -""" -Bell Melody Converter -Converts human-readable bell notation to binary .bsm files for ESP32 - -Format: MELODY_NAME: 1,2,3+4,0,5+6+7 -Output: MELODY_NAME.bsm (binary file, uint16_t big-endian) -""" - -import sys -import re -from pathlib import Path -from typing import List, Tuple - - -def parse_bell_notation(notation: str) -> int: - """ - Convert human-readable bell notation to bit flag value - - Examples: - "2+8" → bells 2,8 → bits 1,7 → 0x0082 (130) - "4" → bell 4 → bit 3 → 0x0008 (8) - "1+2+3" → bells 1,2,3 → bits 0,1,2 → 0x0007 (7) - "0" → no bells → 0x0000 (0) - - Formula: Bell #N → Bit (N-1) → Value = 1 << (N-1) - """ - notation = notation.strip() - - # Handle zero/silence - if notation == '0' or not notation: - return 0 - - # Split by + to get individual bell numbers - bell_numbers = notation.split('+') - - value = 0 - for bell_str in bell_numbers: - try: - bell_num = int(bell_str.strip()) - - if bell_num == 0: - continue # Bell 0 means silence, contributes nothing - - if bell_num < 1 or bell_num > 16: - print(f"Warning: Bell number {bell_num} out of range (1-16), skipping") - continue - - # Convert bell number to bit position (1-indexed to 0-indexed) - bit_position = bell_num - 1 - bit_value = 1 << bit_position - value |= bit_value - - except ValueError: - print(f"Warning: Invalid bell number '{bell_str}', skipping") - continue - - return value - - -def parse_melody_line(line: str) -> Tuple[str, List[int]]: - """ - Parse a melody line in format: MELODY_NAME: step,step,step - - Returns: - (melody_name, list of uint16_t values) - """ - line = line.strip() - - if not line or line.startswith('#'): - return None, [] - - # Split by colon - if ':' not in line: - print(f"Warning: Invalid format (missing ':'): {line}") - return None, [] - - parts = line.split(':', 1) - melody_name = parts[0].strip() - steps_str = parts[1].strip() - - if not melody_name: - print(f"Warning: Empty melody name in line: {line}") - return None, [] - - # Parse steps (comma-separated) - step_strings = steps_str.split(',') - values = [] - - for i, step_str in enumerate(step_strings): - value = parse_bell_notation(step_str) - values.append(value) - - return melody_name, values - - -def write_binary_melody(filepath: str, values: List[int]): - """ - Write melody values as binary file (uint16_t, big-endian) - - Args: - filepath: Output file path - values: List of uint16_t values (0-65535) - """ - with open(filepath, 'wb') as f: - for value in values: - # Ensure value fits in uint16_t - if value > 0xFFFF: - print(f"Warning: Value {value} exceeds uint16_t range, truncating") - value = value & 0xFFFF - - # Write as 2 bytes, big-endian (MSB first) - f.write(value.to_bytes(2, byteorder='big')) - - -def convert_melodies_file(input_path: str, output_dir: str = '.'): - """ - Convert multi-melody file to individual .bsm binary files - - Args: - input_path: Path to input text file - output_dir: Directory for output .bsm files - """ - output_path = Path(output_dir) - output_path.mkdir(parents=True, exist_ok=True) - - melodies_created = 0 - total_steps = 0 - - try: - with open(input_path, 'r', encoding='utf-8') as f: - lines = f.readlines() - - print(f"Reading from: {input_path}") - print(f"Output directory: {output_path.absolute()}\n") - - for line_num, line in enumerate(lines, 1): - melody_name, values = parse_melody_line(line) - - if melody_name and values: - # Create output filename - output_file = output_path / f"{melody_name}.bsm" - - # Write binary file - write_binary_melody(str(output_file), values) - - # Calculate file size - file_size = len(values) * 2 # 2 bytes per uint16_t - - # Show what bells are used - all_bells = set() - for value in values: - for bit in range(16): - if value & (1 << bit): - all_bells.add(bit + 1) # Convert back to 1-indexed - - bells_str = ','.join(map(str, sorted(all_bells))) if all_bells else 'none' - - print(f"✓ {melody_name}.bsm") - print(f" Steps: {len(values)}") - print(f" Size: {file_size} bytes") - print(f" Bells used: {bells_str}") - print() - - melodies_created += 1 - total_steps += len(values) - - print(f"{'='*50}") - print(f"✓ Successfully created {melodies_created} melody files") - print(f" Total steps: {total_steps}") - print(f" Total size: {total_steps * 2} bytes") - - return True - - except FileNotFoundError: - print(f"Error: Input file '{input_path}' not found") - return False - except Exception as e: - print(f"Error: {e}") - import traceback - traceback.print_exc() - return False - - -def main(): - """Main entry point""" - print("=== Bell Melody Converter ===") - print("Creates binary .bsm files for ESP32\n") - - # Default input file - input_file = "all_melodies.txt" - output_dir = "." - - # Check if file exists - if not Path(input_file).exists(): - print(f"Error: '{input_file}' not found in current directory!") - print("\nPlease create 'all_melodies.txt' with format:") - print(" MELODY_NAME: step,step,step,...") - print("\nStep notation:") - print(" 0 - Silence") - print(" 4 - Bell #4 only") - print(" 2+8 - Bells #2 and #8 together") - print(" 1+2+3 - Bells #1, #2, and #3 together") - print("\nExample:") - print(" JINGLE_BELLS: 4,4,4,0,4,4,4,0,4,8,1,2,4") - print(" ALARM: 2+8,0,2+8,0,2+8,0") - print(" HAPPY_BIRTHDAY: 1,1,2,1,4,3,0,1,1,2,1,8,4") - sys.exit(1) - - success = convert_melodies_file(input_file, output_dir) - sys.exit(0 if success else 1) - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/SecondaryApps/MelodyBuilders/convert_to_builtin.py b/SecondaryApps/MelodyBuilders/convert_to_builtin.py deleted file mode 100644 index 7ee77c8..0000000 --- a/SecondaryApps/MelodyBuilders/convert_to_builtin.py +++ /dev/null @@ -1,300 +0,0 @@ -#!/usr/bin/env python3 -""" -Bell Melody to C Header Converter -Converts human-readable bell notation to C header file with PROGMEM arrays - -Input Format: MELODY_NAME: 1,2,3+4,0,5+6+7 -Output: melodies.h (C header with const uint16_t PROGMEM arrays) -""" - -import sys -import re -from pathlib import Path -from typing import List, Tuple -from datetime import datetime - - -def parse_bell_notation(notation: str) -> int: - """ - Convert human-readable bell notation to bit flag value - - Examples: - "2+8" → bells 2,8 → bits 1,7 → 0x0082 (130) - "4" → bell 4 → bit 3 → 0x0008 (8) - "1+2+3" → bells 1,2,3 → bits 0,1,2 → 0x0007 (7) - "0" → no bells → 0x0000 (0) - - Formula: Bell #N → Bit (N-1) → Value = 1 << (N-1) - """ - notation = notation.strip() - - # Handle zero/silence - if notation == '0' or not notation: - return 0 - - # Split by + to get individual bell numbers - bell_numbers = notation.split('+') - - value = 0 - for bell_str in bell_numbers: - try: - bell_num = int(bell_str.strip()) - - if bell_num == 0: - continue # Bell 0 means silence, contributes nothing - - if bell_num < 1 or bell_num > 16: - print(f"Warning: Bell number {bell_num} out of range (1-16), skipping") - continue - - # Convert bell number to bit position (1-indexed to 0-indexed) - bit_position = bell_num - 1 - bit_value = 1 << bit_position - value |= bit_value - - except ValueError: - print(f"Warning: Invalid bell number '{bell_str}', skipping") - continue - - return value - - -def parse_melody_line(line: str) -> Tuple[str, List[int]]: - """ - Parse a melody line in format: MELODY_NAME: step,step,step - - Returns: - (melody_name, list of uint16_t values) - """ - line = line.strip() - - if not line or line.startswith('#'): - return None, [] - - # Split by colon - if ':' not in line: - return None, [] - - parts = line.split(':', 1) - melody_name = parts[0].strip() - steps_str = parts[1].strip() - - if not melody_name: - return None, [] - - # Parse steps (comma-separated) - step_strings = steps_str.split(',') - values = [] - - for step_str in step_strings: - value = parse_bell_notation(step_str) - values.append(value) - - return melody_name, values - - -def format_melody_array(melody_name: str, values: List[int], values_per_line: int = 8) -> str: - """ - Format melody values as C PROGMEM array - - Args: - melody_name: Name of the melody (will be prefixed with "builtin_") - values: List of uint16_t values - values_per_line: Number of hex values per line - - Returns: - Formatted C array declaration - """ - array_name = f"melody_builtin_{melody_name.lower()}" - - lines = [] - lines.append(f"const uint16_t PROGMEM {array_name}[] = {{") - - # Format values in rows - for i in range(0, len(values), values_per_line): - chunk = values[i:i + values_per_line] - hex_values = [f"0x{val:04X}" for val in chunk] - - # Add comma after each value except the last one overall - if i + len(chunk) < len(values): - line = " " + ", ".join(hex_values) + "," - else: - line = " " + ", ".join(hex_values) - - lines.append(line) - - lines.append("};") - - return "\n".join(lines) - - -def format_melody_info_entry(melody_name: str, display_name: str, array_size: int) -> str: - """ - Format a single MelodyInfo struct entry - - Args: - melody_name: Technical name (will be prefixed with "builtin_") - display_name: Human-readable name - array_size: Number of elements in the melody array - - Returns: - Formatted struct entry - """ - array_name = f"melody_builtin_{melody_name.lower()}" - id_name = f"builtin_{melody_name.lower()}" - - return f""" {{ - "{display_name}", - "{id_name}", - {array_name}, - sizeof({array_name}) / sizeof(uint16_t) - }}""" - - -def convert_to_header(input_path: str, output_path: str = "melodies.h"): - """ - Convert multi-melody file to C header file - - Args: - input_path: Path to input text file - output_path: Path to output .h file - """ - melodies = [] # List of (name, display_name, values) - - try: - with open(input_path, 'r', encoding='utf-8') as f: - lines = f.readlines() - - print(f"Reading from: {input_path}") - print(f"Output file: {output_path}\n") - - # Parse all melodies - for line_num, line in enumerate(lines, 1): - melody_name, values = parse_melody_line(line) - - if melody_name and values: - # Create display name (convert underscores to spaces, title case) - display_name = melody_name.replace('_', ' ').title() - melodies.append((melody_name, display_name, values)) - - print(f"✓ Parsed: {display_name} ({len(values)} steps)") - - if not melodies: - print("Error: No valid melodies found in input file") - return False - - # Generate header file - print(f"\n{'='*50}") - print(f"Generating C header file...\n") - - with open(output_path, 'w', encoding='utf-8') as f: - # Header guard and comments - f.write("/*\n") - f.write(" * Bell Melodies - Auto-generated\n") - f.write(f" * Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n") - f.write(f" * Source: {input_path}\n") - f.write(" * \n") - f.write(" * This file contains built-in melody definitions for the ESP32 bell controller\n") - f.write(" */\n\n") - f.write("#ifndef MELODIES_H\n") - f.write("#define MELODIES_H\n\n") - f.write("#include \n\n") - - # Write melody arrays - f.write("// ========================================\n") - f.write("// Melody Data Arrays\n") - f.write("// ========================================\n\n") - - for melody_name, display_name, values in melodies: - f.write(f"// {display_name}\n") - f.write(format_melody_array(melody_name, values)) - f.write("\n\n") - - # Write MelodyInfo structure definition - f.write("// ========================================\n") - f.write("// Melody Information Structure\n") - f.write("// ========================================\n\n") - f.write("struct MelodyInfo {\n") - f.write(" const char* display_name;\n") - f.write(" const char* id;\n") - f.write(" const uint16_t* data;\n") - f.write(" size_t length;\n") - f.write("};\n\n") - - # Write melody library array - f.write("// ========================================\n") - f.write("// Melody Library\n") - f.write("// ========================================\n\n") - f.write("const MelodyInfo MELODY_LIBRARY[] = {\n") - - for i, (melody_name, display_name, values) in enumerate(melodies): - entry = format_melody_info_entry(melody_name, display_name, len(values)) - - # Add comma except for last entry - if i < len(melodies) - 1: - f.write(entry + ",\n") - else: - f.write(entry + "\n") - - f.write("};\n\n") - - # Add library size constant - f.write(f"const size_t MELODY_LIBRARY_SIZE = {len(melodies)};\n\n") - - # Close header guard - f.write("#endif // MELODIES_H\n") - - # Summary - print(f"✓ Successfully created {output_path}") - print(f" Melodies: {len(melodies)}") - - total_steps = sum(len(values) for _, _, values in melodies) - print(f" Total steps: {total_steps}") - print(f" Estimated PROGMEM usage: {total_steps * 2} bytes") - - print(f"\n{'='*50}") - print("Done! Include this file in your ESP32 project.") - - return True - - except FileNotFoundError: - print(f"Error: Input file '{input_path}' not found") - return False - except Exception as e: - print(f"Error: {e}") - import traceback - traceback.print_exc() - return False - - -def main(): - """Main entry point""" - print("=== Bell Melody to C Header Converter ===") - print("Creates melodies.h for ESP32 firmware\n") - - # Default input file - input_file = "builtin_melodies.txt" - output_file = "melodies.h" - - # Check if file exists - if not Path(input_file).exists(): - print(f"Error: '{input_file}' not found in current directory!") - print("\nPlease create 'builtin_melodies.txt' with format:") - print(" MELODY_NAME: step,step,step,...") - print("\nStep notation:") - print(" 0 - Silence") - print(" 4 - Bell #4 only") - print(" 2+8 - Bells #2 and #8 together") - print(" 1+2+3 - Bells #1, #2, and #3 together") - print("\nExample:") - print(" JINGLE_BELLS: 4,4,4,0,4,4,4,0,4,8,1,2,4") - print(" ALARM: 2+8,0,2+8,0,2+8,0") - print(" HAPPY_BIRTHDAY: 1,1,2,1,4,3,0,1,1,2,1,8,4") - sys.exit(1) - - success = convert_to_header(input_file, output_file) - sys.exit(0 if success else 1) - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/SecondaryApps/MelodyBuilders/melodies.h b/SecondaryApps/MelodyBuilders/melodies.h deleted file mode 100644 index e6604cf..0000000 --- a/SecondaryApps/MelodyBuilders/melodies.h +++ /dev/null @@ -1,475 +0,0 @@ -/* - * Bell Melodies - Auto-generated - * Generated: 2026-01-20 09:19:43 - * Source: builtin_melodies.txt - * - * This file contains built-in melody definitions for the ESP32 bell controller - */ - -#ifndef MELODIES_H -#define MELODIES_H - -#include - -// ======================================== -// Melody Data Arrays -// ======================================== - -// Doxology Traditional -const uint16_t PROGMEM melody_builtin_doxology_traditional[] = { - 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0004, 0x0000, 0x0000, - 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0008, 0x0000, 0x0000, - 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, - 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, 0x0008, 0x0000, 0x0000 -}; - -// Doxology Alternative -const uint16_t PROGMEM melody_builtin_doxology_alternative[] = { - 0x0001, 0x0000, 0x0002, 0x0004, 0x0000, 0x0018, 0x0000, 0x0001, - 0x0000, 0x0002, 0x0004, 0x0000, 0x0018, 0x0000, 0x0001, 0x0000, - 0x0002, 0x0004, 0x0000, 0x0018, 0x0000, 0x0001, 0x0002, 0x0001, - 0x0002, 0x0004, 0x0000, 0x0018, 0x0000 -}; - -// Doxology Festive -const uint16_t PROGMEM melody_builtin_doxology_festive[] = { - 0x0002, 0x0004, 0x0009, 0x0004, 0x0002, 0x0004, 0x0011, 0x0004, - 0x0002, 0x0004, 0x0021, 0x0004, 0x0002, 0x0004, 0x0011, 0x0004 -}; - -// Vesper Traditional -const uint16_t PROGMEM melody_builtin_vesper_traditional[] = { - 0x0001, 0x0002, 0x0004, 0x0000, 0x0001, 0x0002, 0x0004, 0x0000, - 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0004, 0x0000 -}; - -// Vesper Alternative -const uint16_t PROGMEM melody_builtin_vesper_alternative[] = { - 0x0001, 0x0002, 0x0000, 0x0000, 0x0001, 0x0002, 0x0000, 0x0000, - 0x0001, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0001, 0x0002, 0x0000, 0x0000, 0x0001, 0x0002, 0x0000, 0x0000, - 0x0001, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0001, 0x0002, 0x0000, 0x0000, 0x0001, 0x0002, 0x0000, 0x0000, - 0x0001, 0x0002, 0x0000, 0x0000, 0x0001, 0x0002, 0x0000, 0x0000, - 0x0001, 0x0002, 0x0000, 0x0000, 0x0001, 0x0004, 0x0000, 0x0000, - 0x0001, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -// Catehetical -const uint16_t PROGMEM melody_builtin_catehetical[] = { - 0x0001, 0x0002, 0x0004, 0x0008, 0x0010 -}; - -// Orthros Traditional -const uint16_t PROGMEM melody_builtin_orthros_traditional[] = { - 0x0001, 0x0000, 0x0002, 0x0000, 0x0004, 0x0008, 0x0000, 0x0010, - 0x0000, 0x0020, 0x0000, 0x0040, 0x0080, 0x0000 -}; - -// Orthros Alternative -const uint16_t PROGMEM melody_builtin_orthros_alternative[] = { - 0x0001, 0x0000, 0x0002, 0x0001, 0x0000, 0x0002, 0x0000, 0x0001, - 0x0000, 0x0001, 0x0002, 0x0001, 0x0000, 0x0004, 0x0000 -}; - -// Mournfull Toll -const uint16_t PROGMEM melody_builtin_mournfull_toll[] = { - 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -// Mournfull Toll Alternative -const uint16_t PROGMEM melody_builtin_mournfull_toll_alternative[] = { - 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, - 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0004, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0002, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000 -}; - -// Mournfull Toll Meg Par -const uint16_t PROGMEM melody_builtin_mournfull_toll_meg_par[] = { - 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0004, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0002, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0008, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -// Sematron -const uint16_t PROGMEM melody_builtin_sematron[] = { - 0x0001, 0x0001, 0x0001, 0x0002, 0x0001, 0x0001, 0x0001, 0x0008, - 0x0001, 0x0001, 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, 0x0008 -}; - -// Sematron Alternative -const uint16_t PROGMEM melody_builtin_sematron_alternative[] = { - 0x0001, 0x0001, 0x0001, 0x0002, 0x0001, 0x0001, 0x0001, 0x0008, - 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, 0x0001, 0x0001, 0x0008 -}; - -// Athonite 1 2 Voices -const uint16_t PROGMEM melody_builtin_athonite_1_2_voices[] = { - 0x0001, 0x0002, 0x0001, 0x0001, 0x0002, 0x0001, 0x0001, 0x0002, - 0x0001, 0x0001, 0x0002, 0x0001, 0x0002 -}; - -// Athonite 3 Voices -const uint16_t PROGMEM melody_builtin_athonite_3_voices[] = { - 0x0002, 0x0001, 0x0000, 0x0000, 0x0002, 0x0001, 0x0000, 0x0000, - 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0001, 0x0000, 0x0001, 0x0002, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0001, 0x0000, 0x0001, 0x0002, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, - 0x0002, 0x0001, 0x0004, 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, - 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, - 0x0002, 0x0001, 0x0004, 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, - 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0004 -}; - -// Athonite 3 4 Voices -const uint16_t PROGMEM melody_builtin_athonite_3_4_voices[] = { - 0x0002, 0x0001, 0x0000, 0x0000, 0x0002, 0x0001, 0x0000, 0x0000, - 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0001, 0x0000, 0x0001, 0x0002, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0001, 0x0000, 0x0001, 0x0002, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, - 0x0002, 0x0001, 0x0000, 0x0005, 0x0002, 0x0001, 0x0000, 0x0005, - 0x0002, 0x0001, 0x0000, 0x0005, 0x0002, 0x0001, 0x0002, 0x0005, - 0x0002, 0x0001, 0x0008, 0x0005, 0x0002, 0x0001, 0x0000, 0x0005, - 0x0002, 0x0001, 0x0000, 0x0005, 0x0002, 0x0001, 0x0002, 0x0005, - 0x0002, 0x0001, 0x0009, 0x0002, 0x0001, 0x0005, 0x0002, 0x0001, - 0x000A, 0x0002, 0x0001, 0x0006, 0x0002, 0x0001, 0x0009, 0x0002, - 0x0001, 0x0005, 0x0002, 0x0001, 0x000A, 0x0002, 0x0001, 0x0006, - 0x0002, 0x0001, 0x0009 -}; - -// Athonite 4 8 Voices -const uint16_t PROGMEM melody_builtin_athonite_4_8_voices[] = { - 0x0002, 0x0001, 0x0000, 0x0000, 0x0002, 0x0001, 0x0000, 0x0000, - 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0001, 0x0000, 0x0001, 0x0002, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0001, 0x0000, 0x0001, 0x0002, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, - 0x0002, 0x0001, 0x0000, 0x0005, 0x0002, 0x0001, 0x0000, 0x0005, - 0x0002, 0x0001, 0x0000, 0x0005, 0x0002, 0x0001, 0x0002, 0x0005, - 0x0002, 0x0001, 0x0008, 0x0005, 0x0002, 0x0001, 0x0000, 0x0005, - 0x0002, 0x0001, 0x0000, 0x0005, 0x0002, 0x0001, 0x0002, 0x0005, - 0x0002, 0x0001, 0x0009, 0x0002, 0x0001, 0x0011, 0x0002, 0x0001, - 0x0022, 0x0002, 0x0001, 0x0081, 0x0002, 0x0001, 0x000A, 0x0002, - 0x0001, 0x0041, 0x0002, 0x0001, 0x0012, 0x0002, 0x0001, 0x0021, - 0x0002, 0x0001, 0x0082, 0x0002, 0x0001, 0x0009, 0x0002, 0x0001, - 0x0042, 0x0002, 0x0001, 0x0011, 0x0002, 0x0001, 0x0022, 0x0002, - 0x0001, 0x0081, 0x0002, 0x0001, 0x000A, 0x0002, 0x0001, 0x0041, - 0x0002, 0x0001, 0x0000, 0x0005, 0x0002, 0x0001, 0x0000, 0x0005, - 0x0002, 0x0001, 0x0002, 0x0005, 0x0002, 0x0001, 0x0000, 0x0000, - 0x0000 -}; - -// Onebyone 2 3 Voices -const uint16_t PROGMEM melody_builtin_onebyone_2_3_voices[] = { - 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, - 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, - 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, - 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, - 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, 0x0002, 0x0001, 0x0004, - 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, 0x0002, 0x0001, 0x0004, - 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, 0x0002, 0x0001, 0x0004, - 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, 0x0002, 0x0001, 0x0004, - 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, 0x0002, 0x0001, 0x0004, - 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, 0x0002, 0x0001, 0x0004, - 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, - 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002 -}; - -// Onebyone 4 8 Voices -const uint16_t PROGMEM melody_builtin_onebyone_4_8_voices[] = { - 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, - 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, - 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, - 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, - 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, 0x0002, 0x0001, 0x0004, - 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, 0x0002, 0x0001, 0x0004, - 0x0002, 0x0004, 0x0008, 0x0004, 0x0002, 0x0011, 0x0002, 0x0004, - 0x0008, 0x0004, 0x0002, 0x0021, 0x0002, 0x0004, 0x0008, 0x0004, - 0x0002, 0x0041, 0x0002, 0x0004, 0x0008, 0x0004, 0x0002, 0x0081, - 0x0002, 0x0004, 0x0008, 0x0004, 0x0002, 0x0041, 0x0002, 0x0004, - 0x0008, 0x0004, 0x0002, 0x0021, 0x0002, 0x0004, 0x0008, 0x0004, - 0x0002, 0x0041, 0x0002, 0x0004, 0x0008, 0x0004, 0x0002, 0x0081, - 0x0002, 0x0004, 0x0008, 0x0004, 0x0002, 0x0041, 0x0002, 0x0004, - 0x0008, 0x0004, 0x0002, 0x0021, 0x0002, 0x0004, 0x0008, 0x0004, - 0x0002, 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, 0x0002, 0x0001, - 0x0004, 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, 0x0002, 0x0001, - 0x0004, 0x0001, 0x0002, 0x0001, 0x0004, 0x0001, 0x0002, 0x0001, - 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, - 0x0002, 0x0001, 0x0000 -}; - -// Festive 1Voice -const uint16_t PROGMEM melody_builtin_festive_1voice[] = { - 0x0001, 0x0001, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, - 0x0000, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0000, 0x0001, - 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0001, 0x0000 -}; - -// Festive 4Voices -const uint16_t PROGMEM melody_builtin_festive_4voices[] = { - 0x0001, 0x0002, 0x0004, 0x0009, 0x0002, 0x0001, 0x0004, 0x0009 -}; - -// Festive 5Voices -const uint16_t PROGMEM melody_builtin_festive_5voices[] = { - 0x0001, 0x0002, 0x0004, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, - 0x0008, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0004, 0x0002, - 0x0001, 0x0002, 0x0001, 0x0002, 0x0010, 0x0002, 0x0001, 0x0002 -}; - -// Festive 5Voice Alternative -const uint16_t PROGMEM melody_builtin_festive_5voice_alternative[] = { - 0x0004, 0x0002, 0x0008, 0x0001, 0x0004, 0x0004, 0x0002, 0x0008, - 0x0001, 0x0010, 0x0004, 0x0002, 0x0008, 0x0001, 0x0004, 0x0004, - 0x0002, 0x0008, 0x0001, 0x0011, 0x0004, 0x0002, 0x0008, 0x0001, - 0x0004, 0x0004, 0x0002, 0x0008, 0x0001, 0x0011, 0x0004, 0x0002, - 0x0008, 0x0001, 0x0005, 0x0004, 0x0002, 0x0008, 0x0001, 0x0011, - 0x0004, 0x0002, 0x0008, 0x0001, 0x0005, 0x0004, 0x0002, 0x0008, - 0x0001, 0x0011, 0x0004, 0x0002, 0x0008, 0x0001, 0x0004, 0x0004, - 0x0002, 0x0008, 0x0001, 0x0010, 0x0004, 0x0002, 0x0008, 0x0001, - 0x0004, 0x0004, 0x0002, 0x0008, 0x0001, 0x0010 -}; - -// Festive 6Voices -const uint16_t PROGMEM melody_builtin_festive_6voices[] = { - 0x0001, 0x0002, 0x0004, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, - 0x0008, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0004, 0x0002, - 0x0001, 0x0002, 0x0001, 0x0002, 0x0010, 0x0002, 0x0001, 0x0002, - 0x0001, 0x0002, 0x0009, 0x0002, 0x0001, 0x0002, 0x0011, 0x0002, - 0x0001, 0x0002, 0x0005, 0x0002, 0x0001, 0x0002, 0x0021, 0x0002, - 0x0001, 0x0002, 0x0009, 0x0002, 0x0001, 0x0002, 0x0011, 0x0002, - 0x0001, 0x0002, 0x0005, 0x0002, 0x0001, 0x0002, 0x0021, 0x0002, - 0x0001, 0x0002, 0x0009, 0x0002, 0x0001, 0x0002, 0x0011, 0x0002, - 0x0001, 0x0002, 0x0005, 0x0002, 0x0001, 0x0002, 0x0021, 0x0002, - 0x0001, 0x0002 -}; - -// Festive 8Voices -const uint16_t PROGMEM melody_builtin_festive_8voices[] = { - 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080 -}; - -// Ormilia -const uint16_t PROGMEM melody_builtin_ormilia[] = { - 0x0002, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, - 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, - 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0001, 0x0000, 0x0001, 0x0002, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, 0x0002, 0x0001, - 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0009, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, - 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0005, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, - 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, - 0x0002, 0x0009, 0x0000, 0x0001, 0x0002, 0x0005, 0x0000, 0x0001, - 0x0002, 0x0009, 0x0000, 0x0001, 0x0002, 0x0005, 0x0000, 0x0001, - 0x0002, 0x0011, 0x0002, 0x0001, 0x0002, 0x0021, 0x0002, 0x0001, - 0x0002, 0x0011, 0x0002, 0x0001, 0x0002, 0x0021, 0x0002, 0x0041, - 0x0002, 0x0081, 0x0002, 0x0009, 0x0002, 0x0041, 0x0002, 0x0081, - 0x0002, 0x0009, 0x0002, 0x0041, 0x0002, 0x0081, 0x0002, 0x0005, - 0x0002, 0x0001, 0x0000 -}; - -// ======================================== -// Melody Information Structure -// ======================================== - -struct MelodyInfo { - const char* display_name; - const char* id; - const uint16_t* data; - size_t length; -}; - -// ======================================== -// Melody Library -// ======================================== - -const MelodyInfo MELODY_LIBRARY[] = { - { - "Doxology Traditional", - "builtin_doxology_traditional", - melody_builtin_doxology_traditional, - sizeof(melody_builtin_doxology_traditional) / sizeof(uint16_t) - }, - { - "Doxology Alternative", - "builtin_doxology_alternative", - melody_builtin_doxology_alternative, - sizeof(melody_builtin_doxology_alternative) / sizeof(uint16_t) - }, - { - "Doxology Festive", - "builtin_doxology_festive", - melody_builtin_doxology_festive, - sizeof(melody_builtin_doxology_festive) / sizeof(uint16_t) - }, - { - "Vesper Traditional", - "builtin_vesper_traditional", - melody_builtin_vesper_traditional, - sizeof(melody_builtin_vesper_traditional) / sizeof(uint16_t) - }, - { - "Vesper Alternative", - "builtin_vesper_alternative", - melody_builtin_vesper_alternative, - sizeof(melody_builtin_vesper_alternative) / sizeof(uint16_t) - }, - { - "Catehetical", - "builtin_catehetical", - melody_builtin_catehetical, - sizeof(melody_builtin_catehetical) / sizeof(uint16_t) - }, - { - "Orthros Traditional", - "builtin_orthros_traditional", - melody_builtin_orthros_traditional, - sizeof(melody_builtin_orthros_traditional) / sizeof(uint16_t) - }, - { - "Orthros Alternative", - "builtin_orthros_alternative", - melody_builtin_orthros_alternative, - sizeof(melody_builtin_orthros_alternative) / sizeof(uint16_t) - }, - { - "Mournfull Toll", - "builtin_mournfull_toll", - melody_builtin_mournfull_toll, - sizeof(melody_builtin_mournfull_toll) / sizeof(uint16_t) - }, - { - "Mournfull Toll Alternative", - "builtin_mournfull_toll_alternative", - melody_builtin_mournfull_toll_alternative, - sizeof(melody_builtin_mournfull_toll_alternative) / sizeof(uint16_t) - }, - { - "Mournfull Toll Meg Par", - "builtin_mournfull_toll_meg_par", - melody_builtin_mournfull_toll_meg_par, - sizeof(melody_builtin_mournfull_toll_meg_par) / sizeof(uint16_t) - }, - { - "Sematron", - "builtin_sematron", - melody_builtin_sematron, - sizeof(melody_builtin_sematron) / sizeof(uint16_t) - }, - { - "Sematron Alternative", - "builtin_sematron_alternative", - melody_builtin_sematron_alternative, - sizeof(melody_builtin_sematron_alternative) / sizeof(uint16_t) - }, - { - "Athonite 1 2 Voices", - "builtin_athonite_1_2_voices", - melody_builtin_athonite_1_2_voices, - sizeof(melody_builtin_athonite_1_2_voices) / sizeof(uint16_t) - }, - { - "Athonite 3 Voices", - "builtin_athonite_3_voices", - melody_builtin_athonite_3_voices, - sizeof(melody_builtin_athonite_3_voices) / sizeof(uint16_t) - }, - { - "Athonite 3 4 Voices", - "builtin_athonite_3_4_voices", - melody_builtin_athonite_3_4_voices, - sizeof(melody_builtin_athonite_3_4_voices) / sizeof(uint16_t) - }, - { - "Athonite 4 8 Voices", - "builtin_athonite_4_8_voices", - melody_builtin_athonite_4_8_voices, - sizeof(melody_builtin_athonite_4_8_voices) / sizeof(uint16_t) - }, - { - "Onebyone 2 3 Voices", - "builtin_onebyone_2_3_voices", - melody_builtin_onebyone_2_3_voices, - sizeof(melody_builtin_onebyone_2_3_voices) / sizeof(uint16_t) - }, - { - "Onebyone 4 8 Voices", - "builtin_onebyone_4_8_voices", - melody_builtin_onebyone_4_8_voices, - sizeof(melody_builtin_onebyone_4_8_voices) / sizeof(uint16_t) - }, - { - "Festive 1Voice", - "builtin_festive_1voice", - melody_builtin_festive_1voice, - sizeof(melody_builtin_festive_1voice) / sizeof(uint16_t) - }, - { - "Festive 4Voices", - "builtin_festive_4voices", - melody_builtin_festive_4voices, - sizeof(melody_builtin_festive_4voices) / sizeof(uint16_t) - }, - { - "Festive 5Voices", - "builtin_festive_5voices", - melody_builtin_festive_5voices, - sizeof(melody_builtin_festive_5voices) / sizeof(uint16_t) - }, - { - "Festive 5Voice Alternative", - "builtin_festive_5voice_alternative", - melody_builtin_festive_5voice_alternative, - sizeof(melody_builtin_festive_5voice_alternative) / sizeof(uint16_t) - }, - { - "Festive 6Voices", - "builtin_festive_6voices", - melody_builtin_festive_6voices, - sizeof(melody_builtin_festive_6voices) / sizeof(uint16_t) - }, - { - "Festive 8Voices", - "builtin_festive_8voices", - melody_builtin_festive_8voices, - sizeof(melody_builtin_festive_8voices) / sizeof(uint16_t) - }, - { - "Ormilia", - "builtin_ormilia", - melody_builtin_ormilia, - sizeof(melody_builtin_ormilia) / sizeof(uint16_t) - } -}; - -const size_t MELODY_LIBRARY_SIZE = 26; - -#endif // MELODIES_H diff --git a/SecondaryApps/SpeedCalc/melodies_in_binary/1N_Esperinos_Adam.bsm b/SecondaryApps/SpeedCalc/melodies_in_binary/1N_Esperinos_Adam.bsm deleted file mode 100644 index bc77804b6479a5b7142f0bef3b7c039b3d0583a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64 acmZQzWME)`VIULE28n?HOb#0jlm-9+_W%w6 diff --git a/SecondaryApps/SpeedCalc/melodies_in_binary/3N_MiaMia.bsm b/SecondaryApps/SpeedCalc/melodies_in_binary/3N_MiaMia.bsm deleted file mode 100644 index 8426808b9b4770e7c3c68dcc7766fb1458922b4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 acmZQzWME*xkC}k-gfI(K4XtRL_5%Pi*Z`RT diff --git a/SecondaryApps/SpeedCalc/melodies_in_txt/melodies.txt b/SecondaryApps/SpeedCalc/melodies_in_txt/melodies.txt deleted file mode 100644 index 6f5f749..0000000 --- a/SecondaryApps/SpeedCalc/melodies_in_txt/melodies.txt +++ /dev/null @@ -1,3 +0,0 @@ -Esperinos-Adamn-1k [min 1426 / mid 572 / max 194]: 1,0,1,0,1,0,0,0,1,0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0 -Esperinos-Eortastikos-1k: 1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0 -Orthros-1k [min 552 / mid 1402 / max 2229]: 1,0,1,0,1,1,0 diff --git a/SecondaryApps/SpeedCalc/requirements.txt b/SecondaryApps/SpeedCalc/requirements.txt deleted file mode 100644 index 7941d67..0000000 --- a/SecondaryApps/SpeedCalc/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -PyQt6>=6.4.0 -numpy>=1.21.0 -sounddevice>=0.4.6 diff --git a/SecondaryApps/SpeedCalc/speedcalc.py b/SecondaryApps/SpeedCalc/speedcalc.py deleted file mode 100644 index a3d79bf..0000000 --- a/SecondaryApps/SpeedCalc/speedcalc.py +++ /dev/null @@ -1,1067 +0,0 @@ -#!/usr/bin/env python3 -""" -SpeedCalc - Bell Melody Speed Calculator -A tool to find optimal MIN/MID/MAX playback speeds for bell melodies. -""" - -import sys -import re -import struct -import threading -import time -from pathlib import Path -from dataclasses import dataclass -from typing import List, Dict, Optional, Tuple - -from PyQt6.QtWidgets import ( - QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, - QListWidget, QListWidgetItem, QPushButton, QSlider, QLabel, - QFileDialog, QGroupBox, QFrame, QMessageBox, QStyleFactory -) -from PyQt6.QtCore import Qt, pyqtSignal, QObject -from PyQt6.QtGui import QColor, QPalette - -# Use pygame.mixer for low-latency audio playback -import numpy as np -import pygame - - -# ============================================================================ -# Custom Widgets -# ============================================================================ - -class ClickableSlider(QSlider): - """A slider that jumps to the clicked position instead of stepping.""" - - def mousePressEvent(self, event): - if event.button() == Qt.MouseButton.LeftButton: - # Calculate the value based on click position - if self.orientation() == Qt.Orientation.Horizontal: - value = self.minimum() + (self.maximum() - self.minimum()) * event.position().x() / self.width() - else: - value = self.minimum() + (self.maximum() - self.minimum()) * (self.height() - event.position().y()) / self.height() - self.setValue(int(value)) - event.accept() - super().mousePressEvent(event) - - -# ============================================================================ -# Data Classes -# ============================================================================ - -@dataclass -class Melody: - """Represents a single melody with its steps and speed settings.""" - name: str - steps: List[int] # Each step is a 16-bit value (bit flags for bells) - min_speed: Optional[int] = None # ms (slowest) - mid_speed: Optional[int] = None # ms (normal) - max_speed: Optional[int] = None # ms (fastest) - source_line: int = 0 # Line number in source file (for editing) - - def get_bells_used(self) -> set: - """Return set of bell numbers (1-16) used in this melody.""" - bells = set() - for step in self.steps: - for bit in range(16): - if step & (1 << bit): - bells.add(bit + 1) - return bells - - -# ============================================================================ -# Audio Engine -# ============================================================================ - -class AudioEngine: - """Handles audio generation and playback for bells using pygame.mixer.""" - - # Bell 1 = highest pitch, Bell 16 = lowest pitch - BASE_FREQ = 880 # A5 for bell 1 (highest) - SAMPLE_RATE = 44100 - - def __init__(self): - # Initialize pygame mixer with low latency settings - pygame.mixer.pre_init( - frequency=self.SAMPLE_RATE, - size=-16, # 16-bit signed - channels=1, # Mono - buffer=1024 # Reasonable buffer for low latency - ) - pygame.mixer.init() - - self.bell_frequencies = self._generate_bell_frequencies() - self._current_sound: Optional[pygame.mixer.Sound] = None - - def _generate_bell_frequencies(self) -> Dict[int, float]: - """Generate frequencies for bells 1-16 (1=highest, 16=lowest).""" - frequencies = {} - for bell in range(1, 17): - # Bell 1 is highest, so we subtract semitones as bell number increases - semitones_down = (bell - 1) * 2 # 2 semitones (whole step) per bell - freq = self.BASE_FREQ * (2 ** (-semitones_down / 12)) - frequencies[bell] = freq - return frequencies - - def _generate_sound(self, bells: List[int], duration_ms: int) -> pygame.mixer.Sound: - """Generate a pygame Sound object for the given bells.""" - num_samples = int(self.SAMPLE_RATE * duration_ms / 1000) - num_samples = max(num_samples, 100) # Minimum samples - - t = np.linspace(0, duration_ms / 1000, num_samples, dtype=np.float64) - - signal = np.zeros(num_samples, dtype=np.float64) - for bell in bells: - if bell in self.bell_frequencies: - freq = self.bell_frequencies[bell] - signal += np.sin(2 * np.pi * freq * t) - - if len(bells) > 0: - signal = signal / len(bells) - - # Normalize and convert to 16-bit signed integers - signal = signal * 0.8 * 32767 - - # Quick fade in/out to avoid clicks (2ms each) - fade_samples = min(int(self.SAMPLE_RATE * 0.002), num_samples // 4) - if fade_samples > 0: - fade_in = np.linspace(0, 1, fade_samples) - fade_out = np.linspace(1, 0, fade_samples) - signal[:fade_samples] *= fade_in - signal[-fade_samples:] *= fade_out - - # Convert to 16-bit integer array and create Sound from raw bytes - signal = signal.astype(np.int16) - sound = pygame.mixer.Sound(buffer=signal.tobytes()) - return sound - - def play_tone_blocking(self, bells: List[int], duration_ms: int): - """Play a tone for the given bells and wait for it to complete.""" - if duration_ms <= 0 or not bells: - # For silence, just sleep - if duration_ms > 0: - time.sleep(duration_ms / 1000.0) - return - - try: - # Keep a reference to the sound to prevent garbage collection - self._current_sound = self._generate_sound(bells, duration_ms) - self._current_sound.play() - - # Wait for the duration (more reliable than polling get_busy) - time.sleep(duration_ms / 1000.0) - except Exception as e: - print(f"Audio error: {e}") - - def stop(self): - """Stop any currently playing audio.""" - try: - pygame.mixer.stop() - except: - pass - - def cleanup(self): - """Clean up audio resources.""" - self.stop() - try: - pygame.mixer.quit() - except: - pass - - -# ============================================================================ -# File Parser -# ============================================================================ - -class MelodyParser: - """Parses melody files (both .txt and .bsm formats).""" - - # Regex to match speed settings in melody name: [min XXX / mid XXX / max XXX] - # Note: We avoid colons in the format because the parser splits on ':' first - SPEED_PATTERN = re.compile( - r'\[\s*min\s+(\d+)\s*/\s*mid\s+(\d+)\s*/\s*max\s+(\d+)\s*\]' - ) - - @staticmethod - def parse_txt_file(filepath: str) -> Tuple[List[Melody], List[str]]: - """ - Parse a .txt file containing multiple melodies. - Returns (list of Melody objects, original lines for editing). - """ - melodies = [] - original_lines = [] - - with open(filepath, 'r', encoding='utf-8') as f: - original_lines = f.readlines() - - for line_num, line in enumerate(original_lines): - line_stripped = line.strip() - - if not line_stripped or line_stripped.startswith('#'): - continue - - if ':' not in line_stripped: - continue - - # Split name and steps - parts = line_stripped.split(':', 1) - name_part = parts[0].strip() - steps_str = parts[1].strip() - - # Check for existing speed settings in name - min_speed = mid_speed = max_speed = None - speed_match = MelodyParser.SPEED_PATTERN.search(name_part) - if speed_match: - min_speed = int(speed_match.group(1)) - mid_speed = int(speed_match.group(2)) - max_speed = int(speed_match.group(3)) - # Remove speed info from name for display - name = MelodyParser.SPEED_PATTERN.sub('', name_part).strip() - else: - name = name_part - - # Parse steps - steps = [] - for step_str in steps_str.split(','): - step_str = step_str.strip() - if not step_str: - continue - - if '+' in step_str: - # Multiple bells: "2+8" -> bits 1 and 7 - value = 0 - for bell_str in step_str.split('+'): - try: - bell_num = int(bell_str.strip()) - if 1 <= bell_num <= 16: - value |= (1 << (bell_num - 1)) - except ValueError: - pass - steps.append(value) - else: - # Single bell or zero - try: - bell_num = int(step_str) - if bell_num == 0: - steps.append(0) - elif 1 <= bell_num <= 16: - steps.append(1 << (bell_num - 1)) - else: - steps.append(0) - except ValueError: - steps.append(0) - - if steps: - melody = Melody( - name=name, - steps=steps, - min_speed=min_speed, - mid_speed=mid_speed, - max_speed=max_speed, - source_line=line_num - ) - melodies.append(melody) - - return melodies, original_lines - - @staticmethod - def parse_bsm_file(filepath: str) -> Melody: - """Parse a binary .bsm file.""" - name = Path(filepath).stem - steps = [] - - with open(filepath, 'rb') as f: - data = f.read() - - # Each step is 2 bytes, big-endian - for i in range(0, len(data), 2): - if i + 1 < len(data): - value = struct.unpack('>H', data[i:i+2])[0] - steps.append(value) - - return Melody(name=name, steps=steps) - - @staticmethod - def save_txt_file(filepath: str, melodies: List[Melody], original_lines: List[str]): - """Save melodies back to .txt file, preserving format and updating speeds.""" - new_lines = original_lines.copy() - - for melody in melodies: - if melody.source_line < len(new_lines): - line = new_lines[melody.source_line] - - if ':' in line: - parts = line.split(':', 1) - name_part = parts[0] - steps_part = parts[1] - - # Remove existing speed info if any - name_clean = MelodyParser.SPEED_PATTERN.sub('', name_part).strip() - - # Add new speed info if all values are set - # Note: We use spaces instead of colons to avoid breaking the parser - # (since the parser splits on ':' to separate name from steps) - if melody.min_speed and melody.mid_speed and melody.max_speed: - speed_str = f" [min {melody.min_speed} / mid {melody.mid_speed} / max {melody.max_speed}]" - new_name = name_clean + speed_str - else: - new_name = name_clean - - new_lines[melody.source_line] = f"{new_name}:{steps_part}" - - with open(filepath, 'w', encoding='utf-8') as f: - f.writelines(new_lines) - - -# ============================================================================ -# Playback Controller -# ============================================================================ - -class PlaybackSignals(QObject): - """Signals for playback thread communication.""" - step_changed = pyqtSignal(int) - playback_finished = pyqtSignal() - beat_truncated = pyqtSignal(int) # Emits actual beat duration when truncated - - -class PlaybackController: - """Controls melody playback.""" - - def __init__(self, audio_engine: AudioEngine): - self.audio = audio_engine - self.signals = PlaybackSignals() - self.is_playing = False - self.is_looping = False - self.current_step = 0 - self.melody: Optional[Melody] = None - self.step_delay_ms = 500 - self.beat_duration_ms = 100 - self._playback_thread: Optional[threading.Thread] = None - self._stop_event = threading.Event() - - def set_melody(self, melody: Melody): - """Set the melody to play.""" - self.stop() - self.melody = melody - self.current_step = 0 - - def set_speed(self, delay_ms: int): - """Set the delay between steps in milliseconds.""" - self.step_delay_ms = delay_ms - - def set_beat_duration(self, duration_ms: int): - """Set the duration of each beat/tone.""" - self.beat_duration_ms = duration_ms - - def play(self, loop: bool = False): - """Start playback.""" - if not self.melody or not self.melody.steps: - return - - self.stop() - self.is_playing = True - self.is_looping = loop - self._stop_event.clear() - - self._playback_thread = threading.Thread(target=self._playback_loop, daemon=True) - self._playback_thread.start() - - def stop(self): - """Stop playback.""" - self.is_playing = False - self._stop_event.set() - self.audio.stop() - - if self._playback_thread and self._playback_thread.is_alive(): - self._playback_thread.join(timeout=0.5) - self._playback_thread = None - - def _playback_loop(self): - """Main playback loop (runs in separate thread).""" - import time - - BUFFER_MS = 20 # Gap between tones to prevent blending - - while self.is_playing and self.melody: - if self._stop_event.is_set(): - break - - # Get current step - step_value = self.melody.steps[self.current_step] - - # Convert step value to list of bell numbers - bells = [] - for bit in range(16): - if step_value & (1 << bit): - bells.append(bit + 1) - - # Signal UI about current step - self.signals.step_changed.emit(self.current_step) - - # Calculate actual beat duration (truncate if needed) - max_beat_ms = max(BUFFER_MS, self.step_delay_ms - BUFFER_MS) - actual_beat_ms = min(self.beat_duration_ms, max_beat_ms) - is_truncated = actual_beat_ms < self.beat_duration_ms - - # Signal if truncated (only on first step to avoid spam) - if is_truncated and self.current_step == 0: - self.signals.beat_truncated.emit(actual_beat_ms) - - # Record start time for accurate timing - step_start = time.perf_counter() - - # Play the tone (blocking - waits for tone to finish) - self.audio.play_tone_blocking(bells, actual_beat_ms) - - if self._stop_event.is_set(): - break - - # Calculate remaining wait time after tone played - elapsed_ms = (time.perf_counter() - step_start) * 1000 - remaining_wait_ms = self.step_delay_ms - elapsed_ms - - # Wait for remaining time in small increments for responsive stopping - if remaining_wait_ms > 0: - wait_end = time.perf_counter() + (remaining_wait_ms / 1000.0) - while time.perf_counter() < wait_end and not self._stop_event.is_set(): - time.sleep(0.005) # 5ms increments - - if self._stop_event.is_set(): - break - - # Move to next step - self.current_step += 1 - if self.current_step >= len(self.melody.steps): - if self.is_looping: - self.current_step = 0 - else: - break - - self.is_playing = False - self.signals.playback_finished.emit() - - -# ============================================================================ -# Main Window -# ============================================================================ - -class SpeedCalcWindow(QMainWindow): - """Main application window.""" - - def __init__(self): - super().__init__() - - self.audio = AudioEngine() - self.playback = PlaybackController(self.audio) - self.melodies: List[Melody] = [] - self.original_lines: List[str] = [] - self.current_file: Optional[str] = None - self.current_melody: Optional[Melody] = None - - self._setup_ui() - self._connect_signals() - - # Enable drag and drop - self.setAcceptDrops(True) - - def dragEnterEvent(self, event): - """Handle drag enter - accept if it contains file URLs.""" - if event.mimeData().hasUrls(): - # Check if any of the files are .txt or .bsm - for url in event.mimeData().urls(): - filepath = url.toLocalFile() - if filepath.lower().endswith(('.txt', '.bsm')): - event.acceptProposedAction() - return - event.ignore() - - def dropEvent(self, event): - """Handle file drop.""" - txt_files = [] - bsm_files = [] - - for url in event.mimeData().urls(): - filepath = url.toLocalFile() - if filepath.lower().endswith('.txt'): - txt_files.append(filepath) - elif filepath.lower().endswith('.bsm'): - bsm_files.append(filepath) - - # Load txt file first (only the first one if multiple) - if txt_files: - self._load_txt_file_path(txt_files[0]) - - # Add any bsm files - if bsm_files: - self._add_bsm_files(bsm_files) - - event.acceptProposedAction() - - def _setup_ui(self): - """Set up the user interface.""" - self.setWindowTitle("SpeedCalc - Bell Melody Speed Calculator") - self.setMinimumSize(900, 600) - - # Main widget and layout - main_widget = QWidget() - self.setCentralWidget(main_widget) - main_layout = QHBoxLayout(main_widget) - main_layout.setSpacing(15) - main_layout.setContentsMargins(15, 15, 15, 15) - - # Left panel - Melody list - left_panel = self._create_melody_list_panel() - main_layout.addWidget(left_panel, stretch=1) - - # Right panel - Controls - right_panel = self._create_controls_panel() - main_layout.addWidget(right_panel, stretch=2) - - def _create_melody_list_panel(self) -> QWidget: - """Create the melody list panel.""" - panel = QGroupBox("Melodies") - layout = QVBoxLayout(panel) - - # File buttons - btn_layout = QHBoxLayout() - - self.btn_load_txt = QPushButton("Load .txt File") - self.btn_load_txt.setMinimumHeight(35) - btn_layout.addWidget(self.btn_load_txt) - - self.btn_add_bsm = QPushButton("Add .bsm Files") - self.btn_add_bsm.setMinimumHeight(35) - btn_layout.addWidget(self.btn_add_bsm) - - layout.addLayout(btn_layout) - - # Melody list - self.melody_list = QListWidget() - self.melody_list.setMinimumWidth(250) - self.melody_list.setAlternatingRowColors(True) - layout.addWidget(self.melody_list) - - # Info label - self.lbl_melody_info = QLabel("No melody loaded") - self.lbl_melody_info.setWordWrap(True) - self.lbl_melody_info.setStyleSheet("color: #666; padding: 5px;") - layout.addWidget(self.lbl_melody_info) - - return panel - - def _create_controls_panel(self) -> QWidget: - """Create the controls panel.""" - panel = QWidget() - layout = QVBoxLayout(panel) - layout.setSpacing(15) - - # Playback controls - playback_group = QGroupBox("Playback") - playback_layout = QVBoxLayout(playback_group) - - # Play buttons - btn_row = QHBoxLayout() - - self.btn_play = QPushButton("▶ Play") - self.btn_play.setMinimumHeight(45) - self.btn_play.setEnabled(False) - btn_row.addWidget(self.btn_play) - - self.btn_loop = QPushButton("🔁 Loop") - self.btn_loop.setMinimumHeight(45) - self.btn_loop.setCheckable(True) - self.btn_loop.setEnabled(False) - btn_row.addWidget(self.btn_loop) - - self.btn_stop = QPushButton("⏹ Stop") - self.btn_stop.setMinimumHeight(45) - self.btn_stop.setEnabled(False) - btn_row.addWidget(self.btn_stop) - - playback_layout.addLayout(btn_row) - - # Progress label - self.lbl_progress = QLabel("Step: - / -") - self.lbl_progress.setAlignment(Qt.AlignmentFlag.AlignCenter) - self.lbl_progress.setStyleSheet("font-size: 14px; padding: 5px;") - playback_layout.addWidget(self.lbl_progress) - - layout.addWidget(playback_group) - - # Speed control - speed_group = QGroupBox("Step Delay (Speed)") - speed_layout = QVBoxLayout(speed_group) - - self.lbl_speed = QLabel("500 ms") - self.lbl_speed.setAlignment(Qt.AlignmentFlag.AlignCenter) - self.lbl_speed.setStyleSheet("font-size: 24px; font-weight: bold; color: #2196F3;") - speed_layout.addWidget(self.lbl_speed) - - self.slider_speed = ClickableSlider(Qt.Orientation.Horizontal) - self.slider_speed.setMinimum(50) - self.slider_speed.setMaximum(3000) - self.slider_speed.setValue(500) - self.slider_speed.setTickPosition(ClickableSlider.TickPosition.TicksBelow) - self.slider_speed.setTickInterval(250) - speed_layout.addWidget(self.slider_speed) - - speed_labels = QHBoxLayout() - speed_labels.addWidget(QLabel("50ms (Fast)")) - speed_labels.addStretch() - speed_labels.addWidget(QLabel("3000ms (Slow)")) - speed_layout.addLayout(speed_labels) - - layout.addWidget(speed_group) - - # Beat duration control - beat_group = QGroupBox("Beat Duration") - beat_layout = QVBoxLayout(beat_group) - - self.lbl_beat = QLabel("100 ms") - self.lbl_beat.setAlignment(Qt.AlignmentFlag.AlignCenter) - self.lbl_beat.setStyleSheet("font-size: 18px; font-weight: bold; color: #4CAF50;") - beat_layout.addWidget(self.lbl_beat) - - self.slider_beat = ClickableSlider(Qt.Orientation.Horizontal) - self.slider_beat.setMinimum(20) - self.slider_beat.setMaximum(500) - self.slider_beat.setValue(100) - self.slider_beat.setTickPosition(ClickableSlider.TickPosition.TicksBelow) - self.slider_beat.setTickInterval(50) - beat_layout.addWidget(self.slider_beat) - - beat_labels = QHBoxLayout() - beat_labels.addWidget(QLabel("20ms (Short)")) - beat_labels.addStretch() - beat_labels.addWidget(QLabel("500ms (Long)")) - beat_layout.addLayout(beat_labels) - - # Truncation warning label - use fixed height to prevent layout shift - self.lbl_truncated = QLabel("") - self.lbl_truncated.setAlignment(Qt.AlignmentFlag.AlignCenter) - self.lbl_truncated.setStyleSheet("color: #f44336; font-weight: bold; padding: 2px;") - self.lbl_truncated.setFixedHeight(20) # Reserve space even when empty - beat_layout.addWidget(self.lbl_truncated) - - layout.addWidget(beat_group) - - # Speed capture buttons - capture_group = QGroupBox("Capture Speed Settings") - capture_layout = QVBoxLayout(capture_group) - - # Current values display - values_layout = QHBoxLayout() - - # MIN - min_frame = QFrame() - min_frame.setFrameStyle(QFrame.Shape.StyledPanel) - min_layout = QVBoxLayout(min_frame) - min_layout.addWidget(QLabel("MIN (Slowest)")) - self.lbl_min = QLabel("---") - self.lbl_min.setStyleSheet("font-size: 20px; font-weight: bold; color: #f44336;") - self.lbl_min.setAlignment(Qt.AlignmentFlag.AlignCenter) - min_layout.addWidget(self.lbl_min) - min_btn_layout = QHBoxLayout() - self.btn_set_min = QPushButton("Set") - self.btn_set_min.setEnabled(False) - self.btn_set_min.setToolTip("Load saved MIN value to slider") - min_btn_layout.addWidget(self.btn_set_min) - self.btn_save_min = QPushButton("Save") - self.btn_save_min.setEnabled(False) - self.btn_save_min.setToolTip("Save current slider value as MIN") - min_btn_layout.addWidget(self.btn_save_min) - min_layout.addLayout(min_btn_layout) - values_layout.addWidget(min_frame) - - # MID - mid_frame = QFrame() - mid_frame.setFrameStyle(QFrame.Shape.StyledPanel) - mid_layout = QVBoxLayout(mid_frame) - mid_layout.addWidget(QLabel("MID (Normal)")) - self.lbl_mid = QLabel("---") - self.lbl_mid.setStyleSheet("font-size: 20px; font-weight: bold; color: #ff9800;") - self.lbl_mid.setAlignment(Qt.AlignmentFlag.AlignCenter) - mid_layout.addWidget(self.lbl_mid) - mid_btn_layout = QHBoxLayout() - self.btn_set_mid = QPushButton("Set") - self.btn_set_mid.setEnabled(False) - self.btn_set_mid.setToolTip("Load saved MID value to slider") - mid_btn_layout.addWidget(self.btn_set_mid) - self.btn_save_mid = QPushButton("Save") - self.btn_save_mid.setEnabled(False) - self.btn_save_mid.setToolTip("Save current slider value as MID") - mid_btn_layout.addWidget(self.btn_save_mid) - mid_layout.addLayout(mid_btn_layout) - values_layout.addWidget(mid_frame) - - # MAX - max_frame = QFrame() - max_frame.setFrameStyle(QFrame.Shape.StyledPanel) - max_layout = QVBoxLayout(max_frame) - max_layout.addWidget(QLabel("MAX (Fastest)")) - self.lbl_max = QLabel("---") - self.lbl_max.setStyleSheet("font-size: 20px; font-weight: bold; color: #4CAF50;") - self.lbl_max.setAlignment(Qt.AlignmentFlag.AlignCenter) - max_layout.addWidget(self.lbl_max) - max_btn_layout = QHBoxLayout() - self.btn_set_max = QPushButton("Set") - self.btn_set_max.setEnabled(False) - self.btn_set_max.setToolTip("Load saved MAX value to slider") - max_btn_layout.addWidget(self.btn_set_max) - self.btn_save_max = QPushButton("Save") - self.btn_save_max.setEnabled(False) - self.btn_save_max.setToolTip("Save current slider value as MAX") - max_btn_layout.addWidget(self.btn_save_max) - max_layout.addLayout(max_btn_layout) - values_layout.addWidget(max_frame) - - capture_layout.addLayout(values_layout) - - # Clear and Save buttons - action_layout = QHBoxLayout() - - self.btn_clear = QPushButton("Clear Values") - self.btn_clear.setMinimumHeight(40) - self.btn_clear.setEnabled(False) - action_layout.addWidget(self.btn_clear) - - self.btn_save = QPushButton("Save to File") - self.btn_save.setMinimumHeight(40) - self.btn_save.setEnabled(False) - self.btn_save.setStyleSheet("font-weight: bold;") - action_layout.addWidget(self.btn_save) - - capture_layout.addLayout(action_layout) - - layout.addWidget(capture_group) - - # Add stretch at bottom - layout.addStretch() - - return panel - - def _connect_signals(self): - """Connect all signals and slots.""" - # File loading - self.btn_load_txt.clicked.connect(self._load_txt_file) - self.btn_add_bsm.clicked.connect(self._add_bsm_files_dialog) - - # Melody selection - self.melody_list.currentItemChanged.connect(self._on_melody_selected) - - # Playback controls - self.btn_play.clicked.connect(self._on_play) - self.btn_loop.clicked.connect(self._on_loop) - self.btn_stop.clicked.connect(self._on_stop) - - # Sliders - self.slider_speed.valueChanged.connect(self._on_speed_changed) - self.slider_beat.valueChanged.connect(self._on_beat_changed) - - # Capture buttons - Set loads saved value to slider, Save captures slider value - self.btn_set_min.clicked.connect(lambda: self._load_speed_to_slider('min')) - self.btn_set_mid.clicked.connect(lambda: self._load_speed_to_slider('mid')) - self.btn_set_max.clicked.connect(lambda: self._load_speed_to_slider('max')) - self.btn_save_min.clicked.connect(lambda: self._save_speed_value('min')) - self.btn_save_mid.clicked.connect(lambda: self._save_speed_value('mid')) - self.btn_save_max.clicked.connect(lambda: self._save_speed_value('max')) - self.btn_clear.clicked.connect(self._clear_values) - self.btn_save.clicked.connect(self._save_file) - - # Playback signals - self.playback.signals.step_changed.connect(self._on_step_changed) - self.playback.signals.playback_finished.connect(self._on_playback_finished) - self.playback.signals.beat_truncated.connect(self._on_beat_truncated) - - def _load_txt_file(self): - """Load a .txt melody file via dialog.""" - filepath, _ = QFileDialog.getOpenFileName( - self, - "Open Melody Text File", - "", - "Text Files (*.txt);;All Files (*)" - ) - - if filepath: - self._load_txt_file_path(filepath) - - def _load_txt_file_path(self, filepath: str): - """Load a .txt melody file from a path.""" - try: - self.melodies, self.original_lines = MelodyParser.parse_txt_file(filepath) - self.current_file = filepath - self._update_melody_list() - self.btn_save.setEnabled(True) - except Exception as e: - QMessageBox.critical(self, "Error", f"Failed to load file:\n{e}") - - def _add_bsm_files_dialog(self): - """Add .bsm binary files via dialog.""" - filepaths, _ = QFileDialog.getOpenFileNames( - self, - "Add Binary Melody Files", - "", - "BSM Files (*.bsm);;All Files (*)" - ) - - if filepaths: - self._add_bsm_files(filepaths) - - def _add_bsm_files(self, filepaths: List[str]): - """Add .bsm binary files to the melody list (appends, doesn't replace).""" - for filepath in filepaths: - try: - melody = MelodyParser.parse_bsm_file(filepath) - self.melodies.append(melody) - except Exception as e: - QMessageBox.warning(self, "Warning", f"Failed to load {filepath}:\n{e}") - - self._update_melody_list() - - def _update_melody_list(self): - """Update the melody list widget.""" - self.melody_list.clear() - - for melody in self.melodies: - # Show checkmark if speeds are set - if melody.min_speed and melody.mid_speed and melody.max_speed: - prefix = "✓ " - else: - prefix = " " - - item = QListWidgetItem(f"{prefix}{melody.name}") - item.setData(Qt.ItemDataRole.UserRole, melody) - self.melody_list.addItem(item) - - if self.melodies: - self.melody_list.setCurrentRow(0) - - def _on_melody_selected(self, current: QListWidgetItem, previous: QListWidgetItem): - """Handle melody selection change.""" - if not current: - return - - self.playback.stop() - melody = current.data(Qt.ItemDataRole.UserRole) - self.current_melody = melody - self.playback.set_melody(melody) - - # Update info - bells = melody.get_bells_used() - bells_str = ', '.join(map(str, sorted(bells))) if bells else 'none' - self.lbl_melody_info.setText( - f"Steps: {len(melody.steps)}\n" - f"Bells used: {bells_str}" - ) - - # Update speed displays - self.lbl_min.setText(f"{melody.min_speed} ms" if melody.min_speed else "---") - self.lbl_mid.setText(f"{melody.mid_speed} ms" if melody.mid_speed else "---") - self.lbl_max.setText(f"{melody.max_speed} ms" if melody.max_speed else "---") - - # If melody has saved speeds, set the slider to the mid speed (or min if no mid) - if melody.mid_speed: - self.slider_speed.setValue(melody.mid_speed) - elif melody.min_speed: - self.slider_speed.setValue(melody.min_speed) - elif melody.max_speed: - self.slider_speed.setValue(melody.max_speed) - - # Enable controls - self.btn_play.setEnabled(True) - self.btn_loop.setEnabled(True) - # Set buttons are only enabled if the melody has that speed value saved - self.btn_set_min.setEnabled(melody.min_speed is not None) - self.btn_set_mid.setEnabled(melody.mid_speed is not None) - self.btn_set_max.setEnabled(melody.max_speed is not None) - # Save buttons are always enabled when a melody is selected - self.btn_save_min.setEnabled(True) - self.btn_save_mid.setEnabled(True) - self.btn_save_max.setEnabled(True) - self.btn_clear.setEnabled(True) - - # Reset progress - self.lbl_progress.setText(f"Step: 0 / {len(melody.steps)}") - - def _on_play(self): - """Start playback.""" - if self.playback.is_playing: - self.playback.stop() - self.btn_play.setText("▶ Play") - else: - # Reset to beginning if we're at the end - if self.current_melody and self.playback.current_step >= len(self.current_melody.steps): - self.playback.current_step = 0 - self.playback.play(loop=self.btn_loop.isChecked()) - self.btn_play.setText("⏸ Pause") - self.btn_stop.setEnabled(True) - - def _on_loop(self): - """Toggle loop mode.""" - if self.playback.is_playing: - self.playback.is_looping = self.btn_loop.isChecked() - - def _on_stop(self): - """Stop playback.""" - self.playback.stop() - self.playback.current_step = 0 - self.btn_play.setText("▶ Play") - self.btn_stop.setEnabled(False) - self.lbl_truncated.setText("") - if self.current_melody: - self.lbl_progress.setText(f"Step: 0 / {len(self.current_melody.steps)}") - - def _on_speed_changed(self, value: int): - """Handle speed slider change.""" - self.lbl_speed.setText(f"{value} ms") - self.playback.set_speed(value) - self.lbl_truncated.setText("") # Hide warning when speed changes - - def _on_beat_changed(self, value: int): - """Handle beat duration slider change.""" - self.lbl_beat.setText(f"{value} ms") - self.playback.set_beat_duration(value) - - def _on_step_changed(self, step: int): - """Handle step change during playback.""" - if self.current_melody: - self.lbl_progress.setText(f"Step: {step + 1} / {len(self.current_melody.steps)}") - - def _on_playback_finished(self): - """Handle playback finished.""" - self.btn_play.setText("▶ Play") - self.btn_stop.setEnabled(False) - self.lbl_truncated.setText("") - - def _on_beat_truncated(self, actual_ms: int): - """Handle beat truncation warning.""" - self.lbl_truncated.setText(f"⚠ Beat truncated to {actual_ms}ms (speed too fast)") - - def _save_speed_value(self, which: str): - """Save current slider value to a speed setting.""" - if not self.current_melody: - return - - value = self.slider_speed.value() - - if which == 'min': - self.current_melody.min_speed = value - self.lbl_min.setText(f"{value} ms") - self.btn_set_min.setEnabled(True) - elif which == 'mid': - self.current_melody.mid_speed = value - self.lbl_mid.setText(f"{value} ms") - self.btn_set_mid.setEnabled(True) - elif which == 'max': - self.current_melody.max_speed = value - self.lbl_max.setText(f"{value} ms") - self.btn_set_max.setEnabled(True) - - # Update list item - self._update_current_list_item() - - def _load_speed_to_slider(self, which: str): - """Load a saved speed value to the slider.""" - if not self.current_melody: - return - - value = None - if which == 'min': - value = self.current_melody.min_speed - elif which == 'mid': - value = self.current_melody.mid_speed - elif which == 'max': - value = self.current_melody.max_speed - - if value is not None: - self.slider_speed.setValue(value) - - def _clear_values(self): - """Clear all speed values for current melody.""" - if not self.current_melody: - return - - self.current_melody.min_speed = None - self.current_melody.mid_speed = None - self.current_melody.max_speed = None - - self.lbl_min.setText("---") - self.lbl_mid.setText("---") - self.lbl_max.setText("---") - - # Disable Set buttons since there are no values to load - self.btn_set_min.setEnabled(False) - self.btn_set_mid.setEnabled(False) - self.btn_set_max.setEnabled(False) - - self._update_current_list_item() - - def _update_current_list_item(self): - """Update the current list item to show checkmark status.""" - item = self.melody_list.currentItem() - if item and self.current_melody: - if (self.current_melody.min_speed and - self.current_melody.mid_speed and - self.current_melody.max_speed): - prefix = "✓ " - else: - prefix = " " - item.setText(f"{prefix}{self.current_melody.name}") - - def _save_file(self): - """Save speed settings back to the .txt file.""" - if not self.current_file: - QMessageBox.warning( - self, - "Cannot Save", - "Can only save to .txt files. Binary files cannot be modified." - ) - return - - try: - MelodyParser.save_txt_file(self.current_file, self.melodies, self.original_lines) - QMessageBox.information( - self, - "Saved", - f"Speed settings saved to:\n{self.current_file}" - ) - except Exception as e: - QMessageBox.critical(self, "Error", f"Failed to save file:\n{e}") - - def closeEvent(self, event): - """Handle window close.""" - self.playback.stop() - self.audio.cleanup() - event.accept() - - -# ============================================================================ -# Main Entry Point -# ============================================================================ - -def main(): - app = QApplication(sys.argv) - - # Try to use Fusion style for consistent cross-platform look - app.setStyle(QStyleFactory.create("Fusion")) - - # Set up a pleasant color palette - palette = QPalette() - palette.setColor(QPalette.ColorRole.Window, QColor(245, 245, 245)) - palette.setColor(QPalette.ColorRole.WindowText, QColor(33, 33, 33)) - palette.setColor(QPalette.ColorRole.Base, QColor(255, 255, 255)) - palette.setColor(QPalette.ColorRole.AlternateBase, QColor(240, 240, 240)) - palette.setColor(QPalette.ColorRole.Button, QColor(240, 240, 240)) - palette.setColor(QPalette.ColorRole.ButtonText, QColor(33, 33, 33)) - palette.setColor(QPalette.ColorRole.Highlight, QColor(33, 150, 243)) - palette.setColor(QPalette.ColorRole.HighlightedText, QColor(255, 255, 255)) - app.setPalette(palette) - - window = SpeedCalcWindow() - window.show() - - sys.exit(app.exec()) - - -if __name__ == "__main__": - main() diff --git a/backend/builder/service.py b/backend/builder/service.py index 17feb47..c20f7c4 100644 --- a/backend/builder/service.py +++ b/backend/builder/service.py @@ -7,11 +7,12 @@ from typing import List, Optional from builder import database as db from builder.models import BuiltMelodyCreate, BuiltMelodyUpdate, BuiltMelodyInDB from fastapi import HTTPException +from config import settings logger = logging.getLogger("builder.service") -# Storage directory for built .bsm files -STORAGE_DIR = Path(__file__).parent.parent / "storage" / "built_melodies" +# Storage directory for built .bsm files — configurable via BUILT_MELODIES_STORAGE_PATH env var +STORAGE_DIR = Path(settings.built_melodies_storage_path) def _ensure_storage_dir(): diff --git a/backend/config.py b/backend/config.py index 8a12a62..ce59aa4 100644 --- a/backend/config.py +++ b/backend/config.py @@ -24,6 +24,9 @@ class Settings(BaseSettings): sqlite_db_path: str = "./mqtt_data.db" mqtt_data_retention_days: int = 90 + # Local file storage + built_melodies_storage_path: str = "./storage/built_melodies" + # App backend_cors_origins: str = '["http://localhost:5173"]' debug: bool = True diff --git a/backend/devices/models.py b/backend/devices/models.py index 23f513c..b53c56e 100644 --- a/backend/devices/models.py +++ b/backend/devices/models.py @@ -1,5 +1,5 @@ from pydantic import BaseModel, Field -from typing import List, Optional +from typing import Any, Dict, List, Optional from enum import Enum @@ -133,9 +133,10 @@ class DeviceUpdate(BaseModel): device_photo: Optional[str] = None device_location: Optional[str] = None is_Online: Optional[bool] = None - device_attributes: Optional[DeviceAttributes] = None - device_subscription: Optional[DeviceSubInformation] = None - device_stats: Optional[DeviceStatistics] = None + # Use raw dicts so only the fields actually sent are present — no Pydantic defaults + device_attributes: Optional[Dict[str, Any]] = None + device_subscription: Optional[Dict[str, Any]] = None + device_stats: Optional[Dict[str, Any]] = None events_on: Optional[bool] = None device_location_coordinates: Optional[str] = None device_melodies_all: Optional[List[MelodyMainItem]] = None diff --git a/backend/devices/service.py b/backend/devices/service.py index d3bbac9..4e58f86 100644 --- a/backend/devices/service.py +++ b/backend/devices/service.py @@ -15,6 +15,33 @@ COLLECTION = "devices" SN_CHARS = string.ascii_uppercase + string.digits SN_SEGMENT_LEN = 4 +# Clock/silence/backlight fields stored as Firestore Timestamps (written as datetime) +_TIMESTAMP_FIELD_NAMES = { + "daySilenceFrom", "daySilenceTo", + "nightSilenceFrom", "nightSilenceTo", + "backlightTurnOnTime", "backlightTurnOffTime", +} + + +def _restore_timestamps(d: dict) -> dict: + """Recursively convert ISO 8601 strings for known timestamp fields to datetime objects. + + Firestore stores Python datetime objects as native Timestamps, which Flutter + reads as DateTime. Plain strings would break the Flutter app. + """ + result = {} + for k, v in d.items(): + if isinstance(v, dict): + result[k] = _restore_timestamps(v) + elif isinstance(v, str) and k in _TIMESTAMP_FIELD_NAMES: + try: + result[k] = datetime.fromisoformat(v.replace("Z", "+00:00")) + except ValueError: + result[k] = v + else: + result[k] = v + return result + def _generate_serial_number() -> str: """Generate a unique serial number in the format BS-XXXX-XXXX.""" @@ -139,6 +166,17 @@ def create_device(data: DeviceCreate) -> DeviceInDB: return DeviceInDB(id=doc_ref.id, **doc_data) +def _deep_merge(base: dict, overrides: dict) -> dict: + """Recursively merge overrides into base, preserving unmentioned nested keys.""" + result = dict(base) + for k, v in overrides.items(): + if isinstance(v, dict) and isinstance(result.get(k), dict): + result[k] = _deep_merge(result[k], v) + else: + result[k] = v + return result + + def update_device(device_doc_id: str, data: DeviceUpdate) -> DeviceInDB: """Update an existing device document. Only provided fields are updated.""" db = get_db() @@ -149,16 +187,16 @@ def update_device(device_doc_id: str, data: DeviceUpdate) -> DeviceInDB: update_data = data.model_dump(exclude_none=True) - # For nested structs, merge with existing data rather than replacing + # Deep-merge nested structs so unmentioned sub-fields are preserved existing = doc.to_dict() nested_keys = ( "device_attributes", "device_subscription", "device_stats", ) for key in nested_keys: - if key in update_data and key in existing: - merged = {**existing[key], **update_data[key]} - update_data[key] = merged + if key in update_data and isinstance(existing.get(key), dict): + update_data[key] = _deep_merge(existing[key], update_data[key]) + update_data = _restore_timestamps(update_data) doc_ref.update(update_data) updated_doc = doc_ref.get() diff --git a/backend/mqtt_data.db b/backend/mqtt_data.db index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..113c724f7edf80fb2e9f47dd03648316a4a31e4c 100644 GIT binary patch literal 700416 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⪙2;o%! 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 literal 0 HcmV?d00001 diff --git a/frontend/public/devices/Strikers/striker_size_2.png b/frontend/public/devices/Strikers/striker_size_2.png new file mode 100644 index 0000000000000000000000000000000000000000..22eab1421ed07bdbcebb1bd139b7247a2ccf30f5 GIT binary patch literal 11354 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 literal 0 HcmV?d00001 diff --git a/frontend/public/devices/Strikers/striker_size_3.png b/frontend/public/devices/Strikers/striker_size_3.png new file mode 100644 index 0000000000000000000000000000000000000000..45dbcb1bc577d8fae4785f979b8891c19dd50633 GIT binary patch literal 13765 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 z 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 -
- {label} -
-
- {children || "-"} +
+
{label}
+
+ {children == null ? ( + Unavailable info + ) : isUnavailableText ? ( + {children} + ) : ( + children + )}
); } function BoolBadge({ value, yesLabel = "Yes", noLabel = "No" }) { + const isMissing = typeof value !== "boolean"; + const text = isMissing ? "Unavailable info" : value ? yesLabel : noLabel; + const tone = isMissing ? "muted" : value ? "positive" : "negative"; return ( - - {value ? yesLabel : noLabel} + + {text} ); } -function SectionCard({ title, children }) { +function SectionCard({ title, children, onEdit }) { return ( -
-

{title}

+
+
+

{title}

+ {onEdit && ( + + )} +
{children}
); @@ -65,17 +85,1044 @@ function Subsection({ title, children, isFirst = false }) { ); } -/** A grid row of fields — Nth items align across rows within a subsection */ +/** A grid row of fields — Nth items align across rows within a subsection */ function FieldRow({ children, columns }) { const childArray = Array.isArray(children) ? children.filter(Boolean) : [children]; const count = columns || childArray.length; return ( -
+
{children}
); } +function EmptyCell() { + return