import pygame from pygame import mixer 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 gammewav(ton,mode) : ton=ton.lower() itest=0 deg=[] if ton=="" : ton="c" if mode=="" : mode="maj" if mode=="maj" : tabla="|cdefgab|CDEFGAB|" elif mode=="min" : tabla="|cde-fgab|CDE-FGAB|" elif mode=="har" : tabla="|cde-fga-b|CDE-FGA-B|" elif mode=="mel" : tabla="|cde-fgab|CDE-FGAB|" elif mode=="pen" : tabla="|cdega|CDEGA|" elif mode=="blu" : tabla="|cdd#efga#|CDD#FGA#|" elif mode=="ton" : tabla="|cdef#g#a#|CDEF#G#A#|" elif mode=="demi" or mode=="dem" : tabla="|cdd#ff#g#g#a#b|CDD#FF#GAA#C|cdd#f#gab|" elif mode=="chro" or mode=="chr" : tabla="|cc#dd#eff#gg#aa#b|CC#DD#EFF#GG#AA#BC|" else : tabla="" itab=degtabla("",tabla) if ton=="c#" : itab=degtabla("1",tabla) elif ton=="d" : itab=degtabla("2",tabla) elif ton=="d#" : itab=degtabla("3",tabla) elif ton=="e" : itab=degtabla(4,tabla) elif ton=="f" : itab=degtabla("5",tabla) elif ton=="f#" : itab=degtabla("6",tabla) elif ton=="g" : itab=degtabla("7",tabla) elif ton=="g#" : itab=degtabla("8",tabla) elif ton=="a" : itab=degtabla("9",tabla) elif ton=="a#" : itab=degtabla("10",tabla) elif ton=="b" : itab=degtabla("11",tabla) tabla="" itab[0]="0" for i in range(256) : notewav=itab[i] if itab[i]=="-1" : return tabla if ton=="d-" or ton=="e-" or ton=="a-" or ton=="b-" : tabla=tabla+decodebemolwav(notewav) else : tabla=tabla+decodewav(notewav) return tabla 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 notes(tabla) : icro=0 provcro="" inuance=0 provnuance="" itest=0 provnote="" tabla=tabla+"p " notestabla=[] for i in range(256) : notestabla.append(" ") notesprov=[] for i in range(256) : notesprov.append(" ") j=0 for i in range(len(tabla)) : note=tabla[i] if note=="[" : icro=1 itest=1 provcro="" elif note=="]" : icro=0 notestabla[j]=provnuance+provcro+"]" j=j+1 itest=1 note="" provnuance="" provcro="" if icro==1 : provcro=provcro+note note="" if note=="!" and inuance==0 : inuance=1 provnuance="!" note="" elif inuance==1 and note != "!" : provnuance=provnuance+note note="" if inuance==1 and note=="!" : provnuance=provnuance+"!" itest=1 note="" inuance=0 if i53 : n=n-12 note=str(n) return note def trad(ntrans,note) : tradnote="" itest=0 if int(note)>41 : itest=1 inote=int(note)-12 note=str(inote) if ntrans==0 or ntrans==1 or ntrans==2 or ntrans==4 or ntrans==6 or ntrans==8 or ntrans==9 or ntrans==11 : if note=="30" : tradnote="c" elif note=="31" : tradnote="c#" elif note=="32" : tradnote="d" elif note=="33" : tradnote="d#" elif note=="34" : tradnote="e" elif note=="35" : tradnote="f" elif note=="36" : tradnote="f#" elif note=="37" : tradnote="g" elif note=="38" : tradnote="g#" elif note=="39" : tradnote="a" elif note=="40" : tradnote="a#" elif note==41 : tradnote="b" elif ntrans==3 or ntrans==5 or ntrans==8 or ntrans==10 : if note=="30" : tradnote="c-" elif note=="31" : tradnote="d-" elif note=="32" : tradnote="d" elif note=="33" : tradnote="e-" elif note=="34" : tradnote="e" elif note=="35" : tradnote="f" elif note=="36" : tradnote="g-" elif note=="37" : tradnote="g" elif note=="38" : tradnote="a-" elif note=="39" : tradnote="a" elif note=="40" : tradnote="b-" elif note=="41" : tradnote="b" else : tradnote="" if itest==1 : tradnote=tradnote.upper() tradnote=" "+tradnote return tradnote def traddieze(ntrans,note) : tradnote="" itest=0 if int(note)>41 : itest=1 inote=int(note)-12 note=str(inote) if ntrans>=0 : if note=="30" : tradnote="c" elif note=="31" : tradnote="c#" elif note=="32" : tradnote="d" elif note=="33" : tradnote="d#" elif note=="34" : tradnote="e" elif note=="35" : tradnote="f" elif note=="36" : tradnote="f#" elif note=="37" : tradnote="g" elif note=="38" : tradnote="g#" elif note=="39" : tradnote="a" elif note=="40" : tradnote="a#" elif note==41 : tradnote="b" else : tradnote="" if itest==1 : tradnote=tradnote.upper() tradnote=" "+tradnote return tradnote def playtextetabla(ntrans,texte,tabla,rythme,volume,tempo) : itab=[] for i in range(256) : itab.append("-1") itexte=[] for i in range(256) : itexte.append("-1") nryt=[] for i in range(256) : nryt.append(4) nvol=[] for i in range(256) : nvol.append(5) ntemp=[] for i in range(256) : ntemp.append(120) trans=str(ntrans) itab=degtabla(trans,tabla) itexte=degtabla(trans,texte) nryt=ndegrythme(trans,rythme) nvol=ndegvolume(trans,volume) ntemp=ndegtempo(trans,tempo) for k in range(256) : if itab[k] != "-1" : playnote(ntrans,itab[k],nryt[k],nvol[k],ntemp[k]) for k in range(256) : if itexte[k] != "-1" : fic=trad(ntrans,itexte[k]) if fic[0]==" " : fic=fic[1:len(fic)] if len(fic)>1 : playfic(fic[0],1,5,120) playfic(fic[1],1,5,120) else : playfic(fic,nryt[k],nvol[k],ntemp[k]) return texte def playtextegrille(ntrans,texte,grille,rythme,volume,tempo) : itexte=[] for i in range(256) : itexte.append("-1") nryt=[] for i in range(256) : nryt.append(4) nvol=[] for i in range(256) : nvol.append(5) ntemp=[] for i in range(256) : ntemp.append(120) trans=str(ntrans) nryt=ndegrythme(trans,rythme) nvol=ndegvolume(trans,volume) ntemp=ndegtempo(trans,tempo) itexte=degtabla(trans,texte) k=0 acc="" grille=normaliser(grille) grille=grille+" " for i in range(len(grille)) : l1=grille[i] if l1==" " : playficmp3(acc,nryt[k],nvol[k],ntemp[k]) k=k+1 acc="" else : acc=acc+l1 for k in range(256) : if itexte[k] != "-1" : fic=trad(ntrans,itexte[k]) if fic[0]==" " : fic=fic[1:len(fic)] if len(fic)>1 : playfic(fic[0],1,5,120) playfic(fic[1],1,5,120) else : playfic(fic,nryt[k],nvol[k],ntemp[k]) return texte def playfic(fic,nryt,nvol,ntemp) : delay=120000/ntemp delay=int(delay/nryt) nvol=nvol/10 if fic=="" : return fic="wav/"+fic+".wav" sound = pygame.mixer.Sound(fic) sound.set_volume(nvol) sound.play() pygame.time.delay(delay) sound.stop() return def playficmp3(fic,nryt,nvol,ntemp) : delay=120000/ntemp delay=int(delay/nryt) nvol=nvol/10 if fic=="" : return fic="mp3/"+fic+".mp3" sound = pygame.mixer.Sound(fic) sound.set_volume(nvol) sound.play() pygame.time.delay(delay) sound.stop() return def playnote(ntrans,inote,ndur,nvol,ntempo) : delay=120000/ntempo delay=int(delay/ndur) nvol=nvol/10 if int(inote)<=12 : inote="30" nvol=0 fic="wav/"+inote+".wav" sound = pygame.mixer.Sound(fic) sound.set_volume(nvol) sound.play() pygame.time.delay(delay) sound.stop() return def play(ntrans,tabla,rythme,volume,tempo) : itab=[] for i in range(256) : itab.append("-1") nryt=[] for i in range(256) : nryt.append(4) nvol=[] for i in range(256) : nvol.append(5) ntemp=[] for i in range(256) : ntemp.append(120) trans=str(ntrans) itab=degtabla(trans,tabla) nryt=ndegrythme(trans,rythme) nvol=ndegvolume(trans,volume) ntemp=ndegtempo(trans,tempo) icro=0 nrytval=4 nvolval=.5 ntempval=120 provcro="" tabla=tabla+" " for k in range(len(tabla)) : l1=tabla[k] if l1=="[" : icro=1 l1="" nrytvol=nryt[k] nvolval=nvol[k] ntempval=ntemp[k] elif l1=="]" : icro=0 l1="" if provcro != "" : playcrochet(ntrans,provcro,nrytval,nvolval,ntempval) provcro="" if icro==1 : provcro=provcro+l1 if icro==0 : playnote(ntrans,itab[k],nryt[k],nvol[k],ntemp[k]) return def playtabla(ntrans,tabla,rythme,volume,tempo) : itab=[] for i in range(256) : itab.append("-1") nryt=[] for i in range(256) : nryt.append(4) nvol=[] for i in range(256) : nvol.append(5) ntemp=[] for i in range(256) : ntemp.append(120) trans=str(ntrans) itab=degtabla(trans,tabla) nryt=ndegrythme(trans,rythme) nvol=ndegvolume(trans,volume) ntemp=ndegtempo(trans,tempo) for k in range(256) : if itab[k] != "-1" : playnote(ntrans,itab[k],nryt[k],nvol[k],ntemp[k]) return def deggrille(trans,grille) : deg=[] for i in range(256) : deg.append("-1") normaliser(grille) grille=grille+" " grillenote="" deg[0]=0 k=0 for i in range(len(grille)) : l1=grille[i] if l1==" " : igrille=grillenote deg[k]=igrille k=k+1 grillenote="" else : grillenote=grillenote+l1 return deg def playaccordmp3(ntrans,iaccord,ndur,nvol,ntempo) : delay=120000/ntempo delay=int(delay/ndur) nvol=nvol/10 fic="mp3/"+iaccord+".mp3" sound = pygame.mixer.Sound(fic) sound.set_volume(nvol) sound.play() pygame.time.delay(delay) sound.stop() return def playgrillemp3(ntrans,grille,rythme,volume,tempo) : igri=[] for i in range(256) : igri.append("-1") nryt=[] for i in range(256) : nryt.append(4) nvol=[] for i in range(256) : nvol.append(5) ntemp=[] for i in range(256) : ntemp.append(120) trans=str(ntrans) igri=deggrille(trans,grille) nryt=ndegrythme(trans,rythme) nvol=ndegvolume(trans,volume) ntemp=ndegtempo(trans,tempo) for k in range(256) : if igri[k] != "-1" : playaccordmp3(ntrans,igri[k],nryt[k],nvol[k],ntemp[k]) return def playcrochet(ntrans,tablacro,ndurval,nvolval,ntempval) : delay=120000/ntempval delay=int(delay/ndurval) nvol=nvolval/10 itab=[] for i in range(256) : itab.append("-1") trans=str(ntrans) itab=degtabla(trans,tablacro) for k in range(256) : if itab[k] != "-1" : n=int(itab[k]) note=itab[k] if n>29 and n<54 : fic="wav/"+note+".wav" sound = pygame.mixer.Sound(fic) sound.set_volume(nvolval) sound.play() pygame.time.delay(delay) sound.stop() return def playtabla(ntrans,tabla,rythme,volume,tempo) : itab=[] for i in range(256) : itab.append("-1") nryt=[] for i in range(256) : nryt.append(4) nvol=[] for i in range(256) : nvol.append(5) ntemp=[] for i in range(256) : ntemp.append(120) trans=str(ntrans) itab=degtabla(trans,tabla) nryt=ndegrythme(trans,rythme) nvol=ndegvolume(trans,volume) ntemp=ndegtempo(trans,tempo) for k in range(256) : if itab[k] != "-1" : playnote(ntrans,itab[k],nryt[k],nvol[k],ntemp[k]) return def playaccord(trans,n1,n2,n3,n4) : tradnote1="" tradnote2="" tradnote3="" tradnote4="" n1=trans+n1 note1=str(n1) if n1>29 and n1<54 : fic1="wav/"+note1+".wav" sound = pygame.mixer.Sound(fic1) sound.set_volume(0.5) sound.play() n2=trans+n2 if n2>29 and n2<54 : note2=str(n2) fic2="wav/"+note2+".wav" sound = pygame.mixer.Sound(fic2) sound.set_volume(0.5) sound.play() n3=trans+ n3 if n3>29 and n3<54 : note3=str(n3) fic3="wav/"+note3+".wav" sound = pygame.mixer.Sound(fic3) sound.set_volume(0.5) sound.play() n4=trans+ n3 if n4>29 and n4<54 : note4=str(n4) fic4="wav/"+note4+".wav" sound = pygame.mixer.Sound(fic4) sound.set_volume(0.5) sound.play() return def note(tonique) : l1="" iton=0 if len(tonique)==3 : l1=tonique[2] tonique=tonique[0:2] octton=tonique.upper() if tonique==octton : iton=1 tonique=tonique.lower() if tonique=="c" : ton=30 elif tonique=="c#" or tonique=="d-" : ton=31 elif tonique=="d" : ton=32 elif tonique=="d#" or tonique=="e-" : ton=33 elif tonique=="e" or tonique=="f-" : ton=34 elif tonique=="f" : ton=35 elif tonique=="f#" or tonique=="g-" : ton=36 elif tonique=="g" : ton=37 elif tonique=="g#" or tonique=="a-" : ton=38 elif tonique=="a" : ton=39 elif tonique=="a#" or tonique=="b-" : ton=40 elif tonique=="b" : ton=41 else : ton=0 if l1=="#" : ton=ton+1 elif l1=="-" : ton=ton-1 if iton==1 : ton=ton+12 if ton<30 or ton>53 : ton=0 #print("ton",ton) return ton def interaccord(trans,accord) : if accord=="" : return n1=0 n2=0 n3=0 n4=0 inter="" if len(accord)==1 : tonique=accord elif accord[1]=="#" or accord[1]=="-" : tonique=accord[0:2] inter=accord[2:len(accord)] else : tonique=accord[0:1] inter=accord[1:len(accord)] ton=note(tonique) print("ton",tonique) if inter=="" : playnote(trans,ton) return n1=trans+ton k=0 if inter=="m" : inter="tTQ" elif inter=="m7" : inter="tTt" elif inter=="7" : inter="Ttt" elif inter=="7M" : inter="TtT" elif inter=="dim" : inter="tt" elif inter=="dim7" : inter="ttt" elif inter=="sus4" : inter="QSQ" elif inter=="sus2" : inter="SQQ" elif inter=="m75b" : inter="ttT" else : inter="Tt" inter=inter+" " for i in range(len(inter)) : l1=inter[i] if l1=="S" : n=n1+2 elif l1=="T" : n=n1+4 elif l1=="t" : n=n1+3 elif l1=="Q" : n=n1+5 elif l1=="v" : n=n1+6 elif l1=="V" : n=n1+7 elif l1=="x" : n=n1+8 elif l1=="X" : n=n1+9 else : n=0 k=k+1 if k==2 : n2=n elif k==3 : n3=n2+n elif k==4 : n4=n3+n playaccord(trans,n1,n2,n3,n4) return def degtabla(trans,tabla) : deg=[] for i in range(256) : deg.append("-1") prov="" for i in range(len(tabla)) : note=tabla[i] l1=note.lower() if l1=="c" or l1=="d" or l1=="e" or l1=="f" or l1=="g" or l1=="a" or l1=="b" or l1=="p" : note=" "+note prov=prov+note tabla=prov normaliser(tabla) tabla=tabla+" " tabnote="" notetabla="" deg[0]=0 k=0 for i in range(len(tabla)) : l1=tabla[i] if l1==" " : inote=tradtabnote(trans,tabnote) if inote==" " or inote=="" : inote="1" n=int(inote) if n>29 and n<54 or n==0 : fic="wav/"+inote+".wav" deg[k]=inote k=k+1 notetabla=notetabla+note+" " tabnote="" else : tabnote=tabnote+l1 return deg def ndegmotif(trans,motif) : nmot=[] for i in range(256) : nmot.append(0) if motif=="" : return nmot prov="" normaliser(motif) motif=motif+" " k=0 mot="" nrep=0 for i in range(len(motif)) : l1=motif[i] if l1==" " : if mot[0:1]==":" : nrep=int(mot[1:len(mot)]) mot="" else : nmot[k]=int(mot) k=k+1 mot="" else : mot=mot+l1 if nrep==0 : return nmot for j in range(nrep+1) : for i in range(k) : nmot[i+(j)*k]=nmot[i] +j return nmot def ndegrythme(trans,rythme) : if rythme=="" : rythme="4" if len(rythme)<=2 : nunit=int(rythme) else : nunit=4 nryt=[] for i in range(256) : nryt.append(nunit) prov="" normaliser(rythme) rythme=rythme+" " k=0 dur="" nrep=0 for i in range(len(rythme)) : l1=rythme[i] if l1==" " : if dur[0:1]==":" : nrep=int(dur[1:len(dur)]) elif dur=="1" : nryt[k]=1 elif dur=="1.." : nryt[k]=4/7 elif dur=="1." : nryt[k]=2/3 elif dur=="1/2" : nryt[k]=2 elif dur=="1/2." : nryt[k]=4/3 elif dur=="1/2.." : nryt[k]=8/7 elif dur=="1/4" : nryt[k]=4 elif dur=="1/4." : nryt[k]=8/3 elif dur=="1/8.." : nryt[k]=32/7 elif dur=="1/8" : nryt[k]=8 elif dur=="1/8." : nryt[k]=16/3 elif dur=="1/8.." : nryt[k]=32/7 elif dur=="1/16" : nryt[k]=16 elif dur=="1/16." : nryt[k]=32/3 elif dur=="3/2" : nryt[k]=3 elif dur=="3/4" : nryt[k]=6 elif dur=="3/8" : nryt[k]=12 k=k+1 dur="" else : dur=dur+l1 if nrep==0 : return nryt for j in range(nrep+1) : for i in range(k) : nryt[i+(j)*k]=nryt[i] return nryt def ndegvolume(trans,volume) : if volume=="" : volume="5" if len(volume)<=2 : nunit=int(volume) else : nunit=5 nvol=[] for i in range(256) : nvol.append(nunit) if volume=="" : return nvol prov="" normaliser(volume) volume=volume+" " k=0 vol="" nrep=0 for i in range(len(volume)) : l1=volume[i] if l1==" " : if vol[0:1]==":" : nrep=int(vol[1:len(vol)]) elif vol=="p" : vol=str(nunit-2) elif vol=="pp" : vol=str(nunit-3) elif vol=="ppp" : vol=str(nunit-4) elif vol=="f" : vol=str(nunit+2) elif vol=="ff" : vol=str(nunit+3) elif vol=="fff" : vol=str(nunit+4) if nrep != 0 : vol="" elif int(vol)<=10 : nvol[k]=int(vol) k=k+1 vol="" else : vol=vol+l1 if nrep==0 : return nvol for j in range(nrep+1) : for i in range(k) : nvol[i+(j)*k]=nvol[i] return nvol def ndegtempo(trans,tempo) : if tempo=="" : tempo="120" if len(tempo)<=3 : nunit=int(tempo) else : nunit=120 ntemp=[] for i in range(256) : ntemp.append(nunit) if tempo=="" : return ntemp prov="" normaliser(tempo) tempo=tempo+" " k=0 temp="" nrep=0 for i in range(len(tempo)) : l1=tempo[i] if l1==" " : if temp[0:1]==":" : nrep=int(temp[1:len(temp)]) elif int(temp)<=240 : ntemp[k]=int(temp) k=k+1 temp="" else : temp=temp+l1 if nrep==0 : return ntemp for j in range(nrep+1) : for i in range(k) : ntemp[i+(j)*k]=ntemp[i] return ntemp def decodewav(notewav): n=int(notewav) if n=="30" : note="c" elif n==31 : note="c#" elif n==32 : note="d" elif n==33 : note="d#" elif n==34 : note="e" elif n==35 : note="f" elif n==36 : note="f#" elif n==37 : note="g" elif n==38 : note="g#" elif n==39 : note="a" elif n==40 : note="a#" elif n==41 : note="b" elif n==42 : note="C" elif n==43 : note="C#" elif n==44 : note="D" elif n==45 : note="D#" elif n==46 : note="E" elif n==47 : note="F" elif n==48 : note="F#" elif n==49 : note="G" elif n==50 : note="G#" elif n==51 : note="A" elif n==52 : note="A#" elif n==53 : note="B" elif n==0 : note="P" else : note="" return note def decodebemolwav(notewav): n=int(notewav) if n=="30" : note="c" elif n==31 : note="d-" elif n==32 : note="d" elif n==33 : note="e-" elif n==34 : note="e" elif n==35 : note="f" elif n==36 : note="g-" elif n==37 : note="g" elif n==38 : note="a-" elif n==39 : note="a" elif n==40 : note="b-" elif n==41 : note="b" elif n==42 : note="C" elif n==43 : note="D-" elif n==44 : note="D" elif n==45 : note="E-" elif n==46 : note="E" elif n==47 : note="F" elif n==48 : note="G-" elif n==49 : note="G" elif n==50 : note="A-" elif n==51 : note="A" elif n==52 : note="B-" elif n==53 : note="B" elif n==0 : note="P" else : note="" return note def transpoaccord(ntrans,accord) : suite="" tonique="" if accord[1:2]=="#" or accord[1:2]=="-" : tonique=accord[0:2] suite=accord[2:len(accord)] else : tonique=accord[0:1] suite=accord[1:len(accord)] tonique=tonique.upper() note=tradtabnote(ntrans,tonique) tonique=traddieze(ntrans,note) transacc=tonique+suite transacc=transacc[1:len(transacc)] return transacc def deggrille(trans,grille) : deg=[] for i in range(256) : deg.append("-1") normaliser(grille) grille=grille+" " grillenote="" deg[0]=0 k=0 for i in range(len(grille)) : l1=grille[i] if l1==" " : igrille=grillenote deg[k]=igrille k=k+1 grillenote="" else : grillenote=grillenote+l1 return deg def playaccordmp3(ntrans,iaccord,ndur,nvol,ntempo) : iaccord=transpoaccord(ntrans,iaccord) delay=120000/ntempo delay=int(delay/ndur) nvol=nvol/10 fic="mp3/"+iaccord+".mp3" sound = pygame.mixer.Sound(fic) sound.set_volume(nvol) sound.play() pygame.time.delay(delay) sound.stop() return iaccord def playgrillemp3(ntrans,grille,rythme,volume,tempo) : igri=[] for i in range(256) : igri.append("-1") nryt=[] for i in range(256) : nryt.append(4) nvol=[] for i in range(256) : nvol.append(5) ntemp=[] for i in range(256) : ntemp.append(120) trans=str(ntrans) igri=deggrille(trans,grille) nryt=ndegrythme(trans,rythme) nvol=ndegvolume(trans,volume) ntemp=ndegtempo(trans,tempo) grille="" for k in range(256) : if igri[k] != "-1" : iaccord=playaccordmp3(ntrans,igri[k],nryt[k],nvol[k],ntemp[k]) grille=grille+" "+iaccord return grille