cadencii_jp @ wiki

VOCALOID1のSynthesize Engine 1.0と1.1の同時起動


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

事前に知っておくと良い事柄

  1. VOCALOID1 VSTi DLLの本体(vocaloid.dll)は,VOCALOID Editorのインストールディレクトリにある設定ファイル「VOCALOID.ini」の,[Synthesis]セクションのDSEVersionの項目を読み取って,Synthesize Engineを切り替える.DSEVersion=100なら1.0, DSEVersion=101なら1.1.
  2. vocaloid.dllがVOCALOID.iniを読みにいくのは,dllのエントリーポイントであるDllMainが最初に呼ばれたときだけである(推測).
  3. 同一プロセスから2回目以降にLoadLibraryEx(WinAPI関数)でvocaloid.dllを読み込んだ場合,DllMainは呼ばれない.
  4. VOCALOID.iniは,UAC(ユーザーアカウント制御)がデフォルトの設定のとき,書き込み制限がかかる.

Cadenciiの動作詳細

2種類のSynthesize Engineを読み込ませる場合における,Cadenciiの動作の詳細を時系列順に説明します.
  1. vocaloid.dllをLoadLibraryExを用い読み込む.ここでは,VOCALOID.iniに記述されたデフォルトのSynthesize Engineで読み込まれる.
  2. VOCALOID.iniを,一時ディレクトリにコピーし,バックアップを取る.
  3. VOCALOID.iniのDSEVersionの項目を,デフォルトと違う値に書き換える.(DSEVersion=100 -> 101, DSEVersion=101 -> 100)
  4. vocaloid.dllを,Kenji Aiko氏によるDLL読み込み方法で読み込む.この方法で読み込むと,vocaloid.dllのディレクトリは同じであるにもかかわらず,別のdllとして読み込まれるため,エントリーポイントDllMainが実行される.
  5. バックアップしておいたVOCALOID.iniを,元の位置に戻す.

まとめと備考

  • vocaloid.dllを通常の手法で単純に2回読み込むのではなく,別々のDLLとして読み込む.すると,2回の読み込みでそれぞれ1回ずつDllMainが実行されるので,違うDSEVersionで起動することができる.
  • VOCALOID.iniを操作する必要があるので,UACを無効にしておく必要がある.
  • Windows 7の場合,LoadLibraryExを介さずにDLL読み込んで実行しようとすると,データ実行防止(DEP)機能により,UAC無効の場合であってもメモリアクセス違反が発生する.これを回避するために,Cadenciiの本体であるCadencii.exeに,「アセンブリがDEPに対応していない」ことを表すフラグを立てる必要がある.具体的には,Microsoft Visual Studioのツールセットに入っている「editbin.exe」を使って,次のコマンドを実行する.
editbin /NXCOMPAT:NO Cadencii.exe