Chargement...
 
Skip to main content

6 - Le MIDI


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

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 :

Copy to clipboard
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:
Copy to clipboard
#!/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!
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.
Lmao Code
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
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
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).
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).

Patch JPL MKIII SF

@+
JP
France
> Je pensais télécharger le fichier .pd mais apparemment ce n'est pas possible.

C'est possible, voir : Téléchargements.
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.
JPL PADMPK 8PADS PatchPrincipal
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.
JPL PADMPK 8PADS SousPatch

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.
Salut, merci pour votre réponse, par contre je comprend rien à la discussion depuis que vous parlez de téléchargement de .pd