2013.3.14
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第345回]


●MIDIファイルadams.midの解析

前回からの続きです。
このところずっとMIDIについて書いております。

テーマと全く関係ないじゃないの。
CP/Mはどうなったの?
それにここはND80ZV(ND80Z3.5)でCP/Mを動かそう、というページだったのじゃありませんか?
ND80ZV(ND80Z3.5)は買ってもってるけど、E−80(仮称)ミニコンなんて知りませんよ。それは別のページで書くべきなんじゃありませんか?
などなど。
読者様のお叱りの声が届きそうであります。

ええ。
それは重々承知しておりますです。
できればタイトルに沿ったお話でまとめていきたいとは思っておりますのですけれど。
並行して複数進行しております作業に合わせて、複数のテーマで書き分けるとなりますと、それはそれで私の頭の中ではうまく交通整理ができませぬものですから。

ま。
もうしばらく、ご辛抱いただきまして、お付き合いをお願い申し上げます。

基本的には、舞台裏のお話といいますか、完成してしまったものについてのきれいごとではなくて、そこに至るまでの途中の、泥沼の試行錯誤のあれこれを中心に書いていくという姿勢でおります。

ですので。
もののおわかりになられた方にとりましては、進行の過程が実にじれったい、ということになりましょうけれど、そこは私のいわば研究ノート的、備忘録的日記としての側面もありますことですから、ま、平にご容赦くださいませ。

前回書きましたように、ランニングステータスなどというややこしいルールが多用されているということがわかりまして、MIDI演奏プログラムをそれに対応できるように直しましたところ、今までどこかおかしかったいくつかの曲がきれいに演奏されるようになりました。

おお。
これで、やっと完成か。
と思ったのでありましたが、やっぱり駄目なものが残ってしまいました。

「アダムスファミリー」と「ターミネーター2」は曲の演奏が終了しても、プログラムが終りません。
ハングアップしてしまっているようです。

また、「スターウォーズ」と「ヒッチコック劇場」は全く音が鳴らず、かつプログラムがハングアップしてしまいます。

うーん。
このあたりが限界か、とも思ったのでありますが。
やっぱり面白くないのでありますね。
なんとかしてみたい。

またもやデータの解析にかかってしまいました。
とにかくしつこいのであります。

そうしましたら。
アダムスファミリー(adams.mid)の最初のデータトラックにおかしなところをみつけました。



最初のデータトラックには演奏の基本情報があって、そのデータはMIDI音源には送られません。
トラックの終わりは
FF 2F 00
で終ります。
ところがその終わりのデータの前にあります時間のデータが、ちょいと異常なのです。
8F FF 7F
になっています。
ふつうここは0でいいはずです(と私は思います)。
どうしてここにこんな時間が設定してあるのか、謎であります。

しかし。
これはくさい。
これは可変長表記ですので、ふつうの16進数に直してみました。
すると3FFFFになります。
10進数なら262143です。
かなり大きな数字です。
これは実際の時間ではどれくらいの時間でしょうか。

テンポデータはその上の
FF 51 03 06 8A 1B
で定義されています。
4分音符の長さが68A1BH(428571)μsです。
ヘッダートラックを見ますと4分音符の分解能はC0H(192)になっています。

この2つの数値から、この曲のティックは
428571/192=2232μsになります。
(このあたりの計算につきましては、[第338回]を参照願います)

そうしますとトラック1の終端にあります3FFFFH(262143)という数値が示す時間は
2.232×262143=585103.176(ms)になります。
約585秒です。
えー?
9分45秒???

だって、アダムスファミリーの演奏時間は実際に計ってみましたら、たったの45秒なのですよお。
むむ。
これじゃあハングアップしているように見えて当たり前です。
実際の演奏が終わってしまっても、トラック1のファイルエンドは9分も先なのですから。
これは謎ですねえ。

でも原因がわかれば、対策は立てられます。
トラック1はその他のトラックが終了してしまったら(つまり実際の演奏が終了してしまったら)、用はありませんから、もしまだトラック1内に未処理のデータが残っていても構わず終了してしまうようにプログラムを変更いたしました。

そのように直してからadams.midをもう一度演奏してみましたら、今度は演奏が終ると同時にプログラムの実行も終了しました。
ターミネーター2もアダムスファミリーと同じ症状だったのですが、こちらも直ってしまいました。
ターミネーター2については中身の解析はしませんでしたが、プログラム変更後にはハングアップしなくなったところをみますと、おそらく同じ原因だったように思われます。

さて。
そういうことになりますと。
残るは、全く演奏してくれなかった「スターウォーズ」と「ヒッチコック劇場」だけになりました。

うう。
この2つは、やっぱり、どうしても聞いてみたい。
あ。
Windows Media Playerでしたら聞けるのですけれど。
それじゃあ面白くもなんともありませぬ。

またしても、ファイルの解析を…。
とにかく。
しつこいのです。

ワンボードマイコンでCP/Mを![第345回]
2013.3.14upload

前へ
次へ
ホームページトップへ戻る