# aRts - アナログ・リアルタイム・シンセサイザ

Stefan
Westerfeld

    stefan@space.twc.de

1999/09/29
0.03.04

この文書は aRts - アナログ・リアルタイム・シンセサイザのマニュアルです。

analog
realtime
synthesizer
midi
midibus
audio
sound
effect
filter
アナログ
リアルタイム
シンセサイザ
midiバス
オーディオ
サウンド
エフェクト
フィルタ

## はじめに

### aRts とは？

aRts は "analog realtime synthesizer" の略です。でもこれを読んでいる人だったら もう知っているか...

このプロジェクトはバージョン0.2.5と0.2.6の間に KSynth から aRts に名称が変更になりました。

aRts は完全な「モジュール式アナログシンセサイザ」を - デジタルな - コンピュータにシミュレートします。 これで音声、音楽を製作しましょう。 波形を作成するオシレータ、フィルタ、スピーカ、ミキサ、フェイダから データを演奏するための小さなモジュールなどが Arts に用意されています。 このモジュールを駆使して音声を製作します。 設定もすべてモジュールを用いた GUI から行うことができます。 ジェネレータ、エフェクト、出力もみんなモジュールで、相互に接続しています。

このソフトはただのアナログシンセサイズだけでなく、 広い範囲に応用できるように少しずつ発展してきました。 aRts はオーディオミドルウェアになる成長期にあります。 それに到達した時には、二重エフェクト処理や、 midi のシンセサイズ、オーディオサーバ機能、サンプラのエミュレーションなどのタスクを できるようになるでしょう。その後にはハードディスクへの記録機能などが続きます。

このプログラムは GPL(Gnu Public License) のもとに配布されます。 アーカイブ中の COPYING ファイルを良く読んで下さい。GPL に同意できない場合は、 プログラムの使用、修正はできません！

### aRts の仕組み

ソフトウェア・シンセサイザはすでにいくつかありますが、 aRts はある1つの目標を目指して設計されています...それは柔軟性です。

そのため、このプログラムの目指すものは、楽器が2つ、または10個でもいいですが、 そのパラメータを変えながらただ良い音を出せるだけのものではありません。 また、エフェクトを3つ、ミキサを1つだけ使える、というものでもありません。

いちばん小さいレンガから複雑な構造物、 例えばイコライザ付きのミキサ、エフェクトバンク、画面に表示される ボタン、パラメータまで、すべてが aRts を構成する小モジュールから 構築できるものでなければなりません。 再接続、再設定、再プラグ、経路の再設定、 設計のやり直しのできないものがあってはなりません。 これはすべてを思いのままにできる仮想スタジオなのです。

もちろん、楽器のライブラリ、エフェクト・ライブラリ、ミキサ集、 複雑なフィルタ、midi プロセッシングユニットなどはあります。 これらは aRts と一緒に付いてきます。 しかし、それらはコード内部にあるわけではありません。 それらは aRts 自身で書かれ、aRtsbuilder からアクセスすることができます。 まだまだやるべき事はありますが、少しずつ達成していきましょう。

新しいシンセサイズモジュールは簡単に書けますし、 aRtsのシステムに簡単に統合することができます。

柔軟性をもたらすものには、 他にも CORBA があります。

シンセサイザは基本的に2つの部分からなります - モジュールを接続する GUI - とモデルを実行する深層レベルのシンセサイザです。 シンセサイザと GUI は CORBA によって通信します。 これによって、複数のオーディオアプリケーションが、 シンセサイズで使用する領域を共有できます。 それはつまり、aRts が、すべてのアプリケーションに接続されている midi バスだけでなく、 別々のリアルタイム計算を同時に行うことができる一種のオーディオサーバになる、 ということです。

## インストール

### aRts を手に入れる

バイナリ・リリース

  もちろん、aRts をインストールするのにいちばんやりやすいのは バイナリ・パッケージを利用することです。あなたの Linux ディストリビューションに それが入っていればよいのですが、もし入っていなければ、文句を言いましょう;)。 SuSE Linux には入っています。

  ただし、ディストリビューションに aRts が入っていなくて、 バイナリパッケージが何とかして欲しい場合にも大丈夫です。バイナリが必要なのは、おそらく ソースをコンパイルできなかったか、できたけれども上手く動作しなかったからでしょう。 aRts 0.3.3 から、スタティック・バイナリが aRts のホームページから手に入れることができます。 スタティックバイナリはほぼすべての linux で、ディストリビューション、カーネル、ライブラリに 関わらず動作するところが便利です。しかし、これは 8 メガバイトという大きさなので、 aRts をインストールする方法が他にあれば、そちらの方が良いでしょう。

  ただし、次のセクションでは、 伝統的なソースからのインストールを中心に説明していきます。

正規(安定?)版ソースのリリース

  aRts のホームページ http://www.arts-project.orgに行って そこから(またはミラーから)ダウンロードするのがいちばん良いでしょう。 他には、 ftp://ftp.kde.org/pub/kde/unstable/apps/multimedia/sound から最近の arts-x.y.z.tgz を探してください。

最新の開発バージョン

  aRts はモジュール kmusic の KDE CVS で開発されています。 そこにアクセスすることができるならば、 `cvs checkout kmusic` を実行すれば最新バージョンを入手することができます。

  cvsup での CVS へのアクセスができなくても、スナップショットを入手する方法があります。 その方法は、 http://www.kde.orgに詳しい説明があります。

### 必要なもの

現在のところ、次のソフトウェアとともにコンパイル、実行のテストを行っています。 これより高いバージョンなら大丈夫です。;)

- Linux 2.0.30 - http://www.linux.org

- Qt 1.32 - http://www.troll.no

- KDE 1.0 - http://www.kde.org

- mico 2.2.3, 2.2.7 or 2.3.0 - http://www.mico.org

  重要！！ mico は --disable-mini-stl オプションを付けてコンパイルしてください！！ そうしないとaRtsを構築できません。

  Mico-2.2.6 は idl コンパイラにバグがあり、リファレンスカウンティングが 不適切になります。aRts はそれでも動きますが、おそらくサーバは ArtsBuilder が残ってなくても終了せず、そしてメモリリークが起こりえます。 これを避けるには、より新しいバージョンの mico を使用してください。

- egcs 1.0.2 - http://egcs.cygnus.com

- スレッドを安全に扱える X11 ライブラリと libc6/glibc2 または libc5 (詳細は後述)

libc5 のシステムで重要なこと

  (同じ問題のある soundtracker の readme から): このプログラムではスレッドを広い範囲に渡って利用します。 これは、libc5 のシステムではトラブルのもとになることがあります。 この場合、スレッドを安全に扱えるXライブラリが必要です。 ArtsBuilder が起動とほぼ同時に(strange X I/O errorで)クラッシュするのは、 それが無いのが原因です。

  コンパイルされたバージョンは次の所から入手できます。

  http://www.tu-harburg.de/~semk2104/soundtracker/threadedxlibs.tar.bz2

  このライブラリを古いXライブラリに上書きするのではなく、 個人のディレクトリに置いて、 bashシェルの環境変数を次のように設定するのがいちばん良いやり方です。

      export LD&lowbar;LIBRARY&lowbar;PATH=/path/to/threadedxlibs/directory

  csh/tcsh では：

      setenv LD&lowbar;LIBRARY&lowbar;PATH /path/to/threadedxlibs/directory

  qt-1.44 で aRts を動作させられない場合は、 qt-1.42 でコンパイルするとうまく行く、 という報告があります。これは誰かが確認/デバッグしてくれるのがよいのですが。

audiofile 0.1.6とともにコンパイル

  Libaudiofile のヘッダファイルには問題があります。 &lowbar;&lowbar;cplusplus が定義される場所にバランスが取れていない括弧があるのです。 src/synthesizer で wav サポートをコンパイルしようとした時に

      error: wav.cc: h:21 parse error before '&rcub;'

  というエラーが出ます。 それに対しては次のように対処します。

  - /usr/include/aupvlist.h ファイル中の次の部分の閉じ括弧2つのうち1つを削除する。

           #ifdef __cplusplus
           }
           #endif

    この部分は私のシステムでは59行目にありました。

  - または、libaudiofile を新しいバージョンにアップグレードする。

  欠陥のある libaudiofile 0.1.6 は Debian 2.1 や RedHat 6.0 に入っていますので、 そのシステムではこの問題に出会うと思います。
idl を呼び出す際の問題

  インストールしたばかりの RedHat6 などのいくつかのシステムでは次のような エラーメッセージに出会うでしょう。

         /usr/local/bin/idl --query-server-for-narrow synth.idl
         /usr/local/bin/idl: error in loading shared libraries:
            libmico2.2.7.so: cannot open shared object file:
            No such file or directory

  これを修正するには、root 権限で /usr/local/lib を /etc/ld.so.conf に追加して、 その後で ldconfig を実行してください。
egcs を使わずに構築する

  gcc-2.7.x または gcc-2.8.x があるならば、それを利用することができます。 しかし、設定を少し直す必要があるかもしれません。 上手くインストールできない場合は、どこが悪いのか私に知らせてください。 手助けができると思います。

  non-GNU のコンパイラを利用しているならば、少なくとも適当な STL サポートが必要です。 それによって Mico と KDE を構築できるなら、 おそらく aRts も構築することができるでしょう。

Linux 以外で構築する

  他のオペレーティングシステムで構築するには、別のサウンドドライバが必要です。 通常は、mpeg3play のバージョン0.9.6から適切なソースを持ってくることができます。 シンセサイザのサウンドサポートはそれらのルーチンに基づいています。 詳しくは README.sound を御覧ください。そして、リアルタイム機能を追加してください。

  これまでのところ、Linux でのみ動きます。しかしながら、FreeBSDでも aRts は動くという報告があります。

KDE、Qt がない環境で構築する

  KDE と Qt がなくても次のようにすれば構築することができます。

      configure --disable-kde

  artsbuilder(シンセサイズストラクチャのビジュアルエディタ)の構築が省略されます。 ただし、これは aRts を利用する上であまり便利でありません。

  KDE のない環境でどうしても構築したいなら、 下のポーティングセクションを読み、次のような新たな GUI を起動することをお薦めします。

  - Gtk, Gnome, OrbIt

  - Java と mico Java support

  - その他

### コンパイルとインストール

CVS スナップショットの場合は、まず次を実行します。

- `make -f Makefile.dist`

CVS を利用した人も、正規のリリースのユーザも実際のコンパイルは次のように行います。

- `./configure`

- `make`

- `make install`

### root 権限について

シンセサイザが上手く動くにはリアルタイムの優先権が必要です。 それを確保するには方法が3つあります:

シンセサイザのラッパープログラム "artswrapper" に適切な権限を与える

  1. X ウィンドウでターミナル(kterm など)を開く (su を実行してパスワードを入力すると、root になれます。)

  2. artsserver.bin に権限を与える

            cd /usr/local/kde/bin
            chown root artswrapper
            chmod u+s artswrapper

     これによって artsserver は root 権限を自分で取れるようになるので、 以後気に掛ける必要がなくなります。

     このラッパープログラムは aRts-0.3.4 に追加されています。 シンセサイザ全体が root、または su-id の root として実行されることに対して、 セキュリティ上の注意が喚起されています。 ラッパープログラムはスケジューラのリアルタイムの優先権を得た後すぐに root 権限を失います。

     この解決法、実行が本当に安全かどうかについてのフィードバックを歓迎しております。

サーバを常に root で起動する

  root になって、artsserver を手動で起動すれば、 artsbuilder を適切なリアルタイム設定で利用できます。 そして一般ユーザでも artsbuilder を起動できます。

root 権限を利用しない

  これはあまりよくありません。 GUIを利用しているときにクリック音が出てクラッシュします。

### artsbuilder を起動する

これで artsbuilder を起動できます。 KDE では、アプリケーションは K-メニューのマルチメディアセクションに、 aRts Builder として登録されます。 そこにない場合、パネルを再起動してみてください。

そして、演奏ができるようになります。

## コンセプト

aRts にはさまざまなコンセプトがあります。 aRts-0.3.0 から導入された新しいものもあり、かなり以前からあるものもあります。

重要なのは、aRts を動かしているコンセプトを理解していると、 midi のシンセサイズもより理解できる、ということです。 aRts がどのように動作するかが分かればもっと色々なことができるようになるでしょう。

### モジュールとポート

aRts のコンセプトは、シンセサイズは小さなモジュールをいくつも利用して行われる、 ということです。 1つのモジュールができることは1つだけです。 それが接続し合って複雑な構造を作ります。 モジュールには通常、信号、パラメータが入ってくる入力、 および信号を送り出す出力があります。

例えば、モジュール Synth&lowbar;ADD は、入力から2つの信号を取得し、 それを結合します。その結果が出力信号として利用できます。 モジュールが信号を入出力する場所をポートと呼びます。

### ストラクチャ

ストラクチャとは接続されたモジュールのコンビネーションです。 モジュールには入力ポートに直接コード化されているパラメータがあるものがあります。 また、他のものと接続されているもの、まったく接続されていないものもあります。

ArtsBuilder でストラクチャを記述することができます。 どのモジュールがどのモジュールに接続されるのかを記述します。 それができたら、ストラクチャの記述をファイルに保存したり、 または記述したモジュールを作成(実行)したりすることができます。

そうして、すべてが正しくなっていれば、 きっと音が聞こえてくるでしょう。

### 公開と動的インスタンス化

必要ならばストラクチャに名前を付けることができます。 名前を付ければ次から参照することができます。 名前を付けるには、Artsbuilder で File/Rename を選択します。

その後、自分のストラクチャを aRts サーバに公開することもできます。 そうすると、あなたの記述が aRts に置かれ、 他の「ユーザ」が利用できるようになります。

目的は、ストラクチャを作成するモジュールを必要な時に得られるようにすることです。 例えば、ベースドラムをシンセサイズするストラクチャを設計したいとします。 midi ハンドラは特定の midi イベントがシンセサイザに送られるたびに、 そのようなストラクチャを作成することができます。 そうして、midi イベントが入ってくるごとに、 シンセサイズされたベースドラムの音が聞こえてきます。

もちろん、オーディオデータが他のオーディオ出力とミックスされてから 演奏されるようになっていないといけません。 また、ストラクチャがいつ消えるかが設定されている必要もあります。 そうしないと、もっと多くのストラクチャがシンセサイズされることになります。

最終的には、「本物の」楽器をシンセサイズしたいときにも、 音量や周波数など、到着する midi イベントについてのデータを より多く得られるようになります。

次にこれらの問題をどう扱うかについて説明します。

### バス

バスは、オーディオを転送する接続部です。動的に構築されます。 基本的にアップリンクとダウンリンクがあります。 アップリンクからの信号はすべて追加され、ダウンリンクに送られます。

現在実行されているバスはステレオ内で動作します。 そのため、ステレオデータはバスを通してだけ伝達できます。 モノラルデータがほしいときには、それを1つのチャンネルに伝達し、 他をすべてゼロかそれと同等のものに設定します。 それには、1つ以上の Synth&lowbar;BUS&lowbar;UPLINK オブジェクトを作成し、 データのやりとりをするバス名("audio" や "drums")をそこに伝えることだけで十分です。 そして、データをそこに投げ込みます。

その後、1つ以上の Synth&lowbar;BUS&lowbar;DOWNLINK オブジェクトを作成し、 バス名を伝えます。 "audio" や "drums" などのバス名が一致すれば、データが転送されます。 そうすれば、ミックスされたデータが再び出てきます。

アップリンクとダウンリンクは異なるストラクチャにあっても構いません。 さらには、別々の Artsbuilder を起動し、一方でアップリンクを送り、 もう一方のダウンリンクがデータを受け取ることもできます。

バスの良い点は、完全に動的であるということです。 クライアントはプラグイン、アウトが瞬時にできます。 しかもその際にクリック音もノイズも出ません。

(もちろん、信号を演奏しているクライアントをプラグアウトしてはいけません。 バスをプラグアウトした時点ではクライアントはゼロレベルにはないので、 クリック音が出ます。)

### ストラクチャの削除

次はストラクチャを自動的に削除する方法です。 Synth&lowbar;STRUCT;lowbar;KILL オブジェクトが用意されています。 これは、入力信号 > 0.5(read: 1)を取ったと同時にストラクチャを削除します。

当然、他のモジュールは適切な状況でそのような信号を生成するように調整されています。 Synth&lowbar;ENVELOPE&lowbar;ADSR と Synth&lowbar;PLAY&lowbar;WAV は両方とも、 準備ができた時点で1に設定される出力パラメータ、done を持っています。

