Audacity: Fri ljudredigerare och ljudinspelare

Advertisements Policy

Nyquist

  1. Introduktion till Nyquist- och Lisp-programmering
  2. Programmera i Nyquist
  3. Skapa Nyquist-insticksprogram

Från och med version 1.1.1, tillåter Audacity dig att använda programmeringsspråket Nyquist för att skriva egna instickseffekter för Audacity. Till skillnad från VST- och LADSPA-insticksprogram, så kan Nyquist-insticksprogram skrivas med en vanlig texteditor och behöver inte kompileras.

Nyquist was written by Roger B. Dannenberg and was intended to be used as a complete programming language for audio synthesis and analysis, with support for MIDI, audio recording and playback, file I/O, object-oriented programming, profiling, debugging and more. Audacity uses only a subset of Nyquist's functionality, allowing you to take simple Nyquist functions and use them to process audio data. Audacity doesn't include any support for debugging Nyquist code, so if you are trying to write a complicated plug-in, you may find it easier to get the full version of Nyquist and develop there, then turn it into an Audacity plug-in. Nyquist is available from the Carnegie Mellon University Computer Music Project:

Nyquist supports both a Lisp syntax and a more conventional syntax called SAL. Audacity versions prior to 1.3.8 only support Lisp, but the current Audacity 2.0 series supports both Lisp and SAL. To write plug-ins for use with Audacity, choose the appropriate Nyquist Manual for your version of Audacity and preferred syntax:

Note that you don't need to download Nyquist in order to write simple plug-ins to use with Audacity. All the basic instructions you need to work with Lisp and the 2.37 Manual are below. If you want to explore SAL as well, and for the latest Nyquist features in Audacity, see Nyquist Documentation on the Wiki.

Lisp

Nyquist är baserad på Lisp. Om du har programmerat i Lisp tidigare, kan du skumma igenom denna del eller gå direkt till nästa sida. Annars kommer här en extremt kort introduktion i Lisp:

I Lisp (och sålunda även i Nyquist) är allting ett S-uttryck, vilket bara är en lista av token (ord) åtskilda av mellanslag och omgivna av parenteser. Funktionens namn är alltid det första token som finns i S-uttrycket, och alla övriga token är argument till denna funktion. Här ges ett enkelt exempel:

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

Låt oss titta närmare på detta exempel. Det yttersta S-uttrycket har tre medlemmar. Den första, setf, är funktionens namn (det står för 'set-field'). setf används för att tilldela ett värde till en variabel. (Det finns andra liknande funktioner, som set och setq, men setf är den kraftfullaste av dem, så det är den vi kommer att använda i våra exempel.) Efter setf kommer area, som är namnet på den variabel som vi vill tilldela ett värde. Därefter kommer det värde som vi vill tilldela, vilket i detta fall är ytterligare ett S-uttryck.

Lisp har inte några speciella operatorer för matematikfunktioner - de är funktioner som allting annat, och använder sig av prefixnotation, där funktionens namn (eller operatorn) skrivs före sina argument. Så istället för att skriva 3*7 för att få produkten av 3 och 7, skriver du i Lisp (* 3 7). I Nyquist upphöjer funktionen expt (exponent) sitt första argument till det andra. Därför betyder (* 3.14159 (expt radius 2)) 3,14159 gånger kvadraten av radius, formeln för att få arean av en cirkel.

Istället för att behöva skriva in hela detta uttryck varje gång, så definierar vi en funktion för att beräkna arean av en cirkel som vi därefter kan anropa när vi behöver den:

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

Funktionen defun används för att definiera en ny funktion. Det första argumentet är funktionsnamnet, i detta fall circlearea. Det andra argumentet är en lista av argument till den funktion som skall definieras - detta är ett av de få fall där du har ett S-uttryck som inte tolkas som ett funktionsanrop. Slutligen anger det sista uttrycket funktionens värde. I fortsättningen när vi vill beräkna arean av en cirkel med radien r, så behöver vi enbart beräkna:

  (setf area (circlearea r))

Ett S-uttryck är enbart en representation av en lista. Lisp använder listor för att representera i princip allting (namnet LISP kommer ifrån LISt Processing language), så det hjälper om man vet hur man behandlar listor. Låt oss börja med att tilldela en variabel en lista av tal. Du kan inte riktigt göra så här:

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

Detta fungerar inte eftersom närhelst Nyquist ser ett S-uttryck så försöker det utvärdera det som en funktion, om du inte uttryckligen säger något annat. Eftersom det inte finns någon funktion vid namn "1" som tar argumenten (2 3 4 5) genereras ett fel. För att tala om för Lisp att du vill att ett S-uttryck skall behandlas ordagrant och inte utvärderas som en funktion, så citerar du det. I Nyquist kan du citera en lista genom att placera ett enkelt citationstecken framför den, så här:

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

Nyquist tillhandahåller också funktionen list som du kan använda för att skapa listor - detta är användbart om några av elementen i listan är funktioner:

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

För att hämta saker från en lista kan du använda funktionerna first och rest. (De brukade kallas car och cdr, men first och rest är mycket enklare att komma ihåg. Båda namnvarianterna stöds i Nyquist.) Resultatet av (first mylist) är 1 och resultatet av (rest mylist) är listan (2 3 4 5). Så det andra elementet i listan är (first (rest mylist)).

Funktionsreferens för Lisp

Här är några av de grundläggande lispfunktioner som du kan tänkas behöva. För en fullständig lista av funktioner i Lisp / Nyquist hänvisar vi till Nyquist version 2.37 Reference Manual.

Obs: Symboler i Nyquist (som variabelnamn och funktionsnamn) är inte skiftlägeskänsliga. De konverteras internt till stora bokstäver.

Matematikfunktioner

(+ a b)addition
(- a b)subtraction
(* a b)multiplication
(/ a b)division
(truncate a b)round down to integer (floor)
(float a b)integer to floating-point
(rem a b c ...)remainder
(min a b c ...)minimum
(max a b c ...)maximum
(abs a)absolute value
(random n)random integer between 1 and n-1
(sin a b)sine
(cos a b)cosine
(tan a b)tangent
(expt a b)exponent (a to the power of b)
(sqrt a b)square root
(< a b)test for a less than b
(<= a b)test for a less than or equal to b
(> a b)test for a greater than b
(>= a b)test for a greater than or equal to b
(= a b)test for equality
(/= a b)test for inequality

Listfunktioner

(first l)first element of a list (car)
(rest l)rest of the list (cdr)
(reverse l)reverse a list
(list a b ...)construct a list
(append l1 l2)append two lists
(length l)length of a list
(maplist function l)apply a function to every element in a list

Kontrollfunktioner

(if expr expr1 expr2)if expr is true, evaluates expr1, otherwise evaluates expr2

Nästa: Programmera i Nyquist