作るサウンドエレクトロニクス

5 ディジタルシンセサイザ


本章では、「ディジタルシンセサイザ」の製作実験に挑戦します。電子 楽器メーカなどでは専用LSI(ASIC)や信号処理専用のDSPチップという 手法で実現している、本格的なディジタル音源システムを理解するため に、ここではICとメモリのみを組み合わせてシステムを構築していきます。 ある程度の実用的な電子音源をフルディジタルで実現するには、たとえば 最低でも5万トランジスタ程度の回路規模が必要になります。また、 汎用ロジックICを多数使うようなシステムの製作では、PALやLCAやFPGAと 呼ばれる「プログラマブル・ロジック・デバイス」を使うことも一般的 です。しかし本書では敢えて「普通のデバイスだけを使う」という方針で、 これらの特殊なチップは使用しません。そこで、システムとしては最低限 の構成要素を押さえていますが、機能としてはだいぶ制限された音源に なりますので、この点は御了承下さい。

●時分割パイプラインDSPシステム

まず最初に必要となるのは、具体的な回路図などではなく、システムの 全体構想と全体設計というステップです。ここでは、まったく白紙の状態 から筆者が進めていった設計の流れを、詳細に追うことにしましょう。

音源の楽音合成システムですが、ここではメモリを活用して、 図5.1 のように いわゆる「PCM方式」を正直にとることにします。この方式では本書でも既に 述べたように、時間的に変化しない定常的な音色となってしまう、と心配 されるかもしれませんが、音色の時間的変化も盛り込むテクニックを使用 します。ディジタルフィルタを汎用ロジックICで構成するのは大変ですので、 ここではフィルタはありません。

ただし、 図5.1 のシステムでは、たった1音、つまりモノフォニックの音源と なっていて、大規模な回路を組む割には成果が淋しいでしょう。そこで、 図5.2 のように、時分割多重化処理システムを構成して、同時発音数を多数 もった、ポリフォニック音源を目指します。 図5.2 では、乗算器や累算器 などのシステム要素は一つしかありませんが、同時に多数のチャンネルを もって、それぞれのチャンネルごとに別個のピッチ、音量、音色、エンベ ロープの発音を生成することができます。

この 図5.2 のシステムの動作の様子を、 図5.3 によって追いかけてみましょう。 この動作こそ、「パイプライン処理」の本質そのものです。パイプラインと いうのは、時分割多重化した機能ブロックが次々に縦列接続されていて、 タイムスロット(動作を時間的に分割した単位処理時間)ごとにそれぞれ 別個のデータが次段に流れて時分割多重化処理を受ける、というもので、 機能ブロックは1セットなのに同時に多重化された別個のデータを処理して いける、というものです。図では省略されていますが、実は各ブロックの 出力部分には、システムのタイミングでその出力を保持しておくラッチが あります。そして、タイムスロットごとに、各ブロックの出力は次の タイミングまで保持されて、次段の入力情報として利用されるようになって います。

最上段は、各発音チャンネルごとに切り替えられたピッチに対応したデータ によって、波形メモリから読み出された波形データの情報ラインです。 その次の段は、各発音チャンネルごとに切り替えられた時間的変化に対応して、 エンベロープメモリから読み出されたエンベロープ(音量)データの情報ライン です。これらは同じタイミングでアクセスされると、メモリによって結果が 出てくる時間(遅延時間)が異なりますが、タイムスロットとして規定された 処理時間の最後には確実に確定して、これがラッチされて後段に行きます。 この両者の結果を乗算するのは、3段目の乗算器の部分ですが、タイムスロット としては、一つ後ろにずれてきます。そして乗算器の遅延を吸収して、最後 にラッチされた乗算結果(この発音チャンネルのこの瞬間のサウンドデータ) は、最下段の累算機の次のタイムスロットに入力されます。

このように処理していると、全体としてあるチャンネルに注目すると、 最初の情報を与えてからずいぶん手間がかかると思うでしょうが、問題は それぞれの情報の別のタイミングの部分です。たとえば乗算器は、ある タイムスロットで1チャンネルの演算をすると、次のタイムスロットでは 2チャンネルの演算処理をしていて、遊んでいる暇がありません。図をよく 眺めると、全ての情報がびっしりと埋まっていて、多数のチャンネルの 情報処理をしているのですが、メモリも乗算器も累算器も、たった1セット しかありません。これが、「パイプライン処理」の真髄なのです。

このような概念をシステム構築の中核に据えて、具体的なシステム仕様を 検討していきます。電卓を片手に色々と検討した結果、ここでは、

  ・マスターオシレータ25MHz
  ・演算タイムスロット160nsec
  ・チャンネル当たり16タイムスロット→チャンネル演算時間2.56μsec
  ・同時発音数16音
  ・16チャンネル周期=D/Aサンプリング周期=40.96μsec=24.4KHz
というような仕様とすることにしました。実際の音源LSIと比べると、 かなりシステムの動作速度とかタイムスロット設定が「遅い」のですが、 チップ上のゲートでなく汎用ICを使うので、確実に動作するためのマージン を相当に取っています。FPGAなどを活用して高速動作を実現すれば、この 2倍程度の同時発音数と2倍程度のサンプリングにまでは簡単に性能を 上げられますので、興味のある読者はぜひ挑戦してみて下さい。

また、乗算については専用の乗算LSIもありますが、ここではもっとも シンプルに、EPROMを並べてデータテーブルとして、入力のデータをメモリ アドレスとして与えてその乗算結果のデータを出力としてアクセスする、 という手法をとります。エンベロープメモリも同様にEPROMです。また、 システム内にはチャンネルごとに保持して参照すべきデータが多数ある ので、ここには普通のSRAMを使うこととしました。MIDIを受けてこの 音源を鳴らす部分はAKI-H8で実現し、音源システムとのインターフェース は同期的な動作でなく、音源システムからAKI-H8に割り込みをかける 方式としました。このあたり、なるべく実際に製作するためのICの個数 を低減するための苦肉の策ですので、プロの作る音源との差については 大目に見ることにしましょう。(^_^;)

図5.2 の考え方をベースに、現実的な動作を行うように考慮しながら本書の ディジタル音源システムのために筆者が設計してみたのが、 図5.4 のブロック 図です。ここでは、全体の動作に関係する重要なタイミング信号関係については 一切、省略しています。つまり、ここには

 ・システムクロック回路
 ・ラッチ574ごとのラッチパルス
 ・245/574の出力ごとのイネーブル信号
 ・メモリのライトパルス
 ・キーイベント/フェーズ処理(後述)関係の回路
などは現われてきませんが、音源システムとしてのディジタル信号の流れは 全て記述されています。このようなアウトラインと次のタイミングチャートを もとに、個々のタイミング信号を設計していくことになります。このブロック 図の段階で、使用するIC(ロジックICは全て「74HC」タイプを使用します)の 個数は50個ほどになります。なお、ANDゲートやORゲートの記号で描かれた部分 は、 図5.5 のように、16ビットとか20ビットという単位で、それぞれの信号線 ごとにこのゲートがあり、もう一方の制御線を共通としている、ということ ですので、16ビットANDの部分であれば、1パッケージに4個のANDゲートの 入った「74HC08」が4個必要となります。

細かいシステム上の内容については、本章のそれぞれのブロックの部分で解説 することにしますが、 図5.4 をザッと眺める上でポイントとなるとすれば、

 ・コントローラのAKI-H8とは「割り込み」によってインターフェースする
 ・16ビット、20ビットの加算器(Adder)の出力はそれぞれ、ループを構成
  して再び加算器の入力に戻ってくる構成となっている
