A を B として知覚させる : DSDWrite の例
こんにちは。 Signal compose の leico です。
今回はカオスになっている僕の github リポジトリ から DSDWrite について解説をしたいと思います。
2019.01.14 追記
続 ・ DSDWrite で作った音で演奏してみた:https://si-partners.net/blog/dsdwrite-02.html
この記事で紹介した音の作り方を用いてライブをしてみました。
簡単な紹介
みなさん DSD というファイル規格はご存知でしょうか。 ざっくりと説明するとwave や mp3 など PCM とは異なる方式で記録されている音ファイルのことです。 一般的な DSD ファイルは CD よりも多くの情報を保持することができ、再生することができる装置もハイレゾ対応を謳っていることが多いです。
DSDWrite はいかなるデータも DSD ファイルの一種、DSF として書き出すことができるコマンドラインツールです。バイナリは Release から入手できます。以下が使い方のサンプルです。
$ ./DSDWrite data.dat output.dsf
このプログラムは何をしているかというと、第一引数でもらったファイルに DSF 用のヘッダをつけ、ファイルの内容を音声データとしてそのまま第二引数のファイルに書き出します。
なので、どんなデータが渡されようと対応するソフトウェア/ハードウェアでとりあえず再生することはできるようになります。今回はデモをクレオフーガにアップロードする関係で XLD で DSF を mp3 に変換しています。
実際にやってみた
実際にいくつかやってみましょう。まずは DSDWrite 自身を DSF に変換してみました。
一瞬のノイズだけのかた、そのコンピュータは正常です。
バイナリサイズが 32k しかないので情報量の多い DSF だとこの程度になると思います。
じゃあもう少し大きいものを食べさせてみましょう。 こんな画像を入れてみました。
おいしそうな鮎ですねー。
先頭の音は一般的なJpegのヘッダの音でしょうか。その後ホワイトノイズが続きます。
3.8MB でもこの程度の時間しか楽しめないみたいです。もっと大きいデータを入れてみましょう。
Max8 のインストールイメージ!!!
ちょっと長く複雑になってきました。基本はホワイトノイズっぽいですが、高域にチリチリしたのとかパルスノイズがちょこちょこ混ざっていますね。
発想を変えてみます。何でも入れれるということは wave や mp3 なども変換することができます。音楽ファイルを直接 DSD に変換したらどうなってしまうのでしょうか。メイドインアビスより “The First Layer / Kevin Penkin” を DSF 化してみます。アレンジと認められない場合は削除されているかもしれません。
面影が残ってる・・・! でも壊れています!
深界一層目からラストダイブ、上昇負荷は人間性の喪失って感じです。素晴らしい。
どうでしょうか。なんでも DSF になる=何でも音になるというのが実感できましたでしょうか。
DSF データ構造
ここからは DSF ファイル形式について、つまりプログラムが何をデータに加えているのかを少し解説します。仕様とか規格とかに興味ない方は飛ばしてもらってかまいません。以下テーブル画像はこちらの PDF から引用しています。
DSD チャンクと呼ばれるものが最初に追加されます。内容は
- "DSD " という文字列
- DSD チャンクのサイズ 28 byte
- DSF ファイル全体のサイズ
- ID3v2 タグが始める場所へのポインタ、音データの最後までのサイズで合うはず
の4点です。コードでいうとこの辺りです。
次にフォーマットチャンクが追加されます。コードでいうとこの辺りです。内容は
- "fmt " という文字列
- フォーマットチャンクのサイズ 52 byte
- フォーマットのバージョンフォーマットの ID = 0 (DSD-Raw) 固定
- チャンネルタイプ、詳しくは下方の引用画像参照
です。
チャンネル数、チャンネルタイプ2(ステレオ)で4を設定したら
ステレオの音声が2つということになるようだ。
各種DSDフォーマットの構造:https://ch.nicovideo.jp/piano/blomaga/ar545214
- サンプリング周波数、 2822400 or 5644800Bit
- per Sample、 通常は 1
- サンプルカウント、1chに付何サンプルになるか。秒数 * サンプリング周波数でよさそう
- ブロックサイズ、4096 固定、なので正常に再生させる場合は音楽データの領域は4096の倍数でなければならない
- 予約領域、0で埋める
最後のデータチャンクです。ここのデータとして第一引数のファイルが入ります。
内容は
- "data" という文字列
- データのサイズ
- 音データ
です。コードではこの辺りになります。
サンプルカウント等、計算しなければならない部分はこの辺りで計算しています。
この後はただひたすらファイルに書き出しているだけです。
おわりに
ざっくりとした説明でしたがいかがでしたでしょうか。
コードも長いわけでもなく、変数宣言が半分くらいを占めているので読むのもそこまで苦労しないと思います。
今回重要なのは、ディジタルデータは 0 と 1 でできていて、その配列パターンによって区別されていることです。0 と 1 がファイルの規格通りに並んでいれば、あるいは並ぶように配置し直せば、元がどんなものであろうと強制的に別のファイル形式として認識してくれるのです。その出力は予想できない、未だ体験し得ないものを生み出し得るということが分かります。
執筆:大石桂誉
関連記事
-
Blog
Expressで作ったNode.jsアプリでhttpsを有効にするには?
-
Blog
これからのリベラルな音楽のためのアカデミー
-
Blog
Music Transformerを動かしてみる
-
Blog
自前サーバで HTTP Live Streaming 配信をする
-
Blog
MacBook Proをクラムシェルにした時iPhoneをウェブカムの代わりにして使うには?と、あと少しのTips
-
Blog
unityを始めてみようか。
-
Blog
ORCΛでMIDI音源を鳴らす(IAC Busの場合)
-
Blog
tensorflow1.15系と2.0系を同居させておくには?(ubuntu, GPU環境)
-
Blog
マジで最初から Swift で iOS アプリ作る(TextView)
-
Blog
マジで最初から Swift で iOS アプリ作る (Hello SwiftUI!)