Projet musical
Bonjour,
J'ai un projet musical à faire en python pour mon école. Je vais donc essayer d'être le plus clair possible. Je suis censé créer une interface où l'utilisateur peut exécuter des comptines. Pour cela, j'ai une liste de partitions ( ex : #1 Joyeux anniversaire : SOLc p Zc SOLn LAn SOLn DOn Zc SIb SOLc p Zc SOLn LAn SOLn REn Zc)
Après je souhaite faire lire cette chaîne de caractère pour la transformer en musique avec le module simpleaudio. Tout est bien programmé de façon à avoir une ligne : sound(a,b) où a est la fréquence du son, donc si c'est SOL, c'est par exemple 240. Et b est la durée du son, par exemple c = 122 ms mais s'il y a un p après sa double la valeur de b.
je pense avoir réussi à faire une chaine de caractère avec mon fichier:
Ensuite voici mon programme qui me permet de jouer une note musicale:
J'aimerais donc pouvoir lire mon fichier birthday de façon automatisé et en remplaçant automatiquement a et b par sa valeur.
Si quelqu'un a une idée je suis preneur.
J'ai un projet musical à faire en python pour mon école. Je vais donc essayer d'être le plus clair possible. Je suis censé créer une interface où l'utilisateur peut exécuter des comptines. Pour cela, j'ai une liste de partitions ( ex : #1 Joyeux anniversaire : SOLc p Zc SOLn LAn SOLn DOn Zc SIb SOLc p Zc SOLn LAn SOLn REn Zc)
Après je souhaite faire lire cette chaîne de caractère pour la transformer en musique avec le module simpleaudio. Tout est bien programmé de façon à avoir une ligne : sound(a,b) où a est la fréquence du son, donc si c'est SOL, c'est par exemple 240. Et b est la durée du son, par exemple c = 122 ms mais s'il y a un p après sa double la valeur de b.
je pense avoir réussi à faire une chaine de caractère avec mon fichier:
with open("birthday.txt", "r") as filin:
ligne = filin.readline()
while ligne != "":
print(ligne)
ligne = filin.readline()
Ensuite voici mon programme qui me permet de jouer une note musicale:
def sound(freq, duration):
sample_rate = 44100
t = np.linspace(0, duration, int(duration*sample_rate), False)
tone = np.sin(freq*t*(6)*np.pi)
tone *= 8388607 / np.max(np.abs(tone))
tone = tone.astype(np.int32)
i=0
byte_array= []
for b in tone.tobytes():
if i % 4 != 3:
byte_array.append(b)
i += 1
audio = bytearray(byte_array)
play_obj = sa.play_buffer(audio, 1, 3, sample_rate)
play_obj.wait_done()
sound(400, 0.25)
J'aimerais donc pouvoir lire mon fichier birthday de façon automatisé et en remplaçant automatiquement a et b par sa valeur.
Si quelqu'un a une idée je suis preneur.
2 réponses
-
ModérateurBonjour,
En partant du principe qu'une ligne ( ta variable ligne de la ligne de codeligne = filin.readline()
) contient le text suivant :
#1 Joyeux anniversaire : SOLc p Zc SOLn LAn SOLn DOn Zc SIb SOLc p Zc SOLn LAn SOLn REn Zc
Je commencerai par m'intéresser à la fonction split afin de découper cette chaine en "mots"
https://www.w3schools.com/python/ref_string_split.asp
Il faut le faire en deux fois, une première fois pour séparer au niveau des deux points ":"
Puis une seconde en séparant par des espaces.
De cette manière, tu vas récupérer un array contenant chaque note (ou caractère "p" )
Il ne te restera qu'à boucler sur cet array pour traiter chaque valeur de ton array ( et en regardant si la valeur suivante vaut "p" ou non).
Donc, en gros,
Tu split
Tu boucles sur ton array
Tu utilises des IF/ELSE
Tu fais appel à ta fonction pour jouer les sons.
-
Contributeurbonjour,
le but de l'exercice n'est-il pas que tu apprennes à analyser une ligne de texte?
comment vas-tu progresser sans essayer par toi-même?
https://www.commentcamarche.net/infos/25899-demander-de-l-aide-pour-vos-exercices-sur-ccm/-
-
Contributeur@Neverlandas-tu déjà fait des exercices d'analyse de texte?
peux-tu décrire ce qui te bloque? que doit réaliser la partie manquante du programme? -
@yg_beEn fait je vois mal comment je peux en même temps lire le fichier en ligne de caractère, ou en différenciant la fréquence qui est en majuscule (SOL, DO etc...) et le temps qui est en minuscule ( c , p etc...) tout en attribuant ces valeurs à a et b afin d'avoir une boucle qui répète sound(a,b) mais avec chaques valeur de a et de b.
-
Contributeur@Neverlandchaque partition fait une seule ligne?
as-tu déjà fait des exercices d'analyse de texte?
quelles techniques et quelles fonctions connais-tu?
pourquoi "en même temps"? c'est plutôt l'un après l'autre, non?
-