Projet musical

Fermé
Neverland - Modifié le 27 déc. 2020 à 17:39
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 - 27 déc. 2020 à 20:30
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 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
27 déc. 2020 à 19:05
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
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 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471 > Neverland
27 déc. 2020 à 19:46
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 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024
27 déc. 2020 à 20:23
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 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471 > Neverland
27 déc. 2020 à 20:30
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 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
27 déc. 2020 à 20:30
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