Показать сообщение отдельно
  #2 (permalink)  
Старый 22.01.2020, 14:39
Профессор
Отправить личное сообщение для Audaxviator Посмотреть профиль Найти все сообщения от Audaxviator
 
Регистрация: 28.04.2017
Сообщений: 214

Обозначения для интервалов я придумал "от фонаря" - чтоб мне понятно только было, чтоб не запутаться. Допустим, "с-4-UP" обозначает "чистая кварта вверх", а "m-3-DN" - "малая терция вниз". Аналогично есть функция, высчитывающая все отношения длительностей - только, она берёт разницу первого и нулевого элементов массива time, какбэ держит её в уме, а все остальные разницы между соседними в массие числами - относительно первой; и результаты по-возможности правильно округляет. (как говаривал старик Эйнштейн, "всё в мире относительно") Ну и всё, получается "реляционная формула мелодии". Для примера - вот "формула" старинной немецной песенки "Ах, мой милый Августин":
'b-2-UPb-2-DNb-2-DNm-2-DNb-3-DNb-2-UPc-5-DNb-6-UPb-3-DNc-5-UP': {
    reltones: [
      'b-2-UP', 'b-2-DN', 'b-2-DN',
      'm-2-DN', 'b-3-DN', 'b-2-UP',
      'c-5-DN', 'b-6-UP', 'b-3-DN',
      'c-5-UP', 'b-2-UP', 'b-2-DN',
      'b-2-DN', 'm-2-DN', 'b-3-DN',
      'b-2-UP', 'c-5-DN', 'c-4-UP'
    ],
    reldurat: [
       0.5, 0.25,  0.5, 0.5, 1,
       0.5,    1,  0.5,   1, 1,
      0.25, 0.25, 0.25, 0.5, 1,
       0.5,    1
    ],
    musicdata: 'Ах, мой милый Августин'
  }

Это она предназначена - для сравнения с ней, т.е. взята из готовой "библитеки формул", каковая представляет собой, конечно же, JSON-файлик. Ключ, как видите, сконкатенированный в строку массив reltones - это, как я теоретически предполагал, для быстрого предварительного поиска. Когда "клиент" (ну, то есть я) напел или надинькал WAV, получил в ответ другой WAV (кондово-синтетический) и удостоверился, что оно нормально, он жмёт кнопку Look for - это сигнал серверу, что нужно взять соответствующий blabla.jams и запилить из него подобную же "формулу" (тем же самым алгорифмом, каким запиливаются и все "формулы" для "библиотеки"). Потом он делает такой же "конкатенат" из первых пяти интервалов и бежит с ним по ключам "библиотеки", проверяя их на предмет такой подстроки - и когда (и если) находит подходящий ключ, то потом "для верности" ещё и сравнивает оба массива (оттуда и оттуда). Но, честно сказать, над "алгорифмом" я сильно не парился - всё равно в реальности такой типа "сервис" сделать нельзя. Потому что все мелодии в мире уникальны, их существует больше, чем слов в любом языке - чтобы сделать хоть мало-мальски "библиотеку" таких "формул", это надо чтобы какой-нибудь институт культуры месяц полным составом только этим занимался.

Но как-то же я должен был проверить, оно вообще работает или нет? Загнал в "библиотеку" три "формулы" - кроме упомянутой "Ах, мой милый Августин", ещё "Подмосковные вечера" и "Cheek to cheek" Ирвина Берлина. Я это делал - играя одним пальцем мелодии на пианине, подключённой к компьютеру шнуром, т.е. исходный WAV записывается в идеальном виде (специальную кнопку для добавления формулы в библиотеку видно на кортинко с интерфейсом). И потом уж пробовал напевать или наигрывать.

Скажу так. С голосом, всё равно, получается не очень - но это именно из-за голоса. Увы, я не оперный певец и не могу пропевать фразочку чисто и ровно - голос у меня ставчески-дрожащий, связки давно пропиты... Методом научного тыка выяснил лишь, что если не утыкаться носом в микрофон (тогда уж вся пропитость и дрожание налицо), а отодвинуться, а лучше, вообще отойти на метр-полтора - тогда примерно через раз получается. А вот если проигрывать фразочку на пианине, которая аж в двух метрах от компьютера, то всё работает норм. Получается, что WAV отдаётся с низкой амплитудой, с кучей лишнего шума - но ей этого достаточно, потому что - главное - пианина тоны играет чисто и ровно (в прикрученном ZIP-файле для понятности два WAV - исходный и возвращённый "синтетический"). Из какой мелодии первую фразочку наигрываю (разумеется, в любой тональности и темпе) - такое она мне из "библиотеки" (одно из трёх имеющихся) название и выводит.

Извените за внимание.
Ответить с цитированием