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 !

Native Instruments Rig Kontrol 3

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

comments powered by Disqus