当ブログも放置したままはや半年、ということで、休眠ブログにするつもりでもないので、何か「更新ネタでもやっておかないと」ということで、経過報告を兼ねて投稿した次第です。現在、電子工作ネタからの延長で、マイコンプログラミングの泥沼にはまっていますが、プログラミングの方から音楽という場合、C言語を習得しなければなりません。少々時間が空きましたが、WAV音源をC言語でプログラミングする所まで来ました。 

 sinewave






















 左はC言語で書いたソース コードですが、 16ビット深度の量子データーを配列に格納していくわけだ。 0~65535の範囲のデーターになるわけですが、これをmath.h という標準ヘッダ ファイルのsin関数を使って変換した数値を配列に格納していきます。 WAVファイルに書き込む為の関数は後述の参考書で用意されているラヘッダのwave.hから用います。 音源用のwavファイルはRIFFという形式でデーターが格納されており、それに合わせるための関数群がwave.hに定義されており、これを使えば比較的シンプルにwav音源のプログラミングが出来るように成っています。

 上のイメージの音源は、二つのサイン波を少し周波数を違えて足しあわせたもので、 スーパーヘテロダインなんかのミキシングをイメージしたものです。いわゆる「うなり」の原理として知られています。 データーとして格納する数値をいじることで、音階の表現も視野に入ってきました。

 参考に使ったのはオーム社の「C言語で始める 音のプログラミング」です。 本書はC言語のコンパイラとしてBorland C++を使う手順(windows)になっていますが、 C言語に違いがあるわけでも無いので、個人的にはLinuxのGCC コンパイラを使用しています。 こちらのほうが開発はしやすい。

 出来上がった wavファイルは音声編集ソフトの定番audacityで開く事ができます。

 もちろん 内容的にはC言語の入門編は一通り終わっていることが前提になります。

 c_programing

 
 当参考書で用いられているwave.h は記載されているサポートのURLからダウンロードで取得出来ますが、ソースコードがそのままでは使えなかったので修正しました。 mono_wave_write関数で、dateに最後代入する部分の行、、、、data=(short)(s+0.5)-32768....をdata=(int) かdata=(double)に変えてみた所、上手く行きました。





















 今日から12月ですが、一年はあっという間ですね。年内にあと一回は更新する予定ですが、今年は新たに関心を持った音楽そのものはまったくなかった。