Forum : 1 - Le matériel et les pilotes ALSA, FFADO, ...

[RESOLU] Envoi de commande midi par USB à un ampli Peavey VIP1

dude2000 utilisateur non connecté
Bonjour,

J'ai pour projet de fabrique une pédale pour piloter mon ampli de guitare Peavey VIP1 à l'aide d'un Raspberry Pi 3 (RP3) sous Raspbian.
L'idée est parti du fait que sous Windows il y a un logiciel fourni par Peavey pour piloter l'ampli (changer les réglages, de type d'ampli, envoyer une configuration complete)depuis le port USB (il y a un port USB sur l'ampli). Grace à un sniffer USB j'ai relever les codes envoyés
qui sont du type 0B B0 1A 00 -> permet de positionner le bouton LOW à 0 par exemple.
Je voudrai pouvoir envoyer ces code depuis mon RP3 à l'ampli afin qu'après aux moyen de boutons gérés par le RP3 j'envoi les commandes midi qui vont bien.
J’espère être clair lol.
Quand je branche l'ampli au RP3 il est bien vu avec les commande lsusb et dmesg.
Que dois-je installer pour pouvoir envoyer des choses sur le port USB ?
Je me perd un peu dans les nombreux logiciel (ALSA, JACK,...).
Faut-il un driver du constructeur ?

Merci d'avance pour vos réponses.

olinuxx utilisateur non connecté France
dude2000 écrit :
Quand je branche l'ampli au RP3 il est bien vu avec les commande lsusb et dmesg.


Met nous les retours des commandes en question.



dude2000 écrit :
Je me perd un peu dans les nombreux logiciel (ALSA, JACK,...).


Tu devras probablement utiliser la couche ALSA j'imagine. JACK ne communique pas directement avec le matériel, mais avec les couches de pilotes (ALSA, FFADO, OSS, ...).



dude2000 écrit :
Faut-il un driver du constructeur ?


Pour faire "quoi" ? L'utiliser ? Cette question est trop peu précise.

dude2000 utilisateur non connecté
Désolé pour la réponse tardive mais bon week-end prolongé tout ça...

Donc voici les réponses :

Avant branchement de l'ampli
pi@raspberrypi:~ $ lsusb
Bus 001 Device 005: ID 0a81:0101 Chesen Electronics Corp. Keyboard
Bus 001 Device 004: ID 062a:0001 Creative Labs Notebook Optical Mouse
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
pi@raspberrypi:~ $


Après branchement
pi@raspberrypi:~ $ lsusb
Bus 001 Device 005: ID 0a81:0101 Chesen Electronics Corp. Keyboard
Bus 001 Device 004: ID 062a:0001 Creative Labs Notebook Optical Mouse
Bus 001 Device 007: ID 1502:1208  
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
pi@raspberrypi:~ $


pi@raspberrypi:~ $ dmesg | tail -n 20
[    5.844767] Bluetooth: L2CAP socket layer initialized
[    5.844832] Bluetooth: SCO socket layer initialized
[    6.993703] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup
[    7.847812] Adding 102396k swap on /var/swap.  Priority:-2 extents:1 across:102396k SSFS
[    8.436898] smsc95xx 1-1.1:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0x41E1
[   21.334920] fuse init (API version 7.26)
[   24.478153] EXT4-fs (mmcblk0p5): mounted filesystem with ordered data mode. Opts: (null)
[   28.738324] random: crng init done
[   52.682918] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[   52.682932] Bluetooth: BNEP filters: protocol multicast
[   52.682956] Bluetooth: BNEP socket layer initialized
[  518.081867] usb 1-1.2: new full-speed USB device number 6 using dwc_otg
[  518.228310] usb 1-1.2: unable to read config index 0 descriptor/all
[  518.228326] usb 1-1.2: can't read configurations, error -32
[  518.541871] usb 1-1.2: new full-speed USB device number 7 using dwc_otg
[  518.728936] usb 1-1.2: New USB device found, idVendor=1502, idProduct=1208
[  518.728952] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  518.728961] usb 1-1.2: Product: VYPYR USB Interface
[  518.728969] usb 1-1.2: Manufacturer: Peavey
[  519.574361] usbcore: registered new interface driver snd-usb-audio
pi@raspberrypi:~ $


