# Notenraum-Format

Notenraum liest bisherige Einzelstücke mit `schemaVersion: 1` weiter. Mehrstimmige Partituren verwenden `schemaVersion: 2`; neue Importe und Exporte behalten ihre Version bei. Unbekannte Felder werden abgewiesen, damit musikalische Angaben nicht stillschweigend verschwinden. Metadaten werden als Beschriftung behandelt, nicht als ABC-Direktiven.

## Gemeinsame Angaben

Beide Versionen verwenden `title` (Pflicht), optionale Felder `composer`, `instrument` und `notes`, `key`, `timeSignature` und `tempo` sowie optional `tempoUnit`. In Version 1 stehen zusätzlich `clef` und `measures` direkt am Stück. In Version 2 stehen die Stimmen unter `voices`; `instrument` darf auf Stückebene eine gemeinsame Instrumentenangabe liefern und jede Stimme darf ihre eigene Instrumentenangabe enthalten.

`key` ist eine gebräuchliche Dur- oder Molltonart mit bis zu sieben Vorzeichen, zum Beispiel `C`, `F#`, `Bb`, `A#m`, `Am` oder `Ebm`. `timeSignature` ist ein Paar wie `[4,4]`; `tempo` gibt Metronomschläge pro Minute an. Ohne `tempoUnit` (oder mit `"quarter"`) gilt die Viertelnote; `"dottedQuarter"` steht für eine punktierte Viertel und erscheint im Notensatz als `Q:3/8` (etwa `tempo: 72` in 12/8). Die Schlagart gilt auch für spätere `tempo`-Wechsel. Tonhöhen verwenden internationale Buchstaben (B ist deutsches H; Bb ist deutsches B), Oktaven von 0 bis 8 und optionale einfache oder doppelte Vorzeichen. `duration` zählt Viertelschläge und darf `.125, .25, .5, .75, 1, 1.5, 2, 3, 4, 6, 8, 12` sein.

Jeder Takt hat die Form `{ "events": [...] }`. Ein Ereignis ist ein Einzelton `{ "pitch": "C4", "duration": 1 }`, ein Akkord `{ "pitches": ["C4", "E4", "G4"], "duration": 1 }` oder eine Pause `{ "rest": true, "duration": 1 }`. `tie: true` bindet ein Ereignis an das unmittelbar folgende identische Ereignis. Takte müssen der Taktart entsprechen; nur erster und letzter Takt dürfen verkürzt sein. Ein Takt darf optional `key` und `tempo` für einen Wechsel zu Taktbeginn setzen; in mehrstimmigen Partituren stehen diese Wechsel an derselben Stelle in allen Stimmen.

### Optionale Angaben zum Instrument und zur Tonhöhen-Notation

`pitchContext` beschreibt optional den Bezug der gespeicherten Tonhöhen. In Version 1 steht es auf Stückebene, in Version 2 innerhalb der jeweiligen Stimme. Das Objekt muss genau diese vier Felder enthalten:

```json
{
  "instrumentKey": "Bb",
  "notation": "concert",
  "writtenToSounding": -2,
  "sourceNotation": "written"
}
```

`instrumentKey` ist einer der Werte `C`, `C#`, `Db`, `D`, `D#`, `Eb`, `E`, `F`, `F#`, `Gb`, `G`, `G#`, `Ab`, `A`, `A#`, `Bb`, `B` oder `unknown`. `notation` und `sourceNotation` sind jeweils `concert`, `written` oder `unknown`. `writtenToSounding` ist eine ganze Zahl von −36 bis +36 Halbtönen einschließlich Oktaven oder `null`, wenn der Abstand unbekannt ist. Bei `unknown` dürfen keine fehlenden Angaben erschlossen werden; unbekannte Altbestände bleiben ohne `pitchContext` und werden als unbekannt behandelt.

Unter „Stimmung & Notation“ lassen sich diese Angaben pro Stimme ansehen und bearbeiten. Diese Metadaten lösen keine Tonhöhenumrechnung aus. Alle Stimmen teilen eine Tonart für die gespeicherten und angezeigten Tonhöhen. `notation` beschreibt, ob diese Tonhöhen klingend (`concert`) oder in Instrumentenschreibweise (`written`) vorliegen; `sourceNotation` beschreibt davon unabhängig die Vorlage. Die Darstellung übernimmt die gespeicherten Tonhöhen unverändert. Allgemeine musikalische Transposition verschiebt Noten und Tonart, lässt `pitchContext` aber unverändert. Ein automatischer Wechsel zwischen klingender und geschriebener Darstellung sowie verschiedene Tonartvorzeichnungen pro Stimme werden noch nicht unterstützt. Die vier Felder bleiben bei Validierung, Import/Export, Stimmenextraktion, Stimmenverbindung, benannten Kopien und Transposition erhalten.

