LinuxでVOCALOIDを歌わせる

# はじめに
[LinuxでもVOCALOIDに歌わせられる](https://appdb.winehq.org/objectManager.php?sClass=application&iId=18172)と聞いたが，やってみたら古い記事しかなくてハマったので書いておきます．

# 概要
LinuxでWindows向けのソフトを使用するために **Wine** を使います．また，VOCALOIDのエディタであるPiapro StudioはVSTプラグインです．VSTプラグインを開くために **VSTホスト** というものが必要なので，今回は **dssi-vst** を使用します．

# 環境
Ubuntu 18.04.3 LTS (UbuntuStudio)
VOCALOID4 鏡音リン・レン
Piapro Studio VSTi 2.0.4.3

# 方法

## VOCALOIDをインストール

VOCALOIDを買ってきましょう．

1. Windows用のDVDをセットします．
`RinRen/Crypton Software Installer (32bit)/setup.exe`を **Wine** で開いてインストールしてください． **32ビット** バージョンなので，間違えないようにしましょう．

2. `RinRen/RINLEN V4X Installer/setup.exe`を **Wine** で開いてインストールしてください．

3. `~/.wine/drive_c/Program Files (x86)/VOCALOID4/Activator/Activate4.exe`を **Wine** で開いてアクティベートします．


## dssi-vstでPiapro Studioを使えるようにする

1. GitHubから[dssi-vst](https://github.com/falkTX/dssi-vst)をインストールします．

2. ライブラリをインストールします．
何も考えずに以下をターミナルにコピペしてください．

```shell:
$ sudo apt install -y libasound2-dev lib32z1-dev liblo-dev wine32-tools ; sudo apt install -y libjack-dev:i386 ; sudo cp /usr/lib/i386-linux-gnu/libjack.a libjack.a.bkup ; sudo cp /usr/lib/i386-linux-gnu/libjack.so libjack.so.bkup ; sudo apt install -y libjack-dev ; sudo mv libjack.so.bkup /usr/lib/i386-linux-gnu/libjack.so ; sudo mv libjack.a.bkup /usr/lib/i386-linux-gnu/libjack.a ;
```

<details><summary>このコマンドで何をやっているかというと．．．</summary><div>

必要なライブラリをインストールしています．`libasound2-dev` `lib32z1-dev` `liblo-dev` `wine32-tools` `libjack-dev`が必要です．

ただし，`libjack-dev`は32bitのライブラリを残しつつ64bitバージョンをインストールしています．まず32bitバージョン(`libjack-dev:i386`)をインストールし，ライブラリを一旦カレントディレクトリにコピーします．次に64bitバージョンをインストールしますがこの際に32bitバージョンは削除されます．そして，コピーしておいた32bitのライブラリを元の場所に戻します．
</div></details>

最後に`$ sudo make`でコンパイル，`$ sudo make install`でLinuxにインストールします．

<details><summary>エラー: 「bits/c++config.h: そのようなファイルやディレクトリはありません」が出たら．．．</summary><div>

```
In file included from dssi-vst-scanner.cpp:10:
/usr/include/c++/9/iostream:38:10: fatal error: bits/c++config.h: そのようなファイルやディレクトリはありません
   38 | #include <bits/c++config.h>
      |          ^~~~~~~~~~~~~~~~~~
compilation terminated.
winegcc: g++ failed
make: *** [Makefile:78: dssi-vst-scanner.wine.o] エラー 2
```

上のようなエラーが出た人は以下のコマンドを実行してから`make`でコンパイルを試してみてください．

```shell:
sudo apt-get install -y gcc-multilib g++-multilib
```
</div></details>

## 実行

```shell:
$ env WINEPREFIX=/home/USERNAME/.wine VST_PATH='/home/USERNAME/.wine/drive_c/Program Files (x86)/Vstplugins/' WINE_RT=15 WINE_SVRT=10 vsthost 'Piapro*Studio*VSTi.dll'
```

`USERNAME`のところは適切に書き換えてください．
上記コマンドで実行できますが，デスクトップエントリも作っておきましょう．以下のファイル`~/.local/share/applications/PiaproStudio.desktop`を作成すると，アプリケーションを検索できるようになります．

``` :~/.local/share/applications/PiaproStudio.desktop
[Desktop Entry]
Name=Piapro Studio
GenericName=Piapro Studio VSTi
Comment=VOCALOID4 Editor  
Exec=env WINEPREFIX=env WINEPREFIX=/home/USERNAME/.wine VST_PATH='/home/USERNAME/.wine/drive_c/Program Files (x86)/Vstplugins/' WINE_RT=15 WINE_SVRT=10 vsthost 'Piapro*Studio*VSTi.dll'
Icon=/home/USERNAME/.wine/drive_c/Program Files (x86)/Crypton/Piapro Studio VSTi/Data/images/icon/notification/PPS48.png
Terminal=false
Type=Application
Categories=AudioVideo;   
```

# ハマった箇所

この章は読み飛ばしてもらって構いません．

<details><summary>主に64bitか32bitかでハマりました</summary><div>

主に64bitか32bitかでハマりました．`apt`でインストールするときに`:i386`をつけると32bitバージョンがインストールできるようです．また，`apt`で64bitバージョンと32bitバージョンを同時にインストールしようとすると片方が削除されてしまいます．

まず，`.h: No such file or directory`というエラーは必要なライブラリをインストールしていないことによるものでした．

`m32`をつけて32bitで`.o`ファイルを作ったのに64bitでリンクしようとすると以下のようなエラーが出ました．

```
ld: 形式 elf32-i386 (/usr/lib/i386-linux-gnu/wine/libwinecrt0.a(exe_entry.o)) から形式 elf64-x86-64 (dssi-vst-scanner.iGjSnK.o) への再配置を伴う再配置可能リンクはサポートされていません
```

`sudo apt install wine32-tools`をしないと以下のようなエラーが出ます．64bitバージョンがインストールされているときも同じようになりました．

```
wineg++ -m64 dssi-vst-scanner.wine.o libremoteplugin.wine.a -m64 -L/lib/x86_64-linux-gnu -L/usr/lib -L/usr/lib/wine -L/usr/lib/x86_64-linux-gnu/wine -lpthread -lrt -lz  -o dssi-vst-scanner.exe
/usr/bin/ld: -ladvapi32 が見つかりません
/usr/bin/ld: -luser32 が見つかりません
/usr/bin/ld: -lwinecrt0 が見つかりません
/usr/bin/ld: -lkernel32 が見つかりません
/usr/bin/ld: -lntdll が見つかりません
/usr/bin/ld: -lwine が見つかりません
collect2: error: ld returned 1 exit status

```

`sudo apt install libjack-dev`で64bitのlibjackをインストールすると，以下のようなエラーが出ました．

```
wineg++ -m32 dssi-vst-server.wine.o libremoteplugin.wine.a -m32 -L/lib/i386-linux-gnu -L/usr/lib32 -L/usr/lib32/wine -L/usr/lib/i386-linux-gnu/wine -lpthread -lrt -lz  -ljack -o dssi-vst-server.exe
/usr/bin/ld: 互換性のないを //usr/lib/x86_64-linux-gnu/libjack.so スキップしました (-ljack を探索している時)
/usr/bin/ld: 互換性のないを //usr/lib/x86_64-linux-gnu/libjack.a スキップしました (-ljack を探索している時)
/usr/bin/ld: -ljack が見つかりません
collect2: error: ld returned 1 exit status
```


かと言って，`sudo apt install libjack-dev:i386`で32bitのlibjackをインストールすると，以下のようなエラーが出ます．

```
No package 'jack' found
g++ remotevstclient.o vsthost.o libremoteplugin.unix.a  -lpthread -lrt -lz  -o vsthost
vsthost.o: 関数 `jackProcess(unsigned int, void*)' 内:
vsthost.cpp:(.text+0x94): `jack_port_get_buffer' に対する定義されていない参照です
```

32bitのライブラリを残しつつ，64bitライブラリをインストールすることで解決できました．

**VSTホスト** で **FST(FreeST)** というのも代表的なのですが，コンパイルできませんでした．これも32bitのglibがないのが原因と思われます．必要そうなライブラリをインストールしてコンパイルすると，以下のようなエラーが出ました．

```
/usr/include/glib-2.0/glib/gmacros.h:142:29: error: size of array ‘_GStaticAssertCompileTimeAssertion_0’ is negative
```
</div></details>

# 終わりに
これで，Linux上でVOCALOIDが歌ってくれます．DAWと同期する方法は現在模索中です．

# 参考
[WineHQ: Applications by Yamaha](https://appdb.winehq.org/objectManager.php?bIsQueue=false&bIsRejected=false&sClass=vendor&iId=197&sAction=view&sTitle=View+Developer)
[dssi-vst](https://breakfastquay.com/dssi-vst/)
[GitHub: falkTX/dssi-vst](https://github.com/falkTX/dssi-vst)
[雑メモ: dssi-vst のインストール（Ubuntu Studio 8.04）](http://haraita9283.blog98.fc2.com/blog-entry-267.html)