【发布时间】:2016-09-22 17:42:39
【问题描述】:
我正在做一个分析 MIDI 文件并计算音阶的项目,但我碰壁了。
我可以找到一首单轨歌曲的所有音符(即只有一种乐器正在播放),但我在多轨 MIDI 中得到一个奇怪的数字。
我用:88 个 C 音符、32 个 C#、16 个 D、68 G 和 36 个 E 制作了一个 MIDI。当我将那个 MIDI 文件通过我的分析器时,我得到:2 个 C 音符、2 个 C# 和 1 个 G
这是我将 MIDI 文件放入ableton 时的样子:http://imgur.com/a/7pvPW
这是我的完整代码(对不起,如果它真的很丑/很糟糕,我还很新):http://pastebin.com/r7YkgqMB
很难找到有关如何构建 MIDI 文件的信息,但这里是我的两个主要来源(也许是它们错了?):Source 1、Source 2
相关位:
for i in range(0, len(midi_bytes) - 3): # iterates through the midi (without head chunk)
# Looks for start of track chunk (MTrk)
if midi_bytes[i][1:3] + \
midi_bytes[i + 1][1:3] + \
midi_bytes[i + 2][1:3] + \
midi_bytes[i + 3][1:3] == "4D54726B":
# Found a track chunk
# How long is the chunk?
len_of_chunk = int(midi_bytes[i + 4][1:3] +
midi_bytes[i + 5][1:3] +
midi_bytes[i + 6][1:3] +
midi_bytes[i + 7][1:3], 16)
# iterates through that chunk (from 8 bytes after chunk start to length of chunk + 8 (from the 8 after))
for j in range(9, len_of_chunk + 8):
# Looks for keys
bit = int(midi_bytes[j][1:3], 16)
if midi_bytes[j - 1][1] == "8" and bit <= 127:
然后它检查 8 之后的字节(应该是停止音符命令)mod 12 是什么(如果 = 0 那么它的 a c, = 1 是 c# 等等)
【问题讨论】:
-
您的代码应该放在问题中,而不是外部链接 - 找出相关的位,然后直接放在帖子中。
标签: python-3.x midi file-type