×

[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。

サイトトップまとめドキュメントWineサウンド ≫ Wine上のMIDIデバイス

Wine上のMIDIデバイス

[重要]重要

MIDIアプリケーションにはOS上のMIDIデバイスを用いるものとMicrosoft Synthesizerを用いるものとがあり、扱いは全く異なる。また、アプリケーションによってそのどちらに該当するかも異なる。

サウンドドライバ(出力サウンドシステム)がALSAかOSSに選択されていると、それらのサウンドシステムのMIDIデバイスが利用できる。

[注記]メモ

バージョン1.3.25以上ではサウンドドライバ(出力サウンドシステム)は自動的に選択される。また、PulseAudioの統合も進んでおり、GNU/Linuxでは多くの場合、サウンドドライバにはALSAが選択された上で、PCMにはPulseAudioモジュール経由でPulseAudioが,MIDIデバイスにはALSAが用いられる形となる。

ALSAの場合、TiMidity++(alsaseqインターフェース使用)やFluidSynth(GUI版のQSynthを含む)などのソフトウェアシンセサイザも利用できる。また、USB接続のハードウェアMIDI音源はALSAで使用できることが多い。自動認識されなければカーネルモジュールsnd-usb-audioを読み込ませる。

[注意]注意

上は、言い換えるとTiMidity++FluidSynth,QSynthといったものをMIDIデバイスとして用いるにはALSAが選択されている必要があるということになる。また、これらのシンセサイザのPCM音声の出力先は幾つかのサウンドシステムから選択できるが、その中からALSA[11]が選択されているなど、シンセサイザからの音声が正常に出力される状態であることも必要となる。

PCMとMIDIとを別のドライバにすることはできないが、ALSAのプラグインを用いてWineからALSAへの出力時におけるPCMデバイス指定の要領でデバイス指定をすることで分けることは可能。

WineのMIDIマッパー

OS(仮想Windows)の出力先MIDIデバイスを切り替える部分。出力デバイスを選択しない/できないMIDIアプリケーションはこの設定に基づいて出力先デバイスを決定し、信号を送る。

設定はレジストリのHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Multimedia\MIDIMap以下だがWindowsとは微妙に異なる。

例18 TiMidity++のalsaseqインターフェースを出力先にするレジストリ例(Wine 1.1.3以上向け)

REGEDIT4

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Multimedia\MIDIMap]
"AutoScheme"=dword:00000000
"ConfigureCount"=dword:00000004
"CurrentInstrument"="TiMidity - TiMidity port 0"
"CurrentScheme"=""
"DriverList"=""
"UseScheme"=dword:00000000

GUIではMIDIせれくたーのソースを修正したものをビルドしてWineのMIDIマッパー設定ツールとして使うことができる。

Microsoft SynthesizerとDLS音源

  • DLS音源はRPGツクールXP/VX系作品やWOLF RPGエディター作品など、MIDI音声の出力先がMicrosoft Synthesizer固定のアプリケーションで正常にMIDIオーディオを出力するのに必要

  • Windows標準のDLS形式のMIDI音源データgm.dlsはMicrosoft社が配布しているDirectXの8.1,8.1b,9.0cなどのバージョンの再頒布可能ランタイムパッケージの中にgm16.dlsのファイル名で含まれている(配布ファイルを展開すると得られるDirectX.cabの中にある)が、2013年秋の時点ではMicrosoft社のサーバからは古いバージョンのパッケージが消えており、Wayback Machine内のMicrosoft社のサイト(8.1 9.0c Aug 05)などから入手する

  • DLS音源データのファイルはMicrosoft GS Wavetable SW Synth(いわゆるゲイツシンセ)の音源ファイルとしても用いられるが、Wineにこのシンセサイザは存在せず、DirectMusicを用いない一般的なMIDIアプリケーションから音色として用いることはできない

  • gm16.dlsWine環境(prefix)C:\windows\system32\drivers\gm.dlsの名前で配置し、winetricksdirectmusicをインストールすると、RPGツクールXP/VX系作品のような例外を除いて音が鳴るようになる

[注記]メモ

64bit対応のWine環境(prefix)で32bitアプリケーションを動かす場合はC:\windows\syswow64\drivers\以下が参照されるので、必要に応じてシンボリックリンクを張るなどして正常に読み込まれるようにする。

DirectXの再頒布可能パッケージからgm.dlsを取り出すスクリプト

[任意]ファイル名: extract-gmdls-from-dx81-redist.sh ライセンス: GPL-3 or lator

#! /bin/bash

