当前位置: 首页 > 知识库问答 >
问题:

如何将midi文件转换为按键(Python)?

裴昊阳
2023-03-14

我试图读取一个MIDI文件,然后将每个音符(MIDI数字)转换为键盘上的模拟按键(a、f、h、J、t…)。

我可以使用python-midi库读取任何MIDI文件,如下所示:

pattern = midi.read_midifile("example.mid")

我还可以用pywin32模拟按键,如下所示:

shell = win32com.client.Dispatch("WScript.Shell")
shell.SendKeys(key)

但我不知道如何将midi数字(midi文件中的数字)转换成按键。

更准确地说,我试图根据virtualpiano将MIDI数字转换为音符,然后将音符转换为按键。net(61键),这样程序就可以通过按键盘上相应的按钮来播放钢琴(您可以在钢琴设置中按key assist,查看哪个键是哪个按钮)

当然,我也必须在按键之间等待,但这很容易。

感谢您的帮助。(Windows 10 64位(32位Python 2.7))

共有3个答案

漆雕成弘
2023-03-14

我知道你真正需要的是一种将midi音符编号转换为标准符号的方法。

以下是维基百科的一些元素:

... GM指定69号音符播放A440,而A440又将中间C固定为60号音符。。。

(来自MIDI-通用MIDI)

从midi音符数(d)到频率(f)的转换由以下公式给出:
f=2(d-69)/12*440 Hz

(来自MIDI调谐标准-频率值)

最后是C(音符)——以八度音阶命名

Scientific designation  |Octave name |    Frequency (Hz) |    Other names
C4                      | One-lined  |           261.626 |    Middle C

所以C4是midi音符69,midi音符用半音(*)隔开。由于在一个八度音阶中有12个半音,在midi音符81中会得到C5,而著名的A440(midi音符69)是科学记数法中的4

以表格为例

Midi note | Scientific notation
60        | C4
62        | D4
64        | E4
65        | F4
67        | G4
69        | A4
70        | B4
71        | C5

你会得到F♯4在midi 66中。。。

(*)这就是音乐上所谓的平等气质。Midi允许更精细的音高定义,但它远远超出了这个答案。

左丘智渊
2023-03-14

先检查这个问题。这是关于如何模拟按键的一般想法,看起来可能很多,但它只是一个大的按键列表。然后,要将midi转换为键盘按钮,需要在音符和键盘按钮之间创建字典映射。

狄心水
2023-03-14

如果你看一下你正在使用的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

使用read_midifile()打开MIDI文件会返回一个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,是大写的T

midi_to_vk = (
    [None]*36 +
    list('1!2@34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm') +
    [None]*31
)

您将面临的下一个问题是发送关键事件。请注意,在MIDI中,多个音符可以同时播放,也可以在时间上重叠。这意味着您可能需要能够同时发送多个按键事件。

我认为你不能用电脑键盘处理速度。还有时间的问题,但你说这对你来说不是问题。

 类似资料:
  • 问题内容: 如何使用Java将Dicom文件(.dcm)转换为jpeg图像?这是我的代码: 我在运行项目时遇到以下错误 请帮助并提前感谢 问题答案: 这是使用dcm4che 2将DICOM转换为JPEG的链接 以下是我的代码,效果很好,我将其与导入一起放置,因此可能用完了。 用于运行它的罐子 dcm4che-imageio-2.0.28.jar dcm4che-image-2.0.28.jar j

  • 问题内容: 我想将PDF文件转换为CSV文件。我为此使用iText库。程序运行正常,但输出格式不正确。所有数据都在csv文件的第一行中。输出应与pdf文件完全相同(表示带有换行符)。请帮忙。提前致谢。 问题答案: 您需要在每个表行之后在缓冲区中引入一个换行符’\ n’。

  • 问题内容: 我有一个包含一些非utf8特征的文件(例如“ ISO-8859-1”),因此我想将该文件(或读取的)转换为UTF8编码,我该怎么办? 代码是这样的: 编辑:放置一个编码示例 问题答案: 在那里,文本已解码。您可以通过simmetric Writer / OutputStream方法使用您喜欢的编码(例如UTF-8)来编写它。

  • 问题内容: 我使用python创建了一个平均图像文件,并将其保存到numpy文件中。我想知道如何将这个.npy文件转换成.binaryproto文件。我正在使用此文件来使用GoogLeNet进行训练。 问题答案: 您可以简单地使用numpy创建.binaryproto和给定的caffe io函数

  • 我是初学C#的,在找到将文件(doc、xlsx、jpg、png等)转换为Base64的方法时遇到了麻烦。 到目前为止,我得到的是一种使用检索路径的方法...但这不是我所期望的结果。