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 Chunk43,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〜3Cで0xの部分が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音色でファミコン音源のシーケンサでもいいかもしれないねー