これはつまり、ベースドラムなどの wav の楽器を使いたい場合、 Synth&lowbar;PLAY&lowbar;WAV があれば十分であるということです。 これによって wav が演奏され、 終了したパラメータは Synth&lowbar;STRUCT&lowbar;KILL に接続されます。

ストラクチャは wav が演奏された(ゼロでない出力がこれ以上発生しなくなった) 直後に削除されます。

### インターフェイス

インターフェイスはデータをストラクチャに入れる通路です。 モジュールに似ていますが、通常インターフェイスには入力しか(または出力しか)ありません。 インターフェイスの出力はストラクチャの外側から来ます。 入力はもと来たところへ戻ります。

ストラクチャにこのタイプのインターフェイスモジュールが含まれる場合、 ストラクチャはインターフェイスを提供していると言われます。

例えば、midi ルータは楽器のストラクチャが midi データ用のインターフェイスを提供することを予想します。 そして、ルータが midi データを送って、 ストラクチャはそのデータをシンセサイズに利用できます。

最近のバージョンの aRts では、 インターフェイスは内部で特殊な方法を使うことによってのみ存在します。 しかし、それも多分消滅して従来のストラクチャの入出力ポートに置き換えられます 「ストラクチャをもう一度モジュールとして利用する」を御覧ください。 そのため、 aRts でサポートされるインターフェイスは Interface&lowbar;MIDI&lowbar;NOTE だけです。 それが削除されたら、もうインターフェイスが使われることはないでしょう。 しかし、今現在は必要です。

### Midi シンセサイズ(新しいスタイル; Arts バージョン 0.3.0 以降)

Interface&lowbar;MIDI&lowbar;NOTE を与えるストラクチャがあります。 そこには周波数、ベロシティ(音量)、鍵盤が押されているかどうかのパラメータがあります。 ストラクチャは楽譜通り、指定の音量通り、 押されたかどうかのパラメータ(1=鍵盤を押している、0=鍵盤から手を離した)に対応し、 正確にシンセサイズします。

ストラクチャを作成し、利用するには、次のことが必要です。

- 押されたかどうかのパラメータを処理するには、 Synth&lowbar;ENVELOPE&lowbar;ADSR を使うのが便利です。 また、wav のドラムを演奏する場合には、とりあえず演奏してしまって、 パラメータは無視することもできます。

- ストラクチャは必要なくなった時には自動的に消滅しなければなりません。 波形とエンベロープは両方とも終了時に終了のパラメータを与えるので、消すのは簡単です。

- ストラクチャは名前を付けて公開しなければなりません。

- Synth&lowbar;MIDI&lowbar;ROUTER オブジェクトに対しては、 例えばチャンネル1に midi イベントが到着するたびに ストラクチャを作成するように指示することができます。

- おっと、それからストラクチャはおそらくバスに作成するオーディオデータを演奏します。 データはエフェクトの後に処理して、直接スピーカに送ると便利です。

### ストラクチャをまたモジュールとして利用する

複雑なストラクチャをまた1つのモジュールとして利用することが可能です。 興味深いことに、ストラクチャにはポートを与えることができます。 そのため、他のモジュールと同じように信号を処理することができます。 さあ、これでファンタスティックなリバーブを制作する凄い方法が見付かりましたよ。 リバーブを1つだけストラクチャに入れ、それにポートを、 たとえば2つの(ステレオ)入力ポート加え、そのうちの1つをリバーブのかかり具合にあて、 さらに2つの出力ポートを加えて、 そこからリバーブのかかった信号を出すようにすることができます。

そうしたら、それに Synth&lowbar;COOL&lowbar;REVERB みたいな名前を付け、 公開することができます。 同時に、モジュールメニューに新しいモジュールとして登場します。 そしてそれは他のストラクチャでモジュールとして利用することができます。

できのいいのをなくさないようにしたいなら、 そのようなモジュールを例えば Synth&lowbar;COOL&lowbar;REVERB.arts という名前で $HOME/arts/structures ディレクトリに保存しましょう。 毎回 aRts を起動した時にロードさせることができます ファイル名は <structurename>.arts のようにするのがポイントです。 「起動時の自動ローディング」を参照してください。

### 楽器 (Arts バージョン 0.3.2 以降)

楽器の設計における合い言葉は、一回作ったら何度でも使える、です。

基本的に、aRtsでコンポーネントをデザインする時の合い言葉も、 一回作ったら何度でも使える、です。 イコライザ、エフェクト、ミキサのような装置、何に対しても当てはまります。 それにはまだ解決すべき問題がありますが。

再利用をできるようにするにはやるべきことがあります。

- 重要な第一点は楽器は Interface&lowbar;MIDI&lowbar;NOTE を中に持った ストラクチャであることです。 これは「Midi シンセサイズ」で述べた通りです。

- ストラクチャは適切な時に自ら終了します(midi シンセサイズを参照)。

- ストラクチャにはバスの名前の付いたポートが必要です。名前は文字列です。 そのポートは Synth&lowbar;BUS&lowbar;UPLINK に接続していて、 楽器の作成したデータを受け取ります。

- 楽器の名前は instrument&lowbar;”自分で決めた楽器名”にします。 重要なのは instrument&lowbar; で始まることです。

ユーザがすぐに調節できるパラメータを用意したい場合は、 もう少し手間が必要です。

- 楽器の変更可能なパラメータには in オーディオ信号ポートがなければなりません。 例えば、"attack"、"decay"、"cutoff" パラメータがあるならば、 ストラクチャに3つのオーディオ信号ポートが必要です。

- 楽器のストラクチャに対して、楽器の「コントロールパネル」ともいえるストラクチャが必要です。 オーディオ信号内にある parent,オーディオの属性である x,y の合わせて3つのポートが そのストラクチャに必要です。

- 「コントロールパネル」ストラクチャの名前は instrument&lowbar;”自分で決める名前”&lowbar;GUI です。

- 「コントロールパネル」ストラクチャは、parent ウィジェットの中の x,y の位置に表示されます。 これはただ Gui&lowbar;SUB&lowbar;PANEL を利用すれば実現できます。

- 「コントロールパネル」ストラクチャには、 楽器に必要とされるパラメータに対応する出力がなければなりません。 先の例では3つのオーディオ信号の出力ポート"attack","decay","cutoff"が必要です。

面倒ですか？多分、そうでしょう。でも、できた楽器は再利用できます。 INSTRUMENT&lowbar;MAPPER の例を御覧になれば、きっとその意義が分かるでしょう。

### 起動時の自動ローディング

Artsbuilderは、起動すると $HOME/arts/structures にあるストラクチャをすべてロードし、 公開しようとします。ファイル名と同じような名前を持つストラクチャだけが公開されます。 例えば、$HOME/arts/structures/test.arts は test と表示されます。

つまり、最近制作した20個もの楽器とその「コントロールパネル」や、 好みのエフェクト10個を aRts を始めるときに起動する必要はありません。 ただ、ディレクトリに保存しておけば、aRts を起動するたびに表示されます。

これがストラクチャをモジュールとして適切に利用するただ1つの方法です。 Synth&lowbar;SPECIAL&lowbar;FX を作成してそれを他のストラクチャ、例えば楽器で利用するとします。 楽器をロードするには、Synth&lowbar;SPECIAL&lowbar;FX をその前に手動でロードし、 公開する必要があります。 そのかわりに、ストラクチャをただ$HOME/arts/structures に保存しておけば、それが自動的にできます。 いずれにせよ、ArtsBuilder はデフォルトでここに保存しますが。

Synth&lowbar;SPECIAL&lowbar;FX を再編集したいときは、 ともかくそれはプログラムの起動時にすでにロードされているので、 「サーバからの検索」を利用することもできます。

### ミキサ

は GUI のところで説明します。 16個のチャンネルを持つミキサを作成するのに、1つのチャンネルを説明してから 「これが16個必要です。」という方が良いでしょう。 これは公開、動的なインスタンス化、達成すべき事すべてを使います。 しかし、まだ GUI の基礎が分からない段階なので、 それが分かった時点で説明します。;)

### セッション管理

aRts で何かをしようとするとき、例えば aRts と Brahms で作曲するとき、 シンセサイズのストラクチャを起動した後に おそらくたくさんの情報を設定することになります。 どの楽器をどのチャンネルに繋げるか決めたり、ミキサのパラメータを調節したり、 楽器を微調整したり、エフェクトを設定したりします。

セッション管理は、例えば Brahms-Pop-Song1 のために必要な設定を保存します。 そのため、曲を保存してあとでまた取り組みたいときには、 aRts の &lowbar;as well&lowbar; の「保存」ボタンをクリックしましょう。 当然ですが、Brahms の曲は保存されません。 現在の設定は .arts-session という拡張子を付けて保存してください。

次の日に同じ曲にもう一度取り組みたいときには、 artsbuilder を起動してからメニューの「セッションを開く」を選びます。 するとセッションが開き、ミキサの設定、楽器のパラメータなど、前に残して置いた状態が復活します。

これはプロのスタジオが何千ドルも掛けてやっていることです;)。 (でも、プロはもちろん本物のスライダを使っています。 それらは小さなモータを動力として元の位置に戻るようになっています。)

重要: セッション管理は、セッションの使うストラクチャに変更を加えないようにしないと動作しません。 例えば、モジュール(またはスライダ)を楽器、ミキサなどに追加すると、 保存したセッションが大丈夫かどうかは保証できません。 これには、使用したストラクチャをすべてセッションと一緒に保存できるようにするなど、 バグフィックスが必要です。

### 完全な同時オーディオ処理

aRts を使って完全な同時オーディオ処理を行うことができます。 例えば、line in かマイクロフォンかそれと同等のものからデータを記録し、 aRts でそれを処理し、リプレイすることが非常に短い待ち時間でできます。 このように、aRts はエフェクト処理装置として使えます。

ただし、この機能によって、サウンドカードにアクセスするストラクチャを設計するときに aRts で何をしたいのかを決める必要が出てきます。

サウンドカードにデータを送る Synth&lowbar;PLAY を最新のモジュールとして利用する場合、 aRts を演奏するだけのものとして利用することに決めたことになります。 その一方、Synth&lowbar;FULL&lowbar;DUPLEX&lowbar;PLAY と Synth&lowbar;FULL&lowbar;DUPLEX&lowbar;RECORD でサウンドカードにアクセスすることもできます。 その場合、両方とも同じストラクチャに入っていることを確認してください。 そうすれば、同時に動作を始めます。

記録されたデータなどに他のストラクチャからアクセスしたいならば、 いつものようにバスを使います。

>困ったことに、完全同時処理を適切にサポートしないサウンドカードが多数あります。 例えば、SoundBlaster 16, AWE とそれと似た機能のカードのほとんどは1つのこと -- 16ビットのレコーディングか、または16ビットの演奏 -- しかできません。 その他の命令は、完全同時モードでは8ビットで処理され、 音声はまったく駄目です(ノイズになります)。

完全同時処理のレコーディングはサウンドカードからのデータを記録するのにも利用できます。 たとえ、aRts がオーディオサーバとして動いていても、です。

### マップのある楽器(ドラムマップなど)

マップのある楽器とは、音程によって振る舞いの違う楽器のことです。 例えば、5オクターブのピアノを作る場合、1オクターブごとに1つのサンプルを割り当 てます。 それに応じて音程が変化します。 こうすると、1つのサンプルでやるよりもずっと良い音が出ます。

1つのキーごとに1つのドラムサンプルを演奏するドラムマップを構築することもできます。

パラメータを受け取るためには、楽器は「不完全」である必要があります。 例えば、wave サンプルを演奏する普通の楽器であっても、 wave サンプルはストラクチャの中には与えられません。そのかわりに、 文字列のポートがあり、それが wave プレイヤのファイル名に接続しています。 このようにして、ストラクチャはパラメータ化されます。

それが面倒に見えるのは承知しています。私の意図することを理解するには、 play&lowbar;wav, play&lowbar;akai, play&lowbar;akai&lowbar;stereo を見てください。

では、楽器に play&lowbar;wav を使い、 ストラクチャにやり残しのパラメータのサンプルがあることを想定して、 次の内容のファイル 909drums.arts-map を作成してみましょう。

    structure=play_wav
    keygroup=35-35
    {
    sample=/usr/local/samples/909select/bt0a0a7.wav
    }
    keygroup=36-36
    {
    sample=/usr/local/samples/909select/bt0a0da.wav
    }
    keygroup=37-37
    {
    sample=/usr/local/samples/909select/bt3a0da.wav
    }
    keygroup=38-38
    {
    sample=/usr/local/samples/909select/bt7a0d7.wav
    }
    keygroup=39-39
    {
    sample=/usr/local/samples/909select/btaa0d0.wav
    }

見ての通り、開いているパラメータはキーグループごとに異なる指定を受けています。 ここでは keygroup は1つのキーだけを指し示していますが、 keygroup=30-50 のようにキーの範囲を指定することもできます。

複数のパラメータがあっても同じです。keygroup の定義にもう一行追加すればよいのです。 次は、akai のピアノ用演奏マップの抜粋です。

    structure=play_akai_stereo
    keygroup=0-30
    {
    rightsample=/var/samples/BOESEND.LOUD/BOE_LD_F#0-R
    leftsample=/var/samples/BOESEND.LOUD/BOE_LD_F#0-L
    }
    keygroup=31-33
    {
    rightsample=/var/samples/BOESEND.LOUD/BOE_LD_G#0-R
    leftsample=/var/samples/BOESEND.LOUD/BOE_LD_G#0-L
    }
    keygroup=34-34
    {
    rightsample=/var/samples/BOESEND.LOUD/BOE_LD_A#0-R
    leftsample=/var/samples/BOESEND.LOUD/BOE_LD_A#0-L
    }
    keygroup=35-36
    {
    rightsample=/var/samples/BOESEND.LOUD/BOE_LD_C1_-R
    leftsample=/var/samples/BOESEND.LOUD/BOE_LD_C1_-L
    }
    keygroup=37-38
    {
    rightsample=/var/samples/BOESEND.LOUD/BOE_LD_D1_-R
    leftsample=/var/samples/BOESEND.LOUD/BOE_LD_D1_-L
    }
    keygroup=39-39
    {
    rightsample=/var/samples/BOESEND.LOUD/BOE_LD_D#1-R
    leftsample=/var/samples/BOESEND.LOUD/BOE_LD_D#1-L
    }
    keygroup=40-40
    {
    rightsample=/var/samples/BOESEND.LOUD/BOE_LD_E1_-R
    leftsample=/var/samples/BOESEND.LOUD/BOE_LD_E1_-L
    }

このマップファイルは、ホームディレクトリの arts/maps ディレクトリにコピーすればすぐに 楽器のマッパーに自動的に表示されます。

## Midiバスの標準

### midisendとは?

サウンドアプリケーションのユニバーサル midi バスはまだ完成していません。 今開発中の段階ですが、もう少し時間がかかりそうです。 この課題は解決すべき事であると開発者の間で意見が一致していると思います。(下を参照)

演奏するために、またテストをするために、midisend を書きました。 このプログラムは /dev/midi00 に来たものを aRts に送信します。

必要なのは

- シンセサイザが動いていること

- シンセサイザの内部に midi イベントを処理するストラクチャがあること (なくても動作はしますが、音は何も聞こえません)

他のデバイスから送ることもできます。 それには、`midisend /dev/some&lowbar;other&lowbar;device`とします。

>全般的に見て、これで外部のキーボードなどを弾いてartsの出す音を聴くことができます。 私のシステムでは待ち時間は短く、問題が起こることもなく、 普通のキーボードを弾いているのとほぼ同じ感じでした。

### aRts と Brahms を使う

kooBase の生まれ変わりである Brahms は今や midi バスをサポートしています。 これはとてもよくできていて、従来の SoundBlaster 出力など、他の midi 出力ポートと一緒に使うことができます。

Brahms はまた、ただの midi だけでなく、aRts とのやりとりもサポートします。 wave トラックはすでに演奏できるようになっています。 ハードディスクへの記録などもそれに続くでしょう。

私たちは Brahms/aRts を、CuBase/VST と同じようなものにしようと考えています。 Brahms と aRts の関係は CuBase と VST の関係とほぼ同じだからです。

aRts と協力するBrahms を作るには、まず aRts を、次に Brahms をインストールします。 コンパイルは別々にします。 aRts をサポートするように Brahms をビルドするには、--enable-arts を指定します。 ただ、普通は aRts があることを自動的に検知します。

