LINUX.ORG.RU

Поиск по midi

 


0

1

Добрый день!

Меня интересуют существующие наработки, алгоритмы, библиотеки, исследования вот на эту тему:

Есть база из ~100-200 файлов midi, возможно несколько голосов в одном канале (например, левая и правая рука вместе). Пользователь (то есть я) подходит к миди-клавиатуре и играет что-то на ней. На слух. Нужно найти наиболее релевантную запись, в идеале именно ту, которую имел в виду пользователь.

Единственное, что пока приходит в голову, это составить индекс по всем последовательностям нот, встречающимся в файле, с учётом возможных пропусков нот (форшлаги, аккомпанимент или другие голоса пользователь вводить не будет, только основную слышимую тему). Но грубый потсчёт показывает, что это будет база размером около 1е8 записей на файл (из расчёта последовательности из 10 нот, пропускать можно до 3 нот и средний размер файла - 400 нот), или около 100 Гб такого индекса на всю коллекцию при размере коллекции на 4-5 порядков меньше. Если автоматически отфильтровывать форшлаги, аккомпанимент, и т.д, что есть отдельная проблема, то удасться сократить, возможно, на один или два порядка. Но это всё равно как-то много.

Есть ли какой-то более оптимальный способ?

Pythagoras ★★
() автор топика
Ответ на: комментарий от question4

А можно поподробнее? Индекс - это соответствие между интервалом и позицией в файле? Допустим, я проиндексировал все интервалы. Я сыграл 10 нот, и, пользуясь этим индексом, нахожу, что первый интервал встречается в каждой песне, допустим, у 8%. Теперь у меня есть список из позиций, в котором есть этот интервал. Он уже меньше, чем общее количество нот, но что с ним делать дальше? Если просто перебирать все эти варианты, то это всё ещё слишком долго, так как время всё ещё O(N), а хотелось бы O(log N).

Как решают эту проблему поисковики вроде гугла, когда я ввожу какую-нибудь фразу в кавычках? У них есть какой-нибудь индекс по словам, благодаря которому они смогут найти страницы, на которых встречаются все слова из фразы, но ведь фраза в кавычках, а значит слова должны идти последовательно. Неужели они начинают перебирать все найденные страницы одна за одной, проверяя последовательность слов?

Pythagoras ★★
() автор топика
Ответ на: комментарий от Pythagoras

то это всё ещё слишком долго, так как время всё ещё O(N), а хотелось бы O(log N).

Если у тебя 100-200 файлов, тебе не нужно париться об O(logN).

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Да, но у меня raspberry pi...

100-200 - это если считать файлами. А если нотами, то гораздо больше.

То есть алгоритмическая сложность на таких объёмах, конечно, не так важна, но хочется какой-то эффективности всё равно. Перебирать каждую 10 - это, конечно, значительное ускорение, но хочется большего)

Pythagoras ★★
() автор топика
Последнее исправление: Pythagoras (всего исправлений: 1)
Ответ на: комментарий от Pythagoras

Советую реализовать сначала самый простой алгоритм, который только придумаешь. Если он окажется недостаточно быстрым, придумывать новый. В процессе придумывания у тебя уже будет решение. Медленное, но решение. Хотя бы не вручную искать.

Если ты зациклишься на алгоритмах поиска, не будет ни того, ни другого.

Ну разве что тебе сам поиск не нужен, а интересно именно алгоритм разработать.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от Pythagoras

А можно поподробнее? Индекс - это соответствие между интервалом и позицией в файле?

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

Как решают эту проблему поисковики вроде гугла, когда я ввожу какую-нибудь фразу в кавычках? У них есть какой-нибудь индекс по словам, благодаря которому они смогут найти страницы, на которых встречаются все слова из фразы, но ведь фраза в кавычках, а значит слова должны идти последовательно. Неужели они начинают перебирать все найденные страницы одна за одной, проверяя последовательность слов?

Не знаю. Плотно работал только с одной закрытой системой, пользующейся базовыми средствами Оракла, и там поиск последовательностей и подстрок, действительно, гораздо медленнее.

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

question4 ★★★★★
()
Ответ на: комментарий от Pythagoras

Брать только последовательности длинной 3 или 2. Разбивать ввод на части и искать по ним. Отображать записи по точности совпадения (например, для последовательности длинной 10 и сегменте длинной 2: 5 кусков из 5 или 3 из 5 со сдвигом). Меньше база, дольше поиск.

tyakos ★★★
()

Задача теоретическая или практическая?

Если теоретическая — см. выше.

Если практическая — берешь любую библиотеку для fingerprinting'а звука, синтезируешь в звуковую дорожку каждый канал каждого файла, собираешь базу. Наигранное на клавиатуре тоже ситезируешь в звук, фингерпринтишь и ищешь по базе. К понедельнику успеешь.

t184256 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.