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