Windows
Media Player を使って音楽を再生すると音が悪い...
|
|
|
|
|
|
MMDモデル
: まままさん、エナメルPさん
MMD背景 : カブッPさん「Sound
Studio」 |
TR-808ドラム音源を超リアルに再現!
VR-08 VSTi
ありぱぱ作品紹介
<
|
と言うような事が、世間では随分と前から言われております。
「カーネルミキサーのリサンプラ-が音を劣化させているからだ。ASIO対応のプレーヤで音楽再生すれば良い音になる」
ですとか、
「リサンプリングしなくても音が変わるから、ボリュームコントロールの音量処理で劣化しているのでは?」
あるいは、
「ASIOは別に音質を向上させるものではない。ASIOで音が良くなるというのは気のせいでは?」
と言った意見をネット上などでは見かけます。
この音が悪くなるらしい
「カーネルミキサー」 と言うものさえ通さなければ良いという事で(本来それだけの目的で開発された訳ではないですが)WASAPI、WDM-K/S、ASIO
といった別の音声ストリームメソッドを使用して音楽や音声を再生するマニア向けのプレーヤ(Foobar2000やWinAmpなど)もあります。
音声をより正確に再生しなければいけない音楽制作やマスタリング用のアプリケーションでは、まず例外無く、カーネルミキサーを使用しないで音声を再生する方式が用いられています。
僕自身もずっとこの事は気になっていましたし、実際にカーネルミキサーを通して再生された音をデジタルで取り込み、データとしてオリジナルと比較しますと明らかに内容が変わってしまうという事は随分と前
(確か、初めてWDMとカーネルミキサーが導入されたWindows
98SEの時代?)から検証して判っていましたが
「まぁWindowsの音なんてその程度のものだ。ビットパーフェクトとか贅沢言っちゃいかん!」
程度に考える事で自己解決させていた様な状態でした。
(音の専門家のクセに...)
しかし数ヶ月ほど前からCGMという形態
で10年以上離れていた音楽制作活動に復帰しまして(要はボカロPです〜w)、DAWやマスタリングの作業で自分の曲を繰り返し何百回も聴くという事が多くなりました。
曲が完成近くなり、いざそれを
Windows Media Player で再生しますと、作業中の時の音との違いに違和感を感じる事が多く、我慢できなくなってきました。
どうも最近のWindowsのカーネルミキサーでは、
ビットパーフェクトか否かと言うどころの話ではなくて、明らかに音の違いが発生してると・・・
これが何なのかもう一度きちんと調べてみる事にしました。
この文書はその中間発表的なものになります。
内容は一般ユーザー向けというより、音楽コンテンツや音声を含む映像コンテンツなどを作る側の人向けのものとなっております。
DTM
Station の藤本健さんが、 AV
Watch / Dital Audio Laboratory で、もっと一般的で判りやすい記事を書いてくれております
(今回の検証作業の一部を藤本さんと「あぁだ、いや、こぉだ」とやりとりしながら行いました)
とりあえず今回はリサンプリングの話は抜きにします。 再生しようとしているコンテンツの音声のサンプリングレートと、再生に使用するオーディオI/F
(D/Aコンバータ) のサンプリングレートが同一のケースという前提です。
検証に使用した機材や環境
PC |
ASUS P6Tマザーボードの自作機 |
CPU |
Intel Core
i7 920 |
オーディオI/F |
ROLAND QUAD-CAPTURE |
OS |
Windows 7
Ultimate x64 SP-1 |
再生アプリ |
Windows
Media Player 12 |
録音アプリ |
Sound Forge
6.0 |
ROLAND QUAD-CAPTUREを使った理由は以下の通り。
QUAD-CAPTUREは、PCからUSB経由で出力されたデジタルオーディオデータが再びUSBを介してPCにフィードバックされているので、Windowsのオーディオ出力データを評価するのに好都合です。
PCに戻る途中でINPUTからの信号を混ぜるMIXボリュームがありますが、これはデジタル処理ボリュームであり、ボリュームをPLAYBACK側に絞りきっておく事でINPUTからの混ざり込みを完全に遮断し、純粋にPLAYBACKのフィードバックとして利用できる事を検証済みです。
QUAD-CAPTUREのシグナルフロー図
クリックで拡大
その他、使用した上記の機材やソフトウェア固有の問題ではない事を確認する為に、オーディオI/Fとしては
ROLAND UA-25EX、MB実装のHigh Definition AudioのS/PDIF出力、RME
DIGI9652 などで、録音・再生ソフトウェアとしては
SONAR-X1d、Foobar2000 1.1.11、自作の録音再生アプリなどでも平行して同様の検証を行ってあります。
また、先にちょっと結論を書いてしまいますが、今回の検証では
Windows XP では音の劣化は起きませんでした。
カーネルミキサーによる音の劣化が確認できたのは、Windows
Vista と Windows 7
です。
とりあえず Windows XP を利用されている方は安心して下さい。
|
音質劣化の検証
いくつかの前振り検証を行った上で、これなら判り易いだろうという事で準備した「オリジナル波形」です。
ピークまで振れている1kHzのサイン波、ピークまで振れている4Hzのノコギリ波に続いて、ピークまで頻繁に振れている音楽、
Music of the
planet という自作曲の一部です。
オリジナル波形
source_00db.wav (44.1KHz 16bit
Stereo 約7.5MB)
(左クリックで再生、右クリックのメニューからダウンロード出来ると思います)
注意:
ピークまで振れてる超低周波 (4Hz)のノコギリ波の音声が収録されています!
大音量で再生しますとスピーカーやヘッドフォン、あるいは耳を痛めるかもしれませんので気をつけて下さい。
この.wavファイルを、Roland
QUAD-CAPTURE オーディオインタフェースが実装されたWindows
7 (x64) PC 上の Windows Media Player 12 で再生し、QUAD-CAPTUREのループバックキャプチャ機能を使い、再生結果をデジタル音声のままPCに再度取り込んで
Sound Forge で録音します。 (Sound Forgeのバージョンが古すぎるとかの突っ込みは無しで! 新しいモノが必ずしも最良であるとは限りませぬぞ!)
途中でアナログオーディオに変換される場所はありませんし、QUAD-CAPTUREのサンプリング周波数は元の波形と同じ44.1KHzにセットしてありますのでリサンプリングの影響も排除できています。
録音結果
wmp_00db.wav
(44.1KHz 16bit Stereo 約7.5MB)
(左クリックで再生、右クリックのメニューからダウンロード出来ると思います)
こうして描画された波形だけ見てもほとんど違いは判りません。
また、PCの音声再生環境が良くありませんと聴き比べても違いが判らないかもしれません。
いやいや、そうではなかった。 上記の2個の.wavファイルを再生された方が、そもそもWindows
Vista/7 上でIEやWindows Media Playerを使って再生した以上、オリジナル波形の方もカーネルミキサーによって劣化してしまうのですから、普通の再生方法で上記の両者を聴き比べてもまったく同じ音、劣化している方の音になってしまっていると思います。聴くだけ無駄ですね(笑)
でもこの曲は僕自身が作って演奏し、劣化していない状態のもの(DAWやFoobar2000などでカーネルミキサーを通さないで再生した音)を、自分で何百回、いや何千回と聴いてきましたので、僕自身はちょっとでもオリジナルとの違いがあればすぐに違和感を感じる事ができます。
音で違いを判断したい方は、上記2ファイルをダウンロードしてから、Foobar2000やWinAmpのASIOやKS、WASAPI経由で再生して下さい。
それでは本題。 聴いただけではよく判らんという方の為に、その違和感を視覚化してみます。
この録音結果の波形に、オリジナル波形の「位相を反転したもの」をミックスしてみます。
録音結果とオリジナルの差分
wmp_00db_diff.wav (44.1KHz 16bit
Stereo 約7.5MB)
(左クリックで再生、右クリックのメニューからダウンロード出来ると思います)
ほとどんど無音に近い状態になったように見えますが、時々、ゴミの様なものが散見しています。
このゴミを拡大してみます。
まず、オーディオ振幅方向(縦方向)に拡大します。
出てきました、違和感の実体。
オリジナル波形と録音された波形の間には、最大で-36dBくらいの差が生じている事が判ります。
-36dBと言えば、最大振幅の1/63くらいの振幅の成分ですから、両波形間には十分に耳で聞き取れるくらいの差があるという事です。
音楽を、Windows Media Playerなど一般的なソフトウェアで再生した場合と、Foobar2000などでカーネルミキサーを通さずに再生した場合とで音が違う・・・という話は、サブリミナルでもカルトオーディオでも音響心理学でもマイクロソフト・アレルギーによるものでもなく、実際にこれだけの差が発生しているからです。
(カーネルミキサーを介さない、ASIOやWASAPI、KSなどを使って再生されたものを同様の手順で録音した場合にはこのような差は発生しない事は検証済みです)
劣化部分の正体
更にこの差分波形を時間軸方向にも拡大してみます。 同時に、オリジナル波形の同じ部分も表示してみます。
上がオリジナル波形、下が録音された波形とオリジナルとの差分。
スピーカーを壊しそうで怖かった検証用の4Hzのノコギリ波信号が、ここでの見比べで意味を持ってきます。
- オリジナル波形が正負のピークに近付くと急におかしな差が発生し、しばらくの時間その差が残り、やがて消える
- オリジナル波形の振幅が小さい部分ではほとんど差が発生していない
という事が判ります。
音楽の部分も拡大して見てみます。
音楽でも同様に、オリジナル側の振幅が正負のピーク近くまで振れた部分(赤丸印)の時間帯だけ、差分が生じている事が読み取れます。
これらの波形を見て、音を扱っている経験の長い方はすぐに気づくかもしれません。
これはいわゆる「ピークリミッタ」が働いた時の挙動です。
話題になる事は少ないように思いますが、
実はWindowsのカーネルミキサーを経由した音声にはすべてピークリミッタがかけられてしまうんです。
恐らくは、複数のアプリケーションから同時に大きな音を鳴らした時でも音声がデジタルクリップして汚い音にならないよう、マイクロソフトがカーネルミキサーにピークリミッタをインプリメントしたのでしょう。 それ自体は悪い事ではないと思います。必要かもしれません。 ただこのピークリミッタ、あるアプリケーションが一つの音だけを再生している時でも何故か効いてしまう。完全なピーク(0dB)まで振れていない音声に対しても過敏に反応してしまい、しばらくの間ゲインを落とすという挙動を起こしてしまいます。
ブリックウォール型のピークリミッタとして考えると、差分が-36dB=16ビット振幅値で520くらいですから、オリジナルのピーク値32768に対しては
0.133dBくらいのゲイン変動。
「オリジナル波形がピークを打つ度に、しばらくの間、ゲインが0.133dB落とされる」
あるいは、
「オリジナル波形がピークを打つ度に、-36dB振幅のノイズが乗ってくる」
という事とほぼ同義だと思います。
「そのくらいどうって事無いよ。どうせ今の音楽、どれもパッツン・パッツンにつぶしてあるんだから」
という意見もあるでしょうし、
「音楽鑑賞装置としては絶望的」
という意見もあると思います。
ただピークリミッタと言っても、きちんと先読みしている訳でもなし、アタックタイムもリリースタイムも無くいきなり直角にゲインを変えられてしまうし、同時にいくつもの音が再生されていて本当にクリップしている時ならまだしも、純粋に音楽だけを聴いている時にこんな事は起きてくれない方がありがたい事だけは確かです。
「何となく音が濁る」というような劣化ではなくて、音楽のピーク部分を確実につぶしてしまっているのですから、自分でマスタリングした曲などは、そりゃぁ違和感を感じない訳がありません。
しかも、実際にこの音質劣化の影響を受けているのは音楽の再生だけではありません。
音楽CD、 DVD、Blu-Rayディスク、あるいはネット上の動画・音楽コンテンツなど、Windows上で音を鳴らすありとあらゆるコンテンツの音声が、この劣化を受けてしまい、コンテンツ制作者の意図しない音声加工が再生時に行われているものと思います。
世界中のほぼすべてのWidows Vista / Windows 7
ユーザーのところで。いったい何億人がこの被害にあってるんでしょうか?(笑)
Windows Media Playerも、iTunesも、カーネルミキサー経由で音声を再生しますから、この影響を常に受けています。
どんな種類のアプリの音が劣化させられているか?
かなり省略してありますし、中には例外もあるとは思いますが、色々な種類のWindowsアプリケーションから送られる音声の流れは、だいたい次のような感じだと思います。
MSの概略図はこちら
どのAPIを利用して音を再生するかはアプリケーションの設計/デザイン次第なのですが、マルチメディアプレーヤ類も含めて一般ユーザーが使うほとんどすべてのアプリの音声再生は
DirectSound か MME 、WASAPI共有モードを利用して行われており、再生した音声がカーネルミキサーとその中にあるピークリミッタを通ってきてしまっているのが現状だと思います。
このレポートを書いている途中で
iTunes や
QuickTimeプレーヤが WASAPI に対応しているという事を知り、少し期待しながら実際にこれらでWASAPIを使って再生したものを録音して検証してみましたが、iTunes内での再生も、QuickTimeプレーヤ内での再生も、Windows
Media Player の場合とまったく同じ、ピークリミッタが掛かった方の音でしか再生できていませんでした。
WASAPI対応でも共有モードでしか動作しない様で、その場合はしっかりとカーネルミキサーの中を通ってきてしまうようです。
「Windows Media Player は音質が悪い」のではなくて、「Windows
は音質が悪い」 の方が適切な言い方かもしれません。
アプリをASIOやKS、WASAPI排他モードに対応させる場合、アプリの開発段階でそれぞれ専用の処理を追加する必要があります
ASIOはオーディオIFのデバイスドライバがASIO対応していないと動作しません。KSとWASAPIはほとんどのオーディオI/Fで動作する様です。
ASIO4ALLやINASIOという補助ソフトウェアを使用するとASIO非対応のオーディオI/FをASIO対応にできるようです。 この場合、実際にはKSやWASAPIを使って音声を出力してくれるようですので、アプリ側がASIOにさえ対応していれば、この手法でもカーネルミキサーをスキップして劣化の無い音を再生できるようです。
昔のWindowsではDirectSoundとMMEで音質や挙動に違いがありましたが今はどちらを使ってもほとんど同じです。(元々はDirectSoundの中に実装されていたリサンプラやリミッタが、最近のWindowsではカーネルミキサーの中に実装されるようになったという事なのかもしれません)
音を劣化させない対策はあるの?
Windows Media Player
などを使ってカーネルミキサー経由で音声を再生しても、この悪しきピークリミッタの動作を回避してまともに再生する方法は無いものかと思って模索していますが、残念ながら今のところ良い方法は見つけられていません。
2012年11月20日追記: プラグインで音量制御してピークリミッタを回避するアイデアを提案して頂きました
再生アプリ側が、MMEのAPI
(waveOutXXXX()系) を使用して音声を再生している場合には、Windowsの「音量ミキサー」の「デバイス」つまみで、音量を99%以下にしておく事でピークリミッタが誤動作しなくなるところまでは発見しました。
しかしほとんどの再生アプリはDirext-X
/ DirectSound のAPIを使用しており、その場合は何故か音量ミキサーのボリューム値に関係無く、常にこのピークリミッタがフルでかかってしまうようです。
(僕の検証結果と藤本さんの検証結果が異なるという点からこの事を発見しました)
唯一、コンテンツを作る側の立場としては、
音声をピーク目一杯まで振らない状態にマスタリングする
事で、このピークリミッタのスレッショルドに触る事を回避できそうな事は判りました。
以下はその検証です。
Windowsでも音が劣化しないコンテンツを作る為の検証
オリジナル波形から0.1dB音量を下げた
まず、最初のオリジナル波形全体の音量を0.1dB小さくした状態で検証してみました。
オリジナルから0.1dBだけ音量を下げたものを、最初と同じようにWindows
Media Playerで再生し、それを取り込んで録音したものが
wmp_01db.wav です。
source_01db.wav
(オリジナルを0.1dB小さくしたもの)
wmp_01db.wav
(source_01db.wavをWMPで再生して録音したもの)
そして、「オリジナルから0.1dB音量を小さくしたもの」と「それを録音したもの」の差分を取ってみます。
wmp_01db_diff.wav
(source_01db.wavとwmp_01db.wavの差分)
最初より少しは差が小さくなっていますが、それでもまだ大きな差が発生しています(X_X)
では、更にヘッドルームを増やして
、オリジナルから 0.2dB 小さくしてみます。
オリジナル波形から0.2dB音量を下げた
オリジナルから0.2dBだけ音量を下げたものを、同じようにWindows
Media Playerで再生し、それを取り込んで録音したものが
wmp_02db.wav です。
source_02db.wav
(オリジナルを0.2dB小さくしたもの)
wmp_02db.wav
(source_02db.wavをWMPで再生して録音したもの)
そして、「オリジナルから0.2dB音量を小さくしたもの」と、「それを録音したもの」の差分を取ります。
wmp_02db_diff.wav
(source_01db.wavとwmp_01db.wavの差分)
おっ! きました きました!
ヘッドルーム 0.1dBの時は相変わらず発生していたピークリミッティングが、ヘッドルームを
0.2dB に増やせば行われなくなるようです。
最初の.wavファイルから(カーネルミキサー経由で)ずっと聴き比べてくれた方には、source_02db.wav
まできて、初めて本来の音質で聴いて貰えた事になります。
本当のスイートスポットは、リミッタのゲインの計算で出てきた
0.133dB くらいなのかもしれませんが、さすがにそこまで細かく音量調整できるツールはあまり見かけませんから、0.2dBが現実的なところでしょう。
振幅方向、時間軸方向、両方とも最大までズームイン。
16ビット振幅値で -1
〜 +1 (-90dB) くらいの差は常に生じていますが、これは恐らくQUAD-CAPTURE内部やカーネルミキサー内部でのビット深度変換や整数と浮動小数の変換などで生じたものでしょう。
この程度の差ならば(それこそカルトオーディオの話でもなければ...)ほとんど音に影響無いと言って良いと思います。ASIOやKS、WASAPI経由で再生した場合でもこの程度の差は発生していました。
ビットパーフェクトではありませんが、ほぼオリジナル通りの音だと思います!
Windowsの各バージョンでの検証結果
Windowsバージョン |
再生アプリ |
カーネルミキサー
による劣化 |
備考 |
Windows 10 x64 (Pro) |
Windows Media Player 12 |
劣化した
(上記検証の通り) |
[音量ミキサー]で[デバイス]のボリュームスライダを少し下げると劣化が無くなった |
Windows 10 x64 (Pro) |
[ミュージック] (Metroアプリ) |
劣化した
(上記検証の通り) |
[ミュージック]アプリの音量ツマミ、あるいは[音量ミキサー]の[デバイス]の音量スライダを少し下げると劣化が無くなった |
Windows 8.1 x64 (Pro) |
Windows Media Player 12 |
劣化した
(上記検証の通り) |
|
Windows
7 x64
(Ultimate,SP1) |
Windows Media Player 12 |
劣化した
(上記検証の通り) |
オンボードHD-AudioとUA-25EXのS/PDIF出力でも同一の劣化を確認 |
Windows
7 x86
(Ultimate,SP1) |
Windows Media Player 12 |
劣化した
(上記検証と同じ結果) |
|
Windows
Vista x64
(Utimate,SP2) |
Windows Media Player 11 |
劣化した
(上記検証と同じ結果) |
|
Windows
Vista x86 |
|
未検証 |
|
Windows
XP x64 |
|
未検証
|
|
Windows
XP x86
(Professional,SP3) |
Windows Media Player 11 |
劣化しなかった
|
|
僕がメインの環境で本格的にWindows7を使い始めたのは2011年の11月頃から。それまではXPを使っていました。
Vistaはソフトウェアの動作テストで起動するくらいで、ほとんどまともに使った事ありません。
ここ数年来、僕の作業部屋にはいわゆる「ステレオ」ですとか「コンポ」ですとか呼ばれていたオーディオ再生装置は有りません。
音楽を鑑賞する時も音の仕事をする時も、ソースをWindows上のアプリで再生し、信頼できそうな外付けのオーディオI/FのDACでアナログ信号にして、信頼できそうなモニタスピーカやヘッドフォンに送って聴いています。
音楽CDの場合も、初めて再生するディスクはWindows
Media Playerやリッピングツールで44.1KHz/16bitリニアPCMのままハードディスク内に取り込んでしまい、以後はハードディスク内のものを再生して聴いている事がほとんどです。
僕にとっては、Windowsが「ステレオ」であり「コンポ」であります。
今はそういう人、結構多いんじゃないかと思います。
確かに今の音楽は制作の段階でピークリミッタやマキシマイザでピークをかなりつぶし気味にしてあるものが多いですから、いつもカーネルミキサーを経由した音「だけ」を聴いているぶんには、それほどの違和感を感じないのかもしれません。
でもWindows7にした1年前くらいからつい最近まで、ASIOなどを使った自分の音楽の作業以外では、すべてオリジナルとは異なる劣化した音楽ばかりを聴かされていたのだと思うと、なんだか悲しいやら腹立たしいやら...(X_X)
2015/8/2追記: Windows 8、8.1、そして最新Windowsである Windows 10 に至っても、Vista/Win7とまったく同様に0dBFSより低いレベルからピークリミッタが発動して音声を劣化させている事を確認しました。Windowsの中の人達の耳はいつまで経っても残念な状態のままのようです(X_X)。 ただ Windows 10では [音量ミキサー] のツマミを少し絞ればリミッタが発動しなくなったようで、少し進歩したのかも? (もしかしたらここはデバイスドライバ側の作りによって挙動が異なるのかもしれません)
ま・と・め
(Windowsで再生される可能性のあるCD/DVD/Blu-Ray/ストリーミングなどの
映像・音声コンテンツを作る人向け)
検証事実:
- 音声をピークギリギリまで振った状態でマスターアップしてしまったコンテンツの音声は、
Vista/Win7上で(回避策を行っていない)一般ユーザーが再生した際には、必ずと言って良いほど不本意なピークリミッタが掛けられた音で再生されてしまっている。
- 過去にそのようなコンテンツを配信してしまった場合、マイクロソフトがこの不具合を修正するまで、この状態は改善されない。
対策:
- 今後配信するコンテンツでは、最大振幅を-0.2dBにリミットしてマスターアップする事で、このピークリミッタの影響を受けていない音を視聴者に届けられるだろう。
例えばwaves L3の場合はこういう事になります。
あ、言い忘れましたが音声をmp3やmp4、m4aなど非可逆圧縮でエンコードして配信する場合には、0.2dB
のヘッドルームでも多分ダメだと思います。
完全にピークまで振れている場合に比べればカーネルミキサーのピークリミッタに引っかかる回数は少なくなるとは思いますが、非可逆圧縮ではエンコード前には無かった成分がデコード後に発生しているという事が頻発しており、
デコード後に -0.2dB を死守する為には、エンコード前から更に大きなヘッドルームをとっておく必要があると思います。
圧縮率や圧縮アルゴリズムによって結果は様々でしょうから、どれだけ余裕を取れば良いかとか一慨には言えないと思いますし、かと言ってすごく音量の小さなコンテンツを配信するのもイヤだし。圧縮による音質の劣化量との兼ね合いで妥協点を見つけるしかないと思います。
追加情報
・2012年11月13日 ピークリミッタのゲイン変動を視覚化してみました
・11月16日 訂正や補足説明を掲載致しました
・11月20日 g200kgさんによるリミッタ回避案 WMPのオーディオDSPプラグインで音量を下げる
・11月29日 ダマさん提案のWMPでパーフェクト再生する手法
・12月21日 WASAPI排他モード対応のオーディオファイルプレーヤを作りました
・2015年8月2日 Windows 10 (製品版) で調査しました
最後に
既に一世代前のOSとなってしまった
Windows7 (あるいはVista) ではありますが、これが、およそ全てのオーディオソースを劣化した状態でしか出力できないという事実を沢山の方々に認知して頂いて、
その声がマイクロソフト社に届き一刻も早くこの不具合を修正してくれればと願い、このレポートを書きました。
一Windowsユーザーとして、 一エンジニアとして、
一ミュージシャンとして、一ボカロPとして・・・・
本レポートの転載、引用、翻訳、ご自由にどうぞ。
2012年11月11日ありぱぱP
VOCALOID3をReWire化するV3Syncなど、音楽関連の便利ソフトウェアなどは
ありぱぱブログ で公開中
|