在 python 中构建 MIDI 合并程序,带有恢复选项

Build MIDI merger program in python, with option for recovery

我尝试将2个midi文件合并为一个,这样在播放输出midi文件时就不会听到第二个midi文件了。 我设法得到了只播放第一首歌曲的结果,但我想知道是否有一种方法可以隐藏(加密)第二个文件,并可以选择从输出文件中恢复它。

以我的方式,没有恢复选项,因为第二首歌曲的所有音符都是速度 0,所以除非我将原始速度写入外部文件或类似文件,否则无法恢复它们。

def merge(first, second):
  mid1 = MidiFile(first)
  mid2 = MidiFile(second)
  output = MidiFile(ticks_per_beat=mid1.ticks_per_beat, clip=mid1.clip, charset=mid1.charset, type=mid1.type)

  for i, track in enumerate(mid2.tracks):
      for j, msg in enumerate(mid2.tracks[i]):
          try:
              msg.velocity = 0
          except Exception as e:
              pass
      output.tracks.append(track)

  for i, track in enumerate(mid1.tracks):
      output.tracks.append(track)

  print(output.length)
  output.save(filename="merged.mid")

谢谢!

我已经设法用元消息隐藏了速度。

对于每个音符的消息,我都采用它的速度并创建一个带有 json 对象“{index_of_note_in_track: old_velocity}”的新元消息,并将这些元消息放入在轨道的尽头。

def merge(first, second):
mid1 = MidiFile(first)
mid2 = MidiFile(second)
output = MidiFile(ticks_per_beat=mid1.ticks_per_beat, clip=mid1.clip, charset=mid1.charset, type=mid1.type)

for i, track in enumerate(mid2.tracks):
    new_msgs = []
    for j, msg in enumerate(mid2.tracks[i]):
        if "velocity" in msg.dict().keys():
            new_msgs.append(MetaMessage('text', **{'text': f'{{"{j}":{str(msg.velocity)}}}'}))
            msg.velocity = 0
    for msg in new_msgs:
        track.insert(len(track), msg)
    output.tracks.append(track)

for i, track in enumerate(mid1.tracks):
    output.tracks.append(track)

print(output.length)
output.save(filename="merged.mid")

你能想出其他方法将一个 MIDI 文件隐藏在另一个文件中吗?