Zum Inhalt

Die schwingende Saite

Eine Gitarrensaite kennt keine Formel. Jeder Punkt der Saite schaut nur auf seine zwei direkten Nachbarn und tut, was diese ihm sagen: Liegen beide höher als ich, werde ich nach oben gezogen. Mehr Regel gibt es nicht. Aus dieser winzigen, rein örtlichen Vorschrift entsteht von ganz allein alles: die Tonhöhe, die Obertöne, der ganze Klang.

Das Aha: Der Ton steht nirgends im Programm. Niemand hat „440 Hz" hingeschrieben. Die Tonhöhe ist ein Ergebnis. Sie fällt heraus, weil eine Welle eine bestimmte Zeit braucht, um einmal die Saite hinunter und wieder zurück zu laufen. Wer die Saite kürzer macht, verkürzt diesen Weg, und der Ton wird höher. Genau das macht ein Finger auf dem Bund.

Und dieselben acht Zeilen laufen auf dem MELOWEE-FPGA 48 000-mal pro Sekunde und erzeugen einen Ton, den man hören kann.


Wortherkunft

Saite: althochdeutsch seita „Strick, Fessel", verwandt mit lateinisch saeta „Borste". Die ersten Saiten waren gedrehte Tierdärme und Haare, buchstäblich Schnüre. Dispersion: lateinisch dispergere „auseinanderstreuen". Dasselbe Wort wie beim Prisma, das weißes Licht zerstreut: Dort laufen verschiedene Farben verschieden schnell, hier verschiedene Obertöne. Es ist wirklich derselbe Effekt. Simulation: lateinisch simulare „ähnlich machen", von similis „ähnlich". Im Wort steckt schon die Warnung: ähnlich, nicht gleich.


Die echte Saite

Bevor das Modell kommt, die Physik, die es nachbildet. Eine gespannte Saite hat drei Eigenschaften, die ihren Ton bestimmen:

Größe Symbol Wirkung
Schwingende Länge \(\ell\) länger = tiefer
Zugkraft (Spannung) \(T\) straffer = höher
Masse pro Länge \(\mu\) dicker oder schwerer = tiefer

Zugkraft und Masse legen fest, wie schnell eine Störung die Saite entlangläuft:

\[ c = \sqrt{\frac{T}{\mu}} \]

Zupft man die Saite, teilt sich das Dreieck in zwei Wellen, die nach links und rechts laufen, an den festen Enden umkehren und sich überlagern. Es bleibt nur übrig, was zur Länge passt: Wellen, für die die Saite ein ganzzahliges Vielfaches einer halben Wellenlänge ist. Das sind die stehenden Wellen mit ihren Knoten und Bäuchen. Die längste davon ist der Grundton, alle weiteren sind exakte Vielfache:

\[ f_n = n \cdot \frac{c}{2\ell} = \frac{n}{2\ell}\sqrt{\frac{T}{\mu}} \]

Das sind die Mersenne-Gesetze von 1636: Tonhöhe umgekehrt proportional zur Länge, proportional zur Wurzel der Spannung, umgekehrt proportional zur Wurzel der Masse. Eine Gitarrensaite E2 mit 65 cm und 82,4 Hz hat demnach eine Wellengeschwindigkeit von rund 107 m/s.

Der Bund verkürzt \(\ell\). Die Stimmwirbel ändern \(T\). Der Wechsel auf eine dickere Saite ändert \(\mu\). Alles andere in diesem Topic ist die Frage, wie man diese Physik einem Chip beibringt, und was dabei verloren geht.


Das Modell: Finite Differenzen

Die Saite wird in \(L\) gleich weit entfernte Punkte zerlegt. \(u_i^n\) ist die Auslenkung von Punkt \(i\) zum Zeitschritt \(n\). Die ganze Physik:

\[ u_i^{n+1} = 2u_i^n - u_i^{n-1} + \lambda^2\left(u_{i-1}^n - 2u_i^n + u_{i+1}^n\right) - \gamma\left(u_i^n - u_i^{n-1}\right) \]

Der erste Klammerausdruck ist die Krümmung: wie stark ein Punkt aus der Verbindungslinie seiner Nachbarn heraussteht. Eine gekrümmte Saite wird geradegezogen, das ist die ganze Kraft. Der letzte Term ist die Dämpfung: ein kleiner Anteil der Geschwindigkeit wird abgezogen, so klingt der Ton aus. Die Enden bleiben fest: \(u_0 = u_{L-1} = 0\).

Daraus folgt der Grundton. Mit \(c = \lambda\,\Delta x / \Delta t\) und \(\ell = (L-1)\,\Delta x\) ist das genau die Formel der echten Saite \(f_1 = c / 2\ell\), nur in Gittereinheiten geschrieben:

\[ f_1 = \frac{\lambda \cdot f_s}{2\,(L-1)} \]
Name Symbol Bereich Bedeutung
Zahl der Punkte \(L\) 8 … 128 Länge der Saite. Halbe Länge = doppelte Frequenz
Courant-Zahl \(\lambda = c \cdot \Delta t / \Delta x\) 0 … 1 Wie weit eine Welle pro Zeitschritt läuft, in Gitterpunkten. Eine Gittergröße, keine Saitengröße. Bei festem Gitter gilt \(T \propto \lambda^2\)
Abtastrate \(f_s\) 48 000 Hz Wie oft pro Sekunde ein Zeitschritt gerechnet wird
Zupfort \(p\) 0 … 1 Wo gezupft wird. Nahe am Steg = schärfer
Dämpfung \(\gamma\) \(0 \ldots 10^{-3}\) Wie schnell der Ton ausklingt. Im FPGA \(\gamma = d^2/2^{26}\) mit \(d = 0 \ldots 255\), Abklingzeit \(\tau = 2/(\gamma f_s)\)

Die Grenze, an der alles auffliegt: λ ≤ 1

Eine Welle darf pro Zeitschritt höchstens einen Gitterpunkt weit laufen. Sonst überholt sie das Gitter, und die Zahlen wachsen ins Unendliche, die Saite „explodiert". Das heißt Courant-Friedrichs-Lewy-Bedingung. Einen Regler ein winziges Stück zu weit, und statt eines Tons kommt Krach und dann nichts mehr.

Das ist eine Eigenschaft des Rechenverfahrens, nicht der Saite. Eine echte Saite explodiert nie, sie reißt höchstens. Wer im Modell mehr Spannung will, muss das Gitter feiner machen oder kürzere Zeitschritte rechnen.


Die Saite von der Seite

Anfassen: Irgendwo auf die Saite klicken, ziehen und loslassen. Das Dreieck, das du ziehst, ist die Anfangsform.

Beobachte

  • Sehen: Mit wenigen Schritten pro Bild kriecht die Welle sichtbar über die Saite, läuft zum Steg, kehrt um. Dreh „Tempo" hoch und sie wird zur stehenden Welle.
  • Das Bild lügt in zwei Richtungen, und sagt es unter der Saite: Die Auslenkung ist etwa zehnfach überhöht, eine Gitarrensaite schwingt nur Millimeter auf 65 cm. Und im Sehen-Modus läuft die Zeit 800-fach langsamer. Deshalb sieht die Saite aus wie ein Gummiband, obwohl das Modell dasselbe rechnet wie bei 368 Hz.
  • Hören: Ein AudioWorklet rechnet dieselben acht Zeilen 48 000-mal pro Sekunde. Sehen und Hören sind derselbe Code mit verschiedener Schrittzahl. Das ist selbst schon eine Lektion.
  • Länge L ist der Bund: Der Sattel links wandert nach rechts, der Steg bleibt. Live während des Klingens verschieben, dann hörst du den Bund.
  • Courant-Zahl λ geht absichtlich über 1 hinaus. Das Widget zeigt daneben \(T \propto \lambda^2\), so hängt die Spannung mit ihr zusammen. Oberhalb wird alles rot, die Zahlen laufen weg und die Saite wird zum Zickzack. „zurück auf 0,968" holt sie wieder. Das ist der Moment, den man nicht vergisst.
  • Dämpfung in der Skala des Chips, 0 bis 255, daneben die Abklingzeit. 24 ist die Messreihe, 255 ist ein Plopp.
  • Spektrum: Balken sind die Obertöne des Modells, gestrichelt steht, wo sie bei der idealen Saite liegen müssten. Bei kleinem \(L\) wandern die Balken sichtbar nach links.

Live-Modus

Mit einem MELOWEE-Gerät wird Neigung zum Bund und Taste 1 zum Zupfen. Das Gerät kippen heißt greifen.


So rechnet die Hardware

Der Chip rechnet die Formel oben 48 000-mal pro Sekunde für jeden Punkt der Saite. Zwischen zwei Tönen liegen 512 Takte, eine Saite mit 64 Punkten braucht davon 68. Das Ergebnis geht direkt auf den Kopfhörerausgang.

