Nyquist
- NyquistとLispプログラミングの紹介
- Nyquistによるプログラミング
- Nyquistプラグインの作成
Audacityではバージョン1.1.1よりNyquistプログラム言語を使って独自のAudacity用プラグインを作成することができるようになりました。 VSTやLADSPAプラグインと異なり、Nyquistプラグインは普通のテキストエディタで作成できコンパイルも必要ありません。
NyquistはRoger B. Dannenbergによって音声合成および解析のための完全なプログラミング言語として使われることを意図して開発されました。NyquistはMIDIサポート、オーディオ録音・再生、ファイルI/O、オブジェクト指向プログラミング、プロファイリング、デバッグ他の機能を備えています。 AudacityはNyquistの一部の機能を使っており、これによりユーザはNyquist の簡単な関数を使ってオーディオデータの処理を行うことができます。 AudacityはNyquistコードのデバッグ機能を持っていません。したがって、もしユーザーが複雑なプラグインを作成したい場合はフルバージョンのNyquistを入手しそこで開発を行い、その後Audacityのプラグインとして使うのがいいでしょう。 Nyquistはカーネギー・メロン大学(CMU)コンピュータ音楽プロジェクトで入手可能です:
- CMU Computer Music Project Software - フルNyquistのダウンロード.
NyquistはLisp記述法および より会話的なSALと呼ばれる記述法の両方をサポートします。 Audacity 1.3.8以前のバージョンではLisp記述方だけでしたが、現行のAudacity 2.0シリーズではこれらLispとSALの両方をサポートします。 Audacityで使用するプラグインを書くには、それぞれのAudacityバージョンと記述法に合った適切なNyquistマニュアルを選んでください:
- Nyquist version 2.37 Manual - 全面的にLisp記述法を使用
- Nyquist 3.0x Reference Manual - 最新のNyquistマニュアル (SAL記述法が中心).
Audacityで使用する簡単なプラグインを書くのならNyquistをダウンロードする必要はありません。以下のインストラクションさえ理解すればLispおよび2.37マニュアルを使ってプラグイン作成ができます。もしSALについても学習しAudacityでサポートされている最新Nyquist機能を使いこなすならNyquist Plug-ins ReferenceがWiki.
上に公開されていますのでご覧ください。Lisp
NyquistはLispをベースにしています。 Lispプログラミングの経験がある方はこのセクションを読み飛ばすか直接 次へ行ってください。 以下はそれ以外の方々向けの非常に簡単なLispの紹介です:
Lisp(およびNyquist)において, すべてがS式で表現されます。S式は空白で区切られ括弧で閉じられたトークン(ワード)のリストです。関数名は常にS式最初のトークンであり、その他のトークンはその関数の引数です。 簡単な例を示します:
(setf area (* 3.14159 (expt radius 2)))
この例を分析してみましょう。もっとも外側のS式は3つのメンバーを持っています。最初のもの,setf, は関数名 (ちなみにset-fieldの略)です。setf は変数に値を与える関数です。 (いくつかの類似の関数もあります。たとえば set や setqなど。しかし setf は最も強力であり、この例の中で使うものです。) setf の後には areaが来ます。これはこれから値をセットしようとしている変数です。 次にこの変数に与えられるべき値が来ます。この例ではその値が別のS式になっています。
Lispは数式用の特別な演算子を持っていません。演算も、他のものと同じく関数で実現されます。数式の関数は関数名(または演算子)が引数よりも前に置かれるという前置記法にて表現されます。 したがって3と7の積を3*7と表現する代わりに、Lispでは(* 3 7)と書きます。 Nyquistでは、expt(べき乗)関数は最初の引数を2番目の引数でべき乗します。したがって(* 3.14159 (expt radius 2)) は radiusの2乗に3.14159を掛け合わせたもの、すなわち円の面積をあらわしています。
この表現全部をいちいちタイプする代わりに、円の面積を求める関数を定義しましょう。そうすれば必要な時いつでも呼び出すことができます:
(defun circlearea (radius) (* 3.14159 (expt radius 2)))
defun関数は新しい関数を定義する関数です。 最初の引数は関数名、この例では circleareaです。2番目の引数はこの定義すべき関数の引数のリストです- これはS式が関数呼び出しを行わない数少ない例の1つです。最後の表現はこの関数の値です。これで、もし半径rの円の面積の計算が必要な場合、単純に次のように計算します:
(setf area (circlearea r))
S式は単純にリストを表現したものです。Lispではすべてのものを表現するのにリストを使用します。(LISPという名前はリスト処理言語、LISt Processing、に由来します)したがってリストの操作法を知ることは大切です。 では、数値のリストを1つの変数に割り当てることからはじめましょう。 このようにはできません:
(setf mylist (1 2 3 4 5)) <-- error!
これが動かない理由は、NyquistがS式を読み込む際には明示的に別の宣言をしない限り、いつでも関数として評価しようとするからです。 ここでは"1"という名前で (2 3 4 5)という引数を取る関数が定義されていないので、これはエラーになります。 Lispに、あるS式を関数としてではなく文字通りに取り扱わせたい場合は 引用記号を使ってください。Nyquistでは、次のようにシングルクォテーション記号をリストの前に付けます:
(setf mylist \'(1 2 3 4 5))
Nyquistはlistという関数を提供します。これはリストを構成するのに使うもので、あるリストのいくつかの要素が関数である場合に便利です:
(setf mylist (list 1 2 3 4 (sqrt 25)))
リストから要素を取り出すには first および rest関数を使います。(伝統的には、これらはそれぞれ car およびcdrと呼ばれていましたが first およびrest のほうがずっと覚えやすいです。Nyquistでは両方の名前がサポートされています。) (first mylist) の出力は1であり、(rest mylist)の出力はリスト(2 3 4 5)です。 したがってこのリストの2番目の要素取り出すには(first (rest mylist))と書きます。
Lisp関数リファレンス
これはよく使われる基本的なLISP関数の一覧です。 Lisp / Nyquist関数のより完全な一覧は Nyquist version 2.37 Reference Manualをご覧ください。
注意:Nyquistにおけるシンボル(たとえば変数名や関数名など)はケースセンシティブではありません。内部的には大文字に変換されます。
数学関数
(+ a b) | 加算 |
(- a b) | 減算 |
(* a b) | 乗算 |
(/ a b) | 除算 |
(truncate a b) | 切捨て整数化(底) |
(float a b) | 整数から浮動小数点へ |
(rem a b c ...) | 除算の余り |
(min a b c ...) | 最小値 |
(max a b c ...) | 最大値 |
(abs a) | 絶対値 |
(random n) | 1 と n-1の間の整数乱数発生 |
(sin a b) | sin関数 |
(cos a b) | cos関数 |
(tan a b) | tan関数 |
(expt a b) | べき乗(aのb乗) |
(sqrt a b) | 二乗根 |
(< a b) | a<b かどうかをテスト |
(<= a b) | a≦bかどうかをテスト |
(> a b) | a>bかどうかをテスト |
(>= a b) | a≧bかどうかをテスト |
(= a b) | a=bかどうかをテスト |
(/= a b) | a≠bかどうかをテスト |
リスト関数
(first l) | リストの最初の要素 (car) |
(rest l) | リストの2番目以降の要素 |
(reverse l) | リストの逆順 |
(list a b ...) | リストの作成 |
(append l1 l2) | 2つのリストの合成 |
(length l) | リストの長さ |
(maplist function l) | リスト中のすべての要素に関数を適用する |
制御
(if expr expr1 expr2) | exprが真ならexpr1を返し、それ以外ではexpr2を返す |

