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

3 MIDIとマイコン制御


本章では、最近のサウンドエレクトニクスを支える技術の一つの中心 である「マイコン技術」について、カードマイコン「AKI-H8」にスポット を当てて検討していきます。なお、本書の重要なテーマの一つである 「MIDI」について(仕様の詳細なリファレンス)、そしてカードマイコン 「AKI-80」については、筆者がすでに「Java & AKI-80」(CQ出版)と いう本で詳解していますので、本書では内容が重複する部分については 省略しますから、あわせて「Java & AKI-80」を並べて読み進めることを お薦めします。

●カードマイコンAKI-H8と開発環境

第1章で、最近の電子楽器システムの中枢にはマイコンシステムがある、と いう話を紹介したように、現代のサウンドエレクトロニクスのシステムは 一種の独立したコンピュータとなっています。そこで本書では、なるべく最小 の製作労力で最大の性能を得て、さらにマイコンに関する些細な専門的知識を 必要最低限で済ます、という目標のために、AKI-H8というカードマイコンを 利用することにしました。これは、 図3.1 のような外観の小型のマイコンボード で、秋葉原の秋月電子で通販により容易に入手できるマイコンキットです。

AKI-H8の中枢にあるCPUは、日立の16ビットCPU H8/3048Fであり、このCPUの 内部ブロックは図3.2のように非常に強力なものです。また、AKI-H8の回路図 は図3.3のようになっていて、図3.4のように、CPUの全てのピンを外部に引き 出すことができるようになっています。これは、AKI-H8の前身のAKI-H8では 完全にはサポートされていなかった仕様で、ミニフラットパッケージの細かい パターンをカットした経験者には嬉しい前進です。

さて、AKI-H8のプログラムですが、AKI-80をはじめとする従来のマイコンボード では、基板上にEPROMのソケットがあり、そこにプログラムを焼き込んだ EPROMを挿入する、というスタイルでした(「Java & AKI-80」(CQ出版)参照)。 ここでは、実験や開発の段階では、ROMソケットに「ROMエミュレータ」を挿入 して開発側パソコンからプログラムをダウンロードし、マイコンボード側の CPUがこれをROMだと騙されて動作することでチェックする、という開発手法 が使えました。ところがAKI-H8では、プログラムメモリとして128KBのフラッシュ メモリが内蔵されていて、普通の使い方では従来の方法がまったく使えません。 そこで、AKI-H8の時代とは異なる、以下のような開発手法が必要になります。

まず、ハード的な開発環境について整理していきましょう。秋月電子のAKI-H8 のマニュアルには、図3.5のような「ROMライタ」の回路図が掲載されていて、 必要な部品も同梱されています(後にROMライタボード基板も同梱されるように なりました)。そこで筆者は、 図3.6 のような、特製の「開発環境」を製作 しました。これは、秋月電子のマニュアルにあるROMライタの回路部分は そのまま使い、さらにMIDI開発のために後述するMIDIインターフェースを搭載 し、ホストのパソコンとしてWIndowsマシンとMacintoshの両方のケーブルを 備え、AKI-H8をここにセットしたままで「フラッシュROMへのプログラム書き 込み」「テストラン」を交互に行えるようにしたものです。AKI-H8を用いた 筆者のあらゆる開発は、このマシンとPowerBookだけで手軽にどこでも実現 できるようになっています。

図3.7 は、この「開発環境マシン」の回路図です。秋月のROMライタ部分の回路 は図3.5のマニュアル回路図を参照して下さい。システムの全体は、ROMライタ 回路の「7812」の代わりに使っている12Vのスイッチング電源の上に載っていて、 これだけで完全にスタンドアロンとなっていて、持ち歩きは軽快です。 図3.8 は、このマシンでAKI-H8のシステムを開発している風景です。マシンのシリアル コードはPowerBookのModemポートに接続され、ソフトウェアの開発とフラッシュ ROMの書き込みを行い、同時にMIDIケーブルによって、MIDIシステムとの やりとりも行うことができます。もちろん、時には右側のWindowsノートの DSUBコネクタに付け替えて開発することもあります。

ここで注意点としては二つあります。まず、AKI-H8でMIDIを扱う場合には常に 行う処理ですが、基板上のRS232CドライバのMAX232(AMD232)の11ピンと12ピン を、パターンを切らないように注意して、ICの根本でカットする必要が あります。これは、AKI-H8では二つのシリアルポートを両方ともRS232Cに 使えるようにしてあるためですが、幸いにCPUの信号線が全てコネクタに 出ているので、これだけの改造でMIDIでも使えるようになります。 そしてもう一つは、 図3.7 のスイッチング電源の出力にある二つのスイッチは、 必ずどちらか一方だけをONにする(同時にON、というのは無効)という ことです。片方はフラッシュROMを書き込む時に使い、もう片方はテストラン するためのものですから、これは当然のことです。

次に、ソフト的な開発環境について整理しておきましょう。もともと秋月電子 のAKI-H8キットには、アセンブラとフラッシュROMライタソフトが同梱して います。また、このCPUに機能限定をしたCコンパイラも2500円で提供されて います。つまり、AKI-H8をアセンブラとCの両方で開発できるわけです。 そして、アセンブラとCコンパイラは、MS-DOS上で動くものですから、Windows では「DOS窓」(DOSプロンプト)を呼び出して起動します。ただし、フラッシュ ROMライタのプログラムだけはWindows95用となっていますので、単なるDOS だけのマシンでは開発を行うことができません。

