问题描述
我正在尝试使用 music21(v6.5.0 和 Python 3.8.6)为鼓音轨创建一个 MIDI 文件。我无法创建具有相同偏移的两个声音的流(比如低音和军鼓)。
snareNote = Note('C')
bassFirstNote = Note('C',quarterLength=2)
bassSecondNote = Note('C',quarterLength=2)
hiHatNote = Note('C')
musicStream = stream.Stream()
streamMeasure = stream.Measure()
streamMeasure.timeSignature = meter.TimeSignature('4/4')
musicStream.append(streamMeasure)
snarePart = stream.Part()
# snarePart.insert(createInstrumentWithChannel(instrument.SnareDrum(),1))
snareDrum = instrument.SnareDrum()
snareDrum.midiChannel = 1
snarePart.insert(snareDrum)
basspart = stream.Part()
# basspart.insert(createInstrumentWithChannel(instrument.BassDrum(),2))
bassDrum = instrument.BassDrum()
bassDrum.midiChannel = 2
basspart.insert(bassDrum)
basspart.append(bassFirstNote)
basspart.append(bassSecondNote)
musicStream.insert(0,basspart)
hiHatPart = stream.Part()
# hiHatPart.insert(createInstrumentWithChannel(instrument.HiHatCymbal(),3))
hiHat = instrument.HiHatCymbal()
hiHat.midiChannel = 3
hiHatPart.insert(hiHat)
hiHatPart.repeatAppend(hiHatNote,4)
musicStream.insert(0,hiHatPart)
musicStream.show('text')
musicStream.write('midi',fp='drums.mid')
我的文本输出在正确的偏移处显示低音和踩镲音符 - 但是 MIDI 输出仅包含我插入到流中的最后一部分(在这种情况下是踩镲)。
{0.0} <music21.stream.Measure 0 offset=0.0>
{0.0} <music21.meter.TimeSignature 4/4>
{0.0} <music21.stream.Part 0x1a993ca5d00>
{0.0} <music21.instrument.BassDrum 'Bass Drum'>
{0.0} <music21.note.Note C>
{2.0} <music21.note.Note C>
{0.0} <music21.stream.Part 0x1a993cbe100>
{0.0} <music21.instrument.HiHatCymbal 'Hi-Hat Cymbal'>
{0.0} <music21.note.Note C>
{1.0} <music21.note.Note C>
{2.0} <music21.note.Note C>
{3.0} <music21.note.Note C>
任何关于我做错了什么的提示都会有很大帮助。
谢谢。
解决方法
更改代码以使用正确的注释似乎已经解决了问题。不是对所有鼓音符使用“C”音符,而是使用正确的鼓 midi 音符解决了这个问题。
不正确:
snareNote = Note('C')
bassFirstNote = Note('C',quarterLength=2)
bassSecondNote = Note('C',quarterLength=2)
hiHatNote = Note('C')
正确:
snareNote = Note(38)
bassFirstNote = Note(35,quarterLength=2)
bassSecondNote = Note(35,quarterLength=2)
hiHatNote = Note(42)