ということが重要です。これは、システムの動作がかなり複雑な同期動作を することを意味していて、正しく動くためのデバッグには、静的でなく高度な 動的システムの解析技術力が必要になります。

そして、システム動作の基準となり、タイミング設計の基本ともなるのが、 図5.6 のシステムクロック回路です。本システムでは、一般に全国どこでも 入手できる「74HC」タイプのICで、タイミング的に十分なマージンがあって 確実に動作することを目的として、かなり余裕ある設計となっています。 ここでは、25MHzのクリスタルオシレータモジュールを使って、まず245の バッファを通して3段のバイナリカウンタ163(161でも同じ)にクロックを 供給します。163の各段の出力は図の(1)(3)(6)のように完全に同期しています が、ここにNANDゲート00を使って、図のように74HCシリーズによるわずかな 遅延を利用して、最終的には(5)のような「LP」という、周期160nsecのパルス を得ています。これは、ディジタル信号処理のもっとも基準となる「タイム スロット」(160nsec幅)の最後のあたり、そして完全な最後よりは十分に 早いタイミングに「立ち上がりエッジ」を持つもので、システムのあらゆる 場所で、このパルスを利用してデータをラッチします。

図5.6 の下段には、163から得られたC1からC8までのタイミング信号をデコーダ 138で、それぞれ排他的に該当するタイムスロットでのみ"L"となる、セレクト 信号が出力されます。CH0からCH15までの1周で、出力D/Aのサンプリング 周期となる24.4KHzとなっています。また、このそれぞれの発音チャンネル ごとに16分割されているのがS0からS15までの演算タイムスロットで、実際 にはS6からS15までの後半10スロットの期間は、制御用のAKI-H8がシステム 内のRAMに必要なデータを転送するために提供していて、実際に楽音合成を 実行するのは、先頭のS0からS5までの6スロットとなっています(後述)。

●位相累算ダイレクトシンセサイザ

それでは、本システムのそれぞれのブロックごとに、設計思想と具体的な回路 について解説していきましょう。音源でもっとも重要となる「ピッチの生成」 を担当するのが、 図5.4 の前半にある、16ビット加算器をめぐるループの部分 です。ここでは便宜上、加算器のA側の入力にある16ビットラッチを「Aラッチ」、 加算器のB側の入力にある16ビットラッチを「Bラッチ」と呼びましょう。また、 本システムで「RAM」と言った場合には、AKI-H8のCPU内部のものではなく、 このA/Bラッチの入力側にデータバスを接続している16ビット幅のSRAMを指す こととします。ピッチ生成の場面では加算器の出力にあるANDゲートは常に 制御入力に"H"が与えられて「素通し」状態にあるので、ここでは無視して 結構です。その出力は5種類のラッチ574に供給されていますが、その区別は、 それぞれのラッチの出力側から特定できますので、 図5.4 は常にチェックして 追いかけてみて下さい。

本システムでのピッチ生成の基本となるのは、「位相累算ダイレクトシンセ サイザ」と呼ばれる方式です。実はこれは既に、AKI-H8によるVCOブロックの ところでソフトウェア的に実現していたものですが、ここできっちりと紹介 しておきましょう。その基本的な考え方は、 図5.7 のようになります。ここ では、本書のこれまでの例と同様に、楽音波形メモリは1周期256ワードとして 用意しています。そのアドレス8ビットを生成するのに、16ビット加算器の 上位8ビットを使用します。それでは下位の8ビットは無駄か、というと、 そうではありません。いわば、波形メモリをアクセスするここでの上位8ビット というのは整数部分に相当しますが、そのアドレスの小数点以下にある8ビット も、毎回累算することで、12等分平均率のピッチを正確に生成する精度を 確保しているわけです。毎回の加算結果はBラッチに戻され、楽音ピッチに 対応した位相データが、制御側のAKI-H8からAラッチに与えられます。ただし、 本システムは16音ポリフォニック、つまり同時に16チャンネルの異なったピッチ を生成するのに、この加算器とラッチはたった1セットで共用しますので、 毎回の演算結果や発音チャンネルごとの位相データは、いずれもRAMに格納 して、必要なタイミングで読み出すことになります。

さて、そこでまず、本システムに固有の「ピッチに対応した位相データ」が 必要になります。これは、 図5.8 のように考えていきます。簡単な比例関係に よって、「あるピッチ(Hz)を与えれば、対応した位相データを得る」という プログラムを作ることができます。リスト5.1はこのためのCプログラムの 一例で、その実行結果として得られるのがリスト5.2です。この最後には、 AKI-H8のアセンブラプログラム内に定数データとして埋め込むための 形式に変換しています。 リスト5.3 が本システムで最終的に制作したAKI-H8の ソースプログラム、 リスト5.4 がそのオブジェクトファイルですが、この中に テーブルとして、このピッチごとの位相データが格納されています。トップ オクターブ方式では、生成するピッチが低いほど周波数設定精度が良好に なったのですが、この方式の場合には、生成するピッチが高いほど、データ の有効ビット幅が広くなって、周波数設定精度が向上する点に注意して おきましょう。なお本システムの周波数設定精度では、一般の12等分平均律 だけでなく、純正律・ピタゴラス律・中全音律・ウェルテンパード音律など 各種の「音律」に対応したデータを設定することもできます。興味のある方は オリジナル音律の音源システムの実現に挑戦してみてはいかがでしょうか。 [→章末コラム:音律と自動純正律ハーモナイザー]

また、 図5.7 の波形メモリをアクセスするのは、累算結果の上位8ビットです ので、たとえばメモリアクセスのある周期とその次の周期とでは、厳密には 小数点以下の値だけの「ずれ」があります。このため、長い時間でメモリ アクセスを眺めると、位相データの小数点以下がたまたま全てゼロでない限り、 完全に周期的に繰り返すのでなく、どこかで「端数繰り上げ」のようにアクセス のタイミングがずれる一瞬(いわば「うるう秒」みたいなもの)があります。 これはサウンドとして聞いた場合、本来の楽音ピッチよりもかなり低い周波数 帯域の成分となりますが、ビット幅の条件に対応して確実に同じ動作を繰り返す ので、周期的性格をもった一種のノイズとして知覚されます。これが「ジッタ ノイズ(Jitter Noise)」と呼ばれるもので、ディジタル方式では宿命的に 抱えている性質のノイズです。一般の人にはほとんど気付かれないほどの レベルではありますが、専門的な音源ではこのジッタ対策も必須となります。 本書のシステムではこのジッタ対策は行いませんが、対策の手法だけ紹介して おくと、

 ・波形の量子化方向にさらに3ビットとか4ビットの補間回路を設ける
 ・累算アドレスの小数点以下3/4ビットの値をこの補間に利用する
ということになります。たとえば4ビット補間によって、ジッタノイズは 16分の1となって、実用上まったく問題なくなります。

このような楽音波形アドレスの生成機構を実現するために、設計の次の段階 としては、 図5.9 のような「タイミングチャート」を作成します。 図5.9 では、 本システム全体のタイミングを全て記載していますので、 図5.4 のブロック図と ともに、本章の全体にわたって何度も参照してみて下さい。

