WAV-Audio-Dateien

WAV-Audio-Dateien

Zielgruppe für die Live-Demonstration sind alle Informatik-AnwenderInnen. Es werden lediglich Grundkenntnisse der Informatik vorausgesetzt.

Die Programmierung von Audio-Medien erfordert allerdins fortgeschrittene Kenntnisse mindestens einer Programmiersprache.


Live-Audio mit PHP



Einfache eigene Experimente sind mit jedem → Tabellen-Kalkulations-Programm möglich.

Die Programmierung von binären Daten erfordert fortgeschrittene Kenntnisse der Informatik-Grundlagen und mindestens einer Programmiersprache.
Details: ↓ WAV-Struktur, ↓ Analyse und ↓ Synthese mit PHP, Synthese mit Javascript

Struktur einer WAV-Datei


Alle folgenden Kapitel erfordern fortgeschrittene Kenntnisse, weil sie Details zur Struktur von WAV-Dateien und zu deren Programmierung vorstellen.


Werkzeug

Zur Programmierung binärer Daten sind ein Hex-Editor-Programm und ein Hex-Taschenrechner unentbehrlich.

Hex-Editoren sind für alle gängigen Betriebssysteme kostenfrei verfügbar.

Fast alle Taschenrechner (z.B. Linux kcalc, Windows calc.exe) lassen sich auf einen EntwicklerInnen-Modus mit Hexadezimal-Zahlen) umstellen.

Das kostenfreie Audio-Editor-Programm Audacity ist für Audio-Experimente hervorragend geeignet.

  Wikipedia: Hex Editor-Programme


Abkürzung
Erklärung
Bytes
Beispiel
U2
Ganze Zahl ohne Vorzeichen
2
291. ⇨ 23 01
U4
Ganze Zahl ohne Vorzeichen
4
74565. ⇨ 45 23 01 00
S2
Ganze Zahl mit Vorzeichen
2
291. ⇨ 23 01
A4
String aus 4 Zeichen
4
'ABCD' ⇨ 41 42 43 44

Details zur Codierung von → ASCII-Zeichen



Die Abspiel-Zeit in Sekunden hängt ebenfalls von der Anzahl der Records ab:
duration = nrecords / 44100
nrecords = duration * 44100

Der Umrechnungs-Faktor ergibt sich aus der (hier) zur PCM-Codierung verwendeten Abtast-Frequenz (Sample-rate) von 44100 Hz. Für besonders hohe Audio-Qualität werden auch höhere Abtast-Frequenzen verwendet.



Block-Einheiten einer WAV-Datei:
  • File-Header
  • Format
  • Data-Header
  • Data

Der Daten-Typ U2 wird nur paarweise verwendet. Daher beginnen alle 4-Byte Daten an Adressen mit den End-Ziffern 0, 4, 8, C


Offset
Hex
Typ
Erklärung
0000
52 49 46 46
A4
Konstanter Text RIFF
0004
AC 58 01 00
U4
filesize
0008
57 41 56 45
A4
Konstanter Text WAVE

Die Bytes von Zahlen-Variablen werden nach dem System Little-Endian gespeichert: Zuerst das niedrigstwertige Byte, zuletzt das höchstwertige Byte. Das ist genau umgekehrt wie die gewohnte Schreibweise von Dezimal-Zahlen.


Offset
Hex
Typ
Erklärung
000C
66 6D 74 20
A4
Konstanter Text fmt
0010
10 00 00 00
U4
format_header_length
0014
01 00
U2
format_tag
0016
01 00
U2
channels
0018
44 AC 00 00
U4
sample_rate
001C
88 58 01 00
U4
bytes_per_second
0020
02 00
U2
block_align
0022
10 00
U2
bytes_per_sample

Unter den hier angenommenen einfachen Bedingungen enthält dieser Block nur konstante Daten.

Bei der Synthese einer WAV-Datei werden die 24. Bytes ohne Änderung gescchrieben.

Bei der Analyse einer unbekannten WAV-Datei muss man die einzelnen Variablen allerdings lesen und je nach Typ decodieren.


Offset
Hex
Typ
Erklärung
0024
64 61 74 61
A4
Konstanter Text data
0028
88 58 01 00
U4
block_length


