警告:本文中に 平松明夫氏の名前が何度かでてきますが、平松氏は今後+PCMのサポートを一切行わず、また平松氏に+PCMに関する質問はしないようにとのことです。平松氏とフロントラインとの間にトラブルがあったようで、今後+PCMを購入しても技術的サポートはまったく受けられない可能性があります。(1999/10/27追記)
フロントライン製作・販売/1999年8月〜/梅セット3000円より。スピーカ、アダプタなどを添付したセットも有。
先のMSX電遊ランド(1999年8月21日、22日)にて実質初公開となり、MSX用PCMハードとしては久々の新顔ということになった+PCM。turboRのそれと違って発声時にMSXが装置につきっきりでなくてもよい、という面白そうなうわさが流れてくるものの肝腎の仕様がいつまで経ってもフロントラインさんの頁には掲示されない。なんでも電遊の後始末と次の MSX WORLD Expo'99 の準備に追われ、自分の同人としての活動がままならない、という有り様らしいのだ。
んで。わたしの場合、9月17日に申し込んで、到着したのがつい先日の10月16日。何でもテクニカルパンフレット(13頁構成の技術資料)の印刷が遅れたとか。同人には珍しい?後払い(希望により着払いでも可)通信販売の形をとっており、お金を払って待ちぼうけという不安はない。が、納入時期の予定もわからずに一ヶ月も待つのはやっぱりちょっとアレだ、と思うがどうか。
それはともかく、現物がすでに私の手元にあるわけで、んでもってテクニカルパンフレットの末尾に書いてあることには「本書の著作は A.Hiramatsu 氏が所有しておりますが、いかなる方法においても無断で複写、複製することは了承されております」とのことなので、そこから適当にご紹介。
メインユニット | SCENIX社製SX18AC/DP(50MHz) |
---|---|
入力データ形式 | 4ビットADPCM(SX-ADPCM方式) |
出力精度 | 7ビット |
再生レート | モノラル6kHz,7.68kHz,9.6kHz,12kHz |
モード | シングルモード、ミックスモード(6kHzのみ) |
バッファ容量 | 4ビット×224個 |
電源定格 | 9V 250mA〜300mA |
スピーカ、イヤホン出力 | 8Ω、耐久入力2W以上推奨 |
パンフレットの最初にでている表はここにあげたとおり。表の外のところに書いてあって気になりそうなところを並べておくとこんな感じか。
ステレオの出力ができないのは表のとおり。シングルモードは4種の周波数をとれるが、ミックスモードは6kHzのみ。ミックスモードというのはシングルモード6kHzのデータ2系統を平行に(1単位ずつ交互に)与えるとそれを+PCM側で合成出力してくれるというもの。合成比率は8段階で指定可能。
+PCMに送信するデータはテクニカルパンフレットに記述されているデータ変換を行わなくてはなりません。やってみたところ少々面倒ですが難しいわけではないです。このデータ変換により、turboRの圧縮無しPCMデータが真正直に半分のサイズになります。基本的に不可逆圧縮なので、データの劣化がどれくらいか気になるところですが、こればっかりは自分で確認してもらうしかないかな。私の第一印象では「録音設備を気にした方がいい」ような気がします。
参考までに+PCM用データ→turboR用データの逆変換はどうかというとこちらは順変換より手順が少し減って楽になります。+PCMがない場合にリアルタイムで逆変換して・・・ということも考えられなくはないです。リアルタイムはturboRでないと無理か。
セット名 | 付属品 |
---|---|
松改 | ACアダプター、スピーカ、モノラルミニジャック |
松 | ACアダプター、スピーカ |
竹 | ACアダプター、モノラルミニジャック |
梅 | モノラルミニジャック |
表には書かれてないですが、センターがマイナスで、9Vで250mA以上の出力をするアダプタがあればOK、ということらしいです。電圧(9V)は同じでなくてはならないけど電流(250mA)はこれ以上を満たしていればいいと。ここらへんの話は自信がないので心配な人はアダプタの付いている「梅セット以外」を買いなさい(おいおい
スピーカとしてはどうなのか知りませんが(梅セットだし)、イヤホンとしては結構大きい出力をしてくれるみたいです。初めて使うときはいったんツマミをカチッと音がする所まで回して(これがOFFになるようです)そこから少しずつ音量を上げて調べていくというオーディオの基本手順をちゃんと踏みましょう。いやマジで。
表の中に大事なことが書かれてないような気がしますけど(^^;
+PCMはプリンタポートを介してデータを送信します。送信間隔は+PCMリセット指定時100ミリ秒、モード切替時3μ秒、シングルモード時2μ秒、ミックスモード時2.5μ秒ということになっています。従って、リセット時の100ミリ秒以外は基本的にウエイト処理なしでデータ流しっぱなしでOKのはずです。
といいますのは、z80Aが4MHzで動いていたとしても最短のI/Oアクセス命令である IN A,(port) / OUT (port),A で3μ秒かかってしまいますし、turboRのR800モードの時はプリンタポートのアクセスに対して 4.48μ秒以内の連続アクセスがあるとシステムがウエイトをかけてしまうからです。
将来のMSX規格(?)、あるいはすでにある通常のz80Aとは違うモードで動作する機種のことを考慮する場合は話が変わってきますので念のため。
ディスクの中身をみると一行のテキストファイルが3つだけあってなんじゃこれは?ということになってしまいますが、これはM改さんの PLESURE HEARTSの体験版。市販ソフトよろしくディスクを入れてリセット、で起動するものなので不良ディスクと勘違いしないように(しないか)
もっとも、MSX World Expo'99 では同ソフト完成版が販売されることになってるのでその際付属ディスクの中身はどうなるのかは不明。
必要な情報はすべてテクニカルパンフレットの中に書いてあるので、あとはマシン語プログラミングをできるだけの資料とソフトと実力があれば問題なく扱うことができます。現時点では付属ソフトの中に録音ツールとかデータコンバートツールとか実際に再生のテストを行うソフトとかがないのが困り者ですが、その辺は今後の動きを見守ることにいたしましょう。私?とりあえず turboR のデータを変換してその場で鳴らすサンプル組んだだけです。ハイ。
ここでは現実にプログラムを組んだ場合どんなふうになるかをちょいと考察しておきます。
モード | 1/60秒あたりのデータ数 | 1秒あたりのバイト数 |
---|---|---|
シングル12kHz | 200個(100バイト) | 6000バイト |
シングル9.6kHz | 160個(80バイト) | 4800バイト |
シングル7.68kHz | 128個(64バイト) | 3840バイト |
シングル6kHz | 100個(50バイト) | 3000バイト |
ミックス6kHz | 200個(100バイト) | 3000バイト×2セット |
表でご覧いただいているとおりなんですけど、実際に効果音として使う場合は大半が1秒未満、いくつかが1秒を超えるといった状態になるでしょうか?言葉をしゃべらせるともっと長い(サイズの大きい)データになるでしょう。
+PCM用に変換されたデータは1個あたり4ビットなのですが、実はこのうち「8」だけは現れてきません(-7〜+7の変位データなので-8相当のデータが現れない)。これを上手く使ってデータをリアルタイム復元可能な程度に圧縮できればもう少し能率のいい数字が出ると思います。これは結構可能性を秘めてるといっていいかも。第一印象的私見として。
メインメモリ、あるいはメモリマッパ対応RAMにデータが置いてある場合は話が簡単です。単純にタイマ割り込みで上記の表のバイト数だけ転送すればいいのです。バッファサイズ(最初に挙げた表にあります)が224個とのことなので、シングル6kHzの時以外は2/60秒分のデータを送ったりすると正常に再生されなくなるので念のため。
ちょっと話がややこしくなるのがVRAMにデータを置いているときですね。
MSXでは基本的に割り込み期間中のVRAMアクセスはない、という設計になっています。BIOSのVRAMアクセスルーチンなんかはそれを前提として組まれていますので、割り込み処理内でVRAMを読み書きした時点で割り込みルーチン側はいいのですがメインルーチン側がめちゃくちゃになってしまいます。
いくつか対処法がなくもないのでそれを書いておきましょう。
つまり、VRAMアクセスルーチンは自前のものを使い、その自前のルーチンではVRAM読み書きアドレス設定からデータの入出力が完了するまで割り込みを許可しないようにつくればとりあえず誤動作は起きません。ただ、常時大量にVRAMへ読み書きする場合、割り込み禁止期間が長くなりすぎては元も子もないのでそこをどうするかが問題となります。一定量ごとに割り込み許可して次の読み書きではもちろんアドレス設定からやりなおすとか。
VDPコマンド自体はVRAMの直接読み書き処理とはまるっきり別系統で行われるので、メイン側ではVDPコマンドでしかVRAMアクセスしないような作りになっていれば、割り込み側でVRAM直接読み書きを行っても何ら差し支えないわけです。もちろんこの場合でもBIOSは使わない方がいいでしょうけど。
これが一番現実的で、なおかつ若干面倒な方法といえるでしょう。メイン側の監視部は割り込み処理の出力状況に合わせてVRAMからバッファに書き込んでおくので、1/60秒以内に1度は呼び出されるような構造にするか、バッファを大きくとっておいてバッファ切れが起こらない内に監視部が呼び出されるようにする必要があります。そのバッファの大きさというのは、当然先の表の真ん中の列(「1/60秒あたりのデータ数」のバイト数)をもとに決めることになります。
タイマ割り込みの処理を行う際に、以下のような点に注意してプログラムを組めば大丈夫のはずです。
これはおまけ。一応確認のため。+PCMがない場合は内蔵音源で効果音が鳴るのですが、+PCMがある場合でも内蔵音源による効果音を使ったり、両方を同時に使ったりしていることがあるようです。
これもおまけ。スピーカをいくつも並べることに制約や苦痛を感じない人は無視してOK。
+PCMの出力が結構大きいというのは最初に書きましたが、このために内蔵音源の音と単純なケーブルで合成しようとすると+PCM側の音しか聞こえなくなる現象が発生するようです。で、この場合、+PCM側のGNDではないほうに1kΩの抵抗を挟んでおくと、いいあんばいになります。このあたりも根拠があるともないとも言い難い程度の信憑性なのでその筋に詳しい方だれか教えて下さい(^^;
もうどうでもいいお話。
長めのコードがアンテナの代わりになってどこぞの音声が入ってしまってます。向きを変えたりすることであっさり解決するようですが、こだわる方は遮蔽でもなんでもやってみてください。
まずいところがあったら速やかに報告されたし>特にフロントライン各位
なお、この記事は+PCMの製品に含まれるテクニカルパンフレットをもとに私(鈴見咲君高)が独自に書いたものであり、基本的にフロントラインさんが直接関与するものではありません。同時に私とフロントラインさんとは客と売り主との関係でしかなく、当然+PCMのサポートは私には関係のないことですので念のため。