ここで一例として、 図5.7 によって設計した波形メモリ読み出しのための ピッチデータの演算について、 図5.9 のタイミングチャートによって、以下の ように追いかけてみます。他の信号も同様に参照するわけです。まず、(1)の ように、この16スロットの期間中、それぞれのチャンネルの値はずっと固定 されています。そして、(2)のRAMアドレスのうち、関係しているのは最上段 に0から15まで番号のあるタイムスロットのうち、スロット3からスロット5 までです。スロット3ではRAMのアドレスa5-a4の「モード」が「00」と なり、ここに格納されたこのチャンネルで発音するピッチに関係した位相 データが読み出されます。これは(6)のラッチパルスでラッチAに設定します。

次のスロット4とスロット5では、RAMアドレスの「モード」が「01」と なってピッチ累算値となり、スロット4では(3)から「読み出し」となり、 この「前回のピッチ累算値」が(7)によってラッチBに設定されます。そこで、 (8)と(9)のこの両者の出力を加算器で加算した結果(11)はまず、(12)によって 245から戻され、(3)と(4)により、同じRAMのアドレスに「新累算値」として 「書き込み」され、またチャンネルが1周回ってくる次回の演算に備えます。 これと同時に、この出力(11)は(15)によってラッチされ、その出力(16)は 波形ROMの下位アドレスa7-a0となって、波形の読み出しを実行します。

本システムでは、16チャンネルのポリフォニックのピッチ生成を、実際には このようにチャンネルの時分割多重化によって実現しています。そして、 このラッチと加算器は後述するエンベロープの生成においても、同じハード をさらに時分割して使用しています。多重化された全てのデータは、RAMの 異なるエリアに格納されて、必要に応じて読み出しされ、また書き込み されます。上の説明では、ピッチのための位相データの書き込みが入って いませんが、これは(21)のCPUスロット(AKI-H8から書き込むスロット)の 中で、MIDI受信イベントを受けて、AKI-H8が用意したデータとアドレスを、 割り込みによってこのRAMに転送することで実現しています。 図5.10 は、 このための「RAMマップ」で、8ビット幅のSRAM62256(70nsec高速タイプ)を 2個使用していますが、アドレスとしてはたった6ビット(64アドレス)しか 使用していませんから、全領域の512分の1だけ使っていることになります。 それでも、これを「64個の16ビットラッチ」で実現するよりは、はるかに効率 がいい実装となっているのです。

●PCM波形処理とタイムバリアント

さて、ここまでの波形メモリの読み出し−ピッチ生成という方式では、 256ワードの周期波形がピッチに応じたスピードで繰り返し読み出される ので、「音色の時間的変化」、つまり波形の時間的変化がありません。 これは前章で製作したVCO回路でも共通のもので、あまり進展がないこと になります。しかし、ディジタルフィルタを汎用ICで実現するというのは (信号処理用の汎用DSPチップが各社から出ている昨今では)あまり 美しい方法ではありません。そこで本システムでは、波形メモリの上位 アドレスをさらに拡張することで、簡易型の「音色の時間的変化」を 実現してみることにしました。

図5.11 は、この様子をあらわした「波形メモリのマップ」です。波形メモリ の下位8ビットアドレスは、既に述べたように1周期256ワードの波形アドレス となっていますが、この隣接する波形を16個まとめて、1つの音色を構成 するように、そのまま上位アドレスに4ビット延長した「ブロック」アドレス として定義しています。ただし、このブロックアドレスは波形読み出しの 1周期ごとに繰り上がるのではなく、後述するエンベロープ生成部分から データを得ることにしました。 図5.11 の下段にあるように、エンベロープ メモリの領域を4分割した最初の1/4の部分に「アタック」「ディケイ」の フェーズに相当するエンベロープデータがあり、キーONの状態ではその 最終データを「サステインレベル」として保持するようになっています。 そこで、この冒頭の1/4フェーズをさらに16等分して、エンベロープの 推移とともに、波形ブロックアドレスが切り替わるようになっています。

つまり、この16個の波形は完全に別個のものではなくて、たとえば最初が A波形、最終がB波形とすれば、AからBに荷重平均したような、次第に変化 する波形を格納することになります。いわば、「波形のモーフィング」を 行ってみよう、ということです。
たった16分割というかなり粗い時間的変化ではありますが、本システム ではエンベロープスピードも外部から変化できるようにしてあるために、 簡単な波形同士をモーフィングで設定してみても、鳴らしてみるとかなり スムースに音色の時間的変化を実現することができました。

このように、1音色あたり256ワード(8ビット)を16ブロック(4ビット)、 ということにすると、もっともポピュラなEPROMの27256では、これが 全部で8セット(3ビット)、格納できることになります。そこで、 図5.11 のように、メモリアドレスの上位3ビットを「音色」として定義しました。 本システムでは簡易型のために、この音色指定の3ビットはエンベロープ の選択と共通となっていますが、別々に設定したい場合にも、簡単な 設計変更で対応することができます。

リスト5.5 は、本システムのために筆者がサンプルとして作成した波形ROM のデータを生成するCプログラム、 リスト5.6 はそのインテルHEX形式の 波形データファイル(これをROMライタで転送すればそのままROMが完成 する)の内容です。これは単なる一例でしかありませんから、読者の 皆さんはこれを参考にして、色々な波形のモーフィングを実験してみて 下さい。

分割されていますが、 図5.12(A) 図5.12(B) 図5.12(C) が、本システムの 全回路図です。 図5.4 の全体ブロック図と照らし合わせて確認してみて 下さい。使用するICは全て「74HC」タイプです(基本ゲートの番号は 省略:インバータは04、ANDは08、ORは32、EXORは86、NANDは00、4入力AND は21を使用し、配置の都合のいいゲートを適宜選んで配線する)。なお、 既に登場している 図5.6 のシステムクロック回路も、ここに加わって全体を 構成していることになります。このシステムクロック回路から全体に供給 される「LP」「C1-C8」「S0-S7」「CH0-CH15」の各信号とともに、回路図を またいで接続されているタイミング信号には、それぞれ固有の名前を 付けてありますので対応させて下さい。また、多数の信号ラインが相乗り する内部バスライン(RAMのデータバス、ラッチA/ラッチBの入力側などが 接続されたライン)と、波形ROM/ENV-ROMの二つについては、複数の回路図に またがる(両方の信号記述が同時に有効となる)点に注意して下さい。

図5.12(A) は制御側のAKI-H8とのインターフェースと各種のタイミング信号 生成部分です。ここでは、何度も登場しているAKI-H8のMIDI入力インター フェース回路、164と251と153を使った、エンベロープ生成に関係した 「ON/OFFイベント処理」関係のタイミング回路(後述)、割り込みによって ディジタルシステムとインターフェースする回路、システムパラメータを 保存するRAMなどがあります。タイミング設計の一例として、このRAMの アドレスA4とA5を供給する245の入力部分(4種類のゲートで構成)の設計 段階での作業を、 図5.13 によって紹介してみましょう。 この245を経由してRAMにアドレスが供給されるのは、 図5.9 の(21)の反転 信号ということですから、スロット0からスロット5までの6スロットだけ です。そして、タイムチャートの 図5.9 (2)と、RAMマップの 図5.10 より、 この時にA4とA5に設定したいアドレス信号は、 図5.13 のようになります。 そこでこのチャートをじっと眺めて、図のようにそれぞれの信号のロジック をとって、必要なタイミング信号を生成するわけです。