Voila, ce que je voudrais dans l'idéal c'est pouvoir y accéder pour y envoyer des caractères. Le problème est qu'il n’apparaît pas lorsque je fais
ls -l /dev.
Il me faudrait un /dev/ttyUSB0.

Je ne sais pas si je suis suffisant clair étant un peu novice sur Linux... mais plein de bonne volonté pour apprendre !

yruama utilisateur non connecté
Salut,

il faudrais voir ton ampli n'apparais pas comme periphérique midi. A cause du code envoyé, je suspecte que ca utilise du midi par USB. typiquement "0B B0 1A 00" correspond a un control change sur le canal midi n°1. Le numéro du controle change serais 26 et la valeur serais 0.

Nau utilisateur non connecté
Salut,

as-tu essayé d'utiliser gmidimonitor ou kmidimon? Tu verrais directement le type de signaux transmis.

Une fois avérée la communication par midi entre ton Rpi et ton ampli il te sera vraisemblablement facile de piloter les paramètres à l'aide de messages midi à partir d'une application tournant sur ton RPi. Basiquement tout séquenceur midi te le permettrait, et il serait également facile de créer une petite interface graphique personnelle pour le faire (je pourrai te faire des templates pour le logiciel puredata par exemple).

Mais je crois que ce n'est pas vraiment ce que tu veux, pas vrai? Tu veux faire un pédalier midi, et donc il te serait utile de chercher sur le net des pages expliquant comment d'autres ont interfacé des interrupteurs physiques avec le protocole midi avec un RPi pour y parvenir. Mon intuition est que tu as choisi une bécane pas vraiment plébiscitée pour ce genre d'application (surdimensionnée), ce qui pourrait rendre moins nombreuses les sources d'information que si tu avais prévu d'utiliser un arduino ou un teensy par exemple, qui sont à la base de pelletées de projets de ce genre.

Nau

dude2000 utilisateur non connecté
yruama écrit :
Salut,

il faudrais voir ton ampli n'apparais pas comme periphérique midi. A cause du code envoyé, je suspecte que ca utilise du midi par USB. typiquement "0B B0 1A 00" correspond a un control change sur le canal midi n°1. Le numéro du controle change serais 26 et la valeur serais 0.


Oui je pense que tu raison mais comment savoir s'il ai vu comme périphérique midi ?

Nau écrit :
Salut,

as-tu essayé d'utiliser gmidimonitor ou kmidimon? Tu verrais directement le type de signaux transmis.

Une fois avérée la communication par midi entre ton Rpi et ton ampli il te sera vraisemblablement facile de piloter les paramètres à l'aide de messages midi à partir d'une application tournant sur ton RPi. Basiquement tout séquenceur midi te le permettrait, et il serait également facile de créer une petite interface graphique personnelle pour le faire (je pourrai te faire des templates pour le logiciel puredata par exemple).

Mais je crois que ce n'est pas vraiment ce que tu veux, pas vrai? Tu veux faire un pédalier midi, et donc il te serait utile de chercher sur le net des pages expliquant comment d'autres ont interfacé des interrupteurs physiques avec le protocole midi avec un RPi pour y parvenir. Mon intuition est que tu as choisi une bécane pas vraiment plébiscitée pour ce genre d'application (surdimensionnée), ce qui pourrait rendre moins nombreuses les sources d'information que si tu avais prévu d'utiliser un arduino ou un teensy par exemple, qui sont à la base de pelletées de projets de ce genre.

Nau


