Skip to main content

5 - Les serveurs son : JACK, PipeWire, PulseAudio et autres...


Configurer JACK pour enregistrement audio+MIDI de clavier/batterie et utilisation d'applis de bureau

Bonjour,



J'ai un clavier et une batterie branchés en MIDI et en "audio" sur ma carte son Behringer.
Je cherche à enregistrer ces instruments en utilisant Reaper. Je suis sous Xubuntu 20.

Sans lancer Jack, en sélectionnant PulseAudio comme système audio dans les paramètres de Reaper, apparaît alors la ligne "hw:U192k" (ma carte son) dans les périphériques MIDI (je suis toujours dans les paramètres de Reaper). Je peux alors activer ce périphérique MIDI. Puis sur une piste Reaper, le bouton FX me permet d'ajouter le VSTi Carla-Patchbay, de connecter un "MDA Piano" entre la sortie de mon input MIDI et l'output Audio, et j'entends bien mon clavier. Avec une bonne latence. 😊
Une piste côte-à-côte qui enregistre l'entrée "audio" fonctionne également, sans la latence du MIDI.

Tout ça pour dire que je pense que mes branchements sont corrects, le matos compatible, les potards au bon niveau, etc.


En suivant les instructions de cette page (https://doc.ubuntu-fr.org/jackd#jack_sink), j'ai réussi à ce qu'en lançant le serveur Jack, j'ai toujours le son des applis "de bureau" (VLC, Chrome...), et que ça fonctionne toujours quand je quitte Jack.

Étape suivante : je n'arrive pour l'instant pas à faire jouer mon clavier MIDI sous Reaper si je lance Jack. Je le lance pour l'instant via Qjackctl. J'ai Ubuntu Studio Control installé mais la solution pour avoir les applis bureau citée ci-dessus fonctionnait avec QJackctl, je préfère donc commencer par là. (J'ai l'impression qu'Ubuntu Studio Control propose aussi un pont de PulseAudio vers Jack, mais ça ne marchait pas du premier coup, bref.)

Je lance donc le serveur Jack, puis j'ouvre Reaper. Dans les paramètres audio, je sélectionne Jack comme système audio. Du coup, je ne vois plus la ligne "hw:U192k" dans la liste des périphériques MIDI, seulement du "MIDI Input 1", "Midi Input 2". J'ai beau essayer d'en activer, puis de les assigner aux pistes Reaper, je n'entends rien.

Et là je manque d'inspiration pour savoir quoi essayer ensuite. 😊


Mon graphe Jack ressemble à ça :
Graphe Qjackctl Reaper Midi

Copy to clipboard
cat /proc/asound/cards

Copy to clipboard
0 [PCH ]: HDA-Intel - HDA Intel PCH HDA Intel PCH at 0xb1214000 irq 141 1 [U192k ]: USB-Audio - UMC204HD 192k BEHRINGER UMC204HD 192k at usb-0000:00:14.0-7, high speed


Copy to clipboard
ls /etc/security/limits.d

Copy to clipboard
audio.conf


Copy to clipboard
cat ~/.config/rncbc.org/QjackCtl.conf

Copy to clipboard
[Defaults] ConnectionsTabPage=0 MessagesStatusTabPage=0 PatchbayPath= SessionSaveVersion=true [Geometry] qjackctlConnectionsForm\geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x18\0\0\x2\x1d\0\0\x1W\0\0\0\x1\0\0\0\x18\0\0\x2\x1d\0\0\x1W\0\0\0\0\0\0\0\0\a\x80\0\0\0\x1\0\0\0\x18\0\0\x2\x1d\0\0\x1W) qjackctlConnectionsForm\visible=false qjackctlGraphForm\geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x18\0\0\a\x7f\0\0\x4\r\0\0\0\0\0\0\0\x18\0\0\a\x7f\0\0\x4\r\0\0\0\0\x2\0\0\0\a\x80\0\0\0\0\0\0\0\x18\0\0\a\x7f\0\0\x4\r) qjackctlGraphForm\visible=false qjackctlMainForm\geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x4g\0\0\x2\xd8\0\0\x6g\0\0\x3W\0\0\x4h\0\0\x2\xf0\0\0\x6\x66\0\0\x3V\0\0\0\0\0\0\0\0\a\x80\0\0\x4h\0\0\x2\xf0\0\0\x6\x66\0\0\x3V) qjackctlMainForm\visible=true qjackctlMessagesStatusForm\geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x18\0\0\a\x7f\0\0\x4\r\0\0\0\0\0\0\0\x18\0\0\a\x7f\0\0\x4\r\0\0\0\0\x2\0\0\0\a\x80\0\0\0\0\0\0\0\x18\0\0\a\x7f\0\0\x4\r) qjackctlMessagesStatusForm\visible=false qjackctlPatchbayForm\geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x2\x63\0\0\x1r\0\0\x5\x1b\0\0\x2\xb1\0\0\x2\x63\0\0\x1r\0\0\x5\x1b\0\0\x2\xb1\0\0\0\0\0\0\0\0\a\x80\0\0\x2\x63\0\0\x1r\0\0\x5\x1b\0\0\x2\xb1) qjackctlPatchbayForm\visible=false qjackctlSessionForm\geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x2\n\0\0\x1X\0\0\0\x1\0\0\0\x18\0\0\x2\t\0\0\x1W\0\0\0\0\0\0\0\0\a\x80\0\0\0\x1\0\0\0\x18\0\0\x2\t\0\0\x1W) qjackctlSessionForm\visible=false [GraphCanvas] CanvasRect=@Variant(\0\0\0\x14\xc0\x8e\xf8\0\0\0\0\0\xc0jp\0\0\0\0\0@\x96\x66\0\0\0\0\0@\x8a\xc8\0\0\0\0\0) CanvasZoom=1 [GraphColors] 0x1b8e6271=#006b00 0x3499f961=#006b6b 0x678f332=#6b006b 0x8c2bd0df=#6b6b00 0x9111e0b4=#6b0000 [GraphLayout] qjackctlGraphForm=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\0\0\0\a\x80\0\0\x3\x9e\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x1\0\0\0\x2\0\0\0\x1\0\0\0\xe\0T\0o\0o\0l\0\x42\0\x61\0r\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0) [GraphNodePos] 129%3AClient-129=@Variant(\0\0\0\x1a\xc0\x30\0\0\0\0\0\0\xc0(\0\0\0\0\0\0) 14%3AMidi%20Through%3AInput=@Variant(\0\0\0\x1a@s\xf0\0\0\0\0\0\xc0O\x80\0\0\0\0\0) 14%3AMidi%20Through%3AOutput=@Variant(\0\0\0\x1a\xc0q\xa0\0\0\0\0\0\xc0P\0\0\0\0\0\0) 20%3AUMC204HD%20192k%3AInput=@Variant(\0\0\0\x1a@t \0\0\0\0\0\xc0g`\0\0\0\0\0) 20%3AUMC204HD%20192k%3AOutput=@Variant(\0\0\0\x1a\xc0q\xc0\0\0\0\0\0\xc0\x66 \0\0\0\0\0) PulseAudio%20JACK%20Sink="@Variant(\0\0\0\x1a\xc0$\0\0\0\0\0\0\xc0,\0\0\0\0\0\0)" PulseAudio%20JACK%20Sink-01=@Variant(\0\0\0\x1a@\x1c\0\0\0\0\0\0@|\xe0\0\0\0\0\0) PulseAudio%20JACK%20Source=@Variant(\0\0\0\x1a\xc0\x14\0\0\0\0\0\0@r0\0\0\0\0\0) PulseAudio%20JACK%20Source-01=@Variant(\0\0\0\x1a\xc0\x82@\0\0\0\0\0@g\0\0\0\0\0\0) REAPER=@Variant(\0\0\0\x1a\xc0&\0\0\0\0\0\0@Y\x80\0\0\0\0\0) pulse_in=@Variant(\0\0\0\x1a\xc0@\0\0\0\0\0\0\xc0`\xc0\0\0\0\0\0) pulse_out=@Variant(\0\0\0\x1a\xc0\x1c\0\0\0\0\0\0@C\x80\0\0\0\0\0) system%3AInput=@Variant(\0\0\0\x1a@s`\0\0\0\0\0@c\xa0\0\0\0\0\0) system%3AOutput=@Variant(\0\0\0\x1a\xc0x\x10\0\0\0\0\0@f`\0\0\0\0\0) [GraphView] Menubar=true SortOrder=0 SortType=0 Statusbar=true TextBesideIcons=true Toolbar=true ZoomRange=false [History] MessagesLogPathComboBox\Item1=qjackctl.log PostShutdownScriptShellComboBox\Item1=pacmd suspend false PostStartupScriptShellComboBox\Item1=pactl load-module module-jack-sink && pactl load-module module-jack-source && pactl set-default-sink jack_out && pacmd set-default-source jack_in && pacmd list-sink-inputs | grep index | sed 's/ *index: *//g' | xargs -I{} pacmd move-sink-input \"{}\" jack_out PostStartupScriptShellComboBox\Item2=pactl set-default-sink jack_out ServerConfigNameComboBox\Item1=.jackdrc ServerNameComboBox\Item1=(default) ServerPrefixComboBox\Item1=/usr/bin/jackd ServerPrefixComboBox\Item2=jackd ServerPrefixComboBox\Item3=jackdmp ServerPrefixComboBox\Item4=jackstart XrunRegexComboBox\Item1=xrun of at least ([0-9|\\.]+) msecs XrunRegexComboBox\Item2=d\xe9synchronisation (XRUN) d'au moins ([0-9|\\.]+) ms [Options] ActivePatchbay=false ActivePatchbayPath= ActivePatchbayReset=false AliasesEditing=false AliasesEnabled=false AlsaSeqEnabled=true BaseFontSize=0 BezierLines=false ConnectionsFont="Sans Serif,10,-1,5,75,0,0,0,0,0" ConnectionsIconSize=0 CustomColorTheme= CustomStyleTheme= DBusEnabled=true DisplayBlink=true DisplayEffect=true DisplayFont1="Sans Serif,12,-1,5,75,0,0,0,0,0" DisplayFont2="Sans Serif,6,-1,5,75,0,0,0,0,0" GraphButton=true JackClientPortAlias=0 JackClientPortMetadata=false JackDBusEnabled=true KeepOnTop=false LeftButtons=true MessagesFont="Monospace,8,-1,5,75,0,0,0,0,0" MessagesLimit=true MessagesLimitLines=1000 MessagesLog=false MessagesLogPath=qjackctl.log PostShutdownScript=true PostShutdownScriptShell=pacmd suspend false PostStartupScript=true PostStartupScriptShell=pactl load-module module-jack-sink && pactl load-module module-jack-source && pactl set-default-sink jack_out && pacmd set-default-source jack_in && pacmd list-sink-inputs | grep index | sed 's/ *index: *//g' | xargs -I{} pacmd move-sink-input \"{}\" jack_out QueryClose=true QueryDisconnect=true QueryRestart=false QueryShutdown=true RightButtons=true ServerConfig=true ServerConfigName=.jackdrc ServerConfigTemp=false ShutdownScript=false ShutdownScriptShell= Singleton=true StartJack=false StartMinimized=false StartupScript=false StartupScriptShell= StdoutCapture=true StopJack=true SystemTray=false SystemTrayQueryClose=true TextLabels=true TimeDisplay=0 TimeFormat=0 TransportButtons=true XrunRegex=xrun of at least ([0-9|\\.]+) msecs [Presets] DefPreset=(default) [Program] Version=0.9.1 [Settings] Audio=0 Chan=0 Dither=0 Driver=alsa Frames=1024 HWMeter=false HWMon=false IgnoreHW=false InChannels=0 InDevice= InLatency=0 Interface=hw:U192k MidiDriver=aucun Monitor=false NoMemLock=false OutChannels=0 OutDevice= OutLatency=0 Periods=2 PortMax=256 Priority=5 Realtime=true SampleRate=44100 Server=/usr/bin/jackd ServerName= ServerSuffix= Shorts=false SoftMode=false StartDelay=2 Timeout=500 UnlockMem=false Verbose=false Wait=21333 WordLength=16 [Splitter] AlsaConnectView\sizes=38, 20, 38 AudioConnectView\sizes=268, 92, 268 InfraClientSplitter\sizes=128, 151 MidiConnectView\sizes=38, 20, 38 PatchbayView\sizes=38, 20, 38