図5.12(B) はシステム前段のピッチ/エンベロープ生成のための位相累算部分 です。また 図5.12(C) はシステム後半の乗算・累算・D/A出力部分です。この 部分については、以下の項目のところでさらに説明していくことにしましょう。

●ディジタルエンベロープジェネレータ

本システムでは、 図5.4 のブロック図から判るように、波形とエンベロープは 同じ8ビット幅のROMに格納して読み出され、対等に8*8→16ビット乗算器により 演算されています。そして、いずれもシステム前段の加算−累算器によって、 小数点以下の「位相データ」をCPUから与える、というところまで同等にして います。しかし、ピッチの生成のための波形ROMとエンベロープ生成のための ENV-ROMとでは、そのアドレス読み出しの部分に決定的な違いがあります。

ピッチの方は周期的に波形を読み出し続けていればいい、つまりアドレスが 累算によってオーバーフローすれば勝手に繰り返してくれるのに対して、 エンベロープは繰り返しては困ります。ある楽音のON(MIDIの概念に対応 させて、ここでは「Key ON」と呼ぶ)とOFF(Key OFF)に対応して、全体 をたった1度だけ読み出して「終了」しなければなりません。また、Key ON に対応してエンベロープが進行していった段階で、「サステインレベル」 で止まったままKey OFFを待たなければならないのです。そしてKey OFFを 受けたらオシマイではなくて、ここからエンベロープは後半の「リリース」 の信号を生成していきます。この意味で、波形の部分とは違った機構を 設計しなければなりません。

図5.14 は、本システムのENV-ROMのマップと、エンベロープの「フェーズ」の 概念を示したものです。最上段の15ビットアドレスがENV-ROMのデータの内容 で、下位8ビット(256ワード)で1種類のエンベローブを指定するのは、 波形ROMと同様です。この上に4ビットの「タッチ」指定アドレスがあり、 16段階でそれぞれの楽音の音量を個別に指定します。これは、MIDIの ノートナンバと共に送られてくる「ベロシティ」という7ビットデータを 利用して、その上位4ビットを指定します。また、その上位の3ビットに ついては、波形メモリで8種類の「音色」を指定しますので、これに対応 して、音色ごとに個別のエンベロープを設定するようにしました。

図5.14 のその下に続くのは、システム内部で演算される「ENV-ROMアドレス 累算データ」との対応です。波形ROMの場合と同様に、内部的に16ビット幅 で累算されるデータの上位8ビット部分を「整数部」として、ENV-ROMの アドレス下位8ビットに与えます。その下にあるのは、CPU(AKI-H8)から 与えられる16ビットデータとの対応で、CPUから与えるデータの下位8ビット は、位相累算演算の「小数点以下」の8ビットであり、波形の場合と違って 上位8ビット部分はシステム側で強制的にゼロを指定するところに注意して 下さい。これは、楽音波形のピッチに比べて、楽音信号の音量の時間的変化 であるエンベロープは十分に低速に進展するので、必要十分な条件です。 また、CPUからのデータの上位8ビットは、位相累算演算に使用するのでなく、 別なラッチに取り込んで、「音色」「タッチ」としてメモリアドレスの指定 に使います。

図5.14 のさらにその下に続く部分では、実際のエンベロープ指定(ENV-ROM の下位8ビットアドレス)の様子を示しています。この上位2ビット(b7,b6) は、それ以下の6ビット(64アドレス)ごとに[00][01][10][11]という4つの 状態を進みますが、本システムではこれを「フェーズ」と名付けて、重要な 機能を与えています。まず、フェーズ[00]の最初の部分に、エンベロープ としては「アタック」「ディケイ」の2段階のデータを盛り込みます。この ために、アタックとディケイの比率を別々に制御することはできません。

そして、Key ONの状態では、続くフェーズ[01]の最初のデータのところで ENV-ROMの読み出しアドレスが停止してそのまま保持されるようにしました。 これは「サステイン」の状態で、具体的には、読み出し位相アドレスの下位 8ビット(CPUから与えられる)のところまで、この時には強制ゼロクリア すればいいことになります。毎回の累算は続いていますが、毎回加算される データがずっとゼロ、という状態です。

そして、Key OFFが来ると、フェーズ[01]から[10][11]まで、また位相データ が有効となって累算が進みます。そのままでは、256アドレスの最後に来ると また先頭に戻ってしまうので、エンベロープ値がゼロになることを判定して、 「フェーズ[11]でエンベロープの値がゼロになった」という状態をもって、 このエンベロープ生成の動作を終了させることにしました。つまり、ENV-ROM のデータとしては、256番め、つまり各データの最終アドレスのところには 必ずゼロデータを設定しなければなりません。オリジナルのデータを作成する 場合には、この条件を必ず守って下さい。

このフェーズが[00]の区間については、その下に続く4ビット16状態のアドレス を、波形ROMの「ブロック」指定に使います。つまり、エンベロープとしては 4アドレス(さらに下位に2ビットあるので)ごとに1つずつ進む「モーフィング」 ということになります。ただし、この4ビットの出力は、フェーズが[01][10][11] の区間では変化しては困りますので、波形ROMの対応するアドレスの部分に ORゲート列を入れて、フェーズ[01][10][11]の時には強制的に"H"にする ことにします。これによって、モーフィングの最終データで波形ブロックが 止まることになります。従って本システムでは、Key OFFを受けた「リリース」 のところでは、波形ブロックの最終256ワードの音色が繰り返されて、時間的 な変化はありません。この制限も、本システムに固有のものとなります。ただし 楽音の時間的変化でもっとも強く知覚されるのは「立ち上がり」部分ですので、 うまく波形を作ることで、時間的変化するサウンドをうまく演出することは 可能です。

このように、エンベロープ生成部分では、

 ・Kay ONからフェーズ[00]の最後まで進んでそこで待つ
 ・Key OFFを受けてフェーズ[11]まで進む
 ・フェーズ[11]の最後に「エンベロープ=ゼロ」を待ってストップする
という動作を、16チャンネルポリフォニックの時分割多重化システムにおいて 実現しなければなりません。そこで、それぞれのチャンネルのKey ON/OFF状態 については、さらにタイムスロットを使ってAKI-H8からRAMに書き込むことを しないで、AKI-H8が多数持っているパラレルポートに馬鹿正直にビットごとに 書き込んで出力することにしました。システム側では、これをデータセレクタ によって選択して、演算処理しているチャンネルの「現在のKey状態」として 取得して利用します。これは、 図5.12(A) の上段にある、AKI-H8のP1/P2の ポートからの16ビット出力と、2つのデータセレクタ251の部分です。

また、演算処理に利用する「フェーズ」の2ビットは、 図5.9 のタイムチャート から、本システムでは波形よりもエンベロープを先に演算するので、(7)で ラッチされたBラッチの出力(9)をそのまま利用できます。図5.12の回路図では これらは「EA7」「EA6」として指定されています。

そして、判定動作に必要な最後の情報は、「エンベロープの値そのもの」 です。ところが、 図5.9 のタイムチャートで明らかなように、これは矛盾が あります。つまり、上段のスロット番号で言えば、スロット2でエンベロープ の状態を決定して(15)のラッチパルスで確定したいのですが、エンベロープ の値は(16)のようにスロット3にならないと確定しませんから、 図5.12(C) の ENV-ROMの出力8ビットをゼロと比較しているコンパレータ688の出力「ZERO」 は、スロット3以降でようやく確定します。そこで、この信号ZEROを15ステップ のシフトレジスタで遅延させて次の演算スロットで復活させるのが、 図5.12(A) の2つの164の役割です。つまり、エンベロープ演算で使用するエンベロープの 値というのは、「前回の値」ということになります。

