Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 25/07/2021, à 11:05

DonutMan75

[RESOLU] [python 3] Lire un fichier MIDI avec Mido / rtmidi ?

Bonjour à tous,
j'essaie de prendre en main le paquet Mido qui permet de manipuler des fichiers MIDI.

Mon premier essai est de venir lire un fichier MIDI mais je n'y arrive pas et je n'ai aucun message d'erreur.
Je précise que j'arrive tout à fait à lire ce fichier MIDI avec un lecteur Audio.

Qu'en pensez-vous ? Avez-vous des idées ?

1) Installation

J'ai suivi l'installation recommandée, à savoir faire reposer Mido sur rtmidi. Lors de l'installation de rtmidi via pip j'ai eu un message d'erreur comme quoi il fallait que j'installe libjack-dev.

Voici donc le protocole d'installation complet qui n'a généré aucune erreur :

$ sudo apt-get install libjack-dev
$ pip install python-rtmidi
$ pip install mido

2) Code minimal


#!/usr/bin/env python3

import mido

mido.backend
# Retourne <backend mido.backends.rtmidi (loaded)>

mido.get_output_names()
# Liste les sorties MIDI, retourne chez moi deux fois la même chose :
#['Midi Through:Midi Through Port-0 14:0',
# 'Midi Through:Midi Through Port-0 14:0']

outport = mido.open_output('Midi Through:Midi Through Port-0 14:0')
outport.reset()


mid = mido.MidiFile('./blue.mid') # Ouverture du fichier MIDI

for msg in mid.play():
    outport.send(msg)

outport.close()

Ce code ne génére pas d'erreur et il semble envoyer des messages MIDI (étant donné qu'il ne retourne pas immédiatement)


3) Essais

En suivant la doc de Mido, j'ai bien vérifié que j'arrivais à correctement lire le fichier MIDI. La commande suivante liste l'ensemble des commandes MIDI.

for i, track in enumerate(mid.tracks):
     print('Track {}: {}'.format(i, track.name))
     for msg in track:
         print(msg)

4) Pistes à creuser ?

Comment puis-je vérifier que rtmidi envoie quelque chose et (surtout) sur quelle sortie audio ? Je dispose en effet d'une sortie enceinte (celle sur laquelle je souhaite envoyer quelque chose) mais aussi un casque connecté et une sortie son sur l'écran... ah et également une sortie optique sur laquelle rien n'est branché...

Merci par avance smile

Donut

Dernière modification par DonutMan75 (Le 25/07/2021, à 14:45)

Hors ligne

#2 Le 25/07/2021, à 14:14

DonutMan75

Re : [RESOLU] [python 3] Lire un fichier MIDI avec Mido / rtmidi ?

Hello,
j'ai également essayé de remonter d'un cran et de travailler avec python-rtmidi mais cela échoue également... avec le même comportement, à savoir : le programme se déroule sans message d'erreur mais je n'entends rien.

Voici le code minimal donné par la doc de python-rtmidi :

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# https://spotlightkid.github.io/python-rtmidi/

import time
import rtmidi

midiout = rtmidi.MidiOut()
available_ports = midiout.get_ports()

if available_ports:
    midiout.open_port(0)
else:
    midiout.open_virtual_port("My virtual output")

with midiout:
    note_on = [0x90, 60, 112] # channel 1, middle C, velocity 112
    note_off = [0x80, 60, 0]
    midiout.send_message(note_on)
    time.sleep(0.5)
    midiout.send_message(note_off)
    time.sleep(0.1)

del midiout

C'est assez désespérant... j'ai suivi les protocoles d'installation mais ça ne fonctionne pas... et la doc ne mentionne aucune gestion des erreurs... sad

Hors ligne

#3 Le 25/07/2021, à 14:42

DonutMan75

Re : [RESOLU] [python 3] Lire un fichier MIDI avec Mido / rtmidi ?

Bon, à force de chercher j'ai trouvé !

Donc il semblerait que le rôle de Mido soit uniquement de gérer les entrées/sorties mais absolument pas de dire que tel flux MIDI doit être converti et joué sur la sortie son.

Pour ce faire, il faut utiliser par exemple Timidity en mode serveur de son MIDI tel qu'expliqué dans la doc Ubuntu.

$ sudo modprobe snd-seq-device
$ sudo modprobe snd-seq-midi

$ timidity -iA -B2,8 -Os1l -s 44100
Requested buffer size 2048, fragment size 1024
ALSA pcm 'default' set buffer size 2048, period size 680 bytes
TiMidity starting in ALSA server mode
Opening sequencer port: 130:0 130:1 130:2 130:3

Et maintenant ces sorties sons apparaissent dans Mido !

mido.get_output_names()
['Midi Through:Midi Through Port-0 14:0',
 'Midi Through:Midi Through Port-0 14:0',
 'TiMidity:TiMidity port 0 130:0',
 'TiMidity:TiMidity port 1 130:1',
 'TiMidity:TiMidity port 2 130:2',
 'TiMidity:TiMidity port 3 130:3']

Il suffit de sélectionner par exemple  'TiMidity:TiMidity port 0 130:0' pour que le code se déroule comme attendu !

J'ai été piégé par les deux sorties détectées 'Midi Through:Midi Through Port-0 14:0' et 'Midi Through:Midi Through Port-0 14:0' dont j'ignore à quoi elles correspondent.

Bonne aprem !

D.

Hors ligne