Audio-Experimente mit Tabellen-Kalkulation

Auf dieser Seite wird gezeigt, wie man diese Kluft mit eigenen Mitteln zumindest teilweise überbrücken kann:

Berechnung mit Tabellen-Kalkulation, Erzeugung einer Audio-Datei mit Basic, Audio-Ausgabe mit jedem beliebigen Player.



Schwingung

Beispiel: Diagramm einer Schwingung von 400 Hz:
Genau 4 komplette Schwingungen in der Zeit von 10 ms

Die Audio-Ausgabe wird hier zum besseren Verständnis angeboten, ist jedoch nicht Teil dieser (ersten einfachen) Kalkulations-Aufgabe.
Download der Muster-Datei  hz400.wav



Bei der Audio-Wiedergabe wird aus jedem Record ein elektrisches Signal erzeugt und im Abstand von 1/44100 Sekunden an das Ausgabe-Gerät weitergeleitet.

Bei der Berechnung (hier) muss man jeden Record einzeln berechnen. Die Records folgen einander im Abstand von 1/44100 Sekunden ≃ 22.7µs



Vorschläge zur Formatierung:
Die Eingabe-Zellen sollten deutlich erkennbar sein, hier z.B. durch den grünen Hintergrund.
Außerdem wird die Eingabe-Sperre aufgehoben: Das wird nur dann wirksam, wenn das Dokument später mit Passwort geschützt wird.

Einheiten:
Die jeweiligen Einheiten werden als 'BenutzerInnen-definierte' Zahlen-Formate eingetragen, z.B. in die Zellen B1 und B7 das Format 0" Hz", in Zelle B2 das Format Prozent ohne Dezimalstellen, in Zelle B8 das 'wissenschaftliche' Format 0,00E+00" s"
So werden die Einheiten korrekt angezeigt, die Werte in den Zellen bleiben jedoch Zahlen, mit denen man rechnen kann.



In Spalte B iwird die Zeit in Sekunden berechnet. Sie ist fix an die Record-Nummer gebunden. Die Zeit t wird zur Berechnung der Schwingung verwendet.

In Spalte C wird die Zeit in Millisekunden (ms) berechnet. Das ergibt anschauliche Zahlen und wird für die X-Achse des Digramms verwendet.

In Spalte D werden die Daten der Schwingung berechnet. Sie geben die jeweilige Entfernung aus der Ruhelage (= vom Wert 0) an. Die Standard Sinus-Funktion berechnet Werte im Bereich -1...+1

Man kann die Zellen der Reihe 13 (Record Nr. 1) markieren und die Formeln nach unten auasfüllen. In Zeile 453 wird mit Record Nummer 441 die Zeit 10ms erreicht.


Experimente

Verändern sie Frequenz (Zelle B1) und Amplitude(Zelle B2).

Beispiel: Bei einer Frequenz von 100Hz muss das Diagramm genau 1 volle Schwingung zeigen, bei 200Hz 2 Schwingungen usw.

Wellen-Formen

Die Programmierung erfordert mäßig fortgeschrittene Kenntnisse der Tabellen-Kalkulation.


 
D
E
1
0
Dreieck
2
1
Impuls
3
2
Rechteck
4
3
Sägezahn
5
4
Sinus
Verweis-Tabellen werden in der Informatik oft verwendet, um bestimmte Objekte mit Zahlen zu verknüpfen.
Die Beziehung ist 'umkehrbar eindeutig': Jeder Zahl entspricht genau 1 String, jedem String genau 1 Zahl.



Beschränkung der Eingabe
Es hängt vom Programm und seiner Version ab, wo man die dazu notwendigen Befehle findet.
LibreOffice und OpenOffice: Zelle markieren, Menü Daten / Gültigkeit

In Zelle B1 darf man nur Zahlen im Bereich 50...5000 eingeben.
In Zelle B2 darf man nur Zahlen im Bereich 0...1 eingeben.
In Zelle B3 darf man nur Werte aus der Liste E1:E5 eingeben.

Beim Anklicken der Zelle erscheint eine Aufklapp-Liste der möglichen Wellen-Formen.


