То что любой настройщик работающий на слух может делать почти интуитивно оказывается не такой простой задачей для программистов и инженеров. Речь про слышание биений. Как эффективно автоматизировать эту работу настройщицкого слуха?
Я потратил некоторое время на попытку соорудить «несложную» программу призванную показывать слышимые биения в виде числа. После того как программа разрослась в размерах но так и не выдала желаемого результата я, наконец, решил собрать известные мне сведения здесь и изложить видимые причины того почему задача не столь проста как выглядит с самого начала. Возможно, это поможет мне или кому-нибудь другому в дальнейших попытках автоматизировать эту часть труда настройщика.
Прежде всего, давайте определимся, чего мы хотим в идеале? Как на практике должно выглядеть подобное вспомогательное устройство? Я убежден что оно должно быть максимально простым (и бесплатным

). Например, приложение на телефоне практически без каких-либо настроек показывающее на экране численное значение основных слышимых биений. Хотя бы основного. И может быть мелким шрифтом — другие, если их тоже слышно. Меня также устроил бы сайт на который можно было бы зайти и в результате увидеть то же самое число крупным шрифтом на весь экран. Остальное было бы уже необязательными усложнениями.
Но вот, для примера, устройство изготовленное настройщиком Mark Cerisano, инженером по образованию:

Марк сам спроектировал и изготовил его. Ему удалось даже продать один или несколько экземпляров устройства. Изготовив несколько работающих прототипов, потерпев неудачу с подрядчиками, он наконец, сам взялся за работу и довёл коробочку до более-менее приличного вида. И что самое главное — она действительно делает то для чего была создана. Вы спросите: а где же экранчик с цифрами? Его нет. Устройство следует включать в электрическую розетку и настраивать всеми этими ручками. После чего вы сможете отчетливо услышать биения из динамика устройства. И сами на слух оценить их скорость числом.
Далеко от идеала.
Однако, помимо этого устройства Mark Cerisano сделал одно очень хорошее дело: он объяснил нам каким образом можно визуализировать биения. Тем самым он дал и ключ к возможному алгоритму решения задачи:
https://youtu.be/9SBAW7ku-hU?t=478Оказывается, после несложной фильтрации входного акустического сигнала можно получить наглядное изображение интервальных биений следующего вида:

То есть, можно увидеть подобную картинку совершенно не задумываясь о том какие именно характеристики сигнала сделали биение слышимым. И подсчитать их количество за секунду. Как, например, тут - 5 биений в секунду. При таком подходе оказывается важно то что амплитуда биений изображена максимально наглядно.
Казалось бы, дело за малым: приделай ко всей этой математике экранчик показывающий число 5 — и готово!
Но тут во мне просыпается математик и говорит: Позвольте, ведь тут ясно видно что частота самих звуковых колебаний гораздо выше чем частота биений. Необходимо построить огибающую этого сигнала. И вот её частота и будет являться частотой биений. Тут уже пахнет преобразованием Гильберта-Хуанга. Очевидные для человека вещи оказываются не так просты для компьютера.
Но и это ещё не всё. Фильтрацию сигнала по частоте, предложенную Марком Церизано для визуализации биений следует выполнять не абы где а вокруг потенциальных частот возникновения этих самых биений. То есть сперва хорошо бы распознать сам проигрываемый интервал чтобы понять в каких местах частотного диапазона фортепиано могут возникать биения. А это как делать?
Нейронные сети уже давно стали обыкновенным инструментом для решения задач распознавания чего-либо. Современные технологии позволяют встраивать обученную «нейронку» в простые программы вроде андроидных приложений. Меня, например, умиляет одна такая небольшая программка называемая Object Detector and Classifier:

Собственно, нам нужно такое же но «только с перламутровыми пуговицами». Пусть распознает интервалы на слух.
Однако, прежде чем нейронная сеть станет проста в использовании её необходимо обучить на многих и многих примерах. То есть, нашей воображаемой нейронной сети, предназначенной для распознавания интервалов, необходимо скормить десятки тысяч проигранных интервалов вместе с верными названиями этих интервалов прежде чем сеть научится распознавать интервалы самостоятельно.
Распознав интервал на слух компьютер мог бы затем легко определить в каких диапазонах частот следует искать потенциальные биения, отфильтровать эти диапазоны по Марку Церизано, построить огибающие по Гильберту-Хуангу, по огибащей вычислить частоту биений, показать число на экране. И всё это — в реальном времени.
Только… Где, спрашивается, мы возьмём «десятки тысяч» проигранных интервалов для обучения нейронной сети? Кто будет их наигрывать? К счастью, здесь нет необходимости сидеть за инструментом годами. Достаточно програть все клавиши по одной в их естественном хроматическом порядке. Так чтобы каждый звук длился по крайней мере 2-3 секунды (обычное время, достаточное для распознавания биений натренированным слухом). Затем — нашинковать запись на 88 отдельных звуковых файлов. Далее можно автоматически комбинировать из полученных «клавиш» любые интервалы. Так мы получим все интервалы для данного инструмента. Их будут многие десятки. На них то и будем обучать нейронку.
Но и этого мало. Чтобы обучение нейронной сети было эффективным, чтобы результирующий кругозор её оказался достаточно большим, для обучения необходимо будет задействовать по крайней мере несколько инструментов: пианино и роялей. В итоге, возможно, мы сможем скормить обучаемой нейронной сети если не десятки тысяч то хотя бы тысячи интервалов.
Такая вот расширенная постановка такой простой-непростой задачи.