music21:写入midi文件后和弦转音符?

Posted

技术标签:

【中文标题】music21:写入midi文件后和弦转音符?【英文标题】:music21:the chord turn to note after write into midi files? 【发布时间】:2021-06-19 08:52:23 【问题描述】:

这就是我得到笔记的方式:

def read_notes_from_file(file):
  notes = []
  song = converter.parse(file)
  notes_in_song = None
  try:
      s2 = instrument.partitionByInstrument(song)
      notes_in_song = s2.parts[0].recurse()
  except:
      notes_in_song = song.flat.notes
  for element in notes_in_song:
      if isinstance(element, note.Note):
          notes.append(str(element.pitch))
      elif isinstance(element, chord.Chord):
          notes.append('.'.join(str(n) for n in element.normalOrder))

  return notes

这就是我创建 midi 的方式:

def create_midi(prediction_output, filename):
    offset = 0
    output_notes = []
    for item in prediction_output:
        pattern = item[0]

        if ('.' in pattern) or pattern.isdigit():
            notes_in_chord = pattern.split('.')
            notes = []
            for current_note in notes_in_chord:
                new_note = note.Note(int(current_note))
                new_note.storedInstrument = instrument.Piano()
                notes.append(new_note)
            new_chord = chord.Chord(notes)
            new_chord.offset = offset
            output_notes.append(new_chord)

        else:
            new_note = note.Note(pattern)
            new_note.offset = offset
            new_note.storedInstrument = instrument.Piano()
            output_notes.append(new_note)

        offset += 0.5

    midi_stream = stream.Stream(output_notes)
    midi_stream.write('midi', fp='.mid'.format(filename))

这是我在 create_midi 中输入的注释:

['G1', 'G6', 'C#5', '9.0.2.4', 'E-7', '2.5.7.9', 'C#6', '7.9.1.2', '11.2.4.7', '4.9.10', '3.5.7.11', '8.9.0', '11.2.3', '5.7.10', '7.0', '6.10.11', '2.3.5.9', '2.8', '5.11', '2.4.5', '5.6.7', '5.7.9.11', '1.2.5.8', '6.7.11.1.2', '1.5.8.9', '2', '3.4.8', '10.11.3.6', '4.5.8.9', '3.6.7', '4.5.7.11', '4.5.9', '3.7.11', '3.5.7.8', '5.9', '5.7.10.11', '2.4.6.10', '5.7.10.11', '10.11.0.2.3', '3.4.8', '11.4', '10.0.4.5', '5.8', '11.2.4.6', '2.6.7', '3.6.7.8.9', '4.5.8', '5.8.11.1', '2.5.7', '11.1.4', '1.4.6.9', '11.1', '4.6.7.11', '11.3.6.7', '2.4.6.9', '2.4', '2.8', '4.8.11', '11.2.5', '2.4.6.10', '10.11.3.6', '2.6.10', '5.8.10.0.1', '2.5.8.10', '0.6', '3.7.10.11', '3.6', '3.6.10', '2.4.6', '5.11', '11.0.4.7', '10.2.5', '11.1.2', '3.6.9', '5.6.9', '5.7.9.11.2', '5.8.10.1', '1.2.4.6.9', '6.7.11.2', '3.5.8.9', '2.3.7.10', '3.6', '6.8.9.11.1', '1.4.7.9.10', '2.5.8.10', '6.10.11', '1.4.7', '4.5.8', '6.8.9.1', '5.8', '2.3.6.9', '3.4.6.8.11', '11.2.4.7', '10.1', '11.3.4.6', '4.5.7', '3.6.9', '11.2.4.7', '5.7.10', '3.7.10']

这是我从上面的note创建的midi输入read_notes_from_file后得到的note:

['G4', 'G4', 'C4', 'A4', 'E4', 'D4', 'C4', 'G4', 'C#4', 'E4', 'E-4', 'G#4', 'C#4', 'F4', 'G4', 'F#4', 'D4', 'D4', 'F4', 'D4', 'F4', 'F4', 'C#4', 'F#4', 'C#4', 'D4', 'E-4', 'C#4', 'E4', 'E-4', 'E4', 'E4', 'E-4', 'E-4', 'F4', 'F4', 'D4', 'F4', 'C#4', 'E-4', 'C#4', 'C#4', 'F4', 'C#4', 'D4', 'E-4', 'E4', 'F4', 'D4', 'C#4', 'C#4', 'C#4', 'E4', 'C#4', 'D4', 'D4', 'D4', 'E4', 'C#4', 'D4', 'C#4', 'D4', 'F4', 'D4', 'C4', 'E-4', 'E-4', 'E-4', 'D4', 'F4', 'C#4', 'C#4', 'C#4', 'E-4', 'F4', 'F4', 'F4', 'C#4', 'F#4', 'E-4', 'D4', 'E-4', 'F#4', 'C#4', 'D4', 'F#4', 'C#4', 'E4', 'F#4', 'F4', 'D4', 'E-4', 'C#4', 'C#4', 'C#4', 'E4', 'E-4', 'C#4', 'F4', 'E-4']

它们只是成为和弦的音符,我不知道如何处理它。代码有什么问题吗?

【问题讨论】:

Offset 是计时计数器,对吧?当你说'C#5', '9.0.2.4'时,你希望它比C#高9个半音,C#的根,D#,然后是E#,对吗?我认为当您执行int(current_note) 时,您需要将根 C# MIDI 值添加到所有这些值。它可能有一个功能......我不知道那个应用程序。所以你必须寻找一个,或者在网上找到一个 MIDI 表并自己滚动。 【参考方案1】:

如果您在pattern = item[0] 之后添加print(pattern),您会发现您正在以一种意想不到的方式修剪您的输入。 C# 变为 C2.5.7 变为 2。这就是和弦被导出为单个音符的原因。

【讨论】:

以上是关于music21:写入midi文件后和弦转音符?的主要内容,如果未能解决你的问题,请参考以下文章

保存到 MIDI 文件时,Music21 一次播放所有音符

如何使用 Python 中的长笛乐器从音符制作 MIDI 文件(music21 库)

使用 Music21(或替代方法)从 MIDI 中提取休止符并写入单独的 MIDI 轨道

四分之一时长小于 0.25 的 Music21 音符?

Music21:获取音符的曲目索引

music21:从平面乐谱中获取 midi 声音的声音/程序/乐器?