python编写midi文件

此程序采用的是python的mido库进行编曲,mido库可以直接通过命令

pip install mido

来进行安装。
mido库的详细用法可以参考某位大佬的文章mido库的详解
这里直接放项目代码

from mido import Message, MidiFile, MidiTrack
import os
import traceback
import random
#把音名、唱名等换成 MIDO相对应的数字
#已完成
def num(yin):                    
    if yin == "A0" or yin =="a0":            #最低音 la
        return 21
    if yin == "B0" or yin == "b0":           #最低的si
        return 23
    if yin == "C1" or yin == "c1":           #低三个八度 do
        return 24
    if yin == "D1" or yin == "d1":           #re
        return 26
    if yin == "E1" or yin == "e1":           #mi
        return 28
    if yin == "F1" or yin == "f1":           #fa
        return 29
    if yin == "G1" or yin == "g1":           #so 或者说 sol
        return 31
    if yin == "A1" or yin == "a1":           #la
        return 33
    if yin == "B1" or yin == "b1":           #si
        return 35
    if yin == "C2" or yin == "c2":           #低两个八度 do
        return 36
    if yin == "D2" or yin == "d2":           #re
        return 38
    if yin == "E2" or yin == "e2":           #mi
        return 40
    if yin == "F2" or yin == "f2":           #fa
        return 41
    if yin == "G2" or yin == "g2":           #so 或者说 sol
        return 43
    if yin == "A2" or yin == "a2":           #la
        return 45
    if yin == "B2" or yin == "b2":           #si
        return 47
    if yin == "C3" or yin == "c3" or yin == ".do" or yin == ".1" or yin == ".Do" or yin == ".DO":          #低八度   do
        return 48
    if yin == "D3" or yin == "d3" or yin == ".re" or yin == ".2" or yin == ".Re" or yin == ".RE":           #re
        return 50
    if yin == "E3" or yin == "e3" or yin == ".mi" or yin == ".3" or yin == ".Mi" or yin == ".MI":           #mi
        return 52
    if yin == "F3" or yin == "f3" or yin == ".fa" or yin == ".4" or yin == ".Fa" or yin == ".FA":           #fa
        return 53
    if yin == "G3" or yin == "g3" or yin == ".so" or yin == ".sol" or yin == ".5" or yin == ".So" or yin == ".Sol" or yin == ".SO" or yin == ".SOL":   #so 或者说 sol
        return 55
    if yin == "A3" or yin == "a3" or yin == ".la" or yin == ".6" or yin == ".La" or yin == ".LA":            #la
        return 57
    if yin == "B3" or yin == "b3" or yin == ".si" or yin == ".7" or yin == ".Si" or yin == ".SI":             #si
        return 59
    #中音区
    if yin == "C4" or yin == "c4" or yin == "C" or yin == "c" or yin == "1" or yin == 1 or yin == "do" or yin == "Do" or yin == "DO":       #中音do
        return 60
    if yin == "D4" or yin == "d4" or yin == "D" or yin == "d" or yin == "2" or yin == 2 or yin == "re" or yin == "Re" or yin == "RE":        #中音re
        return 62
    if yin == "E4" or yin == "e4" or yin == "E" or yin == "e" or yin == "3" or yin == 3 or yin == "mi" or yin == "Mi" or yin == "MI":       #中音mi
        return 64
    if yin == "F4" or yin == "f4" or yin == "F" or yin == "f" or yin == "4" or yin == 4 or yin == "fa" or yin == "Fa" or yin == "FA":       #中音fa
        return 65
    if yin == "G4" or yin == "g4" or yin == "G" or yin == "g" or yin == "5" or yin == 5 or yin == "so" or yin == "sol" or yin == "So" or yin == "Sol" or yin == "SO" or yin == "SOL":   #中音so  或者说 sol
        return 67
    if yin == "A4" or yin == "a4" or yin == "A" or yin == "a" or yin == "6" or yin == 6 or yin == "la" or yin == "La" or yin == "LA":       #中音la
        return 69
    if yin == "B4" or yin == "b4" or yin == "B" or yin == "b" or yin == "7" or yin == 7 or yin == "si" or yin == "Si" or yin == "SI":       #中音si
        return 71
    #高音区
    if yin == "C5" or yin == "c5" or yin == "1." or yin == "do." or yin == "Do." or yin == "DO.":   #do
        return 72
    if yin == "D5" or yin == "d5" or yin == "2." or yin == "re." or yin == "Re." or yin == "RE.":   #re 
        return 74
    if yin == "E5" or yin == "e5" or yin == "3." or yin == "mi." or yin == "Mi." or yin == "MI.":   #mi
        return 76
    if yin == "F5" or yin == "f5" or yin == "4." or yin == "fa." or yin == "Fa." or yin == "FA.":   #fa
        return 77
    if yin == "G5" or yin == "g5" or yin == "5." or yin == "so." or yin == "So." or yin == "SO." or yin == "sol." or yin == "Sol." or yin == "SOL.":       #so 或者说是 sol
        return 79 
    if yin == "A5" or yin == "a5" or yin == "6." or yin == "la." or yin == "La." or yin == "LA.":   #la
        return 81
    if yin == "B5" or yin == "b5" or yin == "7." or yin == "si." or yin == "Si." or yin == "SI.":   #si
        return 83
    #从此,退出常用区
    #高两个八度
    if yin == "C6" or yin == "c6":      #do
        return 84
    if yin == "D6" or yin == "d6":      #re
        return 86
    if yin == "E6" or yin == "e6":      #mi
        return 88
    if yin == "F6" or yin == "f6":      #fa
        return 89
    if yin == "G6" or yin == "g6":      #so
        return 91
    if yin == "A6" or yin == "a6":      #la
        return 93
    if yin == "B6" or yin == "b6":      #si
        return 95
    #高三个八度
    if yin == "C7" or yin == "c7":       #do
        return 96
    if yin == "D7" or yin == "d7":       #re
        return 98
    if yin == "E7" or yin == "e7":       #mi
        return 100
    if yin == "F7" or yin == "f7":       #fa
        return 101
    if yin == "G7" or yin == "g7":       #so
        return 103
    if yin == "A7" or yin == "a7":       #la
        return 105
    if yin == "B7" or yin == "b7":       #si
        return 107
    #高四个八度
    #最高音do
    if yin == "C8" or yin == "c8" or yin == "highestdo" or yin == "hdo" or yin == "h1" or yin == "highest1":  #do
        return 108
    if yin =='0':
        return 1
    return None