Offset
Hex
Typ
Erklärung
002C
00 00
S2
Daten nach t=0
002E
FF 7F
S2
Daten nach t=22.67 µs
0030
00 00
S2
Daten nach t=45.35 µs
0032
FF FF
S2
Daten nach t=68.03 µs
0034
00 00
S2
Daten nach t=90.70 µs
...weiter bis zum Datei-Ende eof


Negative Werte werden im 2er-Komplement codiert.
Die Grenze der negativen Werte beträgt -32768.

Die interne Codierung (nur !) von negativen Zahlen kann man mit jedem Taschenrechner berechnen:
Code = 65536 + Dezimalwert => Hex
Ein Programm kann allerdings nicht so einfach rechnen, weil die Zahl 65536. mit 2-Byte Variablen nicht darstellbar ist.
Beispiel:
Dezimalwert = -123.
Code = 65536. - 123. = 65413. => #FF85

Der Wert wird mit den Bytes 85 FF angegeben.

WAV-Analyse mit PHP


Ausgabe-Text der PHP-Funktion wav_analyze() für die Muster-Datei hz440.wav
Pfad: ../../img/audio/hz440.wav
Datei nicht gefunden


PHP-Quelltext

◀   Dies ist der Quelltext der Datei wav_lib.php, die einige PHP-Funktionen zum Experimentieren mit WAV-Dateien enthält.

Die Funktion wav_analyze() wurde im vorigen ↑ Absatz dieses Kapitels verwendet, um die Header- und Format-Daten einer WAV-Audio-Datei zu lesen und anzuzeigen.

Die Programmiersprache → PHP ist an jedem Standard Server-PC installiert.

Die PHP-Funktion wurde am Server-PC ausgeführt, wo sich auch die untersuchte Datei hz440.wav befindet. Der Zugriff auf Dateien ihres Arbeits-PC ist nicht möglich.

Der Ausgabe-Text wurde an das Webserver-Programm übergeben, dieses hat den fertigen Text als HTML-Quelltext an ihren Client-(Arbeits)-PC gesendet.

Ihr Browser-Programm hat aus dem HTML-Quelltext diese Webseite erzeugt.
Diagramm des gesamten Vorgangs

Mit diesem Link wird der PHP-Quelltext in einem eigenen Browser-Tab angezeigt.
Der PHP-Quelltext lässt sich besser kopieren, wenn man vorher die Zeilen-Nummern mit Mausklick abschaltet.

WAV-Synthese mit PHP


Das Programm muss diese Aufgaben lösen:
  • Punktweise Berechnung der Daten, z.B. mit der Funktion
    y[n] = sin(2 * pi * f * t[n])
    für viele verschiedene Datenpunkte n bzw. Zeitpunkte t[n]
    (Beispiel mit → Tabellen-Kalkulation)
  • Codierung aller für das WAV-Format erforderlichen Header- und Format-Daten sowie aller Datenpunkte (Records)
  • Schreiben der codierten Binär-Daten in eine Datei, Speichern der WAV-Datei.



Die Funktion wav_write_record() wurde verwendet, um die Audio-Daten in die Ausgabe-Datei zu schreiben.

Die vorgestellten Funktionen werden nur auf einem Standard Webserver ausgeführt.
Die (kostenfreie) Installation von PHP (als CLI-Interpreter) ist auf jedem PC möglich, jedoch nur für fortgeschrittene EntwicklerInnen empfehlenswert.
Wenn sie nicht über einen Webserver verfügen, dann können sie die Themen dieser Seite auch mit einem Tabellen-Kalkulations-Programm ausprobieren.



Man kann den SVG-Quelltext am eigenen Arbeits-PC in einer Text-Datei *.svg speichern. Diese Datei lässt sich mit jedem gängigen Browser-Programm öffnen, in eigene Webseiten einbetten oder als Bild-Datei in Büro-Programme (LibreOffice, OpenOffice) einsetzen.

Das zur Herstellung der SVG-Datei verwendete PHP-Programm muss die Daten der Audio-Datei lesen und verwendet dazu Programm-Teile ähnlich jenen, die auf dieser Seite im Kapitel 'Analyse' vorgestellt werden.

Mit diesem Link wird der SVG-Quelltext der Grafik in einem eigenen Browser-Tab angezeigt. Sie zeigt die Audio Muster-Datei mit 440Hz Sinus.
Wenn man den Quelltext ansieht, wird klar, dass man solche Dateien nicht manuell sondern mit einem Programm herstellt.