Zum Inhalt

Sampled-Audio-Funktionen

Die Sampled-Audio-Funktionen von Syntherella bieten die Möglichkeit, spezifische Wellenformen zu erstellen, die über den integrierten Lautsprecher eines Computers wiedergegeben werden. Auf diese Weise ist es möglich, die Wechselbeziehungen zwischen Mathematik und den fundamentalen Strukturen von Klang zu erforschen.

Syntherella bietet im Wesentlichen drei spezialisierte Funktionen, die verschiedene Szenarien abdecken.

  • playfunction(...) ermöglicht es, eine Schallwelle durch Angabe ihrer zugrundeliegenden Funktion zu gestalten.
  • playlist(...) spielt einen Klang ab, der durch eine Liste von Samples definiert ist, die die Welle angeben.
  • playsin(...) spielt eine sin(x)-Welle mit angegebener Frequenz ab. Obertöne können ebenfalls angegeben werden.

Bevor wir diese Anweisungen im Detail beschreiben, geben wir eine kurze Erklärung (in Kürze) dieser Anweisungen und der Subtilitäten, die für die Erzeugung eines Audiosignals relevant sind.

Bei allen drei Funktionen ist die Amplitude des Gesamtsignals auf den Bereich (-1,0...1,0) begrenzt. Darüber hinaus muss die Summe aller angesammelten Audiosignale in diesem Bereich bleiben. Wir beginnen unsere Erklärungen mit der Funktion playsin(<real>). In ihrer einfachsten Form startet sie die Audiowiedergabe einer Sinuswelle mit einer bestimmten Frequenz. So erzeugt playsin(440) einen Sinuston mit 440 Hz, der genau eine Sekunde lang abgespielt wird. Man könnte versuchen, den folgenden Code zu verwenden, um einen einfachen Akkord zu erzeugen:

playsin(440);
playsin(440*5/4);
playsin(440*3/2);

Die Gesamtamplitude würde jedoch den möglichen Bereich überschreiten. Die Skalierung jedes Signals um einen Faktor von 1/3 löst das Problem. Dies kann durch den Modifizierer amp-><real> erreicht werden. Dieser Modifizierer skaliert die Amplitude jedes Signals. Der resultierende Code sieht wie folgt aus:

playsin(440,amp->1/3);
playsin(440*5/4,amp->1/3);
playsin(440*3/2,amp->1/3);

Jedes Mal, wenn die Funktion playsin aufgerufen wird, wird ein neuer Ton zu den bereits vorhandenen Klängen hinzugefügt. Wenn die Funktion playsin aufgerufen wird, während bereits ein Ton abgespielt wird, wird der alte Ton weiterhin abgespielt, während ein neuer Ton startet. Dies kann sehr schnell zu einer Situation führen, in der der Dynamikbereich -1,0...1,0 überschritten wird. Es gibt einen Modifizierer line-><int>, der hilft, solche Situationen zu vermeiden. Die Angabe von line->1 ordnet den Ton einer Ausgabeleitung zu, die höchstens einen Ton tragen kann. Zum Beispiel startet der Code

playsin(440,line->1);
wait(200);
playsin(550,line->1);
wait(200);
playsin(660,line->1);

einen ersten Ton mit 440 Hz ab, ersetzt ihn nach 0,2 Sekunden durch einen anderen Ton mit 550 Hz und startet nach weiteren 0,2 Sekunden einen anderen Ton, der eine volle Sekunde lang abgespielt wird. Es gibt noch eine weitere Subtilität, die auch durch den Modifizierer line gelöst wird. Wenn ein Ton durch einen anderen ersetzt wird, kann man a priori nicht davon ausgehen, dass der neue Ton in einer angemessenen Phasenposition relativ zum ersten startet. Der Modifizierer line kümmert sich automatisch um diese Problem. Anstatt einfach eine Welle durch eine andere zu ersetzen, ändert er die zeitliche Abfolge der zugrunde liegenden Wellen. Er geht sogar noch einen Schritt weiter und sorgt für einen sanften Übergang zwischen den beiden Frequenzen. Die Unterschiede sind in den Bildern unten dargestellt.

Ohne Phasenkorrektur Phasenkorrigiert Sanfter Übergang


Wiedergabe eines periodischen Signals, das durch Obertöne definiert ist: playsin(<real>)

Beschreibung: In seiner einfachsten Form spielt dieser Operator den Klang einer Sinuswelle mit konstanter Amplitude und Dauer von einer Sekunde ab. Die Dauer, Amplitude und Klangeigenschaften können durch geeignete Modifizierer verändert werden.

Modifizierer: Der Befehl hat mehrere Modifizierer.

Modifizierer Parameter Wirkung
amp 0,0 ... 1,0 globale Amplitude (Lautstärke) des Samples
damp <real> Faktor für exponentielle Dämpfung
harmonics <list> Spektrum des Tons
duration <real> Dauer der Wiedergabe
stop <real> gleich wie duration
line <number> or <string> eine dem Ton zugeordnete Sound-Leitung

Beispiele: Die einfachste Verwendung von playsin ist zum Beispiel gegeben durch

playsin(440)

