python编写的midi制作软件



《python编写的midi制作软件》由会员分享,可在线阅读,更多相关《python编写的midi制作软件(8页珍藏版)》请在装配图网上搜索。
1、心之所向,所向披靡 用Python编写的Mid音频制作软件 源代码如下: #Midi.py: #ThisfilecanbeusedtosimplyturnMidiTxtfiletoMidfile. #Author:loupen #Date:2010-7-20 #Ifyouwanttouseit,youmustwritetheMidiTxtfilebysomerules. #Readthedocumenttolearnmore. fromstructimport* #Threeglobalvariables TrackBegin=[] TrackEnd=[] ToneF
2、ore=1 #writetheMidiHeader defMidiHeader(buffer): buffer.write(pack('ccccBBBB','M',T,'h','d',0,0Q6)) defmsg(buffer,tracks,deltatime): ifdeltatime>0xff: buffer.write(pack('BBBBBB',0,1,0,tracks,deltatime>>8,deltatime&0xff)) else: buffer.write(pack('BBBBBB',0,1,0,tracks,0,deltatime)) returnbuff
3、er.tell()-3 #writetheheaderandtailoftracks defTrackHeader(buffer,list): buffer.write(pack('cccc','M','r,'r','k')) list.append(buffer.tell()) buffer.write(pack('i',0)) defTrackTail(buffer,list): buffer.write(pack('BBBB',0,0xff,0x2f,0)) list.append(buffer.tell()) #Setthepulse,instrumentandcon
4、troller defSetSpeed(buffer,time): time=60.0/int(time) time=int(time*(10**6)) buffer.write(pack('BBBBBBB',0,0xff,0x51,3,time>>16,(time&0xff00)>>8,time&0xff))return1 #Thewords,FenZiandFenMu,arefromChinese.~O~defSetPulse(buffer,FenZi,FenMu): FenZi=int(FenZi) FenMu=int(FenMu) ifFenMu==2: FenMu=
5、1 elifFenMu==4: FenMu=2 elifFenMu==8: FenMu=3 else:return0 buffer.write(pack('BBBBBBBB',0,0xff,0x58,4,int(FenZi),int(FenMu),0x18,0x08))return1 defSetTone(buffer): buffer.write(pack('BBBBBB',0,0xff,0x59,2,0,0))return1 defSetNumOrder(buffer,time): buffer.write(pack('BBBB',time>>24,(time&0xff
6、0000)>>16,(time&0xff00)>>8,time&0xff)) defSetTrackNum(buffer,ad,n): buffer.seek(ad) buffer.write(pack('B',n+1)) defSetInstrument(buffer,trackNum,ITNum):trackNum=int(trackNum) trackNum+=0xc0 buffer.write(pack('BBB',0,trackNum,ITNum)) defSetController(buffer,trackNum,CtrNum):trackNum=int(trackN
7、um) trackNum+=0xb0 buffer.write(pack('BBBB',0,trackNum,11,CtrNum))buffer.write(pack('BBB',0,0xa,0x40)) defSetVolume(buffer,trackNum,S):trackNum=int(trackNum) trackNum+=0xb0 ifS=='H': buffer.write(pack('BBBB',0,trackNum,7,0x7f)) buffer.write(pack('BBB',0,0xa,0x40))ifS=='L': buffer.write(pack(
8、'BBBB',0,trackNum,7,80)) buffer.write(pack('BBB',0,0xa,0x40)) defSetChanYin(buffer,trackNum): trackNum=int(trackNum) trackNum+=0xb0 buffer.write(pack('BBBB',0,trackNum,1,127)) #imitatethefunctionofbufferinC defreadNext(buffer): whileTrue: a=buffer.read(1) ifain['',''n']: passelse:returna
9、 #defseekFore(buffer,offset): #buffer.seek(buffer.tell()-offset) #Usethefollowingtwofunctionstodealwiththeevents defliftup(buffer,time,note): time=int(time) iftime>=128: buffer.write(pack('BBBB',0x80|(time>>7),0x7f&time,note,0))else: buffer.write(pack('BBB',time,note,0)) defpressdown(buffer,
10、num,dict,mark,note,force): globalToneFore a=dict[note]+(5+mark)*12 ifToneFore==1: num+=0x90 buffer.write(pack('BBBB',0,num,a,force)) else: buffer.write(pack('BBB',0,a,force)) ToneFore=a defmain(lp): track=1;deltatime=120 speed='';temp=0 begin=0;mark=0;time=deltatime TrackNum=[0,1,2,3];I
11、TNum=lp;CtrNum=0x7f
dict={'0':0,'1':0,2:2,'3':4,'4':5,5:7,'6':9,7:11}
pTxt=open(r'.\1.txt')
s=".\\%d.mid"%lp[0]pMid=open(s,'wb')ifpTxt.read(6)!="
12、=pTxt.read(1)n=0whilen<8: ifreadNext(pTxt)=='<':breakn+=1 ifn==8: print"ThisisnotMidiTxtfile!"pMid.close()pTxt.close()return0 break n=0 a=readNext(pTxt)whilea!='>': speed+=a a=readNext(pTxt)MidiHeader(pMid)track=msg(pMid,0,deltatime)TrackHeader(pMid,TrackBegin)SetPulse(pMid,FenZi,FenMu)SetTo
13、ne(pMid)SetSpeed(pMid,speed)TrackTail(pMid,TrackEnd)pMid.seek(TrackBegin[0]) SetNumOrder(pMid,TrackEnd[0]-TrackBegin[0]-4)pMid.seek(TrackEnd[0])a=readNext(pTxt)whilea=='[': pTxt.readline() TrackHeader(pMid,TrackBegin)SetInstrument(pMid,TrackNum[n],ITNum[n])SetController(pMid,TrackNum[n],CtrNum)
14、a=readNext(pTxt)n+=1 whileTrue: ifa=='|': a=readNext(pTxt) ifa=='|': a=readNext(pTxt) ifain['[','']: globalToneFore ToneFore=-1;break elifa=='\": mark+=1 a=readNext(pTxt)elifa=='.': ifbegin==0:mark-=1 elifbegin==1: time*=3.0/2 liftup(pMid,time,ToneFore) begin=0 elifbegin==2:a=pTxt.r
15、ead⑴ifain['','口: ifa=='|': print"\'|\'istooclosetoNumber!\n",pTxt.tell(),pTxt.read(1)time*=3.0/2time+=temp liftup(pMid,time,ToneFore) begin=0;temp=0 mark=0 else:continue a=readNext(pTxt)elifa=='Y': time=deltatime/2a=pTxt.read⑴ifain[''J']: ifa=='|': print"邛'istooclosetoNumber!\n",pTxt.tell(
16、),pTxt.read(1)ifbegin==2:time+=templiftup(pMid,time,ToneFore) begin=0;temp=0 mark=0 a=readNext(pTxt) elifa=='E': time=deltatime/4 a=pTxt.read⑴ ifain['','|']: ifa=='|': print"\'|\'istooclosetoNumber!\n",pTxt.tell(),pTxt.read(1)ifbegin==2:time+=templiftup(pMid,time,ToneFore)begin=0;temp=0 ma
17、rk=0 a=readNext(pTxt) elifa=='S': time=deltatime/8a=pTxt.read⑴ifain[''J']: ifa=='|': print"邛'istooclosetoNumber!\n",pTxt.tell(),pTxt.read(1)ifbegin==2:time+=templiftup(pMid,time,ToneFore)begin=0;temp=0mark=0 a=readNext(pTxt) elif7'>=a>='0': ifbegin==0: ifa=='0':force=0 else:force=100 pres
18、sdown(pMid,TrackNum[n-1],dict,mark,a,force)time=deltatimemark=0;begin=1a=pTxt.read⑴ifain['','|']: ifa=='|': print"\'|\'istooclosetoNumber!\n",pTxt.tell(),pTxt.read(1)liftup(pMid,time,ToneFore) begin=0 a=readNext(pTxt) elifbegin==2: time=deltatimea=pTxt.read⑴ifain['','|']: ifa=='|': print"\'|
19、\'istooclosetoNumber!\n",pTxt.tell(),pTxt.read(1)time+=temp liftup(pMid,time,ToneFore) begin=0;temp=0 mark=0 a=readNext(pTxt) elifa=='A': begin=2 temp+=time a=readNext(pTxt) elifa=='-': a=pTxt.read⑴ ifain['','|']:ifa=='|': print"\'|\'istooclosetoNumber!\n",pTxt.tell(),pTxt.read(1)time+=t
20、emp liftup(pMid,time,ToneFore)begin=0;temp=0mark=0 a=readNext(pTxt) elifa=='*': SetVolume(pMid,TrackNum[n-1],'H') ToneFore=1 a=readNext(pTxt) elifa==',': SetVolume(pMid,TrackNum[n-1],'L') ToneFore=1 a=readNext(pTxt) elifa=='W: SetChanYin(pMid,TrackNum[n-1]) ToneFore=1a=readNext(pTxt)els
21、e: print"ThisisnotMidiTxtfile!" pMid.close() pTxt.close()return0 TrackTail(pMid,TrackEnd) pMid.seek(TrackBegin[n]) SetNumOrder(pMid,TrackEnd[n]-TrackBegin[n]-4) pMid.seek(TrackEnd[n]) SetTrackNum(pMid,track,n) pMid.close() pTxt.close() print"\nOK!---LOUPEN” 以上文件存为midi.py。 #test.py: imp
22、ortmidi
i=1
z=[]
j=int(input("Howmanytracks?"))
whilei<=j:
tmp=input("TheInstrumentnumberis:")
z.append(int(tmp))
i+=1
midi.main(z)
以上文件存为test.py。
以下为mid文本范例【赛马】:
23、Y|3Y6Y5Y3Y|2E3E2E1E2E3E2E1E|2E3E2E1E2E3E 2E1E|.6Y3Y1Y.6Y|3Y6Y5Y3Y| 2E3E2E1E2E3E2E1E|2E3E2E1E2E3E2E1E|2..6E1E|2..6E1E|2..6E1E|2..6E1E |2E3E2E1E2E3E2E1E| 2E3E2E1E2E3E2E1E|2Y1E2E2Y1E2E|2Y1E2E2Y1E2E|.66|53|25|31| .66|53|25|31|.6.1E2E|.6.1E2E|.6.1E2E|.6.1E2E|.6E2E1E2E.6E2E1E2E |.6E2E1E2E.6E2E1E2E|
24、 .6.6Y.6Y|.6A.6|36Y.'1E|5.3Y|5Y6Y'1Y.'3E|6A6|36Y.'1E|55Y3Y|2Y3Y6Y5Y| 3A3|56Y.'1E| 1..6Y|2Y3Y6Y5Y|33Y2Y|1Y.2E3Y5Y|6.6|2Y3Y1Y.3E|.6A.6|3Y3E3E6Y'1Y|5Y 5E5E5Y3Y| 5Y5E6E'1Y'2E'1E|6Y6E6E6Y.6Y|3Y3E3E6Y'1Y|5Y5E5E5Y3Y|2Y2E3E6Y5Y|3Y 3E5E3Y.6Y|5Y5E5E6Y'1Y| 1Y1E1E1Y.6Y|2Y2E3E6Y5Y|3Y3E5E3Y2Y|1E.6E1E2E3E2E3
25、E5E|6E5E6E'1E5E6E5E3E|2E3E2E1E2E1E.6E1E|.66| 0Y.6Y1Y3Y|0Y.6Y1Y3Y|0Y2Y.7Y2Y|.6Y3Y1Y3Y|0Y.6Y1Y3Y|0Y.6Y1Y3Y|0Y 2Y.7Y2Y|.6Y3Y1Y3Y|0Y.6Y1Y3Y| 0Y.6Y1Y3Y|0Y2Y.7Y2Y|.6Y3Y1Y3Y|0Y5Y3Y2Y|1Y2Y1Y.6|2Y2Y3Y1Y|.6.3E5E |.6.3E5E|.6.3E5E| .6.3E5E|.6.1E2E|3E2E3E5E6E'1E6E5E|3E2E3E5E6E'1E6E5E|3E5E3E2E1Y3Y |.6.1E2E|
26、3E2E3E5E6E'1E6E5E|3E2E3E5E6E'1E6E5E| 3E5E3E2E1Y3Y|.6.3E6E|'1Y6Y6Y'3Y|'1Y6Y6Y3Y|'1Y6Y6Y'3Y|'1Y6Y6Y3Y| 1Y.6E1E2Y1E2E|3Y2E3E5Y3E5E| 5Y3E5E6Y5E6E|'1Y6E'1E'2Y'1E'2E|'3E'2E'1E'2E'3E'2E'1E'2E|'3E'2E'1E'2E'3E'2E '1E'2E|'3E'2E'1E'2E'3E'2E'1E'2E|'3E'2E'1E'2E'3E'2E'3E'5E| '6A'6A|'6A'6A|'6A'6|'60|66|.6八.6|
27、|
上述文件存为1.txt,和midi.py,test.py放在同一个文件夹下,运行test.py
Tracks为文本中口的个数,instrument为乐器号取值范围为0-127.
注:后附mid文本编辑规范。
附录
Midi文本需按以下格式书写。
28、[”1]表示比1高两个八度。 # 2。.在音符前表示降低一个八度。如[..6]表示比6低两个八度。 # 3。.在音符后表示付点音符。如[6.] # 4。丫表示8分音符,即“一条横线”。如[6Y] # 5。E表示16分音符,即“二条横线”。如[6E] # 6。S表示32分音符,即“三条横线”。如[6S] # 7。#表示升高半音 # 8。b表示降低半音 # 9。-表示延长一个四分音符。如[6A-] # 10。人表示两个相同的音相连。如6-表示为6A- 注: 1。对于表示升降的符号['],[.]后需紧接音符。 2。附点音符[.],[A]需紧接在音符之后。 [A]前后两个音必须相同,即[6A6]或[6A-] 3。[Y],[E],[S]需紧接在音符之后。 4。空格的作用非常重要,慎用。 音符后接空格表示此音符已结束。 wm5 sp手机上编辑和测试。 5。其他功能,像控制器之类,还有待完善!对于升降音因为很少用就忽略了。编辑后的文本需以1.txt命名。 本人刚学python不足之处请高手指教。本文代码在
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。