Chargement...
 
[Voir/Cacher menus de gauche]
[Voir/Cacher menus de droite]

6 - Le MIDI

> Forums de discussion > 6 - Le MIDI > Création d'un lecteur de bande son pour le live controlé par midi
Dernier post

Création d'un lecteur de bande son pour le live controlé par midi

dechichulien utilisateur non connecté
Salut, je me suis galéré à trouver un lecteur qui déclenche mes pistes pour le live contrôlé par midi, Lisp fonctionnais pas sur ma distro arch et avec ardour ou les autres solution proposé soit sa marchait pas soit je comprenais pas, bref j'ai donc fait un script python que je partage ici pour aider les galérien/ne comme moi!

D'abord pour trouver les touches sur lequel j'appuie il faut qmidiroute installez le si vous l'avez pas.
il faut aussi avoir installé ses trucs la:

mido
pygame
threading

Puis une fois les note trouvé j'ai mis ce code dans le fichier :

import mido
import pygame
import threading

# Mapping des notes à des fichiers sons
TRACKS = {
64: "pistea.wav",
65: "pisteb.wav"
#etc...
}

# Notes spéciales
PAUSE_NOTE = 70
STOP_NOTE = 71

# Init mixer
pygame.mixer.init()
channels = {}
paused_sounds = {}

# Lecture
def play_track(note):
    stop_all_tracks()
    filename = TRACKS[note]
    sound = pygame.mixer.Sound(filename)
    ch = sound.play()
    channels[note] = (sound, ch)
    print(f">>> Lecture : {filename}")

# Pause / reprise
def toggle_pause():
    for note, (sound, ch) in channels.items():
        if ch.get_busy():
            paused_sounds[note] = ch
            ch.stop()
            print(f"||| Pause : {TRACKS[note]}")
        else:
            new_ch = sound.play()
            channels[note] = (sound, new_ch)
            print(f"⏵ Reprise : {TRACKS[note]}")
    paused_sounds.clear()

# Stop complet
def stop_all_tracks():
    for note, (sound, ch) in channels.items():
        ch.stop()
    channels.clear()
    paused_sounds.clear()
    print("××× Stop toutes les pistes.")

# Gestion des messages MIDI
def listen_midi(port_name):
    with mido.open_input(port_name) as inport:
        print(f" Écoute sur {port_name}...")
        for msg in inport:
            if msg.type == 'note_on' and msg.velocity > 0:
                note = msg.note
                print(f"Note reçue : {note}")
                if note in TRACKS:
                    play_track(note)
                elif note == PAUSE_NOTE:
                    toggle_pause()
                elif note == STOP_NOTE:
                    stop_all_tracks()

# Lancement
print(" Ports MIDI disponibles :")
ports = mido.get_input_names()
for i, port in enumerate(ports):
    print(f"{i}: {port}")

if ports:
    # Recherche du port "MI" de ton Launchpad
    selected_port = None
    for port in ports:
        if "Launchpad Mini MK3" in port and "MI" in port:
            selected_port = port
            break

    if selected_port:
        listen_midi(selected_port)
    else:
        print(" Launchpad Mini MK3 non trouvé parmi les entrées MIDI.")
else:
    print("Aucun port MIDI détecté.")


pour le faire fonctionné le fichier "lecteur live.sh" que vous devez rendre executable:
#!/bin/bash

# Se placer dans le bon répertoire
cd /repertoire du script/

# Exécuter le script Python
python3 launchpad_player.py


J'arrive pas a faire pause et a reprendre, sa fait stop a la place et j'arrive pas a lire deux piste en même temps mais sinon sa marche et c'est facile, plus que d'essayer de faire marcher LISP ou de paramétré un truc complexe!

Si vous voulez l'amélioré c'est pas de refus la c'est juste pour dépanné les gens!

olinuxx utilisateur non connecté France
Pour mettre en code, il faut utiliser :
Note modération : merci d'utiliser la balise CODE lorsque tu copies/colles du code sur le site. Celles-ci permettent un meilleur affichage.
Image
Voir également cette page.

(j'ai édité ton message pour l'y ajouter)

J'ai l'impression que ton morceau de code n'est pas entier.
Et également qu'il y a une erreur de typo sur l'avant dernière ligne : inport

dechichulien utilisateur non connecté
olinuxx écrit :
Pour mettre en code, il faut utiliser :
Note modération : merci d'utiliser la balise CODE lorsque tu copies/colles du code sur le site. Celles-ci permettent un meilleur affichage.
Image
Voir également cette page.

(j'ai édité ton message pour l'y ajouter)

J'ai l'impression que ton morceau de code n'est pas entier.
Et également qu'il y a une erreur de typo sur l'avant dernière ligne : inport

Salut, en fait j'avais mis les balises mais il y avait un caractère "image" qui bloquait la suite du code, je l'ai enlever, la on voit le message en entier.

