Audacity: Um Programa Livre para Gravar e Editar Áudio

Políticas para Publicidade

Nyquist

  1. Introdução às Programações Lisp e Nyquist
  2. Programar em Nyquist
  3. Criar Plug-ins Nyquist

A partir da versão 1.1.1, o Audacity permite o uso de programação Nyquist para que escreva os seus próprios plugins de efeitos. Ao contrário dos plugins VST e LADSPA, os plugins Nyquist podem ser escritos num vulgar editor de texto e não precisa de ser compilado.

O Nyquist foi escrito por Roger B. Dannenberg com o intuíto de ser uma linguagem de programação completa para síntese e análise de áudio, com suporte para gravação e reprodução de MIDI, ficheiros I/O, programação orientada a objectos, perfilação, depuração, etc. O Audacity faz uso de apenas uma parte da funcionalidade do Nyquist, permitindo que, com simples funções, se processe dados de áudio. O Audacity não incluí qualquer suporte para depurar o código Nyquist, assim se estiver a tentar escrever um plugin mais complicado, pode achar mais fácil obtê-lo com uma versão completa do Nyquist e depois torná-lo num plugin do Audacity. O Nyquist está disponível no sítio do Projecto de Música para Computador, da Universidade de Carnegie Mellon:

O Nyquist suporta ambas as sintaxes, a Lisp e a mais convencional chamada SAL. As versões, do Audacity, anteriores à 1.3.8 apenas suportam Lisp, mas as actuais séries 2.0 suportam ambas, Lisp e SAL. Para escrever plugins para o Audacity, escolha o Manual do Nyquist adquado para a sua versão do Audacity e a sintaxe preferível:

Note que não precisa de transferir o Nyquist para escrever plugins simples para o Audacity. Todas as instruções básicas que necessita para trabalhar com o Lisp e o Manual 2.37 estão abaixo. Se, também, deseja explorar SAL e para saber as últimas funcionalidades do Nyquist, no Audacity, consulte a Documentação Nyquist , na Wiki .

.

Lisp

O Nyquist tem por base a Lisp. Se já programou em Lisp antes, pode despertar a memória nesta página ou ir directamente para a próxima página . Caso contrário, segue uma muito breve introdução à Lisp:

Em Lisp (por conseguinte em Nyquist), tudo é uma S-Expression, que não é mais que uma lista de símbolos (palavras) separados por espaços e fechados entre parêntesis. O nome da função é sempre o primeiro símbolo na S-Expression e todos os outros símbolos são argumentos da função. Aqui está um exemplo simples:

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

Vamos desmontar este exemplo. A S-Expression mais externa tem três membros. O primeiro, setf, é o nome da função. setf atribuí um valor a uma variável. (Existem outras funções similares, como set e setq, mas setf é a mais poderosa, assim é a mais usada nos nossos exemplos.) Após setf segue-se area, que é o nome da variável que vamos configurar. A seguir vem o valor a atribuir a esta variável, que neste caso é outra S-Expression.

O Lisp não tem qualquer operador especial para funções matemáticas - todas as funções são definidas por prefixo notação, onde o nome da função (ou operador) é indicado antes dos seus argumentos. Assim, em vez de 3*7 para o produto entre 3 e 7, em Lisp teremos (* 3 7). Em Nyquist, a função expt (expoente), eleva o primeiro argumento ao valor do segundo. Assim, (* 3.14159 (expt radius 2)) significa 3,14159 vezes o quadrado de radius, ou seja a fórmula para a área de um círculo.

Em vez de digitar sempre a função completa, vamos definir uma, para a área do círculo, que poderemos invocar sempre que necessitarmos:

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

A função defun é indicada para definir uma nova função. O primeiro argumento, neste caso circlearea, é o nome da função. O segundo argumento é uma lista de argumentos que definem a função - este é um dos poucos casos em que terá uma S-Expression que não será interpretada como uma chamada a uma função. Finalmente a última expressão é o valor da função. Agora, se quisermos obter a área de um círculo de raio r, apenas teremos de indicar:

  (setf area (circlearea r))

Uma S-Expression é apenas a representação de uma lista. O Lisp usa listas para representar quase tudo (o nome LISP surge de LISt Processing language), assim é útil saber como manipular listas. Vamos começar por associar uma lista de números a uma variável. Não pode fazer isto rapidamente:

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

A razão para isto não funcionar é que sempre que o Nyquist vir uma S-Expression, ele tenta fazer dela uma função a não ser que lhe indique o contrário. Como não existe uma função com o nome "1" que toma os argumentos (2 3 4 5), isto gerará um erro. Para indicar ao Lisp para tratar literalmente uma S-Expression, e não fazer dela uma função, terá que o referir. Em Nyquist, pode fazê-lo colocando um simples sinal antes da lista, assim:

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

O Nyquist tem, também, a função list, que pode ser usada para construir listas - útil se alguns dos elementos da lista são funções:

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

Para tirar coisas de uma lista, pode usar as funções first e rest. (Estas chamavam-se car e cdr, respectivamente, mas first e rest é mais fácil de recordar. Ambos os conjuntos são suportados pelo Nyquist.) O resultado de (first mylist) é 1, e o resultado de (rest mylist) é a lista (2 3 4 5). Assim o segundo elemento da lista é (first (rest mylist)).

Referência das funções Lisp

Aqui está uma lista das funções básicas de Lisp que poderá precisar. Para uma lista completa de funções Lisp / Nyquist, consulte o Manual de Referência da versão 2.37, do Nyquist.

Nota: Simbolos em Nyquist (como nomes de variáveis e funções) não são sensíveis a maiúsculas e minúsculas. Todos são convertidos para maiúsculas, internamente.

Funções matemáticas

(+ a b)adição
(- a b)subtração
(* a b)multiplicação
(/ a b)divisão
(truncate a b)arredondar para o inteiro abaixo
(float a b)inteiro para ponto flutuante
(rem a b c ...)lembrete
(min a b c ...)mínimo
(max a b c ...)máximo
(abs a)valor absoluto
(random n)inteiro aleatório entre 1 e n-1
(sin a b)seno
(cos a b)coseno
(tan a b)tangente
(expt a b)expoente (a elevado a b)
(sqrt a b)raíz quadrada
(< a b)testar para a menor que b
(<= a b)testar para a menor que ou igual a b
(> a b)testar para a maior que b
(>= a b)testar para a maior que ou igual a b
(= a b)testar para equivalente
(/= a b)testar para não equivalente

Liste as funções

(first l)primeiro elemento de uma lista (car)
(rest l)resto da lista (cdr)
(reverse l)reverter uma lista
(list a b ...)construir uma lista
(append l1 l2)anexar duas listas
(length l)comprimento de uma lista
(maplist function l)aplicar uma função a todos os elementos numa lista

Controlo

(if expr expr1 expr2)se expr é verdadeiro, avalia a expr1, caso contrário avalia expr2

A seguir: Programar em Nyquist