試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Wine上でgm.dls(MSGS)の音でMIDIデータを演奏したものを録音してオーディオデータとして保存する

MIDI形式のデータは演奏情報なので、音源データと組み合わせた上でTiMidity++のようなツールを用いることにより、オーディオデータへの変換処理を行うことができる*1のだが、WineWindowsのソフトウェアMIDI音源gm.dls*2を用いてMIDIデータからオーディオデータを得ることはそのままではできないが、PulseAudioを用いることにより録音を行い、オーディオデータとして保存することはできる。
(2010/4/13)オーディオ出力をALSAにして「OpenGLアプリケーションが快適にキャプチャできるglcについて(概要/インストール/Mandriva Linux向けパッケージ)」「OpenGLアプリケーションが快適にキャプチャできるglcについて(キャプチャ、再生、エンコード)」のglcを用いてキャプチャ後WAVEオーディオを抽出する方法などもあり、そちらのほうが手っ取り早い気もする。

準備

Wineでgm.dls(MSGS)の音を鳴らせるようにする

この部分は以前書いたことがあるので詳しくは書かないが、Wineにはgm.dlsは含まれていないため別途用意する必要があり、Wineのバージョン1.1.23の時点ではWindowsネイティブ版DirectXも必要。*3

DirectMusic対応のMIDIプレーヤを入手

VectorのMIDIプレーヤのディレクトリなどからDirectMusic対応のMIDIプレーヤを探してダウンロードする。「Wine上でMicrosoft GS Wavetable SW Synth(MSGS・ゲイツシンセ)の音を鳴らす(gm.dlsの入手とDirectMusic対応プレーヤによる再生)」の追記に書いたように、DirectMusicのサンプリング周波数の既定値が22050Hzのためか、プレーヤによっては44100Hzで再生することができないため、22050Hzで録音/保存したい場合はどのDirectMusic対応プレーヤでもよいが、44100Hzで録音/保存したいのであればDMRPlayerを選択するのが良さそう。

WineでPulseAudioから音を鳴らせるようにする

WineのPulseAudioドライバがインストールされている必要があり、これについては「Wine上の音声をPulseAudioへ渡す」の追記を参照。なければ、その記事のようにALSAプラグインを利用するように設定するか、別途ドライバをビルドして/usr/lib(32)/wine/以下に配置する。
winecfg設定ツールの「オーディオ」タブで「PulseAudio Driver」にチェックが入っていればPulseAudioから音声が出る。また、「Wine上の音声をPulseAudioへ渡す」の追記にも書いたように「ハードウェアアクセラレーション」の設定は「エミュレーション」を推奨。

録音

準備したMIDIプレーヤを起動して変換したいMIDIファイルを開いて再生し、PulseAudioのオーディオストリームを保存する。
方法は

などがある。
データ再生/録音をしている途中には音飛びが発生する可能性があるため

  • 録音中は別のアプリケーションは動かさず、他の作業も行わない
  • cpufreqが動いている場合、一時的に最大のクロック周波数になるようにする・cpufreqdを使用している場合は最大のクロック周波数で動作するプロファイルを(なければ用意して)手動で選択し、cpufreqに関するデーモンが動いていない場合はcpufreq-setで直接指定する
  • PulseAudioやプレーヤのnice値を下げて高い優先度で実行する

などの工夫をするとよい。

*1:ハードウェア音源を用いる場合はそのハードウェアからのオーディオ出力をライン入力に接続して録音する

*2:Microsoft SynthesizerとMicrosoft GS Wavetable SW Synth(MSGS・ゲイツシンセなどとも呼ばれる)で使用される音源データ

*3:Wine内蔵のDirectXでは正常に鳴らない

*4:ドラッグしてDeleteを押すだけだが、必要に応じて「ビュー」メニュー内の項目により拡大を行って削除範囲をうまく指定する