さて、ところで筆者はMacintoshのPowerBookでAKI-H8を開発していると書きました が、これは「Windowsエミュレータ」を活用することで可能となりました。 図3.9 を見て下さい。これは、筆者の愛用しているPowerBook2400c/240のデスク トップの風景です。ただし、画面右側に並ぶアイコンのうち「Windows」を 叩いて、大きく開いている「Virtual PC」というMacintoshのアプリケーション を起動しています。そしてこの中は、エクスプローラーも左側に並んだショート カットも、全てWindows95の世界です。実はこのソフト、Mac上で「完全に」 Windows95をエミュレーションするソフトで、製品のパッケージには、 Virtual PCのソフトの入ったCDROMとともに、Microsoftの正式なマニュアルの 付いたWindows95のCDROMも同梱されてくる、という優れものなのです。MacのHD 内に、Windowsシステムのイメージで340MBほどのエリアを確保して、DOS窓や あらゆるWindos/DOSアプリを走らせ、さらにサウンドブラスタのような音源を 鳴らすソフトもエミュレーションしてMacのサウンドポートを鳴らします。 そして、WindowsマシンがRS232Cポートを使う部分も、Macのモデムポートで 正しくエミュレーションしてくれるので、AKI-H8の開発環境もMacで走らせる ことが可能となるわけです。

図3.10 は、この「Mac内のWindows」で、実際にAKI-H8を開発する作業の 様子をキャプチャーしたものです。ここでは、AKI-H8のプログラムをCで開発 するために、Windowsの定番テキストエディタ「秀丸エディタ」を起動して、 プログラムを開発しているところです。筆者はDOS時代にはもっぱらMIFESで あらゆるドキュメント(原稿、メイル、ソフト、LaTeX論文等)を書いて きましたが、現在ではもっぱら秀丸オンリーとなっています。もちろん、 エミュレーションですのでWindowsマシンよりは処理速度は遅いのですが、 もともと「開発」という作業はそれほどスピードを要求されないので、 実質的には問題はありません。デスクトップにショートカットのアイコン が見えますが、ファイラにはDOS版の「FD」も活用しています。(^_^;)

図3.11 は、DOS窓とお約束のバツチファイルによって、AKI-H8のプログラム をアセンブル/リンクして、さらにフラッシュROMライタのためのデータに コンバータで変換する、という一連の作業をオートマチックに実行している ところです。詳しくは後述しますが、ここでは「ASM」という名前のバッチを 起動して、TEST11というソースプログラムのアセンブル、リンク、そして変換 作業までが成功したというところです。Windows95になって、このDOS時代 のバッチの軽快さは失われてしまい、DOS環境が捨てられない人はいまだに 多いようです。(^_^;)

図3.12 は、このバッチの最後に呼び出されるもので、Windowsアプリである 「フラッシュROMライタ」のプログラムが起動されているところです。この ソフトがDOS汎用であれば、DOSマシンの電子手帳など、もっと軽快な環境 でも開発できるところなのですが、AKI-H8開発環境の一つのネックに なっています。このあたりの詳しい内容は後述します。 図3.13 は、このような 環境で筆者が開発したマシンの一例で、AKI-H8によって非常に小型なもの となっています。これは「インテリジェントRS232C--MIDIインターフェース」 というもので、MacintoshのアプリとしてMIDI送受信を安定に行うものを オリジナル開発するために製作したもので、006P電池まで内蔵しています。

●MIDIとサービスライブラリ

ここでは、筆者が実際にAKI-H8のシステムを開発する環境の実例を紹介して いきましょう。初めてAKI-H8キットを入手した時には、ちょっとしたポイント を押さえることが必要となりますが、これは秋月電子のオンラインマニュアル でも、あまり親切には書かれていないからです。まず、ここではWindowsの ドライブは「c:」にあり、この直下に「c:\msdos」というディレクトリが あるものとします。この「c:\msdos」には、筆者は秋月電子から提供されて いる、AKI-80およびAKI-H8の開発ツール(アセンブラやコンパイラ等、 さらにオリジナルのROMエミュレータソフト等)を全部置いていて、ここには 後述する方法でパスを通しています。そして、実際のAKI-H8開発の場と して、この下に「c:\msdos\aki-H8」というディレクトリを設けています。 MSDOSの環境設定に慣れていない人は、とりあえず同じ構造を作って下さい。

そして、環境を設定しつつこの開発の場に直行するために、Windowsのデスク トップ上に「MSDOSプロンプト」のショートカットを作り、このプロパティ として、 図3.14 のように設定しています。つまり、プロパティの 「プログラム」の項目として、作業ディレクトリに「c:\msdos\aki-H8」と いう開発の場となるディレクトリを指定し、さらにこの中に「setpath.bat」 というバッチファイルを用意しています。これは、MSDOSプロンプトを起動 した時に呼び出されるものです。このsetpath.batの中身は、リスト3.1の ようになっています。他の部分は関係ありませんが、この中に「c:\msdos」 というディレクトリを指定したことで、秋月の開発ツールは他のどこから でも呼び出されます。

そして、この開発の場となる「c:\msdos\aki-H8」というディレクトリの中身 の一例が、 図3.15 のようなものです。常にここに置かれているものと、 開発途上で一時的なものとがありますので、順にきちんと整理して おきましょう。サブディレクトリを除外すると、ここには15個のファイル があります。このうち、開発途上の「TST05.C」「TEST11.SRC」と、「3048.sub」 はここでは本質的には関係ないものであり、また「FRASHROM.MOT」と 「SYSTEM.SUB」と「SYSTEM.OBJ」と「STARTUP.OBJ」は毎回の作業で できるファイルで刻々と内容は変化します。そして既に環境設定の ための「SETPATH.BAT」は紹介しましたので、残りは7個です。

まず、AKI-H8をアセンブラで開発する環境について整理します。AKI-H8 のアセンブラプログラムとは、「TEST11.SRC」( リスト3.2 )のような テキストファイルで、これを秀丸エディタのようなテキストエディタで 作成・編集します。そして、このソースを上書き保存すると、DOS窓から 「ASM.BAT」を、拡張子を省略したソースファイル名とともに呼び出します。 たとえばソースがTEST11.SRCであれば、コマンドプロンプトに対して、 「>ASM TEST11」と指定してリターン、です。この「ASM.BAT」の中身は リスト3.3 のようなもので、まずアセンブラA38Hでアセンブルし、その 結果をリンカL38Hでリンクし、FLASHROMという名前のオブジェクトを作り ます。そしてこれをC38Hという変換ツールで処理して、その結果は予約名の 「FLASHROM.MOT」となります。ここで一旦ポーズして、エラーがあれば 中断し、なければリターンで次に進みます。

