Audacity: Freier und kostenloser Audioeditor und Aufnahmesoftware

Werbepolitik

Nyquist

  1. Einführung in die Nyquist und Lisp Programmierung
  2. Programmierung in Nyquist
  3. Erstellung von Nyquist Plugins

Seit Version 1.1.1, ermöglicht Audacity Ihnen die Nyquist Programmiersprache zu nutzen, um Ihre eigenen Plugin Effekte für Audacity zu schreiben. Anders als VST und LADSPA Plugins, können Nyquist Plugins mit einem normalen Texteditor geschrieben werden und müssen nicht kompiliert werden.

Nyquist wurde von Roger B. Dannenberg geschrieben und soll als eine komplette Progammiersprache für Audiosynthese und -analyse, mit MIDI-Unterstützung, Audioaufnahme und -wiedergabe, Dateiein- und -ausgabe, objektorientierte Programmierung, Profilierung, Fehlersuche und vieles mehr dienen. Audacity verwendet nur einen Teil der Nyquist-Funktionalität, indem es Ihnen ermöglicht, mit einfachen Nyquist-Funktionen Ihre Audiodaten zu verarbeiten. Audacity bietet keine Unterstützung, den Nyquist-Code nach Fehlern zu untersuchen (Debugging). Wenn Sie also vorhaben, komplexe Plug-Ins zu schreiben, könnte es für Sie einfacher sein, Ihre Entwicklung mit der Nyquist-Vollversion durchzuführen und diese dann in ein Audacity-Plug-In umzuwandeln. Nyquist ist erhältlich vom Carnegie Mellon University Computer Music Project:

Nyquist unterstützt sowohl die Lisp-Syntax wie auch eine eher konventionelle Syntax, die SAL genannt wird. Audacity-Versionen vor 1.3.8 unterstützen nur Lisp, aber die aktuelle Audacity-2.0-Linie unterstützt sowohl Lisp als auch SAL. Um Plug-Ins für Audacity zu schreiben, wählen Sie das passende Nyquist-Handbuch für Ihre Audacity-Version sowie die bevorzugte Syntax:

Sie müssen Nyquist nicht runterladen, um einfache Plug-Ins für Audacity to schreiben. Alle grundlegenden Anweisungen, die Sie für die Arbeit mit Lisp und dem 2.37-Handbuch benötigen, finden Sie weiter unten. Wenn Sie auch tiefer in SAL und die neuesten Nyquist-Funktionen eintauchen möchten, schauen Sie unter derNyquist-Dokumentation auf dem Wiki.

Lisp

Nyquist basiert auf Lisp. Wenn Sie schon mal in Lisp programmiert haben, können Sie dieses Kapitel überfliegen oder direkt zur nächsten Seite gehen. Anderenfalls, ist hier eine extrem kurze Einführung in Lisp:

In Lisp (und daher auch in Nyquist) ist alles eine S-Expression (S-Ausdruck). Das ist eigentlich nur eine Liste von Tokens (Wörter), getrennt durch Whitespaces (Leerzeichen, Tabs oder andere nicht sichtbare Zeichen) sowie umgeben von Klammern. Den Funktionsnamen finden Sie immer im ersten Token einer S-Expression und alle folgenden Tokens sind die Argumente für diese Funktion. Hier folgt ein einfaches Beispiel:

  (setf area (* 3.14159 (expt radius 2)))

Lassen Sie uns dieses Beispiel mal auseinandernehmen. Die äusserste S-Expression (S-Ausdruck) hat drei Teile. Das erste, setf, ist der Name der Funktion (es steht für set-field). setf wird dazu benutzt, einen Wert einer Variable zuzuweisen. (Es gibt zwar noch andere, ähnliche Funktionen, wie set und setq, aber setf ist die mächtigste, deshalb benutzen wir sie in unseren Beispielen.) Nach setf kommt area, welches den Namen der Variable darstellt, deren Wert wir setzen wollen. Dnach kommt der Wert, der dieser Variable zugewiesen werden soll, welcher in diesem Fall eine weitere S-Expression ist.

Lisp hat keine speziellen Operatoren für mathematische Funktionen - das sind Funktionen wie alle anderen und verwenden die Präfix -Notation, wo der Name der Funktion (oder des Operators) vor seinen Argumenten kommt. Das Produkt von 3 und 7 schreiben Sie also, anstelle von 3*7, in Lisp wie folgt: (* 3 7). In Nyquist rechnet die expt (Exponenten-)Funktion das erste Argument 'hoch' das zweite Argument. Deshalb (* 3.14159 (expt radius 2)) bedeutet 3.14159-mal das Quadrat von radius, oder die Formel für die Fläche eines Kreises.

