Audacity: software libero di modifica e registrazione dell'audio

Linea di condotta per la pubblicità

Nyquist

  1. Introduzione alla programmazione Nyquist e Lisp
  2. Programmare in Nyquist
  3. Creare plug-in Nyquist

A partire dalla versione 1.1.1, Audacity vi permette di usare il linguaggio di programmazione Nyquist per scrivere i vostri plug-in effetti per Audacity. Diversamente dai plug-in VST e LADSPA, i plug-in Nyquist possono essere scritti usando un normale editor di testi e non devono essere compilati.

Nyquist è stato scritto da Roger B. Dannenberg ed è destinato a essere utilizzato come un linguaggio di programmazione per la sintesi e l'analisi audio, con il supporto per il formato MIDI, registrazione e riproduzione audio, I/O file, programmazione orientata agli oggetti, profilatura, correzione degli errori e altro ancora. Audacity utilizza solo un sottogruppo di funzioni di Nyquist, che vi permette di adottare semplici funzioni di Nyquist e di usarle per elaborare i dati audio. Audacity non comprende alcun supporto per la correzzione del codice Nyquist, quindi se state cercando di scrivere un complicato plug-in, può risultare più facile ottenere la versione completa di Nyquist e svilupparlo in essa, poi inserirlo come plug-in in Audacity. Nyquist è disponibile presso il Carnegie Mellon University Computer Music Project:

Nyquist supporta sia una sintassi Lisp sia una sintassi più convenzionale denominata SAL. Le versioni di Audacity precedenti alla 1.3.8 supportano solo Lisp, ma la versione corrente Audacity 2.0 supporta Lisp e SAL. Per scrivere plug-in da usare con Audacity, scegliete il manuale Nyquist appropriato per la vostra versione di Audacity e la sintassi preferita:

È da notare che non è necessario scaricare Nyquist per scrivere semplici plug-in da usare con Audacity. Tutte le istruzioni di base necessarie per lavorare con Lisp e il manuale 2.37 sono più avanti. Se volete esplorare SAL e le ultime funzioni di Nyquist in Audacity, consultate Nyquist documentation nel Wiki.

Lisp

Nyquist è basato su Lisp. Se in precedenza avete programmato in Lisp, è possibile saltare questa sezione o andare direttamente alla pagina successiva. Altrimenti, questa è una introduzione molto breve su Lisp:

In Lisp (e quindi in Nyquist), ogni cosa è una S-Expression, che è un elenco di token (parole) separate da uno spazio vuoto e racchiuse tra parentesi. Il nome della funzione è sempre il primo token in una S-Expression, e tutti gli altri token sono argomenti di questa funzione. Ecco un semplice esempio:

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

Suddividiamo questo esempio. La S-expression più esterna ha tre elementi. Il primo, setf, è il nome della funzione (sta per campo impostazione). setf è usato per assegnare un valore a una variabile. (Vi sono altre funzioni simili, come set e setq, ma setf è la più potente, per cui è quella che utilizzeremo nei nostri esempi). Dopo setf viene area, che è il nome della variabile che si deve impostare. Poi viene il valore da assegnare a questa variabile, che in questo caso è un'altra S-expression.

Lisp non ha alcun operatore speciale per le funzioni matematiche - queste sono invece funzioni come tutte le altre, usando prefisso notazione, in cui il nome della funzione (o operatore) viene prima dei suoi argomenti. Così invece di 3*7 per il prodotto di 3 e 7, in Lisp si deve scrivere (* 3 7). In Nyquist, la funzione expt (esponente) eleva il suo primo argomento alla potenza del secondo argomento. Perciò (* 3.14159 (expt radius 2)) indica 3.14159 volte il quadrato di radius, o la formula per l'area di un cerchio.

Piuttosto che digitare ogni volta l'espressione completa, definite una funzione per l'area del cerchio, che potrete richiamare ogni volta che serve:

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

La funzione defun è usata per definire una nuova funzione. Il primo argomento è il nome della funzione, in questo caso circlearea. Il secondo argomento è un elenco di argomenti per la funzione che deve essere definita - questo è uno dei pochi casi in cui avete una S-expression che non è interpretata come una funzione da richiamare. Infine l'ultima espressione è il valore della funzione. Ora se volete calcolare l'area di un cerchio di raggio r, dovete calcolare:

  (setf area (circlearea r))

Una S-expression è una rappresentazione di una lista. Lisp usa le liste per rappresentare ogni cosa (il nome LISP deriva da LISt Processing language), per cui è utile sapere come manipolare le liste. Iniziamo assegnando una lista di numeri a una variabile. È possibile rapidamente fare questo:

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

La ragione per cui questo non funziona è che ogni volta che Nyquist vede una S-expression, cerca di valutarla come una funzione a meno che non gli sia stato indicato diversamente. Dal momento che non c'è alcuna funzione denominata "1" che accetta argomenti (2 3 4 5), questo genererà un errore. Per indicare a Lisp che volete trattare una S-expression letteralmente, e non valutarla come una funzione, dovete metterla tra virgolette. In Nyquist, è possibile mettere tra virgolette una lista inserendo una singola virgoletta prima di essa, in questo modo:

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

Nyquist inoltre fornisce una funzione list che è possibile usare per costruire le liste - questa è utile se alcuni elementi della lista sono funzioni:

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

Per ottenere cose fuori da una lista, è possibile usare le funzioni first e rest. (Tradizionalmente, queste sono denominatecar e cdr, rispettivamente, ma first e rest sono molto più facili da ricordare. Ambedue i nomi sono supportati in Nyquist.) L'uscita di (first mylist) è 1, e l'uscita di (rest mylist) è la lista (2 3 4 5). Pertanto il secondo elemento della lista è (first (rest mylist)).

Riferimento funzione Lisp

Ecco un elenco di alcune funzioni base Lisp di cui potreste avere bisogno. Per un elenco completo delle funzioni Lisp / Nyquist, leggete il Manuale di riferimento di Nyquist versione 2.37.

Nota: I simboli in Nyquist (come i nomi delle variabili e i nomi delle funzioni) non sono sensibili a maiuscolo/minuscolo. Sono convertiti internamente in lettere maiuscole.

Funzioni matematiche

(+ a b)addizione
(- a b)sottrazione
(* a b)moltiplicazione
(/ a b)divisione
(truncate a b)arrotondamento a numero intero
(float a b)da intero a punto mobile
(rem a b c ...)resto
(min a b c ...)minimo
(max a b c ...)massimo
(abs a)valore assoluto
(random n)intero casuale tra 1 e n-1
(sin a b)seno
(cos a b)coseno
(tan a b)tangente
(expt a b)esponente (a alla potenza di b)
(sqrt a b)radice quadrata
(< a b)controllo per minore di b
(<= a b)controllo per a meno o uguale a b
(> a b)controllo per a maggiore di b
(>= a b)controllo per a maggiore o uguale a b
(= a b)controllo per l'uguaglianza
(/= a b)controllo per la diseguaglianza

Elenco delle funzioni

(first l)primo elemento di una lista (car)
(rest l)resto dela lista (cdr)
(reverse l)invertire una lista
(list a b ...)costruire una lista
(append l1 l2)aggiungere due liste
(length l)lunghezza di una lista
(maplist function l)applicare una funzione a ogni elemento in una lista

Control

(if expr expr1 expr2)se l'espressione è vera, valutate l'espressione 1, altrimenti valutate l'espressione 2

Successivo: Programmare in Nyquist