投稿者 るきお  (社会人) 投稿日時 2010/6/6 09:59:08
(すごく長く文章を書いてしまいました…)

>VB2010で作ってたデータを開いたらMIDIの音が出なくなりました^^;
他のmidiファイルの音は出ますか?
また、私が投稿した状態のプログラムでは音は出ますか?

私が紹介したのは即席で手作りのプログラムなので、想定外の使用をするとmidiの規格からはずれて演奏できないファイルが生成できる可能性があります。
たとえば、
track.AddNote(Notes.Cs, 3, 120)


track.AddNote(Notes.Cs, 3, 240)

にするともうダメです。
(これの何がダメなのか私にはわかりません。分解能との関係かもしれません。分解能は Private TimeUnit As New List(Of Byte) From {1, &H30}の行の&H30を&H80や&HE0などにするとより高機能になるはずです。)


VB2008とVB2010の問題ではなくMIDI(SMF)規格の問題と思います。

このことや、「数字の目的が分からず挫折しそう」、「どこで音量を制御してるのか」などの質問の趣旨から考えると、VBの知識ではなくMIDI(SMF)の知識が必要と思います。

DataLengthにはSMFの仕様では、データチャンクのヘッダー部に4バイトでフッター部を含むデータの長さをセットすることになっています。
フッター部は4バイト固定です。私のプログラムではデータの長さはData.Countで取得できます。
ですので、Dim length As Integer = Data.Count + 4として、データの長さをLengthにセットしてこれを4バイトの場所に書きだす処理が引用された個所です。

音量の制御方法についてもMIDIの規格ではどこにどのように音量を指定することになっているかをまず調べる必要があります。そのあとでそれをVBでやるにはどうしたらいいかを考えます。
今、MIDI規格での音量の指定方法も判らない状態ではVBでもどうしたらいいかわかりません。

料理に例えるとMIDI規格がクラムチャウダーで、VBが包丁と鍋(料理器具)です。料理器具の知識だけではクラムチャウダーは作れません。まずはクラムチャウダーの作り方を知るか、レシピを入手した後で、では料理器具をどう使えばいいかを考えます。

そして、MIDIの規格は何を見ればわかるのかというと、どこかで仕様書が公開されていると思うのですが、私が英語が苦手なこともあって見つけられていません。

さいわい仕様書そのものではありませんが、サンプル付きで丁寧に解説してくれている日本語のサイトがありましたので私はこのサイトの記述をVB化しました。
http://www2s.biglobe.ne.jp/~yyagi/material/smfspec.html#tempo
検索すれば他にも参考になる資料や仕様書そのものを発見できるかもしれません。
そのために提案されているのがdaiveさんで、daiveさんは「MIDI フォーマット -サイト」で検索することを勧められています。

前にも書きましたが、MIDIの規格を調べながらVBで記述するのはVB中級以上のレベルがいると思います。Gさんは初心者ということですのでかなりハードルが高いです。でも、楽しみながらチャレンジできるネタなので良さそうだなと思っています。

そこで、私が思うにGさんのとるべきスタンスとして2つあると思います。
スタンス1.私が作ったサンプルでできることで満足する。(私以外にもWebで検索すればサンプルを公開している人がいるかもしれません。)
スタンス2.MIDIの規格を調べながら私のサンプルを元に修正・機能追加を行い、Gさんのプログラムを作り上げる。

daiveさんの検索提案に対するGさんの感想としては、
>恐らく理解してる人ならばその説明を見れば分かるのでしょうが
というものでした。私としてはこの感想は共感でき、うなづけるものはあります。(とても難しいから!)
だとするとスタンス1しかありません。

このくらいのジャンルになるとMIDI規格をちゃんと知っていてそれをVB化できて、それを教えてくれる人というのはまずいないと思ってください。MIDI規格をちゃんと知っている人なら多少いると思います。規格さえ理解していればVB化できる人もそこそこいるとは思います。この両方を満たす人はまずいないと思います。
これが日本人の層の薄さで、私はちょっと残念な気はしています。

だから、スタンス2でいくなら、最低でもGさん自身がMIDI規格をちゃんと知ってからVBの質問をするか、VB中級以上になってからMIDIの質問をするかというのが最低ラインになるかなと思います。