「VSQのファイル仕様(推定)」の編集履歴(バックアップ)一覧に戻る
VSQのファイル仕様(推定) - (2009/04/29 (水) 19:43:07) のソース
*&color(blue){このページについて} &color(red){&bold(){更新中です}} VOCALOID2 Editor(以下Editorと略)が使用するシーケンスファイル(拡張子.vsq)のファイル仕様について書きます。 管理人の推測によるものなので、正確さを欠く箇所があることを最初にお断りしておきます。 *&color(blue){vsqファイルの概要} Standard Midi File (SMF)のFormat 1仕様に準拠しているようです。数値の格納はビッグエンディアン。SMFの仕様についてはこのページでは省略します。 *&color(blue){トラックの種類} Format 1のSMFファイルにはトラックを分割して格納することができますが、vsqファイルは2種類のトラックを区別して使用しているようです。 **①テンポ、拍子を格納したトラック #divclass(bo01){ -トラック名が必ず"Master Track"となります。 -含まれるのは以下のメタイベントのみ。 --Sequence/Track Name(0xff 0x03 [length] [text]) --End of Track(0xff 0x2f 0x00) --Set Tempo(0xff 0x51 0x03 [tempo(3bytes)]) --Time Signature(0xff 0x58 0x04 + 4bytes) -必ずSMFのヘッダの直後に表れ、vsqファイルに1個のみ。 -テンポの変更は②のメタテキストには記入されず、このトラックのSet Tempoメタイベントを用いて記録される -拍子の変更も、同様にTIme Signatureメタイベントを用いて記録される } **②Editorのピアノロール画面の情報を格納したトラック #divclass(bo01){ -トラック名が、Editorのトラック名と一致します。 -必ず上記のMaster Trackの直後に表れます -Editorに必要な情報は全て(恐らく)メタテキストで記述されます -上記メタテキストの日本語部分はShift-JISエンコードになっている -上記メタテキストは全てDelta-time=0として記述されます -メタテキストの直後にはMIDI Eventのコントロールチェンジが記述されます。(確認したものは全てNRPN[Non Registered Parameter Number]を用いたコントロールチェンジ) -メタテキストは複数に分割して記述されます。 -メタテキストの文字列のバイト数は、末尾の物を除き全て127byte(0x7f)となる。末尾の最後のメタテキストのデータ長は127byte以下。 -分割されているメタテキストを繋げると、1個のテキストファイルになる。元のテキストファイルの改行は0x0aに置き換えられる。 -上から数えてN番目のメタテキストは、"DM:" + N.ToString( "0000" ) + ":" という感じのプレフィクスが付く。 -プレフィクスの番号(DM:****の****)は4桁ごとに増える。つまり、DM:9999の次はDM:00010000。 -Editorのトラックの数だけvsqファイルに記述される。 -&color(orange){todo:文字列長が127byteでないメタテキストが現れた場合、Editorはどう処理するのか?} -&color(orange){todo:メタテキストが"DM:****"の数字の順番に表れなかったときのEditorの挙動} -&color(orange){todo:改行は0x0aで表されているが、0x0d 0x0aとしても正しく処理されるのか?} } *&color(blue){NRPNによるコントロールチェンジの意味は?} -VOCALOID2 Editorのヘルプファイルに各NRPNの意味の一覧あり。 -Note Duration(0x50 0x04)の情報はメタテキストには直接記述されないが、メタテキストの情報から計算可能。 #divclass(bo01){{ $$NoteDuration=\left[\frac{125 \cdot clocks}{tempo}\right]$$ &italic(){clocks}: 音符の長さ(クロック) &italic(){tempo}: テンポ(125等、実際にvsqに保存されるテンポの値は$$6\times10^7 / tempo$$) nは0以上の値となる。[]はガウスの記号。 }} -[[NRPNに記録されるクロックと「プリセンドタイム」]] *&color(blue){各トラックのメタテキストの中身} -メタテキストを順番どおりに(DM:****の****部分の数字の順)につなげる事で得られる。 -書式は、INIファイルと同じ。セクション([]でくくられて記録される部分)には次の種類がある。 --[Common] --[Master] --[Mixer] --[EventList] --[PitchBendBPList] --[PitchBendSensBPList] --[DynamicsBPList] --[EpRResidualBPList] --[EpRESlopeBPList] --[EpRESlopeDepthBPList] --[EpRSineBPList] --[Reso1FreqBPList] --[Reso2FreqBPList] --[Reso3FreqBPList] --[Reso4FreqBPList] --[Reso1BWBPList] --[Reso2BWBPList] --[Reso3BWBPList] --[Reso4BWBPList] --[Reso1AmpBPList] --[Reso2AmpBPList] --[Reso3AmpBPList] --[Reso4AmpBPList] --[GenderFactorBPList] --[PortamentoTimingBPList] --[VibTremDepthBPList] --[OpeningBPList] --[ID#****] ---****は4桁の整数。[ID#9999]の次は[ID#10000]。 --[h#****] ---****は4桁の整数。[h#9999]の次は[h#10000]。 *&color(blue){各セクションに記録される内容} **[Common] #divclass(bo01){ >[Common] >Version=DSB202 >Name=Voice2 (1) >Color=157,181,123 >DynamicsMode=0 >PlayMode=1 :Version|ボカロのバージョン。例えばMEIKOならDSB202、MIKUならDSB301 :Name|トラック名 :Color|意味不明 :DynamicsMode|意味不明 :PlayMode|意味不明 } **[Master] **[Mixer] **[EventList] **[PitchBendBPList] -PIT(ピッチベンド)カーブ。 **[PitchBendSensBPList] -PBS(ピッチベンドセンシティビティ)カーブ **[DynamicsBPList] -DYN(ダイナミクス)カーブ **[EpRResidualBPList] -VOCALOID2の場合、BRE(ブレシネス)カーブ。VOCALOID1の場合、Noiseカーブ。 **[EpRESlopeBPList] -BRI(ブライトネス)カーブ **[EpRESlopeDepthBPList] -CLE(クリアネス)カーブ **[EpRSineBPList] -Harmonicsカーブ(VOCALOID1のみ) **[Reso1FreqBPList] **[Reso2FreqBPList] **[Reso3FreqBPList] **[Reso4FreqBPList] **[Reso1BWBPList] **[Reso2BWBPList] **[Reso3BWBPList] **[Reso4BWBPList] **[Reso1AmpBPList] **[Reso2AmpBPList] **[Reso3AmpBPList] **[Reso4AmpBPList] **[VibTremDepthBPList] **[GenderFactorBPList] -GEN(ジェンダーファクター)カーブ **[PortamentoTimingBPList] -POR(ポルタメントタイミング)カーブ **[OpeningBPList] -OPE(オープニング)カーブ **[ID#****] #divclass(bo01){ -音符または歌手のプロパティが記述される ***音符の場合 #divclass(bo01){ 例えば次の内容が記述される >[ID#0001] >Type=Anote >Length=240 >Note#=60 >Dynamics=64 >PMBendDepth=8 >PMBendLength=0 >PMbPortamentoUse=3 >DEMdecGainRate=50 >DEMaccent=50 >LyricHandle=h#0001 #divclass(bo01){ :Type=Anote|音符を表すIDであることを示す :Length=240|長さが240クロックの音符 :Note#=60|音の高さは60(60=C3) :Dynamics=64|ベロシティ(VEL)の値 :PMBendDepth=8|「音符のプロパティ」の「ベンドの深さ」 :PMBendLength=0|「音符のプロパティ」の「ベンドの長さ」 :PMbPortamentoUse=3|「音符のプロパティ」の「~形でポルタメントを付加」の指定内容。「上行形で~」が指定されていれば値は+1、「下行形で~」が指定されていれば値は+2。即ちこの場合は両方が指定されている。 :DEMdecGainRate=50|「音符のプロパティ」の「ディケイ」 :DEMaccend=50|「音符のプロパティ」の「アクセント」 :LyricHandle=h#0001|この音符が使用する歌詞情報 } } } **[h#****] #divclass(bo01){ -歌詞/ビブラート/歌手のプロパティのいずれかが記述される。 ***「歌詞」の場合 #divclass(bo01){ >LO=[歌詞],[発音記号],[謎の実数],[ConsonantAdjustment]×発音記号の個数,[プロテクトフラグ] #divclass(bo01){ :歌詞|文字列。歌詞。 :発音記号|文字列。発音記号が半角スペース区切りで記録される。 :謎の実数|実数。 :ConsonantAdjustment|整数。子音なら64、母音なら0、識別できない(VOCALOID2の規格にない)発音記号なら0。NRPNのMSB0x50 LSB0x11~0x21のData LSBに記録される値(Consonant Adjustment n)と同じ値。 :プロテクトフラグ|整数。「歌詞のプロパティ」の「プロテクト」がチェックされていれば1、そうでなければ0. } -謎の実数の意味&br()0から1の間の値。0, 0.5, 1.0の3つしか見たことない。バイナリエディタで1.0を0.0に変えたものを作成し、waveにレンダリングしても、変える前レンダリング結果と同じ波形が得られる。 -発音記号の個数&br()NRPNには先頭の16個までしか記録されないが、こっちにはかなりの個数発音記号を入力できてしまう。少なくとも「a」7630個までは入力でき、waveへのレンダリングも出来た(ただし先頭の16個しか発音されない模様)。 } ***「歌手のプロパティ」の場合 #divclass(bo01){ >IconID=$07010002 >IDS=Miku3 >Original=2 >Caption= >Length=1 >Language=0 >Program=2 } #divclass(bo01){{ :IconID|(言語・)プログラムチェンジを識別するID。例えば「初音ミク(日本語)、プログラムチェンジ2」の場合$07010002、「メイコ(日本語)、プログラムチェンジ0」の場合$07010000となる。(註:「ボカロの種類・言語」の情報を含んでいるかどうかは未確認) :IDS|Singer Editorで設定した歌手の名前 :Original|この歌手情報ハンドルが、{VOCALOIDインストールディレクトリ}\voicedbdirに保存される「vvoice{Original + 1}.vvd」を参照していることを表すインデクス。 :Caption|謎の空文字列 :Length|謎の整数 :Language|恐らく、ボカロの歌唱言語を表すインデクス。(日本語が0?、未確認) :Program|Singer Editorで設定した「プログラムチェンジ」の値 }} } ----