# DirectX 8.1 再頒布可能パッケージからMSGSの音源ファイルgm.dlsを取り出して保存
# (C) 2013-2014 kakurasan
# version 20140203
# Licensed under GPLv3+

PATH=/bin:/usr/bin:/usr/local/bin
MD5=b74260623ee5023a7d1cbb47e4e881ff
URL=web.archive.org/web/20070403193305/http://download.microsoft.com/download/whistler/Update/8.1/W982KMeXP/EN-US/DX81Redist.exe

die()
{
  zenity --error --text "${1}"
  rm "${TEMPDIR}" -fr
  exit 1
}

download()
{
  ! wget -O out ${URL} && ! curl -o out ${URL} && die "ファイルがダウンロードできませんでした"
  EXEFILE=out
}

# ツールのチェック
if ! zenity --version > /dev/null; then
  echo "zenityがインストールされていません"
  exit 1
fi
if ! cabextract --version >/dev/null 2>&1; then
  zenity --error --text "cabextractがインストールされていません"
  exit 1
fi
if ! unzip >/dev/null 2>&1; then
  zenity --error --text "unzipがインストールされていません"
  exit 1
fi

# 開くファイルを決定
DO_DOWNLOAD=0
if [ ${#} -ge 1 ]; then  # 実行ファイル名の後ろの引数の数が1以上
  # 引数にファイルが指定されたらこれを直接開く
  EXEFILE="$(cd $(dirname "${1}") && pwd)/$(basename "${1}")"  # 相対パス指定された場合に絶対パスへ
else
  EXEFILE="$(zenity --file-selection --title "DirectX 8.1 再頒布可能パッケージの場所" --filename "${HOME}/")"
  if [ ${?} -ne 0 ]; then
    # キャンセル
    zenity --question --text "ファイルをダウンロードしますか?" && DO_DOWNLOAD=1
    if [ ${?} -ne 0 ]; then
      zenity --info --title "中止" --text "処理を中止し、終了します。"
      exit
    fi
  fi
fi

# 一時ディレクトリの作成
TEMPDIR="$(mktemp --tmp -d extract-gmdls.XXXXXXXX)"
if [ ${?} -ne 0 ]; then
  zenity --error --text "一時ディレクトリの作成に失敗しました。"
  exit 1
fi
cd "${TEMPDIR}"

# ダウンロードする場合
[ ${DO_DOWNLOAD} -eq 1 ] && download

# ファイルチェック
if [ ! -f "${EXEFILE}" ]; then
  zenity --question --text "${EXEFILE}は存在しません\nダウンロードしますか?" && download
fi
if [ "$(md5sum ${EXEFILE} | cut -d ' ' -f 1)" != "${MD5}" ]; then
  zenity --error --title "ファイルが違います" --text "このファイルは
DirectX 8.1 再頒布可能パッケージではありません"
  rm "${TEMPDIR}" -fr
  exit 1
fi

# 展開とコピー
unzip "${EXEFILE}" > /dev/null || die "配布ファイルの展開に失敗しました"
cd Redist/DirectX81/
cabextract DirectX.cab > /dev/null || die "DirectX.cabの展開に失敗しました"
ls | egrep -v "*gm16*" | xargs rm
mv gm{16,}.dls
OUTFILE=$(zenity --file-selection --title "gm.dlsの保存" --save --confirm-overwrite --filename=${HOME}/gm.dls)
if [ ${?} -ne 0 ]; then
  zenity --info --title "キャンセル" --text "保存がキャンセルされました。
<span size='larger' weight='bold'>${TEMPDIR}/Redist/DirectX81/gm.dls</span>を手動でコピー後、
一時ディレクトリ<span size='larger' weight='bold'>${TEMPDIR}</span>以下を削除してください。"
  exit 1
fi
cp -a gm.dls "${OUTFILE}" || die "${OUTFILE}の保存に失敗しました"
if zenity --question --title "Wine環境へのコピー" --text "Wine環境にもコピーしますか?"; then
  if ! cp -a gm.dls "${WINEPREFIX:-${HOME}/.wine}/dosdevices/c:/windows/system32/drivers/" 2> /dev/null; then
    wineboot -u
    cp -a gm.dls "${WINEPREFIX:-${HOME}/.wine}/dosdevices/c:/windows/system32/drivers/" || die "Wine環境へのコピーに失敗しました"
  fi
  if test -d "${WINEPREFIX:-${HOME}/.wine}/dosdevices/c:/windows/syswow64/drivers" && test ! -f "${WINEPREFIX:-${HOME}/.wine}/dosdevices/c:/windows/syswow64/drivers/gm.dls"; then
    cd "${WINEPREFIX:-${HOME}/.wine}/dosdevices/c:/windows/syswow64/drivers/"
    ln -s ../../system32/drivers/gm.dls
  fi

fi
rm "${TEMPDIR}" -fr
zenity --info --title "完了" --text "処理が完了しました。"

gm.dls代替のDLS音源

DLS形式はサウンドフォント(SF2形式)と用途が近く、相互に変換するツールもあるが、いずれもWindowsのシェアウェアで、登録をしないと(単一音色でない)DLS形式の書き出しはできないようだ。

公開されているDLS音源としてはFuryがあり、全体的に音質は良いものの、音色が抜けていて鳴らない音も一部ある。gm.dlsの代用として用いる場合は${WINEPREFIX}/dosdevices/c:/windows/system32/drivers/gm.dlsとして配置するかレジストリHKEY_LOCAL_MACHINE\Software\Microsoft\DirectMusic\GMFilePathを書き換える。

下はFuryのダウンロードと展開を自動化するスクリプト(unzipunrarが必要)。

[任意]ファイル名: download-and-extract-furydls.sh ライセンス: GPL-3 or lator

#! /bin/sh

# DLS音源Furyをダウンロード/展開する
# (C) 2010 kakurasan
# version 20100716
# Licensed under GPLv3+

PATH=/bin:/usr/bin:/usr/local/bin

die()
{
  zenity --error --text "${1}"
  rm "${TEMPDIR}" -fr
  exit 1
}

# ツールのチェック
if ! zenity --version > /dev/null; then
  echo "zenityがインストールされていません"
  exit 1
fi
if ! unzip >/dev/null 2>&1; then
  zenity --error --text "unzipがインストールされていません"
  exit 1
fi
unrar > /dev/null 2>&1
if [ ${?} -ne 7 ]; then
  zenity --error --text "unrarがインストールされていません"
  exit 1
fi

# 一時ディレクトリの作成
TEMPDIR="$(mktemp --tmp -d furydls.XXXXXXXX)"
if [ ${?} -ne 0 ]; then
  zenity --error --text "一時ディレクトリの作成に失敗しました。"
  exit 1
fi
cd "${TEMPDIR}"

# ダウンロード
for N in $(seq 9) A B C; do
  URL=www.ixbt.com/multimedia/utils/fury0${N}.zip
  wget -O fury0${N}.zip ${URL} || curl -o fury0${N}.zip ${URL} || die "ファイルのダウンロードに失敗しました"
  unzip fury0${N}.zip || die "ZIPファイルの展開に失敗しました"
done
unrar x Fury.exe || die "Fury.exeの展開に失敗しました"

# コピー
OUTFILE=$(zenity --file-selection --title "Fury.dlsの保存" --save --confirm-overwrite --filename=${HOME}/Fury.dls)
if [ ${?} -ne 0 ]; then
  zenity --info --title "キャンセル" --text "保存がキャンセルされました。
<span size='larger' weight='bold'>${TEMPDIR}/Fury.dls</span>を手動でコピー後、
一時ディレクトリ<span size='larger' weight='bold'>${TEMPDIR}</span>を削除してください。"
  exit 1
fi
cp -a Fury.dls "${OUTFILE}" || die "${OUTFILE}の保存に失敗しました"
rm "${TEMPDIR}" -fr
zenity --info --title "完了" --text "処理が完了しました"

RPGツクールXP/VX作品のMIDIオーディオ

RPGツクールXP/VX作品のMIDIオーディオの再生にはMicrosoft SynthesizerとDLS音源を使用しており、更にdsdmo.dllというライブラリを用いてリバーブ効果をかけているようだ。

  • Wineバージョン1.6.2,winetricksのバージョン20140302時点では、音源ファイル(gm.dlsなどのDLSファイル)に加えてwinetricksdirectmusicdsdmoの2つのパッケージをインストールすると、MIDIオーディオが演奏されるようになる

  • Wineバージョン1.3.25-1.3.29では上の作業(dsoundのインストールとその先)を行うと初期化エラーを起こして作品が起動しない(1.3.30では正常に動作する)

  • バージョン1.2のリリース候補段階時点では音源ファイル(gm.dls)以外にwinetricksdirectx9パッケージとdsoundの追加のDLLオーバーライド設定で動作していた

  • 上記方法を用いても、曲の切り替わりが不安定な場合がある

  • 音源ファイルやDLLオーバーライドなどの作業を行う代わりに、.midファイルを同名のOgg Vorbisファイルに置き換えるという方法もある



[11] 2008-2010年より後のディストリではPulseAudioが適切な場合もある