midi バスをサポートする Qt ベースのシーケンサには Cantor というのもありますが、 現在のところミュージシャンにとって Brahms の方がより有益な選択のようです。

他のシーケンサもこれに続くと思われます。シーケンサを作っていて、 midi バスサポートをしたい方は私に連絡をください。

### クイックスタート

これは Brahms と Cantor の両方ともできます。 Cantor を使っている場合は Brahms を Cantor に読み替えてください。

- artsをコンパイル・インストールする。

- midi バスをサポートする Brahms のバージョンを入手する。 最近の Brahms ならば大丈夫。 http://linux.twc.de/artsで手に入る。

- それをコンパイルする。 通常、aRts がインストールされていることを検出し、自動的に midi バスサポートが構築される。

- インストールする。

- artsserver を起動する。 artswrapper に root 権限を与えていないときは、root で artsserver を起動してください。 さもないとリアルタイム出力がリアルタイムでなくなり、音は騒音になってしまう。

- artsbuilder を起動する。

- ファイル/サーバの検索で、midi マッピングのストラクチャを (例えば example&lowbar;mixer&lowbar;eqfx など)利用できるようにする。

- ファイル/ストラクチャの実行でそのストラクチャを実行する

- 追加ボタンをクリックして1つ以上楽器を追加する。 midi チャンネルに関して少し合わないことがある。 aRts は1から数え始めるが、Brahms は0から始める。 よって、例えば aRts でチャンネル10にドラムマップを割り当てたなら、 Brahms ではチャンネル9になる。

- Brahms(または cantor)を起動する

- 作曲する、またはファイルをロードする、その他

- 演奏したいトラックを出力するデバイスを midi バスに設定する

- 演奏ボタンをクリック

ほら、音が出たでしょう？音がどんな感じになるかは、使用したシンセサイズの型によります。 お好みで、`midisend`を起動することもできます。 そうすると、シーケンサを使いながらキーボードで素敵な即興ライブができます... これでよいでも曲を作れます。よい曲ができたと思ったら、mp3 にして私に送ってください。 そうすればホームページで aRts がどんなに素晴らしいか見せることができます;)

追記:Brahms の作者 Jan と、Cantor の作者 Paul に厚く御礼申し上げます。 aRts を開発する上で2つのプログラムは非常に助けになりました。

追記2:aRts と Cantor は kmusic モジュールの KDE CVS から利用できます。 Brahms もおそらくすぐに使えるようになるでしょう。

### 詳しい中身

Arts はすでにコードを配布されています。これにより、次のものが利用できます。

1. arts のどのモジュールがどのモジュールと相互接続するかを設計するための GUI

2. (別のプロセスで動作する)シンセサイザ。 相互に接続したシンセサイズモジュールのストラクチャを思いのままに作成して実行することができます。

プロセス1と2はいつも対話しています。実際、プロセス1はプロセス2がないと存在できません。 プロセス2はプロセス1がなくても存在できますが。

GUI でないプログラム artsshell もあります。 これは GUI を使うことなく他のものと同時にシンセサイザでシンセサイズを始めることができます。 よって、KDE がない時でもシンセサイズモジュールを実行することができます。 ただし、もちろんそれを編集できないので楽しみは減ります。

aRts で行われていることは

そして、midisend が基本的にやることは、 midi データを(CORBA によって)シンセサイザに送る別のプロセス(プロセス3)を追加することです。

そういうわけで、私の理想の形は(形式としては)次の通りです。

物理的には(実行する方法としては)、おそらく次のようになると思います。

四角の箱はそれぞれ別のプロセスで、新しいプロセスは好きなようにプラグインすることができます。 例えば、クリックすると midi イベントが送られる画面上に仮想キーボードを入れたり、など。

次は見ておきたいidlです。

arts.idl: (あまりおもしろくありませんがfor that discussion now). midibus.idl:

    interface MidiChannel {
        oneway void noteOn(in octet channel, in octet note, in octet volume);
        oneway void noteOff(in octet channel, in octet note);
    };

    // もちろんまだ完成してません;)。エコーの深さなどのパラメータ、
    // midi マッピング、楽器の変更などはどこにあるのか...
    //
    //
    // いつか完成することを願って。

### その他の要件

現在、今後の標準となるであろう活動が行われているところです。 midi バスの考え方は非常によいのですが、 問題は midi イベントがそこでは間に合っていないことです。 リアルタイムのデータ(ライブでのパフォーマンス)についてはどうせできる方法はありそうにありません。 しかし、シーケンスのデータにとってこの考え方は理想ではありません。

もうひとつ、その標準ではハードディスクに書き込む簡単な方法が作れません。 これは興味深いことなのですが。

この問題と、aRts CORBA インターフェイスについてはこれからずっと取り組んでいきます。 これからも注目してください。

## GUI の部品

### 目標

GUI はシンセサイザのストラクチャがユーザと対話できるようにするものです。 簡単な例としては、最後の演奏モジュールの前に使われるゲイン・ファクタなど、 ストラクチャのパラメータをユーザが直接変更できるようになります。

もっと複雑な設定としては、例えば、 現在アクティブな midi 楽器の ADSR エンベロープなどストラクチャのパラメータを、 ストラクチャを実行することなしにユーザが変更できるようになります。 他には、サンプルをベースにした楽器のファイル名を設定したりできます。

一方、ユーザはシンセサイザが何をやっているか監視したいこともあります。 オシロスコープ、スペクトル分析器、ボリュームメータ、 特定のフィルタモジュールの周波数転送カーブを表示する「実験装置」などが利用できるでしょう。

最後に、GUI では aRts でどのストラクチャが動作しているのか、 それがどのように動作しているのかを管理することもできます。 ユーザは楽器に midi チャンネルを割り当て、エフェクトプロセッサを起動し、 aRts のストラクチャ自身で構築されているミキサの pult を設定してチャンネルをもう1つ増やし、 そのイコライザを別の方法で利用することもできます。

御覧のように、GUI は aRts のシミュレートする仮想スタジオの可能性を一手に引き受けるものです。 もちろん、GUI は適切に midi 入力と対話し (例えばパラメータの変わった midi 入力を取った時にスライダが移動し)、 ユーザの動作をシーケンサを通して記録できるように自分でイベントを作成しなければなりません。

### どんなものがあるかについて

まだ実験段階です。ほとんどの事はモジュールのリファレンスに書いてあります。 また、多少なりとも自明でなければなりません(例を見てください)。 そのため、ここでは多少複雑なことについて説明します。

パネル、サブパネル、スライダ、ノブ、ウィンドウ、 それ自身で何でもできる楽器のマッパーを作ることができます。 そして、立派な GUI を作ることができます。サブパネルを作ってその1個上を指定することで、 GUI を結び付けてストラクチャを自由に作れます。

このように、まだ多少実験的ですが、あなた自身で実験してみてください。 そして、- もっと重要です- フィードバックしてください！;) あなたのアイディア、コードをどんどん開発工程に投げ込んでください。 また、ホームページに公開されている "the gui challenge" もお読みください。

### 1つ上(親)

aRts には多少、ウィジェットの中にウィジェットを置くやり方があります。 ウィジェットを持つことのできるウィジェットは id と呼ばれる出力ポートを持ちます。 なので、例えばウィジェットでウィンドウの内部に制御をいくつか置くことが必要でしょうから、 ウィジェットに(outgoing)出力の id ポートを持たせます。

また一方で、他のウィジェットの中に置かれる(置く必要のある)ウィジェットは すべてparentと呼ばれる入力ポートを持ちます。 これにより、例えば GUI&lowbar;SUB&lowbar;PANEL をウィンドウ内に置くことができるようになります。

### GUI&lowbar;Mixer の魔法

音楽を作るのに重要な道具の一つにミキサがあります。 もちろん、aRtsでミキサを作成することができます。 それには、数100ものモジュールが Synth&lowbar;BUS&lowbar;DOWNLINK をいくつか取るようにして、 そしてそれを組み合わせ(コントロールパネルが必要かもしれない)、 それらをアップリンクかサウンドカードに送らなければなりません。

とにかく、ミキサのチャンネルを10個から16個に拡張するには、大変な労力を伴うでしょう。 自力で6個のチャンネルを作らなくてはいけないのですから。

この問題を解決するため、Gui&lowbar;MIXER が作られました。 これにウィンドウを割り当て、自分のミキサの1つのチャンネルがどのように見えるかを記述したストラクチャを与えます。 そのミキサがデータを取り入れるもとのバス名と、それがどこに(他のバス)置かれるかを指定します。

そして重要なのは、GUI&lowbar;MIXER によってチャンネルがいくつ欲しいか指定することができる、 ということです。 起動すると、Gui&lowbar;MIXER はチャンネルストラクチャの1つをチャンネル1つ1つに対して作成します。 そのため、10チャンネルのミキサを16チャンネルミキサにするには、パラメータを1つ変えれば済みます。

もちろん、チャンネルがどんなパラメータを取るかは知っておく必要があります。 これは単なる親のウィジェットです(だからパネルを置くことができます)。 データを取り入れるもとのバス名、データを送り出す先のバス名も知っておかなければなりません。 パラメータはparent, input, output という名前でなければなりません。 Gui&lowbar;MIXER はチャンネルに01から指定したチャンネル数の番号を付けます。

詳しくはモジュールのリファレンスを参照してください。

## チュートリアル

### ステップ 1

artsbuilder を起動しましょう。

作成した出力を聴くには Synth&lowbar;PLAY モジュールが必要です。 3つ目のパラメータ(チャンネル)は1か2に設定してください。 それぞれ、モノラル、ステレオサウンドが選択されます。 モジュール/Synth&lowbar;PLAY を選択し、空白のモジュール空間をクリックしてください。 Synth&lowbar;PLAY モジュールが作成されます。 それを5行目くらいのところに入れてください。その上にいくつか付け足すものがあります。

ボイスの数を選択します。チャンネル(モジュールの右端のポート)をダブルクリックし、 定数値を選択してからエディットボックスに2と入力します。 OKをクリックするとそれが適用されます。

ファイル/ストラクチャの実行を押してください。何も聞こえないはずです。 演奏モジュールにはまだ入力が必要です;)。 何も聞こえないことを確認したら OK をクリックしてステップ 2に進みましょう。

### ステップ 2

Synth&lowbar;WAVE&lowbar;SIN を作成して Synth&lowbar;PLAY の上に置いてください。 間は1行空けてください。 御覧のように、これは出力を出しますが、 "pos" を入力として要求します。 まず出力をスピーカに向けてください。 Synth&lowbar;WAVE&lowbar;SIN の "out" ポートをクリックし、 次に Synth&lowbar;PLAY の "left" ポートをクリックします。 さあ、これで2つのモジュールが接続されました。

aRts のオシレータは入力に周波数を求めませんが、ウェーブにポジションを求めます。 ポジションは0と1の間で、 こうすると標準の Synth&lowbar;WAVE&lowbar;SIN オブジェクトは 0..2*pi の範囲にマッピングされます。 周波数から振動値を求めるには、Synth&lowbar;FREQUENCY モジュールが使われます。

Synth&lowbar;FREQUENCY モジュールを作成し、その"pos"出力を Synth&lowbar;WAVE&lowbar;SIN の"pos" 入力に接続します。 FREQUENCY ジェネレータの周波数ポートに一定の値440を指定します。

ファイル/ストラクチャの実行をクリックしてください。 スピーカから440Hzの正弦波が聞こえてくると思います。 しばらく聴いたら、OK をクリックしてステップ 3に進みましょう。

### ステップ 3

オーケイ、スピーカの左右から正弦波が聞こえてきたらなおいいです。 Synth&lowbar;PLAY の右側のポートを Synth&lowbar;WAVE&lowbar;SIN の出力値にも接続してください。

Synth&lowbar;SEQUENCE オブジェクトを作成してください。 これはウィンドウのいちばん上に置いてください。 余地がないときは他のモジュールを選択してから(複数のモジュールを選択するにはShiftキーを押しながら)、 ドラッグして移動してください。

そうしたら、Synth&lowbar;SEQUENCE の周波数の出力を Synth&lowbar;FREQUENCY モジュールの周波数の入力に接続してください。 そしてシーケンスの speed を定数値の 0.13 に設定します。 speed とはいちばん左のポートのことです。

では、Synth&lowbar;SEQUENCE の右端のポート(sequence)に行って定数値A-3;C-4;E-4;C-4;を入力します。 これはシーケンスを指定するものです。 さらに詳しいことはモジュールリファレンスを参照してください。

注: Synth&lowbar;SEQUENCEは&lowbar;needs&lowbar; には sequence と speed が必要です。 これがないとコアダンプを起こします。

ファイル/ストラクチャの実行を選んでください。シーケンスの演奏が聞こえてくると思います。 十分楽しんだら、OK をクリックしてステップ 4に進んでください。

### ステップ 4

Synth&lowbar;PSCALE モジュールを作成します。SIN wave の出力値の接続を解除します。 それには、出力値の部分をダブルクリックしてから "not connected" を選択します。 そして、以下に示すように接続します。

- SIN の出力値を PSCALE の入力値に

- PSCALE の出力値を PLAY の左側に

- PSCALE の出力値を PLAY の右側に

- SEQUENCE の pos を PSCALE の pos に

最後に、PSCALE の top に値を、ここではとりあえず0.1に設定します。

どう働くのか...Synth&lowbar;SEQUENCE はその瞬間に演奏している音符の位置の情報を与えます。 0 がはじめ、1 が終わりを示しています。 Synth&lowbar;PSCALE モジュールはそれを通過するオーディオストリームをスケールします。 音量 0(無音)から 1(指定の音量)へ、そしてまた 0 へ戻ります。 音量のピークの位置は pos によって指定されます。 0.1 ならば、音符が演奏されてちょうど 10&percnt のところに最大音量が来ます。 それから、音は小さくなっていきます。

ファイル/ストラクチャの実行を選んでください。 スケールになったシーケンスの演奏が聞こえてくると思います。 十分楽しんだら、OK をクリックしてステップ 4に進みましょう。

### ステップ 5: Starting to beam data around ;)

artsbuilder をもうひとつ起動します。

Synth&lowbar;PLAY をその中に置き、チャンネルを2つ持たせます。 Synth&lowbar;BUS&lowbar;DOWNLINK を置き、

- Synth&lowbar;BUS&lowbar;DOWNLINKクライアントに定数値8を与えます (これは後で必要になります)。

- Synth&lowbar;BUS&lowbar;DOWNLINK バスを audio という名前に設定します (これは名前です。fred などでも構いません)。

- Synth&lowbar;BUS&lowbar;DOWNLINK の左端と Synth&lowbar;PLAY の左端を接続します。

- Synth&lowbar;BUS&lowbar;DOWNLINK の右端と Synth&lowbar;PLAY の右端を接続します。

ストラクチャを実行してみてください。予想通り、音は出ません...まだ。

Synth&lowbar;WAVE&lowbar;SINに戻って、 Synth&lowbar;PLAY モジュールを Synth&lowbar;BUS&lowbar;UPLINK に置き換え、名前を audio にします (fredなどでもかまいません)。 モジュールを削除するには、まず選択してからメニューの edit/delete を選ぶか、またはdelキーを押します。

ファイル/ストラクチャの実行を選んでください。 スケールされた音符のシーケンスがバスを経由して聞こえてくるはずです。 バスは8クライアントを運ぶことができるので、前よりも音量が低くなります。

このようなことが役に立つ理由が知りたいと思ったら、 okay をクリックして(Synth&lowbar;SEQUENCE を実行している artsbuilder では、もうひとつを動かしたままで) ステップ 6に進んでください。

### ステップ 6: Beaming for advanced users

ファイル/ストラクチャ名の変更を Synth&lowbar;SEQUENCE の置いてある artsbuilder のメニューから選び、 名前を tutorial にします。そして okay をクリックします。

ファイル/公開を選択します。

さあ、どうなりましたか？ - aRts サーバには既存のストラクチャを収録している倉庫があります。 記述、モジュールがどう接続してこのようなストラクチャになっているかが追加されればなお良いのですが。 今後のバージョンの aRts では数百のストラクチャの記述が収録されるでしょう。 そうすれば、オーケストラの楽器から、色々なエフェクトプロセッサ、ミキシング装置、 「スタンドアロンのシンセサイザ」などがサーバに置かれ、 作曲プログラムからそれらを利用できるようになります。しかしまだそこまで到達していません。

ともかく、自分で作ったストラクチャはこの倉庫に置かれます。

