Audacity: El programa libre para la edición y grabación de audio

Política de la lista de anuncios

Nyquist

  1. Introducción a Nyquist y a la programación en Lisp
  2. Programar en Nyquist
  3. Creación de complementos Nyquist

Desde la versión 1.1.1, Audacity permite usar el lenguaje de programación Nyquist para crear sus propios complementos para Audacity. Al contrario que los complementos para VST y LADSPA, los complementos Nyquist pueden crearse usando un editor de texto normal y no necesitan compilarse.

Nyquist fue escrito por Roger B. Dannenberg y estaba originalmente destinado a se utilizado como un lenguaje de programación completo para la síntesis y el análisis de audio, con compatibilidad con MIDI, grabación y reproducción de audio, entrada y salida de archivos, programación orientada a objetos, prerrelleno, depuración y más. Audacity sólo usa una parte de las funciones de Nyquist, permitiéndole usar funciones simples de Nyquist y usarlas para procesar datos de audio. Audacity no incluye compatibilidad para depurar código de Nyquist, así que si usted intenta crear un complemento complejo, puede que le sea más fácil adquirir la versión completa de Nyquist y trabajar con ella, y más tarde convertir el resultado en un plug-in de Audacity. Nyquist puede obtenerse del Carnegie Mellon University Computer Music Project:

Nyquist permite tanto la sintaxis Lisp como una sintaxis más convencional llamada SAL.Las versiones de Audacity previas a la 1.3.8 sólo permiten Lisp, pero la vrsión actual de Audacity 2.0 permiten tanto Lisp como SAL. Para escribir complementos para trabajar con Audacity, seleccione el manual Nyquist más adecuado para su versión y su sintaxis preferida:

Tenga en cuenta que no necesita descargar Nyquist para escribir complementos sencillos para Audacity. Todas las instrucciones elementales que se necesitan para trabajar con Lisp y el manual 2.37 se encuentran aquí. Si quiere explorar las posibilidades de SAL y conocer las últimas características de Nyquist en Audacity, consulte Referencia de complementos Nyquist en el Wiki.

Lisp

Nyquist está basado en Lisp. Si ya ha programado anteriormente en este lenguaje puede saltarse esta sección e ir directamente a la página siguiente. Si no es así, esta es una brevísima introducción a Lisp:

En Lisp (y por extensión en Nyquist), todo es una -sexpresión, es decir, una lista de elementos (palabras) separados por espacios y encerrados entre paréntesis. El nombre de la función es siembre el primer elemento en una expresión y el resto de elementos son argumentos de la función. Este sería un ejemplo sencillo:

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

Analicemos este ejemplo. La parte más exterior de la s-expresión tiene tres partes. El primero, setf, es el nombre de la función (viene de establecer campo). setf se emplea para asignar un valor a la variable (existen otras funciones similares como set y setq, pero setf es la más potente, así que es la que utilizaremos en los ejemplos. Tras setf aparece area, que es el nombre de la variable a la que le vamos a asignar el valor. A continuación aparece que valor, que en este caso es otra s-expresión-S.

Lisp no cuenta con ningún operador expecífico para funciones matemáticas. Todas son funciones como las demás. Utilizando la notación prefix , donde el nombre de la función (u operador) aparece antes de sus argumentos. Así que en lugar de 3*7 para multiplicar 3 y 7, en Lisp escribiríamos (* 3 7). En Nyquist la función exponente expt eleva el primer arggumento a la potencia del segundo. Por tanto, (* 3.14159 (expt radius 2)) significa 3.14159 vece el cuadrado de radius, o la fóruma del área de un círculo.

En lugar de escribir una expresión completa cada vez podemos definir una función para el área del círculo a la que llamaremos cada vez que la necesitemos:

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

El defun function se emplea para definir una nueva función. El primer argumento es el nombre de la función, en este caso circlearea. El segundo argumento es una lista de argumentos que se definiran en la función. Este es uno de los pocos casos donde podemos tener una s-expresión que no se interpreta como una llamada a otra función. Para terminar, la última expresión es el valor de la función. Ahora si queremos calcular el área de un círculo de radio r, sólo tenemos que hacer:

  (setf area (circlearea r))

Una s-expresión es una simple representación de una lista. Lisp utiliza las listas para representar prácticamente todo (el nombre LISP viene de LISt Processing language), así que es muy útil saber manipular listas. Comencemos asignando una lista de números a una variable. Se puede hacer así:

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

La razón por la que esto no funciona es que cada vez que Nyquist encuentra una s-expresión intenta evaluarla como una función a no ser que se le indique lo contrario. Como no existe una función denominada "1" se toman los argumentos (2 3 4 5), lo que generará un error. Para indicar a Lisp que debe tratar una s-expresión de forma literal y no evaluarla, debemos entrecomillarla. En Nysquist se puede entrecomillar una lista mediante comillas simples antes de ella, de este modo:

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

Nyquist tambien cuenta con una función list que nos permite construir listas, lo que es útil si algunos de los elementos de la lista son funciones:

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

Para extraer cosas de una lista, se puede usar las funciones first y rest. Tradicionalmente se denominaban respectivamente car y cdr, pero first y rest se recuerdan más fácilmente. Ambos conjuntos de nombres se pueden emplear en Nyquist. La salida de (first mylist) es 1, y la entrada de (rest mylist) es una lista (2 3 4 5). Así que el segundo elemento de la lista es (first (rest mylist)).

Lista de funciones de Lisp

Aquí se puede encontrar una lista con algunas de las funciones básicas de lisp que pueden resultar útiles. Para obtener una lista completa de funciones de Lisp/Nyquist, consulte el Manual de referencia de Nyquist version 2.37.

Nota: Los símbolos en Nyquist (como los nombres de variables y de funciones) no son sensibles al uso de mayúsculas y minúsculas. Internamente todos se convierten a mayúsculas.

Funciones matemáticas

(+ a b)suma
(- a b)resta
(* a b)multiplicación
(/ a b)división
(truncate a b)redondear al entero inferior
(float a b)entero a coma flotante
(rem a b c ...)resto
(min a b c ...)mínimo
(max a b c ...)máximo
(abs a)valora absoluto
(random n)entero aleatorio entre 1 y n-1
(sin a b)seno
(cos a b)coseno
(tan a b)tangente
(expt a b)exponente (a elevado a b)
(sqrt a b)raíz cuadrada
(< a b)comprobar si a es menor que b
(<= a b)comprobar si a es menor o igual que b
(> a b)comprobar si a es mayor que b
(>= a b)comprobar si a es mayor o igual que b
(= a b)comprobar igualdad
(/= a b)comprobar desigualdad

Funciones de lista

(first l)primer elemento de una lista (primitiva "car")
(rest l)resto de la lista (primitiva "cdr")
(reverse l)invertir una lista
(list a b ...)construir una lista
(append l1 l2)agregar dos listas
(length l)longitud de una lista
(maplist function l)aplicar una función a cada elemento de una lista

Control

(if expr expr1 expr2)si expr es verdadero, evalúa expr1, si no evalúa expr2

Programar en Nyquist