import random import musicpy import midiutil from midiutil import MIDIFile import musicpy from musicpy import * xMyMIDI = MIDIFile(1) # One track, defaults to format 1 (tempo track is created def convert_seconds_to_quarter(time_in_sec, bpm): quarter_per_second = (bpm/60) time_in_quarter = time_in_sec * quarter_per_second return time_in_quarter def paravoix(tabvoix) : global program global volume global tempo program=instru(tabvoix) if program=="" : program=64 else : para="i:"+program tabvoix=otepara(para,tabvoix) program=int(program) print("Instrument",program) volume=vol(tabvoix) if volume=="" : volume=120 else : para="v:"+volume tabvoix=otepara(para,tabvoix) volume=int(volume) print("Volume",volume) tona=ton(tabvoix) if tona=="" : tona="c" else : para="h:"+tona tabvoix=otepara(para,tabvoix) mod=mode(tabvoix) if mod=="" : mod="maj" else : para="m:"+mod tabvoix=otepara(para,tabvoix) arma=armature(tona,mod) if arma != "" : print("armature",arma) tabvoix=anharmtabla(tabvoix,arma) print("Tablature anharmonique",tabvoix) demiton=trans(tabvoix) if demiton=="" : demiton="" else : para="o:"+demiton tabvoix=otepara(para,tabvoix) if tabvoix=="v1" or tabvoix=="" : tabvoix=gamme(tona,mod) if tona=="" : tona="C" if demiton != "" : idemiton=int(demiton) tabvoix=transpotabla(tabvoix,idemiton) print("Transposition de",demiton,"demitons") if demiton != "": tona=transpotabla(tona,idemiton) print("Nouveau ton",tona,"Mode",mod) else : print("Ton",tona,"Mode",mod) return tabvoix def musivoix(tab, n) : print("voix",n,tab) tab=tablarep(tab) print("Entrez un motif de tablature pour la voix",n) motif=input() motif=normaliser(motif) motif=repmotif(motif) tab=tablamotif(tab,motif) tab=tablarep(tab) print("Tablature avec motif",tab) print("Entrez un rythme avec répétition pour la voix",n) rythme=input() rythme=normaliser(rythme) if rythme=="" : rythme=decodedurvoix(durvoix(tab)) #rythme=mesurythme(mesu) rythme=reprythme(rythme) #print("rythme",rythme) print("Entrez une suite d'intervalles ou return") intervalle=input() intervalle=normaliser(intervalle) if intervalle=="" : intervalle=rythme a=musichord(tab,rythme,intervalle) return a def musigrille(grille,rythme,intervalle) : renver="" motif="" tab=notegrille(grille,renver,motif) tabla="" for i in range(len(tab)) : l1=tab[i] if l1==" " : l1="," tabla=tabla+l1 a=musichord(tabla,rythme,intervalle) return a def normaliser(chaine) : prov="" for i in range(len(chaine)) : l1=chaine[i] l2=chaine[i:i+2] if l2=="k:" or l2=="t:" or l2=="v:" or l2=="i:" or l2=="h:" or l2=="m:" or l2=="o:" : prov=prov+" " if l1==" " : if chaine[i-1]==" " : l1="" prov=prov+l1 return prov def codeinter(inter) : if inter=="s" : deg=1 elif inter=="S" : deg=2 elif inter=="t" : deg=3 elif inter=="T" : deg=4 elif inter=="Q" : deg=5 elif inter=="v" : deg=6 elif inter=="V" : deg=7 elif inter=="x" : deg=8 elif inter=="X" : deg=9 elif inter=="O" or inter=="o" : deg=12 else : deg=0 return deg def decodeinter(int) : if int==1 : inter="s" elif int==2 : inter="S" elif int==3 : inter="t" elif int==4 : inter="T" elif int==5 : inter="Q" elif int==6 : inter="v" elif int==7 : inter="x" elif int==8 : inter="X" elif int==12 : inter="O" else : inter="" return inter def intertab(tab) : degree=[] for i in range(128) : degree.append(-1) degree=voix(tab) j=0 m=degree[0] for i in range(128) : if degree[i] >-1 : j=j+1 if degree[i]<=m : m=degree[i] basse=m prov="" tabinter="" for i in range(j-1) : int=degree[i+1]-degree[i] if int<0 : int=int+12 elif int>12 : int=int-12 prov=decodeinter(int) tabinter=tabinter+prov basse=decode(basse) tabinter=basse+tabinter return tabinter def decodetabinter(tabinter) : deg=[] for i in range(128) : deg.append(-1) j=0 basse="" if tabinter=="" : tabinter="C" tabla="" ibemol=0 b0=tabinter[0] for i in range(len(tabinter)) : l1=tabinter[i] if i==0 : basse=l1 if l1=="-" : ibemol=1 if l1=="m" : if b0=="c" or b0=="f" or b0=="g" or b0=="C" or b0=="F" or b0=="G" : ibemol=1 if l1=="," or l1=="'" or l1=="#" or l1=="-" : basse=basse+l1 l=len(basse) inter=tabinter[l:len(tabinter)] print("intervalle",inter) deg[0]=code(basse) for i in range(len(inter)) : l1=inter[i] deg[i+1]=deg[i]+codeinter(l1) print("basse",basse) if b0=="c" or b0=="C" : ibemol=1 if ibemol==1 : tabla=decodedegreebemol(deg)+" " else : tabla=decodedegree(deg)+" " #print("tabla",tabla) return tabla def decodetabacc(tabacc) : deg=[] for i in range(128) : deg.append(-1) j=0 basse="" nomacc="" if tabacc=="" : tabacc="C" tabla="" ibemol=0 b0=tabacc[0] for i in range(len(tabacc)) : l1=tabacc[i] if i==0 : basse=l1 if l1=="-" : ibemol=1 if l1=="m" : if b0=="c" or b0=="f" or b0=="g" or b0=="C" or b0=="F" or b0=="G" : ibemol=1 if l1=="," or l1=="'" or l1=="#" or l1=="-" : basse=basse+l1 else : nomacc=nomacc+l1 print("nomacc",nomacc) inter=internomacc(nomacc) deg[0]=code(basse) for i in range(len(inter)) : l1=inter[i] deg[i+1]=deg[i]+codeinter(l1) print("basse",basse) if b0=="c" or b0=="C" : ibemol=1 if ibemol==1 : tabla=decodedegreebemol(deg)+" " else : tabla=decodedegree(deg)+" " print("tabla",tabla) return tabla def decodegrille(grille) : nomacc="" tabla="" grille=grille+" " for i in range(len(grille)) : l1=grille[i] if l1==" " and nomacc != "" : print("nomacc",nomacc) tabla=tabla+decodetabacc(nomacc)+" " nomacc="" else : nomacc=nomacc+l1 return tabla def internomacc(nomacc) : if nomacc=="m7" : internom="tTt" elif nomacc=="m75b" : internom="ttT" elif nomacc=="7" : internom="Ttt" elif nomacc=="m" : internom="tTQ" elif nomacc=="7M" : internom="TtT" elif nomacc=="dim" : internom="tt" elif nomacc=="dim7" : internom="ttt" elif nomacc=="sus4" : internom="QSQ" elif nomacc=="sus2" : internom="SQQ" elif nomacc=="9" : internom="TvT" elif nomacc=="6" : internom="TQt" elif nomacc=="69" : internom="TQQ" else : internom="TtQ" return internom def voixpoly(tabla) : poly=[] for i in range(5) : poly.append("") deb1=0 deb2=0 deb3=0 deb4=0 for i in range(len(tabla)) : nvoix=tabla[i:i+2] if nvoix=="v1" : deb1=i+2 elif nvoix=="v2" : deb2=i+2 elif nvoix=="v3" : deb3=i+2 elif nvoix=="v4" : deb4=i+2 if deb2==0 : poly[1]=tabla[deb1:] if deb2 != 0 : poly[1]=tabla[deb1:deb2-2] if deb3==0 and deb2 != 0: poly[2]=tabla[deb2:] if deb3 !=0 : poly[2]=tabla[deb2:deb3-2] if deb4==0 and deb3 != 0: poly[3]=tabla[deb3:] if deb4 !=0 : poly[3]=tabla[deb3:deb4-2] if deb4 != 0 and deb3 != 0: poly[4]=tabla[deb4:] if poly[4] != "" : poly[0]="4" elif poly[3] != "" : poly[0]="3" elif poly[2] != "" : poly[0]="2" else : poly[0]="1" return poly def otepara(para,tabla) : tab="" l=len(para) for i in range(len(tabla)) : p=tabla[i:i+l] if p==para : tab=tabla[0:i]+tabla[i+l:len(tabla)] i=len(tabla) tabla=tab return tabla def trans(tabla) : demiton="" tabla=tabla+" " for i in range(len(tabla)) : if tabla[i:i+2]=="o:" : demiton=tabla[i+2:i+3] if tabla[i+3]=="0" or tabla[i+3]=="1" or tabla[i+3]=="2"or tabla[i+3]=="3" or tabla[i+3]=="4" or tabla[i+3]=="5" or tabla[i+3]=="6" or tabla[i+3]=="7" or tabla[i+3]=="8" or tabla[i+3]=="9" : demiton=tabla[i+2:i+4] if tabla[i+4]=="0" or tabla[i+4]=="1" or tabla[i+4]=="2"or tabla[i+4]=="3" or tabla[i+4]=="4" or tabla[i+4]=="5" or tabla[i+4]=="6" or tabla[i+4]=="7" or tabla[i+4]=="8" or tabla[i+4]=="9" : demiton=tabla[i+2:i+5] i=len(tabla) return demiton def mesurythme(mesu) : rythme="1 1 1 1 8:" if mesu=="4/4" : rythme="1 1 1 1 8:" elif mesu=="3/4" : rythme="1 1 1 8:" elif mesu=="4/8" : rythme="1/2 1/2 1/2 1/2 8:" else : rythme="1/4 8:" return rythme def mesu(tabla) : mesu="" for i in range(len(tabla)) : if tabla[i:i+2]=="k:" and i<=5: mesu=tabla[i+2:i+5] i=len(tabla) return mesu def ton(tabla) : ton="" tabla=tabla+"m:maj" for i in range(len(tabla)-5) : if tabla[i:i+2]=="h:" : ton=tabla[i+2:i+3] if tabla[i+4]=="," or tabla[i+4]=="'" : ton=tabla[i+2:i+5] elif tabla[i+3]=="#" or tabla[i+3]=="+" or tabla[i+3]=="-" or tabla[i+3]=="'" or tabla[i+3]=="," : ton=tabla[i+2:i+4] i=len(tabla) return ton def mode(tabla) : mode="" for i in range(len(tabla)) : if tabla[i:i+2]=="m:" and i<=5: mode=tabla[i+2:i+5] i=len(tabla) return mode def instru(tabla) : program="" tabla=tabla+" " for i in range(len(tabla)) : if tabla[i:i+2]=="i:" : program=tabla[i+2:i+5] i=len(tabla) if program != "" : if ord(program[1])<48 or ord(program[1])>59 : program=program[0:1] elif ord(program[2])<48 or ord(program[2])>59 : program=program[0:2] #print("instrument",program) return program def temp(tabla) : tempo="" for i in range(len(tabla)) : if tabla[i:i+2]=="t:" : tempo=tabla[i+2:i+5] i=len(tabla) if tempo != "" : if ord(tabla[4])<48 or ord(tabla[4])>59 : tempo=tempo[0:2] elif ord(tempo[2])<48 or ord(tempo[2])>59 : tempo=tempo[0:2] return tempo def vol(tabla) : volume="" for i in range(len(tabla)) : if tabla[i:i+2]=="v:" : volume=tabla[i+2:i+5] i=len(tabla) if volume != "" : if ord(tabla[4])<48 or ord(tabla[4])>59 : volume=volume[0:2] return volume def modvol(tabla) : volplus="" for i in range(len(tabla)) : if tabla[i:i+2]==">:" : volplus=tabla[i+2:i+4] i=len(tabla) #print("volplus",volplus) if volplus != "" : if ord(tabla[3])<48 or ord(tabla[3])>59 : volplus=volplus[0:1] return volplus def nombrenote(tabla) : n=0 for i in range(len(tabla)) : l1=tabla[i] if l1 in "pabcdefg" or l1 in "PABCDEFG" : n=n+1 return n def code(note): mod=0 if note=="" : note="p" for i in range(len(note)) : alt=note[i] if alt=="'" : mod=mod+12 elif alt=="," : mod=mod-12 elif alt=="#" or alt=="+" : mod=mod+1 elif alt=="-" : mod=mod-1 note=note[0] if note=='C' : degnote=60 elif note=='D' : degnote=62 elif note=='E' : degnote=64 elif note=='F' : degnote=65 elif note=='G' : degnote=67 elif note=='A' : degnote=69 elif note=='B' : degnote=71 elif note=='c' : degnote=48 elif note=='d' : degnote=50 elif note=='e' : degnote=52 elif note=='f' : degnote=53 elif note=='g' : degnote=55 elif note=='a' : degnote=57 elif note=='b' : degnote=59 else : degnote=-1 if degnote != -1 : degnote=degnote+mod if note=="P" or note=="p" : degnote=0 return degnote def decode(degnote): d=degnote itest=0 ioctave=0 if d>35 and d<48 : d=d+12 ioctave=-1 elif d>23 and d<36 : d=d+24 ioctave=-2 elif d>71 and d<84 : d=d-12 ioctave=1 elif d>83 and d<96 : d=d-24 ioctave=2 degnote=d if d==49 or d==51 or d==54 or d==56 or d==58 or d==61 or d==63 or d==66 or d==68 or d==70 : degnote=degnote-1 itest=1 if degnote==60 : note="C" elif degnote==62 : note="D" elif degnote==64 : note="E" elif degnote==65 : note="F" elif degnote==67 : note="G" elif degnote==69 : note="A" elif degnote==71 : note="B" elif degnote==48 : note="c" elif degnote==50 : note="d" elif degnote==52 : note="e" elif degnote==53 : note="f" elif degnote==55 : note="g" elif degnote==57 : note="a" elif degnote==59 : note="b" elif degnote==0 : note="p" else : note="" if itest==1 : note=note+"#" if ioctave==-1 : note=note+"," elif ioctave==-2 : note=note+",," elif ioctave==1 : note=note+"'" elif ioctave==2 : note=note+"''" return note def repmotif(motif) : if motif=="" : return motif mot=[] for i in range(128) : mot.append(1) alt=[] for i in range(128) : alt.append("") k=0 itest=0 nrep=0 ntran=0 pos="" motifrep="" motif=motif+" " for i in range(len(motif)) : l1=motif[i] if l1=="+" or l1=="-" : alt[k]=alt[k]+l1 l1="" if l1==" " and itest==0 : mot[k]=int(pos) k=k+1 pos="" elif l1==" " and itest==1 : if pos != "" : ntran=int(pos) elif l1==":" : if pos != "" : nrep=int(pos) pos="" itest=1 else : pos=pos+l1 if nrep==0 and ntran==0 : return motif npos=k-1 for k in range(nrep+1) : for i in range(npos+1) : mot[i]=mot[i]+k*ntran motifrep=motifrep+str(mot[i])+alt[i]+" " l=len(motifrep)-1 motif=motifrep[:l] return motif def reprythme(rythme) : nrep=0 if rythme=="" : return rythme for i in range(len(rythme)) : l1=rythme[i] if l1==":" : #print("nrep",rythme[i-1]) nrep=int(rythme[i-1]) rythme=rythme[0:i-1] reprythme="" if nrep==0 : return rythme for k in range(nrep) : reprythme=reprythme+rythme #print("reprythme",reprythme) return reprythme def motifalea(n) : motif="" for i in range(n) : pos=random.randint(1,n) pos=str(pos) if i==n-1 : motif=motif+pos else : motif=motif+pos+" " return motif def codemotifvoix(tabla,motifvoix) : k=0 deg=voix(tabla) degmot=[] for i in range(128) : degmot.append(-1) pos="" alt=0 #motifvoix=repmotif(motifvoix) for i in range(len(motifvoix)) : l1=motifvoix[i] if l1==" " : pos=int(pos)-1 degmot[k]=deg[pos]+alt alt=0 k=k+1 pos="" elif l1=="+" : alt=alt+1 elif l1=="-" : alt=alt-1 else : pos=pos+l1 return degmot def codemotifdur(tabla,motifdur) : k=0 dur=durvoix(tabla) durmot=[] for i in range(128) : durmot.append(1) pos="" motifdur=repmotif(motifdur) for i in range(len(motifdur)) : l1=motifdur[i] if l1==" " : pos=int(pos)-1 durmot[k]=dur[pos] k=k+1 pos="" else : pos=pos+l1 return durmot def decodedegree(degree) : tabla="" for i in range(128) : tabla=tabla+decode(degree[i]) if degree[i]==1 : tabla[i]="|" i=128 return tabla def decodedurnote(d) : durnote="1" if d==.125 : durnote="/8" elif d==.250 : durnote="/4" elif d==.5 : durnote="/2" elif d==.750 : durnote="3/4" elif d==1.5 : durnote="3/2" elif d==1 : durnote="1" elif d==2 : durnote="2" elif d==3 : durnote="3" elif d==4 : durnote="4" elif d==0 : durnote="0" return durnote def decodedurvoix(dur) : r="" rythme="" for i in range(2,128) : d=dur[i] if d==4 : r="4" elif d==3 : r="3" elif d==2 : r="2" elif d==1.5 : r="3/2" elif d==1 : r="1" elif d==.75 : r="3/4" elif d==.5 : r="1/2" elif d==.25 : r="1/4" elif d==.125 : r="1/8" elif d==0 : r="0" else : r="1" rythme=rythme+r+" " return rythme def decodetabla(deg,dur) : tabla="" for i in range(126) : note=decode(deg[i]) durnote=decodedurnote(dur[i+2]) if durnote=="1" : durnote="" if deg=="-1" : i=126 else : tabla=tabla+note+durnote return tabla def decodedegree(degree) : tabla="" for i in range(128) : tabla=tabla+decode(degree[i]) if degree[i]==1 : tabla[i]="|" i=128 return tabla def decodebemol(degnote): d=degnote itest=0 ioctave=0 if d>35 and d<48 : d=d+12 ioctave=-1 elif d>23 and d<36 : d=d+24 ioctave=-2 elif d>71 and d<84 : d=d-12 ioctave=1 elif d>83 and d<96 : d=d-24 ioctave=2 degnote=d if d==47 or d==49 or d==51 or d==54 or d==56 or d==58 or d==61 or d==63 or d==66 or d==68 or d==70 : degnote=degnote+1 itest=1 if degnote==60 : note="C" elif degnote==62 : note="D" elif degnote==64 : note="E" elif degnote==65 : note="F" elif degnote==67 : note="G" elif degnote==69 : note="A" elif degnote==71 : note="B" elif degnote==48 : note="c" elif degnote==50 : note="d" elif degnote==52 : note="e" elif degnote==53 : note="f" elif degnote==55 : note="g" elif degnote==57 : note="a" elif degnote==59 : note="b" else : note="" if itest==1 : note=note+"-" if ioctave==-1 : note=note+"," elif ioctave==-2 : note=note+",," elif ioctave==1 : note=note+"'" elif ioctave==2 : note=note+"''" return note def decodedegreebemol(degree) : tabla="" for i in range(128) : tabla=tabla+decodebemol(degree[i]) if degree[i]==1 : tabla[i]="|" i=128 return tabla def decodegrille(grille) : deg=[] for i in range(128) : deg.append(-1) basse="" acc="" tab="" tabla="" grille=grille+" " for i in range(len(grille)) : l1=grille[i] if l1==" " : deg=codeaccord(acc,"") tab=decodedegree(deg) tab=basse+tab basse="" tab="["+tab+"]" tabla=tabla+tab+" " acc="" elif l1=="/" : basse=acc acc="" else : acc=acc+l1 return tabla def gamme(ton,mode) : itest=0 deg=[] if ton=="" : ton="c" if mode=="" : mode="maj" if mode=="maj" : tabla="c,d,e,f,g,a,b,cdefgabCDEFGABC'D'E'F'G'A'B'C''" elif mode=="min" : tabla="c,d,e-,f,g,a-,b,cde-fga-b-CDE-FGA-B-C'D'E-'F'G'A-'B-'C''" elif mode=="har" : tabla="c,d,e-,f,g,a-,b,cde-fga-bCDE-FGA-BCD'E-'F'G'A-'B'C'''" elif mode=="mel" : tabla="c,d,e-,f,g,a,b,cde-fgabCDE-FGABC'D'E-'F'G'A'B'C''" elif mode=="pen" : tabla="c,d,e,g,a,cdegaCDEGAC'D'E'G'A'" elif mode=="blu" : tabla="c,d,d#,e,g,a#,b,cdd#egaa#CDD#EGAA#C'D'D#'E'G'A'A#'" elif mode=="ton" : tabla="c,d,e,f#,g#,a#,cdef#g#a#CDEF#G#A#C'D'E'F#'G#'A#'C''" elif mode=="demi" or mode=="dem" : tabla="c,d,d#,f,f#,g#,a,b,cdd#ff#g#abCDD#F#GABC'D'E#'F'G#'A'B'C''" elif mode=="chro" or mode=="chr" : tabla="cc,c#,d,d#,e,f,f#,g,g#,a,a#,b,c#dd#eff#gg#aa#bCC#DD#EFF#GG#AA#BC'C#'D'D#'E'f'G'G#'A'A#'B'C''" else : tabla="" idemiton=0 tona=ton l=len(ton) if ton[l-1:l]=="," or ton[l-1:l]=="'" : if ton[l-1:l]=="," : idemiton=-12 else : idemiton=12 ton=ton[0:l-1] ton=ton.lower() deg=voix(tabla) if ton=="f" or ton=="b-" or ton=="e-" or ton=="a-" or ton=="d-" or ton=="g-" : itest=1 tabla=gammebemol(tona,mode) elif ton=="c#" : deg=transpo(deg,1) elif ton=="d" : deg=transpo(deg,2) elif ton=="d#" : deg=transpo(deg,3) elif ton=="e" : deg=transpo(deg,4) elif ton=="f" : deg=transpo(deg,5) elif ton=="f#" : deg=transpo(deg,6) elif ton=="g" : deg=transpo(deg,7) elif ton=="g#" : deg=transpo(deg,8) elif ton=="a" : deg=transpo(deg,9) elif ton=="a#" : deg=transpo(deg,10) elif ton=="b" : deg=transpo(deg,11) if idemiton != 0 : deg=transpo(deg,idemiton) if itest==0 : tabla=decodedegree(deg) return tabla def gammebemol(ton,mode) : deg=[] if mode=="" : mode="maj" if ton=="" : ton="c" if mode=="maj" : tabla="c,d,e,f,g,a,b,cdefgabCDEFGABC'D'E'F'G'A'B'C''" elif mode=="min" : tabla="c,d,e-,f,g,a-,b-,cde-fga-b-CDE-FGA-B-C'D'E-'F'G'A-'B-'C''" elif mode=="har" : tabla="c,d,e-,f,g,a-,b,cde-fga-bCDE-FGA-BC'D'E-'F'G'A-'B'C''" elif mode=="mel" : tabla="c,d,e-,f,g,a,b,cde-fgabCDE-FGABC'D'E-'F'G'A'B'C''" elif mode=="pen" : tabla="c,d,e,g,a,cdegaCDEGAC'D'E'G'A'" elif mode=="blu" : tabla="c,d,e-,e,g,a,b-,cde-egab-CDe-EGAB-C'D'E-'E'G'A'B-'" elif mode=="ton" : tabla="c,d,e,g-,a-,b-,cdeg-a-b-CDEG-A-B-C'D'E'G-'A-'B-'C''" elif mode=="demi" or mode=="dem" : tabla="c,d,e-,f,g-,a-,a,b,cde-fg-a-abCDE-G-GABC'D'E-'F'G-'A-'A'B'C''" elif mode=="chro" or mode=="chr" : tabla="c,d-,d,e-,e,f,g-,g,a-,a,b-,b,cd-de-efg-ga-ab-bCD-DE-EFG-GA-AB-BC'D-'D'E-'E'F'G-'G'A-'A'B-'B'C''" else : tabla="" idemiton=0 l=len(ton) if ton[l-1:l]=="," or ton[l-1:l]=="'" : if ton[l-1:l]=="," : idemiton=-12 else : idemiton=12 ton=ton[0:l-1] ton=ton.lower() deg=voix(tabla) if ton=="d-" : deg=transpo(deg,1) elif ton=="d" : deg=transpo(deg,2) elif ton=="e-" : deg=transpo(deg,3) elif ton=="e" : deg=transpo(deg,4) elif ton=="f" : deg=transpo(deg,5) elif ton=="g-" : deg=transpo(deg,6) elif ton=="g" : deg=transpo(deg,7) elif ton=="a-" : deg=transpo(deg,8) elif ton=="a" : deg=transpo(deg,9) elif ton=="b-" : deg=transpo(deg,10) elif ton=="b" : deg=transpo(deg,11) if idemiton != 0 : deg=transpo(deg,idemiton) tabla=decodedegreebemol(deg) return tabla def gammeaccord(ton,mode,echelle) : deg=[] deb=0 tabla=gamme(ton,mode) deg=voix(tabla) if echelle=="I" : deb=0 elif echelle=="II" : deb=1 elif echelle=="III" : deb=2 elif echelle=="IV" : deb=3 elif echelle=="V" : deb=4 elif echelle=="VI" : deb=5 elif echelle=="VII" : deb=6 #print("deb ",deb,"deg ",deg[deb]) tonique=decode(deg[deb]) tierce=decode(deg[deb+2]) quinte=decode(deg[deb+4]) sept=decode(deg[deb+6]) accord7=tonique+tierce+quinte+sept return accord7 def codeaccord(accord,renver) : deg=[] for i in range(128) : deg.append(-1) if accord=="" : accord="c" ton=accord[0] l=len(accord) suite="" if l>1 : if accord[1]=="#" or accord[1]=="-" or accord[1]=="'" or accord[1]=="," : suite=accord[2:l] ton=accord[0:2] if l>2 : if accord[2]=="#" or accord[2]=="-" or accord[2]=="'" or accord[2]=="," : suite=accord[3:l] ton=accord[0:3] if suite=="" : suite=accord[1:l] ton=accord[0] tona=code(ton) tierce=tona+4 quinte=tona+7 sept=tona+10 octave=tona+12 l=len(suite) if suite=="dim" : tierce=tona+3 quinte=tona+6 elif suite=="dim7" : tierce=tona+3 quinte=tona+6 sept=tona+9 elif suite=="sus4" : tierce=tona+5 elif suite=="sus2" : tierce=tona+2 elif suite=="m75b" : tierce=tona+3 quinte=tona+6 for i in range(l) : c=suite[i] if c=="m" : tierce=tona+3 elif c=="7" : sept=tona+10 elif c=="M" : sept=tona+11 if l>0 : deg[0]=tona deg[1]=tierce deg[2]=quinte if l==0 or suite=="sus2" or suite=="sus4" : deg[0]=tona deg[1]=tierce deg[2]=quinte deg[3]=octave else : deg[0]=tona deg[1]=tierce deg[2]=quinte deg[3]=sept if renver=="1" : deg[1]=deg[1]-12 elif renver=="2" : deg[2]=deg[2]-12 elif renver=="3" : deg[3]=deg[3]-12 return deg def codearpege(accord,motif) : deg=[] for i in range(128) : deg.append(-1) deg=codeaccord(accord,"0") degree=[] for i in range(128) : degree.append(-1) k=0 if motif=="" : motif="0 1 2 3" l=len(motif) for i in range(l) : pos=motif[i] if pos=="0" or pos=="1" or pos=="2" or pos=="3" : degree[k]=deg[int(pos)] k=k+1 return degree def noteaccord(accord,renver,motif) : if renver != "" : deg=codeaccord(accord,renver) else : deg=codearpege(accord,motif) tab=decodedegree(deg) return tab def notegrille(grille,renver,motif) : note="" accord="" grille=grille+" " for i in range(len(grille)) : l1=grille[i] if l1==" " : note=note+noteaccord(accord,renver,motif)+" " accord="" else : accord=accord+l1 return note def accordgrille(grille,renver,motif,rythme,intervalle) : note=notegrille(grille,renver,motif) note="["+note acc="" for i in range(len(note)) : l1=note[i] if l1==" " : acc=acc+"] [" elif l1 != "," : acc=acc+l1 acc=acc+"]" accord=tablaaccord(acc,rythme,intervalle) return accord def gammemotif(ton,mode,motif) : deg=[] for i in range(128) : deg.append(-1) tab=gamme(ton,mode) deg=voix(tab) #deg=codeaccord(accord,"0") degree=[] for i in range(128) : degree.append(-1) k=0 if motif=="" : motif="1 2 3 4 5 6 7 8" l=len(motif) for i in range(l) : pos2=motif[i:i+1] pos=motif[i] if pos2=="10" or pos2=="11" or pos2=="12" or pos2=="13" or pos2=="14" or pos2=="15" or pos2=="16" or pos2=="17" or pos2=="18" or pos2=="19" or pos2=="20" or pos2=="21" or pos2=="22" or pos2=="23" or pos2=="24" : degree[k]=deg[int(pos)-1] i=i+1 elif pos=="1" or pos=="2" or pos=="3" or pos=="4" or pos=="5" or pos=="6" or pos=="7" or pos=="8" or pos=="9" : degree[k]=deg[int(pos)-1] elif pos=="0" : degree[k]=0 elif pos=="+" : degree[k]=degree[k]+1 elif pos=="-" : degree[k]=degree[k]-1 elif pos==" " : k=k+1 if ton=="c" or ton=="g" or ton=="d" or ton=="a" or ton=="e" or ton=="b" : tab=decodedegree(degree) else : tab=decodedegreebemol(degree) return tab def voix(tab) : degree=[] for i in range(128) : degree.append(-1) tab=repvoix(tab) j=0 for i in range(0,len(tab)): if ord(tab[i])>64 and ord(tab[i])<72 : degree[j]=code(tab[i]) j=j+1 elif ord(tab[i])>96 and ord(tab[i])<104 : degree[j]=code(tab[i]) j=j+1 elif tab[i]=="P" or tab[i]=="p" : degree[j]=0 j=j+1 elif ord(tab[i])==35 or tab[i]=="+" : degree[j-1]=degree[j-1]+1 elif tab[i]=="-" : degree[j-1]=degree[j-1]-1 elif ord(tab[i])==44 or tab[i]=="," : degree[j-1]=degree[j-1]-12 elif ord(tab[i])==39 or tab[i]=="'" : degree[j-1]=degree[j-1]+12 return degree def rythmevoix(rythme) : j=0 ideb=0 ifin=0 dur=[] for i in range(128) : dur.append(1) duree=[] for i in range(128) : duree.append("") itest=0 rythme="1,1,"+rythme+"," for i in range(0,len(rythme)) : r=rythme[i] if r=="," : j=j+1 r="" if r=="[" and itest==0 : ideb=j+1 itest=1 if r=="]" and itest==1 : ifin=j itest=0 for k in range(ideb+1,ifin+1) : duree[k]="0" if r=="[" or r=="]" : r="" duree[j]=duree[j]+r for i in range(j) : if duree[i]=="1/2" : dur[i]=1/2 elif duree[i]=="1/4" : dur[i]=1/4 elif duree[i]=="1/8" : dur[i]=1/8 elif duree[i]=="3/4" : dur[i]=3/4 elif duree[i]=="3/2" : dur[i]=3/2 elif duree[i]=="1" : dur[i]=1 elif duree[i]=="2" : dur[i]=2 elif duree[i]=="3" : dur[i]=3 elif duree[i]=="4" : dur[i]=4 elif duree[i]=="0" : dur[i]=0 else : dur[i]=1 return dur def repvoix(tab) : itest=0 suite="" tabla="" for i in range(0,len(tab)): if tab[i]==":" and itest==0 : itest=1 elif tab[i]==":" and itest==1 : itest=0 #print("suite",suite) tabla=tabla+suite suite="" if itest==1 and tab[i] != ":": suite=suite+tab[i] tabla=tabla+tab[i] #print(tabla) return tabla def durvoix(tab) : dur=[] for i in range(128) : dur.append("1") tab=repvoix(tab) durnote="" for i in range(0,len(tab)): if ord(tab[i])>64 and ord(tab[i])<72 : durnote=durnote+"*" elif ord(tab[i])>96 and ord(tab[i])<104 : durnote=durnote+"*" elif tab[i]=="P" or tab[i]=="p" : durnote=durnote+"*" elif tab[i]=="0" or tab[i]=="1" or tab[i]=="2" or tab[i]=="3" or tab[i]=="4" or tab[i]=="5" or tab[i]=="6" or tab[i]=="7" or tab[i]=="8" or tab[i]=="9" : durnote=durnote+tab[i] elif tab[i]=="/" or tab[i]=="|" or tab[i]=="[" or tab[i]=="]" : durnote=durnote+tab[i] rythme="" r=durnote+" " for i in range(len(r)) : if r[i]=="|" or r[i]=="[" or r[i]=="]": rythme=rythme+r[i] if r[i]=="*"and r[i+1]=="*" : rythme=rythme+",1" elif i==0 and r[i]=="[" : rythme=rythme+"[" elif r[i]=="*" and r[i+1]=="[" : rythme=rythme+",1" elif r[i]=="*" and r[i+1]=="|" : rythme=rythme+",1" elif r[i]=="*" and r[i+1]=="]" : rythme=rythme+",1" elif r[i]=="*" and r[i+1]=="/" : rythme=rythme+",1" elif r[i]=="/" : rythme=rythme+"/" elif r[i]=="*" : rythme=rythme+"," elif r[i]==0 or r[i]=="2" or r[i]=="3" or r[i]=="4" or r[i]=="5" or r[i]=="6" or r[i]=="7" or r[i]=="8" or r[i]=="9" : rythme=rythme+r[i] l=len(rythme) if rythme[l-1]=="," : rythme=rythme+"1" r=rythme[1:] dur=rythmevoix(r) return dur def mesuretabla(tab,im) : mesure=[] testbarre=0 k=0 ideb=0 jmesure=0 im=int(im) mesure=tab ifin=len(tab) for i in range(0,len(tab)): if ord(tab[i])==124 : k=k+1 ifin=i if k==im : mesure=tab[ideb:ifin] #print("mesure=",tab[ideb:ifin]) ideb=i return mesure def transpo(degree,idemiton) : if idemiton=="" : idemiton=0 idemiton=int(idemiton) for k in range(0,128) : if degree[k]>0 : degree[k]=degree[k]+idemiton return degree def anharmgamme(ton,mode) : gammeanharm="" ton=ton.upper() arma=armature(ton,mode) gamme="" if ton=="C" or ton=="C#" or ton=="C-" : gamme="c,d,e,f,g,a,b,cdefgabCDEFGABC'D'E'F'G'A'B'" elif ton=="D" or ton=="D-" : gamme="d,e,f,g,a,b,cdefgabCDEFGABC'D'" elif ton=="E" or ton=="E-" : gamme="e,f,g,a,b,cdefgabCDEFGABC'D'E'" elif ton=="F" or ton=="F#" : gamme="f,g,a,b,cdefgabCDEFGABC'D'E'F'" elif ton=="g" or ton=="G-" : gamme="g,a,b,cdefgabCDEFGABC'D'E'F'G'" elif ton=="A" or ton=="A-" : gamme="a,b,cdefgabCDEFGABC'D'E'F'G'A'" elif ton=="B" or ton=="B-" : gamme="b,cdefgabCDEFGABC'D'E'F'G'A'B'" for i in range(len(gamme)) : l1=gamme[i] gammeanharm=gammeanharm+l1 for j in range(len(arma)) : a1=arma[j] if l1.lower()==a1 : gammeanharm=gammeanharm+arma[j+1:j+2] j=len(arma)-1 return gammeanharm def anharmtabla(tabla,arma) : tablaanharm="" tabla=tabla+" " for i in range(len(tabla)-1) : l1=tabla[i] tablaanharm=tablaanharm+l1 if tabla[i+1]=="+" or tabla[i+1]=="-" or tabla[i+1]=="0" or tabla[i+1]=="#" or tabla[i+1]=="b" : i=i+1 else : for j in range(len(arma)) : a1=arma[j] if l1.lower()==a1.lower() : tablaanharm=tablaanharm+arma[1:2] j=len(arma)-1 return tablaanharm def armature(ton,mode) : l=len(ton) if ton[l-1]=="," or ton[l-1]=="'" : ton=ton[0:l-1] ton=ton.upper() arma="" if mode=="maj" : if ton=="C" : return "" elif ton=="G" : arma="f#" elif ton=="D" : arma="f#c#" elif ton=="A" : arma="f#c#g#" elif ton=="E" : arma="f#c#g#d#" elif ton=="B" : arma="f#c#g#d#a#" elif ton=="F#" : arma="f#c#g#d#a#e#" elif ton=="C#" : arma="f#c#g#d#a#e#b#" elif ton=="F" : arma="b-" elif ton=="B-" : arma="b-e-" elif ton=="E-" : arma="b-e-a-" elif ton=="A-" : arma="b-e-a-d-" elif ton=="D-" : arma="b-e-a-d-g-" elif ton=="G-" : arma="b-e-a-d-g-c-" elif ton=="C-" : arma="b-e-a-d-g-c-f-" else : arma="" if mode=="mel" : if ton=="C" : arma="e-" "" elif ton=="G" : arma="b-f#" elif ton=="D" : arma="f0c#" elif ton=="A" : arma="f#c0g#" elif ton=="E" : arma="f#c#g0d#" elif ton=="B" : arma="f#c#g#d0a#" elif ton=="F#" : arma="f#c#g#d#a0e#" elif ton=="C#" : arma="f#c#g#d#a#e0b#" elif ton=="F" : arma="a-b-" elif ton=="B-" : arma="d-b-e-" elif ton=="E-" : arma="g-b-e-a-" elif ton=="A-" : arma="c-b-e-a-d-" elif ton=="D-" : arma="f-b-e-a-d-g-" elif ton=="G-" : arma="b-e-a0d-g-c-" elif ton=="C-" : arma="b-e-a-d0g-c-f-" else : arma="" if mode=="har" : if ton=="C" : arma="a-e-" "" elif ton=="G" : arma="e-b-f#" elif ton=="D" : arma="f0b-c#" elif ton=="A" : arma="c0e0g#" elif ton=="E" : arma="f#d#g0b0" elif ton=="B" : arma="f#c#d0g0a#" elif ton=="F#" : arma="f#c#g#d0a0e#" elif ton=="C#" : arma="f#c#g#d0a0e#b#" elif ton=="F" : arma="d-a-b-" elif ton=="B-" : arma="g-d-b-e-" elif ton=="E-" : arma="c-g-b-e-a-" elif ton=="A-" : arma="f-c-b-e-a-d-" elif ton=="D-" : arma="f-e-a0d-g-" elif ton=="G-" : arma="e-a0d-g-c-" elif ton=="C-" : arma="f-e-a--d0g-c-f-" else : arma="" if mode=="min" or mode=="nat" : if ton=="C" : arma="a-e-b-" "" elif ton=="G" : arma="e-b-f0" elif ton=="D" : arma="f0b-c0" elif ton=="A" : arma="c0e0g0" elif ton=="E" : arma="f#d0g0b0" elif ton=="B" : arma="f#c#d0g0a0" elif ton=="F#" : arma="f#c#g#d0a0e0" elif ton=="C#" : arma="f#c#g#d0a0e#b0" elif ton=="F" : arma="d-a-b-e-" elif ton=="B-" : arma="g-d-b-e-a-" elif ton=="E-" : arma="c-g-b-e-a-d-" elif ton=="A-" : arma="f-c-b-e-a-d-g-" elif ton=="D-" : arma="f-e-a0d-g-c-" elif ton=="G-" : arma="e-a0d-g-c-f-" elif ton=="C-" : arma="f-e-a--d0g-c-f-b-" else : arma="" return arma def voixtabla(tab) : testbarre=0 volume="120" program=instru(tab) if program=="" : program=64 else : para="i:"+program tab=otepara(para,tab) if program[2:]=="v" : program=program[0:1] program=int(program) tempo=temp(tab) if tempo=="" : tempo=120 else : para="t:"+tempo tab=otepara(para,tab) tempo=int(tempo) volume=vol(tab) if volume=="" : volume=120 else : para="v:"+volume tab=otepara(para,tab) volume=int(volume) tab="p"+tab deg=voix(tab) dur=durvoix(tab) j=0 for k in range(0,128): if deg[k]==-1 : deg[k]=0 else : j=j+1 #print("nombre de notes :",j) #for k in range(0,j): #print(deg[k]) #print(dur[k]) track = 0 channel = 0 time = 1 # In beats bpm=100 MyMIDI = MIDIFile(1) # One track, defaults to format 1 (tempo track is created # automatically) MyMIDI.addTempo(track, time, tempo) duration=convert_seconds_to_quarter(1, bpm) MyMIDI = MIDIFile(1) # One track, defaults to format 1 (tempo track is created # automatically) MyMIDI.addTempo(track, time, tempo) MyMIDI.addProgramChange(track, channel, time, program) MyMIDI.addProgramChange(track, channel, time, program) t=dur t[0]=0 for i in range (j): t[i+1]=t[i]+t[i+1] for i, pitch in enumerate(deg): MyMIDI.addNote(track, channel, pitch ,t[i],1 , volume) with open("tabla.mid", "wb") as output_file: MyMIDI.writeFile(output_file) return def rythmetabla(rythme,tab) : testbarre=0 volume="120" program=instru(tab) if program=="" : program=64 else : para="i:"+program tab=otepara(para,tab) program=int(program) tempo=temp(tab) if tempo=="" : tempo=120 else : para="t:"+tempo tab=otepara(para,tab) tempo=int(tempo) volume=vol(tab) if volume=="" : volume=120 else : para="v:"+volume tab=otepara(para,tab) volume=int(volume) tab="p"+tab deg=voix(tab) dur=rythmevoix(rythme) j=0 for k in range(0,128): if deg[k]==-1 : deg[k]=0 else : j=j+1 #print("nombre de notes :",j) #for k in range(0,j): #print(deg[k]) #print(dur[k]) track = 0 channel = 0 time = 1 # In beats bpm=100 MyMIDI = MIDIFile(1) # One track, defaults to format 1 (tempo track is created # automatically) MyMIDI.addTempo(track, time, tempo) duration=convert_seconds_to_quarter(1, bpm) MyMIDI = MIDIFile(1) # One track, defaults to format 1 (tempo track is created # automatically) MyMIDI.addTempo(track, time, tempo) MyMIDI.addProgramChange(track, channel, time, program) MyMIDI.addProgramChange(track, channel, time, program) t=dur t[0]=0 for i in range (j): t[i+1]=t[i]+t[i+1] for i, pitch in enumerate(deg): MyMIDI.addNote(track, channel, pitch ,t[i],1 , volume) with open("tabla.mid", "wb") as output_file: MyMIDI.writeFile(output_file) return def transpotabla(tab,idemiton) : deg=voix(tab) dur=durvoix(tab) idemiton=int(idemiton) deg=transpo(deg,idemiton) tabla=decodedegree(deg) #print("Tablature transposée de ",idemiton,"demitons",tabla) #tabla=decodedegreebemol(deg) #print("Tablature transposée avec des bémols ",tabla) return tabla def tablamotif(tabla,motif) : if motif=="" : return tabla tab=tablarep(tabla) deg=codemotifvoix(tab,motif) ton="c" if ton=="c" or ton=="g" or ton=="d" or ton=="a" or ton=="e" or ton=="b" : tab=decodedegree(deg) else : tab=decodedegreebemol(deg) return tab def tablainter(tabla,inter) : if inter=="" : return tabla n=int(inter) if n<2 or n>4 : return tabla k=0 sim="" tab="" for i in range(len(tabla)) : note=tabla[i] l1=tabla[i] n1=ord(l1) if n1>64 and n1<72 : k=k+1 elif n1>96 and n1<104 : k=k+1 if k==n : sim="["+sim+note+"]" tab=tab+sim sim="" k=0 else : sim=sim+note print("tablature avec notes simultanées",tab) return tab def tablarep(tabla) : imes=0 tab="" tabla=tabla+" " for i in range(len(tabla)-1) : l1=tabla[i] l2=tabla[i:i+2] if l1=="|" : imes=imes+1 l1="" elif l1==":" : l1="" if l2=="|:" : ideb=i+2 elif l2==":|" : ifin=i rep=tabla[ideb:ifin] tab=tab+rep i=i+1 elif l1 != " " : tab=tab+l1 return tab def tablaaccord(tabla,rythme,intervalle) : notes=[] for i in range(128) : notes.append("c4") durinter=[] for i in range(128) : durinter.append("[1/2;1/2]") a="" tabla=tabla+" " n="" oct="4" r="" ryt="" j=0 jdeb=0 jfin=0 for i in range(len(tabla)-1) : l1=tabla[i] ls=tabla[i+1] if l1=="[" : jdeb=j l1="" elif l1=="]" : jfin=j l1="" if l1=="p" or l1=="c" or l1=="d" or l1=="e" or l1=="f" or l1=="g" or l1=="a" or l1=="b": j=j+1 if r=="" or r[0]=="/" : r="1"+r ryt=ryt+r+"," r="" oct="4" n=l1.upper() if ls=="#" or ls=="-" : if ls=="-" : ls="b" n=n+ls i=i+1 ls=tabla[i+1] if ls=="#" or ls=="-" : if ls=="-" : ls="b" n=n+ls i=i+1 ls=tabla[i+1] if ls=="," : oct="3" i=i+1 oct="3" n=n+oct elif l1=="P" or l1=="C" or l1=="D" or l1=="E" or l1=="F" or l1=="G" or l1=="A" or l1=="B": j=j+1 if r=="" or r[0]=="/" : r="1" ryt=ryt+r+"," r="" oct="5" n=l1 if ls=="#" or ls=="-" : if ls=="-" : ls="b" n=n+ls i=i+1 ls=tabla[i+1] if ls=="#" or ls=="-" : if ls=="-" : ls="b" n=n+ls i=i+1 ls=tabla[i+1] if ls=="'" : oct="6" i=i+1 oct="6" n=n+oct elif l1 != "#" and l1 != "-" and l1 != "," and l1 != "'" : r=r+l1 if n != "" : a=a+n+"," n="" if r=="" or r[0]=="/" : ryt=ryt+"1" ryt=ryt+r ryt=ryt[2:] if rythme=="" : rythme=ryt j=0 r="" inter="" if intervalle=="" : intervalle=rythme dur=[] for i in range(128) : dur.append("[1/2;1/2]") interva=[] for i in range(128) : interva.append("[1/2;1/2]") for i in range(len(rythme)) : l1=rythme[i] i1=intervalle[i] if l1=="[" : itest=1 l1="" elif l1=="]" : itest=0 l1="" if l1=="," or l1==" " : dur[j]=r interva[j]=inter if dur[j][0:1]=="[" : dur[j]=dur[j][1:] interva[j]=interva[j][1:] interva[j+1]="0" if j>=jdeb and j