【Linuxで音ゲーを実行#5】WineHQでMIDI出力アプリがフリーズ/音が出なかった

Ubuntu Studio 20.04 や Linux Mint 20.3でWindowsのアプリ「Music Studio Producer」と「Synthesia」を使って音ゲーで遊ぼうと思いました。WineHQ7.0でそれらを実行しようとしましたが、「Music Studio Producer」は操作中にフリーズ、「Synthesia」は音が出ません。FluidSynth/TiMidity++の設定をすることでうまく動きました。

:::note warn
TiMidityが（カーネルとして）常駐するとALSAを専有してしまいPulseAudioが機能しなくなります。
:::

# 短く言うと

:::note info
「WineHQ(Windowsアプリ)」→「FluidSynth/TiMidity++」→「PulseAudio」→「ALSA」→
「内部スピーカーからMIDI発音」
となるように設定します。
:::
***
:::note info
Ubuntu Studio 20.04.3 では以下のように操作するとWineHQでMIDIが鳴ります。
:::

FluidSynthをインストール済なので以下のコマンドで起動/設定します(ログイン毎に入力)。

```:Terminal
fluidsynth -l -s -i -aalsa -o audio.alsa.device=default /usr/share/sounds/sf2/FluidR3_GM.sf2
```

***

:::note info
Linux Mint 20.x では以下のように操作するとWineHQでMIDIが鳴ります。
:::

TiMidity++をインストールします。

```:Terminal
sudo apt install -y timidity
```

(カーネル起動にならないよう)ユーザーがログインするたびに以下のコマンドを使うと、TiMidity++がデーモンモードで起動しMIDIが鳴ります。

```
timidity -iAD -B2,8 -Os1l -A100 -s 44100 -x'soundfont /usr/share/sounds/sf2/default-GM.sf2 order=1'
```

:::note info
ログイン毎にコマンド入力するのが面倒な場合はシェルスクリプトにして自動的に起動できるようにすると良いでしょう。
:::

以上でWineHQはMIDIデータをFluidSynth/TiMidityへ出力します。また、FluidSynth/TiMidityのMIDI音源とその他アプリの音源はPulseAudioでMIXされるので、あらゆる音源がスピーカーから再生されます。