そして最後に呼び出されるのは「FLASH.EXE」というフラッシュROMライタ のプログラムで、筆者の実験では、どうもこれだけはパス経由でなく 作業環境に直接置く必要があるために、ここに置いています。ここでは、 常にメニューから予約名の「FLASHROM.MOT」を指定して、AKI-H8に 書き込みすることになります。このROMデータのファイルはテキスト ファイルで、中身の一例は リスト3.4 のようになっています。AKI-80など で使っていた「インテルHEX形式」でなく、先頭文字のSで判るように、 「モトローラS形式」です。つまり、AKI-H8のCPUは日立製ですが、日立 は昔からモトローラ系の6800を作ってきたメーカである、という伝統的 体質がここに如実に現われているのです。(^_^;)

AKI-H8をアセンブラで開発するための環境はここまでで、比較的シンプル です。実際には、アセンブラにCPUの種類を指定してやる部分を、 バッチの中のアセンブラ起動オプションとして設定しているために、 ソース中に記述しなくてもいいわけです。

次に、AKI-H8をCコンパイラで開発する環境です。残りのファイルが ここに関係しますが、一部、筆者がオリジナル開発している道具だても 入っています。これは、Cプログラムに関わらず「ソフトウェア部品」と して共用するためのものですが、まだ開発途上なので、そのソースも 置いています。つまり、道具も一緒に作っていく、という姿勢です。

AKI-H8のC言語プログラムとは、「TST05.C」( リスト3.5 )のようなテキスト ファイルで、これをテキストエディタで作成・編集します。外見はまったく 普通のCプログラムですが、これは、冒頭の「MIDI_IO.H」というオリジナル のインクルードファイルで吸収しているためです。このMIDI_IO.H( リスト3.6 ) を見てみると、CPUのポートなど特殊性を記述した「3048F.H」という、 別のところに置かれた(パスは別に通す)ファイルを参照しています。

そして、このC言語ソースを上書き保存すると、DOS窓から「CC.BAT」を、 拡張子を省略したソースファイル名とともに呼び出します。たとえばソース がTST05.Cであれば、コマンドプロンプトに対して、「>CC TST05」と指定して リターン、です。この「CC.BAT」の中身は リスト3.7 のようなもので、まず ソースを独自の予約名の「SYSTEM.C」にコピーしてから、C言語の開発環境と リンクするためのオリジナルスタートアップルーチン「startup.src」 ( リスト3.8 )をアセンブルします。このモジュールには、まだ開発途上 ですが、筆者のMIDIサービスーチン等も入っています。そして、次に インクルードされた「3048F.H」のパス指定とともにCコンパイラCC38Hを かけて、エラー無しの時にゴーサインをかけるために一旦ポーズします。

その後、今度はオリジナルの「system.sub」( リスト3.9 )を指定 しつつリンカL38Hをかけます。この中では、AKI-H8に付属してきた ライブラリ「ZC38HAB.LIB」を指定しています。細かい処理は、この ブラックボックスの中にあるわけです。この出力は、アセンブラと同じ 「FLASHROM.MOT」というファイルにしてあるので、アセンブラで開発 しても、C言語で開発しても、フラッシュROMの書き込みはまったく同一 方法で行えるようになっています。

そして最後に残ったのが、 リスト3.10 の「3048.INF」というファイル です。これは、フラッシュROMライタのプログラム( 図3.12 )を起動した 最初に指定するもので、これによって、正しいCPU情報が与えられるように なっています。

以上のような開発環境を整備することで、AKI-H8システムはアセンブラ でもC言語でも容易に開発できるようになりました。詳しい設定はちょっと 難しいようですが、本書の付録CDROMに収められた筆者の環境を とりあえずそのまま使うことで、AKI-H8の開発はスタートすることが できます。なお、筆者の場合には、「TOOL」というサブディレクトリに 秋月電子から提供されているサンプルを置いていますが、これをそのまま 本書で紹介するわけにはいきませんので、興味のある読者はAKI-H8開発 キットの付属FDを参照して下さい。

それではここで、筆者が初めてAKI-H8に触れて2週間ほどの間に製作して みた、いくつかのサンプルについて紹介しておきましょう。全て、ソース プログラムを付録CDROMに入れてありますので、読者の皆さんも追体験して 容易に製作することができます。テーマとしては、いずれもサウンド エレクトロニクスに関係の深い「MIDIもの」「センサもの」です。(^_^) これらの処理ルーチンのサンプルは、一種のサービスライブラリと して、色々な応用のための「ソフトウェア部品」として活用できる ものです。

まず、ソフトを走らせるためにはハードが必要です。もっとも最初の AKI-H8製作例では、 図3.16 のように、「ポートB」の全ビットにLEDを 付けて、これをソフトウェアのタイマで点灯表示する、という定番の プログラムを作ってみました。これはプログラム自体というよりも、 上述した開発環境を試作して、プログラミングのサイクル(書いてみて フラッシュROMに焼いてテストラン、という繰り返し)を簡単に回すため のものです。

この回路に対するプログラムは、リスト3.11のようなものです。まず最初に AKI-H8のポートのアドレスを定義し、リセット時のスタートベクトルを 設定し、ループを回す変数を定義します。「start」のところでポートを 初期化して、「loop」のところで無限ループが回っています。このメイン ループでは、変数「counter」をインクリメントしてポートに出力する ことで点灯しますが、毎回「wait_middle」という単なる足踏みサブ ルーチンをコールすることで、人間の目に見えるスピードになります。

