Issue on implementing custom DSP algorithms with OnAudioFilterRead
tracked
Xuan25_瑄
I have encountered a problem related to Unity's DSP chain and Udon. I am planning to create an audio focused world, where I need to implement a custom DSP algorithm on audio that can respond to player behavior/controls in real-time.
In the native Unity Mono framework, I can insert custom effects into the audio DSP chain by implementing the OnAudioFilterRead method in MonoBehaviour (see https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnAudioFilterRead.html).
In the UdonSharp documentation, I found that there is a method stub for OnAudioFilterRead in Unity events (see https://udonsharp.docs.vrchat.com/events/), so I should be able to implement it. However, it does not work in my Unity setup.
I also saw a post on Canny mentioning that a component called OnAudioFilterReadProxy should be automatically added to the object if OnAudioFilterRead is implemented (See: https://vrchat.canny.io/udon/p/order-of-onaudiofilterreadproxy), but this is not happening on my end. Any idea what could be going wrong with my script or configuration? Or it is a bug?
My test code is like the following:
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;
public class SimpleSineGenerator : UdonSharpBehaviour
{
[SerializeField, Range(0, 1)] private float amplitude = 0.5f;
[SerializeField] private float frequency = 261.62f;
private double phase = 0;
private double sampleRate = 48000;
public void Update()
{
// verify that the script is running
transform.Rotate(Vector3.up, 90f * Time.deltaTime);
}
public void OnAudioFilterRead(float[] data, int channels)
{
// DSP code
double phaseIncrement = 2 * Mathf.PI * frequency / sampleRate;
for (int i = 0; i < data.Length; i += channels)
{
phase += phaseIncrement;
if (phase > 2 * Mathf.PI)
{
phase -= 2 * Mathf.PI;
}
float value = amplitude * Mathf.Sin((float)phase);
for (int j = 0; j < channels; j++)
{
data[i + j] = value;
}
}
}
}
Log In
This post was marked as
tracked