diff options
-rw-r--r-- | README.md | 17 | ||||
-rw-r--r-- | backends/midi.c | 35 | ||||
-rw-r--r-- | configs/launchctl-sacn.cfg | 48 | ||||
-rw-r--r-- | configs/midi-osc.cfg | 32 | ||||
-rw-r--r-- | configs/osc-kbd.cfg | 24 | ||||
-rw-r--r-- | configs/unifest-17.cfg | 288 |
6 files changed, 239 insertions, 205 deletions
@@ -245,11 +245,19 @@ The MIDI backend supports multiple channel types * `note` - Note On/Off messages * `nrpn` - NRPNs (not yet implemented) -A channel is specified using `<type><channel>.<index>`. +A channel is specified using the syntax `channel<channel>.<type><index>`. The shorthand `ch` may be used instead +of `channel`. +The earlier syntax of `<type><channel>.<index>` is officially deprecated but still supported for compatability +reasons. This support may be removed at some future time. -Example mapping: +Channels range from `0` to `15`. Each channel consists of 128 notes (numbered `0` through `127`) and 128 CC's +(numbered likewise), a channel pressure control (also called 'channel aftertouch') and a pitch control. +Each Note also has an additional pressure value associated with it. + +Example mappings: ``` -midi1.cc0.9 > midi2.note1.4 +midi1.ch0.note9 > midi2.channel1.cc4 +midi1.channel15.cc1 > midi1.channel0.note0 ``` #### Known bugs / problems @@ -259,7 +267,8 @@ a configuration option at a later time. NRPNs are not yet fully implemented, though rudimentary support is in the codebase. -The channel specification syntax is currently a bit clunky. +To see which events your MIDI devices output, ALSA provides the `aseqdump` utility. You can +list all incoming events using `aseqdump -p <portname>`. ### The `evdev` backend diff --git a/backends/midi.c b/backends/midi.c index d856ced..ad7f6fe 100644 --- a/backends/midi.c +++ b/backends/midi.c @@ -118,19 +118,30 @@ static channel* midi_channel(instance* instance, char* spec){ .label = 0 }; + //support deprecated syntax for a transition period... + uint8_t old_syntax = 0; char* channel; - if(!strncmp(spec, "cc", 2)){ + if(!strncmp(spec, "ch", 2)){ + channel = spec + 2; + if(!strncmp(spec, "channel", 7)){ + channel = spec + 7; + } + } + else if(!strncmp(spec, "cc", 2)){ ident.fields.type = cc; channel = spec + 2; + old_syntax = 1; } else if(!strncmp(spec, "note", 4)){ ident.fields.type = note; channel = spec + 4; + old_syntax = 1; } else if(!strncmp(spec, "nrpn", 4)){ ident.fields.type = nrpn; channel = spec + 4; + old_syntax = 1; } else{ fprintf(stderr, "Unknown MIDI channel specification %s\n", spec); @@ -138,19 +149,33 @@ static channel* midi_channel(instance* instance, char* spec){ } ident.fields.channel = strtoul(channel, &channel, 10); - - //FIXME test this - if(ident.fields.channel > 16){ + if(ident.fields.channel > 15){ fprintf(stderr, "MIDI channel out of range in channel spec %s\n", spec); return NULL; } if(*channel != '.'){ - fprintf(stderr, "Need MIDI channel specification of form channel.control, had %s\n", spec); + fprintf(stderr, "Need MIDI channel specification of form channel<X>.<control><Y>, had %s\n", spec); return NULL; } + //skip the period channel++; + if(!old_syntax){ + if(!strncmp(channel, "cc", 2)){ + ident.fields.type = cc; + channel += 2; + } + else if(!strncmp(channel, "note", 4)){ + ident.fields.type = note; + channel += 4; + } + else if(!strncmp(channel, "nrpn", 4)){ + ident.fields.type = nrpn; + channel += 4; + } + } + ident.fields.control = strtoul(channel, NULL, 10); if(ident.label){ diff --git a/configs/launchctl-sacn.cfg b/configs/launchctl-sacn.cfg index 164b477..c2dec84 100644 --- a/configs/launchctl-sacn.cfg +++ b/configs/launchctl-sacn.cfg @@ -18,28 +18,28 @@ priority = 100 [map] -lc.cc0.0 > out.1 -lc.cc0.1 > out.2 -lc.cc0.2 > out.3 -lc.cc0.3 > out.4 -lc.cc0.4 > out.5 -lc.cc0.5 > out.6 -lc.cc0.6 > out.7 -lc.cc0.7 > out.8 -lc.cc0.8 > out.9 -lc.cc0.9 > out.10 -lc.cc0.10 > out.11 -lc.cc0.11 > out.12 -lc.cc0.12 > out.13 -lc.cc0.13 > out.14 -lc.cc0.14 > out.15 -lc.cc0.15 > out.16 +lc.ch0.cc0 > out.1 +lc.ch0.cc1 > out.2 +lc.ch0.cc2 > out.3 +lc.ch0.cc3 > out.4 +lc.ch0.cc4 > out.5 +lc.ch0.cc5 > out.6 +lc.ch0.cc6 > out.7 +lc.ch0.cc7 > out.8 +lc.ch0.cc8 > out.9 +lc.ch0.cc9 > out.10 +lc.ch0.cc10 > out.11 +lc.ch0.cc11 > out.12 +lc.ch0.cc12 > out.13 +lc.ch0.cc13 > out.14 +lc.ch0.cc14 > out.15 +lc.ch0.cc15 > out.16 -lc.note0.0 > out.1 -lc.note0.1 > out.2 -lc.note0.2 > out.3 -lc.note0.3 > out.4 -lc.note0.4 > out.5 -lc.note0.5 > out.6 -lc.note0.6 > out.7 -lc.note0.7 > out.8 +lc.ch0.note0 > out.1 +lc.ch0.note1 > out.2 +lc.ch0.note2 > out.3 +lc.ch0.note3 > out.4 +lc.ch0.note4 > out.5 +lc.ch0.note5 > out.6 +lc.ch0.note6 > out.7 +lc.ch0.note7 > out.8 diff --git a/configs/midi-osc.cfg b/configs/midi-osc.cfg index 215daa9..755077c 100644 --- a/configs/midi-osc.cfg +++ b/configs/midi-osc.cfg @@ -33,20 +33,20 @@ write = BCF [map] -bcf.cc0.81 <> touch./fader1 -bcf.cc0.82 <> touch./fader2 -bcf.cc0.83 <> touch./fader3 -bcf.cc0.84 <> touch./fader4 -bcf.cc0.85 <> touch./fader5 -bcf.cc0.86 <> touch./fader6 -bcf.cc0.87 <> touch./fader7 -bcf.cc0.88 <> touch./fader8 +bcf.ch0.cc81 <> touch./fader1 +bcf.ch0.cc82 <> touch./fader2 +bcf.ch0.cc83 <> touch./fader3 +bcf.ch0.cc84 <> touch./fader4 +bcf.ch0.cc85 <> touch./fader5 +bcf.ch0.cc86 <> touch./fader6 +bcf.ch0.cc87 <> touch./fader7 +bcf.ch0.cc88 <> touch./fader8 -bcf.cc0.81 <> touch./multifader1/1 -bcf.cc0.82 <> touch./multifader1/2 -bcf.cc0.83 <> touch./multifader1/3 -bcf.cc0.84 <> touch./multifader1/4 -bcf.cc0.85 <> touch./multifader1/5 -bcf.cc0.86 <> touch./multifader1/6 -bcf.cc0.87 <> touch./multifader1/7 -bcf.cc0.88 <> touch./multifader1/8 +bcf.ch0.cc81 <> touch./multifader1/1 +bcf.ch0.cc82 <> touch./multifader1/2 +bcf.ch0.cc83 <> touch./multifader1/3 +bcf.ch0.cc84 <> touch./multifader1/4 +bcf.ch0.cc85 <> touch./multifader1/5 +bcf.ch0.cc86 <> touch./multifader1/6 +bcf.ch0.cc87 <> touch./multifader1/7 +bcf.ch0.cc88 <> touch./multifader1/8 diff --git a/configs/osc-kbd.cfg b/configs/osc-kbd.cfg index 0abd131..eb80378 100644 --- a/configs/osc-kbd.cfg +++ b/configs/osc-kbd.cfg @@ -11,15 +11,15 @@ bind = * 8000 dest = learn@8001 [map] -pad./1/push1 > out.note0.60 -pad./1/push2 > out.note0.61 -pad./1/push3 > out.note0.62 -pad./1/push4 > out.note0.63 -pad./1/push5 > out.note0.64 -pad./1/push6 > out.note0.65 -pad./1/push7 > out.note0.66 -pad./1/push8 > out.note0.67 -pad./1/push9 > out.note0.68 -pad./1/push10 > out.note0.69 -pad./1/push11 > out.note0.70 -pad./1/push12 > out.note0.71 +pad./1/push1 > out.ch0.note60 +pad./1/push2 > out.ch0.note61 +pad./1/push3 > out.ch0.note62 +pad./1/push4 > out.ch0.note63 +pad./1/push5 > out.ch0.note64 +pad./1/push6 > out.ch0.note65 +pad./1/push7 > out.ch0.note66 +pad./1/push8 > out.ch0.note67 +pad./1/push9 > out.ch0.note68 +pad./1/push10 > out.ch0.note69 +pad./1/push11 > out.ch0.note70 +pad./1/push12 > out.ch0.note71 diff --git a/configs/unifest-17.cfg b/configs/unifest-17.cfg index 1fab484..47e9ec2 100644 --- a/configs/unifest-17.cfg +++ b/configs/unifest-17.cfg @@ -40,156 +40,156 @@ read = 36:1 [map] ; ArtNet -claudius.1 < lc1.cc0.1 -claudius.2 < lc1.cc0.2 -claudius.3 < lc1.cc0.3 -claudius.4 < lc1.cc0.4 -claudius.5 < lc1.cc0.5 -claudius.6 < lc1.cc0.6 -claudius.7 < lc1.cc0.7 -claudius.8 < lc1.cc0.8 -claudius.9 < lc1.cc0.9 -claudius.10 < lc1.cc0.10 -claudius.11 < lc1.cc0.11 -claudius.12 < lc1.cc0.12 -claudius.13 < lc1.cc0.13 -claudius.14 < lc1.cc0.14 -claudius.15 < lc1.cc0.15 -claudius.16 < lc1.cc0.16 +claudius.1 < lc1.ch0.cc1 +claudius.2 < lc1.ch0.cc2 +claudius.3 < lc1.ch0.cc3 +claudius.4 < lc1.ch0.cc4 +claudius.5 < lc1.ch0.cc5 +claudius.6 < lc1.ch0.cc6 +claudius.7 < lc1.ch0.cc7 +claudius.8 < lc1.ch0.cc8 +claudius.9 < lc1.ch0.cc9 +claudius.10 < lc1.ch0.cc10 +claudius.11 < lc1.ch0.cc11 +claudius.12 < lc1.ch0.cc12 +claudius.13 < lc1.ch0.cc13 +claudius.14 < lc1.ch0.cc14 +claudius.15 < lc1.ch0.cc15 +claudius.16 < lc1.ch0.cc16 ; BCF Fader -out.note0.0 < bcf1.cc0.81 -out.note0.1 < bcf1.cc0.82 -out.note0.2 < bcf1.cc0.83 -out.note0.3 < bcf1.cc0.84 -out.note0.4 < bcf1.cc0.85 -out.note0.5 < bcf1.cc0.86 -out.note0.6 < bcf1.cc0.87 -out.note0.7 < bcf1.cc0.88 -out.note0.8 < bcf2.cc0.81 -out.note0.9 < bcf2.cc0.82 -out.note0.10 < bcf2.cc0.83 -out.note0.11 < bcf2.cc0.84 -out.note0.12 < bcf2.cc0.85 -out.note0.13 < bcf2.cc0.86 -out.note0.14 < bcf2.cc0.87 -out.note0.15 < bcf2.cc0.88 +out.ch0.ch0.note< bcf1.ch0.cc81 +out.ch0.note1 < bcf1.ch0.cc82 +out.ch0.note2 < bcf1.ch0.cc83 +out.ch0.note3 < bcf1.ch0.cc84 +out.ch0.note4 < bcf1.ch0.cc85 +out.ch0.note5 < bcf1.ch0.cc86 +out.ch0.note6 < bcf1.ch0.cc87 +out.ch0.note7 < bcf1.ch0.cc88 +out.ch0.note8 < bcf2.ch0.cc81 +out.ch0.note9 < bcf2.ch0.cc82 +out.ch0.note10 < bcf2.ch0.cc83 +out.ch0.note11 < bcf2.ch0.cc84 +out.ch0.note12 < bcf2.ch0.cc85 +out.ch0.note13 < bcf2.ch0.cc86 +out.ch0.note14 < bcf2.ch0.cc87 +out.ch0.note15 < bcf2.ch0.cc88 ; LC Rotary -out.note0.16 < lc1.cc0.1 -out.note0.17 < lc1.cc0.2 -out.note0.18 < lc1.cc0.3 -out.note0.19 < lc1.cc0.4 -out.note0.20 < lc1.cc0.5 -out.note0.21 < lc1.cc0.6 -out.note0.22 < lc1.cc0.7 -out.note0.23 < lc1.cc0.8 -out.note0.24 < lc1.cc0.9 -out.note0.25 < lc1.cc0.10 -out.note0.26 < lc1.cc0.11 -out.note0.27 < lc1.cc0.12 -out.note0.28 < lc1.cc0.13 -out.note0.29 < lc1.cc0.14 -out.note0.30 < lc1.cc0.15 -out.note0.31 < lc1.cc0.16 -out.note0.32 < lc2.cc0.1 -out.note0.33 < lc2.cc0.2 -out.note0.34 < lc2.cc0.3 -out.note0.35 < lc2.cc0.4 -out.note0.36 < lc2.cc0.5 -out.note0.37 < lc2.cc0.6 -out.note0.38 < lc2.cc0.7 -out.note0.39 < lc2.cc0.8 -out.note0.40 < lc2.cc0.9 -out.note0.41 < lc2.cc0.10 -out.note0.42 < lc2.cc0.11 -out.note0.43 < lc2.cc0.12 -out.note0.44 < lc2.cc0.13 -out.note0.45 < lc2.cc0.14 -out.note0.46 < lc2.cc0.15 -out.note0.47 < lc2.cc0.16 +out.ch0.note16 < lc1.ch0.cc1 +out.ch0.note17 < lc1.ch0.cc2 +out.ch0.note18 < lc1.ch0.cc3 +out.ch0.note19 < lc1.ch0.cc4 +out.ch0.note20 < lc1.ch0.cc5 +out.ch0.note21 < lc1.ch0.cc6 +out.ch0.note22 < lc1.ch0.cc7 +out.ch0.note23 < lc1.ch0.cc8 +out.ch0.note24 < lc1.ch0.cc9 +out.ch0.note25 < lc1.ch0.cc10 +out.ch0.note26 < lc1.ch0.cc11 +out.ch0.note27 < lc1.ch0.cc12 +out.ch0.note28 < lc1.ch0.cc13 +out.ch0.note29 < lc1.ch0.cc14 +out.ch0.note30 < lc1.ch0.cc15 +out.ch0.note31 < lc1.ch0.cc16 +out.ch0.note32 < lc2.ch0.cc1 +out.ch0.note33 < lc2.ch0.cc2 +out.ch0.note34 < lc2.ch0.cc3 +out.ch0.note35 < lc2.ch0.cc4 +out.ch0.note36 < lc2.ch0.cc5 +out.ch0.note37 < lc2.ch0.cc6 +out.ch0.note38 < lc2.ch0.cc7 +out.ch0.note39 < lc2.ch0.cc8 +out.ch0.note40 < lc2.ch0.cc9 +out.ch0.note41 < lc2.ch0.cc10 +out.ch0.note42 < lc2.ch0.cc11 +out.ch0.note43 < lc2.ch0.cc12 +out.ch0.note44 < lc2.ch0.cc13 +out.ch0.note45 < lc2.ch0.cc14 +out.ch0.note46 < lc2.ch0.cc15 +out.ch0.note47 < lc2.ch0.cc16 ; LC Button -out.note0.48 < lc1.note0.0 -out.note0.49 < lc1.note0.1 -out.note0.50 < lc1.note0.2 -out.note0.51 < lc1.note0.3 -out.note0.52 < lc1.note0.4 -out.note0.53 < lc1.note0.5 -out.note0.54 < lc1.note0.6 -out.note0.55 < lc1.note0.7 +out.ch0.note48 < lc1.ch0.note0 +out.ch0.note49 < lc1.ch0.note1 +out.ch0.note50 < lc1.ch0.note2 +out.ch0.note51 < lc1.ch0.note3 +out.ch0.note52 < lc1.ch0.note4 +out.ch0.note53 < lc1.ch0.note5 +out.ch0.note54 < lc1.ch0.note6 +out.ch0.note55 < lc1.ch0.note7 -out.note0.56 < lc2.note0.0 -out.note0.57 < lc2.note0.1 -out.note0.58 < lc2.note0.2 -out.note0.59 < lc2.note0.3 -out.note0.60 < lc2.note0.4 -out.note0.61 < lc2.note0.5 -out.note0.62 < lc2.note0.6 -out.note0.63 < lc2.note0.7 +out.ch0.note56 < lc2.ch0.note0 +out.ch0.note57 < lc2.ch0.note1 +out.ch0.note58 < lc2.ch0.note2 +out.ch0.note59 < lc2.ch0.note3 +out.ch0.note60 < lc2.ch0.note4 +out.ch0.note61 < lc2.ch0.note5 +out.ch0.note62 < lc2.ch0.note6 +out.ch0.note63 < lc2.ch0.note7 ; Launchpad -out.note0.64 < pad.note0.0 -out.note0.65 < pad.note0.1 -out.note0.66 < pad.note0.2 -out.note0.67 < pad.note0.3 -out.note0.68 < pad.note0.4 -out.note0.69 < pad.note0.5 -out.note0.70 < pad.note0.6 -out.note0.71 < pad.note0.7 -out.note0.72 < pad.note0.16 -out.note0.73 < pad.note0.17 -out.note0.74 < pad.note0.18 -out.note0.75 < pad.note0.19 -out.note0.76 < pad.note0.20 -out.note0.77 < pad.note0.21 -out.note0.78 < pad.note0.22 -out.note0.79 < pad.note0.23 -out.note0.80 < pad.note0.32 -out.note0.81 < pad.note0.33 -out.note0.82 < pad.note0.34 -out.note0.83 < pad.note0.35 -out.note0.84 < pad.note0.36 -out.note0.85 < pad.note0.37 -out.note0.86 < pad.note0.38 -out.note0.87 < pad.note0.39 -out.note0.88 < pad.note0.48 -out.note0.89 < pad.note0.49 -out.note0.90 < pad.note0.50 -out.note0.91 < pad.note0.51 -out.note0.92 < pad.note0.52 -out.note0.93 < pad.note0.53 -out.note0.94 < pad.note0.54 -out.note0.95 < pad.note0.55 -out.note0.96 < pad.note0.64 -out.note0.97 < pad.note0.65 -out.note0.98 < pad.note0.66 -out.note0.99 < pad.note0.67 -out.note0.100 < pad.note0.68 -out.note0.101 < pad.note0.69 -out.note0.102 < pad.note0.70 -out.note0.103 < pad.note0.71 -out.note0.104 < pad.note0.80 -out.note0.105 < pad.note0.81 -out.note0.106 < pad.note0.82 -out.note0.107 < pad.note0.83 -out.note0.108 < pad.note0.84 -out.note0.109 < pad.note0.85 -out.note0.110 < pad.note0.86 -out.note0.111 < pad.note0.87 -out.note0.112 < pad.note0.96 -out.note0.113 < pad.note0.97 -out.note0.114 < pad.note0.98 -out.note0.115 < pad.note0.99 -out.note0.116 < pad.note0.100 -out.note0.117 < pad.note0.101 -out.note0.118 < pad.note0.102 -out.note0.119 < pad.note0.103 -out.note0.120 < pad.note0.112 -out.note0.121 < pad.note0.113 -out.note0.122 < pad.note0.114 -out.note0.123 < pad.note0.115 -out.note0.124 < pad.note0.116 -out.note0.125 < pad.note0.117 -out.note0.126 < pad.note0.118 -out.note0.127 < pad.note0.119 +out.ch0.note64 < pad.ch0.note0 +out.ch0.note65 < pad.ch0.note1 +out.ch0.note66 < pad.ch0.note2 +out.ch0.note67 < pad.ch0.note3 +out.ch0.note68 < pad.ch0.note4 +out.ch0.note69 < pad.ch0.note5 +out.ch0.note70 < pad.ch0.note6 +out.ch0.note71 < pad.ch0.note7 +out.ch0.note72 < pad.ch0.note16 +out.ch0.note73 < pad.ch0.note17 +out.ch0.note74 < pad.ch0.note18 +out.ch0.note75 < pad.ch0.note19 +out.ch0.note76 < pad.ch0.note20 +out.ch0.note77 < pad.ch0.note21 +out.ch0.note78 < pad.ch0.note22 +out.ch0.note79 < pad.ch0.note23 +out.ch0.note80 < pad.ch0.note32 +out.ch0.note81 < pad.ch0.note33 +out.ch0.note82 < pad.ch0.note34 +out.ch0.note83 < pad.ch0.note35 +out.ch0.note84 < pad.ch0.note36 +out.ch0.note85 < pad.ch0.note37 +out.ch0.note86 < pad.ch0.note38 +out.ch0.note87 < pad.ch0.note39 +out.ch0.note88 < pad.ch0.note48 +out.ch0.note89 < pad.ch0.note49 +out.ch0.note90 < pad.ch0.note50 +out.ch0.note91 < pad.ch0.note51 +out.ch0.note92 < pad.ch0.note52 +out.ch0.note93 < pad.ch0.note53 +out.ch0.note94 < pad.ch0.note54 +out.ch0.note95 < pad.ch0.note55 +out.ch0.note96 < pad.ch0.note64 +out.ch0.note97 < pad.ch0.note65 +out.ch0.note98 < pad.ch0.note66 +out.ch0.note99 < pad.ch0.note67 +out.ch0.note100 < pad.ch0.note68 +out.ch0.note101 < pad.ch0.note69 +out.ch0.note102 < pad.ch0.note70 +out.ch0.note103 < pad.ch0.note71 +out.ch0.note104 < pad.ch0.note80 +out.ch0.note105 < pad.ch0.note81 +out.ch0.note106 < pad.ch0.note82 +out.ch0.note107 < pad.ch0.note83 +out.ch0.note108 < pad.ch0.note84 +out.ch0.note109 < pad.ch0.note85 +out.ch0.note110 < pad.ch0.note86 +out.ch0.note111 < pad.ch0.note87 +out.ch0.note112 < pad.ch0.note96 +out.ch0.note113 < pad.ch0.note97 +out.ch0.note114 < pad.ch0.note98 +out.ch0.note115 < pad.ch0.note99 +out.ch0.note116 < pad.ch0.note100 +out.ch0.note117 < pad.ch0.note101 +out.ch0.note118 < pad.ch0.note102 +out.ch0.note119 < pad.ch0.note103 +out.ch0.note120 < pad.ch0.note112 +out.ch0.note121 < pad.ch0.note113 +out.ch0.note122 < pad.ch0.note114 +out.ch0.note123 < pad.ch0.note115 +out.ch0.note124 < pad.ch0.note116 +out.ch0.note125 < pad.ch0.note117 +out.ch0.note126 < pad.ch0.note118 +out.ch0.note127 < pad.ch0.note119 |