Im Beispiel „My Heart Will Go On“ tragen beide B-Trompeten `instrumentKey: "Bb"`, `notation: "concert"`, `writtenToSounding: -2` und `sourceNotation: "written"`: die gespeicherten klingenden Noten wurden aus der geschriebenen Notation abwärts übertragen. Posaune und Tuba verwenden `instrumentKey: "unknown"`, `notation: "concert"`, `writtenToSounding: 0` und `sourceNotation: "concert"`.

### Optionale Notationsangaben in beiden Versionen

- `slurStart: true` und `slurEnd: true` beginnen und beenden einen Phrasierungsbogen auf einem Ton oder Akkord. Bögen dürfen über Taktgrenzen reichen, müssen innerhalb derselben Stimme ausgeglichen sein und dürfen nicht verschachtelt werden. Beide Angaben dürfen auf demselben Ereignis stehen. Ein Phrasierungsbogen und `tie: true` dürfen gleichzeitig vorkommen; Pausen dürfen keine Bögen beginnen oder beenden.
- `fermata: true` setzt eine Fermate auf einen Ton, Akkord oder eine Pause.
- `caesura: true` setzt eine Zäsur nach dem Ereignis. Der gebündelte Renderer besitzt kein eigenes Zäsurzeichen; Notenraum stellt sie als festes `//` rechts neben dem Ereignis dar.
- `chord` ist ein Akkordsymbol, getrennt von den tatsächlich notierten `pitches`, zum Beispiel `C`, `Em7`, `A7`, `Dm7`, `C#dim7`, `G/D`, `D7`, `G7`, `G9sus4`, `C/E`, `F6`, `F#m7b5` oder `C/G`. Es darf auch auf einer Pause stehen. Erlaubt sind ein Grundton A–G mit optionalem einfachen/doppelten `#` oder `b`, optional einer der Zusätze `m`, `m6`, `m7`, `m9`, `m7b5`, `maj7`, `maj9`, `dim`, `dim7`, `aug`, `sus2`, `sus4`, `7sus4`, `9sus4`, `6`, `7`, `9`, `11`, `13` und optional `/` mit Basston. Andere Zeichen und freie ABC-Anweisungen werden abgewiesen. Transposition verändert Grundton und Basston gemeinsam mit der Partitur; der Zusatz bleibt erhalten.
- `tupletStart: true` am ersten von genau drei aufeinanderfolgenden Ereignissen erzeugt eine Triole. Die drei Ereignisse stehen im selben Takt und haben effektive Dauern von je `1/6`, `1/3`, `2/3` oder `4/3` Viertelschlägen; diese Dauern sind außerhalb einer Triole ungültig. Entsprechende geschriebene Noten sind Sechzehntel, Achtel, Viertel oder Halbe.
- `dynamic` speichert eine Lautstärkestufe (`pp`, `p`, `mp`, `mf`, `f`, `ff`, `fff`). `articulations` ist eine Liste aus `accent`, `staccato` und `tenuto` ohne doppelte Werte. `hairpinStart` und `hairpinEnd` beginnen und beenden eine dynamische Gabel (`crescendo` oder `diminuendo`) innerhalb derselben Stimme; die Gabeln müssen ausgeglichen sein und dürfen nicht verschachtelt werden. `direction` ist eine kurze, sichere Spielanweisung, beispielsweise `lead` oder `split leads`. Diese Angaben können an Notenereignissen stehen; reine Lautstärke- oder Spielanweisungen dürfen auch an Pausen stehen.
- Ein Takt darf zusätzlich `section` enthalten, eine 1–16 Zeichen lange Abschnittsbezeichnung aus ASCII-Buchstaben, Zahlen, Leerzeichen, Punkt und Bindestrich, beginnend mit Buchstabe oder Zahl. Sie erscheint am Taktanfang auf dem obersten sichtbaren System. Einzelstimmen übernehmen bei fehlender eigener Bezeichnung diejenige der ersten Partiturstimme.
- `barline: "double"` am Takt setzt einen Doppelstrich nach diesem Takt, auch am Stückende. Ohne die Angabe verwendet Notenraum einfache Taktstriche und am Ende einen Schlussstrich.