Vier Vereinfachungen, und genau die sind der Lernstoff:

  1. Es gibt keine Kommazahlen. Der Chip rechnet nur mit ganzen Zahlen. Statt „mal 0,9375" rechnet er „mal 61440, dann 16 Stellen nach rechts schieben". Schieben ist Halbieren, 16-mal: >> 16 ist die Division durch 65536.
  2. Deshalb ist \(\lambda^2\) eine ganze Zahl von 0 bis 65536, und die CFL-Grenze ist keine Rechnung, sondern ein Vergleich: tension <= 65536. Eine Stabilitätsbedingung, die zu einer einzigen Addition zusammenschrumpft.
  3. Die Saite ist ein kurzes Stück Speicher. 64 Zahlen für „jetzt", 64 für „vorher". Das ist die ganze Saite.
  4. Der Bund verschiebt den Sattel, nicht den Steg. Greifen heißt: Der linke feste Punkt wandert nach rechts. Die Saite wird kürzer, der Ton höher, bei völlig unveränderter Spannung.
  5. Die Dämpfung braucht einen Rest-Sammler. Der Chip zieht pro Schritt \(\gamma \cdot\) Geschwindigkeit ab, mit \(\gamma = d^2/2^{26}\). Bei leisem Ausklang ist dieser Abzug kleiner als ein Quantisierungsschritt, also null, und der Ton bliebe bei −49 dBFS in einer Dauerschleife hängen. Deshalb sammelt ein Akkumulator die weggerundeten Reste, bis sie einen ganzen Schritt ergeben. Damit klingt es bis −85 dBFS aus, bezogen auf Vollausschlag. Eine Rückstellkraft, die kleiner ist als ein Schritt, ist keine, bis man sie aufsummiert. Das Widget rechnet in Gleitkomma und braucht das nicht.

Das Widget rechnet genauso ganzzahlig. In JavaScript steht statt >> 16 ein Math.floor(k · t / 65536), weil die Bit-Operatoren dort nur 32 Bit breit sind. Es ist exakt dieselbe Abrundung.

Theorie, Simulation und echte Messung nebeneinander

Dieselbe Saite, nur durch den Bund verkürzt, dreimal bestimmt: aus der Formel der echten Saite, aus dem Programm und am echten Gerät gemessen (Arty A7, Mikrofonaufnahme, tension 61440).

\(L\) Echte Saite \(c/2\ell\) Gitterformel Simulation Hardware Hardware gegen Gitterformel
64 368,86 Hz 368,85 Hz 368,87 Hz 368,82 Hz −0,16 ct
49 484,12 Hz 484,12 Hz 484,16 Hz 484,11 Hz −0,03 ct
34 704,18 Hz 704,16 Hz 704,03 Hz 704,32 Hz +0,39 ct
26 929,52 Hz 929,48 Hz 929,42 Hz 930,13 Hz +1,21 ct

Die Simulations-Spalte ist am Abgriff 0,643 gemessen, wie am Gerät. Mit einem anderen Abgriff verschiebt sie sich um bis zu 1,2 Cent, weil ein anderer Ort andere Obertöne betont und der Tonhöhen-Schätzer minimal anders landet. Die beiden Formel-Spalten ändern sich nicht. Wo man hinhört, ändert die Messung, nicht den Ton. Das erklärt nebenbei, warum auch die Hardware-Spalte nie exakt trifft.

368 Hz → 930 Hz, allein durch Kürzen. Die Vorhersage trifft die Wirklichkeit auf etwa ein Hundertstel eines Halbtons. Ein Cent ist 1/100 Halbton, kleiner als ein Mensch hören kann.

Für Lernende ist das Interessanteste nicht, dass es stimmt, sondern dass drei ganz verschiedene Wege zum selben Ergebnis kommen: ein Blatt Papier, ein Programm und ein Stück Elektronik mit einem Lautsprecher.

Hörbeispiele

Beispiel Was du hörst
Echte Hardware: eine Tonleiter, gespielt vom FPGA.
Echte Hardware: dieselbe Saite, nur der Bund wandert. 368 → 930 Hz ohne jede Spannungsänderung.
Die Simulation aus dem Referenzprogramm, lange Saite, 368,85 Hz.
Die Simulation, kurze Saite, 929,48 Hz.

Simulation und Hardware sind ein A/B-Paar: dieselbe Physik, einmal in 20 Zeilen Python und einmal auf einem Chip. Sie klingen ähnlich, nicht gleich. Der Chip hat einen echten Analogausgang, und die Aufnahmen entstanden mit den Einstellungen der Messreihe: tension 61440, 64 Punkte, Anregung bei 0,19 der Länge, Abgriff bei 0,64, kürzester Anschlag (ein Sample). Für die Bund-Aufnahme lief die aktive Länge über 255, 192, 128 und 96 von 255, das ist genau die Tabelle oben. Für die Tonleiter blieb sie bei 255, die Spannung kam je Note aus einer Tabelle. Der Knopf „Preset: Gerät“ im Widget setzt die lange Saite. Die Dämpfung dabei ist eine Annahme, dokumentiert ist \(d = 24\) für die Messreihe, ob die Aufnahme mit 24 oder 48 lief, ist nicht belegt.


Die Falle: die Obertöne liegen zu tief

