7
31
2016
lightMPD によるネットワークオーディオ
lightMPD + Raspberry Pi + I2S DAC でネットワークオーディオプレイヤー
Raspberry Piによるネットワークオーディオとして最もポピュラーなのは、volumio との組み合わせによるもので、Linuxの知識が無くてもそれなりに楽しむことができ、巷に情報も溢れているので入門用としては丁度良いのかもしれない.しかしながらOSに汎用的なLinuxを用いていることから、一般的なオーディオ専用機のように電源ブチッで修了という訳にはいかない.
システム終了時の問題の他に、もう一つデジタルオーディオ機器の制御用のOSとして汎用的なLinuxを使う場合に問題となるのが、OSの各プロセスの影響によるリアルタイム制御の難しさが挙げられる.組み込み機器用のOSでシビアなリアルタイム制御が必要な場合は、所謂 Real Time OS と呼ばれる専用の制御用OSが使われており、一定時間内に決められた処理を正確なタイミングで実行することが可能だ.
デジタルオーディオ機器を用いて音楽製作を行っている方々は、デジタルオーディオ機器のレーテンシー(Latency)をとても気にしている.音楽製作の現場ではレーテンシーを極力小さくすることが望まれている.残念ながら一般的なLinux OS では、オーディオ関係のプロセスだけをリアルタイム処理することは難しい.勿論、volumioなどのオーディオ専用のLinuxディストリビューションでは、オーディオ処理とは関係の無いプロセスを極力排除して、安定したオーディオ処理が行われるように工夫がされてはいるが、高音質再生という観点からはまだまだ不十分だ.
これらのLinux OS の欠点を取り除いて、高音質オーディオ再生に特化した超軽量Linuxディストリビューションが今回紹介する lightMPD と呼ばれているものだ.lightMPDの特徴を幾つか挙げると、
・リアルタイム拡張Linuxカーネル
・クロックジッタ低減処置
・サンプリングレート変換機能
・オンメモリOS
・超軽量
・DSDネイティブ再生が可能
・音源はNASに格納する必要がある(可能で有ればCIFSではなくNFSを使う方が望ましい)
・対応ハードウェア(BeagleBone Black, cubox-i4, wand aboard, alix3d2, apu.1c, api 2c, Raspberry Pi 1〜3)
勿論、上記の特徴は裏返せばコンピュータアプリケーションとしての機能は制限されるということであり、volumioなどのようなWebGUIによる操作は望めない.(ympdという簡単なWeb GUIは一応使えるが、実用性は乏しいので、他の MPD クライアントアプリケーションと組み合わせる必要がある)
lightMPDに関する情報は、基本的に上記の日本語サイト(デジファイのおと)を参照するしかないが、linuxやネットワークなどの知識が無い一般的なオーディオマニアにとってはこのサイトの情報はちょっと敷居が高いかもしれない.インタフェース紙(2015年12月号『自分専用Linux X ラズパイ・オーディオ』)のp.p. 100 〜 113 にlightMPDが詳しく紹介されているので、そちらを参考にすると良いだろう.
lightMPDを自分の環境に合わせて拡張しようとしても殆ど情報が公開されていないので困難だ.せめてlightMPDで使用(関係)している一ソースコードだけでも一覧を紹介してくれれば良いのだが...
lightMPDを使うような人達は極限まで音質に拘るコアなオーディオマニアが多いと思われるが、lightMPDによる音はこれまでのUSB DACの音とは次元が異なっていると言えるだろう.私の駄耳でもその違いがハッキリと分かるのだが、人によってはlightMPDの音は鋭すぎて聞き疲れするかもしれない.
lightMPDのI2S出力信号を調べてみた
lightMPDではPCM音源の他に、DSDネイティブ方式にも対応しているということなので、今回はDSD廻りの信号ハンドリングについて調べてみることにする.実験に使用したlightMPDのコンフィグレーションは次の様に設定してある.
・ ”config.txt”
kernel=/boot/zImage
initramfs /boot/initrd.romfs.gz 0x02000000
#
#
dtoverlay=rpi-dac
#dtoverlay=hifiberry-dac
#dtoverlay=hifiberry-dacplus
#dtoverlay=hifiberry-digi
#dtoverlay=hifiberry-amp
#
#dtoverlay=iqaudio-dac
#dtoverlay=iqaudio-dacplus
#
#dtoverlay=sabreberry32
#dtoverlay=sabreberry32,slave
※ I2S出力を行うので、”rpi-dac” を指定している.USB経由で USB DACを繋ぐ場合は ”dtoverlay” は”config.txt”では指定しない.( 次の “lightmpd.conf” 中で “dac=usb-audio” を指定する )
・ ”lightmpd.conf” ( 一部だけ抜粋 )
#
[network]
interface=eth0
address=192.168.101.21
netmask=255.255.255.0
gateway=192.168.101.254
nameserver=192.168.100.1
domain=music.home.yoko
[ntp]
server=ntp.nict.jp
ntpd=no
timezone=Asia/Tokyo
[nas:NASMusic]
type=nfs
host=nas.home.yoko
remotedir=volume3/Media
proto=tcp
rsize=65536
wsize=65536
...
#
dac=rpi-dac
# dac=usb-audio
# dac=usb-hiface
#
load_module=mpd-0.19.10rt-native-dsd
music_directory=NASMusic/Sounds
playlist_directory=NASMusic/mpd-rpi/playlists
db_file=NASMusic/mpd-rpi/tag_cache
sticker_file=NASMusic/mpd-rpi/sticker.sql
# log_file=NASMusic/mpd-rpi/mpd.log
log_file=/dev/null
・ ”mpd.conf” ( 一部だけ抜粋 )
audio_output {
type "alsa"
name "uda"
device "hw:0,0" # optional
priority "FIFO:54" # optional
mixer_type "disabled"
# mixer_control "Playback Digital"
dsd_usb "no"
# dsd_usb "yes"
dsd_native "yes"
dsd_native_type "2"
buffer_time "150000"
period_time "37500"
}
※ dsd_usb=”no” → DSD Native 出力(ここでの Nativeの意味は DoPではないという意味)
dsd_usb=”yes” → DSD DoP 出力()
dsd_native “yes” PCM 変換は行わない
dsd_native_type “2” 何故か “2” 以外を指定すると DSD/PCM 変換されてしまう?
PCM 48kHz 16bit (左側: 上 LRCK、 下 BCK – x64FS、 右側: 上 LRCK、 下 DATA )
PCMの再生は192KHzまでは再生可能だが、私の環境では時々音が途切れてプチノイズが発生する事があったので、バッファサイズ等の調整が必要かもしれない.Raspberry Piのネットワーク環境も影響しているかもしれない.352kHzのPCMはALSAドライバが上限を192KHzに制限している関係で再生することができない.ALSAドライバ廻りを修正してカーネルを再構築する必要があるだろう.
DSD64(2.8MHz) Native(左側: 上 LRCK、 下 DATA )
DSD64(2.8MHz) Native(左側: 上 BCK、 下 DATA )
DSD128(5.6MHz) Native(左側: 上 LRCK、 下 DATA )
DSD256(11.2MHz) Native(左側: 上 LRCK、 下 DATA )
上記の4枚の画像は、DSD Native モードで出力先をI2Sにした場合のものだ.LRCK, BCK, DATA はPCMモードの信号ピンの表記を便宜上そのまま記載している.DSD64(2.8MHz)の再生時には、LRCKピンに 88.2KHzのクロック信号が出力され、BCKピンには5.6MHz(x64Fs)のクロックが出ている.一方DATAピンはLRCKピンの半周期毎に24bit単位で1ビットストリームデータが出力されているように見える.どうやらこの信号は本来なら XMOS などのUSB DDC に出力する Native DSD信号のようだ.この信号は DAC が受け取るDSDビットストリーム信号とも異なるので、この信号をそのまま DAC のDSD入力として渡すこともできない.DSD256(11.2MHz)の場合は単純にLRCKの周波数は352.4KHzになりそうだが、ALSAドライバの上限の192KHzに引っ掛かってしまっているようだ.
DSD64(2.8MHz) DoP(左側: 上 LRCK、 下 DATA )
この画像は、DSD64(2.8MHz)をDSD DoP モードで出力先をI2Sにした場合のものだ.DSD64(2.8MHz)のDoPモードでの再生時には、LRCKピンに 176.4KHzのクロック信号が出力され、BCKピンには11.2MHz(x64Fs)のクロックが出ている.一方DATAピンはLRCKピンの半周期毎にDoPマーカ(0x05/0xFA)の8bitデータと共にに16bit単位の1ビットストリームデータが出力されている.勿論このデータをそのままPCM信号として再生してしまうことはできないので、DoP信号をDSDの1ビットストリームデータへ変換する必要がある.AK4137にはDoPからDSDへの変換モードがあるので、AK4137をDSD DACのフロントエンドに使うという手もありだろう.
DoP方式での DSD128(5.6MHz)の再生を行う場合は単純に LRCKを352.8KHz に上げれば良いのだが、Raspberry Pi のALSA ドライバでのPCM方式の最高サンプリング周波数は 192KHzに制限されているので、DoP方式での DSD128(5.6MHz)の再生を行う場合はALSA ドライバを書き換えて、352.8KHz に対応させる必要がある.(DENON のDA-300USBのPCMの上限は192KHzに抑えられているが、PCMモードで352.4KHzが設定されているのは、DoP方式でDSD128を再生させるためのダミー)
lightMPDによるネットワークプレーヤーの場合、PCM系で有れば 192KHzまで、DSDネイティブ再生で有れば DSD64(2.8MHz) までということになるだろう.I2S方式のDACカードでネイティブDSD方式に対応させるのは難しいので、lightMPDの場合は一旦USB出力させて、XMOSやAmanero384等のUSB DDC経由でDSD 対応DACに繋ぐというのが無難な方法だ.
参考情報
・DSDフォーマットに関する資料
”Enabling DSD256 in the USB Audio 2.0 De- vice Reference Design Software”
“DoP open Standard”