Alle Angaben bleiben beim Validieren, Speichern, Stimmenverbinden und Transponieren erhalten. Die booleschen Angaben werden entweder weggelassen oder auf `true` gesetzt.

## Einzelstimme: Version 1

```json
{
  "schemaVersion": 1,
  "title": "Kurze Melodie",
  "key": "C",
  "timeSignature": [4, 4],
  "tempo": 90,
  "clef": "treble",
  "measures": [
    {"events": [
      {"pitch": "C4", "duration": 1},
      {"pitch": "E4", "duration": 1},
      {"pitch": "G4", "duration": 1},
      {"rest": true, "duration": 1}
    ]}
  ]
}
```

## Mehrstimmige Partitur: Version 2

Version 2 hat ein bis acht Stimmen. Jede Stimme besitzt eine eindeutige `id` (1–32 ASCII-Zeichen, beginnt mit einem Buchstaben und enthält danach nur Buchstaben, Zahlen, `_` oder `-`), einen sicheren sichtbaren `name` (1–80 Buchstaben, Zahlen, Leerzeichen oder die Zeichen `.()'_–-`), ihren eigenen `clef`, optional `instrument` und `pitchContext` sowie eine eigene Taktfolge. Alle Stimmen müssen dieselbe Taktanzahl haben. Die Summe der Ereignisdauern muss in jedem entsprechenden Takt gleich sein, damit die Stimmen taktweise synchron bleiben; ein unterschiedlicher Notenrhythmus innerhalb eines Taktes ist erlaubt. Höchstens 4096 Ereignisse pro Partitur werden angenommen.

```json
{
  "schemaVersion": 2,
  "title": "Kleines Duett",
  "composer": "Beispiel",
  "key": "C",
  "timeSignature": [4, 4],
  "tempo": 90,
  "voices": [
    {
      "id": "melodie",
      "name": "Melodie",
      "clef": "treble",
      "measures": [
        {"events": [
          {"pitch": "C4", "duration": 1},
          {"pitch": "E4", "duration": 1},
          {"pitch": "G4", "duration": 2}
        ]}
      ]
    },
    {
      "id": "begleitung",
      "name": "Begleitung",
      "clef": "bass",
      "instrument": "Bass",
      "measures": [
        {"events": [
          {"pitch": "C2", "duration": 2},
          {"pitch": "G2", "duration": 2}
        ]}
      ]
    }
  ]
}
```

Die Notation stellt jede Stimme auf einem eigenen System dar, fasst die Stimmen mit einer Klammer zusammen und verbindet ihre Taktstriche. Einzeln aufgerufene Teile enthalten nur die angeforderte Stimme. Die gemeinsame Tonart bezieht sich auf die gespeicherten Tonhöhen; `pitchContext` kann ergänzend Instrumentenstimmung und Quellnotation dokumentieren, ändert die Darstellung oder Tonhöhen jedoch nicht.

Der Umfang bleibt einstimmige Melodien oder blockweise Akkorde je Notensystem, Pausen, einfache Dauern, Halte- und Phrasierungsbögen sowie die oben beschriebenen Notationsangaben. Nicht unterstützt sind unabhängige Stimmen, die sich ein einzelnes Notensystem teilen, Wiederholungszeichen, andere als Dreier-Triolen, Verzierungen und andere freie Notensatznotation.

## Foto-Import mit KI

Prompt-Vorschlag: „Lies die sichtbaren musikalischen Angaben und prüfe zuerst, ob jede Tonhöhe, Dauer, Taktart, Tonart, Oktave und bei Version 2 die Zuordnung jeder Note zu ihrer Stimme eindeutig erkennbar ist. Wenn etwas unsicher, verdeckt oder mehrdeutig ist, gib noch kein JSON aus. Frage gezielt nach den unklaren Stellen mit Takt, Stimme und Position; rate keine Note, Dauer oder Stimmzuordnung. Erstelle erst nach Klärung ein vollständiges, gültiges JSON-Dokument. Verwende Version 1 für eine einzelne Stimme und Version 2 für mehrere klar getrennte Notensysteme. Erfasse keine unabhängigen Stimmen, die sich ein Notensystem teilen, keine Wiederholungen, Verzierungen oder andere nicht unterstützte Zeichen. Erfasse Dreier-Triolen, Dynamik, Artikulation sowie Tonart- und Tempowechsel nur in den oben beschriebenen Feldern. Erfasse für jede Stimme `pitchContext` mit Instrumentenstimmung, Notationsweise der gespeicherten Noten, Abstand geschrieben → klingend einschließlich Oktave und Notationsweise der Vorlage. Unbelegte Angaben sind `unknown` beziehungsweise `null`; leite die Instrumentenstimmung nicht allein aus dem Schlüssel ab. Führe für eine gemeinsame klingende Partitur nur eindeutig belegte Transpositionen durch, dokumentiere dabei die ursprüngliche Notationsweise und verwende eine gemeinsame klingende Tonart. Gib nur das JSON aus, wenn alle erfassten Angaben bestätigt sind.“

