Отношение частоты и тангажа для 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 вниз в сторону это то, что у вас будет