C#
Unity
周波数

UnityでスクリプトからHzを指定して音を出す

0.1秒ごとに10Hzずつに音の周波数を上げていきます。

空のゲームオブジェクトにこのスクリプトをaddすれば使えます。

ポイントはUnity組み込みの

void OnAudioFilterRead()

を使うことです。

using System.Collections;

using System.Collections.Generic;
using UnityEngine;

// 参考
// https://forum.unity.com/threads/generating-a-simple-sinewave.471529/
public class SinewaveExample : MonoBehaviour
{
int f = 300;
int fs = 44100; // サンプリング周波数
int c = 0; // カウンター 0 < c < fsの関係

void Start()
{
AudioSource audioSource = gameObject.AddComponent<AudioSource>();
audioSource.playOnAwake = false;
audioSource.spatialBlend = 0; //force 2D sound
}

void Update()
{
}

private void OnGUI()
{
GUI.Label(new Rect(0, 0, 60, 30), f + "[Hz]");
}

void OnAudioFilterRead(float[] data, int channels)
{
for (int i = 0; i < data.Length; i += channels)
{
data[i] = CreateSine(c, f, fs);
data[i + 1] = CreateSine(c, f, fs);

c++;

if (c >= fs)
c = 0; // このとき、ちょうど1秒。

float t = (float)c / fs;
if (t > 0.1) // 0.1sに一回周波数が上昇する。
{
f += 10; // 周波数を10増やす
c = 0;
}
}
}

static public float CreateSine(int timeIndex, float frequency, float sampleRate)
{
return Mathf.Sin(2 * Mathf.PI * timeIndex * frequency / sampleRate);
}
}