Die Erkennung bleibt ein Entwurf. Vor dem Speichern müssen die erkannten Noten und ihre Stimmzuordnung geprüft werden.

## Strukturierte Prüffälle zur Umwandlung

Beide Versionen unterstützen optional `reviewChecks` (höchstens 256 Einträge).
Die Angaben werden mit dem Stück importiert, gespeichert und exportiert. Sie sind
für dessen Leser sichtbar: keine privaten Quellpfade, Geheimnisse oder internen
Arbeitsprotokolle eintragen. Originalquellen und ausführliche Historie bleiben im
lokalen Umwandlungsbereich.

```json
{
  "reviewChecks": [{
    "id": "bogen-t6",
    "title": "Erneuter Anschlag statt Haltebogen",
    "voiceId": "trombone",
    "measureIndex": 6,
    "eventIndex": 3,
    "status": "confirmed",
    "expected": {"pitch": "G4", "duration": 0.5, "tie": false},
    "reason": "Der Quellenabgleich bestätigt nur einen Phrasierungsbogen.",
    "sourceLabel": "Partitur, Posaune, gedruckter Takt 6"
  }]
}
```

Pflichtfelder sind alle gezeigten außer `sourceLabel`. `id` ist eindeutig, beginnt
mit ASCII-Buchstabe und enthält maximal 64 Buchstaben, Ziffern, `_` oder `-`.
`voiceId` ist eine bestehende Stimmen-ID, bei Version 1 immer `main`.
`measureIndex` und `eventIndex` sind nullbasierte Indizes auf ein vorhandenes Ereignis.
`title` enthält 1–160 Zeichen, `reason` 1–1000, `sourceLabel` optional bis 200 Zeichen.
`status` ist `open` (noch nicht durch die Quelle bestätigt) oder `confirmed`.

`expected` enthält mindestens eines aus `pitch`, `pitches`, `rest`, `duration`, `tie`.
Tonhöhen verwenden das reguläre Format; `pitches` hat 1–8 eindeutige Töne.
`pitch`, `pitches` und `rest` schließen einander aus. `duration` ist eine positive
endliche Zahl bis 16 Viertelschlägen, `rest` und `tie` sind boolesch.
`tie: false` prüft auch einen fehlenden Haltebogen. Erwartungen dürfen vom aktuellen
Ereignis abweichen: gerade diese Abweichung zeigt das Portal an. Bestätigung und
aktueller Wertevergleich werden getrennt betrachtet. Ein bestandener Prüffall
beweist nur seine konkrete Erwartung, keine vollständige Quellenübereinstimmung.

Einfügen und Verschieben im Noteneditor führen die Ereignisbezüge mit. Das Löschen
einer unmittelbar geprüften Note verlangt zuerst die Anpassung ihres Prüffalls im
JSON-Editor. Beim Entfernen einer Stimme werden ihre Prüfstellen entfernt; Kopien
von Einzelstimmen behalten nur ihre eigenen Prüfstellen. Beim Verbinden werden IDs
bei Bedarf eindeutig umbenannt. Vereinfachte oder abgeleitete neue Stimmen erben
keine Quellenbestätigung; die Prüffälle der Originalstimmen bleiben erhalten.

Erwartungen beziehen sich auf die gespeicherte Quellenfassung. Eine temporäre
Transpositionsvorschau ändert die Anzeige des Prüfergebnisses nicht. Beim dauerhaften
Speichern einer Transposition bleiben Erwartungen unverändert und können deshalb
Abweichungen zeigen; sie müssen für diese neue Fassung ausdrücklich überprüft werden.