とりあえずこれでAKI-H8が「目に見える動作をした」(フラッシュROMの 書き込みまでOK)ということで、次にさっそく筆者はMIDIまわりに 挑戦しました。ハードとしては、 図3.16 と同じLEDの配線はそのまま 動作チェック用に同じにして、さらに 図3.17 のようなMIDI送信回路を 追加しています。

この回路に対するプログラムは、リスト3.12です。追加された部分に 注目すると、まず最初にシリアルポート関係の定義と専用の初期化 ルーチンのコールが加わっています。メインルーチンは「timer_check」 というサブルーチン内でソフトタイマでインターバルを作り、LEDに インクリメント値を表示するとともに、これを「tx_send」という サブルーチンでシリアルポートから送信しています。なお、ここでは MIDI信号と同じスピードやプロトコルですが、MIDIメッセージとしては 意味を持たない、ゼロから255まで単調に増加する数値が出力されます が、最初のテストとしては、このようなデータの方がチェックしやすい のです。

図3.16 図3.17 のハードでリスト3.12のソフトがを走ったところで、 いよいよMIDIらしい処理、「FIFOバッファ」を仕込んでいきます。この 部分については、筆者はすでに「Java & AKI-80」(CQ出版)で詳解して いますので、内容の解説は省略しますから、FIFOバッファについて知らない 方は、あわせて「Java & AKI-80」を並べて読み進めて下さい。 ここではまず、RAMエリアに1024バイトの送信FIFOバッファを定義 して、それぞれ2バイトの「tx_top」「tx_end」というリングバッファ のポインタ変数を用いています。メインループでは、「タイマを呼んで 定期的にデータをインクリメントし、LEDに表示するとともに、MIDI プログラムチェンジのデータとして送信FIFOに積む」というルーチン と、「送信FIFOバッファをチェックして、送るべきデータがあれば MIDI送信する」というルーチンとをコールしつつ無限に回っています。 これだけではメリットがピンときませんが、メインルーチンに他の 仕事が色々と入ってきた時には、このFIFOバッファが強力に機能 してくるのです。

MIDI送信ができたので、次にはMIDI受信ということになります。単なる シリアルポートの扱いで同じようなものだろう、というのはMIDIを 知らない人の甘い考え方で、実はまるで厳しさが違います。MIDIの送信 は、基本的にはシステムの余裕がある時に行えばいい(そのために、 処理ルーチンでは送信FIFOに積む)のですが、MIDI受信というのは、 システムがどのような状態であっても、絶対に1ビットのエラーも なく確実に受信し続けなければならないものです。そこで、初めて ここに「割り込み」が登場します。割り込みルーチン内でMIDIメッセージ の解釈をする余裕はないために、割り込みルーチン内では受信FIFOに 積むだけで、このFIFOの内容を解釈して対応するのはメインルーチン から呼ばれる別のサブルーチンを用いる、という発想なのです。

実際には、 図3.18 のような回路図(LEDは動作確認用の1ビットに しています)によって、「MIDI受信をFIFOに積み、これをメッセージ として解釈して、そのまま同じメッセージとして送信FIFOを経由 してMIDI送信する」というAKI-H8システムを製作してみました。 これは、MIDI部分は 図3.7 と同じもので、AKI-H8でMIDIを実現するため の、筆者にとっての定番回路です。ソフトはリスト3.13のように なりました。追加されている部分はおもにMIDI受信に関するもので、 まずリセットだけでなく、割り込み処理ルーチンのアドレスを テーブルとして定義します。RAMには送信FIFOに加えて、受信FIFO 用に1024バイトのメモリを確保し、ポインタとともに、MIDIメッセージ の解釈用に「rsb」「channel」「dcb」「keyno」などという、業界 標準のような名前の変数も用意します。メインルーチンでは、受信FIFO に積まれたデータがあれば解釈する「rx_midi_check」というルーチン が加わっています。なお、「Java & AKI-80」で詳解していますので、 ここではMIDIデータの解釈処理の詳細については省略します。

MIDI割り込みとともに応用システムによっては重要な機能を担当する 「タイマ割り込み」については、本章の最後にコラムとして、実際に メインルーチンの処理スピードを計測してみた結果を紹介しています ので、そちらを参照してみて下さい。 [→章末コラム:AKI-H8のメインルーチンの処理速度]

●汎用A/D変換器とディジタルオシレータ

以上のように、以前のAKI-80の程度にはなんとかAKI-H8が活用できる 方向性が見えてきましたので、もう少しだけ実用的なシステムの サンプルも紹介しておきましょう。まず、AKI-80の時代には外部に A/DコンバータのICを置いて製作していた、「汎用アナログ−MIDI 変換マシン」です。AKI-H8には8ポートのA/Dコンバータがあります から、外付け部品ナシに実現できることになり、とてもコンパクト になります。回路図は 図3.19 のように、ソフトはリスト3.14のように なります。

システムの仕様としては、0V-5Vのアナログ電圧を同時に8チャンネル、 A/D変換して、MIDIの1-8チャンネルのチャンネルプレッシャーの値として 0-127で送る、というマシンです。電圧に変化が無い、またはごく微小な 値のゆらぎの場合には無視します。結果として、データは2以上の変動が あった時に、各チャンネルを1系統のMIDIにマージして出力されます。 リスト3.14のソースプログラムには、将来的にさらにA/D情報にMIDI入力 をマージするために、MIDI受信ルーチンを消さずに入れて(callする ところだけコメントアウト)あります。なお、このプログラムを焼いた AKI-H8カードは、単体の部品としても活用できるので、フラッシュROM に焼くためのモトローラS形式のファイルも、リスト3.15としてCDROM に入れてあります。これは実験機を量産する場合にも便利です。

