STボードを使って簡単な楽器を作っています。基本的には、動きや立体角を検知し、角度によってピッチや音量が異なる音を出すセンサーを持っています。私はすでにオーディオコーデックのドライバを持っているので、私がする必要があるのは、サウンドサンプルを生成し、それにサンプルを供給することだけです。これでセンサーから角度の読み取り値を取得できるようになりましたが、難しいのは音の生成方法です。これまでのグーグル検索から、センサーからの読み取り値に応じて周波数と振幅(体積)を設定したsin関数を生成する必要があると思います。しかし、私のコーデックはサンプリングレート0f 48KHzを想定しているので、固定サンプリングレートで異なる周波数の正弦波を生成するにはどうすればよいでしょうか。
これまで私はこれを行いました:
samplingRate = 48000;
n = 0; // reset once there is a change in frequency
// this function is called 48000 times a second
int generateSineWave(float frequency, float volume)
{
int temp = volume*(sin(2*pi*frequency*n);
n = n + 1;
if (n == samplingRate) {
n = 0;
}
if (abs(temp) > MAXVAL) {
return ERROR_CODE;
}
return temp;
}
これは機能しているようです(私は何かを聞いています)が、それが正しい周波数の正弦波を生成しているかどうかはわかりません。また、私が聞いている音はあまり心地よいものではありませんが、複雑な音(たとえばピアノの音など)を生成するにはどうすればよいですか?また、制御変数(空間角度)はローパスフィルター処理する必要があると思います。しかし、それとは別に、私がより聴覚的に心地よい波を生成する方法についてのアイデアはありますか?