これらの条件のもとで、具体的にタイミング信号を設計することになります。 必要な入力信号は、「Kay ON/OFF」のステータス信号、前回のエンベロープ値 のZERO信号、そしてフェーズのEA7/EA6です。生成したいタイミング信号は、 例外的にENV-ROMの位相データをゼロクリアするための、 図5.12(B) のAラッチ 下位側の574のイネーブル信号「EST」と、エンベロープが一巡したので全ての エンベロープ位相累算値を強制クリアするための、 図5.12(B) のANDゲート列に 共通に入っているゼロクリア信号「KCLR」の二つです。

そこで筆者は、 図5.15 のような、エンベロープ処理のためのタイムチャート をさらに作りました。手間がかかるようですが、こうやって整理する方が 簡単になるのです。この図によって、ESTとKCLRの信号を、入力信号の組み 合わせに応じて設定するようなロジックを設計していきます。最終的な回路 としては、 図5.12(A) のセレクタ251の反転出力と[EA7/EA6]を入力した セレクタ153をうまく活用して、とてもスッキリとなりましたが、この部分 の設計はなかなか上等なパズルとなっています。ここでは敢えて、筆者が この最終的な回路を導いた論理チャート( 図5.13 と同等のもの)を伏せます ので、興味のある読者は論理設計パズルの課題として挑戦してみて下さい。

具体的なENV-ROMのデータとしては、筆者は一例として、 リスト5.7 のような Cプログラムによって、簡単な直線的エンベロープのデータを作りました。 音色に相当する8種類も、前半と後半のそれぞれ4種類は同一のものですし、 タッチに応じた変化も、単純に4ビット16段階の重み付けをしているだけ のものですが、とりあえずのサンプルデータとしては、十分に自然な楽音 のエンベロープとなっています。 リスト5.8 にはインテルHEXファイルも 置きましたので、製作実験する方は利用してみて下さい。

●乗算累算処理とサウンド出力系

図5.12(C) のシステム後半の乗算・累算・D/A出力部分については、ここまで の回路図を追ってこれた人にはそれほど難しいことはないでしょう。波形ROM とENV-ROMのそれぞれの出力データが、次に並んだ4個のEPROMのアドレスと してそのまま供給されています。これら4個のEPROMについては、音色波形 やエンベロープのように色々と「制作」することはない、固定的なデータ ということになります。

これらのEPROMを制作するためのマップが、 図5.16 です。もともと「アドレス 16ビット、データ幅16ビット」というEPROMを使えばたった1個で済むだけの ことですが、ここでは秋葉原などで簡単に入手でき、秋月電子のROMライタ で対応している27256を使うために4分割した、ということです。データと しては、アドレスとして入力される上位8ビット(0-255)と下位8ビット (0-255)を単純に乗算して、その結果の上位と下位の8ビットをそれぞれ 別のEPROMに割り当てているだけ、ということになります。

リスト5.9 は、これら4個の乗算用EPROMを作成するために、4個それぞれ に対応したインテルHEXファイルを生成するためのCプログラムです。 リスト5.10 リスト5.11 リスト5.12 リスト5.13 は、それぞれのEPROMに対応した インテルHEXファイルで、ROMとの対応をとるために、生成用C言語 プログラム内で定義されたファイル名との対応をとると、

  リスト5.10 --- ROM-8H.HEX
  リスト5.11 --- ROM-8L.HEX
  リスト5.12 --- ROM-0H.HEX
  リスト5.13 --- ROM-0L.HEX
ということになります。

この乗算ROMの16ビット出力は、その演算チャンネルのその瞬間の「エンベ ロープのついた波形」のサンプルデータとなりますが、これをそのままD/A 出力するとなると、

  ・チャンネル当たり16タイムスロット→チャンネル演算時間2.56μsec
ということで、変換時間が約2μ秒(500KHz)という超高速16ビットD/A コンバータが必要となり、コスト面で実用的ではありません。そこで、 16チャンネル分のデータを累算して(そのために20ビット幅となる)、 その結果をまとめて
  ・16チャンネル周期=D/Aサンプリング周期=40.96μsec=24.4KHz
の速度で変換することにしました。ここで使用したのは、共立電子の 壁にかかっていた(^_^;)、富士通のMB87020というもので、実はこれは D/AだけでなくA/Dコンバータにもなる、という面白いチップです。 データシートから、最大変換速度が50KHzということですから、ちょうど 本システムの仕様に適合します。
最近のD/Aコンバータはシリアル形式のものが多いのですが、このチップは 正直に16ビットパラレルなので、チャンネル累算結果の20ビットのうち 上位16ビットを「上澄み」として使用します。なお、本システム内では 絶対値表現で演算していますが、このチップは「2の補数」表現の フォーマットのようですので、MSBはインバータで反転しています。

一般の電子楽器の場合には、このように内部演算結果をチャンネル累算 した場合、たとえば1音だけ出している時には16分の1のレベルとなって、 実質的には12ビット精度の音質となってしまいます。そこで、4ビット シフトでなく3ビットか2ビットシフトとして、実質的なダイナミックレンジ を稼ぐことが一般的です。ただしこの場合には、もし16チャンネルの信号 をフルに加算して、たまたまデータがオーバーフローした場合には、 強烈なノイズ(MSBが反転して最大値とゼロとで振動する)となります。 そこで、オーバーフロー/アンダーフローした時には、アナログ的に 信号が最大値/最小値に「貼り付く」ような、リミティング回路を 設けることになります。本書ではこの部分は専門的になりすぎるので 省略していますが、所要回路規模はそれほど多くないので、実用的な システムに成長させたい人は、ぜひ研究してみて下さい。

さて、最後に残ったのは、制御側のAKI-H8のソフトウェアです。本書では 既にいろいろなAKI-H8ソフトの製作例を紹介してきましたので、ここでは 本システムに特徴的な、固有の部分だけを解説していきます。まず最大の ポイントは、ディジタル信号処理ブロックとAKI-H8制御側とのタイミング 設計です。これはなかなか深いテーマで、実は筆者が本システムの手法を (理屈としては知っていても)実際に試してみたのは初めてだったのです が、なかなか美しく成功してくれました。(^_^)

本システムでは、かなり高速の時分割多重化ディジタル信号処理を行って いますから、 図5.9 のパイプラインの流れから考えて、このシステムの 動きに対してCPUの側からストップをかけてRAMにパラメータを書き込む ことはできません。また、本質的にCPUはディジタル演算部分とはまったく 非同期に動作していますから、MIDIイベントを受信して発音パラメータ を書き込もうとしたCPUが、たとえば 図5.9 の(21)の信号ラインをソフト で監視して動作する(ハンドシェーク動作)、というのも不可能です。 AKI-H8のCPUはかなり高速で高性能だ、と誉めてきましたが、1命令を 実行するのに最小でも2サイクル(125nsec)、長い命令では1375nsecも かかります。 図5.9 のタイムチャートで言えば、たった1命令を実行する だけで、システムは9タイムスロットも進んでいるのです。CPUが高速だ、 といっても、DSPのハードウェアに比べれば驚くほど遅いのです。