もう一つの例は、 図3.13 で紹介した、AKI-H8による「インテリジェント RS232C--MIDIインターフェース」です。「realBASIC」などでお手軽に 開発したMacintoshのアプリが、確実なMIDI送受信を安定に行うように するために製作したもので、006P電池まで内蔵しています。この回路図 は、 図3.20 のようなもので、パソコンからフラッシュROMのプログラミング を行うRS232Cポートを、その後は19200ボーのRS232Cポートとして使用 します。そして、「MIDI受信からRS232Cへ送信」「RS232CからMIDIへ 送信」という相互変換を、それぞれ1024バイトのFIFOバッファで 実現しています。単なるバッファなら電圧変換するだけのもので いい、というのは甘い意見です。このマシンは、MIDIメッセージとして 意味のない情報は、解釈ルーチンで無視して転送しませんし、MIDI ランニングステータスについては補って生成する、というインテリジェント な処理も行っているのです。このソースは、実はリスト3.2そのものであり、 フラッシュROMに焼くためのMOTファイルも、実はリスト3.4そのもの なのです。このシステムも、NiftyServeのMIDIフォーラムで筆者が 議長をしている「音楽情報科学会議室」(FMIDIBGNの19番会議室)の メンバーが実際に製作した実績のあるものです。

さて、それではこのようなトレーニングを受けて、AKI-H8をサウンド エレクトロニクスのエンジンとして利用する、というアプローチに挑戦 してみることにしましょう。ここではまず、AKI-H8に内蔵されている 5チャンネルの16ビットタイマ(ITU)の一つを使って、MIDIで10進表現の 周波数データを与えて発振する、というディジタルオシレータを製作して みましょう。前章で紹介したアナログ方式と違って、水晶振動子の 高精度・高安定度(いわゆる「クウォーツ精度」)の汎用発振器です。

AKI-H8のタイマは、もともとFA機器などの組み込み制御でステッピング モータを複雑に駆動するような応用を考慮しているために、その膨大な 機能を説明したマニュアルの記述も非常に難解です。ここではその中から、 もっとも単純な「トグル動作」(ON/OFFを交互に繰り返す)モードで、 タイマ0を駆動することにします。リスト 3.16 は、タイマ0を初期化して、 クロックとして8MHzを8分周した1MHzを使い、とりあえず初期状態で 500Hzを発振させる部分を抜き出したものです。このような簡単な処理 を稼動させることができればしめたもので、あとは既に出来ているMIDI 受信のモジュールと合体させればいいことになります。この段階で、電源 を入れれば[TIOCB-0]ピン(CN1の11ピン)から、きれいな500Hz基準信号 (0V-5Vの矩形波)が出力されています。

AKI-H8の内蔵CPUには「32ビット÷16ビット除算」という、AKI-80であれば かなり面倒に構成しなければならない演算命令が、最初から用意されています。 そこでここでは、MIDI入力として、

 「発振周波数を10進数として桁別に入力して指定する」
という仕様を設けることにしました。具体的には、一般的なMIDI情報と カチ合わないようにやや特殊なMIDIステータスの「チャンネルアフター タッチ」を用いて、さらにMIDIの14チャンネルを用いています。 CPUの乗算命令だけで処理する関係で、意味のある(演算出力が規定範囲外 で不定とならない、有効範囲内の)出力の上限周波数は約32400Hz、下限 周波数は約16Hzとなりますが、これはサウンドとしては、人間の可聴 帯域を十分に含んで広いものとなっています。そして、アフタータッチの ノートナンバの1から5までをHz単位の数字(0-9)として与えます。 具体的には7ビットデータの下位4ビットを見て、AからFまでの無効な データは強制的にゼロとします。この周波数データを設定して、最後に 「その周波数で発振」というコマンドに相当するものとして、アフター タッチのノートナンバの0(データは何でもよい)を使うことにしました。

なお、この周波数精度は出力周波数が高いほど悪くなります。最高の30KHz あたり(耳には聞こえません(^_^;))で、およそ3%ぐらいです。処理の 仕組みは、内部システムクロックの8MHzを8分周した1MHzに対して、 「整数1000000を入力設定数で割って、余りを切り捨て、その商を、内部 的に1000000を割る分周データとする」という動作になります。この、 余りの切り捨て誤差が周波数の誤差となります。

図3.21 は、この「汎用MIDI制御ディジタルオシレータ」の回路図で、驚く ほどシンプルに構成できます。そしてリスト 3.17 がそのソースプログラム、 リスト3.18 がフラッシュROMに書き込むオブジェクトファイルです。また、 図3.22 は、このオシレータの動作を確認するために、開発時間「約2分」で 完成した、実験MIDIデータ送信用のMAXパッチです(MAXについても、拙著 「Java & AKI-80」で紹介しているので本書では省略)。このパッチ内の5つ の数字ボックスには、10000、1000、100、10、1の位の出力周波数の数字を アップダウンボタンで設定でき、全体のデータが揃ったところで、左下の ボタンをクリックすると、その出力周波数が得られる、という仕組みです。 リスト3.19 は、このMAXパッチを「テキスト形式」でセーブしたもので、 これを電子メイルで送ることで、世界中の仲間とMAXのパッチを交換して 活用することができるのです。

MIDIを送る側にこのような便利な環境があると、出力設定可能範囲を超える データをカットする機能として、わざわざAKI-H8の側にそのチェック処理 を入れることが不要となります。送り手のMAX側に入れる「範囲チェック」 のアルゴリズム(開発期間は数分でしょう)、そしてAKI-H8側でチェック してカットするプログラムについては、興味ある読者の皆さんへの課題と しておくことにします。

図3.23 は、このマシンを使って「30Hzから30000Hzまでの出力をスイープ して出力させる」MAXパッチの例(テキスト形式で リスト3.20 としてCDROM に格納)です。ここでは、200msecごとに30回に分割して、ちょうど周波数 が2倍(オクターブ)ずつ上がるように、指数関数的に等間隔の周波数を 設定しています。

本書の付録CDROMのサウンドトラックのうち、第10トラックのサウンドは、 この 図3.21 の回路に、 図3.23 のMAXパッチから周波数を与えた実験を実際に サンプリングしたものです。録音に使用したシリコングラフィクス社の Indyワークステーションのアナログ入力部分で、可聴帯域を超える20KHz 以上をカットしているので、実際には30KHzあたりは聞こえませんが、 その動作はよく分かります。

