"""
""" #!/usr/bin/env python3 # -*- coding: utf-8 -*- # # importation du programme depuis : # https://openclassrooms.com/forum/sujet/python-realisation-d-un-piano # http://theremin.music.uiowa.edu/MISpiano.html : fichiers aiff (inutile de les convertir en wav) # # recherche d'un air : # cailloux et coquillages # SI3 MI4 MI4 MIb4 MI4 SOLb4 SOL4 MI4 SOL4 SOLb4 MI4 RE4 DO4 DO4 SI3 # Adagio # MI4 RE4 DO4 SI3 LA3 LA3 LAb3 FA4 MI4 RE4 DO4 SI3 SI3 LA3 \ # LA4 SOL4 LA4 FA4 SOL4 MI4 FA4 SOL4 FA4 SOL4 MI4 FA4 RE4 MI4 \ # MI4 FA4 MI4 FA4 RE4 MI4 DO4 RE4 SI3 MI4 RE4 MI4 \ # LA4 SOL4 LA4 FA4 SOL4 MI4 FA4 RE4 SOL4 FA4 SOL4 MI4 FA4 RE4 MI4 # Arlésienne # FA4 DO4 FA4 SOL4 LAb4 SOL4 LAb4 FA4 DO5 LAb4 SIb4 DO5 \ # REb5 DO5 SIb4 LAb4 SOL4 DO5 FA4 import pygame # Importation du module pygame # mes propres imports : import tkinter # python 3 import time import numpy as np tab_noms_notes_fr = [ 'DO', 'REb', 'RE', 'MIb', 'MI', 'FA', 'SOLb', 'SOL', 'LAb', 'LA', 'SIb', 'SI' ] tab_noms_notes_en = [ 'C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G', 'Ab', 'A', 'Bb', 'B' ] # pygame sert uniquement à jouer les notes : # key = pygame.key.get_pressed() # checking pressed keys # if key[pygame.K_a]: pygame.init() pygame.mixer.init(frequency=44100, size=-16, channels=1) # Fréquence de référence : LA4 = 440 Hz def get_frequency(note, octave): semitone = tab_noms_notes_fr.index(note) n = semitone + 12 * (octave - 4) return 440 * 2**((n - 9) / 12) # Génère une onde sinusoïdale pour une note donnée def generate_sound(note, octave, duration=1.0, volume=0.5): sample_rate = 44100 freq = get_frequency(note, octave) t = np.linspace(0, duration, int(sample_rate * duration), False) waveform = 32767 * np.sin(2 * np.pi * freq * t) * volume sound = np.array(waveform, dtype=np.int16) return pygame.mixer.Sound(buffer=sound) # Dictionnaire de notes synthétisées print("# génération des sons synthétiques") notes = {} for i in range(3): # octaves 3 à 5 octave = i + 3 for note in tab_noms_notes_fr: note_fr = note + str(octave) notes[note_fr] = generate_sound(note, octave) # Fonctions de gestion des sons enregistrement = [] def jouerNote(note): global enregistrement print(note, end=' ') s = notes[note] s.play(maxtime=1000) # stockage de la note jouée enregistrement.append(note) return def replay() : print() for note in enregistrement : print(note, end=' ') s = notes[note] s.play(maxtime=1000) time.sleep(0.5) return def effacer() : # efface la dernière note # efface les n dernières notes en appuyant n fois global enregistrement if enregistrement: enregistrement.pop() def effacer_tout(): global enregistrement enregistrement = [] def imprime() : # imprime les notes en cours (sans les notes effacées) print() for note in enregistrement: print(note, end=' ') print() # GUI avec tkinter # Fenetre principale Fenetre = tkinter.Tk() Fenetre.title("Clavier Piano Synthétique") # Definition du nom de la fenetre # creation du cadre avec une grille frame = tkinter.Frame(Fenetre) frame.grid() # Boutons : touches du clavier print("# création des touches") for ligne in range(3): # octaves 3, 4, 5 octave = ligne + 3 tab_bouton = [None for _ in tab_noms_notes_fr] for position, note in enumerate(tab_noms_notes_fr): note_fr = note + str(octave) couleur = "gray" if "b" in note else "white" hauteur = 8 if "b" in note else 15 largeur = 4 if "b" in note else 8 bouton = tkinter.Button(frame, height=hauteur, width=largeur, text=note_fr, bg=couleur, fg="black", command=lambda x=note_fr: jouerNote(x)) bouton.grid(row=ligne, column=position, sticky="ns") # Boutons d'action tkinter.Button(frame, height=2, width=8, text="replay", bg="white", fg="black", command=replay).grid(row=3, column=0) tkinter.Button(frame, height=2, width=8, text="effacer\nla dernière\nnote", bg="white", fg="black", command=effacer).grid(row=3, column=2) tkinter.Button(frame, height=2, width=8, text="effacer\ntout", bg="white", fg="black", command=effacer_tout).grid(row=3, column=4) tkinter.Button(frame, height=2, width=8, text="imprime", bg="white", fg="black", command=imprime).grid(row=3, column=5) Fenetre.mainloop() """"""