原文链接: python music21 简单使用
上一篇: js 函数柯里化 闭包
midi文件下载
http://midi.midicn.com/2000/06/06/%E5%8F%A4%E5%85%B8%E9%9F%B3%E4%B9%90MIDI
music21
http://web.mit.edu/music21/doc/about/what.html
解析midi文件,将解析到的数据,转为字符串数组形式
将字符串数组形式的数据,生成midi文件
数据包括乐器,音调,音符等
parts:
<music21.stream.Part Piano>
notes:
<music21.stream.Part Piano>
---
<music21.note.Note E->
E-5
---
<music21.chord.Chord D4 B-3 D5>
[10, 2]
---
<music21.chord.Chord A2 D5>
[9, 2]
---
from music21 import converter, instrument, note, chord, stream
def get_nodes():
stream = converter.parse('mid/baga01.mid')
# 获取乐器
print('parts:')
parts = instrument.partitionByInstrument(stream)
# 输出所有乐器
for i in parts:
print(i)
# 音调信息
print('notes:')
note_list = []
notes = parts.parts[0].recurse()
for i in notes:
print(i)
if isinstance(i, note.Note):
# 音调
print(i.pitch)
note_list.append(str(i.pitch))
elif isinstance(i, chord.Chord):
print(i.normalOrder)
note_list.append('.'.join(
map(str,
i.normalOrder)
))
print('---\n')
for i in note_list:
print(i)
return note_list
def create_music(prediction):
# 音符之间是有间距的,每次加上一个值,表示间隔时间
# 间隔越小,节奏越快
offset = 0
output_notes = []
# 生成Note和Chord
for data in prediction:
if '.' in data or str(data).isdigit():
# 和弦
note_list = []
for i in data.split('.'):
new_note = note.Note(int(i))
new_note.storedInstrument = instrument.Piano()
# new_note.storedInstrument = instrument.Guitar()
note_list.append(new_note)
new_chord = chord.Chord(note_list)
new_chord.offset = offset
output_notes.append(new_chord)
else:
print('d:', data)
new_note = note.Note(data)
new_note.offset = offset
new_note.storedInstrument = instrument.Piano()
# new_note.storedInstrument = instrument.Guitar()
output_notes.append(new_note)
# 每次 迭代增加偏移,这样不会覆盖和迭代
offset += .5
# 创建流写入文件
mini_stream = stream.Stream(output_notes)
mini_stream.write('midi', fp='out4.mid')
note_list = get_nodes()
create_music(note_list)