def make_track(_score,program=0):
    track = MidiTrack()
    no=program
    meta_time = 60 * 60 * 10 / 75
    track.append(Message('program_change',channel=0,program=no,time=0))         
    track.append(Message('note_on', note=0, velocity=64, time=32,channel=0))   
    track.append(Message('note_off', note=0, velocity=127, time=32,channel=0))
    last=0
    for i in range(0,len(_score)):
        ch=_score[i]
        if ch[0]=='$':
            no=int(ch[1:])
            continue
        if ch=='_': 
            track.append(Message('note_off', note=last, velocity=127, time=round(1*meta_time),channel=0))
            continue
        if ch=='__': 
            track.append(Message('note_off', note=last, velocity=127, time=round(2*meta_time),channel=0))
            continue
        if num(ch):
            track.append(Message('program_change',channel=0,program=no,time=0))
            track.append(Message('note_on', note=num(ch), velocity=64, time=0,channel=0))
            last=num(ch)
        try:
            if num(score[i+1]):
                track.append(Message('note_off', note=num(ch), velocity=127, time=round(0.5*meta_time),channel=0))  
        except Exception:
            pass
    return track 
    
score=[ 
    #乐谱
        '$3','1.','_','2.','_','3.','2.','1.','7','_','6','5','6','__','0',
        '$8','1.','2.','3.','2.','1.','7','_','5','4.','2.','3.','__','0'
        '$11','1.','2.','3.','2.','1.','7','_','5','2.','2.','_','1.','7','6','__','0',
        '$12','6','7','1.','7','1.','2.','_','1.','7','1.','__','0',
        '$44','3.','_','3.','3.','_','2.','_','5.','_','2.','2.','__','0',
        '$25','3.','3.','4.','3.','2','_','7','1.','2.','3.','_','3.','3.','_','2.','_','5.','_','2.','2.','__','0',
        '$66','2.','1.','7','5','__','0',
        '$78','3','3','1.','_','1.','1.','7','6','5','__',
        '$53','3','4','5','4','__','6','_','5','4','3','__',
        '$18','3','2','1','__','1','_','6','_','5','_','4','_','3','_','5','_','2','__',
        '$16','3','3','1.','_','1.','1.','7','6','5','__',
        '$22','3','4','5','4','__','6','_','5','4','3','__',
        '$88','3','2','1','__','1','_','6','_','5','__',
        '$72','3','4','5','4','_','5','_','3','3','6','__',
        '$23','6','_','6','6','7', '1.', '5', '_','5','3','4','5','_','0','5','4','3','1','__',
        '$19','1','_','4','3','4','_','0','4','5','4','5','__',
        '$1','5','6','_','0','6','7','1.','7','__',
        '$74','1.','_','2.','_','3.','2.','1.','7','_','6','5','6','__','0',
        '$114','1.','2.','3.','2.','1.','7','_','5','4.','2.','3.','__','0'
        '$2','1.','2.','3.','2.','1.','7','_','5','2.','2.','_','1.','7','6','__','0',
        '$5','6','7','1.','7','1.','2.','_','1.','7','1.','_',
        '$60','1.','_','2.','_','3.','2.','1.','7','_','6','5','6','__','0',
        '$61','1.','2.','3.','2.','1.','7','_','5','4.','2.','3.','__','0'
        '$77','1.','2.','3.','2.','1.','7','_','5','2.','2.','_','1.','7','6','__','0',
        '$69','6','7','1.','7','1.','2.','_','1.','7','1.','__','0',

]
score2=[
    #鼓声
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
    '$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_','$116','.1','.1','_','$118','.2','_',
]
score3=[
    #其他旁白音效
    "$102",".1",'__','__',".2",'__','__',".1",'__','__',"$101",".1",'__','__',".2",'__','__',
    "$102",".4",'__','__',".5",'__','__',".1",'__','__',"$101",".1",'__','__',".2",'__','__',
    "$102",".2",'__','__',".6",'__','__',".1",'__','__',"$101",".1",'__','__',".2",'__','__',
    "$102",".3",'__','__',".3",'__','__',".1",'__','__',"$101",".1",'__','__',".2",'__','__',
    "$102",".2",'__','__',".4",'__','__',".1",'__','__',"$101",".1",'__','__',".2",'__','__',
    "$102",".5",'__','__',".1",'__','__',".1",'__','__',"$101",".1",'__','__',".2",'__','__',
    "$102",".7",'__','__',".3",'__','__',".1",'__','__',"$101",".1",'__','__',".2",'__','__',
    "$102",".6",'__','__',".3",'__','__',".1",'__','__',"$101",".1",'__','__',".2",'__','__',
    "$102",".2",'__','__',".2",'__','__',".1",'__','__',"$101",".1",'__','__',".2",'__','__',
]   
meta_time=60 * 60 * 10 / 75
mid = MidiFile()
track1=make_track(score)
track2=make_track(score2)
track3=make_track(score3)
mid.tracks.append(track1)
mid.tracks.append(track2)
mid.tracks.append(track3)
mid.save("music.mid")#写入midi文件
os.system("music.mid")#直接打开文件
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值