Mon premier problème à résoudre est donc de "trouver l'accès" à mon clavier MIDI. 😊

Merci de votre aide !
France
Bonjour lmGuillaume,

si je lis bien ton graph de connection, tu dois connecter l'entrée midi N°20 qui s'appelle aussi MIDI1 (en haut à gauche) de carte son avec l'entree midi rouge de Reaper.
Merci jujudusud,


C'est-à-dire, dans le graphe, en faisant un glisser-déposer de l'entrée en haut à gauche vers l'entrée midi rouge de Reaper ?

J'ai essayé, mais ça "n'accroche pas" la connexion quand je relâche sur l'entrée Reaper.
France
Le pont ALSA-MIDI->JACK-MIDI semble ne pas être lancé.
Peut être que cette commande pourra résoudre le problème :
Copy to clipboard
a2j -e

France
Ce serait le pont alsa midi -> Jack midi qui manque ?
Copy to clipboard
a2jmidid -e &

sinon il n'est pas possible de demander à Reaper d'attendre du midi venant de ALSA directement ?
France
sinon il n'est pas possible de demander à Reaper d'attendre du midi venant de ALSA directement ?

Pas si JACK est démarré et que Reaper est configuré pour communiquer avec JACK (sans le pont ALSA->JACK). Par contre, si Reaper est configuré sur ALSA, c'est ALSA-MIDI qui sera fonctionnel.
Merci, avec la ligne complète à exécuter après démarrage de JACK, ça fonctionne :
Copy to clipboard
pactl load-module module-jack-sink && pactl load-module module-jack-source && pactl set-default-sink jack_out && pacmd set-default-source jack_in && pacmd list-sink-inputs | grep index | sed 's/ *index: *//g' | xargs -I{} pacmd move-sink-input "{}" jack_out && a2jmidid -e &


