Почему OnAudioFilterRead(float[], int) не работает, когда я пытаюсь переопределить параметр данных с помощью float[] тойC#

Место общения программистов C#
Ответить
Anonymous
 Почему OnAudioFilterRead(float[], int) не работает, когда я пытаюсь переопределить параметр данных с помощью float[] той

Сообщение Anonymous »

Я создаю программу для создания музыки на C# в Unity, и у меня есть методы, которые позволяют мне последовательно воспроизводить отдельные частоты, регулируя переменные в сопрограмме.

Код: Выделить всё

void OnAudioFilterRead(float[] data, int channels)
{
if (playing)
{
data = PlaySineWave(freq, realAmp, data, channels);
}
else
{
data = new float[0];
}
}

public float[] PlaySineWave(float frequency, float amplitude, float[] data, int channels)
{
double phaseIncrement = frequency / sampleRate;

for (int sample = 0; sample < data.Length; sample += channels)
{
float value = Mathf.Sin((float)phase * 2 * Mathf.PI) * amplitude * saturation;

phase = (phase + phaseIncrement) % 1;

for (int chan = 0; chan < channels; chan++)
{
data[sample + chan] = value;
}
}

return data;
}
Этот код работает для воспроизведения отдельных частот, и сейчас я пытаюсь обновить то, что у меня есть, чтобы он мог работать с массивом частот, которые воспроизводятся одновременно. Я знаю, что частоты можно комбинировать, просто складывая их вместе, поэтому мой подход заключался в том, чтобы сбросить массив данных до пустого массива одинаковой длины, а затем += значение вместо установки его на значение.

Код: Выделить всё

public float[] PlaySineWave(float[] frequency, float amplitude, float[] data, int channels)
{
data = new float[data.Length];

for (int i = 0; i < frequency.Length; i++)
{
double phaseIncrement = frequency[i] / sampleRate;

for (int sample = 0; sample < data.Length; sample += channels)
{
float value = Mathf.Sin((float)phase * 2 * Mathf.PI) * amplitude * saturation;

phase = (phase + phaseIncrement) % 1;

for (int chan = 0; chan < channels; chan++)
{
data[sample + chan] += value;
}
}
}

return data;
}
Однако это, похоже, нарушает работу OnAudioFilterRead(float[], int). Я могу отладить это и увидеть, что переменная данных делает то, что должна, и ее содержимое меняется в OnAudioFilterRead(float[], int), как и ожидалось, но сам метод просто перестает работать во время выполнения. Почему это происходит? Имеет ли переменная данных какую-то ссылку, которая стирается при переопределении? Насколько я знаю, переменная данных — это просто массив с плавающей запятой, и я не верю, что массивы с плавающей запятой могут иметь какие-либо ссылки без какого-либо ключевого слова. Что мне здесь не хватает?

Подробнее здесь: https://stackoverflow.com/questions/798 ... de-the-dat
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»