強火で進め

このブログではプログラム関連の記事を中心に書いてます。

サウンドプログラミング入門 - サイン波を発生させる

こちらの本でサウンドプログラミングを勉強中。 Unity に移植してみたコードを書いておきます。コードの解説は書籍の方を参照して下さい。

サウンドプログラミング入門――音響合成の基本とC言語による実装 (Software Design plus)

サウンドプログラミング入門――音響合成の基本とC言語による実装 (Software Design plus)

SineWave という名前で C# ファイルを作成し、 Main Camera にドラッグするとテスト出来ます。

using UnityEngine;
using System.Collections;
using System; /*  Math クラスを使うため追加 */

public struct MonoPCM
{
	public int fs; /* 標本化周波数 */
}

/* サイン波 */
public class SineWave : MonoBehaviour {
	bool playing = false;
	MonoPCM pcm;
	int n;
	double a, f0;
	double increment;
	double phase;
	
	void Awake ()
	{
		pcm = new MonoPCM();
		pcm.fs = 44100; /* 標本化周波数 */
	}
	
	void OnAudioFilterRead (float[] data, int channels)
	{
		if (!playing) return;
		
		a = 0.1; /* 振幅 */
		f0 = 500.0f; /* 周波数 */
		increment = 2.0 * Math.PI * f0 / pcm.fs;
		
		/* サイン波 */
		for (n = 0; n < data.Length; n = n + channels)
		{
			phase = phase + increment;
			data[n] = (float)(a * Math.Sin(phase));
			if (channels == 2)
				data [n + 1] = data [n];
			if (phase > 2 * Math.PI)
				phase = 0;
		}
	}
	
	void OnGUI ()
	{
		int y = 10;
		if (GUI.Button (new Rect (10, y, 100, 30), "Play")) {
			playing = true;
		}
		y += 40;
		if (GUI.Button (new Rect (10, y, 100, 30), "Stop")) {
			playing = false;
		}
	}
}

関連情報

nakamura001 @ ウィキ - トップページ/Unity(Unity3D)/サウンド/作成
http://www32.atwiki.jp/nakamura001/pages/274.html