Projet musical

Neverland -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
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:
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.
A voir également:

2 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
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/
0
Neverland
 
Mais je ne cherche pas à ce que vous fassiez le projet à ma place. Je recherche juste un indice, une ligne de code qui me permette de continuer l'exercice car pour l'instant je suis bloqué sur le codage de cette partition musicale et ça m'empêche de faire la suite.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Neverland
 
as-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?
0
Neverland > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
En 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.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Neverland
 
chaque 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?
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Bonjour,

En partant du principe qu'une ligne ( ta variable ligne de la ligne de code
ligne = 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.


0