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

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

[第344回]


●昔のMIDIファイルを送っていただきました

Y様からメールが届きました。

「ホームページを読みました。
手元に懐かしい音楽のMIDIデータがありますので添付ファイルでお送りします。」

MIDIファイルがいっぱい添付されておりました。
タイトルを見ましたら、どれも懐かしいものばかりです(なかには私の知らないものもありますが)。

0011ナポレオンソロ
2001年宇宙の旅
ウッドペッカー
エアーウルフ
ザ・モンキーズ
スパイ大作戦TV版
スワットチーム
セサミストリート
それゆけスマート
ルーシーショー
宇宙家族ロビンソン
宇宙大作戦スタートレック
奥様は魔女
謎の円盤UFO
猛烈ギリガン君

アダムスファミリー
ゴーストバスターズ
ジョーズ
ターミネーター2
ダラス
バットマン
ハワイアンファイブオー
わんぱくフリッパー
白バイ野郎ジョンアンドパンチ

スターウォーズ
ヒッチコック劇場

いやあ。
これは、これは。
さっそく演奏してみることにいたしました。

現在E−80(仮称)ミニコンにインストールしておりますZB3BASICシステムは、Windowsのロングファイルネームには対応していません。
昔のMSDOSの半角英数字8桁+拡張子3桁のルールです。
そこでまずはファイルネームをそのように変更したうえで、1つずつE−80(仮称)ミニコンにロードして、MIDI演奏プログラムで演奏してみました。

ところが。
いくつかのファイルは演奏できたのですが、なんだかどこかがおかしかったり、まともに音がでないものや、音が止まらないものなどが出てきました。
私はインターネットからダウンロードしたMIDIファイルを解析して、それに合うようにプログラムを作ったのですが、Y様にいただいたファイルにはどうやら今どきは余り使われなくなったルールが使われているようです。

でもせっかくいただいた懐かしい曲ファイルです。
なんとかして演奏してみたい。
そこでまたもやデータの分析をしてみることにいたしました。

●ランニングステータス

送っていただいたMIDIファイルを解析しましたところ、ランニングステータスが多用されておりました。
ランニングステータス
といいますのは、ステータスコードの省略ルールです。
ふつうMIDIコードは、3バイトです。
たとえばノートオン(9x xx xx)を例にとりますと
aa 90 43 3F(aaは長さのデータです。以下同様)
bb 90 43 00
cc 90 42 3F
dd 90 42 00
というように書く代わりに、2回目以後の90を省略して
aa 90 43 3F
bb 43 00
cc 42 3F
dd 42 00
というように書くのがランニングステータスです。

このルールは知ってはいましたが、面倒なので無視しておりました。
最近はメモリ容量など気にする人はおりませんので、このルールはすたれてしまったようです。
しかしY様から送っていただいたMIDIファイルが作成された当時はおそらくメモリサイズを少なくすることが一番求められたことでありましょう。

下は実際に解析しているところです。
ジョーズのMIDIファイルをE−80(仮称)ミニコンにロードして、メモリダンプを行なって、内容を解析しています。

オレンジのマーカーで着色したところがMIDIのステータスデータです。
無着色のところは時間データです。
着色部をよく見ていただきますと、ところどころは3バイトですがほとんどは2バイトであることがお分かりいただけると思います。
MIDIステータスの最初のコードは必ずビット7が1(つまり80〜FF)なので、そのビット7が0か1かを見れば、第一バイトが省略されているかどうかがわかります。
一部の例外(C0など)を除いてはMIDI音源に送るデータは3バイトである、としていたプログラムにこういうファイルを読み込ませたらそりゃあまともには演奏してくれません。
そこでこのルールに対応するようにプログラムを変更しました。

このルールはMIDI音源も理解するはずですからこのまま2バイトデータのままSC−88に送っても正しく演奏してくれるはず、ということでそのようにプログラムを変更したのですが、それではだめでした。

いずれプログラムリストをお見せしましたときに説明をいたしますが、複数のトラックがある場合には、時間の進行によってそれぞれのトラックからのデータが入り混じってMIDI機器に送り出されます。
そうすると同一トラック内では直前に省略されたステータスバイトが何であるかがわかっていても、複数のトラックからのデータが混じってしまうと、それが特定できなくなります。
結局ステータスが省略されている場合には、その省略されたステータスバイトのコードを補填して元通りの3バイトにして送らなければならないということがわかりました。

そのようにしましたところ、かなりのファイルが正しく演奏できるようになりましたが、それでもまだ終わりがおかしいものや全く演奏がはじまらないものが残りました。

途中ですが時間がなくなってしまいました。
この続きは次回にいたします。

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

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