Forums > MaxMSP

Mackie Control again

February 12, 2006 | 6:15 am

I’ve searched the archives on this and did not find anyone actively
working on Max support for the Mackie Control. I’m pretty far along
on providing basic support, but the process has really made me
respect the seamless and deep support that Logic provides.

At any rate, if there are a couple of Mackie Control using Max-heads
that would like to beat on this and give me feedback, please get in
touch.

-C


Chris Muir | "There are many futures and only one status quo.
cbm@well.com | This is why conservatives mostly agree,
http://www.xfade.com | and radicals always argue." – Brian Eno


February 16, 2006 | 11:58 am

I got as far as writing the mxj code for speaking mackie-controllish (or
at least most of it). What I didn’t do before I wandered off to
something else was:
– state management
– any sort of UI.

This was because I couldn’t decide what level of generality would be
useful for maxxers: the MC manages none of its state (not even fader
position), which means that the behaviours are more or less arbitary.
Obviously, whilst it would be useful to present a model that functions
as a mixer interface, the spirit of max suggests that there should be an
easy way for users to set up different models for it that can be more
specifically tailored to their own work.

That said, if you’re really interested in getting at least some level of
support a la logic together (perhaps something that’s similar to the
motormix objects in concept), I’d be delighted to share what I’ve done
so far.


Owen


February 16, 2006 | 9:17 pm

Hello there

I’m afraid i’m not that much help cos I’ve just started writing a patch for the Behringer BCF2000 control surface (similar to mackie), and I’m running into problems –

can you tell me how to prevent midi feedback loops when sending parameters to and from the controller? This would be much appreciated.


February 17, 2006 | 9:23 am

The main thing is to ensure that the incoming midi data is not being
resent, but you shouldn’t need to do that. If you look at the patch I
posted I use a coll to store the banks of data, each one in its own
line. I only need to send data to the BCF2000 when I switch banks, to
return the faders to where they were when the new bank was last being
changed. I do this by sending out one line of the coll. New data is
also sent into the same line of the coll, but writing to coll does not
trigger output, so there is no loop. If you are using individual
objects to display the data you can produce a similar effect by putting
a ‘prepend set’ object before each one, which updates the object, but
doesn’t trigger output. I just think the coll + jit.cellblock approach
makes for a much simpler patch, but you might have good reasons for
doing it the other way.

Best

L

Lawrence Casserley – lawrence@lcasserley.co.uk
Lawrence Electronic Operations – http://www.lcasserley.co.uk
Colourscape Music Festivals – http://www.colourscape.org.uk


February 17, 2006 | 1:23 pm

You might want to adjust ‘dead-time’ parameter on your bcr/bcf. I won’t have
access to bcr until Monday, so can’t tell you exactly what you need to do,
but I think it was necessary to enter the global setup menu(EDIT and STORE),
and adjust the value with encoder 7. I think this info was somewhere in the
manual…

hth,
nesa


February 17, 2006 | 3:17 pm

On Feb 16, 2006, at 4:17 PM, Toby Scott wrote:

> can you tell me how to prevent midi feedback loops when sending
> parameters to and from the controller? This would be much appreciated.

in my patches i’ve just used [gate] on the input to prevent anything
from coming in when i’m sending out. on the output i do somthing like
[t 1 l 0] witht eh "0" and "1" connecting to the input gate’s control
inlet and the "l" being my outputs to the controller.

best,
jlm


February 17, 2006 | 4:07 pm

Off the top of my head – wouldn’t [grab] and a [number box] help you
do this?
I haven’t used it for a wile, but I seem to remember it as the best
way of isolating an input from being sent straight back out again.

David


February 18, 2006 | 4:30 pm

Thanks for your replies, I’ll give all the methods a go and see which one works best with my patch.

Cheers!


May 12, 2006 | 8:23 pm

Hello!
I just bought a BCF2000, sure of being able to use in Max, and in fact no way.. I should use to control 3D/video parameters, and need the surface to react bidirectionally..
i read archives about the bcf2000 and noticed Toby are implementing some objects to control it? Did you get to an end? Do you intend to share it?
Thanks for your help..
livio


May 13, 2006 | 7:03 pm

hello,

here’s something made for bcr2000, but it should work with bcf too.

this one sets controller properties, so you can for example set encoder
ranges from max:

#P window setfont "Sans Serif" 9.;
#P window linecount 1;
#P comment 95 149 27 9109513 type:;
#P user ubumenu 95 163 46 9109513 0 1 1 0;
#X add knob;
#X add button;
#X prefix_set 0 0 0;
#P comment 307 77 64 9109513 mode:;
#P comment 471 147 64 9109513 display mode;
#P comment 383 171 55 9109513 show value;
#P user ubumenu 187 107 40 9109513 0 1 1 0;
#X add CC;
#X add NRPN;
#X add AT;
#X add todo:add other strings;
#X prefix_set 0 0
0;
#P user ubumenu 367 147 100 9109513 0 1 1 0;
#X add 1dot;
#X add 1dot/off;
#X add 12dot;
#X add 12dot/off;
#X add bar;
#X add bar/off;
#X add spread;
#X add pan;
#X add qual;
#X add cut;
#X add damp;
#X add off;
#X prefix_set 0 0
0;
#P comment 307 137 34 9109513 max;
#P user ubumenu 307 97 100 9109513 0 1 1 0;
#X add absolute;
#X add absolute/14;
#X add relative-1;
#X add relative-1/14;
#X add relative-2;
#X add relative-2/14;
#X add relative-3;
#X add relative-3/14;
#X add toggleon;
#X add toggleoff;
#X add inc/dec;
#X prefix_set 1 0
0;
#P number 411 77 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P message 411 96 62 9109513 increment $1;
#P newex 102 240 45 9109513 loadbang;
#P newex 88 346 108 9109513 midiout "BCR2000 [01]";
#P user ubumenu 102 322 94 9109513 0 1 1 0;
#X prefix_set 0 0
0;
#P message 102 262 51 9109513 controllers;
#P newex 102 282 41 9109513 midiinfo;
#P toggle 367 171 15 0;
#P comment 269 135 34 9109513 min;
#P comment 221 135 34 9109513 cc par;
#P number 305 155 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P number 265 155 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P number 161 163 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P button 88 107 15 0;
#P number 223 155 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#N vpatcher 37 42 1191 718;
#P origin 1 0;
#P window setfont "Sans Serif" 9.;
#P newex 641 385 27 9109513 !- 2;
#P newex 641 407 56 9109513 gate 2 2;
#P newex 5 67 27 9109513 + 1;
#N comlet sysex bytes output , connect to midiout;
#P outlet 687 645 15 0;
#P window linecount 1;
#P newex 687 570 240 9109513 append 240 0 32 50 127 21 32 0 12 36 101 110
100 247;
#N comlet (sym) display mode , default:1dot;
#P inlet 774 407 15 0;
#P newex 687 431 61 9109513 t b l;
#N comlet show value(0/1);
#P inlet 704 167 15 0;
#P window linecount 0;
#P newex 189 543 321 9109513 prepend 240 0 32 50 127 21 32 0 9 32 32 46 101
97 115 121 112 97 114 32;
#N comlet (symbol) cntrl. type (CC , NRPN , AT…);
#P inlet 235 363 15 0;
#P window linecount 1;
#P newex 189 567 39 9109513 t b l;
#P newex 687 221 27 9109513 i 1;
#P newex 687 247 62 9109513 sel 1 0;
#P window linecount 0;
#P newex 189 439 56 9109513 zl reg 67 67;
#N comlet (symbol) mode , def. absolute;
#P inlet 564 362 15 0;
#P newex 687 459 97 9109513 zl reg 49 100 111 116;
#N comlet midi channel;
#P inlet 316 363 15 0;
#N comlet encoder number;
#P inlet 172 19 15 0;
#P newex 5 219 40 9109513 t b b l;
#N comlet 0 or 1 – encoder or button , def. encoder;
#P inlet 143 19 15 0;
#N comlet bang to send sysex to bcr;
#P inlet 51 19 15 0;
#P newex 5 137 56 9109513 gate 2 1;
#P newex 687 617 38 9109513 zl iter 1;
#P newex 51 65 50 9109513 t b l;
#P window linecount 1;
#N vpatcher 15 55 615 455;
#P outlet 45 230 15 0;
#P inlet 45 52 15 0;
#P window setfont "Sans Serif" 9.;
#P message 45 84 284 9109513 240 0 32 50 127 21 32 0 0 36 114 101 118 32 82
49 247 240 0 32 50 127 21 32 0 1 36 112 114 101 115 101 116 247 240 0 32 50
127 21 32 0 2 32 32 46 110 97 109 101 32 39 74 73 84 84 69 82 32 84 69 77 80
79 82 65 82 89 32 80 82 69 83 69 84 32 39 247 240 0 32 50 127 21 32 0 3 32
32 46 115 110 97 112 115 104 111 116 32 111 102 102 247 240 0 32 50 127 21
32 0 4 32 32 46 114 101 113 117 101 115 116 32 111 102 102 247 240 0 32 50
127 21 32 0 5 32 32 46 101 103 114 111 117 112 115 32 52 247 240 0 32 50 127
21 32 0 6 32 32 46 102 107 101 121 115 32 111 110 247 240 0 32 50 127 21 32
0 7 32 32 46 108 111 99 107 32 111 102 102 247;
#P connect 1 0 0 0;
#P connect 0 0 2 0;
#P pop;
#P newobj 51 43 72 9109513 p bcr200header;
#P comment 845 204 209 9109513 6. send ‘end’ sequence;
#P comment 845 188 209 9109513 5. set display mode(1dot , 2dot…) for
knobs only;
#P newex 687 522 56 9109513 append 247;
#P newex 774 432 40 9109513 atoi;
#P newex 687 492 282 9109513 prepend 240 0 32 50 127 21 32 0 11 32 32 46 109
111 100 101 32;
#P comment 802 408 119 9109513 display mode(only knobs):;
#P comment 745 524 153 9109513 sequence for display mode(knobs);
#P newex 713 272 27 9109513 t off;
#P newex 687 272 24 9109513 t on;
#P newex 687 358 56 9109513 append 247;
#P newex 687 300 40 9109513 atoi;
#P newex 687 328 367 9109513 prepend 240 0 32 50 127 21 32 0 10 32 32 46 115
104 111 119 118 97 108 117 101 32;
#P comment 743 274 100 9109513 show value;
#P comment 745 360 143 9109513 sequence for showvalue;
#P comment 845 172 166 9109513 4. set show value on/off;
#P comment 247 522 189 9109513 sequence for setting encoder or button info;
#P newex 235 384 40 9109513 atoi;
#P newex 189 520 56 9109513 append 247;
#P comment 195 424 54 9109513 default:CC;
#P comment 553 346 53 9109513 mode:;
#P newex 316 442 40 9109513 atoi;
#N comlet (int) maximum value;
#P inlet 502 362 15 0;
#P comment 501 346 53 9109513 high range:;
#N comlet (int)minimum value;
#P inlet 440 362 15 0;
#P comment 439 346 53 9109513 low range:;
#N comlet cc param. number;
#P inlet 378 362 15 0;
#P comment 377 346 53 9109513 parameter:;
#P newex 316 396 260 9109513 pack 1 0 0 127 absolute;
#P comment 315 346 44 9109513 channel:;
#P newex 189 496 137 9109513 zl join;
#P newex 189 466 51 9109513 append 32;
#P comment 109 544 76 9109513 easypar header:;
#P comment 845 156 166 9109513 3. set encoder data(type , range…);
#P newex 337 188 56 9109513 append 247;
#P newex 337 166 282 9109513 prepend 240 0 32 50 127 21 32 0 8 36 98 117 116
116 111 110 32;
#P comment 395 190 143 9109513 sequence for button id number;
#P comment 845 140 100 9109513 2. set encoder id;
#P comment 845 124 156 9109513 2. set encoder type(knob or button);
#P newex 5 190 56 9109513 append 247;
#P newex 51 88 131 9109513 i 1;
#P newex 51 110 40 9109513 atoi;
#P newex 5 168 300 9109513 prepend 240 0 32 50 127 21 32 0 8 36 101 110 99
111 100 101 114 32;
#P comment 183 90 100 9109513 encoder/button number;
#P comment 845 108 100 9109513 1. send header;
#P comment 77 190 143 9109513 sequence for encoder id number;
#P window linecount 0;
#P comment -13 119 100 9109513 1/2 enc/btn;
#P comment 929 572 100 9109513 end sequence;
#P comment 605 377 100 9109513 error in button logic;
#P fasten 53 0 70 0 148 38 10 38;
#P lcolor 9;
#P connect 70 0 51 0;
#P connect 51 0 6 0;
#P connect 6 0 9 0;
#P fasten 14 0 54 0 342 212 10 212;
#P connect 9 0 54 0;
#P connect 52 0 48 0;
#P connect 48 0 49 0;
#P connect 49 0 8 0;
#P connect 8 0 7 0;
#P connect 7 0 51 1;
#P connect 55 0 8 1;
#P fasten 54 0 59 0 10 420 194 420;
#P connect 59 0 17 0;
#P connect 17 0 18 0;
#P connect 18 0 30 0;
#P connect 30 0 64 0;
#P connect 64 0 62 0;
#P connect 63 0 31 0;
#P connect 31 0 59 1;
#P fasten 54 1 20 0 25 333 310 333 310 387 321 387;
#P connect 56 0 20 0;
#P connect 20 0 27 0;
#P connect 27 0 18 1;
#P fasten 51 1 13 0 56 161 342 161;
#P connect 13 0 14 0;
#P connect 22 0 20 1;
#P connect 24 0 20 2;
#P connect 26 0 20 3;
#P connect 58 0 20 4;
#P fasten 53 0 72 0 148 38 646 38;
#P lcolor 9;
#P connect 72 0 71 0;
#P fasten 62 0 61 0 194 593 622 593 622 211 692 211;
#P connect 61 0 60 0;
#P connect 60 0 39 0;
#P fasten 40 0 37 0 718 296 692 296;
#P connect 39 0 37 0;
#P connect 37 0 36 0;
#P connect 36 0 38 0;
#P connect 38 0 71 1;
#P connect 71 1 66 0;
#P connect 66 0 57 0;
#P connect 57 0 43 0;
#P connect 43 0 45 0;
#P fasten 71 0 68 0 646 556 692 556;
#P connect 45 0 68 0;
#P fasten 49 1 50 0 96 610 692 610;
#P lcolor 7;
#P fasten 62 1 50 0 223 605 692 605;
#P lcolor 7;
#P fasten 54 2 50 0 40 614 692 614;
#P lcolor 7;
#P fasten 66 1 50 0 743 602 692 602;
#P lcolor 7;
#P connect 68 0 50 0;
#P connect 50 0 69 0;
#P connect 65 0 61 1;
#P connect 60 1 40 0;
#P connect 67 0 44 0;
#P connect 44 0 57 1;
#P pop;
#P newobj 88 194 348 9109513 p bcr2000 setup;
#P comment 155 145 73 9109513 enc/btn number;
#P connect 19 1 1 10;
#P connect 16 0 15 0;
#P connect 9 0 1 9;
#P fasten 15 0 1 8 416 121 357 121;
#P connect 17 1 1 8;
#P connect 6 0 1 7;
#P connect 5 0 1 6;
#P connect 2 0 1 5;
#P connect 20 1 1 3;
#P connect 4 0 1 2;
#P fasten 24 0 1 1 100 185 126 185;
#P connect 10 0 12 0;
#P connect 11 0 10 0;
#P connect 14 0 11 0;
#P fasten 12 1 13 0 149 342 93 342;
#P lcolor 1;
#P connect 1 0 13 0;
#P connect 3 0 1 0;
#P window clipboard copycount 26;