なお、ここでは周波数の変更は出力信号と非同期に起きるために、位相に よっては直流成分のノイズが出ていることもわかります。音楽に使える ための「音源」にしていくためには、この部分を解消する必要があります が、この部分も興味ある読者の課題としておきましょう(ヒントとしては、 あくまでAKI-H8のソフトとして解決できることです)。

●AKI-H8版「MIDIオルゴール」

汎用ディジタルオシレータができれば、次にはいよいよ、MIDI音楽演奏 情報を受けてサウンドを生成する、一種のシンセサイザ(オルゴール程度) も欲しくなります。ここでは音色(楽音波形)については簡単なPWM波形に 限定して、ここに「MIDI受信」「音楽的ピッチ生成」「エンベロープ変調」 という3点を結び付けることに重点を置いて製作していきましょう。あくまで、 「外付部品を最小限にして、AKI-H8のソフトウェア処理で実現する」という のが、ここでの目標となります。

筆者は普段はいちいち描くのを省略していますが、今回はシステムの動作を ブロック図として、 図3.24 のように設計してみました。MIDIの受信割り込み から演奏情報(ピッチ)の抽出までは、既に実験しているものです。ここ では、 図3.21 の汎用ディジタルオシレータの場合と違って、「MIDIノート ナンバ」として与えられる、12等分平均率のピッチを生成することが必要 になります。また、単純な矩形波でなく、パルス幅変調による音色変化 を与えてみることにします。また、音量の時間的変化であるエンベロープ については、第2章で実験したアナログ方式のADSRジェネレータでなく、 AKI-H8に内蔵している2チャンネルのD/Aコンバータをそのまま使って、 指数関数的な変化をする「打撃減衰音」エンベロープをソフト的に生成 することにしました。この出力を、AKI-H8の外部のアナログスイッチに よってPWMピッチ波形によってスイッチング変調することで、最終的には たった2音ですが、ポリフォニック(複音)の電子音源(オルゴール程度) を実現することを目指そう、というわけです。

図3.25 は、この「MIDIオルゴール」の全回路図です。AKI-H8以外には、 外付けの74HC4053がたった1個という、超シンプルなものです。ここで、 実際にこのシステムにMIDI演奏情報を送って鳴らせてみた実例として、 本書の付録CDROMのサウンドトラックのうち、第11トラックにある 「サンプルサウンド:figure3.25」というサウンドを聞いてみて 下さい。刻々とPWMの変調幅をスイープさせて音色変化をかけたり、と いう隠し味はありますが、たったこれだけのシステムでこの程度の「楽器」 が実現できてしまう、というのは面白いと思います。

このシステムでは、まず筆者は リスト3.21 のようなCプログラムから作り 始めました。これは、AKI-H8のソフトウェア内で、12等分平均率のピッチ を生成するための「定数テーブル」として置くデータを作るものです。 もちろんこの作業も、PowerBook内に起動したWindows95内で、MSDOS汎用 のCコンパイラで制作しました。このプログラムの実行結果は、 リスト3.22 のようになります。これは順に、MIDIノートナンバ0,1,2,...に対応した、 「システムクロック:2MHzを割ってそのピッチを作る分周データ」という ことになります。実際には、最低音域3オクターブは同じ数値を繰り返す ようになっています。

実際のAKI-H8プログラムは、 リスト3.23 のようになりました。ここでは 仕様として、MIDIの1チャンネルと2チャンネルのそれぞれ1音(最後に 到着した最新イベント)を鳴らします。そして、PWM波形のデューティ比 を、MIDIの1/2チャンネルのプログラムチェンジでゼロから127まで可変 します。さらに、減衰エンベロープのスピードとして、MIDIの3/4 チャンネルのゼロから127までのパラメータとして可変できます。 リスト3.24 は、AKI-H8に書き込むフラッシュROMのデータです。

ここで、本書の付録CDROMのサウンドトラックのうち、第11トラックの サンプルサウンドを録音した条件について少しだけ紹介しておきます。 2音ポリフォニック、という条件から、ピアノの演奏データとして、まず リスト3.25 のようなデータを用意しました。

これは、それぞれのラインにスタートからの絶対時間とMIDIイベントが 記述された「MIDIシーケンスデータ」というわけです。そして、このデータ を、 図3.26 のようなMAXパッチによって呼び出して自動演奏させました。 ただし、 図3.27 のような「trigen」というオリジナルパッチを使って、 刻々とPWM変調のパラメータを時間的に変化させています。よく聞いて みると、ピアノの右手と左手の音色が、それぞれ別々に変化しているのが 判るでしょう。このようなちょっとした味付けで、単調なビープ音で あっても、全体として流れが出てくる場合もあるのです。

●ピッチトラッカー「ききとりくん」

本章では、サウンドエレクトロニクスの製作のコントローラ中枢としての AKI-H8について紹介してきましたが、当初はここまで、次章に進む予定 でした。ところがAKI-H8について実験しているうちに、マニュアルから、 AKI-H8の内蔵タイマには「キャプチャー機能」があることが判明しました。 そうなると、「ピッチを作る」という生成側だけでなく、「ピッチを知る」 という、いわばサウンドエレクトロニクス版の「計測」が簡単に実現できる ことになります。そこで本章の最後として、リアルタイムに音響信号を 入力して、ここから対応したMIDIノートナンバ(鍵盤の番号に対応)を 生成する「ピッチトラッカー」を製作してみました。たとえば、マイクで 歌った声を同時にピアノでなぞらせたり、さらには普通の会話音声も ちゃんと楽器のピッチに変換してくれる、という面白いマシンです。

