LinuxデスクトップでDSD音源のネイティブ再生


#### 想定している読者
デスクトップLinuxを使用していて、DSDのネイティブ再生に興味を持っている方。


## DSDって何？
アナログの音をデジタルに変換する時の変調方式として[PCM](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%AB%E3%82%B9%E7%AC%A6%E5%8F%B7%E5%A4%89%E8%AA%BF)と[ΔΣ変調](https://ja.wikipedia.org/wiki/%CE%94%CE%A3%E5%A4%89%E8%AA%BF)の2つが実用化されていますが、世の中のデジタル音源のほとんどはPCMで 1)、ΔΣ変調音源のシェアなんて0.1%にも満たないでしょう。ΔΣ変調がどマイナーな最大の理由は、ΔΣ変調でデジタル化されたデータは再加工が困難だという点にあります。ΔΣ変調方式でデジタル化されたデータは音の大きさの変更すらできません。そのため録音側ではミキシング作業ができないし 2)、再生側でもアナログのボリュームしか使えないというめんどくささがあります。
DSD (Direct Stream Digital) とはソニーとフィリップスが商標を持つΔΣ変調で録音と再生を行うハイレゾオーディオシステムの呼称です。1999年にCDよりも音のクオリティが高い光学円盤として発売されたSACDが最初に世に出たDSD製品になります。ただその後音楽配信のメディアは光学円盤からオンラインに移行したため、現在DSD音源というとオンラインで配信される、拡張子が .dsf, .dsdiff, .wsd のファイルを指すことが多いようです。本記事もそれに倣います。
DSDはボリュームの変更すら難しいという扱いの不便があるにもかかわらず、その音の魅力から一部の熱心な録音エンジニアやオーディオ愛好家からの強い支持をうけ、数は少ないながらも新譜が脈々とリリースされ続けています。
  
注;
1): ネットや光学円盤で流通している音源データとしてはΔΣ変調方式はマイナーなのですが、DAコンバーターチップの内部でデジタルデータをアナログの音声信号に変換する部分ではΔΣ変調は多用されています。
2): 楽曲データの製作時にミキシング作業をなくすというのは現実的でないので、ほとんどのDSD制作現場ではΔΣ変調されたデータを一旦PCMやアナログ、もしくは擬似的なΔΣフォーマットに変換して作業をせざるを得ません。ミキシングの際一時的にPCM変換するのはDSD原理主義者からは邪道だとみなされるようです。

## DSDっていい音なの？
私の経験では、ビットレートが同じくらいならDSDのほうがPCMより絶対的に良い音だと感じたことはないです。ただ2つの変調方式の違いはなんとなく感じます。
PCM音源と比較して、DSDの音には演奏現場に居るような空気感があると良く言われます。SACD が出回り始めた時もみんな空気感って言葉を使ってましたね。私もDSDの音を聞いてみるまでは、空気感って何だよ？って思ってたのですが、聞いてみたら”空気感”でした。(なんだそりゃ)
DSDっていい音なのか、また空気感ってなんだというのは皆さんで体験していただくしかありません。本記事がそのお役に立てれば本望です。


## DSDのネイティブ再生って何？
ΔΣ変調のDSDデータをPCMに変換すること無くPCからDAコンバーター(以下DAC)に転送して、DAC側でアナログの音データに変換するのが”ネイティブ再生”です。LinuxでDSDのネイティブ再生をするには、DAC、デバイスドライバ、Linuxのカーネル、アプリケーションソフトが全て対応している必要があります。

### 再生装置
本記事では読者がDSD再生ができるDACを所有していて、ALSAで音を出せている前提で話をします。