Anstatt jedes Mal diesen ganzen Ausdruck zu tippen, definieren wir eine Funktion zur Berechnung der Kreisfläche, die wir jedes Mal aufrufen können, wenn wir sie brauchen:

  (defun circlearea (radius) (* 3.14159 (expt radius 2)))
  

Die defun-Funktion wird verwendet, um eine neue Funktion zu definieren. Das erste Argument ist der Funktionsname, in diesem Fall circlearea. Das zweite Argument ist eine Liste von Argumenten, die der neu zu definierenden Funktion übergeben werden soll - das ist einer der wenigen Fälle, wo sie eine S-Expression (S-Ausdruck) haben, die nicht als Funktionsaufruf interpretiert wird. Der letzte Ausdruck ist der Wert der Funktion. Wenn wir nun die Fläche eines Kreis mit Radius r ausrechnen wollen, müssen wir nur rechnen:

  (setf area (circlearea r))

Eine S-Expression (ein S-Ausdruck) ist einfach eine Darstellung einer Liste. Lisp verwendet Listen, um eigentlich alles darzustellen (der Name LISP kommt von LISt Processing language, also Listenverarbeitungssprache). Daher ist es hilfreich, wenn man weiss, wie man Listen manipuliert. Fangen wir damit an, eine Liste von Zahlen einer Variable zuzuweisen. Sie können so in etwa folgendes machen:

  (setf mylist (1 2 3 4 5))  <--  error!
  

Der Grund, warum dies nicht funktioniert, liegt darin, dass Nyquist immer dann, wenn es eine S-Expression vorfindet, versucht, die S-Expression als Funktion zu interpretieren; es sei denn, man sagt Nyquist, dass es dies nicht tun soll. Da es keine Funktion mit Namen "1" gibt, welche die Argumente (2 3 4 5) akzeptiert, erzeugt dies einen Fehler. Um Lisp zu sagen, dass Sie eine S-Expression als Literal (also buchstäblich) behandelt und nicht als eine Funktion interpretiert haben wollen, müssen Sie sie entsprechend kennzeichnen (quote). In Nyquist kennzeichnen Sie eine Liste mit einem einfachen Anführungszeichen (Hochkomma) wie folgt:

  (setf mylist \'(1 2 3 4 5))
  

Nyquist stellt auch eine list Funktion bereit, die Sie benutzen können, um listen zu konstruieren - dies ist nützlich wenn einige der Elemente der Liste Funktionen sind:

  (setf mylist (list 1 2 3 4 (sqrt 25)))

Um Elemente aus einer Liste zu entfernen, verwenden sie die first und rest -Funktionen. (Traditionell werden sie car bzw. cdr genannt, aber first und rest kann man sich viel leichter merken. Beide Namensvarianten sind in Nyquist unterstützt.) Die Ausgabe von (first mylist) ist 1 und die Ausgabe von (rest mylist) ist die Liste (2 3 4 5). Demnach ist das zweite Element der Liste (first (rest mylist)).

Lisp Funktionsreferenz

Hier ist eine Liste einiger Basis lisp-Funktionen, die Sie möglicherweise benötigen. Für eine vollständige Liste von Lisp / Nyquist Funktionen, siehe im Nyquist Version 2.37 Referenz Handbuch.

Hinweis: Symbole in Nyquist (wie Variablen Namen und Funktionsnamen) sind nicht Groß-/Kleinschreibung abhängig. Sie werden intern zu Großbuchstaben konvertiert.

Mathematische Funktionen

(+ a b)Addition
(- a b)Subtraktion
(* a b)Multiplikation
(/ a b)Division
(truncate a b)nach unten auf die nächste ganze Zahl abrunden (floor)
(float a b)Ganzzahl nach Fliesskommazahl
(rem a b c ...)Rest
(min a b c ...)Minimum
(max a b c ...)Maximum
(abs a)Absoluter Wert
(random n)Zufallszahl (Ganzzahl) zwischen 1 und n-1
(sin a b)Sinus
(cos a b)Cosinus
(tan a b)Tangens
(expt a b)Exponent (a hoch b)
(sqrt a b)Quadratwurzel
(< a b)Test für a kleiner als b
(<= a b)Test für a kleiner oder gleich b
(> a b)Test für a größer als b
(>= a b)Test für a größer oder gleich b
(= a b)Test für Gleichheit
(/= a b)Test für Ungleichheit

Listenfunktionen

(first l)erstes Element einer Liste (car)
(rest l)Rest der Liste (cdr)
(reverse l)eine Liste umkehren
(list a b ...)eine Liste erstellen
(append l1 l2)eine Liste an eine andere Liste anhängen
(length l)Länge einer Liste
(maplist function l)eine Funktion auf jedes Element einer Liste anwenden

Steuerung

(if expr expr1 expr2)Falls expr wahr ist, ergibt expr1, sonst expr2

Nächstes: Programmierung in Nyquist