Jouez des sons en Python en supposant que le clavier est un clavier de piano

ピアノの鍵盤

!! Yahho Kon'nichiwa </ b> </ span> Je suis Ozaki, qui aime la physique (@ sena0801masato).

Cette fois, en supposant que le clavier est un clavier de piano, j'aimerais utiliser Python pour jouer des sons depuis un ordinateur. J'ai eu l'idée quand j'ai été impressionné par l'anime "April is your lie" lol Je ne connais pas du tout la musique, alors dites-moi s'il vous plaît.

Qui est la cible de cet article

――Je veux jouer la balance depuis mon ordinateur! --Je souhaite utiliser uniquement des modules standard --Je ne veux pas télécharger la source sonore

  • J'utilise Windows

Ce que je veux améliorer à l'avenir

――Je souhaite pouvoir utiliser la source sonore téléchargée au lieu du bip --Je veux sortir des accords ――Je veux continuer à produire un seul son en appuyant et en maintenant

À propos de l'échelle

Quand vous pensez à l'échelle, vous pensez à Doremi Fasorashi. En plus de ces 7 sons, 5 sons de la touche noire sont ajoutés pour faire un total de 12 sons, et il recommencera à partir d'une octave plus haut.

La fréquence standard de l'échelle est de 440 Hz de La, et la fréquence double lorsqu'elle augmente d'une octave. Par conséquent, la fréquence est multipliée par 2 $ ^ {1/12} $ en 1 demi-ton plutôt que 2 fois en 12 demi-notes.

Cette fois, l'octave contenant la référence la (440Hz) a été définie comme 4ème étage, et le nom de la variable a été défini avec le son comme hauteur.

du son ドイツ語のdu son階表記
Faire C4
Faire# Cis4
Les D4
Les# Dis4
Mi E4
FA F4
FA# Fis4
Alors G4
Alors# Gis4
La(440Hz) A4
La# Ais4
Shi H4
Haut de C5

Des difficultés

Je me demandais comment le programme recevrait une entrée au clavier. Je ne pouvais pas utiliser l'entrée parce que ce n'était pas comme un piano d'appuyer sur Entrée pour fixer la hauteur à chaque fois, alors j'ai finalement utilisé getch. getch lit les frappes et renvoie les caractères lus, mais il y avait une très bonne bibliothèque standard qui ne renvoyait rien sur la console et n'avait même pas besoin d'appuyer sur Entrée. (Il m'a fallu un certain temps pour y arriver ... Il semble que j'utilise habituellement Pygame etc.)

Code complété

digital_piano_ver01.py


from winsound import Beep
from msvcrt import getch

#Définition du nombre de fois où l'écart d'une demi-note est
onestep_pitch = 2 ** (1.0/12.0)
#Définir le temps pour produire un son en millisecondes
duration = 300

#Définir une fonction pour produire un son
def play_pitch(frequency, duration):
    Beep(frequency, duration)
#Définir une fonction pour élever ou abaisser une demi-note
def down_pitch(base_pitch):
    return int(round(base_pitch / onestep_pitch))
def up_pitch(base_pitch):
    return int(round(base_pitch * onestep_pitch))

#Définir la fréquence de chaque hauteur
A4 = 440
Ais4 = up_pitch(A4)
H4 = up_pitch(Ais4)
C5 = up_pitch(H4)
Cis5 = up_pitch(C5)
D5 = up_pitch(Cis5)
Dis5 = up_pitch(D5)
E5 = up_pitch(Dis5)

Gis4 = down_pitch(A4)
G4 = down_pitch(Gis4)
Fis4 = down_pitch(G4)
F4 = down_pitch(Fis4)
E4 = down_pitch(F4)
Dis4 = down_pitch(E4)
D4 = down_pitch(Dis4)
Cis4 = down_pitch(D4)
C4 = down_pitch(Cis4)
H3 = down_pitch(C4)
Ais3 = down_pitch(H3)
A3 = down_pitch(Ais3)

#Associez la hauteur au clavier. Du clavier"d"Est-ce que C4, c'est-à-dire le son de do, etc.
pitchs = {}
pitchs["a"] = A3
pitchs["w"] = Ais3
pitchs["s"] = H3
pitchs["d"] = C4
pitchs["r"] = Cis4
pitchs["f"] = D4
pitchs["t"] = Dis4
pitchs["g"] = E4
pitchs["h"] = F4
pitchs["u"] = Fis4
pitchs["j"] = G4
pitchs["i"] = Gis4
pitchs["k"] = A4
pitchs["o"] = Ais4
pitchs["l"] = H4
pitchs[";"] = C5
pitchs["@"] = Cis5
pitchs[":"] = D5
pitchs["["] = Dis5
pitchs["]"] = E5

while True:
    #Reconnaître la clé saisie
    bytes_keyboard = getch()
    #Convertir d'une chaîne d'octets en chaîne
    str_keyboard = bytes_keyboard.decode("utf-8")
    #Aligner la chaîne sur les lettres minuscules
    pitch = str_keyboard.lower()
    print("Échelle de musique", pitch)
    #Émet un son lorsque la touche enfoncée est dans le dictionnaire
    if pitch in pitchs:
        play_pitch(pitchs[pitch], duration)
    #Appuyez sur q pour quitter
    elif pitch == 'q':
        break

Résumé

Pour le moment, j'ai fait quelque chose comme un piano. Mais il y a encore place à l'amélioration. Ce qui m'inquiète beaucoup, c'est que je ne peux pas jouer d'accords, et même si j'appuie dessus et le maintient, le son est coupé dans la milliseconde définie. Je me demande si ces deux éléments ne peuvent pas être effectués en utilisant un traitement asynchrone, alors faites-le moi savoir si quelqu'un le peut. Une autre idée est que si vous générez un son à partir d'une forme d'onde, vous pouvez exprimer un accord et un son qui est atténué en le maintenant enfoncé. Je pensais juste que les pianos électroniques qui étaient réellement vendus étaient incroyables lol

Alors! </ B> </ span>

Les références

[winsound --- Interface de lecture audio pour Windows] (https://docs.python.org/ja/3/library/winsound.html) msvcrt --- Routines utiles pour le système d'exécution MS VC ++ Je voulais obtenir un événement clé en Python, mais je ne pouvais pas le faire ← Je l'ai fait. [Création d'un logiciel de lecture de sons GUI avec Tkinter (4) - Création de sons avec Python] (https://takasa-5.blogspot.com/2017/04/tkinter-gui4.html)

Recommended Posts