Если вы посмотрите на модуль midi
, который вы используете, вы увидите, что есть некоторые константы, которые можно использовать для преобразования нот в их MIDI-номер и наоборот.
>>> import midi
>>> midi.C_0 # note C octave 0
0
>>> midi.G_3 # G octave 3
43
>>> midi.Gs_4 # G# octave 4
56
>>> midi.A_8 # A octave 8
105
>>> midi.NOTE_VALUE_MAP_SHARP[0]
C_0
>>> midi.NOTE_VALUE_MAP_SHARP[56]
Gs_4
>>> midi.NOTE_VALUE_MAP_SHARP[105]
A_8
Открытие MIDI-файла с помощью read_midifile()
возвращает объект Pattern
, который выглядит следующим образом (взято из примеров):
>>> midi.read_midifile('example.mid')
midi.Pattern(format=1, resolution=220, tracks=\
[midi.Track(\
[midi.NoteOnEvent(tick=0, channel=0, data=[43, 20]),
midi.NoteOffEvent(tick=100, channel=0, data=[43, 0]),
midi.EndOfTrackEvent(tick=1, data=[])])])
NoteOnEvent
содержит синхронизацию, номер MIDI/высоту и скорость, которые вы можете получить:
>>> on = midi.NoteOnEvent(tick=0, channel=0, data=[43, 20])
>>> on.pitch
43
>>> midi.NOTE_VALUE_MAP_SHARP[on.pitch]
'G_3'
Все это интересно, но на самом деле вам не нужно преобразовывать номер MIDI в ноту, вам просто нужно преобразовать его в клавишу клавиатуры для этой ноты, используемую http://virtualpiano.net/.
Средняя C равна MIDI 60, и эта нота соответствует 25-й клавише на клавиатуре виртуального пианино, которая активируется нажатием буквы t
. Следующая нота, Cs_5, представляет собой MIDI 61, заглавные буквы T
(<shift>-t)
. Оттуда вы можете определить сопоставление номеров MIDI с поддерживаемыми клавишами виртуального пианино; это:
midi_to_vk = (
[None]*36 +
list('1!2@34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm') +
[None]*31
)
Следующая проблема, с которой вы столкнетесь, — это отправка ключевых событий. Обратите внимание, что в MIDI несколько нот могут воспроизводиться одновременно или перекрываться во времени. Это означает, что вам может потребоваться отправить более одного события нажатия клавиши одновременно.
Я не думаю, что вы можете управлять скоростью, используя компьютерную клавиатуру. Есть еще вопрос времени, но вы сказали, что для вас это не проблема.
person
mhawke
schedule
27.01.2016