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

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

Я предполагаю, что один из способов сделать это - выбрать трек, который состоит из отдельных нот, а не перекрывающихся гармоник (аккордов), и того, который играет на протяжении всей песни, но есть ли другой эффективный способ?

1
ytrewq 8 Дек 2016 в 14:32

3 ответа

Лучший ответ

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

import music21
from music21 import *

piece = converter.parse("full_path_to_piece.midi")
for part in piece.parts:
  print(part[0].bestName()) # replace this print statement with a relevant if statement
1
Alex 8 Дек 2016 в 16:10

Вместо использования .bestName() я нашел .partName очень полезным для поиска правильной мелодии. Документацию можно найти здесь: http://web.mit.edu /music21/doc/moduleReference/moduleStream.html#part

И вот как я это использовал:

midi_data = converter.parse(data_fn) #data_fn is the path to the .mid file I use
for part in midi_data.parts:
    print(part.partName)
0
Eric 15 Мар 2018 в 00:01

Формат SMF не имеет ограничений на то, как события организованы в треки. Распространено иметь одну дорожку на канал, но также возможно иметь несколько каналов на одной дорожке или несколько дорожек с событиями для одного канала.

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

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

0
CL. 8 Дек 2016 в 15:35