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:
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

  1. Modérateur
    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.

    1. Contributeur
      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/
      1. 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.
      2. 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?
      3. @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.
      4. 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?