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() { } }