python:music21 解析 mid文件;生成 mid文件

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

参阅:python music21 简单使用

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值