Forum Programmation.python Pédale looper en python - communication entre process

Posté par  . Licence CC By‑SA.
6
22
oct.
2019

Salut à tous,

Je fais partie d'un groupe de musique, dont un des éléments principal est un looper. Cependant, celui-ci (une boss rc300) possède quelques bugs. Nous en avons une utilisation assez particulière et après avoir essayé d'autres pédales nous n'en trouvons aucune qui nous correspond vraiment (problèmes de synchro midi, comportement de lancement des boucles qui ne nous correspond pas).

Et j'ai vu passer sur linuxfr trois liens postés par yazgoo qui m'ont donné une idée :
- une boucle d'enregistrement en shell
- une boucle d'enregistrement en shell partie 2: ajout de layer
- création d'une boucle d'enregistrement en shell partie 3: layers multiples

J'ai donc commencé à coder un petit prototype en python, qui je sais n'est pas le plus rapide des langages mais c'est celui que je connais le mieux, alors pour du prototypage je me suis dit ça ira, de plus il possède plein de bibliothèques bien documentées permettant de manipuler le son, les signaux midi, etc. Et ça va. J'ai des résultat rudimentaires mais concluant, un looper multipiste et multiboucle qui fonctionne sans trop de latence. Alors je continue. Je partagerai mes résultats ici lorsque j'aurai plus avancé.

Je souhaite maintenant lui créer une interface qui permet de contrôler quelques paramètres à distance ou tout simplement de visualiser des informations. Je m'inspire de ce qui se fait actuellement sur les consoles de mixage numérique, contrôlables avec une tablette via un navigateur web. Ce ne sera pas bien sûr pour lancer les enregistrements ou les lectures, événements qui seront contrôlés via un pédalier midi.

J'aimerai donc mettre en place un serveur websocket qui me permet de manipuler les données du programme. C'est là que ça se complique.

J'ai réduit le programme au minimum pour l'exemple. Une horloge qui donne le tempo. Et le tempo qui soit manipulable via websocket comme dans le schéma ci-dessous :
Titre de l'image

J'ai mis uvicorn dans un process car l'execution de celui-ci est bloquant. Cependant je n'ai pas de compétences poussées en python ou en développement en général et je me confronte au problème du partage des variables.

J'ai mis le code source de l'exemple sur ce dépot gitlab

Pour résumer :
1 / J'ai une classe/thread Clock
- celle-ci créé un click audio par rapport à une variable bien nommée TEMPO.
- Cette classe possède des méthodes rise_tempo() et reduce_tempo() qui marchent bien lorsqu'elle sont appelées depuis main().

2 / J'ai un process run_server qui lance uvicorn.
- celui-ci ouvre un websocket et écoute ou envoie des infos.

J'instancie clock (clock=Clock()) et run_server dans la boucle principale :

Cependant lorsque j'appelle les méthodes de l'objet clock depuis le process run_server, celles-ci ne marchent pas. J'imagine que c'est parceque l'objet clock n'est pas partagé dans le process.

Quelle architecture mettre en place pour arriver à mes fins ?

Je ne sais pas si je suis clair..

  • # partage de données

    Posté par  (site web personnel) . Évalué à 2.

    Chaque processus n'a accès qu'à ses données : le système d'exploitation interdit d'accéder à d'autres données pour des raisons de sécurité évidente.

    Dans l'exemple fourni, on a donc deux instances distinctes de Clock() qui vivent chacune leur vie, en ignorant qu'une autre existe.

    Pour partager des données entre processus, il faut partager explicitement un espace mémoire ou communiquer par socket, etc. La bibliothèque standard Python permet partager de la mémoire entre plusieurs processus. Peut-être qu'il existe des bibliothèques qui permettent de simplifier son usage?

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.