それが確認できたら、artsbuilder をもう1つ起動して、ファイル/検索をクリックしてください。 tutorial ストラクチャが出てくると思います。 この artsbuilder では別の artsbuilder と同じストラクチャがエディタに取り込まれます。

ファイル/ストラクチャの実行をクリックします。 artsbuilder はふたつとも同じストラクチャを持っています。 同じものが2回聞こえてくると思います。スタートさせる時間によってはもっと良く聞こえるかもしれません。

### ステップ 7: Midi シンセサイズ

最後に、正弦波を本物の楽器に流します。 これは、midi イベントを aRts に送れるものがあるときだけ意味があります。 ここでは外部キーボードを利用する方法について説明します。 ただ、Brahms のような midi バスを認識するシーケンサでもよいでしょう。

まず、artsbuilder を何も実行していない状態で2つ残して全部のウィンドウを閉じます。 artsbuilder の一方には tutorial ストラクチャが、もう一方には play ストラクチャ (ここでは base ストラクチャと呼びます)が入っています。 tutorial ストラクチャで、 Synth&lowbar;SEQUENCE モジュールを Interface&lowbar;MIDI&lowbar;NOTE モジュールに置き換えます。 その周波数を Synth&lowbar;FREQUENCY オブジェクトに接続します。 ただし、これには pos 出力がないことに気が付くと思います。

これは、アルゴリズムがなくても、一度 midi キーボードの鍵盤を押したら必ず離すからです。 だから、代わりに pressed パラメータがあり、ユーザが鍵盤を押しているかどうかを指示します。 (pressed = 1:鍵盤が押されている、pressed = 0:鍵盤から手が離れている)

このため、Synth&lowbar;PSCALE オブジェクトも置き換えられる必要があります。 代わりに Synth&lowbar;ENVELOPE&lowbar;ADSR を組み込みます。そして、

- MIDI&lowbar;NOTE の pressed を ADSR の active に接続します。

- SIN の出力値を ADSR の入力値に接続します。

- ADSR の出力値を UPLINK の左側に接続します。

- ADSR の出力値を UPLINK の右側に接続します。

パラメータattack を0.1に、decay を0.2に、sustain を0.7に、release を0.1にセットします。

他に考えなければならないのは、楽器のストラクチャはなんとかして、 演奏しはじめる時、自分が消滅する時を知る必要がある、ということです。 そうでないと、鍵盤が離された後も演奏が終わりません。 都合の良いことに、ADSR のエンベロープは何も聞こえなくなった時を認識します。 なぜなら、これは鍵盤が離された後にとにかく信号をゼロに見積もるからです。

これは、done パラメータが1に設定されることで示されます。 Synth&lowbar;STRUCT&lowbar;KILL モジュールを ADSR エンベロープの done 出力に接続します。 done が1になったらすぐにストラクチャは消去されます。

楽器のストラクチャをサーバに公開してください。 名前は tutorial のままにします。古いものは上書きされます。

もう一方の artsbuilder に行き、Synth&lowbar;MIDI&lowbar;ROUTER モジュールを挿入します。 チャンネルを0に、最大値を4に、ストラクチャを tutorial にセットします。 このモジュールは midi イベントをチャンネル0で受け取ります。 そして、受け取るたびに正弦波を作成しバスに書き込みます。 ところで：MIDI&lowbar;ROUTER をダミーな値に設定した場合には "bus" パラメータを設定してください。 これは後で説明します。x, y ,parent などのものは無視します。

ファイル/ストラクチャの実行をクリックします。 artsbuilder では、base ストラクチャだけ実行されているときは、 周波数を指定せずに楽器を演奏しても意味がありません。

端末を開き、`midisend`と入力してください。 キーボードを取り出し、演奏してみてください(当然ながら、コンピュータに接続した状態で)。 CPU のパワーがまだ多く残っているならば、MIDI&lowbar;ROUTER の最大値の設定をひとつ上げて、 8か、おそらくそれ以上の音を処理できるようにすることができるようになります。

### 本物の楽器を作る

...未解決... ううむ、これは書かなければいけないのだが。 楽器マッパーに認識される「本物の」楽器と、 さらに、その自前のコントロールパネルを作成することに興味があるなら、 コンセプトのセクションの「楽器」を読んでみてください。 ...終わり...

### 提案

これで、あなたは aRts を使うことができます。 ここには、自分のストラクチャを改善しようとするのに役立つ情報があります。

- 正弦波以外を使ってみてください。 TRI 波を組み込んだ場合、おそらくあまり良く聞こえないかもしれません。 しかし、SHELVE&lowbar;CUTOFF フィルタを TRI 波のすぐ後に付け足して、 ある値以上の周波数をカットしてください。 1000Hzなどを試してみてください。入力周波数の2倍か、入力周波数に200足した値がなおよいでしょう。

- オシレータを複数使ってみてください。 Synth&lowbar;XFADE は、2つの信号をクロスフェードさせるのに、 Synth&lowbar;ADD は2つを足すのに使えます。

- オシレータの周波数は2つで同一にしないようにします。これでオシレータはより良くなります。

- 複数のエンベロープで実験してみてください。

- 右側と左側で異なる出力を持つ楽器のシンセサイズを試してみてください。

- 信号がバスのダウンリンクに来た後にも処理をかけてみてください。 例えば、元の信号にその信号を遅らせた状態のものをミックスさせれば、 エコーエフェクトを得ることができます。

- Interface&lowbar;MIDI&lowbar;NOTE の与えるベロシティの設定を利用してみてください。 ベロシティとは鍵盤の押される強さで、ボリュームともいいます。 信号のボリュームを変えても、また楽器の音を変えても(周波数のカットなど)、 特殊なエフェクトがえられます。

- GUI 部品のセクションを読み、それで何ができるか確認してください。 それらは楽器の内部でではなく、後処理の道具として使ってください。

- ...

いいものができたら、mpg サンプル(と、できればストラクチャ自体)をウェブマスターに送ってください。 そうすれば、私達のページで紹介することができるかも知れません;)

## 例について

### 一般的なヒント

事実上、現在すべての例はおもに GUI 化され、楽器マッパーを使っています。 例を見るには、"ファイル/サーバの検索" をクリックします。 example&lowbar; で始まるものは全部、実行、閲覧できる例とされます。

シンセサイズの楽器はすべて、どの例でも利用できます。

楽器、flexible&lowbar;slide にも自前の GUI があります。

example&lowbar;stereo&lowbar;beep は、440 Hzの正弦波を左スピーカから、 880 Hzの正弦波を右から出すものです。

他のものはすべて midi シンセサイズの例です。 運のいいことに、今ならとても便利に使うことができるでしょう。

これらの例は次のように、midisend と連携して利用することもできます。

- artsbuilder を起動する

- ファイル/サーバの検索を実行する

- example&lowbar;instrument&lowbar;fx または example&lowbar;instrument&lowbar;pure を選択する： example&lowbar;instrument&lowbar;fx にはエコーエフェクトが追加されている

- ファイル/モジュールの実行を選択

- add を選択して、楽器を midi チャンネルに追加する

- これで、Arts は実行状態になっているので、midi バスから来るイベントをシンセサイズします。 さあ、何か作ってみましょう;)

- シェルから midisend を起動

- これで、キーボードから演奏することができます。

- 楽器は楽器マッパーですぐに換えることができます。

- シーケンスするには、midi バスを認識するシーケンサをインストールする必要があります。 (midi バスのセクションを参照) -- 例えばBrahms(以前の名称は kooBase)は aRts と連携して動かすのにとてもよいツールです。

メインストラクチャの楽器マッパーで使用できる音声の数に注意してください。 あなたのコンピュータではデフォルトの8よりも多くの音声を複数の楽器で処理できるかもしれないし、 8個は多すぎるかもしれません。CPU の使用状況を見てコンピュータの状況を把握してください。

## ユーティリティによる先進機能

### midisend でキーボードを分割

midisend は特別のマップファイルを利用できます。これは当座の解決法です。 aRts はオーディオ処理のようにモジュール式のやり方で midi プロセスを扱えません。

このファイルによって midisend に midi ポートから来る midi メッセージを変更するように指示します。 midi メッセージは aRts に送られる前に変更されます。

これにより、例えばキーボードを分割することができるわけです。

このファイルはシンプルな ascii ファイルです。'&num;'から始まるコメントとコマンドからなります。 空行は無視されます。余分なスペース、タブも無視されます。

用語:

ピッチ

  鍵盤の番号。 キーボードでどの音程がどう割り当てられているかを知るには、midisend を -v オプションを付けて起動します。

チャンネル

  楽器を指定します。aRts ではチャンネルを楽器に割り当てます。

次のコマンドで midisend を設定することができます。

PitchRange to Channel

  <Channel> のピッチが入って来たときに、それが特定の範囲内なら、 <PitchDifference> がピッチに追加されます。

  書式: PRC <Channel>,<FromPitch>,<ToPitch>,<ToChannel>

PitchRange Difference addition

  <Channel> のピッチが入って来たときに、それが特定の範囲内なら、 <PitchDifference> がピッチに追加されます。

  書式: PRD <Channel>,<FromPitch>,<ToPitch>,<PitchDifference>

Pitch To Channel

  <Channel> のピッチ <Pitch> が入って来たときに、 チャンネルは <ToChannel> に変わります。

  書式: PTC <Channel>,<Pitch>,<ToChannel>

Pitch To Pitch

  <Channel> のピッチ <Pitch> が入って来たときに、 ピッチは <ToPitch> に変わります。

  書式: PTP <Channel>,<Pitch>,<ToPitch>

例: 49個の鍵を持ったキーボードを仮定します。キーボードを2つに分け、 それぞれに同じオクターヴながら別々のチャンネルを配置するには、次のようにします。

    PRC 0, 1, 59,  1
    PRD 0, 1, 59, 24

初めの部分のキーボードのオクターヴを1つ下げるには次のようにします。

`PRD 0, 1, 59, -12`

### akaiparse で CD から AKAI のサンプルを抜き出す

aRts はユーティリティ akaiparse で AKAI サンプル CD を読むことができます。 今のところ、これは S1000 サンプル CD に対してのみ使えます。 他の種類の AKAI サンプルとプログラミングスキルを持っている方は、 それらも扱えるようにユーティリティを拡張することを考えるのもよいでしょう。

CD には一般的に2種類のファイルが入っています。 サンプルとプログラムです。プログラムには、 どのサンプルをどれくらいの midi ピッチとベロシティで演奏するかを決めるキーマップが入っています。 現在、aRts は CD から抜き出したサンプルのみを利用できます。プログラムは利用できません。

CD にアクセスする方法は2種類あります。 ひとつは、CD 全体のイメージを作成し(1枚あたり650MBくらいはあるでしょう)、 それから akaiparse でイメージからサンプルを取り出す方法です。 イメージを作成するには、 `dd if=/dev/cdrom of=<how_you_want_to_call_your_image>` を実行します。 もうひとつは、akaiparse で /dev/cdrom をファイルの場所に指定して CD に直接アクセスすることです。

akaiparse では次のことができます。

パーティション(または指定のディレクトリ)の内容を表示

  - akaiparse <file> <partition> ls

  - akaiparse <file> <partition> ls <directory>

パーティション(または指定のディレクトリ)のサンプルを抜き出す

  - akaiparse <file> <partition> get

  - akaiparse <file> <partition> get <directory>

<file>はAKAI CD-ROMディスクイメージのファイル名か、CDROM デバイス名 (/dev/cdrom, /dev/scd0, /dev/scr0など)

<partition>はA, Bなどのパーティションレターかまたはすべてのパーティションを表示する'all'

### akaikggen で AKAI キーマップを構築する

約100のすべてがピアノのサンプルの抜き出しができたとして、 aRts でF3キーを押したら BOE&lowbar;LD&lowbar;F&num;3-L サンプルが左チャンネルから、 BOE&lowbar;LD&lowbar;F&num;3-R サンプルが右チャンネルから演奏されるようにしたいとします。 BOE&lowbar;LD&lowbar;F&num;3-* サンプルと BOE&lowbar;LD&lowbar;G&num;3-* がひとつずつしかなくて、 BOE&lowbar;LD&lowbar;G-3-*がないなら、BOE&lowbar;LD&lowbar;F&num;3-* サンプル、 または BOE&lowbar;LD&lowbar;G&num;3-* サンプルを代わりにaRtsで適切に ピッチをアップ・ダウンさせて演奏したいかもしれません。

キーマップの作成に時間を掛けずにこれを実現するために、ユーティリティ akaikggen があります。 これはサンプルのグループを定義することで働きます。 グループには left&lowbar;channel と right&lowbar;channel があり、 すべての -L のサンプルを left&lowbar;channel に、-R のサンプルはright channelに割り当てます。

それには、端末ウィンドウを開き、次のようにします。

    akaikggen leftsample = BOE&lowbar;LD&lowbar;*-L rightsample = BOE&lowbar;LD&lowbar;*-R

結果が良かったら、ファイルにダイレクトすることもできます。

    akaikggen leftsample = BOE&lowbar;LD&lowbar;*-L rightsample = BOE&lowbar;LD&lowbar;*-R > boe&lowbar;ld.arts-map

問題を扱いやすくするには、ファイルの最初に `structure=play_akai_stereo` を追加しましょう。 そうしたら、ファイルをホームディレクトリの arts/maps ディレクトリにコピーして使うことができます。

### artsshell でサーバを設定する

Artsshell は artsserver CORBA インターフェイスに直接アクセスするユーティリティです。 よって artsserver が動いている時にのみ動作します。

たくさんの設定オプションを artsshell で調整することができます。

状態についての情報を取得する

  次のように起動します。

      artsshell -i

  キャッシュの使用状況、動作中のモジュールの数など、有益な状態情報が得られます。

      artsshell -s

  だと、aRts の実時間の設定をいくつか確認することができます。

キャッシュ容量

  サンプルを扱っているとき、それをartsserverが自動的にキャッシュに入れてくれると便利です。 しかし、100個のピアノサンプルをロードした時など、最初の設定の8MBでは十分でない場合があります。 これを増やすには、次のようにします。

      artsshell -C <cachesize in KB>

リアルタイム(レイテンシー)パラメータ

  コンピュータ、アプリケーションによっては、最初のレイテンシーが最適でない場合があります。 例えば、aRts がオーディオサーバの仕事だけしていればよく、mp3 を少しだけ聴くぐらいなら、 レイテンシーの値は10msも必要ではありません。 プレーヤーの停止ボタンを押したら少し間を置いて mp3 が停止するようにするのには十分ですが、 これには0.5秒がいちばんいいでしょう。

  レイテンシーパラメータは3つあります。 フラグメントの数、各フラグメントのサイズ、スケジューリング周期のサイズです。 サウンドドライバのバッファはフラグメント * バイト(各フラグメントのサイズ)からなります。 そのバッファは16ビットなら2で割られて、チャンネルの数がレイテンシーを決めます。 OSS の実行の仕組みについて詳しく説明した文書は、 http://www.4front-tech.com/pguide/audio2.htmlにあります。

  スケジューリング周期のサイズとは、 サウンドカードのバッファがあまっているのを aRts が感知したときに、 aRts がいくつのサンプルを計算するかを示しているものです。

  役に立つ結果がほしいなら、スケジューリング周期の遅延はフラグメントの遅延よりも小さくしましょう。 規則:フラグメントの遅延はおそらくスケジューリング周期の遅延と一致しているでしょう。 次のコマンドを使ってください。

      artsshell -F <fragments>:<size> -S <scheduling&lowbar;cycle&lowbar;samples>

  これらのパラメータを設定するために

デバッグ情報

  arts を開発しているとき、またはバグを探しているときは、次を利用してください。

      artsshell -D 1

  デバッグ情報が表示されます。artsserver からその情報を表示させるには、 printf を使うのと同じ要領で artsdebug を利用してください。 ただし、"debug.h" をインクルードする必要があります。

### artscat によるオーディオサーバの機能性

オーディオサーバのセクションも読んでください。aRts-0.3.4 では、 artscat は aRts からくるデータをレコードすることができます。 同時処理カードを使えば同時に外界からのデータをレコードできます。 どちらにしろ、aRts の動作はレコードできるわけです。

一方、aRts でデータのリプレイもできます。

データを演奏する

  aRts でデータを演奏するには、

      artscat -t <type> -d <description> -p

  と入力します。標準入力には演奏したいデータを入れてください。 44100 Hz, raw, 16ビット、ステレオ、正弦、le データと仮定されます。

