Как определить струну при отслеживании высоты тона на электрогитаре?

Привет, я новичок в кодировании, связанном со звуком, и я работаю над DLL для отслеживания высоты тона, которую я буду использовать, чтобы попытаться создать своего рода версию видеоигры Rocksmith с открытым исходным кодом в качестве учебного опыта.

До сих пор мне удалось заставить работать БПФ, чтобы я мог определить частоту основного тона (Гц), а затем, используя алгоритм и приведенную ниже таблицу, мне удалось определить октаву (со 2-й по 6-ю) и ноту (от C до B) для сыгранная нота.

Следующим шагом будет обнаружение струны, чтобы я мог определить лад.

введите здесь описание изображения

Я думал об этом, и теоретически я могу работать с этим, я буду знать, когда пользователь играет правильную ноту, но игра может быть «взломана», потому что, просто используя Hz, игра не может определить, если нота играется в правой струне. Например, 5-я струна + 1-й лад = C4 261,63 Гц равно 6-я струна + 5-й лад = C4 261,63 Гц.

Вероятность того, что пользователь сыграет ноту на неправильной струне и сделает ее правильно, невелика, но я думаю, что было бы действительно хорошо знать струну, чтобы я мог предоставить пользователям обратную связь об ошибках, когда они играют не на той струне (например, вы должны идти на строку вверх или вниз).

Вы знаете, что я могу сделать, чтобы обнаружить строку? Заранее спасибо :)

[править]

Гитара и струны, которые мы используем, влияют на тембр, поэтому анализ тембра кажется непростым способом определения струн:

«Вариации тембра на вашей гитаре вызваны огромным количеством факторов: дизайном и положением звукоснимателя, естественными резонансами и демпфированием в вашей гитаре из-за используемого дерева (это другой вид древесины!) форму, толщину и возраст ваших струн, вашу технику игры, то, как вы нажимаете и защипываете струну, и т. д.".


person Remo H. Jansen    schedule 09.09.2013    source источник
comment
Я не уверен, что это возможно, поскольку при правильной настройке обе струны будут издавать одинаковую ноту. Я не знаю, может ли сейчас компьютер обнаружить разницу в тембре.   -  person NWard    schedule 09.09.2013
comment
Согласитесь с NWard - та же нота будет иметь другой (чуть более мягкий) тембр при игре на более низкой струне, но я сомневаюсь, что вам повезет обнаружить это - возможно, это может быть немного проще на одном известном инструменте. Я полагаю, вы не заинтересованы в изготовлении нестандартного пикапа? :)   -  person topo Reinstate Monica    schedule 09.09.2013
comment
Я буду использовать это только для электрогитары со стандартной настройкой. Из беглого исследования видно, что определение тембра - слишком сложная задача... Вероятно, мне придется создать алгоритм, который лучше всего выявляет ошибки пользователя, сравнивая сыгранную ноту с нотами рядом с ожидаемой нотой.   -  person Remo H. Jansen    schedule 09.09.2013


Ответы (3)


Простой пиковый оценщик БПФ не является хорошим детектором/оценщиком высоты тона гитары из-за множества потенциально сильных обертонов. Существуют более надежные алгоритмы оценки основного тона (search stackoverflow и DSP.stackexchange). Но если вы требуете, чтобы игроки предварительно охарактеризовали каждую струну на своих инструментах, как открытых, так и ладовых, перед началом игры, отпечаток FFT этих характеристик мог бы различать одну и ту же ноту, сыгранную на разных струнах на некоторых гитарах. Более толстые струны будут излучать немного разные соотношения энергии в некоторых из более высоких обертонов, а также разную степень легкой негармоничности.

person hotpaw2    schedule 09.09.2013
comment
Существуют алгоритмы оценки f0 на основе БПФ, которые хорошо работают (например, процедура двустороннего рассогласования Махера и Бошана JASA 04 1994). Возможно, вы захотите исправить свой ответ, сказав, что простое выделение пиков на БПФ не является хорошим детектором основного тона. - person Ross Bencina; 10.09.2013
comment
Сделанный. БПФ можно использовать в качестве тривиального первого шага более надежного метода комплексной оценки (кепстрального и т. д.). - person hotpaw2; 10.09.2013

Это может быть немного поздно, потому что сообщению один год. Но вот решение, которое я нашел после долгих исследований по определению высоты тона гитары.

ПОЭТОМУ БПФ НЕ РАБОТАЕТ:

Вы не можете использовать БПФ, так как результат дает вам линейный массив, а звук вычисляется логарифмически (экспоненциальное расстояние между нотами). Кроме того, БПФ дает вам массив ячеек, в которых МОЖЕТ БЫТЬ ваша частота, но не дает точного результата.

ВОТ ЧТО Я ПРЕДЛАГАЮ:

Используйте dywapitchtrack. это библиотека, использующая вейвлет-алгоритм, который работает непосредственно с вашей волной, а не вычисляет большие интервалы, такие как БПФ.

описание: dywapitchtrack основан на специально разработанном алгоритме очень высокого качества: очень точном (точность ‹ 0,05 полутона), очень низкой задержке (‹ 23 мс) и очень низком уровне ошибок. Он был тщательно протестирован на человеческом голосе. Лучше всего его можно описать как динамический вейвлет-алгоритм (dywa):

СКАЧАТЬ: https://github.com/inniyah/sndpeek/tree/master/src/dywapitchtrack

ИСПОЛЬЗОВАНИЕ (C++): поместите .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);

И вуаля, thePitch содержит именно то, что вам нужно. (не стесняйтесь задавать вопросы, если что-то непонятно)

person s.1.618    schedule 11.11.2014
comment
У меня есть вопрос. Библиотека dywapitchtracker — это жемчужина, но, похоже, она не освобождает память после неинициализации. Есть идеи, почему? - person cassi.lup; 03.12.2014

Другие ответы, кажется, предлагают простой метод обнаружения высоты тона. Тем не менее, это то, что вам придется исследовать.

В частности, сравните обертоны 1-го лада 5-й струны с 5-м ладом шестой струны. то есть смотрите только на 261,63*2, 261,63*3, *4 и т. д. Также попробуйте посмотреть на 261,63*0,5. Сравните амплитуды двух сигналов на этих частотах. Там может быть закономерность, которую можно обнаружить.

person JackCColeman    schedule 10.09.2013