「MIDIオルゴール」の場合には、入力がすでにMIDIノートナンバという、 離散的な情報だったのですが、ピッチトラッカーの場合には、まず最初に 仕様を検討しておく必要があります。つまり、音響信号としては12等分 平均率のピッチにぴったり合ったものばかりでなく、適当な高さの、 あるいは音痴の(^_^;)ピッチも入力されます。そこで一般のピッチトラッカー では、

  ・それぞれ入力にいちばん近い平均率のピッチに丸める
  ・さらに誤差の部分をMIDIの「ピッチベンド」として送る
という二つのアプローチがあります。しかし、ピッチベンドまで得られた 情報で演奏させると、平均率の枠組みが壊れてしまい、聞いていて気持ち 悪くなることが多いので、ここでは簡略版の「平均率に丸める」という 仕様でいくことにします。それぞれの入力信号は、もっとも近いいずれか の鍵盤に割り当てられる、ということになります。

さて、それでは実際に回路の設計の様子を紹介してみましょう。フルート などの楽器音ではピッチトレースが比較的簡単なのは判っていますので、 筆者はいきなり、対象としては難関の「人間の会話音声」を対象として みました。といっても、ここではMacintoshのspeech機能で英語の詩を 自動読上げさせ、そのピッチをわざと時間的にゆっくりとオクターブ 以上の幅で上下させて、いずれの高さでも、いずれの発音でも追従する ことを目指しました。 図3.28 は、このピッチトラッカーの開発に使用した MAXのパッチです。図の下の方にあるのは、最下段にある「speak」という MAXオブジェクト(ミュージシャンの千野秀一さんが世界に公開している 有名なオリジナル)を利用して、Longfellowという詩人の詩を読み上げた 音声を生成している部分で、PowerBookの音声出力からサウンド信号と して出力されます。「trigen」というサブパッチは 図3.27 で紹介したもの で、ここでは115を中心として36の振幅でスピード100msecごとに上下する 三角波データを、speakオブジェクトのピッチ入力に与えています。 また、このパッチの右側の部分は、製作したピッチトラッカーからの MIDI情報を受けて表示し、ピアノ音のMIDI音源に送っています。

論より証拠、ここで、本書の付録CDROMのサウンドトラックのうち、第12 トラックのサンプルサウンドを聞いてみて下さい。まず、片方チャンネル にMAXのspeechによる詩の朗読(ピッチをわざと上下したもの)が入り、 その反対チャンネルには、このリアルタイムトラッカーによって得られた MIDI情報で鳴らされたピアノの連打音が入っています。両者のピッチが ほぼ会っているのは、このシステムによるトラッキングがリアルタイム に成功している、という事なのです。もちろん、トラッキングのミスに 起因するヘンな音も混ざっていますが、けっこういいセンいっているとも 思います。このような動作を実現するのに必要なのが、AKI-H8とたった 1個のIC、というのは面白いと思います。

それでは、 図3.29 を見てみましょう。これは上記のような「音声」サウンド を実際に計測したもので、上段の波形のように、人間の音声の波形というの は、1周期の中にも多数の倍音成分によって何度も上下しています。 本機のピッチ検出は、基本的に「立ち上がりエッジ」、すなわち信号が 減少から増加に転じたポイントの間隔を計測しますので、これでは使えません。 そこで、 図3.29 の下段のように、周期ごとに必ず一度だけの極値を持つような 波形に変換する必要があります。これは本書で既に述べた「ローパスフィルタ」 そのものの動作です。 図3.30 は同じように、別の会話音声の部分の変化を 見たもので、単語ごとの切れ目でも、図のように、上段の入力に対して 下段のような出力を得る、というのが最初に必要な機能となります。

そして続いて、 図3.31 のように、下段の「丸められた」入力信号を、上段の ような「ディジタル」(2値化された)信号に変換する必要があります。 これには、第2章のエンベロープ生成回路で使った、 図2.37 のコンパレータ 回路が使えます。つまり、OPアンプを単一電源動作させて、その入力と してアナログ信号を与えれば、きれいなディジタル化を実現できます。 図3.32 は同じように、実際に入力された信号(下段:ローパスフィルタで 平滑されている)が、上段のようにディジタル化された様子の計測結果 です。ここでは、下段で無音の部分でも、ノイズ的な変動成分によって、 上段の信号には一瞬、細いパルスとして信号が得られています。ところで、 このような細いパルスは不自然に「高いピッチ」ということになりますから、 このようなデータはAKI-H8のソフトウェアで無視するようにしてやれば、 無音部分は無音、として出力を得ることが可能となります。ハードウェア とソフトウェアの合体によって結果を得る、というマイコン・エレクトロ ニクス技術の真髄、というわけです。(^_^)

さて、このようなサウンド信号の前処理段階のことを「シグナルコンディショ ニング回路」などと呼びますが、本機では 図3.33 のようになりました。 ここでは1パッケージにOPアンプが4個入った「LM324」を単一電源(+5Vと GND)として使用しています。入力から2段のアンプとフィルタについては、 それぞれ使用するサウンドのソースによって、レベルも音質も違います ので、読者の皆さんも適当に調整してみて下さい。極端には、グラフィック イコライザでローパスフィルタをかけられれば、ここはボリューム1個で レベル調整するだけでも済んでしまいます。そして、 図3.33 の下段の最後 のOPアンプが、丸くなった波形をディジタル化しているコンパレータです。 この出力はAKI-H8の「パルス入力」として与えます。また、「無音状態」 を検出するために、このパルスをダイオードで整流/検波して平滑した、 というアナログ信号も生成して、これはAKI-H8のA/D入力に「振幅信号」 として供給します。 図3.34 は、上段にこのパルス信号、下段に整流平滑 された振幅信号の計測結果を表示したものです。平滑回路のコンデンサ と抵抗によって、この滑らかな減少カーブ特性が変化します。AKI-H8の アナログ入力電圧として、たとえば 図3.34 で「2.5V」あたりを判定基準と すれば、入力の無い、という部分をAKI-H8のソフトで検出してカットする ことができます。 図3.35 はもっとピッチの高いところでの計測結果で、 いずれも必要な信号が得られていることが判ります。