データをレコーディングする

  aRts からのデータを録音するには、次のようにします。

      artscat -t <type> -d <description> -r

  録音の結果は標準出力に出てきます。 それは、44100 Hz, raw, 16ビット、ステレオ、正弦、le データのはずです。

  クリッピングに注意してください。aRts は内部ではすべてのデータを浮動小数点として扱います。 そのため、インスタンスデータを&lsqb;-4..4] の範囲でバスから転送しても関知しません。 しかし、artscat からそのデータを録音すると、そのデータはクリップされます。 そのため、オーバーフローが出て困ったことになります。 録音はバスから、そして適当なデータが入っていることを確認してからにしましょう。 Synth&lowbar;SATURATE&lowbar;ATAN がそこで役に立ちます。

artscat の処理はユーザインタラクションを通してバスに与えられます。 ただ artscat を起動しても何もできません。バスを割り当てる必要があります。 それは artsshell -c/-d かまたはオーディオマネージャを走らせているGUI ストラクチャから行ってください。 (example&lowbar;mixer&lowbar;eqfx など)

## シンセサイズモジュール・リファレンス

### Synth&lowbar;NIL

これは何もしません。テストにだけ使えます。

### Synth&lowbar;XFADE

2つの信号をクロスフェードします。パーセンテージの入力が -1 だと、左側の信号だけが聞こえます。 1 ならば、右側の信号だけが聞こえます。0 ならば両方の信号が同じ音量で聞こえてきます。

これにより、信号を明確な範囲に収めることができます。 クロスフェーディングの前に -1 と 1 の間にあった2つの信号は、 クロスフェーディングの後でも同じ範囲になります。

### Synth&lowbar;AUTOPANNER

クロスフェーダの逆です。モノラル信号を取り、それを分けてステレオ信号にします。 自動的に入力信号を左右の出力に分けます。これにより、ミックスがより生き生きとしてきます。 標準的なアプリケーションはギターかリードサウンドでしょう。

LFO、方形波、鋸歯形波を inlfo に接続してみてください。 そして、周波数を0.1 から5Hz の間にして、普通のエフェクト、または Special FX を作ってみてください。

### Synth&lowbar;MUL

信号に数字を掛けます。信号をスケールダウン(0 < factor < 1)、 またはアップ(factor > 1)、反転(factor <0)させることができます。 ファクタは信号でもかまいません。定数(エンベロープ、実信号)である必要はありません。

### Synth&lowbar;ADD

2つの信号を足します。

### Synth&lowbar;DELAY

ある時間だけ入力信号を遅らせます。時間の指定は0と1の間で、遅延は0秒から1秒の間です。

この種の遅延はフィードバックストラクチャでは使えません。 これは可変遅延だからです。動作中にもその長さを変更することができます。 ゼロまで下げることもできます。しかし、フィードバックストラクチャでは、 そこからの出力は次のサンプルで計算しなければならないので、 シンセサイズ中に値がゼロに落ちるような遅延は重大な状況を引き起こします。

セットアップでは CDELAY を使ってください。 定数に決まった(0.001秒の)遅延をフレキシブルな遅延に結合します。

CDELAY と DELAY を結びつければ、 長さを変えられてしかもフィードバックループの最小値を持つ遅延を作ることができます。 CDELAY が入っていることを確認してください。

### Synth&lowbar;CDELAY

ある時間だけ入力信号を遅らせます。時間の指定は0と1の間で、遅延は0秒から1秒の間です。 計算中、遅延は一定です。値が変わりません。

変更がないので計算時間を節約できます。回帰構造で役に立ちます。 上の説明も見てください。(Synth&lowbar;DELAY)

### Synth&lowbar;FX&lowbar;CFLANGER

フランじゃは時間の変化するディレイ・エフェクトです。 複雑なフランジャエフェクトの開発を簡単にするために、このモジュールができました。 1チャンネルのフランジャのコアがこのモジュールに入っています。

次のようなポートがあります。

入力値(invalue)

  処理すべき信号。

lfo

  フランジャ内での遅延時間を調節する正弦波。(-1 .. 1)

最小時間(mintime)

  フランジャの遅延の最小値。単位はミリ秒。 推奨値: 1msあたりを試してみてください。必ず1000ms以下にしてください。

最大時間(maxtime)

  フランジャの遅延の最小値。単位はミリ秒。 推奨値: 5msあたりを試してみてください。必ず1000ms以下にしてください。

出力値(outvalue)

  出力する信号。希望のエフェクトを得るには、 これと元の(フランジしていない)信号を組み合わせることが重要です。

ヒント: これはコーラスエフェクトの基礎にできます。

### Synth&lowbar;FREQUENCY

aRts のオシレータは周波数ではなく、波形の位置を入力に要求します。 位置は0から1の間で、それは標準の Synth&lowbar;WAVE&lowbar;SIN オブジェクトの範囲0..2*piに写像されます。 周波数からオシレーティングの値を求めるのに、Synth&lowbar;FREQUENCY モジュールを使います。

### Synth&lowbar;FM&lowbar;SOURCE

周波数の調整に用います。周波数を周波数入力に入れ、 別の信号を調整器の入力に置きます。それから、modlevel を設定します。ここでは0.3にしましょう。 周波数が調整されます。やってみてください。フィードバックをそこに入れるとよいでしょう。 これはつまり遅延された Synth&lowbar;FM&lowbar;SOURCE からの出力信号と他の信号のコンビネーションを 取るということです。前者の出力信号は、Synth&lowbar;FREQUENCY の役目をするだけなので、 オシレータに入れる必要があります。これで良い結果が得られるでしょう。

Synth&lowbar;WAVE&lowbar;SIN オシレータと共同するとよいでしょう。

### Synth&lowbar;WAVE&lowbar;SIN

正弦オシレータです。 Synth&lowbar;FREQUENCY または Synth&lowbar;FM&lowbar;SOURCE から pos 信号を入力部に置きます。 出力に正弦波を得ます。pos 信号は波形の位置を指定します。 0 .. 1の範囲は内部で0 .. 2*piに写像されます。

### Synth&lowbar;WAVE&lowbar;TRI

トライアングルオシレータです。 Synth&lowbar;FREQUENCY または Synth&lowbar;FM&lowbar;SOURCE から pos 信号を入力部に置きます。 出力にトライ波を得ます。pos 信号は波形の位置を指定します。 0 .. 1の範囲は内部で0 .. 2*piに写像されます。注意しましょう。 入力信号は「必ず」0 .. 1の間になければなりません。 そうしないと、適切な出力信号が出てきません。

### Synth&lowbar;WAVE&lowbar;SQUARE

スクエアオシレータです。 Synth&lowbar;FREQUENCY または Synth&lowbar;FM&lowbar;SOURCE から pos 信号を入力部に置きます。 出力に正弦波を得ます。pos 信号は波形の位置を指定します。 0 .. 1の範囲は内部で0 .. 2*piに写像されます。 入力信号は「必ず」0 .. 1の間になければなりません。 そうしないと、適切な出力信号が出てきません。

### Synth&lowbar;PLAY

作成した出力を聴くには、Synth&lowbar;PLAY モジュールが必要です。 3つめのパラメータ(channels)は1もしくは2です。1ならモノラル、2ならステレオ音声になります。 左右のチャンネルには規準化された入力があります。 モノラルでは、左側だけから音声が出ます。 入力が-1と1の間でないと、ノイズが出ます。Synth&lowbar;ATAN&lowbar;SATURATE を使えば、 範囲を適正に保てます。

Synth&lowbar;PLAY モジュールは一度にひとつしか使えません。 これは直接サウンドカードにアクセスするからです。 演奏前に複数のオーディオストリームをミックスしたいなら、バスを利用しましょう。

Synth&lowbar;PLAY はストラクチャ全体のタイミングも取ります。 つまり、Synth&lowbar;PLAY がなければ、タイミングを取るのがないので、音も出ません。 だから、Synth&lowbar;PLAY オブジェクトが最低ひとつどうしても必要なわけです。

### Synth&lowbar;FILEPLAY

Arts のやっていることを把握したいなら、これを実行しましょう。 Synth&lowbar;FILEPLAY を使いましょう。「書式」は Synth&lowbar;PLAY と同じです。

モノラル出力するときだけ左のチャンネルに接続する必要があります。 ステレオ出力のときは両方使います。それから、チャンネル-ポートでチャンネル数を指定しましょう。 モノラルなら1、ステレオなら2です。Arts は演奏するものをファイル /tmp/arts.wav にダンプします。 ファイルが既にあった場合、上書きされます。

重要:これはいつも Synth&lowbar;PLAY モジュールと 使ってください。そうしないと、スケジューリングが上手くいきません。

### Synth&lowbar;DEBUG

デバッグに使えます。invalue の部分に定期的に(およそ1秒)信号の値が表示されます。 それには、あなたが指定したコメントが挿入されます。 これで、信号が特定の範囲に残っているか、またはそのような信号があるか、が分かります。

### Synth&lowbar;PLAY&lowbar;WAV

wav ファイルを再生します。これは、コンピュータに libaudiofile があるときだけ存在します。 いづれコードを書き直します。wav ファイルはストラクチャが作成されると同時に再生が始まります。 wav ファイルが終わると同時にこれも停止します。そして、done が1になります。 これでストラクチャが消去されるわけです。

### Synth&lowbar;PLAY&lowbar;AKAI

akai サンプルファイルを再生します。akai サンプルファイルはこのストラクチャが作成されると同時に 再生が始まります。ファイルが終わると同時にこれも停止します。そして、done が1になります。 これでストラクチャが消去されるわけです。

AKAI サンプルファイルには基本的なピッチと録音周波数が入っており、 ピッチの修正ができます。そのため、希望の周波数を指定することもできます。 その結果もピッチシフトされます。ピッチシフティングはサンプルの長さに影響します。

### Synth&lowbar;PLAY&lowbar;AKAIS

Synth&lowbar;PLAY&lowbar;AKAI と同じです。 ただし、これは AKAI サンプルファイルを2つ同時に再生します。1つは左から、1つは右から出ます。 AKAI サンプルはリアルステレオをサポートしていないため、これは有用です。 Synth&lowbar;PLAY&lowbar;AKAI を2つ使うことでも同じことができますが、CPU パワーを消費してしまいます。 ここでは、ピッチシフティングは1回しか計算されません。 サンプルは同じサンプリングレートと同じピッチで録音されていると仮定されます。 そうしないと、当然ながら動作しません。

### Synth&lowbar;BUS&lowbar;UPLINK

バスへのアップリンクです。左右に信号を与え、 それからデータ行くバス名は "bus" ポートにします。 アップリンクのすべてから結び付けられ、この名前を持った信号は その "bus" のダウンリンクに表示されます。

### Synth&lowbar;BUS&lowbar;DOWNLINK

特定のバス("bus" ポートに指定した名前を持つ)に置かれたデータ(の集計)をすべてとります。 信号が範囲から外れるのを避けるため、クライアントのポートに与えられるクライアントの総数を指定します。 信号はその数に分けられます。

### Synth&lowbar;SHELVE&lowbar;CUTOFF

周波数の上限を超えるものを排除します。

### Synth&lowbar;MOOG&lowbar;VCF

周波数の上限を超えるものを排除します。 これは24db 4pole フィルタです。周波数の上限より上の-24db/オクターブを排除します。 しかし、さらにフィルタのリゾナンスを調整するためのパラメータを与えます。 それが0だとリゾナンスがなく、4だとセルフ・オシレーションを意味します。

### Synth&lowbar;RC

ダンプされたリゾナンスフィルタです。あるピーク値周辺の周波数を排除します。 真中辺りの周波数を指定してもあまり意味はありません。カットされないからです。 入力は2つの定数 f, b です。コードはとても古く、シンセサイザを作り始めた日からのものです。 そのうち、周波数とリゾナンスの値を変数にした新しいフィルタに置き換えられるでしょう。

とりあえず、b=5, f=5 or b=10, f=10 or b=15, f=15 などを試してみてください。

### Synth&lowbar;STD&lowbar;EQUALIZER

パラメータ式のイコライザ構築物です。パラメータは、

入力値、出力値(invalue, outvalue)

  イコライザに排除される信号

low

  低周波数はどうやって変えるのでしょうか。値の単位は dB です。 0 は低周波数を変えないこと、-6 は 6dB 切り下げること、+6 は 6dB 上げることを意味します。

mid

  中周波数を変える方法は low と同じ。単位も dB です。

high

  高周波数を変える方法は low と同じ。単位も dB です。

周波数(frequency)

  イコライザの中心周波数です。単位は Hz です。中周波数はこのスペクトルの中で、 高低周波数はそのさらに上か下にあります。 この周波数はサンプリングレートの半分 -- たいていは 22050 Hz -- よりも高くなってはいけません。 また、1 Hz よりも低くなるのもいけません。

q

  真中の周波数帯がどれくらいの広さになるかに影響します。これはプラスの数でなければなりません。 値が1だと通常の広さで、それよりも大きいと周波数帯が狭いことを意味します。 1よりも小さければより広いことになります。

### Synth&lowbar;SEQUENCE

音符のシーケンスを繰り返し再生します。音符はトラッカー表記で、 セミコロンで区切ります。つまり、`A-3;C-4;E-4;C-4;`のようになります。 テンポの速さは音符ごとに秒で示されます。よって、120 bpm を出したいときには、 0.5 秒/音符に指定します。60 秒/0.5 秒 =120 bpm ですので。

個々の音符について相対的な長さを指定することができます。 それは音符の後にコロンを付け、その次に書きます。 つまり、`A-3:2;C-4:0.5;D-4:0.5;E-4;`のように。 ご存知のように、？midi 作曲プログラムの方が使いやすさでは上のようです;)

Synth&lowbar;SEQUENCE から、その瞬間再生している音符の位置についての情報が分かります。 0 ならば始まったところで、1が終わったことを表します。 この情報を Synth&lowbar;PSCALE で使うことができます。

### Synth&lowbar;PSCALE

Synth&lowbar;PSCALE モジュールは通過するオーディオストリームをスケールさせることができます。 音量 0(無音)から始まり、1(元の音量)に来てからまた 0(無音)に戻ります。 位置は Synth&lowbar;SEQUENCE から取得します。 ピークの来る位置は pos で指定します。

例: top を 0.1 にすると、音符の 10&percnt; が再生されるときに音量が最大になります。 それから、音量は下がっていきます。

### Synth&lowbar;ENVELOPE&lowbar;ADSR

伝統的な ADSR エンベロープです。次のものを指定します。

active

  今、鍵盤をユーザが押しているかどうか

invalue

  入力信号

attack

  ユーザが鍵盤を押してから信号が最大振幅に到達するまでの時間(秒)

decay

  信号が最大振幅に到達してからある一定のところまで下がるまでの時間(秒)

sustain

  信号がその後ユーザが鍵盤を離すまで保持する一定のレベル

release

  ユーザが鍵盤を離してから、信号がゼロになるまでの時間(秒)

スケールされた信号が outvalue から得られます。ASDR エンベロープが終了すると、 done が 1 になります。 そうしたら、Synth&lowbar;STRUCT&lowbar;KILL でストラクチャを消去することができます。

### Synth&lowbar;STRUCT&lowbar;KILL

ready 信号が 0.5 より大きくなったときに、 または read が 1 になったときに現在のストラクチャを消去します。 楽器ストラクチャの ASDR エンベロープや PLAY&lowbar;WAV で有効です。

### Synth&lowbar;MIDI&lowbar;ROUTER

右チャンネルに midi イベントが来るたびに決まったストラクチャが作成されるようにします。 CPU の時間を浪費しないように、一度にアクティブになるストラクチャの数を決めることができます。

ストラクチャに Interface&lowbar;MIDI&lowbar;NOTE があるなら(できるだけ入れましょう！)、 MIDI&lowbar;ROUTER は周波数などの情報をストラクチャへ渡します。

指定したストラクチャに(ストラクチャ名)&lowbar;GUI というコントロールパネルが付いていれば、 x, y, parent パラメータが与えられ、キーが押される前にパネルが作成されます。 詳しくはコンセプト->楽器を見てください。

### Synth&lowbar;MIDI&lowbar;DEBUG

midi イベントが aRts から実際にどう届くか、デバッグすることができます。

MIDI&lowbar;DEBUG が動いているときには artsserver から次のような行が発せられます。

    201 100753.837585 on 0 42 127

    202 101323.128355 off 0 42

最初の行は、MIDI&lowbar;DEBUG が呼び出されてから100753ms(これは100秒のこと) 後に、 midi on イベントがチャンネル 0 に到着したことを表しています。 この midi on イベントはベロシティ(音量)が最大で 127 です。 次の行は midi release イベントを表しています。

