以下では、コンピュータミュージックの「標準言語」の一つであるCsoundの使い方を概説する。Vercoe教授によって開発された。1)Csoundの発展史コンピュータミュージック言語の起源は、ベル研究所のマックス・マシューズらによって50年代後半に開発された音響生成用のプログラムにある。5以外は特定のマシンに依存していたた?゚今日では忘れ去られている。Howe)のグループに受け継がれ、それぞれ独立に発展の歴史を歩む事になる。スタンフォードでの発展史は、拙著「コンピュータミュージック」(オーム社、1994)でのチャウニングへのインタヴィユーなどを参照して頂く事にして、本章では少しの間プリンストンでの流れを追ってみる。これは、その名が示す様にIBM360上で走らせるプログラムとして開発された。11へと1973年に展開したが、現在のヴァージョンはC言語で書かれているので多様なマシン上で走らせる事ができる。これが本章で紹介するCsoundである。Csoundは完成された言語ではあるが、コンピュータと同様に常に発展しつつある。1991ヴァージョンにはフェイズヴォコーダとフォーマント合成が加えられた。1992ヴァージョンにはMIDIコンヴァータとコントロールユニットが加えられたので、Csoundは外側のMIDIキーボードからも走らす事ができる。従って、スピードの早いコンピュータ上では、センサーなどからのコントロールによってリアルタイムのソフトウエア合成も可能である。2)マックへのftpCsoundアプリケーションは、MITのMediaLabからインターネットを介して自分のコンピュータにftpする事ができる。以下ではマックを使う場合の手順を示す。1)Fetchをクリックして起動する。anonymousを、Passwordとして自分のe-mailアドレスをタイプする4)pubをダブルクリックするここでftpで得る事のできるファイルのリストを見ることができる。これは常にアップデートされる。addressをタイプすると良い。拡張子.hqxはCsoundのマックヴァージョンである事を示すので、Csound.hqxをftpする訳である。数秒後には、Csoundアプリケーションとマニュアルなどのドキュメント類を含めて、必要なすべ?トのファイルを手に入れる事ができているはずである。ユーザーが使えるブレティンボードはcsound-BB@media-lab.media.mit.eduである。ここへの投稿はすべてのユーザーにブロードキャストされる。アドミニストレーションに関する質問はcsound-request@media-lab.media.mit.eduへ、バグのレポートは、csound@media-lab.media.mit.eduへ、それぞれ送る事ができる。3)UNIXマシンへのftpUNIXのマシンでftpを行うには、シェルのプロンプトの後で以下のコマンドをタイプすれば良い。-lここでftpで得る事のできるファイルのリストを見ることができる。Csound.tar.Zとする。ファイルが転送され終わるとプロンプトが現われるので、ここでftpから出る。8)quit次に、ファイルを以下の手順でアンコンプレスする。filename.tar後は適当なディレクトリに転送されたCsoundのファイルを置けば良い。4)Csoundの特徴Csoundでは、音響的なイベントの単位は音符(note)、音符の集合はスコア、音響生成のアルゴリズムは楽器(instrument)、楽器の集合はオーケストラと呼ばれる。オーケストラとスコアのアナロジーが採用されているので、プログラムの構造が概念的に分かりやすい。いって、Csoundで作られる作品が伝統的なオーケストラの発想を踏襲したものである訳ではなく、作者のアイディアしだいで全くアヴァンギャルドな音響を作り出す事ができる。Csoundではプログラムのフォーマットが明快に定義されているので、ユーザはあたかもパッチコードでアナログシンセサイザのユニットを繋ぐ感覚でプログラミングができる。プログラムで使われるユニット・ジェネレータを含めシステム全体がC言語で書かれているのでコンピュータ間での移植性に優れ、最近ではコンピュータミュージックの標準言語と呼べる状況になって来?トいる。ユニット・ジェネレータがプログラミングの単位なので、直接C言語を使ってプログラミングをしないで済む点ではミュージシャン向きであり、MIDIとの接続も可能である。市販のどんなシンセサイザよりもパワフルで、スピードの早いプロセッサを搭載したコンピュータ上ではリアルタイムで走る事も魅力的である。いう訳なので、コンピュータとCsoundがあれば他の器材はほとんど必要なくなってしまう。多様な音響合成のアルゴリズムが使えるので、今後は日本でもCsoundのユーザが増えて行く事だろう。この様にCsoundは非常にパワフルな道具であるが、本章では基礎的なほんの一部分しか紹介する事はできない。上達のコツは、実際に使ってみる事である。Cが走るマシンにインストールできる。マシンを使う手順も並行して説明する。言っても両者の環境に大差は無く、UNIXではシェルでコマンドラインを入力する部分が、マックではダイアログのウインドウでボタンをクリックする様になっているだけである。スコア名.scoである。-oフラッグは、これが目的のサウンドファイルである事を示す。サウンドファイル名.sndで良い。/tmp/test.sndなどとなる。NeXTが使える場合には、SoundWorksなどのアプリケーションを使っても良い。マックでCsoundのプログラムを行う場合には、Csoundアプリケーションの他に、ファイルの作成用にEZWordなどの適当なエディタが必要である。IIであるが、音を聞くにはSoundAppアプリケーションが使える。自分でモジュールをC言語で書く場合には、マック用のCコンパイラLightspeedCが必要になる。マニュアルはMicrosoftのWordで書かれているので、マニュアルを読むにはこのアプリケーシ??唐ェ必要である。6)ディレクトリの設定マックでは、Csoundアプリケーションのアイコンをダブルクリックするとファイル選択ダイアローグが現われる。ここには、オーケストラ、スコア、出力ファイル、そしてオプションとしてMIDIと出力リスティングのファイルを選択するコラムがある。出力ファイル名を例外として、他のファイルは選択ボタンをクリックするだけで選択ダイアローグが現われるので、例えばオーケストラのselectボタンを押し、適当なオーケストラファイルを選択すると、スコアファイルもアウトプットファイルも自動的に作られる。スコアは".sco"、そしてサウンドは".snd")、どちらかを選べば他は自動的に決まる。オプションダイアログで?Aウトプットファイルが指定されれば、".snd"として自動的に作られる。Csoundはこれらのファイルをすべて単一のSFDirディレクトリに置く。マックではSFDirボタンをクリックしてこのディレクトリをユーザが適当に選択するので、あらかじめ適当な所にCsound用のディレクトリを作?チておくと良い。一度ディレクトリを設定した後でSaveボタンを押しておけば、次回からは自動的にこのディレクトリが選択される。/tmpの様にシェル環境変数で指定する。7)取り敢えず音を出してみる設定が終わった後で選択ダイアローグのOKボタンをクリックすると、コンソールが現われ、計算が実行され、その結果が次々にコンソールに示される。後で述べるファンクションテーブルが使われていれば波形が示される。エラーがあればコンソールにメッセージが現われるが、なければサウンドファイルのサイズなどがコンソールにプリントされて計算は終了する。音を聞くには、まずコンソールをクリックしてCsoundから抜け出る。その後でSoundappを起動し、目的のサウンドファイルを選択すると合成された音を聞くことができる。UNIXの場合には、引き続きシェルでsndplayコマンドを使う。Formatを選ぶと、サウンドファイルのフォーマットを選ぶ事ができる。Format)のフォーマットを選ぶ事もできる。fフロート型までを選択できる。checkboxがチェックされると、サウンドファイルからヘッダが取り除かれデータだけが出力される。blocksizeは出力サンプルファイルに書き込まれるサ?塔vル数である。データのフォーマットはディフォールトで16ビット整数型なので、データの値は-32768~32767の整数として表現される。従って、データサンプルに与える事のできる最大値は32767であり、この値を超えるとエラーになる。次に述べるオシレータのアンプとして与えるデータは、この16ビット整数フォーマットでの数値である。この場合、例えばアンプの値32000は90dbに相?魔キる。関数ampdb(x)を使うとデシベル値xに対応するアンプの値を知る事ができる。Wordで書かれたCsoundのマニュアルは125ページの膨大なものであるが、それ自体が丁寧なCsoundのテキストになっているので、関?Sのあるユーザには根気良く読むことをお薦めしたい。オーケストラで使われる事の多い信号ジェネレータoscilについて調べて見る。Numberに22を?^イプする。章にある以下の様なoscilを含んだ項目のフォーマットと簡単な説明が現われ、INITIALIZATIONとPERFORMANCEのセクションへと続く。以下ではoscilに関係する項目だけをピックアップして示す。マニュアルを読めば、oscilはコントロールまたはオーディオの両方の信号を生成するオシレータである事が分かる。オーディオ信号の?Iシレータは、xcpsの値に対応する位相の増分を使って指定された関数ifnをスキャンし、それらの値をxampでスケーリングして、xcpsHzの周期信号として出力する。この時、オーディオ信号を生成するオシレータへのxampとxcpsのインプットに関しては、振幅変調と周波数変調ができる。FM用のオシレータとしてはfoscilを使うこともできるので、マニュアルを参照すると良い。ファンクションテーブル番号であるが、これはoscilでは特定の波形を参照する番号として使われる。波形番号はストアされた関数テーブルを指すので、前もって関数テーブ?汲ノ何らかの波形をストアしておかなければならない。この点に関してはスコアのセクションで説明する。オプショナルの初期位相で、ゼロから1までの1周期のフラクションで表わす。ディフォールトはゼロである。従って、a1oscil10000,440,1は、関数テーブル番号1にストアされている波形を使い、アンプ10000、周波数440Hzのオーディオ信号を生成する。持続時間は後で述べるスコアで指定される。1~9の付録が付いている。これらは、マニュアルでは扱えない個別のトピックに関する非常に優れたイントロダクションになっているので是非目?ハして欲しい。ここでは詳細を扱う事はできないので、これらの付録の内容を簡単に紹介する。1は、C言語によるスコア操作/生成プログラムであるCSCOREのマニュアルである。Boulangerによる楽器デザインのチュートリアルで、Csoundによる音響生成アルゴリズムの13の例題が難易度に従って整理されている。これらの例題はtutorfilesサブディレクトリにもあるので、すぐに音を出す事ができる様になっている。内容はエンヴェロープ、コーラス効果、ヴィブラートなどから、GENファンクション、サウンドファイルの操作、フィルタへと進み、最後の例題ではスペクトラル・フ?❺[ジョンが扱われる。ここではフィジカル・モデリングによって生成された弾かれた弦の音がFM音へ変容し、さらにFOF合成によってヴォーカルな音へと変化する。チュートリアルである。FOF合成はグラニュラー合成の特別な形であり、オーヴァーラップするグレインの連続によって音を生成する。FOFジェネレータは単一のフォーマントを生成するので、4個以上組み合わせれば音声の模倣ができる。??ケは、新しいグレインが生成されるスピードなので、基音が非常に低い場合にはグレインが分離して聞こえる。この場合には基音はピッチで?ヘなくパルスのスピードになる。FOFを使うと、ピッチとパルスの間の移動、つまり音色とグラニュラーテクスチュアの間の移動が聞こえる。4のHETROは、adsynユニットジェネレータのためのヘテロダインフィルタ分析モジュールである。adsynは、オシレータバンクまたは?tェイズヴォコーダ分析の出力の加算合成を行う。この場合、任意の数のサイン波を個別にコントロールして加えるので、時間的に変化する複?Gな音色を合成できる。5は、線形予測コーディングのプログラムである。lpcanalはlpジェネレータのための線形予測コーディング(lpc)分析モジュールで、サウンドファイル入力に対して、線形予測コーディングとピッチトラッキング分析の両方を行い、再合成のためのコントロール情報のフレームを時系列で生成する。以下は題目を紹介するに止める。EllisによるフェイズヴォコーダPvAnalプログラムである。8は、新しいCsoundのモジュールを自分で作る方法の説明である。フォーマットのリストがあるので、これらを使うときに役に立つクイックレファランスになる。11)プログラムの仕組みCsoundでは、オーケストラとスコアの2つの基本ファイルによって構成される。プログラムで使われる音響生成用のソフトウエア楽器の定義をまとめたファイルがオーケストラである。楽器は信号を生成/変換するモジュールの集合で、生成された信号はシンボルで表現されモジュール間でパッチできる。一方のスコアでは、それぞれの楽器の具体的な演奏情報と演奏時刻を指定する。<オーケストラとスコアの概念図>プログラムは、以下の手順で実行される。スコアファイルが時間順にソートされるる。この段階でエラーがあればコンソールにメッセージが現われる。次にオーケストラを機械語に翻訳しロードする。翻訳が開始されるとコンソールにそれぞれの楽器番号が現われ、エラーがあればメッセージが現われる。その後で波形テーブルを生成し、スコアの演奏を開始する。演奏の情報は以下の様な形でコンソールに現われる。7929.Bの後の2つの数はスコアでのビート数であるが、これが表示されている時には、対応する区間で音響生成が行われている事を示す。Tの後の数値はこの区間の実際の秒数で、TTの後はスコアの先頭からの合計秒数である。Mの後の数値はその区間での最大のアンプの値で、最後の数値は?ナ大のアンプ値をチャンネル毎に分離して表示した値である。マシンのスピードが十分に早ければ、音響が生成されると同時にその音をリアルタイムで聞く事ができる。12)オーケストラ・ファイル1では実際にオーケストラ・ファイル(以後オーケストラと呼ぶ)の中味を見てみよう。Boulangerによ?チて書かれた例題があるので、例えばtoot1.orcを開けてみると以下の様になっている。1a1oscil10000,440,1outa1endin上の例で、セミコロンで始まる行はコメントである。コメントに続く4行は、サンプリングレイトなどのグローバル変数を宣言する部分でヘッダと呼ぶ。1からendinまでが、プログラムで使われるソフトウエア楽器(以後楽器と呼ぶ)を定義する部分で、楽器ブロックと呼ぶ。この例では楽器は1個しかないが、いくつあっても良い。一般にオーケストラは、ヘッダと楽器ブロックの2つの部分から構成される。オーケストラのヘッダでグローバル変数を宣言し、続いてソフトウエア楽器を定義する。グローバル変数はすべての楽器で使われるが、楽器内部で宣言されるローカル変数は、その楽器内部だけで参照される。単一の楽器のまとまりを示すためには、上の様にinstrnとendinのステートメントのペアで楽器プログラムの中味を囲む。instrの次にはスペースを入れ、その次のnには楽器の番号を示す数値を書く。a1oscil10000,440,1は、信号a1が、アンプ10000、周波数440Hz、波形番号1のオーディオ信号である事を示している。outa1は、この信号をチャンネル1から出力する。楽器プログラムの詳細は、以下で順を追って調べる事にする。通常のヘッダで宣言される変数の種類は、以下の通りである。サンプリングレイトを指定する。ディフォールトは10000である。コントロールレイトを指定する。ディフォールトは1000である。コントロール周期のサンプル数を指定する。値は、sr/krに等しくなければならない。ディフォールトは10である。オーディオ出力チャンネル数を指定する。ディフォールトは1である。その他のグローバル変数も、必要であれば楽器ステートメントの前にヘッダで宣言する。一般に、エンヴェロープなどのコントロール信号の変化はオーディオ信号の変化に比べてゆっくりしているので、コントロール信号には実際に出力されるオーディオ信号のサンプリングレイトほどの分解能は必要無い。従って、コントロールにはオーディオとは別な信号を使う事によって波形の計算を早くできる。そのためにコントロール周期を設定する訳である。14)楽器のフォーマット楽器のブロックのフォーマットは、instrnendinである。楽器のブロックの先頭を定義する。この時に、nは正の整数で楽器番号を指定する。楽器のブロックの終了を定義する。複数?フ楽器を使う場合には、以下の様に楽器のプログラムをinstrnとendinで囲み、これらを複数個作れば良い。>endin,,,,,,,,,,,オーケストラに含まれる楽器の数も順序も任意であるが、ネストする事はできない。instrnとendinで囲まれた楽器プログラムは、ローカル変数の設定、論理の流れ、信号生成のサブルーティン、オーディオ信号の入出力などをコントロールする文よりなる。pはパラメータフィールドの番号を示すために使われる。その他の文字?フ使い方は以下で説明する。プログラムのステートメント(以後文と呼ぶ)で使われるフォーマットは以下の通りである。commentslabelはオプショナルでgo-to操作のターゲットになるが、あまり使われる事はなくその有無にかかわらずステートメントには影響を与えない。result以下のステートメントで、resultの先頭文字がiの場合は音符信号、kの場合はコントロール信号、aの場合はオーディオ信号である事を表わす。opcode以下の引き数の意味はopcodeに依存する。15)変数の初期化とアップデート楽器で使われる出力信号には4種類のレイトがあり、以下の様にそれぞれ初期化とアップデートの方法が異なる。変数は音符のピッチやデュレイションの指定に、K-変数は音符の持続期間中にゆっくり動くヴィブラートなどのパラメータの指定に?L用である。A-変数のコントロール区間はサンプリングレイトそのものなので最も分解能が高く、オーディオ信号に使われる。ここで言う「音符」は、単一のデュレイションで指定される音響的なイヴェントのまとまりの意味である。cpsの3種類のフォーマットで表わされる。cpsは周波数の値であるが、pchとoctは例えば8.6の様な数値であり、小数点前の整数はオク?^ーヴを、小数点以下のフラクションはピッチをそれぞれ表わす。9→中央のCのオクターヴ?繧フC,,,である。octのフラクションは、実際のオクターヴに対する割合である。(pch)などで表わされる。平均律ピッチからの微細なずれを指定するには、小数点以下の数値を増やせば良い。ピッチのフォーマットを変換する関数には以下の5種類があり、関数名の後半のフォーマットを前半のフォーマットにそれぞれ変換する。octpch(pch)はpchフォーマットをoctフォーマットに、pchoct(oct)はoctフォーマットをpchフォーマットに変換する。同様にcpspch(pch)はpchをcpsに、octcps(cps)は、cpsをoctに、cpsoct(oct)は、octをcpsに変換する。これらの関数では、変換する数値を直接指定する代りにパラメータを使ってcpspch(p5)などとし、ピッチをスコアからコントロールする事もできる。17)ヴィブラートファンクションテーブル1にサイン波がストアされている場合、ヴィブラートは以下のようにすれば作る事ができる。k1になっているので、±10Hzの周波数幅で変化する5Hzのスピードのヴィブラートになる。ヴィブラートの幅が小さい場合にはこれで良いが、実際には?sッチの知覚は対数的なので、中心ピッチより高い方向へのピッチの揺れ幅は下方向への揺れ幅よりも小さく聞こえる。一般に、ヴィブラート?ネどのピッチの操作はピッチクラスやcpsではなく、ピッチの幅をオクターヴに対する小数のフラクションで表わし、上下の揺れの音程を同じにすると良い。そのために以下の様にピッチ変換関数cpsoctを使う。1outasigendin18)オーケストラファイル2次に、以下のtoot3.orcファイルをマニュアルを見ながら解読してみよう。ヘッダについては前の例と同様なので省略する。p5=freqは、アンプがk1、周波数がp5、波形番号が1のオーディオ信号を生成する。このk1を作るlinenのフォーマットを前例と同様にマニュアルで調?ラると、以下の通りである。ideclinenは、ゼロからkampの値までをライズし、kampからゼロまでをディケイする直線のエンヴェロープを与える。iriseはライズ秒数、idurは全体の持続秒数、idecはディケイ秒数であり、これらの値がゼロまたはマイナスであればライズのエンヴェロープは適用されない。p7は、信号全体の長さをp3秒に設定し、p6秒のライズとp7秒のディケイをp4の振幅に与える事になる。p7となっている理由は、実際に生成される音毎にパラメータの値を変更したいためである。これらのパラメータフィールドについ?トは、以下のスコア・ファイルの項で説明する。19)スコアファイルのフォーマットスコアファイル(以後スコア)は、オーケストラの楽器にタイミングとパラメータ値を指定する。Csoundはスコアを自動的にソートするので、以下で説明する各種のステートメント(以後文)は、時間の順にタイプされる必要はない。同一の楽器が同時に2つ以上の音を出すこともできる。CscoreやScotなどのハイレベルのスコア生成言語を使う場合にも、最終的にはオーケストラが理解できるスコアのフォーマットに書き下される。スコアのフォーマットは、以下の通りである。e,の6種類が使われる。これらの意味は以下で説明する。オプコードとp1の間のスペースまたはタブはオプショナルであるが、パラメータ間はスペースまたはタブで区切る。これらは浮動小数点の値を持ち、符号はオプショナルである。中央のCのすぐ上のC#から始まるペンタトニック音階を、0.5秒の長さのサイン音で演奏したい場合、以下の様なスコアを書く。これらの文の意味は、以下で順に説明する。2.0..8.10eなお、直前の文のパラメータをコピーする場合には、pフィールドにドットをタイプすれば良い。上の例では、p3とp4のパラメータがキャリー?ウれている。文とGENサブルーティン上の例で使われているf文は、関数を描く手続きであるGENサブルーティンを呼び出し、生成された波形にテーブル番号を与えてストアする。フォーマットは以下の通り。(p1)はテーブル番号time(p2)は関数を呼び出す時刻size(p3)はテーブルに含まれるサンプル数で、2のべき乗を指定する。最大値は224=16777216である。GEN#(p4)はサブルーティンの種類を示す番号。値がプラスであればテーブルは正規化される。最大値は1にスケールされるが、マイナスであれば正規化されない。p5以下は、GENサブルーティンによって異なる。GEN01は、サウンドファイルのデータをファンクションテーブル(関数表)に変換する。フォーマットは以下の通りである。formatsize(p3)は、サウンドファイルAIFFがならばゼロにする。filcod(p5)は、ソースのサウンドファイル名。ダブルクオートで囲む。サウンドファイルの先頭からスキップする秒数。オーディオのデータファイルを以下の様に指定する。floatsformatがゼロであれば、サウンドファイルのフォーマットが指定される。GEN19GENルーティンには1から17まで17種類ある。詳細はマニュアルを参照して頂く事にして、ここではサイン波を合成して複合された波形を作る3つのGENルーティンを紹介する。これらのルーティンで使われる部分音は、それぞれGEN09では3個、GEN10では1個、GEN19では4個のpfieldのパラメータによって決定される。フォーマットは以下の通りである。.p4までは上の例と同じなので省略する。p5以降のパラメータは以下の通りである。pnb,,,は基音に対する相対的な部分音の次数。正でなければならないが、整数である必要はないので、ノンハーモニックな部分音が可能?ナある。pnbなどの相対的な強さ。負の値は180度の位相シフト。pnbなどの、角度で表わされた初期位相。pnbなどの直流成分オフセット。str3,,,は固定された倍音成分の相対的な強さ。この場合には部分音の次数は整数なのでハーモニックな部分音だけが可能になる?B必要無い倍音成分はゼロにする。GEN10では、ハーモニックで位相のそろった倍音による波形しか作れないが、GEN09とGEN19ではこの様な限界はない。これらの部分音が加え合??ウれた後で、p4が正であれば最大値が1になる様にリスケールされるが、p4が負ならばリスケールされない。10サブルーティンを呼び出し、サイン波形(基音成分だけ)を256サンプルの関数テーブル1にストアする。文は楽器のノートステートメントで、フォーマットは以下の通りである。...p1は楽器の番号、p2は楽器がオンされる時刻、p3は持続拍数、p4以降は楽器に依存するパラメータである。拍は後述のt文がない限りは秒数と?オて評価される。20000220.5.5eこのスコアをtoot3.orcに渡すと、これらのノートは1.5秒毎にオンされ、それぞれがlinenの指示によりp3秒後にオフされる。p4はlinenのアンプとして使われ、p5はoscilで周波数のパラメータになる。文e文はスコアを終了させる。e文はオプショナルなので、スコアの最後にe文がなくてもCsoundは実行される。文Csoundスコアでの時間の単位はビートであるが、Tempoステートメントが無い場合は、1拍は1秒として扱われる。120これは、ゼロビートからテンポ120である事を意味する。25)a文a文は、選択された部分のスコアをとばす。フォーマットは以下の通りである。p3p1には、意味はない。通常はゼロにするp2はビートで数えた省略の開始時刻p3はビートで数えた省略の長さこれは、スコアが未完成のときに使うと便利である。26)s文セクションの終わりに置かれるs文には、e文と同様にパラメータはない。s文は、新たなセクションの先頭に相対的な時刻ゼロを設定するが、?シのパラメータの初期化は行わない。文、f文のソート、a文の実行、t文による時間の処理はセクション毎に行われる。最後のセクションの終わりでは、s文の代わりにe文を使う。27)自作のCモジュールを加える既にあるCsoundのモジュールでは自分のアイディアを実現できない時には自作のモジュールをシステムに加える事ができるが、これは上級者向きの課題である。otranという翻訳プログラムによって解読され、楽器ブロックはメモリにロード可能なテンプレートの形にコード化される。スコア解読プログラムの指示でoloadというローダーが発動されると、?w定されたコードがメモリにロードされ、計算が実行される。従って自作のモジュールをオーケストラで使うには、モジュールをotranのテーブルに登録し、自作のコードをCsoundにリンクする。ワークスペース、初期化コード、perf-timeコードを定義す?骰¥造体が必要である。これらを書けば、翻訳プログラム、ローダー、ランタイムモニタは、自作のモジュールを既成のモジュールと同様に扱?、。リンクの方法はUnixとマックでは多少異なる。実際のC言語でのコードの書き方の詳細その他は、マニュアルのAppendix8を参照して欲しい?B28)プログラミングの練習では、実際に具体的なアイディアを実現する簡単なプログラムを書いてみよう。(1)鋭いアタックと緩やかで長いディケイを持つノイ?Yを作り、(2)これを中心周波数とカットオフバンド幅が時間的に変化するフィルタに通し、(3)リヴァーブを加えて出力する楽器をデザインす?骼魔ノする。上の番号は、プログラミングを行う手順を示している。この場合には特に複雑なプログラムではないが、一般に複雑なアイディア?ナあっても、上の例の様にいくつかのステップに分割してプログラミングを行えば良い。上のアイディアを実現するには2通りの方法がある。?ミとつは、単一のオーケストラの中でオーディオ信号の生成、フィルタリング、リヴァーブの処理をすべて行う方法で、もう一つは、他のオー?Pストラなどによって既に生成されたサウンドファイルを別なオーケストラに読み込んで、その信号に対してフィルタリングとリヴァーブの処?揩sう方法である。以下では後者の方法を使う。楽器のデザインの際には、Csoundが用意しているユニットジェネレータに関する知識が必要?ノなるが、ある程度使い込んで慣れるまではマニュアルを読み例題をこなす事が良い練習になる。マニュアルを最初から1ページづつ読?ナいたのではどうにもならないので、勘を働かせる事も大切である。ノイズの場合、ランダムな数値をサンプリングレイトの早さで音?ノ変換すればノイズになるだろうと思い付けば、マニュアルで乱数発生ジェネレータrandを探せば良い事が分かる。その他のジェネレータの場合も、付けられた名前によって機能を判断できる様になっている。オシレータにはoscilがあり、フィルタにはresonやcombといった名前がある。リヴァーブのユニットにはreverbがある、といった具合である。29)ノイズジェネレータ上で述べた様に、ノイズを作るには乱数を発生させる信号ジェネレータを使えば良い。iseed]などがある。これらは、+ampから-ampまでの間でランダムナンバーを発生する。指定によって、サンプリングまたはコントロールレイトよりも小さい周波数でランダム数列を生成するので、バンドリミテッドなノイズを作る事ができる。隣接する値の間を線形のインターポレーションを行う。マイナスの値は、再初期化をスキップする。ディフォールトは0.5である。30)ノイズ楽器を作るでは手始めに、randiでバンドリミテッドなホワイトノイズを発生させ、これにlinsegをコントロール信号として使いリニアなエンヴェロープを持ったノイズ音響を作る。randiのフォーマットは、上に示した通りである。ic[...]]である。2番目以降の秒数であるが、これらはすべてアルファベットのiで始まるので音符毎に初期化されるパラメータである。icps,0.5は、0.01秒のアタックでアンプがゼロから10000へ立ち上がり、p3-0.01秒で再びゼロに戻るノイズになる。フォーマットに従ってオーケストラを書くと以下の様になる。asigendinこれらのファイルにそれぞれnoise1.orcとnoise1.scoと名前を付けてセーヴしCsoundを実行すれば、ノイズの入ったサウンドファイルnoise1.sndが作られ、ノイズ音が聞こえるはずである。31)フィルタCsoundで使えるフィルタの一つににresonがある。フォーマットは以下の通りである。istor]パラメータは以下の通りである。kcfは中心周波数をコントロールする。メモリの初期値で、ゼロに設定すればメモリがクリアされる。ディフォールトはゼロである。フィルタに対するスケーリングファクタを指定する数値である。0ならば、信号に対するスケーリングを行わない。後でbalanceを行う。ディフォールトはゼロである。1はピークレスポンスファクタが1である事を意味する。以外の周波数成分は、応答曲線に従ってアッテニュエイトされる。2では、レスポンスファクタが上昇し、全体的なRMSの値が1に等しい。すべての周波数が存在すれば入力と出力のパワーが等しくなる。ホワイトノイズに対して最も適用できる。複雑な複数のピークを持つ応答は、適当なフィルタバンクを直列につなげば作る事ができる。32)サウンドファイルを読む既に存在しているサウンドファイルから信号を引き出してオーケストラへ読み込むには、soundinを使う。フォーマットは以下の通りである。iformat]ifilcodはダブルクオートで囲まれたサウンドファイル名またはsoundin.nへの整数サフィックスnの部分である。オプションでフルパスネーム?w定しても良い。フルパスでない場合には、システムはサウンドファイルを現在のディレクトリで、次に環境変数でSFDIRとして指定されたディレクトリで探す。スキップされるサウンドファイルの秒数。ディフォールトはゼロ。オーディオデータファイルのフォーマット。ディフォールトはゼロで、その場合にはサウンドファイルのヘッダ情報に?]う。33)フィルタ楽器を作るではnoise1.sndを、例えば以下の図の様に時間的に中心周波数とバンド幅が変化するバンドパスフィルタに通してみよう。下図では縦軸が周波数を、横軸は時間を表わす。図の横方向へ伸びる3本の線のうち、中心線がフィルタの中心周波数で、上下の線は通過する周波数帯域である。<バンドパスフィルタの中心周波数とバンド幅>図のデータをオーケストラに書き込めば、以下の様になる。デュレーションを以下の様に指定する。205eこれらをそれぞれセーヴしてcsoundを実行すれば良い。イメージ通りの音になっただろうか?34)リヴァーブとグローバル変数Csoundが用意しているリヴァーブユニットには以下の3種類がある。istor]これらへの入力はkrvt秒間リヴァーブされ、オーディオ信号として出力される。combでは色づけされたリヴァーブになり、alpassではフラット、reverbでは自然な室内の周波数応答がそれぞれ得られる。パラメータは以下の通りである。ilptはループ時間の秒数で、エコー密度を決める。sr/2個のピークになる。ディレイループの初期位置。ディフォールトはゼロ。reverb出力には1/20秒程度のディレイが伴なうだけでなく、出力レベルがオリジナルの信号よりも小さいので、ソースの信号を適度にスケーリングしリヴァーブとミックスして出力する事が普通である。リヴァーブはソースが消えた後でも続くので、ソースのオーディオを通過させる別な楽器としてデザインする必要がある。従ってソースのオーディオ信号をグローバル変数として受け取れる様にしておき、ソースがある限りリヴァーブ楽器をオンに設定すれば良い。楽器は番号順に実行されるので、他の楽器から信号を受け取るリヴァーブ楽器には、オーケストラ中で最大の番号を与えておく。この場合のグローバル変数はすべての楽器から参照され、楽器間でのオーディオ信号の授受に使われるので、楽器の音符が重複しても信号が損なわれる事はない。グローバルな変数の宣言はinitを使ってヘッダで行う。ga1init0がヘッダに置かれていれば、グローバルなオーディオ信号を格納する変数ga1が初期化され、すべての楽器から参照できる様になる。35)ノイズ→フィルタ→リヴァーブ以上で学んだ事を最終的な楽器の形にまとめてみよう。ここでは、音符(ノイズ音)を3個とし、これらを重複させる。音符毎にアンプとバンドパスフィルタの中心周波数を独立に変化させる。バンド幅の大きさは中心周波数に対して一定の割合を保つが、その割合は音符毎に変えて設定する。ここでは、これら全体の音符に対して一定のルームリヴァーブをかけるが、音符毎にリヴァーヴの量を変更する事も可能である。音符のパラメータは、スコアのpフィールドから指定する。楽器が重複する部分のオーディオ信号の計算は以下の様に行われる。グローバル変数がヘッダでクリアされる。次にコントロール周期毎にフィルタの出力とリヴァーブの出力が加算されるが、楽器が重複していればフィルタからの出力も重複した音符の部分に対して計算され、この出力にたいしてさらにリヴァーブ信号が加算される。この計算が終わるとグローバル変数は再びゼロにセットされ、次のコントロール周期の部分のオーディオ信号が同様に計算される。従って、重複する信号にリヴァーブを加える場合には、アンプがレンジを超えないように注意する必要がある。オーケストラは、例えば以下の様になる。デュレーションを以下の様に指定する。300リヴァーブのスコアについては、デュレーションを最後の音符が鳴り終わる時刻+リヴァーブ時間とする。しないと、最後のリヴァーブが?ソき終わる前にリヴァーブ楽器がオフになってしまう。3e36)スコア生成言語言語としてのPerlさて、様々な音響的アイディアは楽器と簡単なスコアを書けばテストできる事が分かった。自分の気に入る音響素材を生成する楽器が少しづつ増えて来ると、今度はそれを使って短い音響作品を作ってみたい気分になってくる。そうそう、その調子!次の課題は、どうやってスコアを書くのか、という事になる。スコアが短い場合にはi文を自分で書くのも苦にならないが、多くの楽器を使ったオーケストラを長大なスコアでコ?塔gロールする場合にはちょっと面倒になる。コンピュータを使うのだから、もしも自分のアイディアをたとえ部分的であっても簡潔?ネ形で記述できれば面白いだろう。テキストの生成や細部のパラメータの設定その他は、その記述に従ってコンピュータに実行させれば良い。?アの方法は、何か特定のアイディアに従ってディーテイルを徹底的に追及し、複雑な響きの構造を作り出す場合には非常に効果的である。この?lな作品制作へのアプローチを、アルゴリズミック・コンポジションと呼ぶ。Csoundは、この目的のためにSCOTを用意している。1のCSOREも使える。これらを使っても良いが、スコアがテクストの形を持ったデータである事を考えると、テクスト・データを試行錯誤しながら手軽に処理する一般的な言語はないかと誰でもが思い始める。そんな時、Perlという非常にお誂え向きの言語がある事を知人が教えてくれた。字面は何となくC言語に似ているが、一々変数を宣言する必要もコンパイルの必要もないので便利である。Lispの様に対話型で気楽?ノ使える点が気に入り、私はすぐにPerlのファンになってしまった。PerlはUNIXの環境で本領を発揮するので、マックユーザ向きではな?「かも知れないが。Perlに関しては既に数冊の解説書が出ている。これらを章末の文献リストに載せておくので、関心を持った読者はぜひこれ?轤Q照すると良いだろう。