python:music21 解析 mid文件;生成 mid文件
python music21 用 converter.parse 解析 midi 文件;生成 midi 文件
Python music21 是一个用于音乐分析、生成和操作的Python库。(MIT) 它提供了丰富的功能,包括从MIDI文件中读取音乐、构建音乐符号、和声分析等。
如果您想学习 Python music21,可以从以下几个方面入手:
1. 学习基础知识:在使用 Python music21 之前,需要掌握基本的 Python 编程知识。可以从 Python 官方文档、Python 教程等入手。
2. 安装 music21: pip install music21 ,也可以从 music21 的官方网站
(https://web.mit.edu/music21/doc/installing/index.html)下载安装包进行安装。
3. 学习使用 music21:可以通过官方文档(https://web.mit.edu/music21/doc/index.html)或者教程进行学习。其中,官方文档提供了丰富的示例代码和 API 文档。
4. 应用实践:可以使用 music21 进行音乐分析、和声分析、音乐生成等。可以结合自己的实际需求进行实践。
编写 parse_mid.py 如下
# -*- coding: utf-8 -*-
import os
import sys
from tkinter import filedialog
from music21 import converter, instrument, note, chord, stream
def get_nodes(midfile):
stream = converter.parse(midfile)
# 获取乐器
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, end=' ')
if isinstance(i, note.Note):
# 音调
print(i.pitch, end=' ')
note_list.append(str(i.pitch))
elif isinstance(i, chord.Chord):
print(i.normalOrder, end=' ')
note_list.append('.'.join(
map(str,
i.normalOrder)
))
print('\n---')
for i in note_list:
print(i, end=',')
return note_list
# main()
if len(sys.argv) ==1:
filetypes = [('mid file','.mid')]
f1 = filedialog.askopenfilename(initialdir='D:/Music', filetypes=filetypes)
elif len(sys.argv) ==2:
f1 = sys.argv[1]
else:
print('usage: python parse_mid.py file1.mid')
sys.exit(1)
if not os.path.exists(f1):
print(f"{f1} is not exists.")
sys.exit(2)
fn,ext = os.path.splitext(f1)
if ext.lower() != '.mid':
print('ext is not .mid ')
sys.exit(2)
get_nodes(f1)
运行 python parse_mid.py happy_birthday.mid
乐器伴奏《祝你生日快乐》,编写 happy_birthday_21.py 如下
# -*- coding: utf-8 -*-
""" 《祝你生日快乐》 """
import music21
from music21 import note, duration
# 整个乐谱
score = music21.stream.Score()
# 创建一个新的Stream对象,表示乐曲的一个部分
part1 = music21.stream.Part()
# 创建一个Instrument对象来表示乐器 Piano
instrument = music21.instrument.Instrument('Piano')
# 将这个乐器设置为part1的属性
part1.append(instrument)
# 创建一个3/4的节拍标记
ts = music21.meter.TimeSignature('3/4')
part1.insert(0, ts)
notels = ['G3', 'G3', 'A3', 'G3', 'C4', 'B3',
'G3', 'G3', 'A3', 'G3', 'D4', 'C4',
'G3', 'G3', 'G4', 'E4', 'C4', 'B3', 'A3',
'F4', 'F4', 'E4', 'C4', 'D4', 'C4']
#duration
dtimes = [0.5, 0.5, 1.0, 1.0, 1.0, 2.0,
0.5, 0.5, 1.0, 1.0, 1.0, 2.0,
0.5, 0.5, 1.0, 1.0, 1.0, 1.0, 1.0,
0.6, 0.2, 1.0, 1.0, 1.0, 2.0]
note_list = []
n = len(notels)
for i in range(0, n):
note1 = note.Note(notels[i], duration= duration.Duration(dtimes[i]))
note_list.append(note1)
part1.append(note_list)
#part1.show("text")
score.append(part1)
fout = 'happy_birthday.mid'
score.write('midi', fp=fout)
print(fout)
运行 python happy_birthday_21.py 生成 happy_birthday.mid
播放 python play_mid.py happy_birthday.mid
更多推荐
所有评论(0)