こんにちは, 情物2年, 回路屋 TM4-K10です. 今回は文字多め(?)のブログです.
この「部室の片隅」では, 自分で制作したものについて, 制作物の写真や動画, 参考サイトに加え, ワタシ自身の制作時の色んなコメントを書いていきます. 久しぶりの投稿です.
第3回目は「C言語によるサウンドプログラミング」です.
サウンドプログラミングとはコンピュータを使って音をつくることです. 言語やソフトは多岐にわたります. (調べてね) 今回はC言語で, sin波, 三角波, のこぎり波, 矩形波, ノイズの作り方について説明します. 今回出てくるwavファイルの音声はすべてC言語によるプログラミングで生成したものです.
今回はプログラムの詳細等には触れない予定です. 全体のコードは参考図書に掲載してあるので, そちらを参照してください. ご了承ください.
<音のつくりかたと音の説明>
※音量に注意!ノイズ以外の音の基本周波数は440Hz(A, ラの音).
音の作り方には, サイン波をひとつひとつ重ね合わせる「加算合成」と, 多数の周波数成分を含んだ波形から不必要な周波数成分を削り取る「減算合成」の二通りのやり方があります. 今回は「加算合成」でサイン波から三角波, のこぎり波, 矩形波, ノイズを作りたいと思います. (減算合成はアナログシンセサイザーを用いた音作りの手法です)
加算合成においてはサイン波は基本の音となりますが, これは周波数成分(基本周波数)が一つしか持っていないことに由来するものです. このことからサイン波は純音と呼ぶこともあります. (このブログではサイン波と呼んでいきます) 加算合成はどんな複雑な波形でもサイン波の重ね合わせによって合成できることを保証する「重ね合わせの原理」にもとづく手法です. このことからすべての音はサイン波に分解することができます. サイン波の重ね合わせによってできた音は複合音と呼びます.
さて, まずはサイン波を聴いてみます. サイン波の式についてはこちら(Wikipedia).
「ポー」と聴こえるかと思います. ちなみにサイン波は聴力検査や時報に使われています.
二番目は三角波. 三角波の式についてはこちら(Wikipedia).
サイン波より音が強めですね(?) 三角波は奇数倍の倍音(基本周波数の整数倍)を持つ波が重ねあってできています. ただし, 倍音の振幅の大きさは, 倍音の次数の逆数の自乗に比例します. mが自然数のとき, 倍音の次数が(2m-1)ならば位相は0, (2m+1)ならば位相はπとなります.
三番目はのこぎり波. のこぎり波の式についてはこちら(Wikipedia).
派手な音ですね. ワタシはのこぎり波が一番好きです. のこぎり波はすべての倍音が重なり合ってできています. 倍音の振幅は倍音の次数の逆数に比例します.
四番目は矩形波. 矩形波の式についてはこちら(Wikipedia).
派手ではありますが, のこぎり波とは違います. 矩形波は奇数倍の倍音(基本周波数の整数倍)を持つ波が重ねあってできています. 倍音の位相や振幅が違うので三角波とはもちろん違う音になります.
最後にノイズ(白色雑音).
白色雑音はあらゆる周波数を持つサイン波を, 位相をランダムにして重ね合わせることでできます.
<Cでどうやって音をつくるの?>
本題ではありますが, 様々な事情でコードを掲載できないため, 概略だけお伝えします. ブログで紹介した数式をfor文で表して(音によっては場合分けが必要なため, if文も必要), 配列に入れていくというのが方針です. とても雑ですみません. 参考図書の説明が分かりやすいのでそちらを参照してください…
<おまけ 音の三要素とフーリエ級数のお話>
複合音(三角波, のこぎり波, 矩形波, ノイズ)の紹介の際に倍音(基本周波数の整数倍の周波数)についてふれていましたが, 倍音がどれくらい含まれているかを表すものを周波数特性と言います. 周波数特性は作りたい音(時間関数)のフーリエ級数を求めることで判明します. (周波数特性はフーリエ係数に対応します)
先ほどのwavファイルでは, 三角波, のこぎり波, 矩形波の三つは音の大きさ(振幅)と音の高さ(基本周波数)が同じでしたが, 同じ音には聴こえなかったはずです. これは音色(周波数特性)が違うことに起因するものです. これらの三つの要素を音の三要素と言います.
<参考図書>(自分が使った参考書)
サウンドプログラミング入門――音響合成の基本とC言語による実装 (青木直史 著)
https://honto.jp/netstore/pd-book_25500187.html (hontoのHPのURLです)
<ひとこと>
プログラミングの中身というよりは, 加算合成の原理を主に説明しています. コード等, めちゃくちゃ端折ったので気になる方は参考図書を読んでください.
(参考図書を読破して「サウンドプログラミングについて(C言語 ver.)」を連載したいです)