注;
本記事では深入りしませんが、DAC側がDSDを本当にネイティブに再生しているのかという問題があります。DSDの再生が可能だと謳っているDACでも、実際には内部でDSDデータをPCMに変換してから音を再生する製品があるからです。基本的にはDSDデータは音量すら変更できないので、DSDに対してデジタルでボリュームが調整できるDACはDSDをネイティブ再生していないと考えられます。
ところがESS Technology 社のDACチップを使った製品ではDSDネイティブ再生を謳っていながらデジタルボリュームが使えます。なんでこんなことができるのかESS社から正式なアナウンスがないようですが、[ネットの掲示板情報](https://audiophilestyle.com/forums/topic/19381-ess-sabre-and-dsd-volume-control/)によれば、DSDの 1,0,0,1,1,0,... という2値のデータを同じ周波数の 63,0,0,63,63,0,... という6ビットデータに変更して、この6ビット数を増減させることで音の大きさを変えているとのことです。こういう方法だったら一種のDSDネイティブ再生方式だと言えるような気がします。(その後で32ビット352.8KHzとかのPCMにしてるとの推測もあります)



### デバイスドライバ
DSDのネイティブ再生に対応している新しめのUSB DACの多くはUSBポートにXMOS社のチップを使ってますが、その場合はたいていネイティブ再生が可能だと思います。ただ例外もあるようですのでお使いのDACがLinuxでDSD再生できるかどうかはググってみてください。"WindowsのASIO DoPにしか対応しません" というDACはLinuxのデバイスドライバではDSDネイティブ再生はできないかもしれません。再生中のサウンドがDSDネイティブ再生かどうかの確認手段は後述します。
HDMI接続のAV機器は知見がないのですが、対応は困難みたいです。

### カーネル
Linuxの4.1.10以上のカーネルはDSDネイティブ再生の機能を有します。最近のメジャーなディストリビューションだったら特に何も考えなくていいです。

### ソフトウェア
後述します。本記事はMPDを使う方法をメインに説明します。Debian 10, Ubuntu 18, Manjaro で動作確認してます。


## Linux でDSDのネイティブ再生ってどんな方法があるの？
### 普通のアプリケーションソフトを使う方法
Linuxでの音楽再生によく使われる、Audicious, Banshee, Clementine, VLCなどは2020年時点ではDSDのネイティブ再生をサポートしていません。Audicious, DeadBeef などではDSD音源を再生する機能はあるのですが、これはDSD音源をPCMに変換してDACにデータを送る機能であり、DACはPCMデータを受け取って再生することになります。ネイティブ再生ではありません。  
有料のソフトならDSDネイティブ再生が可能なものもあります。
HQPlayer  という高品質オーディオプレーヤーはでコンシューマー向けは6万円、スタジオ向けが48万9千円というなかなか結構なお値段です。もう少し庶民的なソフトとしては JRiver Media Center というのがあり日本のAmazonでは7200円でした。  
残念ながら、単独のアプリケーションソフトでDSDのネイティブ再生ができて無料っていうのは現在無いです。

### Windowsの音楽再生ソフトを使う方法
Windowsで評価の高い音楽再生ソフト[Foobar2000はWine上で動くそう](http://moebuntu.blog48.fc2.com/blog-entry-1386.html?sp)なので、これを使う手もあります。Wine ではなく VMwareや Virtual Box 上のWindows でFoobar2000 を動かすほうがシステムのリソースは食いますが、設定は Wine より簡単かもしれません。具体的な方法は割愛します。


### MPD; Music Player Daemon を使う方法　🎀本記事のメイントピック
MPDは各種のオーディオデータを再生するサーバーで、DSDの再生も可能です。MPDはユーザーインターフェースを持たないので、楽曲を再生する時はMPDクライアントと呼ばれるアプリケーションソフトを組み合わせる必要があります。設定はちょっと面倒ですが、LinuxでDSDをネイティブ再生するにはこれが最適解ではないでしょうか。また最近の Red Hat 系ディストリビューションではMPDの公式パッケージが用意されてないみたいです。

MPDクライアントは60種類以上ありますが、本記事では Cantata というソフトを使うこととします。
![cantata_playback.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167499/18915040-ff74-d325-92e9-917430529654.png)

### 番外編 スマホを使って HF Player で再生 <font color="#663333"> < Linux デスクトップ関係ねえじゃん</font>
オンキョー製の Android, iOS 用音楽再生アプリのHF Player はDSDのネイティブ再生をサポートしてます。スマホとDACをつなぐUSBケーブルがあれば、これが一番お手軽なDSDのネイティブ再生手段だと思います。

## MPD で DSD のネイティブ再生
MPDパッケージをインストールした素の状態だと、MPDはPC起動時にsystemdによってデーモンとして起動します。これでも悪くはないですが、起動停止や設定変更が一般ユーザー権限でできる方が使い勝手が良いので本記事ではログインユーザー権限でMPDをコントロールするよう設定を変更することとして説明をします。  
作業は次の手順になります。
- MPD, Cantata のインストール
- PC起動時にmpdが systemd によって起動されないように変更
- 設定ファイルのための情報収集
- 設定ファイルの書き換え
- オーディオデータの再生
- DSDネイティブ再生していることの確認

コマンド打ち込みの説明で、コマンドの前に "#" が付いている時はルート権限で、"$" が付いている時はログインユーザー権限でコマンドを打つことを意味します。

### ● MPD, Cantata のインストール

```sh:Debian,Ubuntu
# apt-get install mpd cantata
```

```sh:Arch,Manjaro
# pacman -S mpd cantata
```

MPDは /usr/bin に置かれ、一般ユーザーの権限で起動停止が可能な状態でインストールされます。

### ● PC起動時にmpdが systemd によって起動されないように変更

MPDをインストールした直後はルート権限でMPDが動いているので、一旦

```sh:
# systemctl stop mpd
```

などとしてMPDを止めます。
次いで次回以降の起動時にMPDが起動しないように設定をします。今日びのLinuxでは、起動時のサービス停止コマンドは

```
# systemctl disable mpd
```

ですね。GUIが慣れてる方や init.d 的な手法を使われている方はお好みの方法でどうぞ。

### ● 設定ファイルのための情報収集

MPDを動かすための設定ファイルに、DSDネイティブ再生をするDACのハードウェア番号もしくはデバイス名が必要になります。次のコマンドを叩いてみてください。

```
$ cat /proc/asound/cards
```
例えばこんな感じの出力が返ってきます。

```
0 [PCH            ]: HDA-Intel - HDA Intel PCH
                      HDA Intel PCH at 0xc5740000 irq 131
1 [NVidia         ]: HDA-Intel - HDA NVidia
                      HDA NVidia at 0xc4000000 irq 17
2 [HUDmx1         ]: USB-Audio - Audinst HUD-mx1
                      Audinst, Inc. Audinst HUD-mx1 at usb-0000:00:14.0-2, full speed
3 [G20            ]: USB-Audio - Gustard USB Audio 2.0
                      Gustard Gustard USB Audio 2.0 at usb-0000:00:14.0-1, high speed
4 [Audio          ]: USB-Audio - NFJ USB Audio
                      VIA Technologies Inc. NFJ USB Audio at usb-0000:00:14.0-6, full speed
```
ハードウェア番号は左端の数字、[ ]内の文字列がデバイス名です。ハードウェア番号は、USB接続のDACなら接続するUSBポートを変えたり、電源を入れる順序を変えることで変わるので注意してください。  
ベンダー名からDACを特定できると思います。


### ● 設定ファイルの書き換え

ログインユーザーがmpdを起動する時、MPDは `~/.config/mpd/mpd.conf` という設定ファイルを読みに行きます。mpd.conf の内容はmpdのバージョンによって微妙に異なるので、インストールしたMPD に添付されているファイルをベースに書き換えることとします。
ベースとなる設定ファイルのありかはディストリビューションによって異なっているので、それぞれ下記のコマンドで mpd.conf の雛形を用意してください。

```sh:debianの場合
$ mkdir ~/.config/mpd                 # mpd 設定ファイルのためのディレクトリ作成
$ mkdir ~/.config/mpd/playlists       # 再生リストのためのディレクトリ作成
$ sudo cp /etc/mpd.conf ~/.config/mpd
$ sudo chown YOUR_USER_NAME ~/.config/mpd/mpd.conf
```

```sh:ubuntuの場合
$ mkdir ~/.config/mpd                 # mpd 設定ファイルのためのディレクトリ作成
$ mkdir ~/.config/mpd/playlists       # 再生リストのためのディレクトリ作成
$ cd ~/.config/mpd
$ cp /usr/share/doc/mpd/mpdconf.example.gz ./
$ gzip -d mpdconf.example.gz
$ mv mpdconf.example mpd.conf
```

```sh:manjaroの場合
$ mkdir ~/.config/mpd                 # mpd 設定ファイルのためのディレクトリ作成
$ mkdir ~/.config/mpd/playlists       # 再生リストのためのディレクトリ作成
$ cp /usr/share/doc/mpd/mpdconf.example ~/.config/mpd/mpd.conf
```

次にエディタで ~/.config/mpd/mpd.conf を開いて内容を書き換えていきます。
最低限書き換えないといけないのは、①指定ディレクトリとファイル、②出力デバイス、③出力先のIPアドレス の3点です。  
#### ①指定ディレクトリとファイルの書き換え  
設定ファイルに music_directory, playlist_directory で始まる行があるので次のように書き換えます。

```
music_directory	"あなたが音楽ファイルを置いているディレクトリ"
playlist_directory       "~/.config/mpd/playlists"
xxxx_file で始まる行があるので、次のように書き換えます。
db_file                 "~/.config/mpd/tag_cache"
log_file                        "~/.config/mpd/mpd.log"
pid_file                        "~/.config/mpd/pid"
state_file                      "~/.config/mpd/state"
sticker_file    "~/.config/mpd/sticker.sql"
```
#### ②出力デバイスの書き換え  
Audio Outputセクションに出力デバイスを次のように書き加えます。

```
# Audio Output ################################################################
audio_output {
  type    "alsa"           # この行は必須
  name    "Gustard USB Audio 2.0"   # この行はラベルなので任意の名前でOKです
  device  "hw:G20,0"       # 先に調べた、DACのデバイス名、もしくはハードウェア番号を指定します
                           # "hw:デバイス名,0" もしくは "hw:ハードウェア番号,0" と書きます。
　# device "hw:3,0"        #　ハードウェア番号でDACを指定する例 
  mixer_type   "none"    # mixer_type は "none" (ボリュームを加工せず送出)か 
                         # "software" (MPDクライアントでボリューム調整する)か
                         # "hardware" (alsaのボリュームを使用する)  DSDのネイティブ再生時にはボリュームは効きません。
  # 再生トラックの切り替わり時にノイズが乗ったり音が乱れる場合、以下のバッファーサイズを
  # 適宜変更してください。最適サイズは環境により異なります。
  audio_buffer_size     "8192"  # デフォルトのバッファーサイズは 2048[kB] 
  buffer_before_play    "25%"   # デフォルト値の10%だと、トラックの切り替わりで音が乱れることがあります。
}
```
もし複数のデバイスを同時に鳴らしたいなら、鳴らしたいデバイスそれぞれに対して `audio_output{ ... } `を複数書けば良いです。DSD音源を再生すると、ネイティブ再生対応のデバイスにはネイティブのDSDデータが送られ、対応していないデバイスには自動的にPCMに変換されたデータが送られます。

#### ③出力先のIPアドレス  
`bind_to_address` の行を書き換えます。

```sh:mpdを動かすPCだけでMPDクライアントを使用する場合
bind_to_address    "localhost"
```

```sh:mpdを動かすPCに192.168.0.10/24が割り当てられている場合で、ネットワーク192.168.0.0/24にある他のマシンでもMPDクライアントを使用する場合  
bind_to_address    "192.168.0.10"
```

```sh:どのマシンのMPDクライアントに対しても応答する場合
bind_to_address    "any"
```


### ● オーディオデータの再生
MPD の起動は、

```
$ mpd
```  
とコマンドを叩くだけです。MPDを止めるときのコマンドは、

```
$ mpd --kill  
```
です。
MPDを常時起動させるなら、`.profile` に追加するなり、GUIを使って自動起動されるなりお好みの方法でどうぞ。  
MPDを起動させたらいよいよ音を出してみましょう。おおっとその前にアンプのハードウェアボリュームを最小に絞らなくては。DSDはソフトウェアボリュームが効かず100%の音量が出力されるので、PCMの音楽を鳴らした後にDSDの音源が巨大音量で再生されて心臓が飛び出そうになる、っていうのはDSDあるあるです。  
先にインストールしたCantataを起動しましょう。Cantataの操作は特に癖がなく、感覚的に使えると思います。なんならPCM音源を含めて常用の音楽再生アプリとしても良いかもです。
![cantata.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167499/2d4bcbc5-baf0-f253-0024-8b154e033bc8.png)
左端の"フォルダ”アイコンを選択してペイン左側の"Server Folders” (上の図でマウスカーソルが置かれてるところ)をクリックするとmpd.conf の music_directory で指定したディレクトリが開きます。ここから聞きたいファイルを選んでペイン右側にドラッグ-ドロップして再生ボタンをクリックすればファイルが再生されるはずです。ハードウェアボリュームを上げていってください。サウンドが再生されましたよね？おめでとう。


### ● DSDネイティブ再生していることの確認
ネイティブ再生してるかの確認は、もしDACに再生中のデータのフォーマットを表示する機能がついている場合、その表示を見るのが早くて確実です。
表示する機能がなければ、先に調べたDACのデバイス名を DEV_NAME として、次のコマンドを叩いてみてください。 

```sh:DEV_NAMEは確認したいDACのデバイス名
$ cat /proc/asound/DEV_NAME/pcm0p/sub0/hw_params
```
何も再生していない時

```
closed
```

DSDデータをネイティブ再生している時

```
access: RW_INTERLEAVED  
format: DSD_U32_BE     <------- DSDという語が付いてる = DSDネイティブ再生してる  
subformat: STD  
channels: 2  
rate: 88200 (88200/1)  
...
```  

PCMデータを再生している時

```
access: RW_INTERLEAVED
format: S32_LE　　　   <------- DSDという語がついてない。4)
subformat: STD
channels: 2
rate: 96000 (96000/1)
...
```
注4); DSDのネイティブ再生には、DoP; DSD over PCM という方式もあります。これはDSDデータをPCMデータの転送フォーマットに埋め込んで転送するという方式で、ちょっと前のDACだとこのDoPでしかDSDデータを受け付けないものがあります。DoPでデータを転送しているときは"DSD"は付かず `format: S32_LE` もしくは `format: S24_LE` となります。私はDoPに対応しているDACを所有しておらず、申し訳ないですが DoP専用DACの再生についてはこれ以上のことが書けません。