Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Futur Membre du Club
    Continuer une tache pendant l'execution d'une fonction
    Bonjour,

    je suis entrain d'essayer de programmer un player midi en ligne de commande sous linux.

    Voici une partie de code (désolé je débute ;-) )

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    outport = mido.open_output('MIDISPORT 2x2 Anniv:MIDISPORT 2x2 Anniv MIDI 1 28:0')
    songlist = (glob.glob("/home/pi/Documents/song/*.mid"));
     
    def songplay(song):
        with outport as output:
            try:
                midifile = MidiFile(song)
                while True:
                    for message in midifile.play():    
                        output.send(message)
     
            except KeyboardInterrupt:
                print()
                output.reset()     
     
     
    try:
        with mido.open_input('arduino_midi:arduino_midi MIDI 1 20:0') as port:
            for message in port:
                print(message)
                if message.type in ('note_on') and message.note == 36:
                    print(songlist[i])
                    if i == (nbrsong-1):
                        i = 0
                    else:
                        i += 1
                if message.type in ('note_on') and message.note == 37:
                    songplay(songlist[i])
     
                sys.stdout.flush()
    except KeyboardInterrupt:
        pass


    En gros je definit le port d'entre et de sortie midi ..
    Je definit une fonction songplay qui lit le fichier midi en boucle
    et dans le try , j'écout ce qui entre sur le port d'entrée midi ... SI note 36 on change de chanson dans la liste ... si note 37 on lance la fonction songplay ...

    Mon problème , une fois que le fichier midi se lit (quand je suis dans la fonction songplay) , il ne reagit plus à mes entrée midi, il n'interprete plus le code du try ...

    A mon avis c'est une betise et je n'utilise pas les bons truc (try, fonction, with ...) mais je suis perdu

  2. #2
    Expert éminent sénior
    Salut,

    Citation Envoyé par Tetsuo30 Voir le message
    Mon problème , une fois que le fichier midi se lit (quand je suis dans la fonction songplay) , il ne reagit plus à mes entrée midi, il n'interprete plus le code du try ...
    Si la lecture du port se fait à chaque itération de la boucle ligne 20, l'itération suivante ne pourra se faire qu'après le retour de la fonction songplay i.e. lorsque la fonction sera terminée.

    En général, la solution est de permettre aux opérations écriture et lecture de se dérouler indépendamment (de façon asynchone) en utilisant des threads et un mécanisme de communication entre les deux.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Futur Membre du Club
    Parfait j'y suis arrivé avec les thread, je ne connaissais pas

    merci

###raw>template_hook.ano_emploi###