Die Obertöne einer idealen Saite sind exakte Vielfache des Grundtons, siehe oben. Bei unserem Gittermodell sind sie es nicht: Sie liegen zu tief, und je höher der Oberton, desto mehr. (Echte Saiten weichen auch ab, aber in die andere Richtung: Ihre Steifigkeit zieht die Obertöne leicht nach oben. Das Gitter zieht nach unten. Beides ist nicht die ideale Saite.)

Oberton \(n\) Echte Saite \(n \cdot f_1\) Gitterformel Abweichung
1 368,86 Hz 368,85 Hz −0,01 ct
8 2950,84 Hz 2949,60 Hz −0,73 ct
16 5901,69 Hz 5891,29 Hz −3,05 ct
32 11803,38 Hz 11701,01 Hz −15,08 ct
\[ f_n = \frac{f_s}{\pi}\,\arcsin\!\left(\lambda \sin\frac{n\pi}{2(L-1)}\right) \]

Das ist kein Programmierfehler. Es heißt numerische Dispersion und ist eine Eigenschaft des Gitters selbst: Hohe Töne haben kurze Wellen, und kurze Wellen „sehen" die einzelnen Gitterpunkte. Wer das Gitter feiner macht, macht den Fehler kleiner, aber niemals null. Man hört es: Hohe Töne klingen auf dem groben Gitter leicht „verstimmt-dumpf".

Die wichtigste Lektion überhaupt

Ein Modell ist nicht die Wirklichkeit. Es hat seine eigene Physik, und die muss man kennen.

Zweite Falle: die CFL-Grenze ist keine Klippe

Bei \(\lambda = 1{,}0005\), schon jenseits der Grenze, bleibt die Saite über 6000 Zeitschritte ruhig. Erst bei \(\lambda = 1{,}0078\) fliegt sie sofort auseinander. Der Grund ist charmant: Das Abschneiden beim >> 16 verliert jedes Mal ein winziges bisschen, und dieses Abschneiden wirkt wie eine winzige Reibung, die knapp jenseits der Grenze gerade noch gegenhält.

Direkt an einer Stabilitätsgrenze ist ein Verfahren nur „gerade eben" stabil, und ein kurzer Blick kann Stabilität nicht von langsamem Weglaufen unterscheiden. Diese Lehre hat das Hardware-Team selbst einmal einen Tag gekostet.


Saite gegen Schwarm

Die Saite und die Synchronisation sind ein Gegensatzpaar: Beide bestehen aus vielen einfachen Teilen mit einer lokalen Regel, aus denen ein globales Muster entsteht. Bei Kuramoto koppeln alle mit allen, bei der Saite nur mit den zwei Nachbarn. Genau deshalb entsteht hier eine Welle statt eines gemeinsamen Takts.


Zusammenfassung

Aspekt Details
Echte Saite \(f_n = \frac{n}{2\ell}\sqrt{T/\mu}\), Mersenne 1636. Stehende Wellen, Obertöne exakte Vielfache
Regel im Modell Jeder Punkt: Krümmung zu den Nachbarn wird zur Kraft
Tonhöhe Ergebnis der Laufzeit, steht nirgends im Programm
Bund Sattel wandert, Saite kürzer, Ton höher, Spannung gleich
λ Courant-Zahl \(c\,\Delta t/\Delta x\), eine Gittergröße. Spannung \(\propto \lambda^2\)
CFL \(\lambda \le 1\), sonst explodiert das Verfahren, nicht die Saite. Im FPGA ein einziger Vergleich
Dispersion Obertöne des Gitters liegen zu tief, bis −15 ct beim 32.
Lektion Ein Modell hat seine eigene Physik. Man muss die echte kennen, um sie zu erkennen
Hardware Ganzzahlen, >> 16, 68 von 512 Takten pro Sample

Quiz


Verbindungen

graph LR
    W[Welle] --> S[Die schwingende Saite]
    O[Schwingung] --> S
    F[Frequenz] --> S
    S --> T[Ton & Frequenz]
    S --> A[Additive Synthese]
    S -.-> K[Synchronisation]
    click W "/fundamentals/physics/wave/" _self
    click O "/fundamentals/physics/oscillation/" _self
    click F "/fundamentals/signal/frequency/" _self
    click T "/fundamentals/music/tone-frequency/" _self
    click A "/fundamentals/music/additive-synthesis/" _self
    click K "/fundamentals/dynamics/synchronization/" _self
    style S fill:#ff6d00,stroke:#ffab40,color:#fff
Verbindung Beziehung
Welle, Schwingung Eine Störung läuft hin und zurück, daraus wird eine stehende Welle
Frequenz, Ton & Frequenz Halbe Länge = Oktave höher ist genau dieselbe Aussage
Additive Synthese Jeder Oberton der Saite ist eine Sinuswelle, ein Kreis
Synchronisation Gegensatzpaar: Nachbarn statt alle mit allen, Welle statt Takt