and here is nrpn input abstraction, you can use it to send 14bit values,
wich might be necessary for what you’re doing. paste it and save it as
nrpin.pat:

#P window setfont "Sans Serif" 9.;
#P window linecount 1;
#P newex 273 159 64 9109513 split -1 16383;
#P newex 194 182 46 9109513 split 1 16;
#P newex 194 337 201 9109513 zl reg 176 99 nn 176 98 nn 176 6 nn 176 38 nn;
#P newex 211 309 192 9109513 sprintf %i 99 %s %i 98 %s %i 6 nn %i 38 nn;
#N comlet nrpn ID (0-16535);
#P inlet 159 133 15 0;
#N comlet midi channel;
#P inlet 120 132 15 0;
#N comlet nrpn value;
#P outlet 362 562 15 0;
#P newex 146 108 38 9109513 unpack;
#P newex 273 182 40 9109513 t b b i;
#P newex 194 207 27 9109513 t b i;
#P newex 303 215 52 9109513 sel -1;
#P newex 303 249 24 9109513 t nn;
#B color 9;
#P comment 365 269 44 9109513 id (hi&lo);
#B color 11;
#P newex 404 248 34 9109513 % 128;
#B color 11;
#P newex 345 249 27 9109513 >> 7;
#B color 11;
#P newex 211 232 31 9109513 + 175;
#P newex 362 505 73 9109513 +;
#P newex 362 465 27 9109513 < < 7;
#P newex 236 505 73 9109513 +;
#P newex 236 465 27 9109513 < < 7;
#P newex 194 421 248 9109513 unpack 176 99 0 176 98 0 176 6 0 176 38 0;
#P newex 194 361 57 9109513 prepend set;
#P newex 194 389 205 9109513 match 176 99 nn 176 98 nn 176 6 nn 176 38 nn;
#P newex 194 108 169 9109513 route channel ID;
#P button 146 53 15 0;
#P newex 146 77 76 9109513 patcherargs 1 -1;
#P window linecount 2;
#P comment 506 564 100 9109513 bcr2000 nrpn input , np2005;
#P window linecount 1;
#P newex 20 119 32 9109513 midiin;
#N comlet nrpn ID;
#P outlet 236 562 15 0;
#N comlet midi in inlet;
#P inlet 20 91 15 0;
#P comment 216 53 100 9109513 args: channel , nrpnID;
#P comment 241 234 25 9109513 chnl;
#P comment 311 78 114 9109513 -1 for all ids on a channel;
#P connect 12 11 16 1;
#P connect 22 1 18 0;
#P fasten 22 1 19 0 350 243 409 243;
#P connect 17 0 29 0;
#P fasten 17 0 29 2 216 302 288 302;
#P fasten 17 0 29 4 216 299 360 299;
#P fasten 17 0 29 5 216 296 396 296;
#P fasten 29 0 30 1 216 332 390 332;
#P connect 16 0 26 0;
#P connect 15 0 16 0;
#P connect 12 8 15 0;
#P fasten 21 0 29 1 308 285 252 285;
#P lcolor 12;
#P fasten 21 0 29 3 308 285 324 285;
#P lcolor 12;
#P fasten 19 0 29 3 409 285 324 285;
#P lcolor 12;
#P connect 22 0 21 0;
#P connect 24 2 22 0;
#P connect 12 5 14 1;
#P connect 32 0 24 0;
#P fasten 28 0 32 0 164 153 278 153;
#P lcolor 1;
#P fasten 25 1 32 0 179 135 278 135;
#P lcolor 1;
#P connect 9 1 32 0;
#P lcolor 1;
#P fasten 18 0 29 1 350 285 252 285;
#P lcolor 12;
#P connect 14 0 4 0;
#P connect 13 0 14 0;
#P connect 12 2 13 0;
#P fasten 24 1 29 0 293 275 216 275;
#P lcolor 7;
#P connect 23 1 17 0;
#P connect 10 0 12 0;
#P connect 11 0 10 0;
#P fasten 5 0 10 0 25 384 199 384;
#P connect 30 0 11 0;
#P fasten 24 0 30 0 278 267 199 267;
#P lcolor 7;
#P connect 23 0 30 0;
#P lcolor 7;
#P connect 31 0 23 0;
#P connect 9 0 31 0;
#P lcolor 2;
#P fasten 25 0 31 0 151 172 199 172;
#P lcolor 2;
#P fasten 27 0 31 0 125 176 199 176;
#P lcolor 2;
#P fasten 7 1 9 0 217 101 199 101;
#P connect 7 0 25 0;
#P connect 8 0 7 0;
#P connect 3 0 5 0;
#P window clipboard copycount 33;

