Le module pygame et la lecture des fichiers .wav

On connait les fonctions winsound et playsound pour lire les .wav

On les a utilisé pour construire l'application key.txt du clavier sonore

Fichier key.txt du clavier sonore

Les applications winsound et playsound ne permettent pas de mixer les sons.

De plus, le module winsound ne fonctionne pas dans tous les environnements de python.

C'est pourquoi on a utilisé le module pygame pour créer les applications playnote, playtabla et playaccord.

L'application keymixer.txt

keymixer.txt ressemble au clavier sonore key.txt, mais il permet de plaquer et d'arpéger les accords constitutifs des tonalités majeures, mineurs harmoniques et mineurs mélodiques dans toutes les tonalités.

Fichier keymixer.txt

Pour exécuter le code keymixer.txt sur votre PC, vous devez installer les modules keyboard, playsound et pygame avec pip install

Vous devez aussi copier le fichier moduleabc.txt dans le même répertoire que le fichier keymixer.txt et le renommer moduleabc.py

moduleabc.txt

Enfin, vous placerez dans ce répertoire le sous répertoire de nom wav dans lequel vous aurez décompressé le fichier notes.zip des .wav des notes de 2 gammes chromatiques.

Fichier notes.zip

Vous lancerez l'application par python keymixer.txt

Fonctionnement du clavier sonore keymixer.txt

Par défaut, le ton est celui de Do et le mode est le mode majeur.

La touche "=" permet de choisir le volume sonore des sons des touches

La touche "!" permet de choisir un mode parmi les modes maj, harm et mel.

Les touches 0 1 2 3 4 5 6 7 8 9 * - transposent la tonalité de la tonalité courante de 0 1 2 3...demi-tons.

On les trouve sur le pavé numérique ou sur la ligne en haut du clavier.

La ligne au bas du clavier contient une octave de la tonalité courante.

La ligne a z e r t y u contient les arpèges des accords constitutifs de la tonalité courante.

La ligne q s d f g h j k contient les accords constitutifs plaqués.

Les touches de fonctions F1 F2...F12 contiennent les 12 notes de la gamme chromatique courante.

la touche ":" permet de lire le nom de la notes de la touche du piano qui vient d'être appuyée.

Les notes jouées sont écrites dans le fichier test.txt

Code de l'application keymixer.txt

Vous pouvez vous inspirer du code ci-dessous, si vous voulez construire un clavier sonore en python.

