Ubuntu Studio 20.04 や Linux Mint 20.3でWindowsのアプリ「Music Studio Producer」と「Synthesia」を使って音ゲーで遊ぼうと思いました。WineHQ7.0でそれらを実行しようとしましたが、「Music Studio Producer」は操作中にフリーズ、「Synthesia」は音が出ません。FluidSynth/TiMidity++の設定をすることでうまく動きました。
TiMidityが(カーネルとして)常駐するとALSAを専有してしまいPulseAudioが機能しなくなります。
短く言うと
「WineHQ(Windowsアプリ)」→「FluidSynth/TiMidity++」→「PulseAudio」→「ALSA」→
「内部スピーカーからMIDI発音」
となるように設定します。
Ubuntu Studio 20.04.3 では以下のように操作するとWineHQでMIDIが鳴ります。
FluidSynthをインストール済なので以下のコマンドで起動/設定します(ログイン毎に入力)。
fluidsynth -l -s -i -aalsa -o audio.alsa.device=default /usr/share/sounds/sf2/FluidR3_GM.sf2
Linux Mint 20.x では以下のように操作するとWineHQでMIDIが鳴ります。
TiMidity++をインストールします。
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'
ログイン毎にコマンド入力するのが面倒な場合はシェルスクリプトにして自動的に起動できるようにすると良いでしょう。
以上でWineHQはMIDIデータをFluidSynth/TiMidityへ出力します。また、FluidSynth/TiMidityのMIDI音源とその他アプリの音源はPulseAudioでMIXされるので、あらゆる音源がスピーカーから再生されます。
<<前の記事 【Linuxで音ゲーを実行#4】楽譜作成アプリがMIDIキーボードを認識しなかった/音が出なかった
[【Linuxで音ゲーを実行#6】] 次の記事>>
はじめに
LinuxでWindowsの音ゲーアプリを使うために、まずWineHQをインストールしました(【WineHQ】Linux Mint 20.3とUbuntu Studio 20.04にターミナルでWineHQをインストール/日本語表示)。しかしこれだけだとMIDIが鳴りません。そこで、「MIDI-WineHQ Wiki」に従いFluidSynth/TiMidity++を起動/設定しました。結果、MIDIを鳴らすことはできましたが、いろいろと不便なのでシェルスクリプトを使って起動を自動化します。
※この記事は【Linuxで音ゲーを実行】の5番目の記事です。
今回の環境
- NEC LaVie LS350/A
- Ubuntu Studio 20.04.3
- ALSA
- PulseAudio
- FluidSynthがインストール済
- Linux Mint 20.3 Cinnamon
- ALSA
- PulseAudio
- TiMidity++1を新規にインストールする
「MIDI-WineHQ Wiki」を参考にしてMIDI設定
Wineが出力したMIDIデータをLinuxのサウンドシステムで受け入れられるように設定していきます。
MIDI-WineHQ Wikiによると、
「もしMIDIが鳴らないとしても(Wineに問題は無いので)、バグトラッカーに書き込む意味がありません。2」ということなので、以下、「MIDI-WineHQ Wiki」に従いOS側でMIDIの設定をしていきます。
サウンドシステムの初期設定を確認
Ubuntu/Linux Mint側の設定を確認します。まずは、以下のコマンドでALSAが認識しているMIDI出力ポートを一覧表示します。
aconnect -o
client 14: 'Midi Through' [type=カーネル]
0 'Midi Through Port-0'
「'MIDI Through'は、専用のMIDIハードウェアがない限り役に立ちません。(おそらく)HWが接続されていないシリアルポートにMIDIデータを送信するため、音楽は聞こえません。3」
「MIDI-WineHQ Wiki」からは離れますが、以下のコマンドでサウンドシステムの状態がわかります。
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の場合
FluidSynthをインストール済なのでターミナルで起動/設定すれば、WineHQからMIDIが鳴ります。
WineHQを起動する前に以下のコマンドを入力してFluidSynthとサウンドフォントをあらかじめ起動しておきます4 / 5。
※なお、「MIDI-WineHQ Wiki」に記述してある場所にはサウンドフォントが存在しないので変更しました。
$ fluidsynth -l -s -i -aalsa -o audio.alsa.device=default /usr/share/midi/sf2/mypatches.sf2
fluidsynth -l -s -i -aalsa -o audio.alsa.device=default /usr/share/sounds/sf2/FluidR3_GM.sf2
続いて、ALSAが認識しているMIDI出力ポートを一覧表示します。
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を受け入れています。
またサウンドシステムの状態を確認します。
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と他音源を同時に鳴らすことができる6 ので
→FluidSynth→(ALSAを偽装した)PulseAudio→ALSA→
となっているはずです。
FluidSynthを終了したいときはプロセス番号(PID)がわかっているので以下のコマンドとなります。
kill プロセス番号(PID)
Linux Mint 20.3 Cinnamon の場合
TiMidity++をインストールしたのち、MIDIを受け入れられるように設定します。
alsa-utilsがインストールされているか確認します。
apt list --installed | grep alsa-utils
alsa-utils/focal-updates,now 1.2.2-1ubuntu2.1 amd64 [インストール済み]
alsa-utilsはデフォルトでインストール済です。次にTiMidity++について調べます。
apt list --installed | grep timi
TiMidity++は無いのでインストールします。
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++を起動/設定します4 / 5。
※なお、「MIDI-WineHQ Wiki」に記述してある場所にはサウンドフォントが存在しないので変更しました。
$ timidity -iAD -B2,8 -Os1l -s 44100 -x'soundfont /usr/share/midi/sf2/mypatches.sf2 order=1'
timidity -iAD -B2,8 -Os1l -A100 -s 44100 -x'soundfont /usr/share/sounds/sf2/default-GM.sf2 order=1'
続いて、ALSAが認識しているMIDI出力ポートを一覧表示します。
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++を受け入れています。
またサウンドシステムの状態を確認します。
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と他音源を同時に鳴らすことができる6ので
→「TiMidity++」→「(ALSAを偽装した)PulseAudio」→「ALSA」→
となっているはずです。
TiMidity++を終了したいときはプロセス番号(PID)がわかっているので以下のコマンドとなります。
kill プロセス番号(PID)
WineHQからMIDI音が鳴ることを確認できたら、「midi4wine.sh」(仮名)を作成しておくと起動が楽になります。
設定からわかること
Ubuntuの初期設定では、音声出力用ハードウェアが接続されていないシリアルポートにMIDIデータを送信するため、音楽は聞こえません。
Ubuntuの初期設定では、TiMidity++とPulseAudioを同時に使うことはできません//MIDI音源と他の音源を同時に鳴らすことはできません。
PusleAudio と TiMidity++ 、ALSAの振る舞いについて確認します。
Ubuntuの初期設定では、音声出力用ハードウェアが接続されていないシリアルポートにMIDIデータを送信するため、音楽は聞こえません。
前述したとおり、OSインストール直後の状態は以下の2つのコマンドでわかります。1つめは、
aconnect -o
client 14: 'Midi Through' [type=カーネル]
0 'Midi Through Port-0'
ALSAが認識している出力は'Midi Through Port-0'となっています。
「'MIDI Through'は、専用のMIDIハードウェアがない限り役に立ちません。(おそらく)HWが接続されていないシリアルポートにMIDIデータを送信するため、音楽は聞こえません。3」
実際のところ、初期設定のまま(WineHQ経由で)Synthesiaを起動するとMIDI音が出ませんでした。さらに、Music Studio Producerはフリーズしてしまいました。
Ubuntuの初期設定では、TiMidity++とPulseAudioを同時に使うことはできません//MIDI音源と他の音源を同時に鳴らすことはできません。
2つめのコマンドをつかうと、
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が機能しなくなります。7」
一般的な音源では以下のサウンドシステムが使われています。しかし、WineHQがMIDIデータを発すると(WineHQはALSAにそれを渡そうとするので)PulseAudioが機能しなくなり、
「一般的な音源→PulseAudio→ALSA→スピーカー8
MIDIデータは次のように受け渡され、
「WineHQ(MIDI)→ALSA→Midi Through(MIDI出力シリアルポート)→×
MIDIデータの出力先が無いのでMIDIが鳴らないうえに、PulseAudioが使えなくなったことでほかの音源も鳴らなくなります。
ユーザーがログイン後にTiMidity++を起動するとPulseAudioがMIDIと他音源の両方を受け付けます。
ユーザーがログイン後に以下のコマンドを使ってTiMidity++をデーモンモード起動する(TiMidity starting in ALSA server mode)と、
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に渡す。
timidity-daemonを使用する//timidityをユーザーログイン前に起動するとTiMidity++がALSAを占有してPulseAudioが使えなくなります。
ちなみに、timidity-daemonを使用する//TiMidity++をカーネルの一部としてシステムに常駐させると
「WineHQ(MIDI)→TiMidity→ALSA→スピーカー」
となります。TiMidity++がALSAを占有してしまい、PulseAudioが機能しなくなります。
:MIDIは鳴る
:他音源は鳴らない
シェルスクリプトを使ってみる
TiMidity++を使ってWineHQからMIDIを鳴らすには以下のスクリプトを使います。
FluidSynthはJACKに接続することが推奨されています。この方法はおすすめできません。また、FluidSynthで動作させることはできますが細かいところで違和感があります。
Fedoraに関する文書>>ミュージシャンのガイド>>「10.4.3. JACK の出力を設定する」によれば FluidSynthについて「おすすめの方法は、合成された音声を JACK に出力することです。」9とのことで、FluidSynthを使うのはJACKと組み合わせてrosegadenやLMMSなどDTMや作曲編曲を行う時が良さそうです。
今回はSMFのformat形式を変更する(Music Studio Producer)こと、音ゲーで遊ぶ(Synthesia)ことが目的ですからTiMidity++をPulseAudioと組み合わせて使います。
WineHQでMIDIを鳴らすコマンドをシェルスクリプトにしてみます。「サービス・プロセスの起動確認するシェルスクリプト」をお借りして、
TiMidity++が起動していなかったら→起動する
スクリプトにします。たとえばホームディレクトリで以下のコマンドを使うかテキストエディタを使い「midi4wine.sh」ファイルを作成します。
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/*
シェルスクリプトを実行できるようにパーミッションを変更します。
chmod 755 midi4wine.sh
シェルスクリプトがうまく動作するか確認します。
sh midi4wine.sh
おわりに
この記事を完成させて何度か動作確認をしました。わたしの感覚では、Ubuntu StudioにTiMidity++をインストールしてFluidSynthとTiMidity++を併用するのが便利なようです。
FluidSynth:JACKが必要なMIDIアプリを使う場合
TiMidity++:WineHQを使ってWindows版MIDIアプリを使う場合
※Linux Mint ではMIDIを扱わない
と使い分けるとすっきりします。
<<前の記事 【Linuxで音ゲーを実行#4】楽譜作成アプリがMIDIキーボードを認識しなかった/音が出なかった
[【Linuxで音ゲーを実行#6】] 次の記事>>
参考サイト
-
TiMidity++(ティミディティプラスプラス)は、MIDIファイルをPCM音声(WAVファイル等)に変換し、ファイルに保存したり、リアルタイムに出力するためのソフトウェアである。一般的にはTimidityと呼ばれている。 https://ja.wikipedia.org/wiki/TiMidity%2B%2B ↩
-
There is no point in writing to the Wine bug tracker if MIDI does not work on your UNIX system. ↩
-
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. ↩ ↩2
-
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. ↩ ↩2
-
TimidityやFluidSynthなどのソフトウェアシーケンサー:TimidityまたはFluidSynthをインストールするだけでは不十分です。これらのソフトウェアシンセサイザーは、無音以外のものを生成するために、デジタル化されたサウンドサンプルコレクション(パッチおよびサウンドフォントと呼ばれる)を必要とします。パッケージ管理とパッケージの依存関係によっては、これらのいずれかを追加でインストールするか、サウンドフォントを使用するようにソフトウェアを構成する必要がある場合があります。FreepatsとUnisonは、そのようなパッチコレクションの例です。 ↩ ↩2
-
複数の音源をMIXできるのがPulseAudioの特徴。例えば「youtubeを再生しながらSynthesiaで演奏する」ことができる。 ↩ ↩2
-
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. ↩
-
単純化してあります。以下同じ ↩
-
https://docs.fedoraproject.org/ja-JP/Fedora/17/html/Musicians_Guide/sect-Musicians_Guide-FluidSynth-Configuring-JACK_Output.html ↩