Алгоритм детектирования нот
Данные по струнам поступают с периодичностью
порядка 50 раз в секунду. Амплитуда лежит в
интервале от 0 до 127, порожек - от 0 до 17.
Примерный вид первичных данных, снимаемых со
струны (1 пиксел по горизонтали соответствует
одному отсчету времени) показан на рисунке выше
(конкретно этот график получен со старой
аналоговой части). Синий цвет - амплитуда с АЦП,
красный - номер порожка. В конце графика видно
"скольжение" пальца гитариста с 0 на 5 лад без
отпускания струны, при этом струна дергается на 4
ладу, и приходит на 5 уже звучащей.
"Трынделка" позволяет использовать такой
прием.
При анализе учитывается изменение амплитуды
колебаний струны и порожек, на котором она
прижата.
Усовершенствованный алгоритм анализа
колебаний, ориентированный на усовершенстванную
цепь сглашивания:
1. Если колебаний не было, и амплитуда превысила
порог включения, означающий начало колебаний,
то на несколько циклов опроса перейти в
состояние перехода к включению ноты.
2. Если на всех циклах перехода к включению ноты
амплитуда превышала порог включения, то включить
ноту. Иначе считать, что колебаний нет.
3. Если нота включена, и амплитуда колебаний
стала ниже порога выключения (который
существенно ниже порога включения, например, 10 и
50), то выключить ноту и считать, что колебаний нет.
4. Если нота включена, и пришел существенный
положительный перепад амплитуды (струна звучит,
но по ней ударили, и она зазвучала громче), то
выключить текущую ноту, объявить колебания
отсутствующими. Новая нота включится по причине
срабатывания п.1 на следующих циклах опроса.
5. Если нота включена, и порожек, на котором
прижата струна, изменился, то действия
аналогичны п.4.
6. После всех проверок в рамках данного цикла
сканирования необходимо разрядить
накопительный конденсатор анализируемого
канала.
Алгоритм не требует наличия буферов на
несколько отсчетов на каждую струну - нужно лишь
текущее и предыдущее значение амплитуды. Данные
занимают в сумме около 70 байт. ОЗУ
микроконтроллера хватает с запасом, даже
обходимся одним банком.
Для сравнения, старый алгоритм:
А. Анализ амплитуды колебаний струны:
1. Струна начала звучать, если:
а) на следующем отсчете пришел пик - перепад
более +10 единиц, при этом после такого пика
устанавливается мертвая зона ~ в 5 отсчетов для
отсечения двойных пиков, которые могут
возникать, например, если на пальцах у гитариста
мозоли;
б) суммарный перепад за несколько (3-5) отсчетов
превысил +10 единиц.
2. Струна закончила звучать, если:
а) амплитуда колебаний упала ниже порогового
значения (естественное затухание колебаний
струны);
б) суммарный перепад за несколько (5-7) отсчетов
менее -7, т.е. обнаружено устойчивое снижение
амплитуды в темпе не менее 1 единица за отсчет
(принудительное приглушение струны).
Если накапливаемый суммарный перепад
отрицательный, но пришел очередной перепад
более +1, то накопленная сумма сбрасывается и
накопление начинается вновь.
Б. Анализ смены порожка:
Смена порожка может привести к смене звучащей
ноты, но при этом одновременно струна может быть
заглушена. Поэтому вводится обязательная
задержка от момента обнаружения смены порожка на
время, достаточное для обнаружения приглушения
струны по п. A2б.
Если порожек сменился, и уровень сигнала
превышает некоторый порог, то включается таймер
на ~5 отсчетов. Если по окончании счета таймера
сигнал превышает порог нуля и спад амплитуды по
п. А2б не детектируется, то начинает звучать нота,
соответствующая ТЕКУЩЕМУ порожку, который может
отличаться от того, на котором включился таймер.
Если сделать таймер менее чем на 5 отсчетов, то
будет слишком много ложных нот, вызванных просто
сменой аппликатуры без дерганья за струны. Если
выставить задержку более 5 отсчетов, то реакция
на смену порожка будет слишком замедленной, и
смысл в их анализе пропадет - лучше их не
анализировать вообще и заставить исполнителя
всегда дергать струны, без использования игры
левой рукой - тогда минимизируется количество
ложных нот.
Анализа velocity (силы дергания за струну и
громкости) с применением этой схемы сглаживания
сделать не удавалось. На первый взгляд, все
просто. Однако MIDI-нота в случае А1а начинает
звучать ДО ТОГО, как амплитуда колебаний струны
достигла максимального размаха (и это хорошо, так
как нет задержки). К сожалению, пик в 25 единиц
может с равным успехом приводить к конечному
изменению амплитуды и на 30, и на 60 единиц, поэтому
с точки зрения определения velocity, похоже, схема
неудачная. А изменить громкость ноты после того,
как она начала звучать, позволяют не все
синтезаторы (речь про Aftertouch). Новая схема,
предположительно, позволит решить и эту
проблему.
<<< Назад | Вперед >>> |