mido库的基础使用

一.Mido初步使用:

使用mido库说来简单,但是特别的麻烦。它有许许多多的功能,这里仅介绍几种最常用的。

以一个代码为例:

import mido
from mido import Message, MidiFile, MidiTrack #不这样写会错
mid = MidiFile() #给自己的文件定的.mid后缀
track = MidiTrack() #定义声部,一个MidoTrack()就是一个声部
mid.tracks.append(track) #这一句一定要加,表示将这个轨道加入到文件中,否则打不开(后面的play)
track.append(Message('program_change',channel=0,program= X,time=0))
track.append(Message('note_on', note=XX, velocity=64, time=XX,channel=0))
track.append(Message('note_off', note=XX, velocity=64, time=XX,channel=0))
mid.save('new.mid')

前面五句应该不用怎么讲,注释已经讲得很清楚洛。

这里重点讲一下后面三句,这是这个库的核心。


track.append(Message('program_change',channel=0,program= X,time=0))

'program_change’参数可以理解成是个起始,用于确定乐器的类型。其中,channel和time不可改变(time表示距离开始上一个音符的时长,channel是轨道,后面会讲),只能是0。

program参数指的是这个轨道的乐器,用数字命名不同的乐器。范围是0-127,下面是对应表。


mido乐器对应表
track.append(Message('note_on', note=XX, velocity=64, time=XX,channel=0))
track.append(Message('note_off', note=XX, velocity=64, time=XX,channel=0))

这两句是控制音符的。note_on表示音符开始,note_off表示音符结束。

下面是几个参数:

1.note

这是音高,用数字命名,从21到108,以半音作为最小单位。中央c是60。

2.velocity

这是音量,范围是0-127,默认是64

3.chnnel

channel同上一个函数一样,代表通道的编号,即将这个音符写到哪个通道之上,这可能起到更改乐器的效果。范围是0-15。0是主奏频道,9是鼓的频道

这个的作用就是,防止编写多音轨音乐的时候出现有个别同样音高的音出不来的情况。

就比方说:track是音轨,用于放很多的不同的乐器,但是同样音高的按键只有一个,因此就不能实现多种乐器同时演奏同一个音的情况。

为了防止这个问题,加入了channel这个东西,用于增加按键

应该可以懂吧....

4.time

time是时间变量,是十分复杂的一个参数

在note_on信息这里可以理解为该音符写在前一个音符结束多久之后,单位是毫秒

但是,在note_off中,time表示的意义是音符的持续时间,也是以毫秒(ms)为单位


如果没有特殊要求,除time、channel外,一般noteon 和 note_off的参数保持一致。


以上就完成了对mido的初步认识。

二.其他参数和语句

MetaMessage

MetaMessage的种类也很多,可以参考官方文档

tempo = 75
tempo = mido.bpm2tempo(bpm)
meta_time = MetaMessage('time_signature', numerator=3, denominator=4)
meta_tempo = MetaMessage('set_tempo', tempo = tempo, time=0)
meta_tone = MetaMessage('key_signature', key='C')

其中time_signature是对于节拍的表示,在此处即3/4,参数以分子和分母来命名,十分清晰

set_tempo是用于设置音乐的节奏快慢,由于这里tempo的单位不是BPM(Beat Per Minute),故一般配合bpm2tempo来使用

key_signature是用于设置音乐的调式的,在此处我设置为C大调,若是小调的话仅需要在后面添加小写字母m,如Cm表示C小调,我一般不用(滑稽)

三.播放模块

这里用的是pygame库的播放模块。

首先祭出模块导入

import pygame

然后就是播放的核心代码

freq = 44100
bitsize = -16
channels = 2
buffer = 1024
pygame.mixer.init(freq, bitsize, channels, buffer)#初始化
pygame.mixer.music.load('./new.mid')
pygame.mixer.music.play()

注意下,如果这里没有‘mid.tracks.append(track)’这一句,那这里就会报错:

pygame.error: Unrecognized audio format

十分惨痛的经历!!!为此我付出将近一个下午的代价!!!


到这里,就完成了对mido的基础使用。

如有问题,请欢迎在评论区评论。

如有侵权,请告知删除。谢谢!

posted @   ZeroHzzzz  阅读(48)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示