Déjà si j'arrive à communiquer par USB je serai content, après on verra ce que j'en fais. je vais donc essayer les logiciels que tu me proposes.
Concernant le fait de prendre un Raspberry, je l'avais déjà donc c'est pour ça. Pour ce qui est des projets de pédale avec des Arduino en effet il y a plusieurs projets sur le net mais ils passe par le port série de l'Arduino et le port midi de l'ampli mais ça n'a pas l'air de marcher (apparemment c'est pas un port midi standard sur l'ampli) et en plus le port série du RPi3 pose quelques problèmes.

En tous cas merci pour vos réponses.

Nau utilisateur non connecté

dude200 écrit :
Oui je pense que tu raison mais comment savoir s'il ai vu comme périphérique midi ?


en utilisant gmidimonitor ou kmidimonitor, c'est assez direct.

dude200 écrit :
Déjà si j'arrive à communiquer par USB je serai content, après on verra ce que j'en fais. je vais donc essayer les logiciels que tu me proposes.
Concernant le fait de prendre un Raspberry, je l'avais déjà donc c'est pour ça. Pour ce qui est des projets de pédale avec des Arduino en effet il y a plusieurs projets sur le net mais ils passe par le port série de l'Arduino et le port midi de l'ampli mais ça n'a pas l'air de marcher (apparemment c'est pas un port midi standard sur l'ampli) et en plus le port série du RPi3 pose quelques problèmes.


