#!/usr/bin/env python # -*- coding: utf-8 -*- # * # Application gammique évolutive # Opération = Envol système # ProgamV3epyco # from tkinter import * from tkinter.font import Font import winsound import wave, math, binascii class Gammique(Tk): """ Ramification Gammique """ def __init__(self): Tk.__init__(self) "Tableau de bord" # Titre principal self.title('Entité Gammique :') # Fenêtre écran_résultat self.can=Canvas(self,bg='white', height=550,width=800) self.can.pack(side=RIGHT) # Fenêtre des utilités self.cad=Frame(self, width=30,height=80) self.cad.pack(side=LEFT) # Bouton gamme_radio tab_do=tab_re=tab_mi=tab_fa=tab_so=tab_la=tab_si=0 ##self.tablenotes = les positions du cours self.gama self.tablenotes=[tab_do,tab_re,tab_mi,tab_fa,tab_so,tab_la,tab_si] self.tbdegre=[0] # Contient le mode tonique en cours self.btrad=Button(self.cad,text ='Radio',width=15,bg='light blue',command=self.radio) self.btrad.pack() # Bouton gamme_audio ##self.fichnom = les noms des fichiers audio_notes (communs) self.presaudio = 0 # Utile au bouton accord/sans le résultat "winsound" self.gamula = ['C','D','E','F','G','A','B'] self.framno = ['','','','','','',''] self.fichnom = ['a1.wav','a2.wav','a3.wav','a4.wav','a5.wav','a6.wav','a7.wav'] self.btaud=Button(self.cad,text ='Audio',width=15,bg='light blue',command=lambda: self.actuac(1)) self.btaud.pack() self.btaud2=Button(self.cad,command=self.audio) self.btaud2.pack() self.btaud2.pack_forget() # Pantomime # Bouton choix chromatique hau_do=hau_re=hau_mi=hau_fa=hau_so=hau_la=hau_si=0 ##self.tablehaute = les hauteurs (y) des notes graphiques self.tablehaute = [hau_do,hau_re,hau_mi,hau_fa,hau_so,hau_la,hau_si] self.chrgen = {} # Tableau chromatique généré self.pretrans = [0] ntchtxt = 'Chrome naturel' self.btchr=Button(self.cad,text = ntchtxt,width=15,bg='light blue', command=self.chrome) self.btchr.pack() # Bouton tableaux instruments self.prestabla = [0] self.bttab=Button(self.cad,text ='Tablature',width=15,bg='light blue', command=self.tabla) self.bttab.pack() # Bouton accords ##self.fichacc = les noms des fichiers audio_accords (communs) self.presens = [0] self.accdiese = ['','+','x','^','+^','x^','^^'] # Tableaux des accords et des altérations self.accbemol = ['','**','°*','-*','*','°','-'] # Tableaux des accords et des altérations self.fichacc = ['acc1.wav','acc2.wav','acc3.wav','acc4.wav','acc5.wav','acc6.wav','acc7.wav'] self.btacc=Button(self.cad,text ='Accords',width=15,bg='light blue',command=self.accord) self.btacc.pack() # Bouton quitter self.btquit=Button(self.cad, text='Quitter',bg='light grey',width=15,command=self.destroy) self.btquit.pack(side=BOTTOM) # Mémoire fantomatique self.entfan= Entry(self) self.entfan.pack() self.entfan.pack_forget() # Pantomime self.entfan.delete(0,END) self.entfan.insert(END,"IOI") # Groupe Octave RADIO etiqs=["Octave -1","Octave 0","Octave +1"] valse=["YOI","IOI","IOY"] self.variable=StringVar() self.rad=[ Radiobutton( self.cad, variable=variable, text=text, value=value, command=command, )for (variable, text, value,command) in ( (self.variable,etiqs[2],valse[2],self.yoiioiioy), (self.variable,etiqs[1],valse[1],self.yoiioiioy), (self.variable,etiqs[0],valse[0],self.yoiioiioy), ) ] for i in self.rad: i.pack() self.rad[1].select() # Les notes cursives scalpha : Graduations gérées. self.sca=[ Scale( self, length=300, orient=HORIZONTAL, label=label, troughcolor=color, sliderlength=20, showvalue=1, from_=f, to=t, tickinterval=1, command=command, ) for (label, color, f, t, command) in ( ("C", "black", 0, 5, self.scanote1), ("D", "green", -1, 4, self.scanote2), ("E", "blue", -2, 3, self.scanote3), ("F", "grey", -2, 3, self.scanote4), ("G", "red", -3, 2, self.scanote5), ("A", "orange", -4, 1, self.scanote6), ("B", "yellow", -5, 0, self.scanote7), ("CDEFGAB", "ivory", -12, 12, self.scanote8), ) ] for x in self.sca: x.pack() # Bouton gamme_naturelle self.btzer=Button(self,text ='Zéro',width=25,command=self.zero) self.btzer.pack() # Bouton gamme_calculée self.declare = {} # Base (degrés - notes - altérations) self.dechire = {} # Base avec l'indice adapté aux tableaux(b/#) self.btgama=Button(self,text='gamme',width=25,command=self.gama) self.btgama.pack() self.btgama.pack_forget() # Pantomime # __init__() def tabla(self): if self.prestabla[0] == 1: self.tur.destroy() self.prestabla[0] = 0 self.bttab.invoke() else: self.prestabla[0] = 1 # Tonice(0). Tonale(1:3). Mélode(4:14). Médiane(15:18). Domine(19:42). Harmone(43:65) # self.gamnomscopie : exemple(self.gamnomscopie[tbltr] == (noms)gammes concernées par ce type) # self.gammescopie : exemple(self.gammescopie[tbltr] == (valeurs)gammes concernées par ce type) # self.turmaj : Table des notes blanches | Copie de def chrome/chrmaj tbltr_typ = [0, 1, 3, 4, 14, 15, 18, 19, 42, 43, 65] # Indices des rangs par type (min:max) tbltr_nom = ['Tonice','Tonale','Mélode','Médiane','Domine','Harmone'] # Noms donnés aux types self.tur = Toplevel(self) self.tur.title('Entité Gammique : Tablature') self.tur.geometry('650x300') # Cadre de visualisation : Tablatures frtur = Frame(self.tur,width=30,height=1) frtur.pack(side=BOTTOM) bttur_p = Button(frtur,text ='Inactif',height=1, width=30,bg ='ivory', command=lambda: self.actuac(6)) bttur_p.pack(side = LEFT) bttur_g = Button(frtur,text ='Inactif',height=1, width=30,bg ='ivory', command=lambda: self.actuac(7)) bttur_g.pack(side = RIGHT) # Tables gen*: Contient les indices des fréquences "tab_freqs" gen_b = [3,5,7,8,10,12,14,15,17,19,20,22,24,26,27,29,31,32,34,36,38] gen_n = [4,6,-1,9,11,13,-1,16,18,-1,21,23,25,-1,28,30,-1,33,35,37] freq = f12 = 0 ; f0 = 220 tab_freqs = [] for ai in range(39): # Construction tableau TM if ai < 12: la = f0 elif 24 > ai > 11: la = f0 elif 36 > ai > 23: la = f0 elif ai > 35: la = f0 f1 = la/2 ; f2 = f1/12 freq=f12*f2+f1 # Calcul fréquence tab_freqs.append(freq) # Tableau en écriture TM f12+=1 if f12 > 11: f12 = 0 f0 *= 2 def piano_b(m): duration=200 freqhtz = int(tab_freqs[gen_b[m]]) winsound.Beep(freqhtz, duration) def piano_n(m): duration=200 freqhtz = int(tab_freqs[gen_n[m]]) winsound.Beep(freqhtz, duration) # Les touches blanches bts = [] for x in range(21): bt = Button(self.tur,text='', height=10, width=3, bg='ivory', command=lambda m=x: piano_b(m), relief="groove") bt.place(x = 30*x, y = 30, anchor='nw') bts.append(bt) # Les touches noires: Attention aux absences indicées ! (les -1) btns = [] o = 0 for x in range(21): if o == 2 or o == 6: pass else: btn = Button(self.tur,text='', height=5, width=2, bg='black', command=lambda m=x: piano_n(m), relief="groove") btn.place(x = 30*x+15, y = 30, anchor='nw') o += 1 if o > 6: o = 0 btns.append(btn) # self.tablenotes : Conteneur diatonique (x) # Tables gen*: Contient les indices des touches gen_bz = [0,2,4,5,7,9,11,12,14,16,17,19,21,23,24,26,28,29,31,33,35,36,38] gen_nz = [1,3,-1,6,8,10,-1,13,15,-1,18,20,22,-1,25,27,-1,30,32,34,-1,37] for x in range(7): bon_ok = bob = bon = 0 z = (self.tablenotes[x]//10)-28 for bz in gen_bz: if z == bz and bon_ok == 0: bts[bob].configure(bg = "lightblue") bon_ok = 1 ; break else: bob += 1 for nz in gen_nz: if z == nz and bon_ok == 0: btns[bon].configure(bg = "lightblue") bon_ok = 1 ; break else: bon += 1 def chrome(self): if self.pretrans[0] == 1: self.chm.destroy() self.pretrans[0] = 0 self.btchr.invoke() else: self.pretrans[0] = 1 ch0 = 0 self.chm = Toplevel(self) self.chm.title('Entité Gammique : Chromatisme') # Sélection du mode chromatique (naturel) ou (atonal) frchm = Frame(self.chm,width=200,height=10) frchm.pack(side=BOTTOM) btchn = Button(frchm,text ='Chrome naturel',width=30,bg ='ivory', command=lambda: self.actuac(2)) btchn.pack(side = LEFT) btcha = Button(frchm,text ='Chrome atonal',width=30,bg ='ivory', command=lambda: self.actuac(4)) btcha.pack(side = RIGHT) frchm_ = Frame(self.chm,width=200,height=10) frchm_.pack(side=TOP) # Fenêtre écran_résultat chrcan = Canvas(self.chm,bg='white', height=300,width=600) chrcan.pack() lbchtxt = Label(frchm_, text ="Chromatismes", fg = 'red').pack() # Le pas graphique entre 2 notes = 10, en cotation horizontale # self.tablenotes : Conteneur diatonique | Calcul graphique horizontal # self.tablehaute : Conteneur diatonique | Calcul graphique vertical # self.tbdegre : Première note du mode tonique en cours # self.chrgen : Tableau graphique chromatique( note , signe ,,, ) chrmaj = [0,20,40,50,70,90,110] # Forme graphique majeure self.turmaj = chrmaj # Copie usage tablature chnat_aug = [1,2,4,5,6] ; chnat_min = [2,3,5,6,7] chr_trans = [] ; chr_curs = [] chr_lepas = 10 chrselect = self.btchr.cget('text') # self.tablenotes : Conteneur diatonique | Calcul graphique horizontal cy_zer = self.tbdegre[0] # Premier degré de la gamme for cy_ in range(7): if cy_ == 0: cy_inter = self.tablenotes[cy_zer]-0 if self.tablenotes[cy_zer] < cy_inter: cy_trans = self.tablenotes[cy_zer] - cy_inter + 120 else: cy_trans = self.tablenotes[cy_zer] - cy_inter chr_trans.append(cy_trans) # Transformé élémentaire #(chr_trans[cy_]) # Contenu graphique diatonique chr_curs.append(self.cursifs[cy_zer]) cy_zer +=1 if cy_zer > 6: cy_zer = 0 # Génération élémentaire du tableau chromatique cz_ = cx_tr = cn_ = 0 ; cx_uu = 1 chtop6 = chr_trans[6]//10 xcpos_=180 ; ycpos_=150 ; chposx = 0 rb_=15 chrcan.create_line(15, 150, 585, 150, fill ='blue') for cx_ in range(12): c1_ = c2_ = c3_ = c4_ = c5_ = c6_ = c7_ = -1 # -1 = Emplacement chromatique c2_ax = c2_mx = c3_a = c3_m = c4_a = c4_m = comp = 0 coltyp = coltyp2 = 'black' if cx_ == 0: c1_ = chr_trans[cx_tr] # Incrustation diatonique c2_ = chr_curs[cx_tr] # Hauteur tonale c3_ = self.decore[cx_tr][1:] # Note naturelle c4_ = self.dechire[(0, cx_uu)] # Valeur tonale cx_tr += 1 ; cx_uu += 1 chposx += 1 ; chposyn = c4_ xb_=xcpos_+(chposx*30) ybn_=ycpos_-(chposyn*30) chvow_n = c2_, c3_ chrcan.create_oval(xb_-rb_,ybn_-rb_,xb_+rb_,ybn_+rb_,fill=coltyp) chrcan.create_text(xb_,ybn_,text=chvow_n,font='bold',fill='white') else: if chr_trans[cx_tr] == cx_*10: c1_ = chr_trans[cx_tr] c2_ = chr_curs[cx_tr] c3_ = self.decore[cx_tr][1:] c4_ = self.dechire[(0, cx_uu)] cx_tr += 1 ; cx_uu += 1 chposx += 1 ; chposyn = c4_ xb_=xcpos_+(chposx*30) ybn_=ycpos_-(chposyn*30) chvow_n = c2_, c3_ chrcan.create_oval(xb_-rb_,ybn_-rb_,xb_+rb_,ybn_+rb_,fill=coltyp) chrcan.create_text(xb_,ybn_,text=chvow_n,font='bold',fill='white') else: comp = -1 # Zone des futurs if comp == -1 and cn_ < 5: if chrselect == 'Chrome atonal': if chtop6 < cx_: chpre = chr_trans[6]//10 chsui = chr_trans[0]//10 c2_pre = chr_curs[6] c2_sui = chr_curs[0] c3_pre = self.decore[6][1:] c3_sui = self.decore[0][1:] c4_pre = self.dechire[(0,7)] c4_sui = self.dechire[(0,1)] else: chpre = chr_trans[cx_tr -1]//10 chsui = chr_trans[cx_tr]//10 c2_pre = chr_curs[cx_tr -1] c2_sui = chr_curs[cx_tr] c3_pre = self.decore[cx_tr -1][1:] c3_sui = self.decore[cx_tr][1:] c4_pre = self.dechire[(0,cx_tr)] c4_sui = self.dechire[(0,cx_tr +1)] tg_pre = cx_ - chpre tg_sui = cx_ - chsui c2_ax = tg_pre + c2_pre c2_mx = tg_sui + c2_sui c3_a = c3_pre c3_m = c3_sui c4_a = c4_pre + tg_pre c4_m = c4_sui + tg_sui if chrselect == 'Chrome naturel': id_a = chnat_aug[cn_]-1 # Ordre chromatique majeur(#)(7) id_m = chnat_min[cn_]-1 # Ordre chromatique mineur(b)(7) c2_a = chr_curs[id_a] # Hauteur tonale(b ou #)(7) c2_m = chr_curs[id_m] c3_a = self.decore[id_a][1:] # Note naturelle(7) c3_m = self.decore[id_m][1:] tg_a = chr_trans[id_a]//10 # Hauteur graphique originale(12) tg_m = chr_trans[id_m]//10 tg_a1 = chrmaj[id_a]//10 # Hauteur graphique majeure(7)(c4_a) tg_m1 = chrmaj[id_m]//10 tg_a2 = cx_ - tg_a # Hauteur tonale signée, non nulle tg_m2 = cx_ - tg_m c2_ax = tg_a2 + c2_a # Hauteur tonale en arrivée signée c2_mx = c2_m + tg_m2 c4_a = cx_ - tg_a1 # Valeur tonale (tg_a1 = maj) c4_m = cx_ - tg_m1 # c2_ax | mx : Altération Hauteur if c2_ax >= 0: # Table des altérations utiles c2_a1 = self.nordiese[c2_ax] coltyp1 = 'green' else: c2_a1 = self.subemol[c2_ax] coltyp1 = 'green' if c2_mx >= 0: c2_m1 = self.nordiese[c2_mx] coltyp2 = 'orange' else: c2_m1 = self.subemol[c2_mx] coltyp2 = 'orange' # c4_a | m : Altération Valeur if c4_a >= 0: c4_a1 = self.nordiese[c4_a] else: c4_a1 = self.subemol[c4_a] if c4_m >= 0: c4_m1 = self.nordiese[c4_m] else: c4_m1 = self.subemol[c4_m] cn_ +=1 ; chposx += 1 c2_ = c2_a1 c3_ = c3_a c4_ = c4_a1 c5_ = c2_m1 c6_ = c3_m c7_ = c4_m1 chposya = c4_a ; chposym = c4_m xb_=xcpos_+(chposx*30) yb1_=ycpos_-(chposya*30) chvow_a = c3_,c2_ chrcan.create_oval(xb_-rb_,yb1_-rb_,xb_+rb_,yb1_+rb_,fill=coltyp1) chrcan.create_text(xb_,yb1_,text=chvow_a,font='bold',fill='white') yb2_=ycpos_-(chposym*30) chvow_m = c6_,c5_ chrcan.create_oval(xb_-rb_,yb2_-rb_,xb_+rb_,yb2_+rb_,fill=coltyp2) chrcan.create_text(xb_,yb2_,text=chvow_m,font='bold',fill='white') self.chrgen[(cx_)] = [cz_],[c1_],[c2_],[c3_],[c4_],[c5_],[c6_],[c7_] cz_ += chr_lepas #print(self.chrgen[(cx_)]) # Génération analogique du tableau chromatique #chrcan = Canvas(height=300,width=600) chvow = 'Gamme chromatique :', chrselect chrcan.create_line(5, 15, 5, 5, fill ='black') chrcan.create_text(120,10,text=chvow,fill='red') del(chr_trans[:]) # Remise à zéro diatonique(int) def actuac(self,a): if a == 5: # def accord/Bouton fermer self.acc.destroy() self.presens[0]=0 elif a == 3: # def accord/Bouton actualiser self.acc.destroy() self.presens[0]=0 self.btaud2.invoke() self.btacc.invoke() elif a == 1: # def audio/Bouton audio self.presaudio = 0 self.btaud2.invoke() elif a == 2: self.btchr.configure(text= 'Chrome naturel') # def chrome/Bouton C_n self.chm.destroy() self.btchr.invoke() elif a == 4: self.btchr.configure(text= 'Chrome atonal') # def chrome/Bouton C_a self.chm.destroy() self.btchr.invoke() elif a == 6: pass # def tabla/Bouton piano elif a == 7: pass # def tabla/Bouton guitare def wavacc(self,w): nbOctet = nbCanal = 1 fech = 64000 niveau = float(1) duree = float(1/2) nbEch = int(duree*fech) waplo = self.fichacc[w] monac = wave.open(waplo,'wb') param = (nbCanal,nbOctet,fech,nbEch,'NONE','not compressed') monac.setparams(param) amp = 127.5*niveau vacc = [0,0,0,0] vacc_oct = 0 ww = w for vv in range(4): if ww == 7: ww = 0 vacc[vv] = self.framno[ww]*2 vacc_oct = 1 elif ww == 8: ww = 1 vacc[vv] = self.framno[ww]*2 vacc_oct = 1 if vacc_oct == 0: vacc[vv] = self.framno[ww] else: vacc[vv] = self.framno[ww]*2 ww +=2 freq1 = vacc[0]*2 freq2 = vacc[1]*2 freq3 = vacc[2]*2 freq4 = vacc[3]*2 for i in range(0,nbEch): val1 = wave.struct.pack('B',int(128.0 + amp*math.sin(2.0*math.pi*freq1*i/fech))) val2 = wave.struct.pack('B',int(128.0 + amp*math.sin(2.0*math.pi*freq2*i/fech))) val3 = wave.struct.pack('B',int(128.0 + amp*math.sin(2.0*math.pi*freq3*i/fech))) val4 = wave.struct.pack('B',int(128.0 + amp*math.sin(2.0*math.pi*freq4*i/fech))) monac.writeframes(val1+val2+val3+val4) monac.close() accwav = self.fichacc[w] winsound.PlaySound(accwav,winsound.SND_FILENAME) # Windsound : Ne peut être utilisé qu'avec windows # L'harmonie des accords def accord(self): if self.presens[0] == 1: self.acc.destroy() self.presens[0]=0 self.btaud2.invoke() self.btacc.invoke() else: self.acc = Toplevel(self) self.acc.title('Entité Gammique : Harmonie') self.presens[0]=1 if self.presaudio == 0: self.presaudio = 1 self.btaud2.invoke() # Définition du style d'écriture fotyp = Font(family='Liberation Serif', size=12) fofin = Font(family='Liberation Serif', size=8) fonot = Font(family='Liberation Serif', size=14) # Fenêtrage des widgets fra = Frame(self.acc,width=100,height=50) fra.pack(side=BOTTOM) fraleft = Frame(self.acc,width=30,height=30) fraleft.pack(side=LEFT) fraright = Frame(self.acc,width=30,height=30) fraright.pack(side=RIGHT) # Les accords 1357 de la gamme en cours (partie gauche(left)) self.bt1357 = Button(fra,text ='Actualiser',width=20,command=lambda: self.actuac(3)) self.bt1357.pack(side=LEFT) lableft = Label(fraleft, text ='Accords 1357', fg = 'red').pack() btaccleft = ['','','','','','',''] for i in range(7): btaccleft[i] = Button(fraleft,text='',bg='light blue',width=10, command = lambda w=i: self.wavacc (w)) btaccleft[i].pack() # Les autres accords de la gamme en cours (partie droite(right)) btferm = Button(fra,text ='Fermer',width=20,bg ='light grey', command = lambda: self.actuac(5)) btferm.pack(side=RIGHT) labrigh = Label(fraright, text ='Autre accord', fg = 'blue').pack() btautq = Button(fraright,text ='inactif',bg='light blue',width=10).pack() # L'espace blanc central pour écrire l'accord caaacc = Canvas(self.acc,bg='white', height=300,width=300) caaacc.pack() caaacc.delete(ALL) # Types d'accords 1357 : chr(248) = ( ø ) # Majeur_7ème(maj7). Mineur_7ème(7). Demi-diminué_7ème(ø7). Diminué_7ème(°7) accmaj7 = [0,0,0,0] ; acc7 = [0,0,0,-1] accdd7 = [0,-1,-1,-1] ; accd7 = [0,-1,-1,-2] tbtxgd = ['1','3','5','7'] tbacc7 = [] # Tableau de l'accord forme(str) tbsign = [] # Tableau de l'accord forme(int) tbfine = [] # Tableau des accords forme fine tbgene = [] # Tableau des accords forme écriture tblect = [] # Tableau des accords forme lecture # self.decore[] = altération et note tonique de l'accord xcc, ycc = 120, 80 ; xtt = 20 ypos = 26 ; xdd = ydd = 0 for decdegre in range(7): accnote = self.decore[decdegre][1:] accsign = self.decore[decdegre][:1] # self.declare[] = altérations "3.5.7" en rang decnote = 1 t_fin = 0 ; txga = txdr = '' ydd = ycc+(ypos*decdegre) xdd = xcc + 30 xgg = xcc - 30 while decnote < 8: # Définition de l'accord modal(str) decalt = self.declare[(decdegre,decnote)] tbacc7.append(decalt) decnote += 2 # Transcodage de l'accord de type original(str) for a_ in range(4): z_ = -1 a_acc = tbacc7[a_] for b_ in range(7): # Lecture et transformation if a_acc == '': b_alt = 0 tbsign.append(b_alt) break if a_acc == self.accdiese[b_]: b_alt = b_ tbsign.append(b_alt) break if a_acc == self.accbemol[z_]: b_alt = z_ tbsign.append(b_alt) break z_ += -1 # Définition des accords de 7ème if tbsign[3] == 0: # L'accord est majeur 7(maj7) typacc = 'maj7' finacc = tbsign for t_ in range(4): txsg = '' ; zone = 0 if accmaj7[t_] == tbsign[t_]: t_fin = 0 else: t_fin = tbsign[t_]-accmaj7[t_] if t_ == 1 and t_fin != 0: if t_fin < -1: # Zone de droite txsg = self.accbemol[t_fin]+tbtxgd[t_] zone = 1 elif t_fin > -1 : # Zone de droite txsg = self.accdiese[t_fin]+tbtxgd[t_] zone = 1 else: # Zone de gauche txsg = self.accbemol[t_fin] zone = -1 if t_ == 2 and t_fin != 0: if t_fin < 0: # Zone de droite txsg = self.accbemol[t_fin]+tbtxgd[t_] zone = 1 elif t_fin > 2: # Zone de droite txsg = self.accdiese[t_fin]+tbtxgd[t_] zone = 1 else: # Zone de gauche txsg = self.accdiese[t_fin] zone = -1 if t_ == 3 and t_fin != 0: # Zone de droite txsg = self.accbemol[t_fin]+tbtxgd[t_] zone = 1 if zone == 1: # Zone de droite txdr += txsg caaacc.create_text(xdd,ydd,text=txsg,font=fofin,fill='blue') xdd += 20 if zone == -1: # Zone de gauche txga += txsg caaacc.create_text(xgg,ydd,text=txsg,font=fofin,fill='blue') xgg -= 20 tbfine.append(t_fin) txbadr = txga + 'maj7' + txdr btaccleft[decdegre].configure(text = txbadr) caaacc.create_text(xcc,ydd,text='maj7',font=fotyp,fill='black') caaacc.create_text(xtt,ydd,text=accsign,font=fofin,fill='blue') caaacc.create_text(xtt+20,ydd,text=accnote,font=fonot,fill='black') if (tbsign[3] == -1): if (tbsign[1] or tbsign[2] >= 0) or ((tbsign[1] or tbsign[2]) < 0): if tbsign[1] and tbsign[2] < 0: pass else : # L'accord est demi-diminué 7(7) typacc = '7' finacc = tbsign for t_ in range(4): txsg = '' ; zone = 0 if acc7[t_] == tbsign[t_]: t_fin = 0 else: t_fin = tbsign[t_]-acc7[t_] if t_ == 1 and t_fin != 0: if t_fin < -1: # Zone de droite txsg = self.accbemol[t_fin]+tbtxgd[t_] zone = 1 elif t_fin > -1 : # Zone de droite txsg = self.accdiese[t_fin]+tbtxgd[t_] zone = 1 else: # Zone de gauche txsg = self.accbemol[t_fin] zone = -1 if t_ == 2 and t_fin != 0: if t_fin < 0: # Zone de droite txsg = self.accbemol[t_fin]+tbtxgd[t_] zone = 1 elif t_fin > 2: # Zone de droite txsg = self.accdiese[t_fin]+tbtxgd[t_] zone = 1 else: # Zone de gauche txsg = self.accdiese[t_fin] zone = -1 if t_ == 3 and t_fin != 0: # Zone de droite txsg = self.accbemol[t_fin]+tbtxgd[t_] zone = 1 if zone == 1: # Zone de droite txdr += txsg caaacc.create_text(xdd,ydd,text=txsg,font=fofin,fill='blue') xdd += 20 if zone == -1: # Zone de gauche txga += txsg caaacc.create_text(xgg,ydd,text=txsg,font=fofin,fill='blue') xgg -= 20 tbfine.append(t_fin) txbadr = txga + '7' + txdr btaccleft[decdegre].configure(text = txbadr) caaacc.create_text(xcc,ydd,text='7',font=fotyp,fill='black') caaacc.create_text(xtt,ydd,text=accsign,font=fofin,fill='blue') caaacc.create_text(xtt+20,ydd,text=accnote,font=fonot,fill='black') if (tbsign[3] == -1) and (tbsign[1] and tbsign[2] < 0): # L'accord est demi-diminué 7(ø7) typacc = 'ø7' finacc = tbsign for t_ in range(4): txsg = '' ; zone = 0 if accdd7[t_] == tbsign[t_]: t_fin = 0 else: t_fin = tbsign[t_]-accdd7[t_] if t_ == 1 and t_fin != 0: if t_fin < -1: # Zone de droite txsg = self.accbemol[t_fin]+tbtxgd[t_] zone = 1 elif t_fin > -1 : # Zone de droite txsg = self.accdiese[t_fin]+tbtxgd[t_] zone = 1 else: # Zone de gauche txsg = self.accbemol[t_fin] zone = -1 if t_ == 2 and t_fin != 0: if t_fin < 0: # Zone de droite txsg = self.accbemol[t_fin]+tbtxgd[t_] zone = 1 elif t_fin > 2: # Zone de droite txsg = self.accdiese[t_fin]+tbtxgd[t_] zone = 1 else: # Zone de gauche txsg = self.accdiese[t_fin] zone = -1 if t_ == 3 and t_fin != 0: # Zone de droite txsg = self.accbemol[t_fin]+tbtxgd[t_] zone = 1 if zone == 1: # Zone de droite txdr += txsg caaacc.create_text(xdd,ydd,text=txsg,font=fofin,fill='blue') xdd += 20 if zone == -1: # Zone de gauche txga += txsg caaacc.create_text(xgg,ydd,text=txsg,font=fofin,fill='blue') xgg -= 20 tbfine.append(t_fin) txbadr = txga + 'ø7' + txdr btaccleft[decdegre].configure(text = txbadr) caaacc.create_text(xcc,ydd,text='ø7',font=fotyp,fill='black') caaacc.create_text(xtt,ydd,text=accsign,font=fofin,fill='blue') caaacc.create_text(xtt+20,ydd,text=accnote,font=fonot,fill='black') if tbsign[3] < -1: # L'accord est diminué 7(°7) typacc = '°7' finacc = tbsign for t_ in range(4): txsg = '' ; zone = 0 if accd7[t_] == tbsign[t_]: t_fin = 0 else: t_fin = tbsign[t_]-accd7[t_] if t_ == 1 and t_fin != 0: if t_fin < -1: # Zone de droite txsg = self.accbemol[t_fin]+tbtxgd[t_] zone = 1 elif t_fin > -1 : # Zone de droite txsg = self.accdiese[t_fin]+tbtxgd[t_] zone = 1 else: # Zone de gauche txsg = self.accbemol[t_fin] zone = -1 if t_ == 2 and t_fin != 0: if t_fin < 0: # Zone de droite txsg = self.accbemol[t_fin]+tbtxgd[t_] zone = 1 elif t_fin > 2: # Zone de droite txsg = self.accdiese[t_fin]+tbtxgd[t_] zone = 1 else: # Zone de gauche txsg = self.accdiese[t_fin] zone = -1 if t_ == 3 and t_fin != 0: # Zone de droite txsg = self.accbemol[t_fin]+tbtxgd[t_] zone = 1 xdd += 20 if zone == -1: # Zone de gauche txga += txsg caaacc.create_text(xgg,ydd,text=txsg,font=fofin,fill='blue') xgg -= 20 tbfine.append(t_fin) txbadr = txga + '°7' + txdr btaccleft[decdegre].configure(text = txbadr) caaacc.create_text(xcc,ydd,text='°7',font=fotyp,fill='black') caaacc.create_text(xtt,ydd,text=accsign,font=fofin,fill='blue') caaacc.create_text(xtt+20,ydd,text=accnote,font=fonot,fill='black') tblect.append(tbsign[:4]) tbgene.append(tbfine[:4]) del(tbsign[:]) # Remise à zéro de l'accord(int) del(tbacc7[:]) # Remise à zéro de l'accord(str) del(tbfine[:]) # Remise à zéro de l'accord écriture del(tblect[:]) # Remise à zéro forme lecture del(tbgene[:]) # Remise à zéro forme écriture # Premiers pixels acoustiques def radio(self): ay = '0' ayay = self.tbdegre[0] for n in range(7): freqhtz=self.tablenotes[ayay] if ay == '0': pass else: freqhtz += 120 ayay += 1 if ayay > 6: ayay = 0 ay = '1' duration=240 winsound.Beep(freqhtz, duration) # Premières notes acoustiques def audio(self): LA440 = 440 ; la2 = LA440/2 ; ula = 220/12 fabula = ['A','_','B','C','_','D','_','E','F','_','G','_','A'] # FC # Fréquences cursives (pixels) notula = [] ; modula = [] for az in range(7): # Construction tableau FC notula.append(self.tablenotes[az]) mula = notula[az]/10-25 # Transition vers l'indice modula.append(mula) # Indice du tableau "sequla[]" # TM # Tableau majeur tabula = [] for ai in range(13): # Construction tableau TM paula=ai*ula+la2 # Calcul fréquence tabula.append(paula) # Tableau en écriture TM # TF # Table des fréquences (1/12) sequla = [] ; nomula = [] for ay in range(40): # Construction tableau TF if ay < 12: # Niveau -1: Octave basse yula = tabula[ay]/2 # yula: TM/2 nula = fabula[ay] # nula: Notes naturelles elif 11 < ay < 24: # Niveau 0: Octave naturelle yula = tabula[ay-12] # yula: Déviation de l'indice(ay) nula = fabula[ay-12] elif 23 < ay < 37: # Niveau 1: Octave haute yula = tabula[ay-24]*2 # yula: Déviation de l'indice(ay)+TM*2 nula = fabula[ay-24] elif 36 < ay < 41: # Niveau 2: Octave relative yula = tabula[ay-36]*4 # yula: Déviation de l'indice(ay)+TM*4 nula = fabula[ay-36] sequla.append(yula) # Tableau en écriture TF nomula.append(nula) # Tableau en écriture TF # TR # Tableau des résultats (fréquences cursives) freula = [] for ax in range(7): # Construction tableau TR xula = int(modula[ax]) # xula: Lecture indice-entier FC qula = sequla[xula] # qula: Lecture de fréquence TF freula.append(qula) # Tableau en écriture TR aw2 = self.tbdegre[0] diato = [] ; opoto = [] ax = '0' for aw in range(7): # Construction tableau TR-tonique freqhtz = freula[aw2] if ax == '0': diato.append(freqhtz) else: diato.append(freqhtz*2) opoto.append(self.gamula[aw2]) aw2 += 1 if aw2 > 6: aw2 = 0 ax = '1' # Partie échantillonnage nbOctet = nbCanal = 1 fech = 64000 niveau = float(1/2) duree = float(1/6) nbEch = int(duree*fech) for fy in range(7): toplo = self.fichnom[fy] manote = wave.open(toplo,'wb') param = (nbCanal,nbOctet,fech,nbEch,'NONE','not compressed') manote.setparams(param) freq = diato[fy] self.framno[fy] = freq amp = 127.5*niveau for i in range(0,nbEch): val = wave.struct.pack('B',int(128.0 + amp*math.sin(2.0*math.pi*freq*i/fech))) manote.writeframes(val) manote.close() if self.presaudio == 0: self.presaudio = 1 for fu in self.fichnom: winsound.PlaySound(fu,winsound.SND_FILENAME) # Windsound : Ne peut être utilisé qu'avec windows del(modula[:]) ; del(tabula[:]) ; del(sequla[:]) del(nomula[:]) ; del(freula[:]) ; del(diato[:]) # audio() # Les octaves du groupe RADIO def yoiioiioy(self): xradfan=self.entfan.get() xrad=self.variable.get() mqdo=self.sca[0].get() mqsi=self.sca[6].get() yo=yoc=yod=yoe=yof=yog=yoa=yob=0 fyoc=fyod=fyoe=fyof=fyog=fyoa=fyob=0 tyoc=tyod=tyoe=tyof=tyog=tyoa=tyob=0 topgam=[yoc,yod,yoe,yof,yog,yoa,yob] topform=[fyoc,fyod,fyoe,fyof,fyog,fyoa,fyob] topto=[tyoc,tyod,tyoe,tyof,tyog,tyoa,tyob] while yo < 7: yioiy=yotop=topf=topt=0 yotop=topgam[yo]=self.sca[yo].get() topf=topform[yo]=self.sca[yo].cget("from") topt=topto[yo]=self.sca[yo].cget("to") if xradfan == "IOI": if xrad == "YOI": if (mqdo>-1)and(mqsi<1): yioiy=yotop else: yioiy=yotop+12 topf=topf+12 topt=topt+12 elif xrad == "IOY": if (mqdo>-1)and(mqsi<1): yioiy= yotop else : yioiy=yotop-12 topf=topf-12 topt=topt-12 else : yioiy = yotop elif xradfan == "YOI": if xrad == "IOI": if (mqdo>-1)and(mqsi<1): yioiy= yotop else : yioiy=yotop-12 topf=topf-12 topt=topt-12 elif xrad == "IOY": if (mqdo>-1)and(mqsi<1): yioiy= yotop else : yioiy=yotop-24 topf=topf-24 topt=topt-24 else : yioiy=yotop else : if xrad == "YOI": if (mqdo>-1)and(mqsi<1): yioiy= yotop else : yioiy=yotop+24 topf=topf+24 topt=topt+24 elif xrad == "IOI": if (mqdo>-1)and(mqsi<1): yioiy= yotop else : yioiy=yotop+12 topf=topf+12 topt=topt+12 else : yioiy=yotop if yo == 0: mqdo1 = yioiy if yo == 6: mqsi1 = yioiy self.sca[yo].configure(from_ = topf, to = topt) self.sca[yo].set(yioiy) yo+=1 # while yo if xrad == "YOI": self.sca[7].configure(from_ = 0-mqdo1, to = 24-mqsi1) elif xrad == "IOI": self.sca[7].configure(from_ = -12-mqdo1, to = 12-mqsi1) elif xrad == "IOY": self.sca[7].configure(from_ = -24-mqdo1, to = 0-mqsi1) xradfan=xrad self.entfan.delete(0,END) self.entfan.insert(END,xradfan) self.btgama.invoke() # print ('*') # yoiioiioy() # Moment self.gama def momentgama(self,event): self.btgama.invoke() # Définition des curseurs def scanote1(self,xc): do=int(xc) xsi=self.sca[6].get() xre=self.sca[1].get() if doxre+1 :self.sca[1].set(do-1) # Initialise sca[7](from_) xxrad=self.variable.get() if xxrad == "YOI": self.sca[7].configure(from_ = 0-do, to = 24-xsi) elif xxrad == "IOI": self.sca[7].configure(from_ = -12-do, to = 12-xsi) elif xxrad == "IOY": self.sca[7].configure(from_ = -24-do, to = 0-xsi) self.bind('',self.momentgama) # scanote1() def scanote2(self,xd): re=int(xd) xdo=self.sca[0].get() xmi=self.sca[2].get() if rexmi+1 :self.sca[2].set(re-1) # scanote2() def scanote3(self,xe): mi=int(xe) xre=self.sca[1].get() xfa=self.sca[3].get() if mixfa:self.sca[3].set(mi) # scanote3() def scanote4(self,xf): fa=int(xf) xmi=self.sca[2].get() xsol=self.sca[4].get() if faxsol+1:self.sca[4].set(fa-1) # scanote4() def scanote5(self,xg): sol=int(xg) xfa=self.sca[3].get() xla=self.sca[5].get() if solxla+1:self.sca[5].set(sol-1) # scanote5() def scanote6(self,xa): la=int(xa) xsol=self.sca[4].get() xsi=self.sca[6].get() if laxsi+1:self.sca[6].set(la-1) # scanote6() def scanote7(self,xb): si=int(xb) xla=self.sca[5].get() xdo=self.sca[0].get() if sixdo:self.sca[0].set(si) # Initialise sca[7](from_) xxxrad=self.variable.get() if xxxrad == "YOI": self.sca[7].configure(from_ = 0-xdo, to = 24-si) elif xxxrad == "IOI": self.sca[7].configure(from_ = -12-xdo, to = 12-si) elif xxxrad == "IOY": self.sca[7].configure(from_ = -24-xdo, to = 0-si) # scanote7() def scanote8(self,xh): sch=int(xh) f_t=0 xsi=self.sca[6].get() tosi=t_si=self.sca[6].cget("to") if (xsi+sch > t_si):f_t=-1 xdo=self.sca[0].get() fromdo=f_do=self.sca[0].cget("from") todo=t_do=self.sca[0].cget("to") if (xdo+sch t_si)or(f_t==-1): fromsi = f_si+sch tosi = t_si+sch f_t=-1 self.sca[0].configure(from_ = fromdo, to = todo) self.sca[0].set(xdo+sch) self.sca[1].configure(from_ = fromre, to = tore) self.sca[1].set(xre+sch) self.sca[2].configure(from_ = frommi, to = tomi) self.sca[2].set(xmi+sch) self.sca[3].configure(from_ = fromfa, to = tofa) self.sca[3].set(xfa+sch) self.sca[4].configure(from_ = fromsol, to = tosol) self.sca[4].set(xsol+sch) self.sca[5].configure(from_ = fromla, to = tola) self.sca[5].set(xla+sch) self.sca[6].configure(from_ = fromsi, to = tosi) self.sca[6].set(xsi+sch) self.btgama.invoke() # scanote8() def zero(self): fnotes=[0,-1,-2,-2,-3,-4,-5] tnotes=[+5,+4,+3,+3,+2,+1,0] for z in range(7): self.sca[z].configure(from_ = fnotes[z], to = tnotes[z]) self.sca[z].set(0) self.sca[7].configure(from_ = -12, to = 12) self.sca[7].set(0) self.rad[1].invoke() # Remise à l'octave zéro ou "ioi" self.btgama.invoke() # zero() def gama(self): self.decore = {} # Remise au zéro tonique des accords self.can.delete(ALL) # Tracé d'encadrement # Données de l'encadré : Axes(x,y)=365(x),220(y) self.can.create_line(10, 450, 740, 450, fill ='blue') self.can.create_line(390, 220, 520, 220, fill ='green') self.can.create_line(270, 340, 400, 340, fill ='red') self.can.create_line(510, 100, 640, 100, fill ='blue') # De la table gammique aux tables diatoniques surnommées gammes =[[1,1,0,1,1,1,0],[0,2,0,1,1,1,0],[2,0,0,1,1,1,0],[4,0,0,0,0,1,0],[1,0,1,1,1,1,0],[0,1,1,1,1,1,0], [1,0,3,0,0,1,0],[1,2,1,0,0,1,0],[2,2,0,0,0,1,0],[0,0,1,2,1,1,0],[1,3,0,0,0,1,0],[0,0,2,1,1,1,0], [1,2,2,0,0,0,0],[0,0,4,0,0,1,0],[1,4,0,0,0,0,0],[1,0,0,2,1,1,0],[0,1,0,2,1,1,0],[1,1,3,0,0,0,0], [0,0,0,3,1,1,0],[1,1,0,0,2,1,0],[0,2,0,0,2,1,0],[0,2,0,2,0,1,0],[2,0,0,0,2,1,0],[1,0,1,0,2,1,0], [1,0,1,2,0,1,0],[1,1,1,2,0,0,0],[2,0,0,3,0,0,0],[0,0,2,0,2,1,0],[1,2,0,2,0,0,0],[1,0,0,3,0,1,0], [1,0,0,1,2,1,0],[1,1,0,3,0,0,0],[1,1,2,1,0,0,0],[0,1,0,0,3,1,0],[0,0,1,0,3,1,0],[0,0,0,1,3,1,0], [0,0,0,2,2,1,0],[1,0,0,0,3,1,0],[0,0,2,2,0,1,0],[0,0,0,0,4,1,0],[0,0,2,3,0,0,0],[1,0,0,4,0,0,0], [0,0,0,5,0,0,0],[1,1,0,1,0,2,0],[1,1,0,1,2,0,0],[0,2,0,1,0,2,0],[0,2,0,1,2,0,0],[2,0,0,1,0,2,0], [2,0,0,1,2,0,0],[1,0,1,1,0,2,0],[1,0,1,1,2,0,0],[1,1,0,0,1,2,0],[1,1,0,0,3,0,0],[1,1,0,2,1,0,0], [1,1,2,0,1,0,0],[0,2,0,0,0,3,0],[1,0,0,2,2,0,0],[1,0,0,1,0,3,0],[1,3,0,0,1,0,0],[1,0,0,0,1,3,0], [0,0,0,3,0,2,0],[0,0,2,1,2,0,0],[1,0,0,0,0,4,0],[0,0,0,3,2,0,0],[1,1,0,0,0,3,0],[3,0,0,0,0,2,0]] self.gammescopie = gammes # Tonice(0). Tonale(1:3). Mélode(4:14). Médiane(15:18). Domine(19:42). Harmone(43:65) gamnoms =['0','-2','+2','^2','-3','-23','-34x','+34','+23x','-34','x3','°3','+34x','°34x','^3', '-4','-24','^4','°4','-5','-25','-25+','+25-','-35','-35+','+45x','+25x','°35-','+35x', '-45+','-45','x5','x45+','-25°','-35°','-45°','°45-','°5','°35+','*5','°35x','-45x', '°45x','-6','+6','-26','-26+','+26-','+26','-36','-36+','-56','-56+','+56','x46+', '-26°','-46+','-46°','x36+','-56°','°46-','°36+','*6','°46+','°6','x26-'] self.gamnomscopie = gamnoms # Récupération des notes cursives xxx=0 xxrad0=self.variable.get() if xxrad0 == "YOI": xxx=+120 elif xxrad0 == "IOI": xxx=0 elif xxrad0 == "IOY": xxx=-120 ydo=self.sca[0].get() xcpos_=400-xxx ycpos_=220+xxx xc_=xcpos_+(ydo*10) yc_=ycpos_-(ydo*10) rc_=5 self.tablenotes[0]=xc_ self.tablehaute[0]=yc_ self.can.create_line(xc_, 350, xc_, 40, fill ='black') self.can.create_oval(xc_-rc_,yc_-rc_,xc_+rc_,yc_+rc_,fill='black') yre=self.sca[1].get() xcpos_=420-xxx ycpos_=220+xxx xd_=xcpos_+(yre*10) yd_=ycpos_-(yre*10) rd_=5 self.tablenotes[1]=xd_ self.tablehaute[1]=yd_ self.can.create_line(xd_, 360, xd_, 50, fill ='green') self.can.create_oval(xd_-rd_,yd_-rd_,xd_+rd_,yd_+rd_,fill='green') ymi=self.sca[2].get() xcpos_=440-xxx ycpos_=220+xxx xe_=xcpos_+(ymi*10) ye_=ycpos_-(ymi*10) re_=5 self.tablenotes[2]=xe_ self.tablehaute[2]=ye_ self.can.create_line(xe_, 370, xe_, 60, fill ='blue') self.can.create_oval(xe_-re_,ye_-re_,xe_+re_,ye_+re_,fill='blue') yfa=self.sca[3].get() xcpos_=450-xxx ycpos_=220+xxx xf_=xcpos_+(yfa*10) yf_=ycpos_-(yfa*10) rf_=5 self.tablenotes[3]=xf_ self.tablehaute[3]=yf_ self.can.create_line(xf_, 370, xf_, 60, fill ='grey') self.can.create_oval(xf_-rf_,yf_-rf_,xf_+rf_,yf_+rf_,fill='grey') ysol=self.sca[4].get() xcpos_=470-xxx ycpos_=220+xxx xg_=xcpos_+(ysol*10) yg_=ycpos_-(ysol*10) rg_=5 self.tablenotes[4]=xg_ self.tablehaute[4]=yg_ self.can.create_line(xg_, 380, xg_, 70, fill ='red') self.can.create_oval(xg_-rg_,yg_-rg_,xg_+rg_,yg_+rg_,fill='red') yla=self.sca[5].get() xcpos_=490-xxx ycpos_=220+xxx xa_=xcpos_+(yla*10) ya_=ycpos_-(yla*10) ra_=5 self.tablenotes[5]=xa_ self.tablehaute[5]=ya_ self.can.create_line(xa_, 390, xa_, 80, fill ='orange') self.can.create_oval(xa_-ra_,ya_-ra_,xa_+ra_,ya_+ra_,fill='orange') ysi=self.sca[6].get() xcpos_=510-xxx ycpos_=220+xxx xb_=xcpos_+(ysi*10) yb_=ycpos_-(ysi*10) rb_=5 self.tablenotes[6]=xb_ self.tablehaute[6]=yb_ self.can.create_line(xb_, 400, xb_, 90, fill ='yellow') self.can.create_oval(xb_-rb_,yb_-rb_,xb_+rb_,yb_+rb_,fill='yellow') # Mesure de l'intervalle tempéré c1=(yre+1)-ydo d2=(ymi+1)-yre e3=yfa-ymi f4=(ysol+1)-yfa g5=(yla+1)-ysol a6=(ysi+1)-yla b7=i=cum_diat=ok=x=0 diata=[c1,d2,e3,f4,g5,a6,b7] while i < 6: cum_diat += diata[i] i+=1 # while i diata[i]=5-cum_diat # Recherche diatonique par l'itération cc1=dd2=ee3=ff4=gg5=aa6=bb7=0 diata2=[cc1,dd2,ee3,ff4,gg5,aa6,bb7] while x < 7: m=x y=0 while y < 7: diata2[y]=diata[m] y+=1 m+=1 if m > 6: m=0 # while myx=myx2=0 for my in gammes: if diata2 == my: degre=x myx2=myx x=7 # if diata2 myx+=1 # for my x+=1 # while x # Ici : diata(original cursif).degre(tonique).my(gamme) # Définition diatonique # GMAJ= gammes[0] gmaj = [1,1,0,1,1,1,0] # Forme majeure simplifiée # GNAT= Ordre cursif comme diata[] gnat = ['C','D','E','F','G','A','B'] # Forme alphabétique cnat = ['','','','','','',''] # Niveaux d'altérations self.nordiese = ['','+','x','^','+^','x^','^^','+^^','x^^','^^^','+^^^','x^^^','^^^^','13(#)','14(#)','15(#)', '16(#)','17(#)','18(#)','19(#)','20(#)','21(#)','22(#)','23(#)','24(#)', '25(#)','26(#)','27(#)','28(#)','29(#)','30(#)','31(#)','32(#)'] self.subemol = ['','32(b)','31(b)','30(b)','29(b)','28(b)','27(b)','26(b)','25(b)','24(b)','23(b)','22(b)', '21(b)','20(b)','19(b)','18(b)','17(b)','16(b)','15(b)','14(b)','13(b)', '****','°***','-***','***','°**','-**','**','°*','-*','*','°','-'] # Configuration modale gdeg = ['I','II','III','IV','V','VI','VII'] # Définition du style d'écriture font = Font(family='Liberation Serif', size=9) font2 = Font(family='Liberation Serif', size=12) # Définition des notes cursives self.cursifs=[ydo,yre,ymi,yfa,ysol,yla,ysi] ynat=ymod=0 for ycurs in self.cursifs: if ycurs > 0 : ymod=self.nordiese[ycurs] ycurs2 = ycurs if ycurs < 0 : ymod=self.subemol[ycurs] ycurs2 = ycurs if ycurs == 0 : ymod=self.subemol[ycurs] ycurs2 = ycurs cnat[ynat]=ymod ynat+=1 # for ycurs # Une tournée produit une tonalité modale de 7 notes nat2=degre deg = nom = 0 ynote = xgdeg = 30 ytone = 50 while deg < 7 : nat = deg # Degré tonal en question cri = gimj = gmod = maj = 0 xdeg = 80 text0 = gdeg[deg] self.can.create_text(xgdeg+25,ynote+10,text=text0, font='bold',fill='black') while maj < 7 : # Tonalité modale du degré gmj = gmaj[maj] # Forme majeure (1101110) imaj = diata2[nat] # Forme modale (DIATA[DEGRE]) ynt = cnat[nat2] # Forme altérative des notes gnt = gnat[nat2] # Forme tonale (CDEFGAB) ideg = gdeg[deg] cri = cri + gimj # Tonalité cumulée gimj = imaj - gmj # Calcul tonal PAS/PAS cmod = gmod = cri if maj == 0: yntgnt = ynt, gnt self.decore[deg] = yntgnt if gmod > 0 : # Forme altérative des tonalités imod = self.nordiese[cmod] cmod2 = cmod if gmod < 0 : imod = self.subemol[cmod] cmod2 = cmod if gmod == 0 : imod = self.subemol[cmod] cmod2 = cmod gmod = gmod + cri # Transition tonale # Construction du nom de la gamme if nom == 0 : ynom = ynt gnom = gnt tnom=gnom,gamnoms[myx2] self.can.create_text(28,10,text=ynom,font=font,fill='red') self.can.create_text(28,25,text=tnom,font=font2,fill='black') # if nom nat+=1 nat2+=1 if nat > 6 : nat = 0 if nat2 > 6 : nat2 = 0 maj = maj + 1 text1= gnt text2=[imod,maj] self.can.create_text(xdeg,ynote-12,text=ynt,font=font,fill='red') self.can.create_text(xdeg,ynote,text=text1) self.can.create_text(xdeg,ytone,text=text2,fill='blue') xdeg+=30 nom=1 self.declare[(deg,maj)] = imod self.dechire[(deg,maj)] = cmod2 #print(deg,maj,self.dechire[(deg,maj)]) # while maj ynote+=60 ytone+=60 nat2+=1 if nat2 > 6 : nat2 = 0 deg = deg + 1 # while deg self.tbdegre[0]=degre # gamma() # class Gammique Gammique().mainloop()