import pygame from pygame import mixer pygame.init() pygame.mixer.init() import keyboard from moduleabc import normaliser from moduleabc import tradtabnote from moduleabc import trad def playnote(trans,n) : tradnote="" ton=trans+n if ton<30 or ton>53 : return "" note=str(ton) tradnote=trad(trans,ton) fic="wav/"+note+".wav" sound = pygame.mixer.Sound(fic) sound.set_volume(0.2) sound.play() #winsound.PlaySound(fic, winsound.SND_FILENAME) return tradnote 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.2) sound.play() tradnote1=trad(trans,note1) 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.2) sound.play() tradnote2=trad(trans,note2) 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.2) sound.play() tradnote3=trad(trans,note3) 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.2) sound.play() tradnote4=trad(trans,note4) tradnote=tradnote1+tradnote2+tradnote3+tradnote4 return tradnote def playtabla(trans,tabla) : 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" : note=" "+note prov=prov+note tabla=prov normaliser(tabla) print("tabla",tabla) tabla=tabla+" " tabnote="" notetabla="" for i in range(len(tabla)) : l1=tabla[i] if l1==" " : note=tradtabnote(trans,tabnote) if note==" " or note=="" : note="1" n=int(note) if n>29 and n<54 : fic="wav/"+note+".wav" sound = pygame.mixer.Sound(fic) sound.set_volume(0.2) sound.play() #winsound.PlaySound(fic, winsound.SND_FILENAME) notetabla=notetabla+note+" " tabnote="" else : tabnote=tabnote+l1 return notetabla print("Tapez sur la touche ESC pour terminer") mode="" tierce=34 sixte=39 trans=0 tabla="" tradnote="" grille="" while True: try: if keyboard.is_pressed('esc'): fichier = open("test.txt", "w") fichier.write(tabla) fichier.write(grille) fichier.close() print('Fin du programme') break if keyboard.is_pressed(':'): print("Vous venez de jouer ",tradnote) if keyboard.is_pressed('!'): print("Entrez maj harm ou mel") mode=input() if mode != "harm" and mode != "mel" : mode="" if mode=="harm" or mode=="mel" : tierce=33 else : tierce=34 if mode=="harm" : sixte=38 else : sixte=39 if keyboard.is_pressed('F1'): tradnote=playnote(trans,30) grille=grille+tradnote tabla=tabla+tradnote elif keyboard.is_pressed('F2'): tradnote=playnote(trans,31) grille=grille+tradnote tabla=tabla+tradnote elif keyboard.is_pressed('F3'): tradnote=playnote(trans,32) grille=grille+tradnote tabla=tabla+tradnote elif keyboard.is_pressed('F4'): tradnote=playnote(trans,33) grille=grille+tradnote tabla=tabla+tradnote elif keyboard.is_pressed('F5'): tradnote=playnote(trans,34) grille=grille+tradnote tabla=tabla+tradnote elif keyboard.is_pressed('F6'): tradnote=playnote(trans,35) grille=grille+tradnote tabla=tabla+tradnote elif keyboard.is_pressed('F7'): tradnote=playnote(trans,36) grille=grille+tradnote tabla=tabla+tradnote elif keyboard.is_pressed('F8'): tradnote=playnote(trans,37) grille=grille+tradnote tabla=tabla+tradnote elif keyboard.is_pressed('F9'): tradnote=playnote(trans,38) grille=grille+tradnote tabla=tabla+tradnote elif keyboard.is_pressed('F10'): tradnote=playnote(trans,39) grille=grille+tradnote tabla=tabla+tradnote elif keyboard.is_pressed('F11'): tradnote=playnote(trans,40) grille=grille+tradnote tabla=tabla+tradnote elif keyboard.is_pressed('F12'): tradnote=playnote(trans,41) grille=grille+tradnote tabla=tabla+tradnote elif keyboard.is_pressed('0'): grille=grille+" " trans=0 playnote(trans,30) elif keyboard.is_pressed('1'): grille=grille+"s" trans=1 playnote(trans,30) elif keyboard.is_pressed('2'): grille=grille+"S" trans=2 playnote(trans,30) elif keyboard.is_pressed('3'): grille=grille+"t" trans=3 playnote(trans,30) elif keyboard.is_pressed('4'): grille=grille+"T" trans=4 playnote(trans,30) elif keyboard.is_pressed('5'): grille=grille+"Q" trans=5 playnote(trans,30) elif keyboard.is_pressed('6'): grille=grille+"v" trans=6 playnote(trans,30) elif keyboard.is_pressed('7'): grille=grille+"V" trans=7 playnote(trans,30) elif keyboard.is_pressed('8'): grille=grille+"x" trans=8 playnote(trans,30) elif keyboard.is_pressed('9'): grille=grille+"X" trans=9 playnote(trans,30) elif keyboard.is_pressed('*'): grille=grille+"7" trans=10 playnote(trans,30) elif keyboard.is_pressed('-'): grille=grille+"7M" trans=11 playnote(trans,30) elif keyboard.is_pressed('a'): if mode=="harm" or mode=="mel" : notetabla=playtabla(trans,"c e- g C") else : notetabla=playtabla(trans,"c e g C") tabla=tabla+notetabla elif keyboard.is_pressed('z'): if mode=="harm" : notetabla=playtabla(trans,"d f a- D") else : notetabla=playtabla(trans,"d f a D") tabla=tabla+notetabla elif keyboard.is_pressed('e'): if mode=="harm" or mode=="mel" : notetabla=playtabla(trans,"e- g b E") else : notetabla=playtabla(trans,"e g b E") tabla=tabla+notetabla elif keyboard.is_pressed('r'): if mode=="harm" : notetabla=playtabla(trans,"f a- C F") else : notetabla=playtabla(trans,"f a C F") tabla=tabla+notetabla elif keyboard.is_pressed('t'): notetabla=playtabla(trans,"g b D G") tabla=tabla+notetabla elif keyboard.is_pressed('y'): if mode=="harm" : notetabla=playtabla(trans,"a- C E- A") elif mode=="mel" : notetabla=playtabla(trans,"a C E- A") else : notetabla=playtabla(trans,"a C E A") tabla=tabla+notetabla elif keyboard.is_pressed('u'): notetabla=playtabla(trans,"b D F B") tabla=tabla+notetabla elif keyboard.is_pressed('i'): if mode=="harm" or mode=="mel" : notetabla=playtabla(trans,"C E- G C") else : notetabla=playtabla(trans,"C E G C") tabla=tabla+notetabla elif keyboard.is_pressed('q'): tradnote=playaccord(trans,30,tierce,37,42) tabla=tabla+tradnote elif keyboard.is_pressed('s'): tradnote=playaccord(trans,32,35,sixte,44) tabla=tabla+tradnote elif keyboard.is_pressed('d'): tradnote=playaccord(trans,tierce,37,41,46) tabla=tabla+tradnote elif keyboard.is_pressed('f'): tradnote=playaccord(trans,35,sixte,42,47) tabla=tabla+tradnote elif keyboard.is_pressed('g'): tradnote=playaccord(trans,37,41,44,49) tabla=tabla+tradnote elif keyboard.is_pressed('h'): tradnote=playaccord(trans,sixte,42,tierce+12,51) tabla=tabla+tradnote elif keyboard.is_pressed('j'): tradnote=playaccord(trans,41,44,47,53) tabla=tabla+tradnote elif keyboard.is_pressed('k'): tradnote=playaccord(trans,42,tierce+12,49,42) tabla=tabla+tradnote elif keyboard.is_pressed('w'): tradnote=playnote(trans,30) tabla=tabla+tradnote elif keyboard.is_pressed('x'): tradnote=playnote(trans,32) tabla=tabla+tradnote elif keyboard.is_pressed('c'): tradnote=playnote(trans,tierce) tabla=tabla+tradnote elif keyboard.is_pressed('v'): tradnote=playnote(trans,35) tabla=tabla+tradnote elif keyboard.is_pressed('b'): tradnote=playnote(trans,37) tabla=tabla+tradnote elif keyboard.is_pressed('n'): tradnote=playnote(trans,sixte) tabla=tabla+tradnote elif keyboard.is_pressed(','): tradnote=playnote(trans,41) tabla=tabla+tradnote elif keyboard.is_pressed(';'): tradnote=playnote(trans,42) tabla=tabla+tradnote except: break fichier = open("test.txt", "r") tabla=fichier.readline() grille=fichier.readline() fichier.close() print("tabla",tabla) print("grille",grille)

Retour dans la page index du site studyvoxmusi