＜＜前の記事　[【Linuxで音ゲーを実行#4】楽譜作成アプリがMIDIキーボードを認識しなかった/音が出なかった][11]

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

[【Linuxで音ゲーを実行#6】]　次の記事＞＞


# はじめに

LinuxでWindowsの音ゲーアプリを使うために、まずWineHQをインストールしました([【WineHQ】Linux Mint 20.3とUbuntu Studio 20.04にターミナルでWineHQをインストール/日本語表示][21])。しかしこれだけだとMIDIが鳴りません。そこで、「MIDI-WineHQ Wiki」に従いFluidSynth/TiMidity++を起動/設定しました。結果、MIDIを鳴らすことはできましたが、いろいろと不便なのでシェルスクリプトを使って起動を自動化します。

[21]: https://qiita.com/johnnystg/items/fc386b786e5f58a4f0e8

※この記事は[【Linuxで音ゲーを実行】][22]の5番目の記事です。

[22]: https://qiita.com/johnnystg/items/b113e1794bfda040cd83

# 今回の環境

- NEC LaVie LS350/A
- Ubuntu Studio 20.04.3
    - ALSA
    - PulseAudio
    - FluidSynthがインストール済
- Linux Mint 20.3 Cinnamon
    - ALSA
    - PulseAudio
    - TiMidity++[^31]を新規にインストールする

[^31]: TiMidity++（ティミディティプラスプラス）は、MIDIファイルをPCM音声（WAVファイル等）に変換し、ファイルに保存したり、リアルタイムに出力するためのソフトウェアである。一般的にはTimidityと呼ばれている。 https://ja.wikipedia.org/wiki/TiMidity%2B%2B


# 「MIDI-WineHQ Wiki」を参考にしてMIDI設定

:::note info
Wineが出力したMIDIデータをLinuxのサウンドシステムで受け入れられるように設定していきます。
:::

[MIDI-WineHQ Wiki][31]によると、

[31]: https://wiki.winehq.org/MIDI


「もしMIDIが鳴らないとしても(__Wineに問題は無いので__)、バグトラッカーに書き込む意味がありません。[^32]」ということなので、以下、「MIDI-WineHQ Wiki」に従いOS側でMIDIの設定をしていきます。

[^32]: There is no point in writing to the Wine bug tracker if MIDI does not work on your UNIX system. 

## サウンドシステムの初期設定を確認


Ubuntu/Linux Mint側の設定を確認します。まずは、以下のコマンドでALSAが認識しているMIDI出力ポートを一覧表示します。

```:Terminal
aconnect -o
```
```
client 14: 'Midi Through' [type=カーネル]
    0 'Midi Through Port-0'
```


「'MIDI Through'は、専用のMIDIハードウェアがない限り役に立ちません。（おそらく）__HWが接続されていないシリアルポートにMIDIデータを送信するため、音楽は聞こえません。__[^41]」

[^41]: MIDI through is of no use to you unless you have dedicated MIDI hardware. It (presumably) sends bytes down the serial port where you have no HW connected, so you hear no music. 


「MIDI-WineHQ Wiki」からは離れますが、以下のコマンドでサウンドシステムの状態がわかります。

```:Terminal
sudo fuser -v /dev/snd/*
```
```
                     USER        PID ACCESS COMMAND
/dev/snd/controlC0:  piano      1409 F.... pulseaudio
/dev/snd/pcmC0D0p:   piano      1409 F...m pulseaudio
```

ユーザーが(ログイン時に自動で)PulseAudioを立ち上げたことがわかります。

## Ubuntu Studio 20.04.3の場合

:::note info
FluidSynthをインストール済なのでターミナルで起動/設定すれば、WineHQからMIDIが鳴ります。
:::

WineHQを起動する前に以下のコマンドを入力してFluidSynthとサウンドフォントをあらかじめ起動しておきます[^51] / [^52]。　
※なお、「MIDI-WineHQ Wiki」に記述してある場所にはサウンドフォントが存在しないので変更しました。

[^51]: Software sequencers like Timidity and FluidSynth : Installing Timidity or FluidSynth is not enough. These software synthesizers need digitized sound sample collections (called patches and soundfonts) to produce anything but silence. Depending on your package management and package dependencies, you may need to additionally install one of these or configure the software to use your soundfonts. Freepats and Unison are examples of such patch collections. 


[^52]: TimidityやFluidSynthなどのソフトウェアシーケンサー：TimidityまたはFluidSynthをインストールするだけでは不十分です。これらのソフトウェアシンセサイザーは、無音以外のものを生成するために、デジタル化されたサウンドサンプルコレクション（パッチおよびサウンドフォントと呼ばれる）を必要とします。パッケージ管理とパッケージの依存関係によっては、これらのいずれかを追加でインストールするか、サウンドフォントを使用するようにソフトウェアを構成する必要がある場合があります。FreepatsとUnisonは、そのようなパッチコレクションの例です。

~~$ fluidsynth -l -s -i -aalsa -o audio.alsa.device=default /usr/share/midi/sf2/mypatches.sf2~~

```:Terminal
fluidsynth -l -s -i -aalsa -o audio.alsa.device=default /usr/share/sounds/sf2/FluidR3_GM.sf2
```

続いて、ALSAが認識しているMIDI出力ポートを一覧表示します。

```:Terminal
aconnect -o
```
```
client 14: 'Midi Through' [type=カーネル]
    0 'Midi Through Port-0'
client 128: 'FLUID Synth (2789)' [type=ユーザ,pid=2789]
    0 'Synth input port (2789:0)'
```

FluidSynthを受け入れています。
またサウンドシステムの状態を確認します。

```:Terminal
sudo fuser -v /dev/snd/*
```
```
                     USER        PID ACCESS COMMAND
/dev/snd/controlC0:  piano      1409 F.... pulseaudio
/dev/snd/pcmC0D0p:   piano      1409 F...m pulseaudio
/dev/snd/seq:        piano      2789 f.... fluidsynth
```
ユーザーがFluidSynthを起動したことがわかります。
また、MIDIと他音源を同時に鳴らすことができる[^53] ので

[^53]: 複数の音源をMIXできるのがPulseAudioの特徴。例えば「youtubeを再生しながらSynthesiaで演奏する」ことができる。

__→FluidSynth→（ALSAを偽装した）PulseAudio→ALSA→__
となっているはずです。

FluidSynthを終了したいときはプロセス番号(PID)がわかっているので以下のコマンドとなります。

```:Terminal
kill プロセス番号(PID)
```

## Linux Mint 20.3 Cinnamon の場合

:::note info
TiMidity++をインストールしたのち、MIDIを受け入れられるように設定します。
:::

alsa-utilsがインストールされているか確認します。

```:Terminal
apt list --installed | grep alsa-utils
```
```
alsa-utils/focal-updates,now 1.2.2-1ubuntu2.1 amd64 [インストール済み]
```

alsa-utilsはデフォルトでインストール済です。次にTiMidity++について調べます。


```:Terminal
apt list --installed | grep timi
```

TiMidity++は無いのでインストールします。

```:Terminal
sudo apt install timidity
```
```
[sudo] ＊＊＊ のパスワード:         
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  fluid-soundfont-gm
提案パッケージ:
  fluid-soundfont-gs fluidsynth freepats pmidi timidity-daemon
以下のパッケージが新たにインストールされます:
  fluid-soundfont-gm timidity
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
120 MB のアーカイブを取得する必要があります。
この操作後に追加で 150 MB のディスク容量が消費されます。
続行しますか? [Y/n] Y
```

「fluid-soundfont-gm」と「timidity」をインストールします。提案パッケージについては今回は先送りします（timidity-daemonはインストールしないほうが良い）。


WineHQを起動する前に以下のコマンドを入力してTiMidity++を起動/設定します[^51] / [^52]。
※なお、「MIDI-WineHQ Wiki」に記述してある場所にはサウンドフォントが存在しないので変更しました。

~~$ timidity -iAD -B2,8 -Os1l -s 44100 -x'soundfont /usr/share/midi/sf2/mypatches.sf2 order=1'~~


```:Terminal
timidity -iAD -B2,8 -Os1l -A100 -s 44100 -x'soundfont /usr/share/sounds/sf2/default-GM.sf2 order=1'
```

続いて、ALSAが認識しているMIDI出力ポートを一覧表示します。

```:Terminal
aconnect -o
```
```
client 14: 'Midi Through' [type=カーネル]
    0 'Midi Through Port-0'
client 128: 'TiMidity' [type=ユーザ,pid=7183]
    0 'TiMidity port 0 '
    1 'TiMidity port 1 '
    2 'TiMidity port 2 '
    3 'TiMidity port 3 '
```

TiMidity++を受け入れています。
またサウンドシステムの状態を確認します。

```:Terminal
sudo fuser -v /dev/snd/*
```
```
                     USER       PID ACCESS COMMAND
/dev/snd/controlC0:  piano     1055 F.... pulseaudio
/dev/snd/pcmC0D0p:   piano     1055 F...m pulseaudio
/dev/snd/seq:        piano     7183 F.... timidity
```

ユーザーがTiMidity++を起動したことがわかります。
また、MIDIと他音源を同時に鳴らすことができる[^53]ので


__→「TiMidity++」→「（ALSAを偽装した）PulseAudio」→「ALSA」→__
となっているはずです。

TiMidity++を終了したいときはプロセス番号(PID)がわかっているので以下のコマンドとなります。

```:Terminal
kill プロセス番号(PID)
```

WineHQからMIDI音が鳴ることを確認できたら、「midi4wine.sh」（仮名）を作成しておくと起動が楽になります。

## 設定からわかること

:::note warn
Ubuntuの初期設定では、音声出力用ハードウェアが接続されていないシリアルポートにMIDIデータを送信するため、音楽は聞こえません。
:::
:::note warn
Ubuntuの初期設定では、TiMidity++とPulseAudioを同時に使うことはできません//MIDI音源と他の音源を同時に鳴らすことはできません。
:::
***

PusleAudio と TiMidity++　、ALSAの振る舞いについて確認します。

:::note warn
Ubuntuの初期設定では、音声出力用ハードウェアが接続されていないシリアルポートにMIDIデータを送信するため、音楽は聞こえません。
:::

前述したとおり、OSインストール直後の状態は以下の2つのコマンドでわかります。1つめは、

```:Terminal
aconnect -o
```
```
client 14: 'Midi Through' [type=カーネル]
    0 'Midi Through Port-0'
```

ALSAが認識している出力は'Midi Through Port-0'となっています。

「'MIDI Through'は、専用のMIDIハードウェアがない限り役に立ちません。（おそらく）HWが接続されていないシリアルポートにMIDIデータを送信するため、音楽は聞こえません。[^41]」
実際のところ、初期設定のまま(WineHQ経由で)Synthesiaを起動するとMIDI音が出ませんでした。さらに、Music Studio Producerはフリーズしてしまいました。

:::note warn
Ubuntuの初期設定では、TiMidity++とPulseAudioを同時に使うことはできません//MIDI音源と他の音源を同時に鳴らすことはできません。
:::

2つめのコマンドをつかうと、

```:Terminal
sudo fuser -v /dev/snd/*
```
```
                     USER        PID ACCESS COMMAND
/dev/snd/controlC0:  piano      1409 F.... pulseaudio
/dev/snd/pcmC0D0p:   piano      1409 F...m pulseaudio
```
PulseAudioが立ち上がっています。

「PulseAudioを導入しているUbuntuの古いバージョンでは、最初にALSAを使用し始めたアプリケーションは、他のアプリケーションがそれにアクセスできなくなります。たとえば、PulseAudioを使用するアプリケーションは、Timidityがサウンドを生成するのを防ぎます。逆に、MIDIファイルを再生するとPulseAudioが機能しなくなります。[^71]」

[^71]: Ubuntu : ?? (please check) / In older versions of Ubuntu introducing PulseAudio, whatever application started using ALSA first would prevent the others from accessing it. For instance, any application using PulseAudio would prevent Timidity from producing sound. Conversely, playing a MIDI file would prevent PulseAudio from working.

一般的な音源では以下のサウンドシステムが使われています。しかし、WineHQがMIDIデータを発すると（WineHQはALSAにそれを渡そうとするので）PulseAudioが機能しなくなり、

~~「一般的な音源→PulseAudio→ALSA→スピーカー~~[^72]

[^72]: 単純化してあります。以下同じ

MIDIデータは次のように受け渡され、

__「WineHQ(MIDI)→ALSA→Midi Through（MIDI出力シリアルポート）→×__


MIDIデータの出力先が無いのでMIDIが鳴らないうえに、PulseAudioが使えなくなったことでほかの音源も鳴らなくなります。

:::note info
ユーザーがログイン後にTiMidity++を起動するとPulseAudioがMIDIと他音源の両方を受け付けます。
:::

ユーザーがログイン後に以下のコマンドを使ってTiMidity++をデーモンモード起動する（TiMidity starting in ALSA server mode）と、

```:Terminal
timidity -iAD -B2,8 -Os1l -A100 -s 44100 -x'soundfont /usr/share/sounds/sf2/default-GM.sf2 order=1'
```

TiMidityは以下のように（PulseAudioも機能したまま）接続されます。

__「WineHQ(MIDI)→TiMidity→(ALSAに偽装した)PulseAudio※→ALSA→スピーカー」__
「一般的な音源→PulseAudio※→ALSA→スピーカー」

※PulseAudioはMIDIと他音源をMIXしてALSAに渡す。

:::note alert
timidity-daemonを使用する//timidityをユーザーログイン前に起動するとTiMidity++がALSAを占有してPulseAudioが使えなくなります。
:::

ちなみに、timidity-daemonを使用する//TiMidity++をカーネルの一部としてシステムに常駐させると

__「WineHQ(MIDI)→TiMidity→ALSA→スピーカー」__

となります。TiMidity++がALSAを占有してしまい、PulseAudioが機能しなくなります。
：MIDIは鳴る
：他音源は鳴らない

# シェルスクリプトを使ってみる

:::note info
TiMidity++を使ってWineHQからMIDIを鳴らすには以下のスクリプトを使います。
:::

:::note warn
FluidSynthはJACKに接続することが推奨されています。この方法はおすすめできません。また、FluidSynthで動作させることはできますが細かいところで違和感があります。
:::

Fedoraに関する文書>>ミュージシャンのガイド>>「10.4.3. JACK の出力を設定する」によれば __FluidSynthについて「おすすめの方法は、合成された音声を JACK に出力することです。」__[^81]とのことで、FluidSynthを使うのはJACKと組み合わせてrosegadenやLMMSなどDTMや作曲編曲を行う時が良さそうです。

[^81]: https://docs.fedoraproject.org/ja-JP/Fedora/17/html/Musicians_Guide/sect-Musicians_Guide-FluidSynth-Configuring-JACK_Output.html

今回はSMFのformat形式を変更する（Music Studio Producer）こと、音ゲーで遊ぶ（Synthesia）ことが目的ですからTiMidity++をPulseAudioと組み合わせて使います。

WineHQでMIDIを鳴らすコマンドをシェルスクリプトにしてみます。[「サービス・プロセスの起動確認するシェルスクリプト」][81]をお借りして、

__TiMidity++が起動していなかったら→起動する__

スクリプトにします。たとえばホームディレクトリで以下のコマンドを使うかテキストエディタを使い「midi4wine.sh」ファイルを作成します。

[81]: https://ex1.m-yabe.com/archives/3263

```:Terminal
vi midi4wine.sh 
```
```
#!/bin/bash

ProcessName=timidity

# timidity++が起動していない→起動 / 起動している→そのまま次に進む

count=`ps -ef | grep $ProcessName | grep -v grep | wc -l`
if [ $count = 0 ]; then
  echo "!!!!!!!!!!!!!!!!!"
  echo "$ProcessName is dead."
  echo "!!!!!!!!!!!!!!!!!"
  timidity -iAD -B2,8 -Os1l -A100 -s 44100 -x'soundfont /usr/share/sounds/sf2/default-GM.sf2 order=1'
#  timidity -iAD -B2,8 -Os1l -A800,100a -s 44100 -x'soundfont /usr/share/sounds/sf2/default-GM.sf2 order=1'
#  fluidsynth -l -s -i -aalsa -o audio.alsa.device=default /usr/share/sounds/sf2/FluidR3_GM.sf2

else
  echo "$ProcessName is alive."
fi

# 3秒待つ（timidityが起動するのを待つ）

sleep 3

# サウンドシステムの状況を確認する

echo ""
echo "$ aconnect -o"
aconnect -o

echo ""
echo "$ sudo fuser -v /dev/snd/*"
sudo fuser -v /dev/snd/*
```

シェルスクリプトを実行できるようにパーミッションを変更します。

```:Terminal
chmod 755 midi4wine.sh 
```

シェルスクリプトがうまく動作するか確認します。

```:Terminal
sh midi4wine.sh 
```



# おわりに

この記事を完成させて何度か動作確認をしました。わたしの感覚では、Ubuntu StudioにTiMidity++をインストールしてFluidSynthとTiMidity++を併用するのが便利なようです。

__FluidSynth：JACKが必要なMIDIアプリを使う場合__
__TiMidity++：WineHQを使ってWindows版MIDIアプリを使う場合__
※Linux Mint ではMIDIを扱わない

と使い分けるとすっきりします。

＜＜前の記事　[【Linuxで音ゲーを実行#4】楽譜作成アプリがMIDIキーボードを認識しなかった/音が出なかった][101]

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

[【Linuxで音ゲーを実行#6】]　次の記事＞＞

# 参考サイト

https://wiki.winehq.org/MIDI

https://qiita.com/yakitatata/items/a3070b13982999631d0e

https://marmooo.blogspot.com/2019/10/winehq-linux.html

https://twsynth.osdn.jp/

https://takaashi-school-pc.blogspot.com/2018/04/pulseaudiotimidity.html

https://azaharblanca.blogspot.com/2019/07/timidity-daemon.html

https://wiki.archlinux.jp/index.php/Timidity%2B%2B

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0149

https://qiita.com/nanbuwks/items/9bcdbaaa0275c52f7d99

https://browncat.at.webry.info/202109/article_2.html

https://yng.hatenablog.jp/entry/2015/05/26/234737

https://ex1.m-yabe.com/archives/3263

https://man.archlinux.org/man/timidity.1