Pour moi sa fonctionne, c'est très basique mais sa fait le job

olinuxx utilisateur non connecté France
Top.
À noter que pour les caractères récalcitrants, il y a la balise "non-analysé" qui peut être utile (l'espèce de rond rose).

jpl utilisateur non connecté
Bonjour,

Comme je veux découvrir Pd que je ne connais pas, je me suis dit que ce serait un bon cas d'étude (souvent les exemples des tutos, sont... heu... des exemples de tutos).

C'est quand même un univers particulier, je ne parle pas de la façon de programmer ni du fond mais quand on cherche un truc simple pas facile à trouver.

Il faut donc arriver à intégrer une logique empreinte de quelques particularités.
Ne serait-ce qu'au niveau de la restitution de ton patch après fermeture et réouverture.
Je ne parle pas du fonctionnement mais de l'apparence, j'ai dû refaire mes commentaires.

J'ai donc fait un premier patch avec découverte au fur et à mesure.
En l'état ça fait juste :
- sélection du fichier à lire.
- Utilisation du PAD n°5 pour contrôler la lecture : un tap = lecture si la lecture n'est pas en cours, ou une mise en pause si la lecture est en cours.
- utilisation du bouton K1 pour contrôler le volume
- utilisation du joystick en combinaison du pad, pour arrêter la lecture au lieu de la mettre en pause (si lecture en cours le fait de faire un tap sur le pad alors que le joystick est tout en haut ou tout en bas stoppe la lecture).

Les bouton et pad choisis sont chacun dans la même position dans la matrice qui les concernent (en haut à gauche).

Différence entre stop et mise en pause : quand une lecture est en pause elle reprend depuis l'emplacement de mise en pause. Si elle a été stoppée, la lecture repart depuis le début du fichier. L'arrivée en fin de fichier est équivalente à un stop.

En l'état ça fonctionne, certes pour un seul pad à la fois, mais je vais m’atteler à faire un truc qui fonctionnera avec les 8 pads.

Je pensais télécharger le fichier .pd mais apparemment ce n'est pas possible.
Donc voici une image (ne soyez pas surpris du vert sur fond noir, je suis obligé de mettre tout dans un style sombre sinon je n'y voit rien).

Image

@+
JP

olinuxx utilisateur non connecté France
> Je pensais télécharger le fichier .pd mais apparemment ce n'est pas possible.

C'est possible, voir : Téléchargements.

jpl utilisateur non connecté
Bonjour,

J'ai un peu progressé dans mon apprentissage de PD.

J'ai un patch accompagné de 8 sous patchs. Les 8 sous-patchs sont identiques, mais chacun correspond à un pad et à un fichier son différent. Il y a donc les noms des variables qui diffèrent (nom identique mais suffixé par le n° de pad).

Je me suis limité à 8.
Bank1 : chaque pad contrôle un fichier son. Lecture, pause, stop.
Bank2 : n'importe quel pad de la rangée supérieure démarre tous les sons depuis le début des fichiers, n'importe quel pad de l'autre rangée stoppe tous les sons.
Si une touche du clavier est utilisée alors on stoppe tous les sons (équivalent pad bank2 rangée du bas). Pas très utile mais c'est pour mes tests de prog pd.
Chaque bouton rotatif contrôle le volume d'un pad.
Afin d'avoir une cohérence visuelle, j'ai fait correspondre le bouton qui est à la même place relative que le pad (les pads sont numérotés de gauche à droite en commençant par le bas, les knobs sont numérotés de gauche à droite mais en commençant par le haut)
P5 P6 P7 P8 — K1 K2 K3 K4
P1 P2 P3 P4 — K5 K6 K7 K8
Donc K1 -> P5....... K8 -> P4

Pour stopper un son il faut mettre le joystick tout en haut ou tout en bas en même temps que le tap sur le pad (bank1 sélectionnée)

Les fichiers sons doivent être ouverts un par un, il est possible de n'ouvrir que le nombre désiré. (évolution à faire : ouvrir les fichiers à partir d'une liste éventuellement en .csv).

J'ai téléchargé le fichier .pd dans la galerie "projet".
Ci-dessous la capture des patchs et les explications.

@+
JP

J'ai supprimé les commentaires dans les patchs pour plus de lisibilité.

Quelques explications.
Patch principal.
Image
A droite.
Le loadbang ne fait qu'activer le DSP et initialise la variable "s" à 0.

pour chaque pad on peut ouvrir un fichier son en cliquant sur le bang.
La disposition correspond à la disposition physique.
Le fichier ouvert est passé en paramètre au sous-patch concerné.

Au milieu.
Récupération de la valeur du contrôleur 1 canal 1 qui correspond au joystick.
Quand la valeur est à 127 (tout en haut ou tout en bas) la variable "s" est mise à 1.

A droite.
En haut.
Récupération de la valeur et de la vélocité de la note sur le canal 10 (port 1) qui correspond aux pads.
"expr if...."
Si la vélocité est à 0, ceci signifie qu'aucun pad est tapé on renvoi 99
Sinon
- si la valeur est dans l'intervalle fermé 35,43 alors un pad est tapé (bank1 activée) on renvoie sa valeur
- si la valeur est dans l'intervalle fermé 44,47 alors un pad de la rangée du bas est tapé alors que la banque2 est activée on renvoie 0
- si la valeur est dans l'intervalle fermé 48, 51 alors un pad dela rangée supérieure est tapé alors que la banque2 est sélectionnée on renvoie 1.
- dans tous les autres cas on renvoi 99.

Traitement selon la valeur (select):
Si la valeur est 36,....43 -> on envoie un message (send) correspondant au pad (36 -> "pad1",.... 43 -> "pad8").
Si la valeur est à 0 on envoie le message "stopall"
Si la valeur est à 1 on envoie le message "startall"
Dans tous les autres cas on ne fait rien.

En bas.
Récupération de la valeur et de la vélocité de la note sur le canal 1 (port 1) qui correspond au clavier.
Si la vélocité n'est pas à 0 et que la valeur est dans l'intervalle fermé 48,72 on revoie 1 sinon on renvoie 0.
Si nous avons 1 alors on envoie le message "stopall".


Sous-patch.
Image

Les sous-patchs se nomment pad1, pad2..... pad8.
Ils sont tous identiques sauf
- sur les suffixes des noms des variables et des messages qui correspondent au numéro (padx, vpx, ppadx où x=n° du pad).
- sur le contrôleur/port/canal du knob de contrôle du volume (pour simplifier K1 = 70 K2 = 71...)
Le patch reçoit le fichier ouvert (inlet) et l'ouvre par le readanysf.
la variable "vpx" est initialisée à 0.5 elle correspond au volume (de 0 à 1.27)
elle est envoyée au dac (voir en bas du patch).
Elles est modifiée en fonction de la valeur reçue sur le contrôleur qui correspond au knob associé.

La variable ppadx sert à savoir si une lecture est en cours.
Si c'est le cas elle est à 1, sinon elle est à 0.

Quand le message padx est reçu :
.Si la variable ppadx est à 0 on envoie le message "play" à readanysf et on bascule ppadx à 1.
.Si la variable ppadx est à 1 :
- si la variable "s" est à 0 on envoie le message "pause" à readanysf
- si la variable "s" est à 1 on envoie le message 'stop" à readanysf
- on bascule la variable ppadx à 0 dans les 2 cas.

Quand le message "stopall" est reçu on envoie le message "stop" à readanysf et on bascule la variable ppadx à 0

Quand le message "startall" est reçu on envoie un message "stop" puis un message "play" à radanysf et on bascule la variable ppadx à 1

Quand le bang de fin de fichier est envoyé par readanysf on bascule la variable ppadx à 0.

Afficher les articles :
Aller au forum :

Documentation [Afficher / Cacher]

Faire un don
[Afficher / Cacher]

Connexion
[Afficher / Cacher]



Mégaphone [Afficher / Cacher]

allany, 10:35, lun. 12 mai 2025: Et pour la totale, l'éditorial ! [Lien]
olinuxx, 12:25, jeu. 08 mai 2025: [ANNONCE] Le live de LibraZiK-4 est de retour ! [Lien]
calixtus06, 08:02, lun. 05 mai 2025: Bonjour et bienvenue à jipe35 et Bachila :-)
calixtus06, 14:59, lun. 28 Apr 2025: Bonjour et bienvenue à jpl :-)
calixtus06, 12:57, mar. 22 Apr 2025: Bonjour et bienvenue à Ardii,sgio et Gilles13 :-)
allany, 08:30, sam. 12 Apr 2025: Celui-ci, d'éditoriel, il est bien réel ! [Lien]
calixtus06, 16:39, lun. 07 Apr 2025: Bonjour et bienvenue à Saanvis754 :-)
calixtus06, 08:37, lun. 07 Apr 2025: Bonjour et bienvenue à skamoss et à lecapitainecoeur :-)
allany, 17:27, mar. 01 Apr 2025: Il est sensationnel cet éditoriel ! [Lien]
calixtus06, 13:04, dim. 30 mars 2025: Bonjour et bienvenue à MarM et gor :-)
olinuxx, 15:45, mer. 26 mars 2025: [ANNONCE] LibraZiK a fini de déménager depuis TuxFamily vers Ouvaton : [Lien] . Grand merci à toutes ces personnes qui ont aidé !
calixtus06, 10:29, lun. 24 mars 2025: Bonjour et bienvenue à adhooge :-)