Как обнаружить струну при отслеживании высоты тона на электрогитаре?
Привет я нуб в аудио связанном кодировании, и я работаю в библиотеке отслеживания высоты тона, которую я буду использовать, чтобы попытаться создать своего рода версию с открытым исходным кодом видеоигры Rocksmith в качестве учебного опыта.
До сих пор мне удавалось заставить БПФ работать так, чтобы я мог определить частоту тона (Гц), а затем с помощью алгоритма и таблицы ниже я могу определить октаву (от 2-й до 6-й) и ноту (от C до B) для воспроизводимой ноты.
Следующим шагом является обнаружение строки, чтобы я мог определите лад.
Я думал об этом, и теоретически я могу работать с этим, я буду знать, когда пользователь играет правильную ноту, но игра может быть "взломана", потому что просто с помощью Гц игра не может обнаружить, если нота играет в правильной строке. Например 5-я строка + 1-й лад = C4 261,63 Гц равно 6-я строка + 5-й лад = C4 261,63 Гц.
Вероятность того, что пользователь сыграет ноту в неправильной строке и получение его правильно низко, но я думаю, что было бы действительно хорошо знать строку, чтобы я мог предоставить пользователям некоторую обратную связь об ошибках, когда они играют неправильную строку (например, вы должны идти строку вверх или вниз).
Знаете ли вы, что я могу сделать, чтобы обнаружить строку? Заранее спасибо:)
[edit]
Гитара и струны, которые мы используем, влияют на тембр, поэтому анализ тембра, по-видимому, не является простым способом обнаружения струн:
"вариации тембра на вашей гитаре производится огромное количество факторов от дизайна пикапа и положения, естественных резонансов и демпфирования в вашей гитаре из-за используемой древесины (это другой сорт древесины!) и его конструкция и форма, Калибр и возраст ваших струн, ваша техника игры, где вы волнуетесь и дергаете струну, и так далее."
3 ответа:
Простой FFT пиковый оценщик не является хорошим детектором/оценщиком гитарного тона из-за многих потенциально сильных обертонов. Существуют более надежные алгоритмы оценки высоты тона (search stackoverflow и DSP.клиент StackExchange). Но если вы потребуете, чтобы игроки предварительно охарактеризовали каждую строку на своих отдельных инструментах, как открытых, так и фретчированных, перед началом игры, отпечаток пальца FFT этих характеристик может быть способен дифференцировать одну и ту же ноту, сыгранную на разных струнах на некоторых из них. гитары. Более толстые струны испускают несколько иное соотношение энергии в некоторых высших обертонах, а также различное количество легкой негармоничности.
Это может быть немного поздно, потому что посту уже один год. Но вот решение, которое я нашел после долгих исследований для определения высоты звука гитары.
ВОТ ПОЧЕМУ FFT НЕ РАБОТАЕТ:
Вы не можете использовать FFT, так как результат дает линейный массив, а звук вычисляется логарифмически (экспоненциальное расстояние между нотами). Кроме того, FFT дает вам массив бункеров, в которых ваша частота может быть, он не дает вам точный результат.
ЭТО ТО, ЧТО Я Предлагаю :
Используйте dywapitchtrack. это библиотека, которая использует вейвлет-алгоритм, который работает непосредственно на вашей волне вместо вычисления больших бункеров, таких как FFT.
Описание: Dywapitchtrack основан на специально разработанном алгоритме, который имеет очень высокое качество.: оба очень точные (точность
Загрузить : http://www.schmittmachine.com/dywapitchtrack.html
USE (C++): положить.с и .h где он вам нужен и импортируйте его в свой проект
Включить файл заголовка
//Create a dywapitchtracker Object dywapitchtracker pitchtracker; //Initialise the object with this function dywapitch_inittracking(&pitchtracker);
Когда ваш буфер заполнен (буфер должен иметь разрешение 44100 и мощность 2 длины, мой-2048):
//use this function with your buffer double thePitch = dywapitch_computepitch(&pitchtracker, yourBuffer, 0, 2048);
И вуаля, Фитч содержит именно то, что вам нужно. (не стесняйтесь задавать вопросы, если что-то неясно)
Другие ответы, по-видимому, предполагают простой метод определения высоты тона. Тем не менее, это то, что вам придется исследовать.
В частности, сравните обертоны 5-й струны 1-го лада с шестой струной 5-го лада. то есть, только посмотреть 261.63*2, 261.63*3, *4, и т. д. Кроме того, попробуйте посмотреть на 261,63*0,5. Сравните амплитуды двух сигналов на этих частотах. Может быть, есть какая-то закономерность, которую можно обнаружить.