「PCM2BRZ」                               #250  保田周作 ///プログラム///  SーOS上で動作するBREEZEのためのデータコンバータです。いくつかの形式のPCMデータ から、BREEZE形式のデータを作ります。  先頭アドレスは$3000で、このプログラムの終了アドレスの次のアドレスから(#MEMAX) が示すアドレスの前のアドレスまでのフリーエリアをワークエリアとして使用します。 コンバートするデータのサイズが小さくてもワークエリアの前のほうだけでなく後ろの ほうも破壊されますので、このプログラムを実行するとフリーエルアの内容が全体にわ たって破壊されるものと思って使ってください。 ///使い方///  まず元データをなんとかしてS-OS上に持ってきてください。つまりBREEZE形式に変換 したいなんらかのデータをS-OSのファイルとして用意してください。たとえば、X68Kの ADPCMデータならKAME-DOSが使えます。  用意ができたらさっそくこのプログラムを実行します。変換に必要なファイル名やパ ラメータなどは対話形式で入力していきますので、 #J 3000[RET] あるいはRUN&SUBMIT拡張がなされておれば # PCM2BRZ.BIN[RET] でよくて、パラメータなどを渡す必要はありません。  立ち上がると簡単なクレジットと(#MEMAX)の値が表示され、元データのファイル名を 聞いてきます。ここで、ファイル名を Input.>B:GYAO.PCM[RET] などと打ち込んでください。デバイス名を省略すると立ち上げ時のデフォルトデバイス を読みにいきます。さらに、 Input.>B:[RET] とデバイス名だけ打ち込む(要コロン)と、そのデバイスのディレクトリが表示されま すので必要なファイル名の上で[RET]してください。ファイル名がスクロールアウトして しまった場合などは[SHIFT+BRKEY]でファイル名の入力へと戻れます。以下、入力待ち状 態での[SHIFT+BRKEY]によって常にひとつ前の入力待ちへと戻れます。ただし、元データ のファイル名の入力のこのときだけ、プログラムの終了を指示したことになります。  次は元データの形式を指定します。現在対応している形式は以下の5種類です。番号の キーを押してください。[RET]は不要です。 0)X68KのADPCMデータ。4ビットADPCM。 1)16ビット符号付きPCMデータ。(-32768から+32767) 2)16ビット無符号PCMデータ。(0から65535) 3)8ビット符号付きPCMデータ。(-128から+127) 4)FMーTOWNSのSND形式データ。符号付き絶対値。 16ビットデータは、上位、下位の順に並んだデータです。  3番目はBREEZE形式のデータのヘッダに必要なサウンドネームです。これはプログラム が自動的に元データのファイルネームの先頭8文字を切り出してくれます。そのままでよ ければ[RET]のみでOKです。このサウンドネームはこれがないと困るというものではない ので適当に決めてください。  4番目と5番目は元データと作るデータのサンプリング周波数です。元データのサンプ リング周波数はどうにかして調べておいてください。先に使用可能なフリーエリアと元 データのサイズが表示されますので、これらを参考にして作るデータのサンプリング周 波数を決めてください。元データがADPCMの場合、作るデータのサイズは元データの2倍 になります。したがって、フリーエリアいっぱいのaDPCMデータを同じサンプリング周波 数で変換するようなことはできません。  6番目は音量レベルの変換比率です。このプログラムでは元データが8ビットPCMの時を 除いて内部では16ビットで処理しています。これを8ビットにおさめるのにこの音量レベ ルの変換比率で16ビットデータを除算するアルゴリズムを採用しています。したがって この値を大きくすればできあがるデータの音量(ダイナミックレンジ)は小 さくなります。逆に、小さくすれば音量は大きくなりますが、8ビットの範囲に収まらな いものはクリッピングされます。  7番目は簡易スムージング処理の有無の指定です。この簡易スムージングは作るデータ のサンプリング周波数が、元データのサンプリング周波数よりも小さい時(ダウンサン プリング)の音質の悪化を軽減するために設けられた処理です。そのため、作るデータ のサンプリング周波数が元データのサンプリング周波数と同じか、より大きい時は動作 しません。しかし、常に有無を尋ねてきますので、Y/Nキーを押してください。[RET]は 不要です。また、Y/Nは[SPC]/[RET]で代用できます。ここでも[SHIFT+BRKEY]は有効で す。  以上のパラメータの入力を終えるとプログラムはデータコンバートを始めます。デー タコンバートをしている間はキー入力を受け付けませんので気長に待ってください。待 たされる時間は元データの大きさでほぼ決まります。さらに元データの形式にもよりま す。ADPCMデータからの変換が一番時間がかかります。データコンバートが終わると処理 したデータのサイズ(バイト)が表示されます。あと、クリッピングされたデータの数 も表示されます。データコンバートをしている途中でメモリ不足を起こすとそこでデー タの処理を打ち切って処理し切れなかったデータのサイズ(バイト)も表示されます。 もうひとつ表示されるのはできあがったデータをファイル化する時のアドレス情報です。 先頭アドレスを$3000としています。 実行アドレスについては表示されませんがS-OSのホットスタートのアドレス($1FFA)とし ています。メモリ不足の場合はデータを再ロードして三番目のパラメータのサウンドネ ームの入力へと戻ります。  このあと再コンバートするかどうか聞いてきますので、これらの情報から判断してく ださい。Yesと答えるとメモリ不足の時と同様にデータを再ロードしてサウンドネームの 入力へ戻ります。  最後にできあがったBREEZE形式のデータをファイルにセーブするかどうかを聞いてき ます。Noと答えるとこのデータの処理については終了とみなされて、いちばん始めの元 データのファイル名の入力へと戻ります。Yesならばファイル名を聞いてきます。デフォ ルトでは元データのファイル名の拡張子を「.BRZ」としたものとなっています。そのま までよければ[RET]のみでよいです。ここで入力されたファイル名と同じファイル名のフ ァイルが存在した場合、いまセーブしようとしているファイルのファイル名を変えるか どうか聞いてきます。変えない場合は[RET]のみでよいです。その他のキーを押した場合 はもう一度セーブするデータのファイル名の入力へと戻ります。  あとは元データのファイル名入力時にプログラムの終了を指示するまで同じことの繰 り返しです。 ///パラメータについて///  サンプリング周波数は0から32767の範囲で指定してください。オーバサンプリングに も対応してはいますが、同じデータを繰り返して並べるだけですので、BREEZEにおいて PWM法を用いている機種の場合多少の音質の改善に役立つ程度のものだと思います。  元データのサンプリング周波数はデフォルトでは15.6kHzとなっています。これは多く のX68kのADPCMデータのサンプリング周波数にあわせました。いちど入力された値は新た なデフォルトとして登録されますので、その状態で、このプログラムをセーブし直せば その値がデフォルトとなります。これは他のパラメータでも同じです。デフォルトの値 は、データのコンバート作業を繰り返しおこなう場合などにうっとおしいパラメータ入 力を[RET]をポンポン押して進めるために用意しました。  BREEZEの優れた点のひとつとして、再生周波数を自由自在に変えることができるとい うのがあると思われます。考えてみると、PCMデータは元の音の質で再生される音の品質 が左右される面があると思われます。つまり、いくらサンプリング周波数を高く取って もイマイチな音だったり、低い周波数でも聞ける音だったりすると思われます。S-OSマ シンはみな狭いメモリでやりくりせねばなりませんが、BREEZEであれば確保できるメモ リのサイズとサンプリング周波数の妥協点の自由度が高くなります。このプログラムが そのような時の助けとなれば幸いです。  音量レベルの変換比率は、0から255の範囲で入力してください。デフォルトは3にして あります。 ///技術解説///  これといって複雑なことはしていません。ADPCMからPCMへの変換は、参考文献のアル ゴリズムを利用しています。このアルゴリズムではゼロの値の位置($80とします。)がす こしずつずれていってしまいます。気にいらなければ、どこかで16ビットPCMに変換して からデータを持ってくるようにしてください。  本家「PCM8」ではADPCMからPCMへの変換にテーブルを用いているそうですが、これは うまく使えば使えます。1バイトのADPCMデータを直接16ビットPCMデータに変換してしま うテーブルは巨大すぎて困りますが4ビットからのテーブルなら3Kバイトほどになりま す。さらに工夫(ヒミツ)して処理をはしょればある程度のサンプリング周波数でリア ルタイムの再生が可能なはずです。ちなみにできるだけフリーエリア3を大きく取れる ように、このプログラムではその変換テーブルは採用していません。それでも努力が足 りず3Kバイトを越えてしまいました。  データを変換している時、元データと作るデータがフリーエリアに同居します。これ は以前に筑紫高広さんが某サークルの会報にて述べられていた省メモリバッファのスケ ールダウン版です。 ///最後に///  理想としてはS-OS上で直接PCMデータを取り込めればよいのでしょう。しかし、S-OSユ ーザの多くがX68Kユーザでもあるでしょうし、そうでなくても類はともを呼んでまわり にはひとりやふたりX68Kユーザがいるでしょう。  それでは各機種用BREEZEと共にこのプログラムが活用されることを期待しつつ失礼し ます。 ///参考文献///  Oh!X 1990年6月号「PCM8」 江藤啓