図3.36 は、AKI-H8のシステム部分の回路図で、実際のピッチトラッカー では、 図3.33 とこの 図3.36 が合体したものが全体回路図となります。 AKI-H8については、いつものMIDI送信回路があるだけで、あとはタイマ2 の入力としてコンパレータ出力のディジタル信号を、そしてAN0チャンネル のアナログ入力に振幅成分を与えるだけとなります。あとの処理は全て、 AKI-H8内部処理としてソフトウェアで実現するわけです。

さて、音源として離散的なMIDI入力が与えられた場合には、テーブルで 用意したピッチデータを参照してカウンタにセットしておしまいなのです が、「入力信号の立ち上がりエッジの間隔」データ、という入力は非常に 広い範囲のデータなので、ここからMIDIノートナンバを得るというのは、 ちょっとしたパズルとなります。いちいち数値を比較して範囲を絞るのも 美しくないので、筆者は電卓片手に1時間ほど考えて、やはりテーブル参照 によって一発で結果を得る、ということにしました。途中結果は省略します が、結論としては、入力周波数範囲を45Hz-1500Hzと限定した上で、

 ・入力クロックのエッジ間隔を2MHzのカウンタで計測する
 ・そのカウンタ値に4095を乗算する
 ・その結果を43252で除算する
 ・その商は16進で000-FFFになる(4096通り)
 ・この値を、対応したMIDIノートナンバの置かれたデータテーブルから参照する
というアルゴリズムを設計しました。ちょっとマニアックというか、やや 技巧的な手法とも言えますが、興味のある読者はその設計思想を追いかけて みて下さい。

そこでまず、このテーブルを自動生成します。4096個のデータは電卓の計算と 手入力では絶対にミスがあるからです。 リスト3.26 はこのためのCプログラム、 リスト3.27 はその結果をファイル化したものです。そして、これを組み込んだ AKI-H8のソースプログラムは リスト3.28 に、フラッシュROMに焼き込む オブジェクトは リスト3.29 のようになりました。これで完成です。(^_^) 実際には、あまり慣れていないAKI-H8のニーモニックでちょっとしたミスで 1時間ほど悩んだりしましたが、このピッチトラッカーも、設計からハードの ハンダ付け、そしてソフトの開発まで、一日仕事で全部が完成してしまい ました。AKI-H8でなければ実現できないシステムの好例が、また一つ増えた、 ということです。

なお、本書の付録CDROMのサウンドトラックのうち、第13トラックの サンプルサウンドは、本機を開発中に、途中のチェックのために実験した ものです。これは、 図3.34 の下段の、整流平滑された振幅信号をそのまま A/D変換して、これをMIDIノートナンバとして送ってみた、というもの です。入力サウンドのレベルに音高が対応しているわけですが、人間に こんな演奏はちょっとできませんから、それなりの面白さを見出す人も いるかもしれませんね。(^_^;)

[コラム:AKI-H8のメインルーチンの処理速度]

リアルタイム性のあるコンピュータシステムでは、並列処理するそれぞれ のルーチンをどう構成するか、という色々なテクニックがあります。本書 で筆者がAKI-H8のソフトウェアで行っている方法は、OSやリアルタイムモニタ のカーネルを正直に構築するのでなく、スピード的に要求の高いものに ついては割り込みを使用して漏れの無い対応を保証し、全体としてはメイン ルーチンが回るたびに、「暇を見て実行していく」というスタイルです。 そこで、ある程度はCPUの処理能力に余裕があって、たいていの時はCPUが 暇にしている、という状態であることを暗黙に要請しています。そこで、 ここでは実際にサンプルプログラムによって、AKI-H8のメインルーチンの 処理速度を調べておくことにしましょう。

まず、回路図としては 図3.18 のものをそのまま使用します。LEDがもっと多い と、色々なメッセージを表示できて便利ですが、本質的にはたった1個の LEDの点滅があれば、動作速度は把握できます。基本的には、MIDI受信割り 込み、メインルーチン中でのこの受信データの解釈、もっともシンプルに その結果をMIDI送信FIFOに積む(スルー動作)、メインルーチン中での このチェックとMIDI送信、というのは最低限の要素となります。ここでは さらに、「25μ秒ごと」とかなり高速なタイマ割り込みも実行して、その 割り込みがあった時には「NOP100発」(200ステート)というダミーの処理 ルーチンをコールすることにしました。このように全体のメインルーチンを 回すことにして、とりあえず「メインルーチンを50000回通ったらLEDの状態 を反転する」(1回の点滅でメイン100000周)というようにしてみたのが、 リスト3.30 のプログラムです。フラッシュROM用のテキスト形式のオブジェクト ファイルは リスト3.31 です。

その結果ですが、10回のLED点滅時間は、およそ30秒となりました。 つまり、メインルーチンの周期は15μ秒ほどになり、これはちょっと 筆者も驚くような成績となりました。しかし、色々と試して慎重に テストしてみたのですが、どうも間違いではなさそうです。 図3.37 の ようなMAXパッチを作って、同時にMIDIの4チャンネルの連続するON-OFF イベント(合計4*3*2=24バイト)を、25mesc-10msecのインターバルで送って みたのですが、ストップウォッチによる計測結果では、ほとんどMIDI受信 のトラフィックは影響されませんでした。(MIDI無しで平均28.9秒、 10msecでも平均31.04秒)

かなり厳しい条件として設定したつもりの「25μsecごとにNOPを100発」 という割り込み処理をこうも軽々と処理してしまうとなると、AKI-H8は そのまま、ある程度のソフトシンセを実現できるぐらいのパワーの可能性 を持つことになります。考えてみれば、カードサイズのマイコンボード ですが、昔の16ビットパソコン(初代PC9801など)に比べたら、桁違い の処理能力を持っているのですから、ある意味では当然かもしれません。 この結果は、本書のこれ以降の章で、フルに活用していくことになります。


トップに戻る