Audacity: vrije geluidseditor en opnamesoftware

Reclamebeleid

Nyquist

  1. Inleiding in Nyquist en Lisp programmeren
  2. Programmeren in Nyquist
  3. Nyquist-plugins aanmaken

Vanaf versie 1.1.1 van Audacity is het mogelijk uw eigen plugineffecten te schrijven met de Nyquist programmeertaal. In tegenstelling tot VST en LADSPA plugins, kunnen Nyquist plugins geschreven worden met een gewone tekstverwerker en hoeven ze niet te worden gecompileerd (= in machinetaal omgezet te worden).

Nyquist is geschreven door Roger B. Dannenberg en is bedoeld om gebruikt worden als een complete programmeertaal voor synthese en analyse van audio, met ondersteuning voor MIDI, audio-opname en afspelen, bestands-in- en -uitvoer, objectgeoriënteerd programmeren, profileren, debuggen en nog veel meer. Audacity gebruikt alleen een subset van de functionaliteit van Nyquist, waardoor u eenvoudige functies van Nyquist kunt gebruiken om audiodata te bewerken. In Audacity zit geen ondersteuning om Nyquist code te debuggen, dus als u een gecompliceerde plugin probeert te schrijven, vindt u het misschien gemakkelijker om de volledige versie van Nyquist te gebruiken om daarmee te ontwikkelen, en het dan om te zetten in een plugin voor Audacity. Nyquist wordt beschikbaar gesteld door het Carnegie Mellon University Computer Music Project:

Nyquist ondersteunt Lisp syntax en een meer conventionele syntax die SAL genoemd wordt. Audacity-versies vóór 1.3.8 ondersteunen alleen Lisp, maar de huidige 2.0-reeks ondersteunt beide. Om plugins te schrijven voor gebruik met Audacity, kiest u de overeenkomstige Nyquist-handleiding voor uw versie van Audacity en voorkeursyntax:

Merk op dat u Nyquist niet moet downloaden om simpele plugins voor Audacity te schrijven. Alle basisinstructies die u nodig heeft om te kunnen werken met Lisp en de 2.37 handleiding staan hieronder. Als u ook SAL wilt uitproberen, en voor de laatste Nyquist-functies in Audacity bèta, zie Nyquist-documentatie op de Wiki.

Lisp

Nyquist is gebaseerd op Lisp. Als u al eens in Lisp geprogrammeerd heeft, kunt u dit gedeelte snel overlezen of direct naar de volgende pagina gaan. Anders is hier een extreem korte introductie op Lisp:

In Lisp (en daardoor Nyquist) is alles een S-Expressie, wat eigenlijk gewoon een lijst van tekens (woorden) is, gescheiden door spaties en ingesloten door haakjes. De naam van de functie is altijd het eerste teken in een S-expressie, en alle andere tekens zijn argumenten voor deze functie. Hier is een simpel voorbeeld:

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

Laten we dit voorbeeld in detail bekijken. De buitenste S-expressie telt drie leden. De eerste, setf, is de naam van de functie (hij betekent set-field). setf wordt gebruikt om een waarde toe te kennen aan een variabele. (Er zijn nog andere dergelijke functies, zoals set en setq, maar setf is de krachtigste, dus zullen wij die in onze voorbeelden gebruiken.) Na setf komt area, wat de naam is van de variabele die we gaan instellen. Vervolgens komt de waarde die wij aan deze variabele willen toekennen, wat in dit geval weer een S-expressie is.

Lisp heeft geen operatoren voor wiskundige functies - het zijn allemaal functies, die net als al het overige, een voorvoegselnotatie gebruiken, waarbij de naam van de functie (of operator) vóór zijn argumenten geplaatst is. Dus in plaats van 3*7 voor het product van 3 en 7, zult u in Lisp (* 3 7) schrijven. In Nyquist, geeft expt (exponent) aan dat het tweede argument een macht is van het eerste argument. Daarom betekent (* 3.14159 (expt radius 2)) 3.14159 keer het kwadraat van radius, of de formule voor de oppervlakte van een cirkel.

