【Linuxで音ゲーを実行#0】MIDI音を出す設定に苦労したらサウンドシステム全体が見えてきた話

Linux Mint 20.3とMIDIキーボードで音ゲー(「Chordana play」や「Synthesia」)を使って演奏練習しようと思いました。MIDI環境を整えるのにとても手間がかかりました。PCのスピーカーからMIDI音を出すには「ボリュームがたくさんあるのでミュートになっていないかチェックする」「複雑な入出力接続を整える」必要があるようです。

# 短く言うと

:::note warn
LinuxでMIDI環境を整えるのはとてもたいへんです！「MIDIデバイス/アプリ→アプリ→アプリ→アプリ→スピーカー」なので各アプリの設定をしなければなりません。
:::

:::note info
Linux初心者でもMIDIキーボードを使って音を出すことができました。
:::

:::note info
ubuntu studioを使えば設定が楽になります（しかし非力なノートPCだとOS/アプリの起動時間が倍くらいになります）。
:::

Linux Mintで音ゲーを楽しむために以下の作業をしました。

* ALSAとPulse Audioのステータスを確認しALSAのミュートを解除した
　[【Linuxで音ゲーを実行#1】Linux Mintをインストールしたらヘッドホンから音が出なかった][1]

[1]:https://qiita.com/johnnystg/items/62ea57bd2c487a17000f

* JACKとFluidSynthをインストールしてMIDI音を出した
* Pulse AudioとJACKを共存させた
* musescoreで楽譜を作成した
　[【Linuxで音ゲーを実行#4】楽譜作成アプリがMIDIキーボードを認識しなかった/音が出なかった][4]

[4]:https://qiita.com/johnnystg/items/6c8828120502aadec591

* WineHQでMIDIを再生できるようにした
　[【Linuxで音ゲーを実行#5】WineHQでMIDI出力アプリがフリーズ/音が出なかった][5]

[5]:https://qiita.com/johnnystg/items/891ad5e9d85627b37a8e


* Windowsアプリ「Music Studio Producer」にてMIDIファイルの形式をformat1からformat0に変更した
* Androidアプリ「Chordana Play」やWindowsアプリ「Symthesia」で遊んだ

# はじめに

MIDIキーボードを使って音ゲーで遊びたいと思いました。カシオトーンLK-S250(CT-S200同等)を買ったものの演奏経験が無くもちろん楽譜も読めません。以下の動画のようにノリノリでバリバリ練習するつもりだったのですが、練習用に準備されている楽曲が難しすぎて上達する気がしません。

https://www.youtube.com/watch?v=8bOmtfAgShU

そこで、幼児向けピアノ教室がおすすめしているような「ドレミファソだけで演奏できる曲」のMIDIファイルを自分で用意して、Linux MintなPCとMIDIキーボードで音ゲーを遊んでみようと思いました。すると、

- そもそもヘッドホンから音が出ない
- PCとMIDIキーボードを繋いでもMIDI音が出ない
- MIDI音が出たと思ったらyoutubeなどのアプリから音が出ない
- 楽譜作成アプリがMIDIキーボードを認識しない/音が出ない
- WineHQでMIDI出力するアプリがフリーズする/音が出ない
- 音ゲーアプリが標準MIDIファイル(SMF)を正しく認識しない

と、音ゲー/演奏練習のまえに解決することがたくさんありました。それぞれ原因を調べて解決策を学んだのでまとめます。


# 今回の環境

- NEC LaVie LS350/A(物理サウンドデバイスとして内蔵スピーカーなど)
- LK-S250 | Casiotone Keyboard | と Akai professional MPK mini mk2
- Linux Mint 20.3 Cinnamon または Ubuntu Studio 20.04.3
    - ALSA（インストール済）
    - PulseAudio（インストール済）
    - FluidSynth（Ubuntu Studio のみインストール済）
    - JACK（Ubuntu Studio のみインストール済）

# とにかく音が出ない問題

:::note warn
ALSAとPulse Audioをアプリケーションとして扱います(本来は「カーネルモジュール/ライブラリ」と「サウンドサーバ」)
:::

## スピーカーからは出るのにヘッドホンからは出ない

もともとWindows7がバンドルされていたNEC LaVie LS350/Aで音ゲーをしようと思いLinux Mintを入れ直しました。するとヘッドホンから音が出ませんでした。Windows7のときは音が出ていましたから、Linuxの設定に問題がありそうでした。

原因は、debian系OSではよくある症状のようで、(Pulse Audioは出力しているのに)ALSAがヘッドホンをミュートしていたからでした。次のように情報を受け渡す途中(ユーザーには見えないところ)で情報が途絶えてしまったようです。

__「音声再生アプリ→Pulse Audio→ALSA→音声出力デバイス」__[^1]

[^1]: 単純化してあります。たとえばALSAはサウンドカードに出力しますが省略しました。

そこで以下のコマンドでALSAのボリュームコントロールを呼び出しミュートを解除しました。

```:Terminal
$alsamixer
```

## PCにMIDIキーボードを接続しても演奏できない

Linux MintなPCにMIDIキーボードを接続してもそれだけでは演奏できませんでした。PulseAudioは親切設計でとても優秀ですがMIDIデータを自動で受け取ることができないからのようです。演奏するには（Pulse Audioをあきらめて）次のように情報の受け渡しをするのが良いようです。

__「MIDIキーボード→FluidSynth→JACK→ALSA→音声出力デバイス」__[^1]

Linux MintにはFluidSynthとJACKが内蔵されていないのでキーボードを接続するだけでは演奏できません。まず、これらをインストールしたうえでFluidSynthにサウンドフォントをインストールします。さらに、JACKにてそれぞれが橋渡しできるようにコネクトします。

## 今度はyoutubeやVLCから音が出なくなった

MIDIキーボードで演奏できるようになったらyoutubeやVLCといった音声再生アプリから音が出なくなりました。ALSAは入力がひとつのため、Pulse AudioかJACKのどちらかからしか入力を受け付けられないようです。

そこで、次のようにPulse Audioの出力先をALSAからJACKに変更します。これでALSAから見るとJACKのみから入力を受ければ良いことになります。

__「音声再生アプリ→Pulse Audio→JACK→ALSA→音声出力デバイス」__[^1]

__「MIDIキーボード→FluidSynth→JACK→ALSA→音声出力デバイス」__[^1]

具体的には次のようにインストール/設定すること[^2]でPulse AudioとJACKが併用できます。

[^2]: https://poor-user.blogspot.com/2015/11/jack-install.html

```:Terminal
$sudo apt install qjackctl pulseaudio-module-jack vlc-plugin-jack
```

```:Terminal
$sudo vi /etc/pulse/default.pa
```

45行目辺りに追加します。

> \##### add this lines for pulseaudio-module-jack
> load-module module-jack-sink
> load-module module-jack-source

```:Terminal
$ killall pulseaudio PulseAudio
```


## 楽譜作成アプリがMIDIキーボードを認識しない/音が出ない

楽譜作成アプリがMIDIキーボードを認識してくれれば音符の入力がとても楽になりますが、認識してくれませんでした。これはmusescoreのバージョンを下げることで解決しました。


# 標準MIDIファイル(SMF)を正しく認識しない問題

musescoreで「ピアノ用楽譜」を作成しSMFファイルにエクスポートするとトラック1＝右手、トラック2＝左手と割り当てられます。しかし、これを音ゲーアプリに読み込ませるとトラックの情報が失われ「片手で10本の指を駆使して」演奏しなければなりません。

原因を探っていくと、MIDI作成アプリではSMFファイルをformat1形式で出力するのに対し音ゲーアプリはformat0形式しか読み込めないことが問題のようです。2022年現在、format1形式が主流のためMIDI作成アプリでは(format形式を選択できることは稀で)ユーザーは特に意識すること無くformat1形式を扱うことになります。

フォーマット形式を選択できるアプリが殆ど無い中Windowsアプリケーションの「Music Studio Producer」はformat0形式でSMFファイルを保存できます。これで__「チャンネル1＝左手、チャンネル2＝右手」__に設定してformat0形式のSMFファイルを作成します。

このSMFファイルをAndroid版「Chordana play」やWindows版「Synthesia」に読み込ませるとキーボード演奏の練習ができます。

※「着メロ」用のSMFファイルがformat0形式だったため、2010年ころまではフォーマット形式を変換するアプリなどが多数存在したようです。


# OSをubuntu studioにすると設定が(少し)楽になる

上記の通り、LinuxでMIDIを扱おうとするとアプリケーションをいくつかインストールしたうえで

__「デバイス/アプリ→アプリ→アプリ→アプリ→スピーカー」__

の橋渡しの多くをユーザーが設定しなければなりません。

ubuntu studioはマルチメディア編集環境に特化してあるとのことなので「JACK」や「FluidSynth」などがあらかじめインストールされているだけでなくそれらのGUIも充実しています。MIDI環境を設定するのが比較的ラクになります。
しかし、ユーザーに優しいだけにOSとしてはとても重く非力なノートパソコンでは、ubuntu studio 20.04 xfceをLinux Mint 20.3 Cinnamonと比較するとOS起動時間/アプリ起動時間ともに倍くらいよけいにかかります。また、JACKは低レイテンシでCPU負荷も大きいそうです。私は音ゲーがしたいだけなのでオーバースペックな気がします。

そこでOSをデュアルブートにして、

* Linux Mint →　自宅設置サーバーのクライアントPCとして
* ubuntu studio →　MIDI環境を構築して楽譜作成や音ゲー用として

使い分けることにしました。

私は音楽をカジュアルに楽しみたいので普段は親切設計のPulse Audioを使い、必要なときだけこだわりのJACKを使うのが身の丈に合っていそうです。

# 参考サイト

https://endy-tech.hatenablog.jp/entry/linux_sound_troubleshooting#%E5%8F%82%E8%80%83-%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E4%B8%8D%E5%85%B7%E5%90%88%E5%8E%9F%E5%9B%A0%E3%81%A8%E3%81%97%E3%81%A6%E8%80%83%E3%81%88%E3%82%89%E3%82%8C%E3%82%8B%E3%82%82%E3%81%AE

https://mickey-happygolucky.hatenablog.com/entry/2015/04/04/105512

https://taiyakisun.hatenablog.com/entry/20150902/1441214819

https://poor-user.blogspot.com/2015/11/jack-install.html

https://timelessberry.com/column/dtm/dtm1jack.html

http://www13.plala.or.jp/kymats/study/MULTIMEDIA/midiStream_format.html