### Synth&lowbar;ATAN&lowbar;SATURATE

入力信号を、Synth&lowbar;PLAY が処理できる通常の範囲-1 .. 1 の間にします。 入力信号の音量が大きいほど、信号はこのモジュールによって歪められます。 とても小さい入力信号なら、出力信号は入力とほとんど変わりません。

### Interface&lowbar;MIDI&lowbar;NOTE

周波数、ベロシティ(音量)、キーが押されているかどうかのパラメータを得ることができます。 この情報は Synth&lowbar;MIDI&lowbar;ROUTER によってストラクチャが作成されたときにだけ出てきます。

### Internal parameters modules Synth&lowbar;PARAM&lowbar;<whatever>

Synth&lowbar;PARAM&lowbar;GET,Synth&lowbar;PARAM&lowbar;SET, Synth&lowbar;PARAM&lowbar;SGET and Synth&lowbar;PARAM&lowbar;SSET は、 テスト、ソースを読みたい場合以外は使わないでください。 これらは今後の aRts リリースからは削除されるでしょう。

### 内部オーディオサーバ・サポート

Synth&lowbar;AMAN&lowbar;INJECT はオーディオデータをオーディオサーバクライアントから フローシステムへ注入するのに使われます。これはストラクチャ内では使わないでください。 これは内部で使われます。audioman&lowbar;impl.cc を参照してください。 断りなく変更・削除されるかもしれませんが。

## ビジュアル・モジュール・リファレンス

### Gui&lowbar;PANEL

他のコントロール部品の置き場所になるパネル。幅と高さを指定しましょう。 指定は 10 ピクセル単位ですので、width = 10, height =10 ならば、 100*100 ピクセルのオブジェクトが画面に作成されます。

パネルには id と呼ばれる出力があります。それを他のコントロールのひとつ上のポートに繋げると、 パネルにそのコントロール部品を置くことができます。

### Gui&lowbar;SUB&lowbar;PANEL

幅、高さ、ピックスマップはパネルと同じです。ただ、このサブパネルは parent を繋げることで、 他のパネルの中に入れることができます。そして、ひとつ上のパネルが許せば、 その中での相対的位置を x, y で決めることができます。

### Gui&lowbar;POTI

パラメータを調節するためのノブです。parent,x,y はサブパネルと同じです。 color で色を決めます。red,darkgrey などの色名か、&num;rrggbb という表記法で指定できます。 caption はノブの名前です。min と max はパラメータの最小・最大値です。 そして、ノブは最初に initial で指定された位置に表示されます。 値を利用したいところに value を接続しましょう。

### Gui&lowbar;SLIDER

ノブとほぼ同じ。テーマ化のために、2つのピックスマップに分かれます。まだ実験的です。 ひとつは可動部分、もうひとつは背景です。

### Gui&lowbar;WINDOW

ウィンドウです。caption がウィンドウのタイトルになります。 ここにパネル、サブパネルを置きましょう。

### Gui&lowbar;LABEL

ラベルです。caption はテキストで、parent はひとつ上の部品、x,y は位置、 pixmap は背景のピックスマップを表します。パラメータ color で色が決まります。 "blue" などの文字列でも、&num;rrggbb 表記法で指定しても、どちらでもいいです。

### Gui&lowbar;INSTRUMENT&lowbar;MAPPER

ユーザの行動によって楽器を midi チャンネルに結びつけるための魔法の道具です。 パネル、サブパネルに置くと良いでしょう。

### Gui&lowbar;AUDIO&lowbar;MANAGER

楽器マッパーと同じく、管理用。オーディオサーバに接続しているオーディオクライアントを表示します。 オーディオサーバについては次の章を参照してください。さらに、 ユーザがクライアントをバスに接続させることも可能にします。 クライアントにバスを割り当てないと、再生することすらできませんので。

これはウィンドウマネージャとほぼ同じ考え方にのっとっています。 ウィンドウマネージャは、ユーザがデスクトップに場所を与えたウィンドウだけを画面に開きます。 多くのウィンドウマネージャが持っている機能です。

### Gui&lowbar;MIXER

ミキサを作成します。次のパラメータを与えましょう。

parent

  ミキサの居場所。これにはウィンドウを割り当てないといけないでしょう。

channels

  チャンネル数。ミキサはステレオチャンネルに対して処理をしますので、 ここで 8 を指定すると、16 のモノラルオーディオチャンネルができます。

structure

  チャンネルがどう見えるか。下を参照。

name

  ミキサの名前。個別のチャンネルは、<name>01, <name>02, <name>03,... のようになります。

output

  どの出力バスが利用されるか。

ミキサに与えたストラクチャは、1つの(ステレオ)ミキサチャンネルを持っていて、 さらにそれにはコントロールパネルが付いています。 ストラクチャは次のパラメータを備えていないといけません。

input (IN string property)

  個々のチャンネルがどのバスからデータを受け取るか。 データは Synth&lowbar;BUS&lowbar;DOWNLINK でユーザ自ら取ってこないといけません。

parent (IN audio signal)

  コントロールパネルが表示される場所を決めるもの。 ただし、Gui&lowbar;SUB&lowbar;PANEL ウィジェットがあります。 A parent specification where your control panel should be drawn. But a Gui&lowbar;SUB&lowbar;PANEL widget there.

output (IN string property)

  どのバスにチャンネルがデータを送り出すか。 データは Synth&lowbar;BUS&lowbar;DOWNLINK でユーザ自ら送らないといけません。

## aRts を「ジェネリックオーディオサーバ」として利用する

### 「ジェネリックオーディオサーバ」とは何か？

サウンドカードが1つしかないけれども、 オペレーティングシステムでは同時に50個くらいのアプリケーションを走らせることができます。 従来の環境では、そのうちの1つしかサウンドカードに読み書きできません。 Linuxには/dev/dspデバイスが1つしかないからです。

しかし、この問題が明快に解決されている分野もあります。 グラフィックアダプタはたいていは1つしかありませんが、 それでも同時に50個ものアプリケーションを走らせることができます。 それぞれのアプリケーションはそれぞれ1つのウィンドウで実現されています。 そして、どこに何を配置するかを決めるウィンドウマネージャ、何かを起動する時に使うパネル、 仮想デスクトップを実現するウィンドウマネージャなどがあります。 このように、X11 などのウィンドウシステムによって問題が実に見事に解決しています。

ここでいう「ジェネリックオーディオサーバ」の考え方は、 X11のような解決策をオーディオにも適用しようというものです。 つまり、サーバがサウンドカードへのアクセス権を持っていて、 他のアプリケーションはこのサーバを通してのみサウンドカードに読み書きできる、ということです。

### ESD/KAudioServer その他

ちょっと待った。またですか？esd が同じようなことをすること、 kaudioserver もこの問題を解決していると、聞いたことがあると思います。なぜ中心部を作り変えるの？

基本的に、上記のツールがやっているのは、入ってくるストリームを合計することで、 レコーディングとサンプルの演奏の機能を提供しています。 その機能自体はよいのですが(また特定のタスクに対しては適切に最適化されています)、 そのやり方はより複雑なアプリケーションをそれらのサービスとともに提供するには不充分です。

また、AudioLogic のなどは自分のタスクを実現するのに ESD や KAudioServer を利用することができません。

X11とのアナロジーで述べるなら、これらの「シンプルな」オーディオサーバは、 SVGALib で複数の Linux コンソールを実現しているようなものです。 同時に1つしかアプリケーションを動かせないという問題は解決できますが、 それらを連携して利用する、という素晴らしい道を開いてくれません。 マネジメント、インタラクション、同期、midi に関すること、フィルタなどのコンセプトがありません (またはごく小さい部分しか実現されていません)。

### 代わりの選択肢：aRts を「ジェネリックオーディオサーバ」として利用する

一方、aRts には ESD や KAudioserver に不足している 「ジェネリックオーディオサーバ」を可能にする機能に不足がありません。

aRts では多くの問題がすでに解決していて、またたくさんの技術が利用できます。 だからこうすることで多くの恩恵が受けられます。例えば、

- リアルタイム

- フローグラフ

- 並列処理

- エフェクト

- GUI との対話

- 複数のクライアントへのインターフェイス

- midi 技術

それで、理想としては aRts を常時動作のジェネリックオーディオサーバに相応しいものにして、 そしてシンプルな mp3 プレーヤー以上のもの、 例えば AudioLogic や CuBase にもサービスを提供できるようにしたいところです。

aRts はゆくゆくは自分の動いているプラットフォームの DirectSound の代替品になるかもしれません。 そうなると、複数のアプリケーションを実時間内に共有フローシステムを通して 相互に協力させるようにすることができるでしょう。

### artscat: はじめの一歩

もちろん、複雑なアプリケーションは別にして、 aRts はまずは ESD/KAudioServer がうまくやっているタスクはできなければなりません。 ここでは、mp3 プレーヤーとともに、新たに作成された artscat が はじめの「ジェネリックオーディオサーバ」の機能をどう提供しているかを見てみましょう。

理想の世界では、オーディオサーバ(つまりは aRts のこと)はとりあえず mp3 を認識して、 さらに、mp3 などのメディア用の演奏の枠組みがオーディオサーバの内部にあって、 さらには mp3 プレーヤーなどはなくて、 aRts 自身がかっこいい制御画面を表示させて mp3 を演奏するようになっています。

残念ながら、そのような理想郷と私達の生きる現実の世界とは違います。 だから、理想に到達するにはまだしなければならないことがあります。

都合のいいことに、mp3 プレーヤーは大した事をしなくてもできます。 ファイルを読み込み、ウィンドウを描き(または描かず)、最後にストリームをサウンドカードに送ります。 ここでは、ストリームを aRts に送るようにすればよいのです。 そうして、aRts はそれを受信したら、ミキサ、エフェクト、バス、フィードバックループなどに通します。 そして最後にサウンドカードに送ります。

新しい aRts のリリース(>= 0.3.3)ではそれができます。 artscat という小ユーティリティがあり、それは標準入力からバイトストリームを受信し、 それを TCP(CORBA は遅すぎるので使わない)を経由して aRts に送ります。artscat には次の書式があります。

    artscat -d <description> -t <type>

type と description はユーザが何が行われているか知るためのものです。 今後の aRts では、チャンネルを特定のサービスに自動的に割り当てるのに使われることになるでしょう。

もう一方の側では、ストリームが受信されます。 ユーザは Gui&lowbar;AUDIO&lowbar;MANAGER ウィジェットでどのバスにデータを送るかを選ぶことができます。 これと同じ割り当て機能を artsbuilder の代わりに artsshell で実現する方法を知りたいときは、 artsshell のオプション -c と -d を見てください。 実際的なテストケースを実演するために、artsmp3 が書かれました。 mpg123 がインストールされているなら、次のように入力してください。

    artsmp3 <filename>

artsmp3 はサーバへストリームを送るのに artscat を使います。 また、konsole ウィンドウを開いて出力を表示します。 画面にミキサがあってもきちんと動作します(example&lowbar;mixer&lowbar;eq を試してみてください)ので、 他のものと mp3 をミックスすることができます。 例えば、キーボードでの即席ライブとのミックスなどができます。

他の mp3 もミックスできます。 私は PII/350 のマシンで、9つの mp3 を aRts を通して同時に演奏することができました。 多分、快適というわけにはいきませんが、それを支える技術は安定している、ということの一例です。 クリックやブレークはありませんでした。 しかし、CPU のパワーを節約するためにミキサは使わなかったことは認めます。 ミキサを使うと恐らくチャンネルのいくつかは機能が落ちます。

レコーディングは aRts-0.3.4 からサポートされています。

### 次のステップ: artsrec, artsmon, サンプル, クライアント api と親和性

Artscatができましたので、次は、

レコーディング(実現しています)

  aRts を通じたレコーディングのサポートです。 ここでの難題は aRts が完全同時処理のサウンドカードを読み書きしなければならないことです。 ただしそれでも、信号のフローは計算できます。まあ、今ではできるようになっています。

監視(実現しています)

  さて、esd は何がミックスされたか監視するモニタリングがサポートされていますが、 artscat はフローシステム中のどのポイントでもデータをレコードすることができますので、 演奏する前にデータをレコードすることもできます。 それで、現在のバージョンの artscat は監視もできるようになっています。

サンプル

  esd/KAudioserver では、 両方ともアプリケーションがオーディオサーバにサンプルを保存できるようになっています。 そして、簡単なコマンドで再生することもできます。これは実現するのはすこぶる簡単です。 aRts はすでに WAV データを再生できますので。

クライアント api と親和性

  CORBA インターフェイスでもよいと思う人もいるでしょうが、 ほとんどの人にとって CORBA は見た目が悪いものです。 だから、それを包み、さらに aRts へ簡単に接続できるようにするラッパーライブラリが必要です。

  一方、古い API に対して、例えばプロトコルでも後位互換性があると素晴らしいです。

さあ、特別なベルやホイッスルを追加してみるのも良いでしょう。 aRts はストリームをただミックスする以上のことが色々とできます。 現在のバージョンの aRts のイコライザを見れば何ができるか分かるでしょう。

## 開発

### aRts の公式課題リスト

「aRts が諸君に何ができるかを聞くのではなく、 諸君が aRts に対して何ができるのか聞くのだ。;)」

多分、あなたは aRts をもっと良くするのを手伝いたいかもしれませんが、 何が必要かが分からないでしょう。おそらく、C++やQtのプログラミングスキルなどをお持ちではないでしょう。

まず、メーリングリストに入りましょう。 詳しくはhttp://linux.twc.de/artsを御覧ください。 この文書の課題リストは最新ではないかもしれません。

このプロジェクトを推進する上で重要と思われる課題をリストにまとめてみました。 もしよければ、興味を持ったタスクに挑戦して私に報告してください...

#### プログラミングスキルを必要としない課題

シンセサイズ全般に関する文書

  色々な種類のシンセサイズ、エフェクト、楽器について書いた(できれば図表入りの)文書、 チュートリアルがあるといいのですが。

  arts の使い方を学びたい人には次のことについてのイントロダクションが必要と思われます。 少し名前を挙げてみます。

  - 周波数のモジュレーションとは何か?

  - リングモジュレーションとは何か?

  - オシレータはどう働くか?

  - フィルタの役目は?

  - ボコーダはどうやって作成するの?

  - 素敵なアナログサウンドを作成するには?

  - 303, 909, mini moog のような古いスタイルのシンセサイザはどうすれば使える?

  - それらのことを aRts で実現するには?

  文書は sgml や html など誰でも見られる形式であると良いでしょう。

>aRts のサンプル音声

  文書と指向することは同じです。aRts ができるプログラムであることをみんなに示さなければなりません!

デモソング

  すごい音楽ができたら、私達に聴かせてください;) arts のホームページに mp3 のコレクションを作り、 それをみんなに聴かせて、aRts を使うというのはどうゆうことか判断してもらわなければなりません。

ストラクチャの管理(重要!)

  aRts は少しずつ成長していきます。 やがてほぼすべてのシンセサイザ、スタジオ装置、 エフェクトが小さな aRts モジュールで作れるようになるでしょう。

  しかし、そうなると 誰かが aRts ディストリビューションに付属する標準的なストラクチャを管理しなければなりません。 それにはミキサ、イコライザ、シンセサイザ、エフェクト、コントロールパネル、 デスクトップ補助などが含まれます。 現在の emacs で重要なのが基幹部分のコードではなく付属の emacs-lisp で書かれたマクロ (書式のハイライトや dunnet dangeon などのゲーム)であるのと同じように、 エンドユーザにとっての使いやすさは大部分が aRts 付属のストラクチャセットに掛かっています。

モジュールの規準化

  これは非常に大きな課題ですが、同時に興味深く、取り組むに値することでしょう。

  今、モジュールはおよそ30個あります。本当に使いやすくするには、50から100個必要です。 それらはカテゴリーに分け、順序良く並べ、書くようにすることが重要です。

  特に大切なのは、モジュールはすべて決まった約束事に従うことです。 例えば、あるモジュールが1/fとして指定された周波数を要求し、 他のでは f になっている必要があるとしたら困ったことです。

  自分でモジュールを書く能力は(C++の知識が少し必要なだけです)この課題の助けにはなりますが、 特別に必要ではありません。 まず最初の出発点は、すべてのモジュールをふるい分けられる名前による階層を作ることです。 例えば、Synth&lowbar;BUS&lowbar;UPLINK =>Synthesis/Busses/Uplink とか、 Synth&lowbar;SHELVE&lowbar;CUTOFF =>Synthesis/Filters/Shelve Cutoff のように。 モジュール名は一種の階層になり、他の階層に移すことができないとすれば良いアイディアです。 なぜなら、そうすれば階層をそのまま翻訳して国際化バージョンに入れることができるからです。

  ストラクチャになっていない Synth&lowbar;PLAY、Synth&lowbar;MUL、 Synth&lowbar;CDELAY などのモジュールもすべて階層の中に居を定めるようにしたほうが良いでしょう。

