These pages are written by only Japanese.

Welcom to My Diary.com
最新の日記タイトル一覧カテゴリ別タイトル一覧トップへ戻る〜

おはようございます♪ 現在は4月29日(月)8時4分。 朝御飯をお忘れずに。


hns - 日記自動生成システム - Version 2.19.5 (色々 Fixed)

先月 2011年05月 来月
01 02 03 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Namazu for hns による簡易全文検索です。
詳細は 詳細指定/ヘルプをご参照下さい。
検索式:

2011年05月01日(日)

MIDIファイルの分解出来た

まだ意味を理解してないイベント多数ですけど、SMF バイナリの切り出しが出来ました。
アドバイス有難うございます。 > @urekat / @yoya ステータスバイトが無いランニングステータス??... (openpear の IO/Bit.php が必要です)

実行:

<?php
require_once 'MIDI.php';

$mididata = file_get_contents($argv[1]);
$midi = new IO_MIDI();
$midi->parse($mididata);
$midi->dump();

結果:

HEADER:
  Format: 1
  NumberOfTracks: 9
  DivisionFlag: 0
  Division: 480
TRACK[0]:
  CHUNK[0]:
    DeltaTime: 0
    EventType: 15(Meta Event)
    MIDIChannel: 15
    MetaEventType: 3(Sequence/Track Name)
    MetaEventData: akatomb.mid
  CHUNK[1]:
    DeltaTime: 0
    EventType: 15(Meta Event)
    MIDIChannel: 15
    MetaEventType: 84(SMPTE Offset)
    MetaEventData: `^@^@^@^@
すみません。後で編集し易いように SMPTE Offset とか
もうちょっと細かく分解しておきます。

駄目だった理由:

ランニングステータスの仕様を見逃してました。
解説ページにはちゃんと書いてあるのに。(´Д`;)

次の課題:

  • MFi (MLD) を分解する
  • SMF と MFi とで翻訳できるラベルを探す
  • 対応するラベルをコピーする
  • build 処理を書く

2011年05月02日(月)

MFi の分解出来た

MIDIと同じく意味を理解してませんが、MFi(いわゆるmldファイル)のバイナリを分解出来ました。

実行:

<?php
require_once 'MFi.php';

$mfidata = file_get_contents($argv[1]);
$mfi = new IO_MFi();
$mfi->parse($mfidata);
$mfi->dump();

結果:

Header Part:
  Identifier: melo
  FileLength: 3762
  OffsetToTrack: 76
  DataTypeMajor: 1
  DataTypeMinor: 1
  NumberOfTrack: 1
Data Information Part:
  [0]
    Identifer: titl
    Length: 21
    Data: mbox_Elgar_ainoaisatu
  [1]
    Identifer: prot
    Length: 15
    Data: PsmPlayer V4.41
  [2]
    Identifer: sorc
    Length: 1
    Data: 0
  [3]
    Identifer: vers
    Length: 4
    Data: 808661040
  [4]
    Identifer: note
    Length: 2
    Data: 1
Track Part
  [0]
    Identifer: 1
    Length: 1
    Event:
      [0]
        DeltaTime: 0
        StatusInfo: 255
        StatusInfo2: 195
        Data: 75
      [1]
        DeltaTime: 0
        StatusInfo: 255
        StatusInfo2: 225
        Data: 2
      [2]
<略>

次:

  • お次は SMAF 分解してみます。
  • で、MIDI => MFi と MIDI => SMAF の翻訳ルールを見つけて
  • 情報要素をコピーして MFi と SMAF の build ルーチンが書けたら
  • 着メロ Flash の音声差し替えがー。(その時は C言語で書き直しますけど)

参考:


2011年05月03日(火)

SMAF ファイルの分解に挑戦

Chunk と Tag の分解だけ大体 *1 出来た。

実行結果:

<?php
require_once 'SMAF.php';

$smafdata = file_get_contents($argv[1]);
$smaf = new IO_SMAF();
$smaf->parse($smafdata);
$smaf->dump();
array(2) {
  ["ID"]=>
  string(4) "MMMD"
  ["Size"]=>
  int(4214)
}
array(3) {
array(3) {
  [0]=>
  array(7) {
    ["ID"]=>
    string(4) "CNTI"
    ["Size"]=>
    int(5)
    ["Contents Class"]=>
    int(0)
    ["Contents Type"]=>
    int(51)
    ["Contents Code Type"]=>
    int(1)
    ["Copy Status"]=>
    int(253)
    ["Copy Counts"]=>
    int(0)
  }
  [1]=>
  array(3) {
    ["ID"]=>
    string(4) "OPDA"
    ["Size"]=>
    int(40)
    ["Chunks"]=>
    array(1) {
<略>

感想:

  • SMAF は TLC 構造が大別して chunk と tag の2種類。入れ子も素直な構造と、次の入れ子までにデータが挟まる構造がある。その挟まるデータも chunk の種類による。ブロック分割するだけでも手間がかかる。
  • SMAF は length分を超えて次の IDフィールドまで \0 や @ で padding する事がある。何の為にあるんだろう。4未満並ぶのなら 32bit 境界用だと思うけど、14byte 並んで 16byte のキリが悪い所で終わる事もあるし。訳が分からないよ。
00000040  39 33 31 37 32 4d 54 52  05 00 00 10 2f 02 00 02  |93172MTR..../...|
                         <----------> <---------> <> <> <>
                              ID         size     FT ST TD
00000050  02 40 40 40 00 40 40 40  40 40 40 40 40 40 40 40  |.@@@.@@@@@@@@@@@|
          <> <---> <-----??????????????????????????-------
          TG   CS  
00000060  40 4d 74 73 75 00 00 00  32 f0 06 43 79 06 7f 7f  |@Mtsu...2..Cy...|
          ?> <--------->
                 ID
parse 時は読み飛ばせば良いけど、build 時は padding をいくつ埋めるべきか知らないといけない。でも仕様書に記述がない。世の中の mmf ファイルの調査して、その法則を調べるしかないかな。

参考:

神サイトというか公式サイトが役に立たない。
公式サイトの仕様に Chunk ID のラベル名定義さえ無いとか何なのw

*1: その辺で拾ってきた mmf ファイルなら処理できるという意味で

これで、3 日分だよ〜。

タイトル一覧
カテゴリ分類
Database
JXTA
Java
XML
awm
bookmark
keyword
memo
news
research
Powered by hns-2.19.5, HyperNikkiSystem Project