この解決策として電子楽器メーカが行っている方法は、CPUから音源 ブロック内部のRAMにパラメータを書き込む部分に、ダブルバッファ と呼ばれる同期回路を挟んで、CPUは自分の好きなタイミングでデータ を書き込み、DSPも同期動作の合間に所定のタイミングでこれを取り込む、 というものがポピュラです。あるいは、DSP部分とCPU部分が同じLSI上 に搭載される場合、完全にハード部分と同期動作するCPUコアを利用 する、という究極の方法もあります。しかしいずれも、ASICなど専用LSI を作る、という規模の本格的な話であり、本書のようにディジタル音源 を簡単に製作してみたい目的には合いません。

そこで、本システムでは「ディジタル側からCPUに割り込みをかける」と いうインターフェースを採用しました。具体的には、 図5.12(A) のAKI-H8 のIRQ0端子に、CH14とS1が同時に"L"になる時に割り込み信号を与えて、 この立ち下がりエッジでCPUに割り込みをかけています。つまり、

  ・16チャンネル周期=D/Aサンプリング周期=40.96μsec=24.4KHz
ごとに一度、というペースでCPUに割り込みをかけ、この時にCPUは
  ・ある発音チャンネルの新しいピッチ位相データ
  ・ある発音チャンネルの新しいエンベロープ位相+タッチ+音色
のいずれかのデータをシステム内のRAMに書き込みます。

実際には、CPUの割り込み処理開始までには最小でも19ステートかかるの で、CH14でCPUにかかった割り込みに対応してCPUがRAMにデータを書き込む のは、その次のCH15のスロットの、S6-S15の期間です。いかに高速な CPUとはいえ、ハードDSPのシステムに対しては、それほどにレスポンス が遅いものなのです。ちなみに割り込みを「S1」スロットにした理由と いうのは、オシロで実際に動作させてみて、確実に書き込むことが できるように次第に前へ前へと移動させてみて決定した、実験的な タイミングです。設計段階ではまったく予想していなかった唯一の 「経験的設計」の部分となりました。

また、16チャンネルそれぞれのキー状態を示す、16ビットのパラレル ポートについては、割り込みとは別にMIDI受信処理→アサイナ処理の 段階で出力してしまうようになっています。

リスト5.3 にある、本システム制御のためのAKI-H8のソフトウェアの 基本設計としては、 図5.17 のような枠組みを設計しました。リセット スタートからの初期化ルーチンと、あとのメインループの構造は いつものスタイルです。そして、MIDI受信割り込みによってMIDI受信 FIFOに受信データを積み、メインループの中でFIFOに新しいデータが 置かれたか(FIFO読み出しの先頭ポインタと最終ポインタが一致 していれば新しいデータが無い)、をチェックするのも同様です。

MIDI受信FIFOにイベントがあった場合、ここでいきなりDSPシステムに データを転送する体制には入れません。RAMに転送すべきデータを格納 するのはたった1セットのラッチなので、以前に転送しかけたデータの成功 を確認する必要があります。そこで、後述するアサイナ(発音割当)処理 の結果としてRAMに書き込むべきデータとそのアドレスのセットを、 いったん「イベントFIFO」に積むだけでこの処理を終了します。

メインループから呼ばれる別のルーチンでは、このイベントFIFOを チェックします。これは、割り込み処理とのハンドシェークのために 「転送リクエストフラグ」を設けているためで、このフラグが立って いる場合には、まだシステムRAMへの転送が終了していないということ で、ここでは何もせずリターンしてしまいます。割り込み転送処理が 成功した場合には、転送リクエストフラグがクリアされていますから、 そこで次の処理に入ります。ここではイベントFIFOから取り出した、

  ・ある発音チャンネルの新しいピッチ位相データ
  ・ある発音チャンネルの新しいエンベロープ位相+タッチ+音色
のいずれかのセットを、RAMの16ビットデータバスに転送するために、 上位・下位のラッチ574にデータをセットし、さらに対応したRAMの アドレスを指定するラッチ574にもセットします。この状態で、これら 3つの574の出力をイネーブルすれば( 図5.9 のタイムチャートの(21)の CPU占有スロットでは自動的にそうなる)、あとはRAMのライト信号WE の立ち下がり−立ち上がりで、RAMのこのデータが書き込まれる、と いうわけです。最後に転送リクエストフラグを立てます。

これだけの準備が整っていれば、あとはシステムからのIRQ0割り込み があると、まず転送リクエストフラグが立っている(転送すべきデータ のセットが完了)のを確認した上で、ポートからRAMのWE信号を下げて また上げる、という処理を行います。割り込みからの時間は実測で タイミングをとっていますので、この時には 図5.9 の(21)のCPU専用 スロットに入っています。ただし、たまたま割り込みがかかった時に 実行していた命令が例外的に長かった場合には、ここでCPUが書き込み を実行したつもりでも、実はCPU占有スロットが終わっていて、実は 転送が成功しない可能性があります。そこで、ポートのうち1ビットを 入力に設定してあり、WEパルスを生成した直後のこの574のイネーブル 信号ラインをモニタしています。これが"L"であれば、まだスロットは 有効だった、ということで「転送成功」と判断し、転送リクエスト フラグをクリアして次のデータのセットを許可します。ところが万一 "H"だった場合には、転送失敗の可能性がありますから、転送リクエスト フラグをそのままにしてリターンします。これにより、新しいデータ は書き込まれませんから、次の割り込みタイミングの時には、もう一度 同じデータでRAMへの書き込みをトライすることになります。これで、 確実にシステムへのパラメータ転送が実行されます。

このメカニズムはかなり面倒なようですが、それぞれの割り込み処理 ルーチンでの対応をもっとも高速に完了し、かつ動作として絶対に データ落としや転送ミスが発生しないようにするためには、全て必要 な機構です。かなりテクニカルなものですが、ソフトウェア技術と しては重要な内容ですので、プログラミングのアルゴリズムに興味の ある方は、どうぞじっくりと研究してみて下さい。

AKI-H8ソフトウェアの説明として最後に残ったのは、アサイナ(発音割当) の部分です。AKI-H8によるアサイナは本書では既にいくつか登場して きましたが、本システムではより本格的なものを制作してみました。 実はこのシステムでは、簡単に製作するために回路規模を最低限にする ということで、 図5.15 のエンベロープ生成の部分に、ちょっとした簡易型 の発想を盛り込んでいます。きちんとしたエンベロープ生成のためには より複雑な機構が必要となるのですが、本システムでは、フェーズ[00]で エンベロープがまだ立ち上がっている途中でKey OFFとされても、無視 してエンベロープ生成が続くようになっています。(^_^;) このため、 たとえば発音チャンネルの番号の順に発音割り当てを行うような方式 の場合には、かなり不自然なサウンドとなってしまいます。

そこで、本システムのAKI-H8のアサイナとしては、筆者が「ローテイト/ フローティング方式」と名付けた、かなり技巧的で動的な動作を盛り込んで みました。これは、発音中のチャンネルについてはその優先度を尊重する として、「空き」チャンネルについてもその開放された時間的な履歴を 管理して、新しい発音の割り当ては、常に「もっとも過去に空きチャンネル となったもの」に指定する、というシステムです。これによって、Key OFF になった後でまだエンベロープがのこっているチャンネルについては、 より古い他の空きチャンネルから発音が割り当てられるために、不自然に 音が切れたりする現象を最大限に回避することができます。