In plaats van deze volledige uitdrukking elke keer in te typen, zullen we een functie definiëren voor de oppervlakte van de cirkel, die we elke keer kunnen oproepen als we hem nodig hebben:

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

De functie defun wordt gebruikt om een nieuwe functie te definiëren. Het eerste argument is de naam van de functie, in dit geval circlearea. Het tweede argument is een lijst van argumenten voor de functie die gedefinieerd wordt - dit is een van de weinige gevallen waarin u een S-expressie heeft die niet geïnterpreteerd wordt als een functie-oproep. Tot slot is de laatste expressie de waarde van de functie. Als we nu de oppervlakte van een cirkel willen berekenen met straal r, hoeven we alleen maar te berekenen:

  (setf area (circlearea r))

Een S-expressie stelt alleen maar een lijst voor. Lisp gebruikt lijsten om zo ongeveer alles voor te stellen (de naam LISP komt van LISt Processing language), dus kan het handig zijn te weten hoe u lijsten kunt bewerken. Laten we beginnen met een lijst getallen aan een variabele toe te kennen. Dit lukt niet goed zo:

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

De reden waarom dit niet werkt is, dat als Nyquist een S-expressie ziet, het programma het tracht te evalueren als een functie, tenzij u het een andere instructie geeft. Aangezien er geen functie bestaat die "1" heet en de argumenten (2 3 4 5) accepteert, levert dit een foutmelding op. Om Lisp te vertellen dat u een S-expressie letterlijk wilt nemen, en die niet wilt evalueren als een functie, moet u er aanhalingstekens bij zetten. In Nyquist kunt u een lijst citeren door er een enkel aanhalingsteken vóór te plaatsen, en wel als volgt:

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

Nyquist voorziet ook in een list functie die u kunt gebruiken om lijsten te construeren - dit is handig als enkele elementen in de lijst functies zijn:

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

Om dingen uit een lijst te halen kunt u de first en rest functies gebruiken. (Traditioneel werden deze respectievelijk car en cdr genoemd, maar first en rest zijn veel gemakkelijker te onthouden. Beide sets namen worden in Nyquist ondersteund.) Het resultaat van (first mylist) is 1, en het resultaat van (rest mylist) is de lijst (2 3 4 5). Dus het tweede element van de lijst is (first (rest mylist)).

Lisp functiereferentie

Dit is een lijst met een paar basisfuncties in lisp die u misschien nodig heeft. Voor een complete lijst met Lisp / Nyquist functies, zie de Nyquist versie 2.37 Referentiehandleiding.

Opmerking: Symbolen in Nyquist (zoals variabele namen en functienamen) zijn niet hoofdlettergevoelig. Ze worden intern omgezet naar hoofdletters.

Wiskundige functies

(+ a b)optellen
(- a b)aftrekken
(* a b)vermenigvuldigen
(/ a b)delen
(truncate a b)afronden naar beneden naar geheel getal (floor)
(float a b)geheel getal naar zwevend punt
(rem a b c ...)rest
(min a b c ...)minimum
(max a b c ...)maximum
(abs a)absolute waarde
(random n)willekeurig cijfer tussen 1 en n-1
(sin a b)sinus
(cos a b)cosinus
(tan a b)tangens
(expt a b)exponent (a tot de macht b)
(sqrt a b)vierkantswortel
(< a b)test op a kleiner dan b
(<= a b)test op a kleiner dan of gelijk aan b
(> a b)test op a groter dan b
(>= a b)test op a groter dan of gelijk aan b
(= a b)test op gelijkheid
(/= a b)test op ongelijkheid

Lijstfuncties

(first l)eerste element van een lijst (car)
(rest l)rest van de lijst (cdr)
(reverse l)omgekeerde van een lijst
(list a b ...)construeer een lijst
(append l1 l2)twee lijsten aan elkaar hangen
(length l)lengte van een lijst
(maplist function l)pas een functie toe op elk element in een lijst

Bediening

(if expr expr1 expr2)indien expr waar is, evalueert hij expr1, anders evalueert hij expr2

Volgende: Programmeren in Nyquist