Native Instruments Rig Kontrol 3 sous Linux
Le RigKontrol3
est un pédalier et une carte son USB, créé en par Native Instruments en 2007. Malheureusement la marque ne fournit plus aucun support pour les OS récents.
Alors direction la déchetterie tout de suite ou on fait appel à la communauté du logiciel libre ?
Ce constructeur a bonne réputation sur la qualité de ses produits, que ce soit logiciel ou matériel, mais comme souvent le support est court et nous invite à renouveler notre matériel ou nous incite à mettre à jour le logiciel. C'est dommage car ce pédalier/carte son est de très bonne facture, mais bloqué à MacOS Sierra (2016). Il n'est plus du tout reconnu par les MacOS récents. Je n'ai pas étudié le support côté MS Windows mais ça doit être la même, et côté Linux, Hallelujah, le module snd_usb_caiaq
du projet ALSA
fournit un support de pas mal de matériel Native Instruments.
D'autre part je suis tombé sur ce projet GitHub rigkontrol3-linux-midicontroller qui m'a donné envie d'essayer !
Sous Debian 12 (Rasperry Pi OS + précisemment)
Clône du dépôt
1git clone https://github.com/rstets/rigkontrol3-linux-midicontroller
2cd rigkontrol3-linux-midicontroller
Installation d'une dépendance
1sudo apt install libasound2-dev
Compilation, un avertissement, mais pas bloquant
1$ make
2gcc -o rigkontrol3d rigkontrol3d.c -lasound
3rigkontrol3d.c: In function ‘daemonize’:
4rigkontrol3d.c:75:9: warning: implicit declaration of function ‘umask’ [-Wimplicit-function-declaration]
5 75 | umask(0);
6 | ^~~~~
Installation
1$ sudo make install
2install -g root -o root -m 644 ./rigkontrol3@.service /lib/systemd/system/rigkontrol3@.service
3install -g root -o root -m 644 ./90-rigkontrol3.rules /lib/udev/rules.d/90-rigkontrol3.rules
4install -g root -o root -m 755 ./rigkontrol3d /usr/local/bin/rigkontrol3d
5udevadm control --reload-rules
6systemctl daemon-reload
Bonne nouvelle il est déjà reconnu
1$ lsusb
2Bus 001 Device 005: ID 17cc:1940 Native Instruments RigKontrol3
js0
et event1
sont apparu à la connexion de l'appareil
1$ ll /dev/input/
2total 0
3drwxr-xr-x 2 root root 80 Aug 17 12:57 by-path
4crw-rw---- 1 root input 13, 64 Aug 1 05:30 event0
5crw-rw---- 1 root input 13, 65 Aug 17 12:57 event1
6crw-rw---- 1 root input 13, 0 Aug 17 12:57 js0
7crw-rw---- 1 root input 13, 63 Aug 1 05:30 mice
1$ dmesg
2[337272.882150] usb 1-1.2: new high-speed USB device number 5 using dwc_otg
3[337273.012994] usb 1-1.2: New USB device found, idVendor=17cc, idProduct=1940, bcdDevice= 0.0b
4[337273.013030] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=5
5[337273.013044] usb 1-1.2: Product: RigKontrol3
6[337273.013054] usb 1-1.2: Manufacturer: Native Instruments
7[337273.013064] usb 1-1.2: SerialNumber: SN-wdmbtyst
8[337273.182769] input: RigKontrol3 as /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/input/input1
9[337273.183717] usbcore: registered new interface driver snd-usb-caiaq
Bug
1$ rigkontrol3d /dev/input/event1
2RigKontrol3 Events could not be grabbed.
Un reboot plus tard le bug a disparu ... (et le contrôleur s'appelle event0
maintenant).
Le programme est sensé générer des notes midi. Pour faciliter le debug, j'ajoute des simples printf
sur la sortie standard :
1$ git diff
2diff --git a/rigkontrol3d.c b/rigkontrol3d.c
3index 510af11..ce2af7e 100644
4--- a/rigkontrol3d.c
5+++ b/rigkontrol3d.c
6@@ -181,55 +181,64 @@ int main(int argc, char *argv[])
7 case EV_KEY:
8 switch (ie.code)
9 {
10- case KEY_1:
11+ case KEY_1: // "5 / PREV"
12+ printf("KEY_1: %d (%d)\n", ie.value, KEY_1);
13 if (ie.value)
14 snd_seq_ev_set_noteon(&ev, CHANNEL, BUTTON_5, 127);
15 else
16 snd_seq_ev_set_noteoff(&ev, CHANNEL, BUTTON_5, 64);
17 break;
18- case KEY_2:
19+ case KEY_2: // "6 / NEXT"
20+ printf("KEY_2: %d (%d)\n", ie.value, KEY_2);
21 if (ie.value)
22 snd_seq_ev_set_noteon(&ev, CHANNEL, BUTTON_6, 127);
23 else
24 snd_seq_ev_set_noteoff(&ev, CHANNEL, BUTTON_6, 64);
25 break;
26- case KEY_3:
27+ case KEY_3: // "7 / TUNER"
28+ printf("KEY_3: %d (%d)\n", ie.value, KEY_3);
29 if (ie.value)
30 snd_seq_ev_set_noteon(&ev, CHANNEL, BUTTON_7, 127);
31 else
32 snd_seq_ev_set_noteoff(&ev, CHANNEL, BUTTON_7, 64);
33 break;
34- case KEY_4:
35+ case KEY_4: // "8 / TAP"
36+ printf("KEY_4: %d (%d)\n", ie.value, KEY_4);
37 if (ie.value)
38 snd_seq_ev_set_noteon(&ev, CHANNEL, BUTTON_8, 127);
39 else
40 snd_seq_ev_set_noteoff(&ev, CHANNEL, BUTTON_8, 64);
41 break;
42- case KEY_5:
43+ case KEY_5: // "1"
44+ printf("KEY_5: %d (%d)\n", ie.value, KEY_5);
45 if (ie.value)
46 snd_seq_ev_set_noteon(&ev, CHANNEL, BUTTON_1, 127);
47 else
48 snd_seq_ev_set_noteoff(&ev, CHANNEL, BUTTON_1, 64);
49 break;
50- case KEY_6:
51+ case KEY_6: // "2"
52+ printf("KEY_6: %d (%d)\n", ie.value, KEY_6);
53 if (ie.value)
54 snd_seq_ev_set_noteon(&ev, CHANNEL, BUTTON_2, 127);
55 else
56 snd_seq_ev_set_noteoff(&ev, CHANNEL, BUTTON_2, 64);
57 break;
58- case KEY_7:
59+ case KEY_7: // "3"
60+ printf("KEY_7: %d (%d)\n", ie.value, KEY_7);
61 if (ie.value)
62 snd_seq_ev_set_noteon(&ev, CHANNEL, BUTTON_3, 127);
63 else
64 snd_seq_ev_set_noteoff(&ev, CHANNEL, BUTTON_3, 64);
65 break;
66- case KEY_8:
67+ case KEY_8: // "4"
68+ printf("KEY_8: %d (%d)\n", ie.value, KEY_8);
69 if (ie.value)
70 snd_seq_ev_set_noteon(&ev, CHANNEL, BUTTON_4, 127);
71 else
72 snd_seq_ev_set_noteoff(&ev, CHANNEL, BUTTON_4, 64);
73 break;
74 case KEY_9:
75+ printf("KEY_9: %d (%d)\n", ie.value, KEY_9);
76 if (ie.value)
77 snd_seq_ev_set_noteon(&ev, CHANNEL, BUTTON_9, 127);
78 else
79@@ -262,6 +271,7 @@ int main(int argc, char *argv[])
80 if (val != expressionPedalLastVal)
81 snd_seq_ev_set_controller(&ev, CHANNEL, EXPRESSION_COARSE, val);
82 }
83+ printf("Expression: %d\n", val);
84 expressionPedalLastVal = val;
85 break;
86 }
Et voici, après recompilation, le résultat à l'écran qui suit bien mes différents appuis et relachements des boutons.
1$ ./rigkontrol3d /dev/input/event0
2KEY_5: 1 (6)
3KEY_5: 0 (6)
4KEY_6: 1 (7)
5KEY_6: 0 (7)
6KEY_7: 1 (8)
7KEY_8: 1 (9)
8Expression: 0
9Expression: 0
10KEY_8: 0 (9)
11KEY_7: 0 (8)
12KEY_1: 1 (2)
13KEY_1: 0 (2)
14KEY_2: 1 (3)
15KEY_2: 0 (3)
16Expression: 0
17KEY_3: 1 (4)
18KEY_3: 0 (4)
19KEY_4: 1 (5)
20Expression: 0
21KEY_4: 0 (5)
22Expression: 0
23Expression: 0
24Expression: 2
25Expression: 3
26Expression: 4
27Expression: 6
28Expression: 7
La correspondance entre les constantes KEY_x
et l'étiquette des boutons :
KEY_1
=5 / PREV
KEY_2
=6 / NEXT
KEY_3
=7 / TUNER
KEY_4
=8 / TAP
KEY_5
=1
KEY_6
=2
KEY_7
=3
KEY_8
=4
KEY_9
= bouton sous la pédale d'expression
Limites
À ce stade :
- Je n'ai pas testé les entrées/sorties audio de la carte son. Elle est cependant reconnue par ALSA (
alsamixer
) - Je n'ai pas testé les entrées/sorties MIDI
- Je ne sais pas comment interagir avec les leds (tous les voyants sont éteints)
À suivre ...
Librekontrol
à tester ...
1wget http://www.librekontrol.org/files/librekontrol-0.2.1.tar.gz
2tar fvxz librekontrol-0.2.1.tar.gz
3cd librekontrol-0.2.1
4sudo apt install libevdev-dev guile-2.2-dev
5./configure
6make
7sudo make install
Ressources
- https://fr.audiofanzine.com/pedalier-controleur/native-instruments/rig-kontrol-3/
- https://www.alsa-project.org/main/index.php/Matrix:Module-usb-caiaq
- http://www.midimanuals.com/manuals/native_instruments/rig_kontrol_3/guitar_rig_5_manual_french/guitar_rig_5_rig_kontrol_3_manual_french.pdf
- https://www.librekontrol.org/
- https://github.com/aFunkyBass/rk2-modep-control/blob/main/RigKontrolCapture.py