図5.18 は、このアサイナの設計のために筆者がメモしたものです。これと リスト5.3 のAKI-H8ソフトとを突き合わせてみると、その思想を理解する ことができるでしょう。ここでは「assign」という16バイトの変数領域 を使用していますが、この連続した「assign+nn(nn=0-15)」というnnの 値は固定的な発音チャンネルに対応し、そこにセットされるデータが それぞれの管理用データであり、この中身が刻々と変化(動的にグルグル 回る)する、というところがポイントです。最終的にはかなりシンプルに まとまっていますが、このアルゴリズムもなかなか重要な概念ですので、 興味のある方は追いかけてみて下さい。

図5.19から図5.22までは、実際にこのシステムを製作した筆者の作業中 の様子で、 図5.19 は筆者の机の全景です。実際のデバッグ段階では、ここに A4で十枚ほどの回路図とタイミングチャート、3冊のデータブック、オシロ、 ハンダごて、MIDI送りのもう1台のPowerBookも登場するので、こんな整然と してはいません。(^_^;)
左側のPowerBookの画面内では、AKI-H8のソフト開発用にWindows95が走って います。そして、中央にドンとある基板が、30cm*20cmの試作中のシステム です。すぐ左にはAKI-H8ライタ、すぐ右には電源ボックスがあります。 いずれも自作のツールです。

図5.20 はその基板のアップです。左上にMIDI入力、発音割り当て等の動作を行う AKI-H8が載っています。縦に4つ並んだEPROMは、これで8×8=16ビットの乗算 を実行するEPROMです。その左に二つあるROMが、波形とエンベロープのROMで、 この写真の段階では、まだ暫定のデータしか入っていないので、窓にシール が貼ってありません(このソケットはレバー付きのもの)。 いちばん右が富士通の16ビットD/Aコンバータ、二つあるスリム28pinDIP がSRAMです。283を並べた、16ビット加算器、20ビット加算器もあります。

図5.21 は、本書では何度も登場している、基板上のAKI-H8に書き込むための、 自作フラッシュROMライタです。普段はスイッチングレギュレータ上に作った この基板にAKI-H8を挿すのですが、今回はいちいち抜き差ししないように、 ケーブルを作って延長しました。この状態で、オンボードでテスト書き込み、 テストランを繰り返すことができます。

図5.22 は、システムの基板の、配線が終わってデバック途上の配線面です。 ここから、デバッグ段階でさらに数ヶ所の配線ミスを直し、さらにオシロ で調べることで数ヶ所の設計ミスを発見して配線変更などしましたが、 ほとんど当初の設計のまま、3日間の[デバッグ/AKI-H8ソフト開発/EPROM データ作成]の作業により無事に動作し、完成することができました。 かなりの配線量になりましたが、個々に確実にハンダ付けをしていけば、 本システムはごく普通の部品だけで構成でき、タイミング的に十分なマージン がありますので、誰が製作しても(正しく製作できれば)動作します。(^_^)

なお、このシステムの全ての製作が終わってから気付いたことですが、うまく設計 を変更すると、システムの2個所にある、16ビットと20ビットのANDゲート列に ついては、省略することも可能のようです。ヒントとしては、出力イネーブル 端子が"L"に固定されているいくつかのラッチについて、出力ラインにプルダウン 抵抗を付けた上で、タイミングによってここをディセーブルする、ということで 強制ゼロクリアすることが可能だからです。Aラッチについては、上位と下位の 8ビット単位で別々にゼロクリアするためにこの機能を利用したのですが、その 発想を拡大すれば、このシステムの仕様に限った場合には、ANDゲート列による ゼロクリアを全て吸収できるようです(一般の音源ではANDゲート列に別の意味を 持たせることが多いのでちょっと無理)。興味のある読者は、この可能性に 挑戦してみると、タイミング設計のいい課題となるでしょう。

付録CDROMの第19トラックから第25トラックまでに入っている7本のサウンドは、 本システムのデフォルト音色/エンベロープの状態を立ち上げて、MIDI経由で 与えられた演奏情報を入力して鳴らしてみたサンプルです。途中でMIDIプログラム チェンジによって音色を切り替えてみたり、という演出はありますが、すべて 本書に書かれたままの裸の基板から出てきたサウンドです。ここでは敢えて、 図5.12(C) のD/Aコンバータの出力段にエイリアスノイズ除去フィルタを入れず に、折り返しノイズが出たままのサウンドを入れています(アナログフィルタ による音色の変化を加えないで評価するため)が、楽音の立ち上がり時の時間的 変化、エンベロープの推移、豊富な同時発音数とアサイナによる自然な発音状況 などが判ると思います。

■おわりに■

サウンドエレクトロニクスの世界について、具体的な製作実験を交えて、 その色々な「面白さ」を紹介してきました。サウンドというのは、人間の 感情に強く訴えるメディアでありながら、まだまだその「聴覚」の部分でも 研究途上の謎が多く、ましてサウンドから<音楽>をいかに「知覚」「認知」 するか、とか、そこからさらに「感情」が導かれるか、などという領域は、 ギリシャ時代以降、多くの専門家のアプローチをもってしても、まだまだ 解明されていない深遠な世界です。しかし、誰でもお気に入りの音楽を聴いて 楽しむことができ、知らなかった古い音楽や新しい音楽を聞いて新鮮な感動を 覚えることができます。本書をきっかけとして、エレクトロニクス技術や コンピュータ技術と、人間の感覚/感情や芸術の世界に広がる「サウンド」 の世界に興味をもっていただければ、筆者としてこれ以上の喜びはありません。 どうぞ、一緒にサウンドの世界を楽しんでいただければ、と思います。

追記 : テキストデータとサウンドデータ(mp3)の提供について

付録CDROMの販売も終了し、インターネットの太さも執筆当時に比べて飛躍的に太くなったので、 全てのテキストファイルをzipにまとめたものと、付録CDROMに収めたAIFFサウンドファイルをmp3化して zipにまとめたものを以下に置きました。 ご活用ください。(^_^)

[コラム:コンピュータ音楽作品の実例]

本書の付録CDROMの第2トラックから第25トラックまでは、本書の中で実験的に 製作したシステムを鳴らして録音したサウンドのサンプルが入っていますが、 第26トラックから第29トラックまでは、Computer Musicの作曲家として筆者 が1998年に作曲したいくつかの作品から収録してみました。本書では古典的な 電子楽器/シンセサイザーのサウンドが中心となりましたが、ここではむしろ ディジタル信号処理のテクニックを活用して、素材としては自然楽器の サウンドや人間の声、そして自然音などに重点を置いて活用しています。

第26トラックの作品「bit extra issue」は、いわゆる「テープ作品」と 分類されるタイプで、ライブでなく基本的にスタジオでの音響信号処理に より「非実時間的に」制作されたものです。ここでは、フルートによる 現代奏法のサウンドのみを素材として、「切り貼り」「反転」「時間軸の 圧縮伸張」という古典的な基本操作だけを使用して作曲しています。この 作品が実現されるまでの経緯については、共立出版「コンピュータと 音楽の世界」の中に紹介していますので、興味のある方はそちらも参照 して下さい。

第27トラックの作品「Ogress2」は、もともと1998年に作曲した別の3つの ライブ作品があり、その背景音響パート部分として制作したCDパートから リミックスして、テープ作品として制作したものです。この作品についての 解説は、付録CDROM内のデータトラックにリスト5.14として収録してあります ので、興味のある方はそちらを参照して下さい。