Est-ce que je dois fermer ce pont MIDI derrière moi après l'extinction de JACK ? Pour l'instant j'ai ça :
Copy to clipboard
pacmd suspend false


J'avais de la latence avec la config par défaut 1024 / 44100 * 2.

J'ai suivi ces instructions : https://doc.ubuntu-fr.org/jackd#optimisation

À 16 / 48000 * 3, pas de latence, mais ça crépitait dans tous les sens.
À 32 / 48000 * 3, pas de latence, pas de crépitements, mais quelques XRUNS :
Copy to clipboard
16:07:00.435 Script post-démarrage terminé avec succès. 16:07:00.436 Changement des connexions JACK. 16:07:18.501 Changement du graphe des connexions JACK. 16:07:18.570 Changement du graphe des connexions JACK. 16:07:18.738 Changement des connexions JACK. 16:07:18.790 Récupération désynchronisation (XRUN) (1). 16:07:20.560 Récupération de désynchronisation (XRUN) (15 sauté). 16:07:30.899 Récupération désynchronisation (XRUN) (17). 16:07:38.779 Récupération désynchronisation (XRUN) (18). 16:07:41.951 Récupération désynchronisation (XRUN) (19). 16:07:47.196 Récupération désynchronisation (XRUN) (20). 16:07:48.693 Récupération de désynchronisation (XRUN) (2 sauté). 16:07:57.379 Récupération désynchronisation (XRUN) (23). 16:07:58.743 Récupération de désynchronisation (XRUN) (3 sauté). 16:08:03.754 Récupération désynchronisation (XRUN) (27). 16:08:04.775 Récupération de désynchronisation (XRUN) (8 sauté). 16:08:58.380 Récupération désynchronisation (XRUN) (36). 16:08:59.050 Récupération de désynchronisation (XRUN) (4 sauté). 16:09:52.720 Récupération désynchronisation (XRUN) (41). 16:09:59.380 Récupération désynchronisation (XRUN) (42). 16:10:01.357 Récupération de désynchronisation (XRUN) (5 sauté). 16:10:14.707 Récupération désynchronisation (XRUN) (48). 16:11:00.379 Récupération désynchronisation (XRUN) (49). 16:11:01.665 Récupération de désynchronisation (XRUN) (3 sauté). 16:11:04.491 Récupération désynchronisation (XRUN) (53). 16:11:05.699 Récupération de désynchronisation (XRUN) (1 sauté). 16:11:47.439 Récupération désynchronisation (XRUN) (55). 16:11:47.879 Récupération de désynchronisation (XRUN) (1 sauté). 16:12:01.380 Récupération désynchronisation (XRUN) (58). 16:12:01.924 Récupération de désynchronisation (XRUN) (6 sauté).


Si j'ai bien compris, je fais monter la quantité d'échantillons jusqu'à ce que je n'aie plus de XRUN, mais avant d'entendre la latence.

Youpi. Prochaine étape, mettre batterie+clavier à la suite, car je n'ai qu'une entrée MIDI sur ma carte son. Au boulot. 😊
France
C'est chouette ! 😊

Alors pour répondre à tes questions,

le pont, tu peux le laisser ouvert... ça pose aucun problème ou le fermer ... bref, comme tu veux.
Cela dit, dans la page ubuntu, il disent que ça permet de relancer Pulseaudio quand tu fermes Jack. pourquoi s'en priver ?

Pour la taille de "Frames/Périod" le nombre d'échantillons par cycle, il faut y aller tranquillement.
128 représente un minimum chez moi. je n'entends plus de latence depuis un moment...
France
Bonjour, tu peux monter encore un peu.
Tu arrêtes quand la latence se fait entendre et tu met la valeur précédent la plus faible.