StereoSwitch_AudioFilter.cs
UnityであまりAudioFilterについての記事をあまり見なかったので、自分の備忘録として記載しておきます。
何はともあれ、スクリプトを見せた方が話が早いと思うので、サンプルのスクリプトから。
以下サンプルスクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class StereoSwitch_AudioFilter : MonoBehaviour
{
float[] backup = new float[2048];
void OnAudioFilterRead(float[] data, int channels)
{
Array.Copy(data, backup, data.Length);
int harfLength = data.Length / 2;
for (int i = 0; i < harfLength; i++) data[i * 2] = backup[i * 2 + 1];
for (int i = 0; i < harfLength; i++) data[i * 2 + 1] = backup[i * 2];
}
}
こちらのスクリプトをAudioSourceと同じゲームオブジェクトに入れるだけで、左右のステレオのチャンネルを入れ替えることが出来ます。
以下解説です。
解説
この「void OnAudioFilterRead(float[] data, int channels)」のイベントを使用する事で、同じゲームオブジェクト内で流れているaudioの波形を調整できるようです。
今回は、左右のチャンネルをいれかえているだけですが、自分好みのaudioFilterを実装する事ももちろん可能です。
なんなら、オリジナルのシンセサイザーも作れるかも。
ただ、audioFilter自体CPUに結構な負荷がかかるらしく、ヘルプを読んでいて気を付けてねっと所々書いています。
では具体的な内容に入ります。
第一引数は、実際の波形で、第二引数はチャンネル数となっています。
この第一引数のfloatの配列を調整する事で、音を変えることが出来ます。
音の波形と言っても、ただのfloatの配列です。
実際どうゆう動きをしているの確認するため、右スピーカーだけサイン音が流れるだけのaudioClipを用意して、この配列の数字にZ軸で上下するオブジェクトを配置するスクリプトを用意してみてみました。
あまり役に立たないかもしれませんが以下サンプル
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class audioCheck : MonoBehaviour
{
public GameObject copyobj;
public float multiplay = 5f;
GameObject[] gameObjects = new GameObject[2048];
float[] backup = new float[2048];
void Start()
{
for(int i = 0;i < 2048; i++)
{
gameObjects[i] = Instantiate(copyobj, new Vector3(0, 0, i), Quaternion.identity);
}
}
// Update is called once per frame
void Update()
{
for (int i = 0; i < 2048; i++) gameObjects[i].transform.position = new Vector3(0, backup[i] * multiplay, i);
}
void OnAudioFilterRead(float[] data, int channels)
{
Array.Copy(data, backup, data.Length);
}
}
まっすぐ一直線に微動だにしない線とうねうねと規則正しく揺れる波形が現れました。
この画像からもわかる通り、どうやら、波形のデータの中には、別々のチャンネルが分けて格納されているわけではなく、左右のチャンネルの波形が交互に配置されていることがわかると思います。
今回の場合は、偶数が右のチャンネル、奇数は左のチャンネルになっているようです。
後は、配列の奇数と偶数に入っている数値を入れ替えるだけで左右のチャンネルを反転することが出来ます。
以下がその個所
void OnAudioFilterRead(float[] data, int channels)
{
Array.Copy(data, backup, data.Length);
int harfLength = data.Length / 2;
for (int i = 0; i < harfLength; i++) data[i * 2] = backup[i * 2 + 1];
for (int i = 0; i < harfLength; i++) data[i * 2 + 1] = backup[i * 2];
}
以上で解説終わりになります。
このデータがどういう波形のデータを保持しているか、今回でわかったと思います。
audiofilterなど、初学者の参考になれば幸いです。