HALCA のチャイム

2002-05-26

MIDI再生のトラブル…!?

ペルソナ HALCA では、時報やタイマ到達時にチャイムを鳴らすようになっている。 音が出れば、他の作業をしていても(例:寝ていても)気付くだろうという、安易な発想。 実に有りがちではある。 チャイムの実体は BeingMidiStdio++1 というツールで作成した MIDI ファイル。

Windows95 はどうだったか忘れたが、Windows98 以降であれば Windows が標準でソフトシンセサイザを持っている。 当時の雑誌情報によると、どうやら Roland の音源を機能制限したものらしい。 とすると、GS? 因みに開発環境では、YAMAHA の S-YXG50 というソフトシンセを使っている。 こちらは XG音源だから、他のシンセを使っている人には、別の音で聞こえていたかも。 あまり気にしていないが。

ところが最近、音の出が遅くなってきた。 ひどい時には、時報のフキダシを表示してから1分くらい待ってから音が出る。 これと言って別のソフトと競合している風でもないのだが…。 同じ ZMemo で動いている他のマスコットや PersonaWare 上で動いているペルソナは、遅れずに発音している。 おかげで、何を言っているのかよく判らなかったりするが。(^^;

ともかく、遅れているのは HALCA だけなのだ。
で、MIDI を使ってるのが理由なのか〜? とか疑り始めてみる。

MIDI→WAVEの変換

MIDI じゃないとすれば、何らかの形式の波形ファイルになろう。 最近は MP32 なんかが流行っているが、Windows環境に限るならば WMA3 でも大丈夫かも知れない。 わざわざ CODEC を用意しなくてもいいという点で。

だが、もっと簡単なのは リニアPCM ではないか。 Windowsの音(ding.wav など)はこのリニアPCM なので、音が出せる Windows 環境であれば必ず鳴る。 と、期待できる。 少なくとも MIDI よりは有望だ。 ペルソナの動作環境なんて Windows環境に限られるんだから、これで問題なかろう。

さて、問題は、いかにして MIDI ファイルから WAVE ファイルを作るか、である。

ソフトシンセで作る

一番簡単なのは、ソフトシンセが WAVE を吐き出してくれる事だ。

しかし、S-YXG50 (のプレーヤ)には、そう言った機能を思わせるメニューは見当たらない。 そう言えば WinGroove4 にはそんな機能があったな。 と思ってやってみると、確かに WAVE ファイルが出来る。 でも音が違う〜。 別のシンセサイザなんだから、違って当たり前だが。 上では「気にしていない」とか書いたが、やっぱりちょっと気になるかも。 あと、最後の残響のところがブツ切れなんですけど…。

キャプチャして作る

となると、次は S-YXG50 に発音させて、それをキャプチャして WAVE に落すか。

世の中にはそう言うツールも存在していて、Total Recorder5 と言うのがあるのを以前に知った。 PCのツールが出す音は何でもキャプチャできるので、圧縮オーディオの音質を調べたりするのに使えるようだ。 だけど、海外のシェアウェア。 これだけの為に投資するには、勇気が足りない。

日本のフリーソフトで便利なのはないのか? と思って探していたら、AudioEncorder6 という物に出逢う。 キャッチフレーズは "Midi・MP3・WAV・Monkey'sAudio を WAV・WMA・Monkey'sAudio・Mp3にエンコード/デコード" である。 頼もしい。 MIDI はアナログ録音すると言うから、アナログのサウンドカードが必要かも。 "キャプチャ"とは少し意味が違うかも知れないが、問題なし。

だが、非常に残念な事に、うまく行かなかった。 WAVE ファイルは作成されるのだが、ファイルサイズは 44Byte。 Windows MediaPlayer で再生すると「ファイル形式が無効です」と怒られる。 どんな MIDI ファイルでも、同じ 44Byte の WAVE ファイルが作られるようだ。 なぜ?

CD-RWにデジタル録音

仕方ないので、外部機器を使う事にする。

幸い、開発用PCには Canopus MD-Port という USBオーディオデバイス製品が繋がっている。 現在は MD-Port XP と言う3代目になっているが、自分が使っているのは初代の MD-Port。 これ、MiniDisc との連携を謳うだけあってサンプリング周波数は 44.1KHz に限られるが、アナログI/O に加え、光デジタルのI/O ができるのだ。 このデジタル出力を CD-Rデッキで録音してみよう。

CD-Rデッキに光デジタル入力を接続し、イザ録音! だが、どうやら MD-Port、再生していない間はデジタル出力していないらしく、デッキ側は "D-IN UNLOCK!" となる。 再生が始まれば UNLOCK が解除される(LOCKする?)が、頭の部分は切れてしまう。 と言うか、非常に短い MIDI なので、その頃には再生が終っている。 録音できないじゃんよ!

CD-RWにアナログ録音

さて、困った。 無音の WAVE ファイルを作って、バックで無音を再生しながら件の MIDI を再生しようか? などと思ったが、素直にアナログ入力で行く事にした。 HALCA に WAVE を搭載した場合、MIDI と違って音量の調節ができない。 これは WAVE で加工しようと思っていたけど、録音レベルでやっちゃえと。

こうして、無事 CD-RW に録音できた。 お次はファイナライズして PCでリッピング。 あとは、余分な所を WAVEエディタで切り取れば、所望の WAVEファイルが出来るという寸法だ。 ずいぶん遠回りした様な気がするなぁ。 しかもおもしろい結論じゃないし。

減質

こうしてできた WAVEファイルだが、たった 6.2秒なのに 1,093,726Byteもある。 (LHaなどで)圧縮すれば小さくはなるだろうが、ペルソナの「更新」でダウンロードする場合は虚しい事になりそう。 ファイルをバイナリダンプして見ると、チャネル数=2,サンプリング周波数=44.1KHz,量子化=16bit となっている。 CD音質なんだから、デカくて当然だな。 この場合、不必要に高音質と言えよう。

小さくするアプローチとしては (1)圧縮する,(2)減質する の2通りが考えられるが、既にリニアPCMを使おうと決めているので、(1)はあり得ない。 ここは減質で行くしかない。 とりあえず何も考えず全部のパラメータを半分にすれば、概ね半分の半分の半分で 137KB くらいになるだろう。

ちなみに他のペルソナはどーなってるのかな? と思って調べてみると…、なんかバラバラですな。 んじゃ代表(←何の?)って事で LF-HPX-01 "春菜" を調べてみると 22KHz/16bit/モノラル の様子。 Windows のは色々。 適当にサイズと音質のバランスを見ながら…ですかな。

減質には WEP7 と言うツールを使用。 先の3つのパラメータを自由に設定できるので、適当に試した結果、22KHz/8bit/モノラル でOKと言う結論に。 だいぶ質が落ちているのだが、元々音質どうこうと言う物でもないのでOK。

あとは音量の異なる WAVEファイルを作って、それらを選べるように仕込んででき上がり。 HALCA v0.26 から、WAVE 方式に移行。 初めに書いた「音の出が遅れる」問題は、解決したかな?

WAVEファイルのヘッダを覗いてみる

WAVEのフォーマット

減質の過程で、サンプリング周波数や量子化bit数などの情報を参照する必要があった。 さらっと WAVEファイルをバイナリダンプして参照云々 なんて書いてるけど、どの辺を見ていたのか? というお話を少し。 と言うか、自分用のメモ。

例によってネットの情報によると。
WAVEファイルのフォーマットは、次のようになってるようだ。

項目 Byte数 内容 備考
RIFFヘッダ 4 'RIFF'  
4 size ファイルByte数からRIFFヘッダ(8Byte)を引いたByte数
WAVEヘッダ 4 'WAVE'  
[fmt ]チャンク 4 'fmt '  
4 size 続く[fmt ]チャンクのサイズ [Byte]
2 フォーマットID 0001h=リニアPCM 他は割愛
2 チャネル数 1=MONO/2=STEREO
4 サンプリング周波数 CDの場合は 44100[Hz]
4 平均データレート 秒間のデータ量 [Byte/s]
2 ブロックサイズ 波形データの「ひと塊」のサイズ [Byte]
2 1サンプル当りのbit数 チャネル毎の量子化bit数 [bit/Sample]
[data]チャンク 4 'data'  
4 size 続く[data]チャンクのサイズ [Byte]
  波形データ 量子化 8bitの時は符号ナシ整数
量子化16bitの時は符号付き整数
byte order はリトルエンディアン
STEREOの時は 左ch→右ch の順に記録

[fmt ]チャンクは、後ろに「ヘッダ拡張部」を拡張できるが、リニアPCM では不要とのこと。 また、[fmt ]チャンク,[data]チャンクの他に、全サンプル数を格納する [fact]チャンク と言うのが有るようだが、リニアPCM の場合は不要。 不要なものは全部省略しているので、「これがWAVEファイルのフォーマットだ」などと勘違いしないように。(^^;

byte order を補足しておくと、これは、複数Byteのデータをどんな順番で格納するか、と言うこと。 4Byte (double word) のデータ 12345678h を、12→34→56→78 の順に格納するのが「ビッグエンディアン」。 逆に 78→56→34→12 の順に格納するのが「リトルエンディアン」。

この「ビッグエンディアン」/「リトルエンディアン」と言う呼び方、「ガリバー旅行記」に登場する小人国 Lilliput(リリパット)と Blefuscu(ブレフスキュ)に由来するそうな。 卵の尖った(小さい)方から割るか、丸い(大きい)方から割るかを巡って戦争をしていたアレですな。 えー、Lilliput が尖った方だっけか?

閑話休題。
Windowsでは、次のフォーマットID が標準サポートだそうで。

さっぱり分からん。 聞いたこともない名前ばかりで、想像もつかないや。 WAVEファイルも、奥が深いようですな。 素人的には、同じ拡張子で中身が違っても大丈夫なんデスカ? みたいな感じだが。 あまり困った経験もないから、たぶん大丈夫なんだろう。

例えば pinpon1.wav

ともあれ、これで欲しい情報は得られるようになる。
例えば HALCA で使っている pinpon1.wav を16進ダンプすると:

これを上のフォーマットに倣って読むと:

+0000:  52 49 46 46 : 'RIFF'
+0004:  A3 BD 00 00 : RIFFサイズ             0000BDA3h = 48547
+0008:  57 41 56 45 : 'WAVE'
+000C:  66 6D 74 20 : 'fmt '
+0010:  10 00 00 00 : fmtチャンクサイズ      00000010h = 16
+0014:  01 00       : フォーマットID             0001h = 1 (リニアPCM)
+0016:  01 00       : チャネル数                 0001h = 1
+0018:  22 56 00 00 : サンプリング周波数     00005622h = 22050 Hz
+001C:  22 56 00 00 : 平均データ速度         00005622h = 22050 Byte/s
+0020:  01 00       : ブロックサイズ             0001h = 1 Byte
+0022:  08 00       : 1サンプル当たりのビット数 0008h = 8 bit
+0024:  64 61 74 61 : 'data'
+0028:  7F BD 00 00 : dataチャンクサイズ     0000BD7Fh = 48511 Byte

こんな感じだった。
モノラル/22KHz/8bit になっているのが確認できる。 データが 48511Byte でデータレートが 22050 Byte/s だから、演奏時間は 約2.2秒って事もわかる。

ちなみに、Windows MediaPlayer でも参照できる事に気付いたのは、事が済んでから。 WAVEファイルを開いて、[ファイル]→[プロパティ]→[詳細設定]タブ→[プロパティ]→[オーディオ レンダラ]タブ で見られるようだ。 なんでこんな奥、しかも判りづらい表現で?と思うのだが…。

あと、愛用の KbMedia Player でもしっかり表示されていた。
早く気付けよって感じですな。

  1. BeingMidiStdio++
    藤元直哉氏による MIDIシーケンサ。 オタマジャクシじゃなくて、ドレミを oqstvxza… と表現する。 公開されているデータを聞くと、ソフトのポテンシャルはありそうなんだけど。 現在は MIDIFlick に進化している模様。

  2. MP3
    MPEG Audio Layer-3。 でも MPEG-1 Audo Layer-3 だと書いている所も。 名前からすると、デジタル動画の音響担当を目的とした方式…なのかな? てっきり音楽用だと思ってた。f(^^;

  3. WMA
    Windows Media Audio。 Microsoft が開発・提供するストリーミング技術(Windows Media Technologies)に対応した音声データの方式。 最近は音声圧縮技術の意味で使われる事も多い。 MP3 よりも圧縮率が高くて音質もいいのが売り。

  4. WinGroove
    あざらし氏によるソフトシンセ。 シェアウェア 2,000円。 最近は開発が止まってるご様子。

  5. Total Recorder
    High Criteria のシェアウェア。 もしかするとオンライン販売型の製品かも。

  6. AudioEncorder
    KazukiSoft (氏?)によるカンパウェア。

  7. WEP
    ORCA Project (氏?)による…、フリーウェア? とりあえず「カネ払え」的な事は書かれていないんだが、フリーだとも書いてない。

Copyright© 1998-2006 Hira