トップ «前の日記(2005-12-15 [木]) 最新 次の日記(2005-12-17 [土])» 編集

SewiGの日記

2004|01|04|05|06|07|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|

2005-12-16 [金] [長年日記]

[Java][Programming] JavaでSMF (1)

javax.sound.midiはMIDI関連の面倒くさいことをクラスライブラリでやってくれてうれしいのですが、抽象度はそれほど高くないので多少MIDIの知識が必要です。マルチメディア関連はいろいろと面倒なのでメモ。

SMF(Standard MIDI File)の構造は以下のようになっています。

SMF(Standard MIDI File)

ヘッダチャンクは「MThd」「データ長(固定)」「フォーマット」「トラック長」「タイムベース」から構成されています。トラックチャンクは「MTrk」「データ長」「データセクション」から構成されています。フォーマット1なら複数個のトラックがあります。データセクションは「デルタタイム」「MIDIイベント」から構成されています。数値はリトルエンディアンなのに注意してください。データセクション以外はクラスライブラリがいい感じに面倒を見てくれます。可変長数値とかバイト単位のファイルパース面倒だなぁと思ってる人最適。

データセクションですが、デルタタイムは演奏データの先頭からの相対的位置を表しています。なので番号が若い順に演奏されます。MIDIメッセージは以下のように分類されます。

MIDIメッセージ

チャネルメッセージはコンピュータで音楽やってる人にはおなじみのメッセージで、ノートオンやコントロールチェンジやプログラムチェンジなどがあります。システムメッセージはシステムエクスクルーシブなど機器の初期化や特殊な命令を実行します。チャネルメッセージもシステムメッセージも本当はもっと細かく分類できますが、あとは参考書*1を見てください。

トラックはデータを管理しやすいようにまとめているだけなのでさほど重要ではなく、チャネルごとに分けてやるといいでしょう。ここまで来れば、あとは好きなようにMIDIメッセージを作ってタイマーをグルグル回しながらメッセージを送信すればMIDIシーケンサの出来上がりです。

*1 「MIDI1.0規格書」でもいいのですが、MIDIリファレンス&サウンドプログラミング全般の良書として「Windowsサウンドプログラミング」をオススメします。

本日のツッコミ(全1件) [ツッコミを入れる]
KK (2007-05-06 [日] 00:32)

初めまして、midi周りについて色々調べていたらここにたどり着きました。

当方、ウェブ系プログラミング言語をちょっとかじった程度のプログラミング初心者なのですが、OS上で動くmidi関連ソフトを作りたいと思い立ち、「Windowsサウンドプログラミング」の書籍を購入したところでした。

ぶしつけで大変失礼なのですが、お聞きしたいことがあるのです。おそらくSewiGさんから見るととても初歩的な質問になると思うのですが、書籍「Windowsサウンドプログラミング」を数ページ読み進めたところで、コードのサンプルが記述されたページに遭遇しました。その後のページにも随所にコードのサンプルが記されているようですが、どれも同じ言語に見えます。

が、初心者なもので、この言語が何言語か分からないのです。同書籍にも何も注釈がないようで、ネットで色々調べると「Visual C++ か??」と思われるのですが、自信がありません。

お尋ねしたいのは、この言語が何言語であるのかということ、また、Windows用ソフトでmidi関連ソフトを作ろうとしたら、何言語で書くのが一番良いのか、(もしくは○○言語でなければダメ、とかなのか)、そして同様にMac用のmidi関連ソフトを作ろうとした時はどうなのか、ということです。

突然の書き込み申し訳ありません。
もしよければご教授頂けると幸いです。


Copyright © 2004-2008 SewiG All rights reserved.