Отношение частоты и тангажа для AudioClip-Unity3D
Я пытаюсь воссоздать полный спектр гитары только с помощью 6 аудиоклипов.
Я думал, что будет способ установить частоту аудиоклипа, но аудио.частота возвращает только частоту звука на основе формата сжатия, а не фактический тон.
Я знаю, что могу читать GetSpectrumData, но это решение довольно сложное и потребует некоторого анализа преобразования Фурье или чего-то подобного.
изменения тональности, это легко изменить тон, чтобы я мог идти вверх и вниз, но есть ли способ выяснить, какие шаги использовать.
void Update ()
{
CheckAudio(KeyCode.Q, 1.0f);
CheckAudio(KeyCode.W, 1.1f);
CheckAudio(KeyCode.E, 1.2f);
CheckAudio(KeyCode.R, 1.3f);
CheckAudio(KeyCode.T, 1.4f);
}
void CheckAudio(KeyCode key, float pitch)
{
if (Input.GetKeyDown (key))
{
audio.pitch = pitch;
audio.Play ();
}
}
Я слышу, что это звучит неправильно.
зная начальный тон E4 329.63 Гц с шагом в 1 Есть ли какое-либо уравнение, влияющее на шаг, я бы получил следующий ключ F4 349.23 Гц (или достаточно близко)?
следует также учитывать, что Unity AudioSource ограничивает шаг в диапазоне -3 / 3 (который, я думаю, больше, чем необходимый.)
EDIT: добавление некоторых личных исследований. Кажется, что Шаг 1-это начальная нота, а установка на 2 дает тот же ключ на одну октаву выше.
поскольку хроматическая шкала (все черно-белые ноты на пианино) составляет 12 клавиш, я предполагаю, что использование 1/12 для каждого шага должно это сделать.
это звучит близко, но я упал, это не совсем правильно. Вот новый код:
[SerializeField] private AudioSource audio;
float step = 1f/12f;
KeyCode[]keys = new KeyCode[]{
KeyCode.Q, KeyCode.W,KeyCode.E,KeyCode.R,KeyCode.T,
KeyCode.Y, KeyCode.U, KeyCode.I, KeyCode.O, KeyCode.P,
KeyCode.A, KeyCode.S, KeyCode.D
};
void Update ()
{
float f = 0.0f;
foreach (KeyCode key in keys)
{
CheckAudio(key, f);
f += 1f;
}
}
void CheckAudio(KeyCode key, float pitch)
{
if (Input.GetKeyDown (key))
{
audio.pitch = 1f + pitch * step;
audio.Play ();
}
}
1 ответов
что вы пытаетесь сделать будет не хорошо работать, просто изменив поле аудио. Изменив высоту тона, вы столкнетесь с другие проблемы как ядровая отделка слишком быстрая или принимающ больше времени закончить и звук не будет хорош также.
на первый решение-сделать плагин(синтезатор) в C++ который считывает аудиофайл из Unity и изменяет частоту. Он следует также выполнять другие действия для устранения проблем со скоростью. Это очень сложно, если вы не звукоинженер с некоторыми большими математическими способностями. И попробовать это на мобильном устройстве - совсем другая история. OnAudioFilterRead - это функция, которую вы должны использовать, если вы решите пойти с этим методом.
на второй и рекомендовано решение состоит в том, чтобы сделать аудиофайл для каждая клавиша гитары затем поместите их в массив audioClip
. Этот решает другие проблемы.The вниз в сторону это то, что у вас будет