Unityで自分がよく使うオーディオのソースコードテンプレート。
こんなのを使ってます。
適当なゲームオブジェクトにアタッチして、AudioClipを読み込ませてください。
サイン波とサンプルが鳴るはずです。
ここで変わったことしてるというと、「AudioClipの音をFilter上で鳴らしている」ということ。
そのため、UnityEngineのすべての関数が利用できません。
じゃあどうするかというと「自分ですべて書く」というアプローチが必要になります。
ちょっと書くものが溜まってるので、ここに書いておく(もしくはZennに書いておく)ことにしようかと。
ソースコード
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System; /* Math クラスを使うため追加 */
public class pitchTest : MonoBehaviour
{
public AudioClip SEClip;
int count=0;
bool playing= false;
int n;
int length;
int temp_length;
double increment;
double phase;
int sampling_rate;
float[] temp_sample;
[SerializeField, Range(-12, 12)] int pitch = 0;
// Start is called before the first frame update
void Start()
{
sampling_rate = AudioSettings.outputSampleRate;
temp_sample = new float[SEClip.samples* SEClip.channels];
length = SEClip.samples* SEClip.channels;
SEClip.GetData(temp_sample, 0);
playing = true;
}
void OnAudioFilterRead (float[] data, int channels)
{
if( !playing)
return;
for (n = 0; n < data.Length; n = n + channels)
{
increment = 2.0 * Math.PI * 440.0 / sampling_rate;//pcm.fs;
//increment = 2.0 * Math.PI * GetFrquency(play_synth_number) / sampling_rate;//pcm.fs;
float output = 0.0f;
output = (float)(0.1f * Math.Sin(phase));
//サンプル再生追加
data[n] = output;
data[n+1] = output;
phase = phase + increment;
if (phase > 2 * Math.PI)
phase -= 2*Math.PI;
count++;
}
}
// Update is called once per frame
void Update()
{
}
}
