バイナリデータとしてのMIDIの読み方は?


たかみちえ  URL  2001-07-27 15:49:53  No: 74695  IP: [192.*.*.*]

音楽そのものを変更できればずいぶんラクだと、
MIDIの譜面をバイナリエディタで開いてみたんですけど、
どこが何を意味しているのか、よくわかりません…。
あのファイルって、どうやって読むんでしょうか?

編集 削除
こころ  URL  2001-07-27 20:12:49  No: 74696  IP: [192.*.*.*]

以下のページにフォーマットの解説があるので
参考にしてみて下さい。

http://www.pluto.dti.ne.jp/~daiki/Midi/AboutSMF_Inside.html

編集 削除
たかみちえ  URL  2001-07-28 12:21:25  No: 74697  IP: [192.*.*.*]

しようについては分かりましたけど、
肝心の読みこみ方がよくわかりません
Getで配列に格納するまではできましたけど、
それをバイナリエディタのように、16進数で文字列として並べるには、
どうすればいいんでしょう?

編集 削除
こころ  URL  2001-07-28 14:48:28  No: 74698  IP: [192.*.*.*]

MIDIの読み方ではなかったのですか?
単にバイナリエディタのようなことがしたいってことでしょうか?
Hexを使えばいいんですが、大量に変換する場合は
テーブル等の使用も検討されれば、高速化がはかれるでしょう。

編集 削除
たかみちえ  URL  2001-07-28 18:39:49  No: 74699  IP: [192.*.*.*]

やっぱりいくつかのバイト列を、文字列として扱わないと、
MIDIの内容を見て回ることはできないと思うんです。
今までバイナリ処理をしたことがないので、
あまりバイナリ処理に触りたくないというのもありますけど…。

  配列四個分を参照して…、ということもけっこうあるみたいなので、
一部一部、文字列化して、いっぺんに調べてみたほうがラクかと。
Hex(mus(0)) & Hex(mus(1)) & Hex(mus(2)) & Hex(mus(3))…とか、毎回書かなきゃというのも、作業効率を落とすだけだし…。
(でも、つなぐのをモジュール化すれば楽になるかな)

>テーブル等の使用も検討されれば、高速化がはかれるでしょう。
  テーブルってなんですか?2次元以上の配列にうつしかえるとか?

編集 削除
こころ  URL  2001-07-28 20:38:50  No: 74700  IP: [192.*.*.*]

調べるって・・・自分の目で調べるってことでしょうか?
PCが処理するなら文字列にする必要などないはずですし・・・。

>テーブルってなんですか?2次元以上の配列にうつしかえるとか?
要は、Hexを使うと毎回関数呼び出しするわ、
その中で計算して答えをだすわで処理に時間がかかってます。
これを何千、何万回繰り返すとかなりの負荷となります。
そのため、配列にあらかじめ答えを格納しておき、
参照だけで答えを求めてしまおうという手法です。
この時、あらかじめ用意しておく配列のことを
一般的にテーブルと言います。

編集 削除
たかみちえ  URL  2001-07-28 21:29:51  No: 74701  IP: [192.*.*.*]

おかげさまで何とかトラックチャンクのはじまりまでは読みこめました。
シーケンサを作ってる人って、すっごいことしてるんですねぇ…。

>調べるって・・・自分の目で調べるってことでしょうか?
  まあ、まず基本はそうかなって…。
if Bytes(data,0,2)="OODA" Then  …  って言うふうに、
調べられるといいかなって…。
(Bytes関数、さっき作ってみました。dataという配列の0番目から2配列分を連結した文字列を返します^^;)
パソコンないでやるとしても、結局使う人に応用力がないと、それなりの調べ方しかできないかなって…。

>配列にあらかじめ答えを格納しておき、
>参照だけで答えを求めてしまおうという手法です。
  それでwavデータつなげようとすると、小さくても10秒はかかるんですね。
