投稿

2013の投稿を表示しています

基本波形の生成

イメージ
オーディオやマルチメディア関連のプログラムを書いていると、手早くノコギリ波や矩形波を生成したいことがある。 そこで、簡単にいろいろな波形を生成する方法をまとめる。 1. ノコギリ波 1サンプルごとに少しずつ値を足していくと、直線的に増加していく波形ができる。 値が 1.0 を超えた瞬間に 0.0 へ戻すことで、ノコギリ状の周期波形が生成できる。 これは、値の小数点以下のみを取り出すことで実装できる。 実装してみる。 以下のコードでは、オーディオ信号として扱いやすいよう出力値の範囲を 0〜1 から -1〜1 へ変換している。 double sawtooth(double 周波数, double サンプルレート) { static double phase = 0.0; // 初期値 phase += 周波数 / サンプルレート; phase -= floor(phase); // 整数部分を引き算 return 2.0 * (phase - 0.5); // -1.0~1.0 の範囲に広げる } 「小数点以下を取り出す」を「1.0で割ったときの剰余」として実装する方法もある。 double another_sawtooth(double 周波数, double サンプルレート) { static double phase = 0.0; // 初期値 phase += 周波数 / サンプルレート; phase = fmod(phase, 1.0); // 小数部分を取り出す return 2.0 * (phase - 0.5); // -1.0~1.0 の範囲に広げる } プログラミング言語によっては(C# など)、浮動小数点数(float や double)に対して剰余演算子 % が使えるので、この実装方法のほうがシンプルに書ける。 2. 矩形波 ノコギリ波が 0.5 を超えたら 1.0、超えなければ -1.0 を出力する。 条件を「0.75 を超えたら 1.0 を出力」に変えれば、デューティ比25%の矩形波になる。 double pulse(double 周波数, double サンプルレート) { static double phase =...

アセンブラでWin32APIを使ってみる(MessageBox編)

RubyやPython、JavaScriptのような高級なプログラミング言語が浸透してだいぶ経ちました。 たくさんの便利なライブラリが整っていますし、少ないコード量で面倒な処理ができるところが魅力的です。 とはいえ、こういった言語ばかり触っていると低水準な言語でゴリゴリと書きたくなってきませんか?ほら、なってきましたね。 そんなわけで、もっとも低水準なプログラミング環境といえるであろう アセンブラでWin32APIを使ったアプリケーション を作ります。 今回使うツールは以下の通り。 NASM (アセンブラ) -  http://sourceforge.net/projects/nasm/ ALINK (リンカ) -  http://alink.sourceforge.net/download.html ちなみに最初はMASMを使おうと思ったのですが、Microsoft純正だけありWin32APIのサポートがしっかりされていてつまらないので、今回はNASMを使って縛りプレイをしてみます。 ALINKは。 上記のALINKのサイトの 「Download my Win32 Import library(win32.lib)」 からALINK用のWin32APIライブラリをダウンロードしておきます。 NASM、ALINK、win32.libは同じフォルダに入れてソースコードと同じフォルダに置きます。 まずはお決まりの Hello world を作ってみます。 ウィンドウ表示をすると複雑になるので、MessageBox関数で表示させることにします。 以下のようなプログラムを test.asm などのファイル名で保存します。 bits 32 extern MessageBoxA extern ExitProcess section .text global winmain winmain: push dword 0 push dword title push dword string push dword 0 call MessageBoxA push dword 0 call ExitProcess ret section .data ti...