python编写的midi制作软件

上传人:飞*** 文档编号:60574871 上传时间:2022-03-08 格式:DOCX 页数:8 大小:28.37KB
收藏 版权申诉 举报 下载
python编写的midi制作软件_第1页
第1页 / 共8页
python编写的midi制作软件_第2页
第2页 / 共8页
python编写的midi制作软件_第3页
第3页 / 共8页
资源描述:

《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)!="”: print"ThisisnotMidiTxtfile!" pMid.close() pTxt.close()return0whileTrue: ifpTxt.read(1)=='|': FenMu=pTxt.read⑴pTxt.seek(pTxt.tell()-3)FenZi

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文本范例【赛马】: <2|4><120> [1] ||6.3E5E|6.3E5E|6.3E5E|6.3E5E|6E5E3E5E6E5E3E5E|6E5E3E5E6E5E3E5E|6Y5E6E6Y5E6E| 6Y5E6E6Y5E6E|.6Y3Y1Y.6

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文本需按以下格式书写。 <3|8><120>#每分钟的节拍数 [1] 1.1. .II [2] 11.1. II 〃〃/〃/〃〃/〃〃/〃/〃〃/〃/〃〃/〃/〃〃/〃/〃〃/〃/〃〃/〃/〃〃/〃/〃〃/〃/〃〃/〃〃/〃/〃〃/〃〃〃/ ||1/2..3.4人-a-#5b67Y."1YA-A-|| # 1。'表示升高一个八度。

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

相关资源

更多
正为您匹配相似的精品文档
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!