MDX Player for iOS ver 2を更に高音質化するHiDef版のガイド

MDX Player ver2で再生周波数を変更できるようになりました(22,44,48,62.5KHz)
62.5KHzでは音質が良いのですが、他の周波数では内部で62.5KHzでエミュレートした上でダウンサンプリングをしていて、そのせいで音質が悪化します。

変更点

エミュレートエンジンであるGAMDXを改造して、
1) 指定周波数でのエミュレートを行いそのまま出力する(GAMDXの内部処理を変更)
2)ダウンサンプリングが必要なときは、高音質のリサンプラーを通すようにする
3) ADPCMは15.6KHzからアップサンプリングしているので、そこもリサンプラーを通す
リサンプラーはBSDライセンスのspeexライブラリを使用しました。2),3)はコンパイル時に使用・不使用を設定できるようにしました(後述)。iOS版では2)はメリットが殆ど無いのでデフォルトではオフにしてあります

4)また、究極の高音質化として、62.5KHz のMDX出力をダウンサンプルすること無くアップサンプルして出力できるよう、192KHzまでのHiDef DAC(外付け)に対応しました(実際に鳴っているところをまだ確認できていませんが

5)内部処理と、出力の周波数が違うので、周波数ボタンを2段にして上が内部処理、下が外部出力周波数とします

6)MDXを聞きながらポケモンGOをしていて気づいたのですが、一部のMDXファイルではボリュームが小さめのものがあります。ボリュームスイッチで音量を上げると、ポケモンGOの効果音が非常に大きくなってしまいます。せっかく内部のボリュームバーが付いたので、ボリュームを0〜1ではなく2まであげられるようにしてみました。

7)ボリュームを内部処理で上げると、16bitPCMの範囲からオーバーフローすることがあります(実はこれまでも一部の曲ではオーバーフローしていることはあった)。オーバーフローした時は自動的にボリュームを下げる機能をつけました(Automatic Gain Control)。ただ、次の曲に移ったときもそのボリュームが維持されるのが難点ですが。

8)周波数を変更したときにハングすることが一度だけ確認できました(何処かでMutexが開放されていないため?)。曲選択でエラーになったときにMutexが開放されていませんでしたので直しました。またしばらくMutex確保できないときにはタイム・アウトするようにしてみました。

使用法

https://github.com/sinn246/MDXPlayer/tree/HiDef においてあります。

フォルダ GAMDX > jni > speex というのが新たに導入したリサンプラーのファイル群です。
そのなかで speex_MDX.h というヘッダファイルにコンパイル時設定をまとめました。

#define USE_SPEEX
これを設定するとspeexルーチンが導入されます。設定しなければもとのままですが、リサンプラーはどうなるかというと、AppleがCoreAudioの中で勝手にリサンプルしてくれます

#define USE_SPEEX_FOR_ADPCM_UPSAMPLING
これを設定すると、ADPCMのアップサンプリングにspeexを使います。アップサンプリングにはわずかにディレイが生じるので、微妙にADPCMだけ音が遅れることにつながりますが、私にはほとんどわかりません・・・

// #define USE_SPEEX_FOR_DOWNSAMPLING
62.5KHzからダウンサンプルする必要があるとき、CoreAudioに任せずspeexライブラリを使用します。iPhoneで使う分には特に音質が上がるわけではなく(CoreAudioも音質は悪くなくさらに最適化されていると考えられるので)、研究的なもの(Androidなどに移植するときに使えるかも)として一応ソース上は残してあります(が、オフにしてあります

MDXPlayer高音質化番外編:192KHzのHiDefで出力

MDXPlayerの高音質化を色々やっていたわけですが、62.5KHzのFM音源の出力を48KHzにダウンサンプルすると必ず音質は落ちるはずです(人間の耳ではほとんど違いはないはずですが)。いっぽうで、手元にはMacに繋いでiPhoneの出力を取り込んで分析するために購入したUSB-DACがあります。これをiPhoneに繋いで192KHzで出力することができれば、62.5KHzの約3倍になるので限りなく原音に近い出力が得られるに違いない!と考えました。いわゆるハイレゾ音源です。

iOS 7で実現! iPhoneからハイレゾ出力する方法を徹底ナビ

AppleがDTM正式サポート! Lightning-USB3カメラアダプタを使ってみた

などを参考にして、まずLightning – USB 3カメラアダプタを購入します・・¥4,200か・・・と思ったらヨドバシのポイントカードで買えました。早速繋いでみると、DACの電源ランプがつきません。USBバスパワー駆動なので、電源供給できるUSBハブを経由すると動く可能性があるようですが、むかしそんなのが家にあったような気がするもわざわざ購入するのも・・・動く保証もないし・・・と思いながら数週間が経過。しかしUSB3アダプターまで買ったのだからと一念発起して電源供給できるハブを購入しました。約1300円なり。

繋いでみると・・・ランプが点灯して認識されました!

img_6413

イヤホンをDACに入れてさて聞いてみようとすると・・・音が出ていません。iOS10からサウンドの出力先の設定がわかりやすくなっているので、画面に出してみると・・・・

img_6414

SPDIF出力になっています。私が使っているUSB-DACはMacでは出力先をドライバなどで設定する形になってますが(下の図でOutputを選ぶとUSB-DACのイヤホン端子から音が出る)iOSではどうすればいいのか・・・

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-11-16-17-51

しばらく色々やってみましたがだめぽいです。

ただ、192KHzでの出力自体はできているのか確認してみましょう。MDXPlayerをちょっといじってみて、192KHzでの出力を要求するようにして、実際に出力されている周波数も表示するようにしてみます

    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setPreferredSampleRate:192000.0 error:nil];    // 希望する周波数
    [session setCategory:AVAudioSessionCategoryPlayback error:nil];
    [session setActive:YES error:nil];
    float sr = [session sampleRate];  // この返り値が実際の出力周波数

USB-DAC繋いでいないとき:周波数の欄は2段になっていて、上がアプリ内部の周波数、下が実際の周波数です。48KHzにダウンサンプルされていることが確認できます
img_6416

 

USB-DACを繋いだとき:192KHzで実際に出力されているようです!

聞けないけど。

img_6415

ということで、手持ちのSD-U2DAC-HPLはiPhoneでは出力できないっぽいというレポートでした。どなたかiPhoneで使えるDACをお持ちでしたら試してみてください。ソースはGitHub https://github.com/sinn246/MDXPlayer/tree/HiDef に置いておきます。