#### プログラミング・スクリプティングスキルの要る課題

プラグイン

  GUI とシンセサイズシステムを、 ダイナミックロードできるプラグインでランタイム中に拡張する方法を考えてみてください。 koffice2 にこの機能がありますが、使いやすいものであるかどうかは知りません。

  特にシンセサイザでは、スケジューリング中のパフォーマンス低下は許されません。;)

midi バス: 全般

  Arts はどうやって外の世界と交信できるのでしょうか？ midi イベントはどのような経路で送れるのでしょうか？ オーケイ、簡単な解決策がありますが、 これは midi バスに10個の「デバイス」が繋がっているときにはよろしくありません。まだです。 とにかく、後々まで互換性を持たせるためには公の場で(適当な KDE のメーリングリストで) 議論する必要があります。

  ともかく、トラッカー(voodoo tracker、soundt racker、kegtracker)、 シーケンサ(jazz、koobase、gseq、などなど)などの他のプログラムが(Cantorは別にして) midi バスをサポートし始めれば素晴らしいのですが。

  追記: 私は aRts や midi バスなどを KDE プロジェクトのものにすることだけに集中している わけではありません。ただし、私にとっては KDE の GUI を書けば、動作し、 使えるものをいちばん速く作ることができます。 私はこれで早く音楽を作りたいので、デザインに2年間も掛けるつもりはありません。;)

midi バス: 調整

  midi バスの音声はロードの負荷が大きいと(1秒当り1000イベント)のろくなってしまいます。 これはよろしくありません。私が思うに、 この問題は、リアルタイムにではなくイベントをバスを通して渡す方法の規準があれば完全に解決します。 これは次のように動きます。

  - クライアントプログラムがチャンネルを開くようサーバに要求する

  - クライアントプログラムが最初の10秒間(タイムスタンプ付きで)イベントを投入する

  - クライアントプログラムがサーバに開始を通告する

  - サーバがイベントがもっと必要な時にクライアントプログラムに知らせる

  または、

  - クライアントプログラムがソングポジションをポーリングする

  - クライアントプログラムが必要な時にイベントをもっと入れる

  複数のイベントを連続して伝達するのは一度に1個のイベントを伝達するのよりもずっと速いはずなので、 私達は CORBA に専心することができます。

  他にも、イベントを TCP ソケットや UDP や IPC 共有メモリを用いて伝達する方法があります。 これらのほうが CORBA よりも速いでしょう。

midi バス: midi バス以外

  他にも何かあるかもしれません...セクションmidiバス/その他を参照してください。

gui ビルダー

  ここもやりがいのあるパートです。 何が起こっているかを表示する仕組みや、音声を調整するためのボタンが必要です。 KOffice から何か再利用できるものを持ってきて、 それをランタイム中にプラグインさせられる「コンポーネント」にすることもできるでしょう。

  GUI は今でも動作していますが、当然ながら改善の余地がたくさんあります。

パフォーマンスのチューニング

  スピードを上げられるものなら何でも歓迎します。 これには実験、分析、少しの考察が必要となるでしょう。

  追記: マルチ CPU サポート(SMP)は素晴らしいでしょうね。

モジュールを書く

  これはモジュールの規準化(上を参照)と深く関わります。 とにかく必要です...なぜなら、かっこよくて、夢のように動作するモジュールがなかったら、 Arts には何の価値もないでしょうから。

  必要なのは、(CまたはC++の)プログラムに関する少しばかりの知識だけです。 2つのサンプルストリームをミックスするモジュールや、 オーディオデータを遅らせるモジュールなどはシンプルです;)

サンプル CD を読む

  シンセサイズはあらゆる事を達成するのに理想的な方法ではないことは間違いありません。 例えば Steinway がほしいなら多分サンプルを買って使えば良いでしょう。 aRts で AKAI のような共通フォーマットの CD を読めれば素晴らしいでしょう。 ベロシティスイッチの付属したサンプルピアノを利用できれば、 ダイアログでそれらを手で設定するよりもずっと手間が掛かりません。

  ほぼ解決しました。

フローシステム: イベントの伝達

  aRts のフローシステムがプロセス信号だけでなくイベントも処理できると良いのですが。 こうなれば、信号を移調、結合、集成、 フィルタするモジュールをそのまま midi ストリームにも使えるということになります。

オーディオサーバ

  個人的に、aRts が esd や kaudioserver に将来取って替われると良いと思っています。 aRts は DirectX と DirectShow、 Generator と CuBase VST/Logic オーディオシステムのミックスになるでしょう。

  とにかく、他のものと統合的に動作して、 aRts が以前のオーディオサーバが処理できるタスクをすべて処理できるようにする必要があります。

より高レベルのストラクチャ作成

  次のような問題を考えてみましょう。あなたはアブストラクト・ミキサを書きたいと思いました。 ミキサにはチャンネルとエフェクトをたくさん組み込みます。 個々のチャンネルには、プリアンプとイコライザを置きます。 それから、一定量の信号は異なるエフェクトプロセッサ(ワン・ゼロエフェクトプロセッサも含まれます。 つまり、そのまま演奏するということ)を通して送られます。

  aRts でアブストラクト・ミキサを書くことは可能です。 また、エフェクト(ディレイ、リバーブ、コーラスなど...)、 楽器(ピアノ、ドラムセット、弦楽器など...)も書くことができます。

  そして、それらのものは一種のストラクチャデータベースに置きます。 最後に、エンドユーザがしなければならないのは次のことだけです。

  - シーケンスソフトウェアを起動する。

  - 「うーむ、ミキサが欲しいな。」

  - リストから1つを選ぶ。

  - チャンネルを追加・削除するボタンを持つ。

  - チャンネル数を4に設定する。

  - エフェクト(ディレイ、リバーブ、コーラス、空エフェクトなど)をロードする。

  - 楽器(ピアノ、ドラムセット、弦楽器)をロードする。

  - チャンネルに楽器を割り当てる。

  - ミキサでチャンネルを調整する。

  - エフェクトをパネルで設定する。

  - 作曲を始める。

  (0.3.1で)モジュールとして使えるストラクチャによってその一部分は解決できるでしょう。 しかし、これは本当に完璧な構想ではありません。 この問題に関して作業がいくつかすでにありますが、おそらくもっと必要でしょう。

  例えば、example&lowbar;mixer&lowbar;simple、example&lowbar;mixer&lowbar;eqfx、 example&lowbar;mixer&lowbar;eq、example&lowbar;mixer&lowbar;eqfx8 などなど...があります。 考えてみてください。なぜこんなたくさん？それに、チャンネルのカウントはハードコードなのか。 特にエフェクトがもっとたくさん出来てきたら、もっとモジュール式の方法でこれを解決しましょう。

  考えてみてください。

パワーを節約するアーキテクチャ

  Arts は何も計算していないときには CPU パワーを消費しないようにしなければなりません。 これを達成するにはスケジューラに大きな変更を要求します。

共通のサーバ実行

  GUI とフローサーバは実行部分をもっと共有すべきです。共通のプラグインを用いればよいでしょう。

新しい伝達アーキテクチャ

  GUI とシンセサイズサーバの CORBA による伝達はイベント数が増えてくると駄目になります。 新たな伝達のミドルウェア、例えば CPU パワーを節約できるようなものを書く必要があります。

  共有メモリ、TCP を利用するのは多分よいでしょう。

小さな課題(今日の午後はどう過ごそうか)

  - Synth&lowbar;WAVE&lowbar;TRI は Synth&lowbar;WAVE&lowbar;SAW という名前にすべきです。 そして、Synth&lowbar;WAVE&lowbar;TRI は他のシンセサイザと同じように再実行されるようにしましょう。 例を変えてください。

  - Synth&lowbar;WAVE&lowbar;PULSE は上がり・下がり時間を設定可能な方形波にすること。 例を作りましょう。

  - 例えば foo というストラクチャをストラクチャ foo の内部に置き、実行するとクラッシュする。

  - midisend を通さずに /dev/midi を => よりよいタイミングで直接読むモジュールを書くことを 考えてください。

  - Wave ファイルのピッチシフティング(AKAI モジュールで実行されるのと同じ。 おそらく .cc を変換する一般的なコード)。

  - ディレクトリストラクチャの作り直し(やりたい場合はその前に訊いてください)。 モジュールは個々に独立したものにする。

  - 「サーバを起動します」というださいメッセージボックスの代わりに、 はじけるスクリーンローディングコードを追加すること。画像については Harald に聞いてください。

  - サウンドフォントサポートを賢いやり方で統合すること。例えば、コードが...

  - ネイティブの ALSA サポートの追加。

  - 進行中のサンプルローディングの実行。これにより、最初のサンプル演奏時のパフォーマンスが向上する。

  - Interface&lowbar;MIDI&lowbar;NOTE を削除し、その代わりに標準ポートを置く(結局複雑である)。

  - ファイル名を要求する楽器はそれを入力できるコントロールパネルを用意する(結局複雑である)。

  - モジュールはすべて自身のファイルを持つ。(関連：ディレクトリストラクチャのクリーンアップ)

  - モジュールは共有ライブラリにする。

  - kvt が起動していないとき新しい kvt を起動しないようにする。その代わりに xterm などを起動する。

  - Calculate を削除し、それにかわって CalculateBlock を置く。 その後、SynthModule から Calculate を完全に削除して CalculateBlock を置く。

  - kdoc の導入

  - ヘルプボタンを押したらヘルプが出るようにする。 最も良いのは、状況に合ったヘルプページが表示されること。

### コーディングスタイル

このコーディングスタイルは最近のものです;)。始めた時にはありませんでした。 これからは、これに従っていきます。

メンバー関数の名前

  Qt スタイル。つまり、大文字は単語が切れた次の単語の頭文字にだけ使う。 最初の文字はつねに小文字。アンダースコアは使用しない。

  例えば、

         createStructureDesc()
         updateWidget();
         start();

クラスメンバー

  クラスメンバーは大文字にしない。例：menubar, button &lowbar; しかし&lowbar;リモートオブジェクトを参照しているポインタは大文字にする。例：Synthesizer

  それらがアクセス可能な関数であるときは標準で CORBA でのやり方にする。 つまり、長いメンバー Foo があって、直接見えない場合、

         Foo(long new_value);
         long Foo();

  関数を作成し、値を設定する。この場合では、Foo の実数値は &lowbar;Foo に保存される。

クラス名

  すべてのクラスは単語の頭文字を大文字にする。ModuleView, SynthModule など。 CORBA のクラスは普通名前空間を持つ。例えば、Arts::Synthesizer

  CORBA クラスは実行されると Class&lowbar;impl となる。Synthesizer&lowbar;impl など。

パラメータ

  パラメータはつねに小文字。

ローカル変数

  ローカル変数はつねに小文字。それに、i, p, xのような名前になる。

タブ幅 (シフト幅)

  1タブは4スペース分。

### CORBA 関連用語

KDE と他のシステム、GNOME などとその相互情報処理機能の将来は かなりの部分プロセス間のコミュニケーションにかかっています。 スクリプト、埋め込み、相互情報処理機能、快適さ、既存のコンポーネントの再利用...すべてはそれ次第です。 とるべき道は CORBAです。

CORBA はネットワーク、ダーティ・ハックやプロトコルのクリーンアップ、 以前からあった IPC ソリューション、セルフ・ビルト・プラグイン・ソリューションなどの機能を すべて備えています。

そして、今や私を含めたみんながこれらの技術を学ばなければなりません。 それは、さらによいソフトウェアを発展させることが、Linux などのフリーのオペレーティングシステム、 KDEなどのフリーのプロジェクトなどで可能にするために必要です。

そこで、私は CORBA を用いて arts を書き始めました。 かなり以前から興味のあったプロジェクトでした。 私はこれで何が実現できるか勉強しなければなりません。他の人も同じく学ばなければなりません。 CORBA にもシェルや、C++、Qt、gtk などにあるツールを作る必要があります。

もちろん、現在問題があります。CORBA ツールはシェルのように広く使われ、 テストされている状況にありません。しかし、その段階に早く行くことが重要です。

そして、私は音楽がしたいのです - よってウィンドウは作っていません。 家でそんなことに取り組むのはいやです。他にやることがありますから;)。

だから、aRts は私(と、できればその他の人)にとって必要なものになるでしょう。 音楽を創るツールであり、CORBA & Co?? を学ぶ媒体であり、楽しいプロジェクトであり、 そこらにある見た目のダサいアプリケーションとは違ってかっこいい GUI を備えていて、 他の最先端のアプリケーションとコミュニケートできるものです。

### ポーティング - aRts 用の GUI ビルダーを別のもので書く

Arts の設計はとても柔軟性があります。 これはつまり、他のアプリケーションから、シンセサイズサーバとして同時に利用できることを意味します。

ArtsBuilder は今は KDE の下で動いていますが、それが好きでない人も確かにいます。 実際、Arts はこの部分を簡単にポーティングできるように設計されています。 後で GNOME などの GUI を装備するためです。

このガイドはおもに ArtsBuilder と Arts シンセサイザとの対話について説明していますが、 Arts と交信する大小のアプリケーションを作成するのにも役に立つと思います。

では、GUI でしなければならない事は何でしょうか?

シンセサイザのインスタンスを接続:

          // You'll need to call orb->bind, mico code for that is:

          CORBA::Object_var obj =
              orb->bind ("IDL:Arts/Synthesizer:1.0", "inet:localhost:8888");

シンセサイズストラクチャ記述を作成する

  Synthesizer->createStructureDesc() を呼び出してください。ストラクチャ記述がえられます。

モジュールを作成する

  Synthesizer->getModuleCount() と Synthesizer->getModuleInfo() で、 ModuleInfo の記録を取得します。これらにはメンバー名が付いています。 モジュール名もその名前の一部になっています。それをユーザに知らせて、他の情報を使わないようにします。 将来のリリースではこれは残っているかどうか分かりません。

  モジュール記述を作成したいときは StructureDesc に行き、それにモジュール情報を渡してください。 これはストラクチャの中に置かれます。

  それを視覚的に表示することもできます。ストラクチャを保存する前に モジュールを正しい位置に (moveTo(x,y)) で移動してください。

モジュールを表示する

  モジュールは次のように表示されます。

  このモジュールは入力ポート A B C, 出力ポート a, を持っています。名前は label です。 そして、モジュールの高さはグリッドスキームで1に、 幅は 1+max(inports.size(),outports.size()+1) になります。

  モジュールは GUI によって重ならないように配置されます。

ポートの接続、パラメータの設定

  ModuleDesc->Ports でモジュールのパラメータを設定することができます。 ModuleDesc->Ports にはモジュールの持つPorts の参照があります。 connectTo, disconnect, などが呼び出せます。

  ポートは値を与えられるか、接続されるか、または未接続のままかのどれかです。

モジュールの実行

  Synthesizer->createStructure(StructureDesc) でそのストラクチャのインスタンスを作成します。 そして後でそれは統合されます。

  id を保持しておいて、後でそれを freeStructure に渡します。

ファイルの保存

  自分の StructureDesc は saveToList() で保存します。 その結果できる Arts::StringSeq の内容はテキストファイルに書きこみます。 その拡張子は .arts にします。

ファイルのロード

  Arts::StringSeq への .arts ファイルのロード。あなたがすでに持っているStructureDesc に行き、 StructureDesc->loadFromList(theStringSeq) としてください。

当然ながら、Arts はまだ設計途上にあります。 シンセサイザ用の GUI の構築など、基本的なことがまだできていないし、 インターフェイスで指定されていません。

Arts のインターフェイスは将来成長するでしょう。 しかし、少なくとも2つの GUI で相互通信に関する機能を高めておけば、 よい解決法を作るのにきっと役に立つでしょう。

理論的には、arts は他のオペレーティングシステムにも簡単に移植できます。 mico が目標のプラットフォームでコンパイルされていれば、シンセサイザもコンパイルできます。 Synth&lowbar;PLAY のコードを少し変える必要があるでしょうが、大したことはありません。 そして、その OS または Java にもとからあるツールで新しい GUI を作成することができます。 これで、移植ができます。