Dies spielt einen Sinustonton mit 440 Hz ab. Wenn man dies ändert zu

playsin(440,damp->3,stop->5)

erzeugt es einen Ton, der 5 Sekunden dauert (stop->5) und eine exponentielle Dämpfung hat (damp->3). Man kann auch Obertöne hinzufügen, um den Klang komplexer zu gestalten. Obertöne werden durch eine Liste von Amplituden angegeben, die die Amplitude der verschiedenen Obertöne angeben. Der Code

playsin(440,damp->3,stop->5,harmonics->[0.5,0.3,0.2,0.1])

erzeugt eine Wellenform des Typs 0,5*sin(440*2*pi*x)+0,3*sin(2*440*2*pi*x)+0,2*sin(3*440*2*pi*x)+0,1*sin(4*440*2*pi*x).

Wiederum wird dies exponentiell gedämpft.


Wiedergabe eines Samples, das durch eine Funktion definiert ist: playfunction(<funct>)

Beschreibung: Nimmt eine Funktion als Eingabe und interpretiert sie als eine Wellenform. Die Zeiteinheit ist so, dass eine Einheit in der Funktion einer Sekunde entspricht.

Modifizierer: Der Befehl hat mehrere Modifizierer.

Modifizierer Parameter Wirkung
amp 0,0 ... 1,0 globale Amplitude (Lautstärke) des Samples
damp <real> Faktor für exponentielle Dämpfung
start <real> Startposition des Samples
stop <real> Endposition des Samples
duration <real> Dauer der Wiedergabe
line <number> or <string> eine dem Ton zugeordnete Sound-Leitung
silent <boolean> Wiedergabe unterdrücken
export <boolean> Sample-Daten exportieren

Beispiele: Der folgende Code erzeugt eine Sinuswelle mit 440 Hz.

playfunction(sin(440*x*pi*2))

Der folgende Code erzeugt ein exponentiell gedämpftes Rauschsignal.

playfunction(random(),damp->8)

Durch Angabe von start und stop kann man die Region einer Funktion, die für einen Sound-Sample verwendet wird, genau bestimmen. Diese Region kann sogar sehr kurz sein. Mit dem Modifizierer duration kann man erzwingen, dass das Sample immer wieder abgespielt wird. Der folgende Code tastet genau eine Sinuswelle ab und spielt sie immer wieder für eine Sekunde ab.

playfunction(sin(1000*x*2*pi),stop->1/1000,duration->1)

Die durch die Funktionsabtastung erzeugten Daten können auch in ein Array exportiert werden. Die Abtastrate beträgt 44100 Samples pro Sekunde. Der Export kann sogar stumm erfolgen. Zum Beispiel erzeugt der folgende Code eine Liste von 44 Sample-Punkten einer Sinuswelle.

sample=playfunction(sin(1000*x*2*pi),stop->1/1000,
                    silent->true,export->true)

Die durch diese Anweisung erzeugte Liste kann wiederum vom Operator playwave verwendet werden, der in der Lage ist, gesampelte Audiodaten wiederzugeben. Dies könnte zum Beispiel wie folgt geschehen:

playwave(sample,duration->1)

Wiedergabe eines Samples, das durch eine Liste definiert ist: playwave(<list>)

Beschreibung: Diese Anweisung erzeugt einen Klang, der durch eine Liste gesteuert wird, die Sample-Daten enthält. Die Werte der Samples werden angenommen, im Bereich -1,0...1,0 zu liegen. Die Abtastrate beträgt 44100 Samples pro Sekunde. Normalerweise wird das Sample immer wieder für eine Sekunde lang abgespielt. Die Spielzeit kann durch den Modifizierer duration geändert werden.

Modifizierer: Der Befehl hat mehrere Modifizierer.

Modifizierer Parameter Wirkung
amp 0,0 ... 1,0 globale Amplitude (Lautstärke) des Samples
damp <real> Faktor für exponentielle Dämpfung
duration <real> Dauer der Wiedergabe
line <number> or <string> eine dem Ton zugeordnete Sound-Leitung

Beispiel: Der folgende Code erzeugt drei Samples, die vom Operator playwave abgespielt werden. Obwohl nach der in wait angegebenen Zeit eine explizite Dauer angegeben ist, wird jedes Sample durch das nächste ersetzt, da alle Samples dieselbe Leitung verwenden. Bevor die Funktion playwave zum nächsten Sample übergehen kann, wird sichergestellt, dass das aktuelle Sample abgeschlossen wurde.

sample0=apply(1..200,sin(#*2*pi/200));
sample1=apply(1..100,sin(#*2*pi/100));
sample2=apply(1..50,sin(#*2*pi/50));
playwave(sample0,duration->1,line->1);
wait(400);
playwave(sample1,duration->1,line->1);
wait(400);
playwave(sample2,duration->1,line->1);

Beendigung von gestammeltem Audio: stopsound()

Beschreibung: Diese Anweisung beendet sofort alle gestammelten Audioklänge.



🤖 Diese Seite wurde automatisch mit KI (Claude) übersetzt und wartet noch auf Überprüfung. → Alle KI-übersetzten Seiten