当ブログも放置したままはや半年、ということで、休眠ブログにするつもりでもないので、何か「更新ネタでもやっておかないと」ということで、経過報告を兼ねて投稿した次第です。現在、電子工作ネタからの延長で、マイコンプログラミングの泥沼にはまっていますが、プログラミングの方から音楽という場合、C言語を習得しなければなりません。少々時間が空きましたが、WAV音源をC言語でプログラミングする所まで来ました。
左は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言語の入門編は一通り終わっていることが前提になります。
当参考書で用いられているwave.h は記載されているサポートのURLからダウンロードで取得出来ますが、ソースコードがそのままでは使えなかったので修正しました。 mono_wave_write関数で、dateに最後代入する部分の行、、、、data=(short)(s+0.5)-32768....をdata=(int) かdata=(double)に変えてみた所、上手く行きました。
今日から12月ですが、一年はあっという間ですね。年内にあと一回は更新する予定ですが、今年は新たに関心を持った音楽そのものはまったくなかった。
コメント
コメント一覧 (2)
校正用信号を作りたいですね。仕事のw。
1次50Hzの正弦波に対し、3,5,7,9,11,13~39次の高調波成分。基本波に対し0.1, 1, 10%の合成波
そしたらファンクションジェネレータを複数台用意(購入)する必要がなくなる。
おまけに、次数間高調波(整数倍以外)のも作れそうじゃないですきゃwでゅふふw
IEC61000-4-13用の試験用信号と名打って売ればがっぽがっぽw。
基本波のみ
基本波+奇数次
基本波+偶数次
基本波+2~19次までの全次数高調波を選べること。
高調波の倍率を選べること、0.1, 1, 2, 3, 5および10%
オーディオアナライザのチェッカーとしても使えてがっぽがっぽw。