それならもう、Bytes関数のまんまで通用するかも。


  ところで、まずはじめに、トラック名とかをいじくってみようと思うんですけど、
文字列をバイナリで書くには、文字コードを使うんですよね?
それのリストとかはありませんか?

編集 削除
こころ  URL  2001-07-28 23:54:32  No: 74702  IP: [192.*.*.*]

SJISコードってことでしょうか?
リストではありませんが、こころはバイナリエディタを使って
変換したりしてます。
日本語を打ったテキストをバイナリエディタで見れば
そのまま、文字コードがわかるわけですし。

編集 削除
たかみちえ  2001-07-30 22:39:59  No: 74703  IP: [192.*.*.*]

なんだかでも、そうすると一文字一文字変換しなきゃいけないんでしょうか?
そうするととっても長い命令を書いてやっと…ということになりますけど…。
何とか、変換する関数とか作れませんか?

編集 削除
こころ  URL  2001-07-31 07:20:43  No: 74704  IP: [192.*.*.*]

何がしたいのかが、いまいちよくわかりませんが・・・。
StrConvで変換するとかそういうことですか?
リストって書いてあったので、てっきり
人が参照するものだと思ったのですが・・・。

にしても、バイナリを文字列に変換して、さらにそれを
バイナリに変換して・・・ってなんか無駄な気がします。

編集 削除
たかみちえ  2001-07-31 08:45:22  No: 74705  IP: [192.*.*.*]

何だかうまく伝えられてないのですけど…。
  まず、曲名や著作者名を参照、設定したいんです。
そのためには、バイナリに文字列を変換したり、その逆が必要になるんです。

StrConvでできるん…ですか?
vbUnicodeとかかな?

  あと、前回のURLですけど、
一部説明がないところがあるんですね…。
何だか、そういうのの集まってるところってないのかなー。
MIDI用語がわからないと読めない部分もあるし^^;
(わたしの使ってるシーケンサって、MIDI用語があんまりでてこないようになってるんですよ、そこがいいんですけど…)

編集 削除
たかみちえ  2001-07-31 22:14:22  No: 74706  IP: [192.*.*.*]

ありましたね^^;MSDNに書いてました^^;
でも、何だかよくわからないんですけど…。
たとえば、MIDIのヘッダ、MThd(4バイト)ですけど、
読みこんだ配列をそのまま表示したら、そのまま"MThd"とでました。
けど、最初から4バイトを読みこんで、文字列になおしても、"4"としか出てきません。
最初だからまだいいんですけど、これでは途中の文字が取得できません。
うーん、どうしましょ…。

編集 削除
PAPY  2001-08-01 13:53:37  No: 74707  IP: [192.*.*.*]

>あと、前回のURLですけど、一部説明がないところがあるんですね…。
>何だか、そういうのの集まってるところってないのかなー。

参考 Documents

<日本語>
B#(ちょっと難しいかも)
http://www.b-sharp.com/midi/index.html
ディレクト アート スタジオ (同じ所)
http://www.pluto.dti.ne.jp/~daiki/index.html
SMF フォーマットについて
http://www.infosite.co.jp/~maruyama/misc/smf.html

<英語>
Standard MIDI File Format [Dustin Caldwell]
http://www.wotsit.org/download.asp?f=midi
The USENET MIDI Primer 
http://www.wotsit.org/download.asp?f=midiprim
MIDI Sample Dump Standard
http://www.wotsit.org/download.asp?f=mid-frm4
General MIDI Level 1 Spec. 
http://www.wotsit.org/download.asp?f=mid-frm3 

※もしも、Delphiを使えるようでしたらMIDIファイルを作成するソースコードが下記にあります。(シェアで申し訳無いですが・・・)
http://madia.world.coocan.jp/Delphi/ura.htm

編集 削除
PAPY  2001-08-01 16:14:43  No: 74708  IP: [192.*.*.*]

英語のURLが直にダウンロード出来ないみたいですので、[MIDI]と記入して検索して下さい。

編集 削除