Tu as raison pour ce qui est du port série etc, mais dans ton cas c'est du midiusb et donc pas de complication. Si tu veux essayer avec pure data voici un patch (comme on appelle ça) d'exemple qui envoie une valeur entre 0 et 127 au contrôle n°26 (comme l'avait remarqué yruama), sur le canal 1. Il te suffit de faire un copier-coller de ceci
#N canvas 1050 585 450 282 10;
#X obj 86 119 ctlout 26 1;
#X obj 69 56 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144
-1 -1 900 1;
#X floatatom 99 85 5 0 0 0 - - -;
#X connect 1 0 0 0;
#X connect 1 0 2 0;
dans un traitement de texte brut et de le sauvegarder avec une extension pd (ex: "CC26_canal_1.pd") pour pouvoir le charger dans pd (pure data) et tu obtiendras une tirette à manipuler de gauche à droite. (si au lieu de déplacer ton curseur ta souris déplace toute la tirette c'est que tu es en mode "édition", pour en sortir il faut faire ctrl+e)

Nau

dude2000 utilisateur non connecté
Donc quelques nouvelles, j'ai installé kmidimonitor et il voit bien mon ampli et lorsque je tourne un bouton de l'ampli il recoit bien les bonnes trames !
Par contre j'ai pas trouvé pour envoyer des données, est-ce possible ?

Donc après quelques recherche toujours dans l'optique d'envoyer une commande suivant un appui sur un bouton "physique",j'ai trouvé ça sur le site de ALSA

http://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2rawmidi_8c-example.html

Y a moyen de faire quelques choses ???

Nau utilisateur non connecté
Bien.

Pour envoyer des données à partir d'une interface graphique tu peux tester ce que je t'ai proposé, sinon grâce à toi j'ai découvert Ctrlr, qui me paraît magnifique mais ardu pour démarrer.

Pure data te permet de faire la même chose en quelques minutes (surtout que je peux te filer d'autres patches plus complets que le premier, que tu pourras facilement étendre en fonction de tes désirs avec de simples copier/coller et deux-trois modifs par imitation).

Pour ce qui est du code C que tu as dégotté, je n'ai pas d'avis car mon niveau ne me permet pas de l'évaluer en le survolant.

Par contre j'ai déjà interfacé des switches et des potards avec un autre ordi de poche similaire à un RPi (cubieboard 2) et j'étais passé par pure data, mais c'est par pure tropisme, et parce que par ailleurs le signal audio était également traité dans cet) environnement. Dans ton cas tu pourrais connecter un switch à une paire de pins du GPIO du RPi, monitorer dans Pd l'état du bit y associé (comme tu pourrais le faire en ligne de commande d'ailleurs, car à ce bit sera associé un fichier particulier dans ton arborescence qu'il suffira de lire), et faire en sorte que Pd envoie un message midi de ton choix en réponse.

Nau

Loki Harfagr utilisateur non connecté
Est-ce que amidi "voit" ton ampli ?

amidi -l



Si, oui, tu peux envoyer des commandes via amidi, par exemple en supposant que la commande ci-dessus aurait répondu
amidi -l
IO  hw:2,0,0  Peavey VIP1 USB MIDI 1


tu pourrais envoyer le code suggéré en exemple par vruama ainsi :
amidi -p hw:2 -S '0B B0 1A 00'




Ce qui peut donc se "scripter" ou programmer avec tes outils favoris par la suite (voire en lua dans un STAN)

yruama utilisateur non connecté
je rectifie le commentaire de Loki Harfagr, si le peavey est reconnu avec amidi, il faut envoyer directement du midi :
amidi -p hw:2 -S 'B0 1A 00'


la raison est que le '0B' de '0B B0 1A 00' est un entête d'encapsulation pour transmettre du midi par USB.

dude2000 utilisateur non connecté
Merci Loki Harfagr et yruama ça fonctionne avec amidi j'arrive a envoyer les commandes et l'ampli réagit (par contre avec ou sans le 0B ça marche aussi !
Donc j'ai regarder le code source de amidi et il utilise les mêmes fonctions que l'exemple que j'avais (http://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2rawmidi_8c-example.html ).
Lorsque je compile avec Geany j'ai des erreurs :

sudo gcc -Wall -o "amidi" "amidi.c" (dans le dossier : /home/pi/projets/Send_midi)
/tmp/cclGXJkO.o : Dans la fonction « list_device » :
amidi.c:(.text+0xfc) : référence indéfinie vers « snd_rawmidi_info_sizeof »
amidi.c:(.text+0x130) : référence indéfinie vers « snd_rawmidi_info_sizeof »
amidi.c:(.text+0x158) : référence indéfinie vers « snd_rawmidi_info_set_device »
amidi.c:(.text+0x168) : référence indéfinie vers « snd_rawmidi_info_set_stream »
amidi.c:(.text+0x178) : référence indéfinie vers « snd_ctl_rawmidi_info »
amidi.c:(.text+0x194) : référence indéfinie vers « snd_rawmidi_info_get_subdevices_count »
amidi.c:(.text+0x1b8) : référence indéfinie vers « snd_rawmidi_info_set_stream »
amidi.c:(.text+0x1c8) : référence indéfinie vers « snd_ctl_rawmidi_info »
amidi.c:(.text+0x1e4) : référence indéfinie vers « snd_rawmidi_info_get_subdevices_count »
amidi.c:(.text+0x24c) : référence indéfinie vers « snd_rawmidi_info_set_stream »
amidi.c:(.text+0x260) : référence indéfinie vers « snd_rawmidi_info_set_subdevice »
amidi.c:(.text+0x270) : référence indéfinie vers « snd_ctl_rawmidi_info »
amidi.c:(.text+0x288) : référence indéfinie vers « snd_strerror »
amidi.c:(.text+0x2b4) : référence indéfinie vers « snd_rawmidi_info_get_name »
amidi.c:(.text+0x2c4) : référence indéfinie vers « snd_rawmidi_info_get_subdevice_name »
/tmp/cclGXJkO.o : Dans la fonction « list_card_devices » :
amidi.c:(.text+0x42c) : référence indéfinie vers « snd_ctl_open »
amidi.c:(.text+0x444) : référence indéfinie vers « snd_strerror »
amidi.c:(.text+0x478) : référence indéfinie vers « snd_ctl_rawmidi_next_device »
amidi.c:(.text+0x490) : référence indéfinie vers « snd_strerror »
amidi.c:(.text+0x4d8) : référence indéfinie vers « snd_ctl_close »
/tmp/cclGXJkO.o : Dans la fonction « device_list » :
amidi.c:(.text+0x50c) : référence indéfinie vers « snd_card_next »
amidi.c:(.text+0x524) : référence indéfinie vers « snd_strerror »
amidi.c:(.text+0x570) : référence indéfinie vers « snd_card_next »
amidi.c:(.text+0x588) : référence indéfinie vers « snd_strerror »
/tmp/cclGXJkO.o : Dans la fonction « rawmidi_list » :
amidi.c:(.text+0x5cc) : référence indéfinie vers « snd_config_update »
amidi.c:(.text+0x5e4) : référence indéfinie vers « snd_strerror »
amidi.c:(.text+0x610) : référence indéfinie vers « snd_output_stdio_attach »
amidi.c:(.text+0x628) : référence indéfinie vers « snd_strerror »
amidi.c:(.text+0x654) : référence indéfinie vers « snd_config_search »
amidi.c:(.text+0x67c) : référence indéfinie vers « snd_config_save »
amidi.c:(.text+0x688) : référence indéfinie vers « snd_output_close »
amidi.c:(.text+0x6a0) : référence indéfinie vers « snd_config »
/tmp/cclGXJkO.o : Dans la fonction « main » :
amidi.c:(.text+0x1394) : référence indéfinie vers « snd_rawmidi_open »
amidi.c:(.text+0x13b4) : référence indéfinie vers « snd_strerror »
amidi.c:(.text+0x13f4) : référence indéfinie vers « snd_rawmidi_read »
amidi.c:(.text+0x1418) : référence indéfinie vers « snd_rawmidi_nonblock »
amidi.c:(.text+0x1430) : référence indéfinie vers « snd_strerror »
amidi.c:(.text+0x1464) : référence indéfinie vers « snd_rawmidi_write »
amidi.c:(.text+0x147c) : référence indéfinie vers « snd_strerror »
amidi.c:(.text+0x14d8) : référence indéfinie vers « snd_rawmidi_poll_descriptors_count »
amidi.c:(.text+0x1524) : référence indéfinie vers « snd_rawmidi_poll_descriptors »
amidi.c:(.text+0x1604) : référence indéfinie vers « snd_rawmidi_poll_descriptors_revents »
amidi.c:(.text+0x1628) : référence indéfinie vers « snd_strerror »
amidi.c:(.text+0x1674) : référence indéfinie vers « snd_rawmidi_read »
amidi.c:(.text+0x16a0) : référence indéfinie vers « snd_strerror »
amidi.c:(.text+0x1868) : référence indéfinie vers « snd_rawmidi_close »
amidi.c:(.text+0x1888) : référence indéfinie vers « snd_rawmidi_close »
collect2: error: ld returned 1 exit status
Compilation échouée.


Pourtant j'ai bien installé la librairie libasound2-dev et les fichiers .h sont présents. Le code est la : https://searchcode.com/codesearch/view/21948743/ .

Par contre je connais pas Lua quel est l'interet par rapport à un programme en C ?

Merci pour vos réponses !

[Edit] : C'est ok il fallait rajouter -lasound à la ligne de commande pour compiler ! Donc c'est bon mon programme fonctionne ! Lorsque j'aurai finalisé mon projet je ferai un post ça pourrait servir à d'autre personne. Encore merci à tous pour votre aide !~~

olinuxx utilisateur non connecté France
Bravo à tous.

@dude2000 : n'oublie pas de mettre un [RÉSOLU] dans le titre :
Note modération : le sujet étant résolu, merci d'ajouter un [RÉSOLU] (ou un [CONTOURNÉ], ou bien encore un [ABANDONNÉ]) dans le titre de ton premier message. Voir ce paragraphe du manuel du site pour davantage d'informations.