続きました。
一話目がありますが、読まなくても大丈夫です。
初心者が勉強したことをテキトーアウトプットしてるだけですので、間違えてる箇所が多いかもしれません。間違えてたらご指摘お願いします。
今回は__プログラミング、コーディングのお話はナシ。__
#音を出力するまでの物理的な工程の話
サウンドプログラミング関連の参考書はなかなか話題がフォーカスしすぎたものが多く、全くの初心者にはどういう工程のどの部分について言っているのかわかりません。概念的な工程のイメージがつかめれば、その意味不明な参考書が光り輝く情報源になるはずです!
というわけで、今回は__どういう流れでPC上で音を扱う__のか、うっすーーいお話しをしていきます。
##こんな人に読んで欲しい
- サウンドプログラミングやってみたいけど具体的なイメージが掴めない人
- デジタルサウンドがどうやってできているか知らない人
##デジタル上での音データの中身は?
PC上でサウンドデータを操作すると言っても、サウンドってどうやってデジタルでデータ保持しているのでしょう?
###音はもともとアナログなもの
音というのは波です。__連続的__な信号です。
ですので、デジタル上でそのまま音の情報を入力するのは無理なのですね。連続的な値を本気で表現しようと思ったらファイルサイズが無限大になります。
ここでよく聞く__A/D変換__という工程を踏みます。
###A/D変換とは?
この言葉だけ聞くとビビってしまいそうですが、簡単な話です。
__アナログ→デジタルに音を変換しましょう__ということです。
まず連続した波の値を、何分割かして離散値にします。これは__サンプリング(標本化)__と言います。(A/D変換=標本化といっていい?)細かく分割すればするほど、細かい音の変化が取れるので、解像度の高いデータという事になります。この分割数は、1秒間に実行する標本化処理の回数で表されます。これを__サンプリングレート__と呼びます。
サンプリングレートはその時の必要条件を満たすぐらいの値でいいのですが、人間の耳が聞き取れる限界がだいたい22khzぐらいなのでCD音源などは44.1khzです。
ん?なぜ聞き取れる音の最大値から倍の値なのかって?標本化定理で検索けんさくう!
###PCM配列にしまう
さてA/D変換を行って何が嬉しいかということなんですが、エンジニアならわかるでしょう!__配列に突っ込め__るのです!
この時に一個一個のデータの表せる精度の高さを__量子化ビット数__と言います。
16bitもあれば2の16乗分なので、0〜65,535の65,536段階まで表せるのでこんなもんでいいかなという感じです。もっと細かくしてもいいですが、データ量と相談してください。
rustでかくとこんな感じ..?
let pcm :Vector<i16> = vec![];
このサンプリングデータを配列として表現したものが、__リニアPCM__というものになります。
これが__デジタルサウンドデータの本体__なわけですね〜。
##どうやって音を出力するのか
これはA/D変換と逆のことをします。つまり、D/A変換__ですね。
音を出力するときは__アナログの波に戻さないといけません。これはまあ、電気的な話です。詳しく知らなくてもソフトウェア組みたいだけなら深く知らなくていいでしょう。
アナログへ変換が終わると、スピーカーなどのハードを振動させる事によって音を出力します。
##終わりに
今回もざっくりすぎる説明をいたしました。もっと知りたいと思ったかたはこの記事のキーワードをゴリゴリ検索していただければお分かりいただけるかと思います。
自分は専門家ではないので。エンジニア視点でだいたい流れがつかめればいいくらいに考えています。お読みいただきありがとうございました。
##参考にさせていただいたページ
PCM ‐ 通信用語の基礎知識
用語解説辞典|【公式】NTTPC