Audacity : logiciel libre d'enregistrement et de montage audio

Liste d'annonce

Nyquist

  1. Introduction à la programmation Lisp et Nyquist
  2. Programmer en Nyquist
  3. Création de greffons Nyquist

Dès la version 1.1.1, Audacity a rendu possible l'utilisation du langage de programmation Nyquist pour écrire vos propres greffons d'effets pour Audacity. Contrairement aux greffons VST et LANDSPA, les greffons Nyquist peuvent être écrits à l'aide d'un simple éditeur de texte et n'ont pas besoin d'etre compilés.

Nyquist a été codé par Roger B. Dannenberg dans l'optique d'etre utilisé comme un langage autonome de programmation pour la synthèse et l'analyse de sons, la lecture et l'enregistrement, prise en compte des entrées/sorties, programmation orienté objet avec déboguage possible... Audacity n'exploite qu'une partie des fonctionnalités de Nyquist, vous permettant d'utiliser les éléments simples de Nyquist pour le traitement de données audio. Audacity n'inclut pas d'outil pour déboguer le code Nyquist; si vous êtes amenés à développer des greffons complexes, il peut être intéressant de travailler avec la version complète de Nyquist que vous pouvez trouver sur le site du

Nyquist supporte la syntaxe Lisp et un syntaxe plus conventionnelle appelée SAL. Les versions d'Audacity avant la 1.3.8 Bêta supporte seulement Lisp, mais les versions suivantes Lisp et SAL. Pour écrire un greffon à utiliser avec Audacity, choisissez le Manuel Nyquist approprié à votre version d'Audacity et votre syntaxe préférée :

Notez que vous n'avez pas besoin de télécharger Nyquist afin d'écrire des greffons simple à utiliser avec Audacity. Toutes les instructions de base dont vous avez besoin pour travailler avec Lisp et le manuel 2.37 sont dessous. Si vous voulez explorer SAL également, et pour les dernières fonctionnalités Nyquist dans Audacity, voir Nyquist Documentation sur le Wiki.

Lisp

Nyquist est basé sur le langage Lisp. Si vous êtes familier avec ce type de programmation, vous pouvez passer à l'étape suivante ou à la page suivante. Sinon, voici une très courte introduction à Lisp :

En Lisp (et donc en Nyquist), tout est S-expression, c'est-à-dire une liste de briques (mots) séparées par des espaces et enfermées à l'intérieur de parenthèses. Le nom de la fonction est toujours le premier élément d'une S-expression et les autres briques en sont les arguments. Voici un exempl simple :

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

Examinons cet exemple. La S-expression globale contient trois parties. La première, setf, est le nom de la fonction (il correspond à "set field"). setf sert à assigner une valeur à une variable - il existe d'autres variables similaires comme set ou setq mais setf est plus puissante et nous l'employons dans cet exemple. Après setf vient area qui est le nom de la variable à laquelle nous allons assigner une valeur. Celle-ci est dans cet'exemple une autre S-expression.

Lisp ne possède pas d'opérateurs spéciaux pour les fonctions mathématiques, ce sont des fonctions comme toutes les autres qui s'utilisent avec la meme syntaxe fonction arguments, où le nom de la fonction ou de l'opérateur précède les arguments. Ainsi pour calculer le produit de 3 par 7, nous écririons en Lisp (* 3 7). La fonction exposant expt élève le premier argument à la puissance du second. La S-expression (* 3.14159 (expt radius 2)) signifie donc que l'on multiplie 3.14159 par le carré de la valeur de la variable radius, ce qui donne la surface d'un disque.

Plutot que de reécrire des expressions longues à chaque fois, il est possible de définir une fonction qui calcule l'aire du disque chaque fois qu'elle est appelée :

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

La fonction defun sert à définir une nouvelle fonction. Le premier argument (circlearea) est le nom par lequel nous appelerons la fonction. Le second est la liste (entre parenthèses) des arguments que prendra la fonction définie - c'est un des rares cas où une S-expression n'est pas interpretée comme un appel de fonction. Enfin, la dernière expression est la valeur de la fonction. Pour exécuter cette fonction avec une valeur donnée de r, il suffira alors de taper :

  (setf area (circlearea r))

Une S-expression n'est qu'une représentation d'une liste. Lisp utilise les listes pour à peu près tout! (Lisp signifie "List Processing Language.) Il est donc impératif de savoir comment manipuler les listes. Pour commencer, voici comment donner une nombre de nombres à une variable. L'erreur à ne pas commettre est d'écrire :

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

Ceci ne fonctionne pas car chaque fois que Nyquist rencontre une S-expression, il cherche à l'évaluer à moins que vous ne lui indiquiez de ne pas le faire. L'expression (2 3 4 5) où "1" serait le nom de la fonction génère donc une erreur. Pour indiquer à Lisp de ne pas évaluer une expression mais de la traiter littéralement, vous devez l'entourer de guillemets. Dans Nyquist, il suffit de la précéder d'un guillemet simple :

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

Nyquist fournit également une fonction list dont vous pouvez vous servir pour construire une liste, ce qui peut s'avérer utile lorsqu'un élément de la liste doit être interprété :

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

Pour extraire les élements d'une liste, Lisp dispose des fonctions first et rest (autrefois appelées car et cdr, ces fonctions étant toujours supportées par Nyquist, mais first et rest sont plus simples à se rappeler). ((first mylist) donne 1) et ((rest mylist) donne (2 3 4 5)). Pour extraire le second élément, il faut donc entrer (first (rest mylist)).

Les fonctions de référence en Lisp

Voici une liste de quelques fonctions Lisp élémentaires dont vous aurez probablement besoin. Pour une liste complète des fonctions Lisp / Nyquist, consultez le manuel de référence de Nyquist.

Remarque : Les mots comme les noms de variables et de fonctions ne sont pas sensibles à la casse, puisqu'ils sont convertis en majuscule par l'interpréteur.

Fonctions mathématiques

(+ a b)addition
(- a b)soustraction
(* a b)multiplication
(/ a b)division
(truncate a b)partie entière
(float a b)transformation d'un entier en type flottant
(rem a b c ...)reste
(min a b c ...)minimum
(max a b c ...)maximum
(abs a)valeur absolue
(random n)entier aléatoire entre 1 et n-1
(sin a b)sinus
(cos a b)cosinus
(tan a b)tangente
(expt a b)puissance (a à la puissance b)
(sqrt a b)racine carrée
(< a b)test d'infériorité stricte (a
(<= a b)test d'infériorité au sens large
(> a b)test de supériorité stricte (a>b)
(>= a b)test de supériorité au sens large
(= a b)test d'égalité
(/= a b)test de non égalité

Fonctions de manipulation de liste

(first l)premier élément de la liste (car)
(rest l)reste de la liste, après le premier élément (cdr)
(reverse l)inverse la liste
(list a b ...)construit une liste
(append l1 l2)concatène deux listes
(length l)longueur d'une liste
(maplist function l)applique une fonction à chaque élément d'une liste

Exécution conditionnelle

(if expr expr1 expr2)si expr est vraie, évalue expr1, dans le cas contraire evalue expr2

Suite : Programmation en Nyquist