and something that will be help file(nrpin.help):
#P window setfont Geneva 9.;
#P window linecount 1;
#P comment 152 243 100 9961481 nrpn value:;
#P newex 114 38 57 9961481 loadmess 1;
#P window setfont "Sans Serif" 9.;
#P user umenu 79 94 100 9109543 1 64 110 1;
#P newex 79 71 45 9109513 midiinfo;
#P comment 11 53 100 9109513 click "1" to get list;
#P comment 310 74 100 9109513 args: channel , nrpnID;
#P comment 308 91 114 9109513 -1 for all ids on a channel;
#P number 499 273 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P number 450 220 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 450 174 59 9109513 nrpnin 1 911;
#P number 371 273 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P number 322 221 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 322 175 59 9109513 nrpnin 1 900;
#P number 211 242 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P number 169 186 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 169 140 52 9109513 nrpnin 1 -1;
#P window setfont Geneva 9.;
#P comment 123 187 100 9961481 nrpn ID;
#P comment 519 368 58 9961481 alpha…;
#P connect 14 0 15 0;
#P connect 16 0 14 1;
#P connect 15 1 2 0;
#P connect 2 0 3 0;
#P connect 2 1 4 0;
#P connect 5 0 6 0;
#P connect 5 1 7 0;
#P connect 8 0 9 0;
#P connect 8 1 10 0;
#P window clipboard copycount 18;

this is unfinished stuff, so it probably doesn’t work quite good. for bcf
related object, you should check excellent jasch collection: http://www.jasch.ch

best,
nesa


Viewing 10 posts - 1 through 10 (of 10 total)