先進機能

  もちろん aRts は上で説明したようなシンプルなままでいることはありません。 おそらく、最も重要なニュースは、ビジュアルモジュールができたことでしょう。 これは、GUI プロセスに ArtsServer CORBA インターフェイスを用意させることで内部的に実行されています。 メインシンセサイズサーバと同じように、 このインターフェイスによってストラクチャがインスタンス化できます。 ポイントは、GUI も同じモジュールで作成して、シンセサイズの「プレイグラウンド」と同じように ルールに従うことです。

  これだと移植が難しくなり、また artsbuilder 全体をそのまま持ってきて、 Qt のコールを GTK-- のコールに置き換える移植が提案されることになります。 ともかく、移植しようとしたら、メインの artsbuilder のバージョンに統合できるようなかたちで成功させ、 双方に互換性ができるようにしてください。

  他の方法でやりたいなら(ArtsServer のインターフェイスはそう難しくありませんが)、 あなた自身が GUI インターフェイスを調整して、Qt/KDE-Artsbuilder によって理解されるストラクチャが あなたのものでも理解できるように、またその逆もできるようにしてください。 おそらく、クロス・コンポーネントのモデルを開発することになります。 ArtsBuilder で動作する視覚的コンポーネントをあなたのソフトウェアで再利用できるように、 またその逆もできるようにしましょう。

## エピローグ

### 作者

aRts is Copyright © 1998-1999 Stefan Westerfeld (stefan@space.twc.de)

コードの一部分は別の作者に著作権があります。ソースファイルをご覧ください。

### 謝辞

Arts プロジェクトが今日のように発展したのは、次の方々のおかげです。(順不同)

KDE チーム

  彼らの業績がなかったら、まったく出発すらしなかったでしょう。

Harald Lapp

  ホームページ http://linux.twc.de/artsのデザイン、 アイコンのデザイン

Paul Leonard (P.J.Leonard@bath.ac.uk )

  素晴らしいシーケンスソフト Cantor の作者。 今や Cantor と Arts は midi バスを通じて協力して動作しています。

Juhana Sadeharju (kouhia@nic.funet.fi )

  aRts で使われているフィルタのいくつかを作成。

Jens Hahn (Jens.Hahn@t-online.de )

  aRts で使われているモジュールのいくつかを作成。

Emmeran Seehuber (the_emmy@gmx.de )

  midisend のキーボード分割・マッピングコード。

Martin Lorenz (lorenz@ch.tum.de )

  KPoti ウィジェット - 私はそれをちょっと調整して Gui&lowbar;POTI を数行で作成しました;) - と、 Synth&lowbar;STD&lowbar;EQUALIZER - khdrec から抜き出してきました - の作者。

David G. Slomin (dgslomin@alumni.princeton.edu )

  圧縮 midi のための midi 解析コードに貢献。

どうもありがとう！おっとそれから、もちろんテストしてくれた方、 快く人柱になってくれた方、コンパイルできなかった方...そして、 すこしでもよくなるように、 うまくいかなかったところをメールで詳しく書いて送ってくださった方々にも感謝しております。

### Copyright & Licensing

                        GNU GENERAL PUBLIC LICENSE
                           Version 2, June 1991

     Copyright (C) 1989, 1991 Free Software Foundation, Inc.
     59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
     Everyone is permitted to copy and distribute verbatim copies
     of this license document, but changing it is not allowed.

                                Preamble

      The licenses for most software are designed to take away your
    freedom to share and change it.  By contrast, the GNU General Public
    License is intended to guarantee your freedom to share and change free
    software--to make sure the software is free for all its users.  This
    General Public License applies to most of the Free Software
    Foundation's software and to any other program whose authors commit to
    using it.  (Some other Free Software Foundation software is covered by
    the GNU Library General Public License instead.)  You can apply it to
    your programs, too.

      When we speak of free software, we are referring to freedom, not
    price.  Our General Public Licenses are designed to make sure that you
    have the freedom to distribute copies of free software (and charge for
    this service if you wish), that you receive source code or can get it
    if you want it, that you can change the software or use pieces of it
    in new free programs; and that you know you can do these things.

      To protect your rights, we need to make restrictions that forbid
    anyone to deny you these rights or to ask you to surrender the rights.
    These restrictions translate to certain responsibilities for you if you
    distribute copies of the software, or if you modify it.

      For example, if you distribute copies of such a program, whether
    gratis or for a fee, you must give the recipients all the rights that
    you have.  You must make sure that they, too, receive or can get the
    source code.  And you must show them these terms so they know their
    rights.

      We protect your rights with two steps: (1) copyright the software, and
    (2) offer you this license which gives you legal permission to copy,
    distribute and/or modify the software.

      Also, for each author's protection and ours, we want to make certain
    that everyone understands that there is no warranty for this free
    software.  If the software is modified by someone else and passed on, we
    want its recipients to know that what they have is not the original, so
    that any problems introduced by others will not reflect on the original
    authors' reputations.

      Finally, any free program is threatened constantly by software
    patents.  We wish to avoid the danger that redistributors of a free
    program will individually obtain patent licenses, in effect making the
    program proprietary.  To prevent this, we have made it clear that any
    patent must be licensed for everyone's free use or not licensed at all.

      The precise terms and conditions for copying, distribution and
    modification follow.

                        GNU GENERAL PUBLIC LICENSE
       TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

      0. This License applies to any program or other work which contains
    a notice placed by the copyright holder saying it may be distributed
    under the terms of this General Public License.  The "Program", below,
    refers to any such program or work, and a "work based on the Program"
    means either the Program or any derivative work under copyright law:
    that is to say, a work containing the Program or a portion of it,
    either verbatim or with modifications and/or translated into another
    language.  (Hereinafter, translation is included without limitation in
    the term "modification".)  Each licensee is addressed as "you".

    Activities other than copying, distribution and modification are not
    covered by this License; they are outside its scope.  The act of
    running the Program is not restricted, and the output from the Program
    is covered only if its contents constitute a work based on the
    Program (independent of having been made by running the Program).
    Whether that is true depends on what the Program does.

      1. You may copy and distribute verbatim copies of the Program's
    source code as you receive it, in any medium, provided that you
    conspicuously and appropriately publish on each copy an appropriate
    copyright notice and disclaimer of warranty; keep intact all the
    notices that refer to this License and to the absence of any warranty;
    and give any other recipients of the Program a copy of this License
    along with the Program.

    You may charge a fee for the physical act of transferring a copy, and
    you may at your option offer warranty protection in exchange for a fee.

      2. You may modify your copy or copies of the Program or any portion
    of it, thus forming a work based on the Program, and copy and
    distribute such modifications or work under the terms of Section 1
    above, provided that you also meet all of these conditions:

        a) You must cause the modified files to carry prominent notices
        stating that you changed the files and the date of any change.

        b) You must cause any work that you distribute or publish, that in
        whole or in part contains or is derived from the Program or any
        part thereof, to be licensed as a whole at no charge to all third
        parties under the terms of this License.

        c) If the modified program normally reads commands interactively
        when run, you must cause it, when started running for such
        interactive use in the most ordinary way, to print or display an
        announcement including an appropriate copyright notice and a
        notice that there is no warranty (or else, saying that you provide
        a warranty) and that users may redistribute the program under
        these conditions, and telling the user how to view a copy of this
        License.  (Exception: if the Program itself is interactive but
        does not normally print such an announcement, your work based on
        the Program is not required to print an announcement.)

    These requirements apply to the modified work as a whole.  If
    identifiable sections of that work are not derived from the Program,
    and can be reasonably considered independent and separate works in
    themselves, then this License, and its terms, do not apply to those
    sections when you distribute them as separate works.  But when you
    distribute the same sections as part of a whole which is a work based
    on the Program, the distribution of the whole must be on the terms of
    this License, whose permissions for other licensees extend to the
    entire whole, and thus to each and every part regardless of who wrote it.

    Thus, it is not the intent of this section to claim rights or contest
    your rights to work written entirely by you; rather, the intent is to
    exercise the right to control the distribution of derivative or
    collective works based on the Program.

    In addition, mere aggregation of another work not based on the Program
    with the Program (or with a work based on the Program) on a volume of
    a storage or distribution medium does not bring the other work under
    the scope of this License.

      3. You may copy and distribute the Program (or a work based on it,
    under Section 2) in object code or executable form under the terms of
    Sections 1 and 2 above provided that you also do one of the following:

        a) Accompany it with the complete corresponding machine-readable
        source code, which must be distributed under the terms of Sections
        1 and 2 above on a medium customarily used for software interchange; or,

        b) Accompany it with a written offer, valid for at least three
        years, to give any third party, for a charge no more than your
        cost of physically performing source distribution, a complete
        machine-readable copy of the corresponding source code, to be
        distributed under the terms of Sections 1 and 2 above on a medium
        customarily used for software interchange; or,

        c) Accompany it with the information you received as to the offer
        to distribute corresponding source code.  (This alternative is
        allowed only for noncommercial distribution and only if you
        received the program in object code or executable form with such
        an offer, in accord with Subsection b above.)

    The source code for a work means the preferred form of the work for
    making modifications to it.  For an executable work, complete source
    code means all the source code for all modules it contains, plus any
    associated interface definition files, plus the scripts used to
    control compilation and installation of the executable.  However, as a
    special exception, the source code distributed need not include
    anything that is normally distributed (in either source or binary
    form) with the major components (compiler, kernel, and so on) of the
    operating system on which the executable runs, unless that component
    itself accompanies the executable.

    If distribution of executable or object code is made by offering
    access to copy from a designated place, then offering equivalent
    access to copy the source code from the same place counts as
    distribution of the source code, even though third parties are not
    compelled to copy the source along with the object code.

      4. You may not copy, modify, sublicense, or distribute the Program
    except as expressly provided under this License.  Any attempt
    otherwise to copy, modify, sublicense or distribute the Program is
    void, and will automatically terminate your rights under this License.
    However, parties who have received copies, or rights, from you under
    this License will not have their licenses terminated so long as such
    parties remain in full compliance.

      5. You are not required to accept this License, since you have not
    signed it.  However, nothing else grants you permission to modify or
    distribute the Program or its derivative works.  These actions are
    prohibited by law if you do not accept this License.  Therefore, by
    modifying or distributing the Program (or any work based on the
    Program), you indicate your acceptance of this License to do so, and
    all its terms and conditions for copying, distributing or modifying
    the Program or works based on it.

      6. Each time you redistribute the Program (or any work based on the
    Program), the recipient automatically receives a license from the
    original licensor to copy, distribute or modify the Program subject to
    these terms and conditions.  You may not impose any further
    restrictions on the recipients' exercise of the rights granted herein.
    You are not responsible for enforcing compliance by third parties to
    this License.

      7. If, as a consequence of a court judgment or allegation of patent
    infringement or for any other reason (not limited to patent issues),
    conditions are imposed on you (whether by court order, agreement or
    otherwise) that contradict the conditions of this License, they do not
    excuse you from the conditions of this License.  If you cannot
    distribute so as to satisfy simultaneously your obligations under this
    License and any other pertinent obligations, then as a consequence you
    may not distribute the Program at all.  For example, if a patent
    license would not permit royalty-free redistribution of the Program by
    all those who receive copies directly or indirectly through you, then
    the only way you could satisfy both it and this License would be to
    refrain entirely from distribution of the Program.

    If any portion of this section is held invalid or unenforceable under
    any particular circumstance, the balance of the section is intended to
    apply and the section as a whole is intended to apply in other
    circumstances.

    It is not the purpose of this section to induce you to infringe any
    patents or other property right claims or to contest validity of any
    such claims; this section has the sole purpose of protecting the
    integrity of the free software distribution system, which is
    implemented by public license practices.  Many people have made
    generous contributions to the wide range of software distributed
    through that system in reliance on consistent application of that
    system; it is up to the author/donor to decide if he or she is willing
    to distribute software through any other system and a licensee cannot
    impose that choice.

    This section is intended to make thoroughly clear what is believed to
    be a consequence of the rest of this License.

      8. If the distribution and/or use of the Program is restricted in
    certain countries either by patents or by copyrighted interfaces, the
    original copyright holder who places the Program under this License
    may add an explicit geographical distribution limitation excluding
    those countries, so that distribution is permitted only in or among
    countries not thus excluded.  In such case, this License incorporates
    the limitation as if written in the body of this License.

      9. The Free Software Foundation may publish revised and/or new versions
    of the General Public License from time to time.  Such new versions will
    be similar in spirit to the present version, but may differ in detail to
    address new problems or concerns.

    Each version is given a distinguishing version number.  If the Program
    specifies a version number of this License which applies to it and "any
    later version", you have the option of following the terms and conditions
    either of that version or of any later version published by the Free
    Software Foundation.  If the Program does not specify a version number of
    this License, you may choose any version ever published by the Free Software
    Foundation.

      10. If you wish to incorporate parts of the Program into other free
    programs whose distribution conditions are different, write to the author
    to ask for permission.  For software which is copyrighted by the Free
    Software Foundation, write to the Free Software Foundation; we sometimes
    make exceptions for this.  Our decision will be guided by the two goals
    of preserving the free status of all derivatives of our free software and
    of promoting the sharing and reuse of software generally.

                                NO WARRANTY

      11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
    FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
    OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
    PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
    OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
    TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
    PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
    REPAIR OR CORRECTION.

      12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
    WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
    REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
    INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
    OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
    TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
    YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
    PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
    POSSIBILITY OF SUCH DAMAGES.

                         END OF TERMS AND CONDITIONS

### License of the sound drivers

    The sound support for the synthesizer is based on routines of
    mpeg3play version 0.9.6. That software is based on a mpeg
    decoder source from Frauenhofer - IIS.

    Therefore, the following copyright notices and disclaimers apply
    to the sound routines:

    1. From the public mpeg source from Frauenhofer - IIS:
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    This directory contains the MPEG-1 public source code for the Audio decoder
    layer 1, 2 and 3 as per printing of CD 11172-5 in April 1994.

    The version number is 4.1.

    As you can read in the source files work on these files is still in
    progress and they have not officially been released for public distribution.
    Nevertheless we at Fraunhofer Institute have tested the layer 3 part of
    the Decoder and believe that it is reasonably bug free.
    So feel free to evaluate the source code but keep in mind, that no
    warranties are associated with this software.

    While we believe that this software is reasonably bug free and well behaved,
    we are in no way responsible if this software does not work the way you
    would expect it to work. No matter if it locks up your computer, garbles
    your floppy disks or does any other harmful things to your computer - it
    is entirely your problem.
    Fraunhofer - IIS and the authors of this software are not liable for
    any infringments or damages of third parties' rights in consequence
    of your use of this software. Fraunhofer - IIS or the authors are in no
    event liable for, respectively do not warrant the trustworthiness,
    quality, industrial exploitability, serviceability of this
    software for the supposed purposeor any other purposes.

    2. From mpeg3play version 0.9.6:
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    			mpeg3play version 0.9.6
    			     April 6, 1997

    Home page:  The Solaris Helpers Page at
                http://home1.swipnet.se/%7Ew-10694/helpers.html

    Authors:    ISO/MPEG working groups, Fraunhofer Institute and
    	    Johan Hagman <Johan.Hagman@mailbox.swipnet.se>

    [...]

    Many thanks to the following people for their suggestions, optimizations
    and porting efforts

       Tim Newsome <drz@froody.bloke.com>		   Linux
       Damien Clermonte <clermond@esiee.fr>		   HPUX
       Troels Walsted Hansen <troels@stud.cs.uit.no>   Amiga
       Terje Malmedal <terje.malmedal@usit.uio.no>	   AIX
       Dan Nelson <dnelson@emsphone.com>		   FreeBSD
       Michael Cheng <mcheng@faraday.dialix.com.au>    Amiga
       Fredrik Hubinette <hubbe@lysator.liu.se>        Linux

    [...]

    The original source code for the decoder can be found in the file
    ftp://ftp.tnt.uni-hannover.de/pub/MPEG/audio/mpeg2/software/
    technical_report/dist08.tar.gz

    [...]

    ----------------------------------------------------------------------

       Copyright (C) 1996, 1997 by Johan Hagman

    mpeg3play is distributed "as is" at no additional charge. It can
    be used freely for any purpose, but may not be sold commercially.

    Johan Hagman disclaims all warranties with regard to this software,
    including all implied warranties of merchantability and fitness.
    In no event will Johan Hagman be liable for direct, incidental or
    consequential damages resulting from loss of data or business
    opportunities, resulting from mpeg3play, or any part of same,
    either alone or in conjunction with other programs.