SMAFファイルの詳細な仕様を知りたい

  • 投稿日:
  • by
  • カテゴリ:

着メロファイルからタイトル情報とか抜き出すプログラムを作っています。
久しぶりにするプログラムは楽しいなー。

use MLD::Info;
my $mld = MLD->Info->new("/path/to/melody");
print $mld->get_title;

なんて書くと着メロの曲名がわかるというものです。
生まれて初めてデザインパターンらしきものを意識してプログラムしています。
newの引数で渡されたファイルの拡張子によって、どのサブクラスを呼ぶかを決めています。
概念はわかるのですが、これが何パターンなのかは知りません。
趣味プログラマですからそれでいいのです。

さて、DoCoMoで使用されているMFiファイルのフォーマットについてはDoCoMoから詳しい仕様がリリースされているので、その仕様書を読めばファイルの何バイト目から何バイト目までがどんな意味を持っているかというのはすぐにわかるのです。
最初の4バイトが「melo」固定、続く4バイトがデータ長、次の2バイトがヘッダ長…という感じに。
そうやってバイナリを解析していけば、どの部分に曲名が記録されているのかわかります。

ところが、VodafoneおよびEzwebで使用されているSMAFファイルのフォーマットは具体的な仕様が見つからないため、どの部分がどんな意味を持っているのかが全くわからないのです。
ここを参考にすれば、MMF形式についてはわかったのですが、SMAF形式について詳しく書いてあるところが見つからない!
最初の4バイトが「MMMD」固定、続く4バイトがデータ長というのはわかるのですが、その後あたりから怪しくなるのです。CNTIチャンクかOPDAチャンクあたりに曲名が入っているのは突き止めた。でもOPDAチャンクのDchって文字列は何?その後の5バイトはどんな意味があるの?CNTIチャンク先頭の5バイトも何?
そんな感じで不明なことばかりです。
とりあえず謎の5バイトの意味は考えないこととして、何とか曲名を取り出すことには成功しているのですが、なんかイマイチすっきりしません。

SMAFファイルのフォーマットの詳細をご存知の方いません?是非教えてください。