第28トラックの作品「Mycoplasma」は、ライブ作品の形態のComputer Music 作品です。そのライブ演奏をレコーディングしたテイクをサウンドトラック に収録しましたので、テープ作品としてはやや傷もありますが、ステージ上 でのパフォーマーのマイクへの「朗読」がリアルタイムにディジタル信号処理 されてこのサウンドがライブに生成されている、という部分に注目して いただれれば、と思います。この作品についての解説は、付録CDROM内のデータ トラックにリスト5.15として収録してありますので、興味のある方はそちら を参照して下さい。

第29トラックの作品「Visional Legend」は、映像を伴うマルチメディア・ アートの形態のライブComputer Music作品であり、ステージでは筆者の 製作した「笙ブレスセンサ」を使用した、笙奏者の東野珠実さんの演奏に 応じて映像系がリアルタイム操作され、また東野さんの演奏する笙の音響 もリアルタイム信号処理されて展開していくものです。ここでは、そのうち 背景音響パートとして制作されたCDパートのみを収録していますので、作品 の全体像とかけ離れた、作品のごく一部だけである事に注意して下さい。 この背景音響パートでは、あらかじめ慶應大学湘南藤沢キャンパスで収録 した、東野さんの演奏による「笙」のサウンドのみを素材として(他に、 バリトンの佐々木潤哉氏の朗読を素材として使用)信号処理による音響 作品としています。この作品についての解説は、付録CDROM内のデータ トラックにリスト5.16として収録してありますので、興味のある方はそちら を参照して下さい。

[コラム:音律と自動純正律ハーモナイザー]

本書ではここまで、全てのピッチの設定基準として「12等分平均律」を 使用してきました。しかし、ピッチの決め方というのはこれだけで ありません。ここに「音律」という概念が登場してきます。 音律というのは、音楽の世界に12音平均律が登場してくるまでの長い 期間、音楽の姿に合わせて、数多くの音楽家によって研究・実践されて きた、ピッチの設定に関する「音の組織」という音楽上の文化資産です。 これは、音楽の基本である「音」の、もっとも原理的な特性に関係した もので、あるレベル以上の音楽を志向する音楽愛好家にとっては、避けて 通れない重要な問題です。この世界を知った人のなかには、「平均律の 音楽など、濁っていてとても聴けない」という人がたくさんいます。 そこで、付録CDROMの リスト5.17 として、筆者が以前に書いた解説文を リメイクした解説記事を収録しました。興味のある方は、よく読んで 研究してみて下さい。

この「音律」をサウンドエレクトロニクスのシステムに設定するには、 通常は「ピッチ設定に9ビット、オクターブ範囲で4ビット」と言われる 12等分平均律との違いを正確に表現するために、経験的には「ピッチ設定 に12ビット、オクターブと合わせて16ビット」もあれば十分です。 つまり、本書のシステムでは、トップオクターブ方式でもピッチ位相累算 方式でも、ピッチ設定のためのデータがほぼ16ビットにわたって使用されて いる帯域については、十分に実験できることになります。

そして、たとえば純正律などの音律設定機能を組み込んだシステムを構築 すると、すぐさま直面するのが、音楽演奏の際にリアルタイムに音律を 変更する、という「人間のハーモニー感覚のエミュレーション」です。 音律というのは、ピアノのチューニングのように固定的に設定するもの だけでなく、耳の良いコーラスが常に動的にピッチを微調整して純正な ハーモニーを実現する、というような機能もあります。そして、サウンド エレクトロニクスの処理能力、コンピュータの設定精度と演算能力が あれば、「動的に音律を変更する」という、「自動純正律ハーモナイザー」 を実現することも、技術的には可能となってきます。

つまり、合唱音楽とか吹奏楽器・フレットのないバイオリン等における、演奏 時のリアルタイム「純正化」ということです。ところが合唱を除いて、これは 原理的に問題があるのです。演奏されている和音をリアルタイムに判定して 処理するのは、自動伴奏の電子楽器では約20年前からやっていることで、 そこに純正律のピッチ操作を加えることも技術的にはなんら問題はありません。 ところが、音楽的に問題があるのです。ここで例をあげてみますので、興味の あう方はよく考えてみてください。

ある2つの和音があるとします。たとえばCとFとします。 コード[C]が押されている、と判定したマイコンは、ルートがCであること、この 和音が長3和音であることを数ミリ秒もあれば判定できます。そこでEは純正長3度 (平均律より14セントほど低い)に、Gを純正完全5度(平均律より2セントほど 高い)にセットします。これは1ミリ秒程度で簡単に実行されます。 次に、コード[F]が押されている、と判定したマイコンは、ルートがFであること、 この和音が長3和音であることを判定します。そしてAはFから純正長3度に、Cは Fから純正完全5度にセットします。 ...これなら何の問題もないみたいに思えます。

ところが音楽というのは、個々のコードがブツ切れで並んでいるのではありません。 横の関係があります。たとえばオーケストラのある単音楽器にとっては、ある和音 の構成音としてある瞬間にCを出すのと、別の和音の構成音として別の瞬間にCを 出すのとでは、物理的に楽器にC音の発音を指示するだけなので、変わらないかも しれません。ところが、純正なハーモニーを作れるだけの実力のある合唱団の場合 には、音楽のあちこちに出ているC音は、場合によってはみんな異なるピッチである こともあるのです。つまり、「隣接する2つの和音に、共通音があった場合、これを 同じピッチにする」という原理を1つだけ導入すると、以下の問題が起きるのです。


構成コード5つの、よくあるコード進行を例にあげます。
アメリカ式にコードネームを並べると、

        C → A → Dm → G → C

としましょう。これを、「各和音を純正にする」「共通音を同一ピッチにする」と
いう2つのルールで処理すると、どうなるでしょう?

 コードネーム  C → A → Dm → G → C

   構成音   G
         E − E
         C   C#
                          A − A
                 F
                 D − D
                     B
                     G − G
                         E
                         C

1オクターブは1200セント、1オクターブを上下に越えたら1200内に戻る
ように mod(1200) とします。さて、最初のCをゼロセントとして、最後のCは
ちゃんとゼロに戻るでしょうか?
ちなみに、純正音程のセントデータとしては、ルートをゼロセントとして、
   純正長3度 : 386.3136247774759 セント
   純正完全5度: 701.9550991058793 セント
とでもしておきましょう。(リスト5.17参照のこと)

ここでは、クイズとして回答は書かないでおくことにします。ヒントは、
以下のようなことを考えて、実際に調べてみれば分かります。

<ヒント>
全パートが一斉に和音をバースト状に
 
 A   ****   ****  *******  *****
 B   ****   ****  *******  *****
 C   ****   ****  *******  *****
 
と鳴らすような音楽であれば、「それぞれの瞬間の和音を純正にする」という
機械的な音律設定のシステムでも破綻しません。ただし、前後で同じ音名の
ピッチが、音律を考慮した精度では刻々と変化していることになります。

ところが、ポリフォニー音楽のように、
 
 パートA ********    **********       ***
 
 パートB ****  **********    ********
 
 パートC   **********  *** ******  *******
 
というように、それぞれ一部が同時に鳴って和音を構成しているような場合を考えて
みましょう。この場合、あるパートがDmollのD音を出していて、次に他のパートが
G音やH音を出して和音がGdurになったからといって、出し続けているD音を
同じ音程なのに変更する、というのには抵抗があります。そこで、「隣接する2つ
の和音に、共通音があった場合、これを同じピッチにする」という原理を尊重
すると、それに合わせて和音の他の音のピッチを純正にとることになります。
これがヒントです。(^_^)


トップに戻る