Progressive Web App zur präzisen Berechnung von Bundpositionen für Saiteninstrumente
FretCalc ist ein Bundpositionsrechner, der Musikinstrumentenbauern ermöglicht, exakte Bundpositionen für verschiedene Mensuren, Stimmungen und Tonleitern zu berechnen - auch für historische Instrumente. Die Anwendung generiert sowohl visuelle SVG-Vorlagen als auch detaillierte Positionstabellen mit 3-stelliger Dezimalpräzision. Außerdem lassen sich Entwürfe teilen, speichern und widerherstellen. Spieler haben zudem die Möglichkeit anhand der Bünde verschiedene Tonleitern eines Instruments zu erforschen und in Skalen reinzuhören.
https://fret-calc.netlify.app/
FretCalc folgt einer modernen Single-Page-Application (SPA) Architektur mit folgenden Kernprinzipien:
- Component-Based Architecture: React mit TypeScript für typsichere, wiederverwendbare UI-Komponenten
- State Management: Zentralisierter App-State mit Zustand für vorhersehbare State-Updates
- Progressive Enhancement: Vollständige Offline-Funktionalität durch Service Worker und PWA-Technologie
- Responsive Design: Mobile-First Ansatz mit adaptiven Layouts für alle Bildschirmgrößen
- Type Safety: Strikte TypeScript-Konfiguration verhindert Runtime-Fehler bereits zur Compile-Zeit
- Internationalisierung: Mehrsprachige Unterstützung (DE/EN) durch react-i18next
- Docker-basierte Entwicklung: Konsistente Entwicklungsumgebung über alle Systeme hinweg
- Frontend: React, TypeScript, Vite
- Styling: TailwindCSS für utility-first CSS und themebares Farbschema
- State: Zustand für globales State Management
- PWA: Workbox für Service Worker und Offline-Support
- Icons: FontAwesome für konsistente Ikonografie
- Testing: Vitest für Unit- und Integration-Tests
- Build: Vite für schnelle Builds und HMR
- Deployment: Netlify mit Forms-Integration
- Separation of Concerns: Klare Trennung von Logik (lib/), UI (components/) und State (state/)
- Reusability: Wiederverwendbare Form- und UI-Komponenten in
components/commons/ - Testability: Umfassende Test-Coverage für Business-Logik
- Accessibility: Semantisches HTML und ARIA-Labels für Screen-Reader-Support
- Performance: Vite-basiertes Vendor-Chunking und optimierte Bundle-Größe
- Scalability: Modulare Struktur ermöglicht problemlose Feature-Erweiterung in allen Belangen
- Vite sorgt für blitzschnelle Builds (< 2s) und Hot Module Replacement
- Automatisches Vendor-Chunk-Splitting durch Vite für optimale Caching-Strategien
- Service Worker ermöglicht Instant-Loading bei wiederholten Besuchen
- Optimierte Assets durch automatische Image-Kompression
- Strikte TypeScript-Konfiguration verhindert Common-Pitfalls
- Type Guards für alle externen Daten (URL-Parameter, LocalStorage)
- Compile-Time-Validierung reduziert Runtime-Fehler drastisch
- Pure Functions in
lib/music-theory/sind einfach zu testen - Umfassende Unit-Tests mit hoher Coverage für Business-Logik (96+ Tests)
- Snapshot-Tests für UI-Komponenten und Übersetzungen
- Vitest mit Happy-DOM für schnelle Test-Ausführung
- Installierbar und Offline-First: App funktioniert komplett ohne Internet
- Adaptive UI: Mobile- und Desktop taugliches Layout
- Einfache Erweiterung um neue Sprachen
- Typsichere Übersetzungs-Keys durch TypeScript
- Automatische Sprach-Detektion basierend auf Browser-Settings
- Docker-basiert:
docker compose upoder Makefile-Commands nutzen und loslegen - Hot Reload: Änderungen sofort im Browser sichtbar
- NPM-Scripts: Standardisierte Build- und Test-Commands
- Klare Ordnerstruktur: Jeder Ordner hat eine eindeutige Verantwortung
- Kleinteiligs: Übersichtliche kleinteile React-Components und Funktionen
- Versionskontrolle:
app-version.tsfür Release-Tracking - Modulare Architektur: Neue Features können unabhängig hinzugefügt werden
- Component-Library: Wiederverwendbare UI-Komponenten in
commons/ - State-Separation: Zustand kann bei Bedarf auf Zustand-Slices aufgeteilt werden
- Erweiterbar für Lazy Loading: Architektur ermöglicht einfache Integration von Route-basiertem Code-Splitting
- Plugin-System: Vite-Plugins ermöglichen einfache Build-Erweiterungen
- WAI-ARIA: ARIA-Labels für wichtige Interaktionselemente (Buttons, Overlays, Tabs)
- Keyboard-Navigation: Button- und Tab-Komponenten sind per Tastatur navigierbar
- Semantisches HTML: Verwendung korrekter HTML5-Elemente wo möglich
- Fokus-Management: Sichtbare Fokus-Indikatoren durch TailwindCSS
- Farbkontraste: Design mit hohen Kontrastverhältnissen
- Pregnanz: Interatkive UI-Elemente haben ein konsistentes Farbschema
.
├── docker-compose.yml # Docker-Orchestrierung für Dev-Environment
├── Makefile # Build- und Deployment-Shortcuts
├── netlify.toml # Netlify-Deployment-Konfiguration
└── webclient/ # Haupt-Applikationsverzeichnis
webclient/
├── Dockerfile # Container-Definition für Production-Build
├── index.html # HTML-Template mit Netlify-Form-Integration
├── package.json # Dependencies und NPM-Scripts
├── vite.config.ts # Vite-Build-Konfiguration mit PWA-Plugin
├── tsconfig.json # TypeScript-Compiler-Einstellungen (strict mode)
└── pwa-assets.config.json # Konfiguration für PWA-Icons und -Assets
components/commons/ - Wiederverwendbare Basis-Komponenten
Button.tsx- Primärer Button mit VariantenCard.tsx- Container-Komponente für Content-GruppierungScrollToTop.tsx- Scroll-to-Top ButtonTabs.tsx- Tab-Navigation-KomponenteTooltip.tsx- Hover-Tooltips mit Z-Index-ManagementForm/- Form-Komponenten mit einheitlichem StylingInput.tsx- Text-InputLabel.tsx- Form-Label-KomponenteSelect.tsx- Select-Dropdown mit optionalem Icon-SupportRangeSlider.tsx- Range-Slider mit Wert-AnzeigeTextarea.tsx- Multi-Line Text-Input
PWA/- Progressive Web App KomponentenPWAInstallBanner.tsx- Install-Prompt für PWAPWAInstallCard.tsx- PWA-Installations-Karte
Tables/- Tabellen-KomponentenTableHeader.tsx- Tabellen-Header mit SortierungTableCell.tsx- Wiederverwendbare Tabellenzelle
components/FretCalculator/ - Feature-spezifische Komponenten
FretCalculator.tsx- Haupt-Container der AnwendungAppHeader.tsx- Header mit Navigation und SettingsAppFooter.tsx- Footer mit Kontakt-IntegrationStickyHeader.tsx- Sticky Header für Mobile-NavigationShareUrlCard.tsx- URL-Sharing-FunktionalitätResultsPanel/- BerechnungsergebnisseResultsPanel.tsx- Anzeige der Berechnungsergebnisse (Tabelle/SVG)SVGGenerator.tsx- SVG-Template-Generator für BundpositionenFrequencyPlayer.tsx- Audio-Player für Tonfrequenzen mit Wellenform-Unterstützung
ConfigurationPanel/- Input-Panel für KonfigurationsparameterConfigurationPanel.tsx- Haupt-KonfigurationspanelTuningSystemField.tsx- Auswahl zwischen gleichstuftiger Stimmung (moderner Standard) und reiner StimmungConcertPitchField.tsx- Freie Eingabe für Kammerton (400-460 Hz), so sind auch historische Kammertöne möglichOpenNoteField.tsx- Saitenstimmung-AuswahlScaleField.tsx- Tonleiter-Konfiguration (Dur/Moll)ScaleLengthField.tsx- Mensur-EingabeZeroPointField.tsx- Nullpunkt-Auswahl (Sattel/Steg)CalculationCapField.tsx- Berechnungslimit (Oktaven)
MobileSettingsOverlay/- Mobile SettingsMobileSettingsOverlay.tsx- Haupt-Overlay-ContainerLanguageSetting.tsx- Sprachauswahl um die Browser-Detection zu überschreiben (DE/EN)UnitSetting.tsx- Einheitenwahl (cm/inch)VolumeSetting.tsx- Lautstärke-ReglerWaveformSetting.tsx- Wellenform-Auswahl für den Sound-Player (Sinus, Rechteck, Sägezahn, Dreieck)
Overlays/- Overlay-KomponentenMobileOverlayWrapper.tsx- Wiederverwendbarer Overlay-ContainerContactOverlay.tsx- Netlify-kompatibles KontaktformularSavedConfigurationsOverlay/- KonfigurationsverwaltungSavedConfigurationsOverlay.tsx- Overlay für gespeicherte KonfigurationenSavedConfigurationsCard.tsx- Verwaltung gespeicherter Konfigurationen mit IndexedDB
lib/music-theory/ - Musik-Theorie und Berechnungslogik:
fret-calc.ts- Hauptberechnungsmodul für Bundpositionen (3-Dezimal-Präzision) mit Unterstützung für gleichstuftiger Stimmung und reine Stimmungjust-intonation.ts- Reine Stimmung Berechnungen mit 5-Limit Tuningnote-frequencies.ts- Dynamische Frequenzberechnung mit frei wählbarem Kammerton (12-Ton-Gleichstufige-Stimmung)note-names.ts- Notennamen und Enharmonikscale-steps.ts- Tonleiter-Definitionen (Dur, Moll)semitone-mappings.ts- Halbton-Zuordnungen für verschiedene Tunings
Utility-Funktionen:
unit-converter.ts- Umrechnung zwischen cm und inchnumber-parser.ts- Robustes Parsing von Zahlen-Inputsgenerate-csv.ts- CSV-Export-Generator mit Metadatendownload-file.ts- File-Download-Helperlocal-storage.ts- LocalStorage-Wrapper mit Type-Safetyoffline-db.ts- IndexedDB (Dexie.js) für Offline-Konfigurationsspeicherungtailwind-utils.ts- TailwindCSS-Utility-Helfer (cn-Funktion)app-version.ts- Versions-Management und Metadaten-Generierungfontawesome.ts- FontAwesome-Icon-Library-Konfiguration
appState.ts- Zustand Store mit allen App-Settings (Mensur, Tuning, Tonleiter, UI-Präferenzen)index.ts- State-Exports und Type-Definitionen
config.ts- i18next-Konfigurationlocales/de.json- Deutsche Übersetzungenlocales/en.json- Englische Übersetzungen- Vollständige Übersetzung aller UI-Texte, Labels und Fehlermeldungen inkl. Aria-Labels
usePWAInstall.ts- PWA-Install-Prompt-ManagementuseUrlState.ts- URL-basiertes State-Sharing für Konfigurationen
Icons, Favicons, Open Graph Images und andere statische Ressourcen
HTML-Reports der Code-Coverage (generiert durch Vitest)
Generiertes Production-Bundle (wird von npm run build erstellt)
html-env-plugin.ts- Environment-Variable-Injection in HTML
# Development starten
docker compose up
# Tests ausführen
docker compose exec webclient npm test
# Production Build
docker compose exec webclient npm run build
---
## Deployment
Die Anwendung ist optimiert für **Netlify**-Deployment, abgesehen von dem im Footer verlinkten Kontakt formular, funktioniert sie aber auch auf generischen Hosts
Vorteile von Netlify (free tier)
- Automatische Builds bei Git-Push
- Netlify Forms für Kontaktformular
- CDN-Distribution weltweit
- HTTPS by default
---
**Entwickelt von Chris Vaupel**