アプリ版:「スタンプのみでお礼する」機能のリリースについて

今midiについて勉強中なんですが
デルタタイムがどうしても分かりません。
エクセルでバイナリのデータから16(10)進数に変換していて
http://www.geocities.jp/stdmidi/03.html
上のサイトに書いてあることはできましたが

http://www.geocities.jp/stdmidi/t0.html
デルタタイムの83 60を480(10進数)にすることがどうしてもできません。
vbaでもワークシート関数でもどちらでもいいのでお願いします。

A 回答 (1件)

MIDI なんて 20年ぐらいぶり。


しかもバイナリでなんか気にも留めたことなかった。

タイムベースが 0x01E0 となっているので、10進数に直してみると 480になる。
つまり四分音符の分解能は 480ってこと。

んで四分音符と同じ長さでデルタタイムを記述したいのなら 480 をセットする。
480 を 2進数にすると 00000001 11100000 となる。
ただしこの 2進数は 8bit で素直に算出したもの。
これを MIDI の 7bit 区切りにすると
10000011 01100000 となる。
これを 16進数にすると 0x8360 になる。


逆に言えば、
バイナリ中のデルタ値が 0x8360 になっていたとすると
これを 2進数にすると 10000011 01100000 となる。
これは MIDI のお約束で 7bit化された値を 8bitで表したもの。
これを純粋な 8bit に直す。

下位 01100000 の先頭の 0 を捨てると 1100000 となる。
先頭の 1ビットは上位の一番ケツの値から持ってくる。
上位 の一番ケツの値は 1 なので、こいつをもらう。
そうすると下位の値は 11100000 になる。

上位 10000011 は、ケツの 1 を下位にくれてやり、全体を右にシフトする。
ただし先頭の 1 は 「下位とつながってる」 というフラグ値なので捨てる。
そうすると上位 10000011 は 00000001 になる。
上位と下位を並べると 00000001 11100000 となる。
これは 16進数だと 0x01E0 になる。
タイムベースで指定している値と同じなので、四分音符ぶん待つよう書かれていることが分かる。
    • good
    • 1
この回答へのお礼

返事が遅れてしまいすいません。
本当にありがとうございました。
解決しました。

お礼日時:2015/05/29 23:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!