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

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

[第347回]


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

前回は「ヒッチコック劇場」のトラック1を解析して、全く演奏できなかった原因をつきとめました。
テンポデータが未定義のままスタートしてしまうなど、教科書的ルールでは考えられないのでありますが、どうしてそのようなファイルが出来てしまったのか、ちょいと謎でありますね。
何かのテクニックかと思えないこともないのですが、しかしそのようにしたところで何のメリットもないはずですから、全くわけがわかりません。

ところで、前回にも書きましたように、スタートしてくれなかったMIDIファイルは「ヒッチコック劇場」だけではなくて、「帝国のテーマ・スターウォーズ」も同じ症状でありました。
「ヒッチコック劇場」の解析によってその原因がわかりましたので、ひょっとして「帝国のテーマ・スターウォーズ」も同じ原因かと思い、プログラム変更後のMIDI演奏プログラムで試してみました。

結果は、みごとビンゴでありました。
SC−88に接続したアンプ〜スピーカーから、あの懐かしいダースベーダーのテーマが流れました。
やっぱり同じ原因だったようです。

まあ。しかし。
ことのついででありますから、「帝国のテーマ・スターウォーズ」のMIDIファイル(starwars.mid)も解析してみることにいたしました。



私はこのstarwars.midもhitchck.midと同じ構造をしていると推測していたのですが、見事に外れてしまいました。
このファイルはhitchck.midとは違う構造になっておりました。
まず第一にファイルのフォーマットが異なっています。
hitchck.midはフォーマット1ですがstarwars.midはフォーマット0です。
フォーマットにつきましては[第338回]をご参照ください。

最初に目につきますのがアドレス8417Hの
FF 7F 03 00 00 41
です。
シーケンサー特定メタイベントというものだそうでありまして、メーカーを指定して固有のイベントを記述するためのものなのだそうです。
そんなものを使ったら、一般的なMIDI機器では演奏できないじゃありませんか。
なんでそんなものが使われておりますのか、これまた謎であります。
もちろん私のMIDI演奏プログラムでは、このような得体の知れないコードはスルーいたします。

アドレス842EHにあります
FF 54 05 60 00 00 00 00
も飛びっきり謎なメタイベントコードです。
なんでも演奏開始時間を指定するものなのだそうであります。
余りに謎なものでしたから、このコードについて調べてみました。
データ部は5バイトです。
ここは単純な時刻データではなくて、SMPTEタイムコードというものなのだそうでありまして、なんでもビデオ映像との同期を取るためのものだそうです。
映像フレームの1コマずつに割り当てられた時刻データなのだそうです。

Y様には詳しくはお聞きしていないのですが、このMIDIファイルはたとえば映像と一体になった「テレビ・映画テーマ音楽集」などというものの一部だったのかもしれません。
もしそうだとしますと、「ヒッチコック劇場」やこの「帝国のテーマ・スターウォーズ」に使われております謎なコードのわけがある程度納得できるように思います。

演奏が始まらない原因なのですが、アドレス8445Hに時間データ02が使われているのがおそらくその原因だと思われます。
ここまでの段階ではテンポ設定はまだ行なわれていません。
C1 30
はプログラムチェンジですが、その前に置かれた時間データが消化されないため、変更前のプログラムでは実行できませんでした。
ここで止まっていたのだと思います。

同様のイレギュラーな設定はそのあとにもしばらく続いています。
テンポの設定が行なわれるのはアドレス8471Hの
FF 51 03 08 F9 CB
によってです。

ちょいと不思議なコードが使われてはいましたが、starwars.midが演奏できなかった理由がhitchck.midと同じであることがわかりました。
めでたし、めでたしです。

ついでですので参考までに、starwars.midのテンポデータも解読しておくことにいたします。
なお計算方法につきましては[第338回]を参照願います。

テンポデータ08F9CBHは10進数に直すと588235(μs)です。
これは4分音符1個の長さです。
これをヘッダートラックの4分音符の分解能01E0H(480)で割ってティックを求めます。
588235/480≒1225μs
そして1分間あたりの4分音符の演奏数は
1/0.588235×60=102
です。

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

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