SMAF/Phrase解析結果報告

SMAF/Phraseを解析して一つの音色ファイルから音階操作して
データを作り出すルーチンをvodanesに組み込みました。
これによって一音色80以上あったファイルを1つにすることができました。


■解析資料
 ・SMAF / SMAFとは? / 仕様概要
 http://smaf-yamaha.com/jp/what/smaf_spec.html
 ・KDDI au: 技術情報 > ダウンロードCGI
 http://www.au.kddi.com/ezfactory/tec/dlcgi/download_1.html


まだ全て解析できたわけではないですが、
現状わかっている部分まで解析結果を載せておきます。
もっと詳しい資料があればこんなことしなくて済むのですが...


※データはvodanesに同梱したs/20.spfを解析したものです。


4D,4D,4D,44,00,00,00,90,(MMMD)…多分File Chunk

  43,4E,54,49,00,00,00,05,(CNTI)…Contens Info Chunk
    00,F0,01,F8,00,

  4F,50,44,41,00,00,00,21,(OPDA)…Optional Data Chunk

    44,63,68,FF,00,00,00,19,(Dch)…Data Chunk
      45,53,00,01,F8,41,30,00,06,59,39,33,32,44,45,41,
      32,00,06,59,39,33,32,34,44,

  4D,4D,4D,47,00,00,00,50,(MMMG)
    01,14,

    56,4F,49,43,00,00,00,2D,(VOIC)

      45,58,56,4F,00,00,00,25,(EXVO)
        FF,F0,22,43,04,01,79,85,02,7F,F4,BB,00,10,40,02,
        AF,A0,0E,03,10,40,02,2F,F3,9B,10,20,41,02,AF,A0,
        0E,01,10,40,F7,

    53,45,51,55,00,00,00,11,(SEQU)
      00,00,30,00,00,00,32,81,00,08,50,50,FF,00,0B,FF,00,

CF,0A,(CRC)

<読み方>
緑色のところはチャンクデータです
・階層状態になったチャンクは段下げしてあります
赤字の部分は音階変更プログラムでマークしている部分です


まず大前提になる構造として『チャンク』があります。
参照:SMAF / SMAFとは? / 仕様概要 / データ表現概要
http://smaf-yamaha.com/jp/what/s30.html


これを理解していないと上記のバイナリを読むことはできません。
チャンクにはチャンクサイズが記述されているため、データ長が変わる場合は
各階層のチャンクサイズを順番に変更していく必要があります。


次に実際の音階データの変更について。
音階データは上記データの142?143?byte目の08になります。
音階としてはG#1を表現しています。
音階データの変化にはそのほかにも法則があります。


・(G#1,A1,A#1,B1,B#1)というデータはノートデータ(08,09,0A,0B,0C)の他に低音を示すデータ列がつく
 多分(00,00,32,81)だと思う。。。
・中音はノートデータ01〜0C、11〜1C、21〜2C、31〜3C
 低音、高音につくデータ列の部分がなくデータ全体の長さが変わる
高音を示すデータ列がつく。多分(00,00,32,0x)だと思う。。。
 高音はノートデータ31〜3C0xの部分が01-03まで変化する


最後にCRCのチェックバリューを2byte付ける。
計算する範囲は上記データのCRC2byteを除くすべて。
計算方法はCCITTで独自のCRCテーブルが必要なようです。
KDDIに詳細なサンプルが掲載されています。
参照:KDDI au: 技術情報 > ダウンロードCGI
http://www.au.kddi.com/ezfactory/tec/dlcgi/download_1.html


こうしてspfを編集することで音階を操作することができます。


今回はvodanesに音をつけるために利用しましたが、ここまでできると
GM128音色分のデータを入れたMMLエディタのようなものが作れるような気がします。
誰か作ってください。
期待してるんで。
4音色でファミコン音源のシーケンサでもいいかもしれないねー