Verwenden sie 'sprechende' Namen.
Die Namen dürfen nicht mit anderen Objekten kollidieren (z.B. Zeilen, Spalten oder Zellen (Der Name A1 ist verboten).
Namen sollten mit einem Buchstaben A..Za..z beginnen und danach nur Ziffern 0..9 oder Buchstaben A..Za..z oder das UnderLine-Zeichen _ enthalten.

Für das hier vorgestellte Beispiel werden folgende Namen empfohlen und in allen folgenden Kapiteln verwendet:
B1...frequenz
B2...amplitude
B3...typ
B5...typnr
B6...periodenzeit
B7...samplerate
B8...tsr


Die Programmierung wurde gegenüber dem ↑ einfachen Beispiel etwas erweitert. Außerdem werden nun Namen an Stelle von Adressen verwendet.

Verweis
Mit der Funktion VERWEIS() in Zelle B5 wird erstmals die bereits programmierte Verweis-Tabelle benutzt. Die Funktion übersetzt den in Zelle B3 ausgewählten String in die damit verknüpfte Zahl.


Die Programmierung folgt dem ↑ einfachen Beispiel.

Zusätzlich wird hier die Phase berechnet: Diese dimensions-lose Zahl gibt die relative Zeit zwischen Anfang und Ende einer Periode als Zahl im Bereich 0...2 an. Meist wird die Periode als Zahl 0...2*π angegeben, die hier verwendete Version erleichtert jedoch die Berechnung verschiedener Wellenformen.

Die Phase (Spalte D) wird in allen folgenden Formeln zur Berechnung verschiedener Wellenformeln verwendet. Man kann den Namen phase für den Bereich D12:D453 vergeben. Davon wird hier abgesehen, weil sich der Name nicht anpasst, wenn man die Anzahl der Records verändert.



Es ist eine unerwartet anspruchsvolle Aufgabe, für diese Funktion eine Formel zu entwickeln, die sich in 1 Zelle programmieren lässt.
Die hier vorgestellte Formel ist eine von mehreren Lösungen.

Die Formel wird von Zeile 12 bis 453 nach unten ausgefüllt.


In die Formel ist die relative Impuls-Dauer (rot) eingesetzt. Sie beträgt für einen 1:10 Impuls bei einer max. Phase von 2 den Wert 0.2

Die Formel wird von Zeile 12 bis 453 nach unten ausgefüllt.



Diese Formel entspricht einem Impuls mit Tast-Verhältnis 1:1

Die Formel wird von Zeile 12 bis 453 nach unten ausgefüllt.



Diese Wellenform wird mit einer besonders einfachen Formel programmiert.

Die Formel wird von Zeile 12 bis 453 nach unten ausgefüllt.


Die Trigonometrischen (Winkel)-Funktionen arbeiten in allen Programiersprachen mit dem Bogenmaß
Umrechnung Gradmaß (grad) ⇔ Bogenmaß (rad)
rad = grad * π / 180
grad = rad * 180 / π

Die Formel wird von Zeile 12 bis 453 nach unten ausgefüllt.


In Zelle B3 wird die ausgewählte Wellenform mit Funktion INDEX() selektiert:
Das 1. Argument bezeichnet den Bereich, aus dem das Ergebnis auszuwählen ist (hier alle berechneten Wellenformen F12:J453)
Das 2. Argument bezeichnet die gewünschte Zeile
Das 3. Argument bezeichnet die gewünschte Spalte
Zeile und Spalte werdenm (nicht so wie in der Informatik üblich) mit 1 beginnend gezählt.

Die einzelnen Wellenformen wurden mit der Amplitude -1...+1 berechnet. Daher muss man das Ergebnis in den von WAV-Dateien verwendeten Bereich -2^15...+2^15 umrechnen und auf ganze Zahlen RUNDEN()

Die Formel wird von Zeile 12 bis 453 nach unten ausgefüllt.



Das Diagramm sollte die berechnete Audio-Welle anzeigen.
Beispiel: Bei Frequenz=200Hz und Amplitude=100% werden genau 2 volle Perioden angezeigt.
Experimentieren sie mit den 3 Eingabe-Feldern !



Sperre: Das Kalkulations-Blatt wird gesperrt und mit Passwort gesichert. Voraussetzung: In allen für die Eingabe nötigen Zellen wurde die Sperre aufgehoben. Danach bleibt das Beispiel voll funktionsfähig: Man kann die Vorgaben (nur) im zugelassenen Bereich ändern. Man kann alle Formeln ansehen, jedoch nicht ändern.


Man müsste pro Audio-Sekunde 100mal mehr Daten berechnen, als in diesem Beispiel angegeben.
Eine Tabellen-Kalkulation kann keine binären Daten exportieren.
Beide Probleme kann man mit ergänzenden ↓ Basic-Programmen lösen.

Erzeugung einer WAV-Audio-Datei mit Basic

Ein Problem bei der Herstellung einer Audio-Datei ist die große Anzahl der notwendigen Daten (Records): Für jede Audio-Sekunde muss man 44100 Records berechnen - Das ist mit Tabellen-Kalkulation zwar möglich, aber nicht sinnvoll.

In diesem Beispiel wird daher die gesamte Berechnung mit Basic durchgeführt. Die dazu verwendeten Funktionen arbeiten genauso wie im oben vorgestellten Beispiel, berechnen, codieren und speichern jedoch 100mal so viele Daten.


Der Quelltext von Basic-Programmen wird in Modulen organisiert.
Erzeugen sie ein neues Basic-Modul und testen sie die Funktion.
Tragen sie z.B. diesen Basic-Quelltext ein:
Function basic_test(x)
basic_test = x * 2
End Function
Wechseln sie zum Kalkulationsblatt und probieren sie in einer Zelle aus, ob die Funktion korrekt ausgeführt wird:
=basic_test(12)
Das Ergebnis muss den doppelten Eingabe-Wert anzeigen (hier z.B. 24)
Details auf der → Basic-Webseite


Programmieren sie die Vorgaben so wie links gezeigt. Sie orientieren sich an den oben vorgestellten Beispielen.
Dazu kommt ein Eingabe-Feld für den Pfad der Audio-Datei, die herzustellen ist. Verwenden sie (auch auf Linux) die Datei-Endung .wav

Man kann die TypNr in Zelle B5 manuell als Ganze Zahl im Bereich 0...4 eingeben.
Bequemer ist die hier vorgestellte Lösung:
Programmieren sie im Bereich D1:E5 eine Verweis-Tabelle und beschränken sie die Eingabe in das Feld B3 auf die Liste E1:E5, sow eie im Beispiel ↑ Wellen-Formen beschrieben. Dann kann man die TypNr in B5 mit der angegebenen Formel berechnen.


Definieren sie Namen für die Eingabe-Felder: Verwenden sie dazu genau (!) die hier angegebenen Namen, damit das Basic-Programm aus diesen Zellen die gewünschten Parameter der Audio-Datei lesen kann:
B1...frequenz
B2...amplitude
B4...pfad
B5...typnr



Zur Anwendung ist das Verständnis der Programme nicht notwendig.
Sie sind jedoch im Quelltext kommentiert.

Das Modul lässt sich mit einstellbaren Vorgaben anpassen.
Fortgeschrittene AnwenderInnen sollten einen Blick in den Quelltext des Moduls werfen: Aus den anfangs definierten Konstanten kann man viel über die Funktion erfahren.



In die Ausgabe-Datei wird ein konstanter Header-Block geschrieben. Danach werden die Daten für 1 Sekunde Audio nach den Vorgaben berechnet und in die Datei eingetragen.

Die fertige Audio-Datei hat eine Größe von 88244 Bytes. Man kann sie mit jedem Audio-Player abspielen oder in eine → Webseite einbetten.
Die Audio-Datei wird bei jeder neuen Ausführung überschrieben: Daher kann man das Player-Fenster offen lassen und nach jeder Berechnung sofort das Ergebnis abspielen.



Wenn das Player-Programm konfiguriert ist, dann kann man im Kalkulations-Blatt einen zusätzlichen Button zum Abspielen der gerade erzeugten Audio-Datei anlegen.

Je nach PC und Betriebssystem muss man nach der Erzeugung 1-2 Sekunden mit dem Abspielen warten.
Fortgeschrittene EntwicklerInnen können ein zusätzliches Basic-Sub erstellen, welches die Audio-Datei erzeugt und automatisch abspielt.