我试图读取一个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))
我知道你真正需要的是一种将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允许更精细的音高定义,但它远远超出了这个答案。
先检查这个问题。这是关于如何模拟按键的一般想法,看起来可能很多,但它只是一个大的按键列表。然后,要将midi转换为键盘按钮,需要在音符和键盘按钮之间创建字典映射。
如果你看一下你正在使用的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的方法时遇到了麻烦。 到目前为止,我得到的是一种使用检索路径的方法...但这不是我所期望的结果。