5 #include "mackie_surface.h"
6 #include "surface_port.h"
7 #include "mackie_midi_builder.h"
9 using namespace Mackie;
12 MackieSurface::display_timecode( SurfacePort & port, MackieMidiBuilder & builder, const std::string & timecode, const std::string & timecode_last )
14 port.write( builder.timecode_display( port, timecode, timecode_last ) );
18 MackieSurface::scaled_delta( const ControlState & state, float current_speed )
20 return state.sign * ( std::pow( float(state.ticks + 1), 2 ) + current_speed ) / 100.0;
24 Mackie::MackieSurface::init_controls()
30 // intialise groups and strips
33 // make sure there are enough strips
36 group = new Group ("user");
37 groups["user"] = group;
39 group = new Group ("assignment");
40 groups["assignment"] = group;
42 group = new Group ("none");
43 groups["none"] = group;
45 group = new MasterStrip ("master", 0);
46 groups["master"] = group;
47 strips[0] = dynamic_cast<Strip*> (group);
49 group = new Group ("cursor");
50 groups["cursor"] = group;
53 group = new Group ("functions");
54 groups["functions"] = group;
56 group = new Group ("automation");
57 groups["automation"] = group;
60 group = new Group ("display");
61 groups["display"] = group;
63 group = new Group ("transport");
64 groups["transport"] = group;
66 group = new Group ("modifiers");
67 groups["modifiers"] = group;
69 group = new Group ("bank");
70 groups["bank"] = group;
72 group = groups["none"];
73 pot = new Jog (1, "jog", *group);
75 controls.push_back (pot);
76 controls_by_name["jog"] = pot;
79 group = groups["none"];
80 pot = new Pot (1, "external", *group);
82 controls.push_back (pot);
83 controls_by_name["external"] = pot;
86 group = groups["assignment"];
87 button = new Button (1, "io", *group);
88 buttons[0x28] = button;
89 controls.push_back (button);
90 controls_by_name["io"] = button;
93 group = groups["assignment"];
94 button = new Button (1, "sends", *group);
95 buttons[0x29] = button;
96 controls.push_back (button);
97 controls_by_name["sends"] = button;
100 group = groups["assignment"];
101 button = new Button (1, "pan", *group);
102 buttons[0x2a] = button;
103 controls.push_back (button);
104 controls_by_name["pan"] = button;
105 group->add (*button);
107 group = groups["assignment"];
108 button = new Button (1, "plugin", *group);
109 buttons[0x2b] = button;
110 controls.push_back (button);
111 controls_by_name["plugin"] = button;
112 group->add (*button);
114 group = groups["assignment"];
115 button = new Button (1, "eq", *group);
116 buttons[0x2c] = button;
117 controls.push_back (button);
118 controls_by_name["eq"] = button;
119 group->add (*button);
121 group = groups["assignment"];
122 button = new Button (1, "dyn", *group);
123 buttons[0x2d] = button;
124 controls.push_back (button);
125 controls_by_name["dyn"] = button;
126 group->add (*button);
128 group = groups["bank"];
129 button = new Button (1, "left", *group);
130 buttons[0x2e] = button;
131 controls.push_back (button);
132 controls_by_name["left"] = button;
133 group->add (*button);
135 group = groups["bank"];
136 button = new Button (1, "right", *group);
137 buttons[0x2f] = button;
138 controls.push_back (button);
139 controls_by_name["right"] = button;
140 group->add (*button);
142 group = groups["bank"];
143 button = new Button (1, "channel_left", *group);
144 buttons[0x30] = button;
145 controls.push_back (button);
146 controls_by_name["channel_left"] = button;
147 group->add (*button);
149 group = groups["bank"];
150 button = new Button (1, "channel_right", *group);
151 buttons[0x31] = button;
152 controls.push_back (button);
153 controls_by_name["channel_right"] = button;
154 group->add (*button);
156 group = groups["none"];
157 button = new Button (1, "flip", *group);
158 buttons[0x32] = button;
159 controls.push_back (button);
160 controls_by_name["flip"] = button;
161 group->add (*button);
163 group = groups["none"];
164 button = new Button (1, "edit", *group);
165 buttons[0x33] = button;
166 controls.push_back (button);
167 controls_by_name["edit"] = button;
168 group->add (*button);
170 group = groups["display"];
171 button = new Button (1, "name_value", *group);
172 buttons[0x34] = button;
173 controls.push_back (button);
174 controls_by_name["name_value"] = button;
175 group->add (*button);
177 group = groups["display"];
178 button = new Button (1, "timecode_beats", *group);
179 buttons[0x35] = button;
180 controls.push_back (button);
181 controls_by_name["timecode_beats"] = button;
182 group->add (*button);
184 group = groups["none"];
185 button = new Button (1, "F1", *group);
186 buttons[0x36] = button;
187 controls.push_back (button);
188 controls_by_name["F1"] = button;
189 group->add (*button);
191 group = groups["none"];
192 button = new Button (1, "F2", *group);
193 buttons[0x37] = button;
194 controls.push_back (button);
195 controls_by_name["F2"] = button;
196 group->add (*button);
198 group = groups["none"];
199 button = new Button (1, "F3", *group);
200 buttons[0x38] = button;
201 controls.push_back (button);
202 controls_by_name["F3"] = button;
203 group->add (*button);
205 group = groups["none"];
206 button = new Button (1, "F4", *group);
207 buttons[0x39] = button;
208 controls.push_back (button);
209 controls_by_name["F4"] = button;
210 group->add (*button);
212 group = groups["none"];
213 button = new Button (1, "F5", *group);
214 buttons[0x3a] = button;
215 controls.push_back (button);
216 controls_by_name["F5"] = button;
217 group->add (*button);
219 group = groups["none"];
220 button = new Button (1, "F6", *group);
221 buttons[0x3b] = button;
222 controls.push_back (button);
223 controls_by_name["F6"] = button;
224 group->add (*button);
226 group = groups["none"];
227 button = new Button (1, "F7", *group);
228 buttons[0x3c] = button;
229 controls.push_back (button);
230 controls_by_name["F7"] = button;
231 group->add (*button);
233 group = groups["none"];
234 button = new Button (1, "F8", *group);
235 buttons[0x3d] = button;
236 controls.push_back (button);
237 controls_by_name["F8"] = button;
238 group->add (*button);
240 group = groups["none"];
241 button = new Button (1, "F9", *group);
242 buttons[0x3e] = button;
243 controls.push_back (button);
244 controls_by_name["F9"] = button;
245 group->add (*button);
247 group = groups["none"];
248 button = new Button (1, "F10", *group);
249 buttons[0x3f] = button;
250 controls.push_back (button);
251 controls_by_name["F10"] = button;
252 group->add (*button);
254 group = groups["none"];
255 button = new Button (1, "F11", *group);
256 buttons[0x40] = button;
257 controls.push_back (button);
258 controls_by_name["F11"] = button;
259 group->add (*button);
261 group = groups["none"];
262 button = new Button (1, "F12", *group);
263 buttons[0x41] = button;
264 controls.push_back (button);
265 controls_by_name["F12"] = button;
266 group->add (*button);
268 group = groups["none"];
269 button = new Button (1, "F13", *group);
270 buttons[0x42] = button;
271 controls.push_back (button);
272 controls_by_name["F13"] = button;
273 group->add (*button);
275 group = groups["none"];
276 button = new Button (1, "F14", *group);
277 buttons[0x43] = button;
278 controls.push_back (button);
279 controls_by_name["F14"] = button;
280 group->add (*button);
282 group = groups["none"];
283 button = new Button (1, "F15", *group);
284 buttons[0x44] = button;
285 controls.push_back (button);
286 controls_by_name["F15"] = button;
287 group->add (*button);
289 group = groups["none"];
290 button = new Button (1, "F16", *group);
291 buttons[0x45] = button;
292 controls.push_back (button);
293 controls_by_name["F16"] = button;
294 group->add (*button);
296 group = groups["modifiers"];
297 button = new Button (1, "shift", *group);
298 buttons[0x46] = button;
299 controls.push_back (button);
300 controls_by_name["shift"] = button;
301 group->add (*button);
303 group = groups["modifiers"];
304 button = new Button (1, "option", *group);
305 buttons[0x47] = button;
306 controls.push_back (button);
307 controls_by_name["option"] = button;
308 group->add (*button);
310 group = groups["modifiers"];
311 button = new Button (1, "control", *group);
312 buttons[0x48] = button;
313 controls.push_back (button);
314 controls_by_name["control"] = button;
315 group->add (*button);
317 group = groups["modifiers"];
318 button = new Button (1, "cmd_alt", *group);
319 buttons[0x49] = button;
320 controls.push_back (button);
321 controls_by_name["cmd_alt"] = button;
322 group->add (*button);
324 group = groups["automation"];
325 button = new Button (1, "on", *group);
326 buttons[0x4a] = button;
327 controls.push_back (button);
328 controls_by_name["on"] = button;
329 group->add (*button);
331 group = groups["automation"];
332 button = new Button (1, "rec_ready", *group);
333 buttons[0x4b] = button;
334 controls.push_back (button);
335 controls_by_name["rec_ready"] = button;
336 group->add (*button);
338 group = groups["functions"];
339 button = new Button (1, "undo", *group);
340 buttons[0x4c] = button;
341 controls.push_back (button);
342 controls_by_name["undo"] = button;
343 group->add (*button);
345 group = groups["automation"];
346 button = new Button (1, "snapshot", *group);
347 buttons[0x4d] = button;
348 controls.push_back (button);
349 controls_by_name["snapshot"] = button;
350 group->add (*button);
352 group = groups["automation"];
353 button = new Button (1, "touch", *group);
354 buttons[0x4e] = button;
355 controls.push_back (button);
356 controls_by_name["touch"] = button;
357 group->add (*button);
359 group = groups["functions"];
360 button = new Button (1, "redo", *group);
361 buttons[0x4f] = button;
362 controls.push_back (button);
363 controls_by_name["redo"] = button;
364 group->add (*button);
366 group = groups["functions"];
367 button = new Button (1, "marker", *group);
368 buttons[0x50] = button;
369 controls.push_back (button);
370 controls_by_name["marker"] = button;
371 group->add (*button);
373 group = groups["functions"];
374 button = new Button (1, "enter", *group);
375 buttons[0x51] = button;
376 controls.push_back (button);
377 controls_by_name["enter"] = button;
378 group->add (*button);
380 group = groups["functions"];
381 button = new Button (1, "cancel", *group);
382 buttons[0x52] = button;
383 controls.push_back (button);
384 controls_by_name["cancel"] = button;
385 group->add (*button);
387 group = groups["functions"];
388 button = new Button (1, "mixer", *group);
389 buttons[0x53] = button;
390 controls.push_back (button);
391 controls_by_name["mixer"] = button;
392 group->add (*button);
394 group = groups["transport"];
395 button = new Button (1, "frm_left", *group);
396 buttons[0x54] = button;
397 controls.push_back (button);
398 controls_by_name["frm_left"] = button;
399 group->add (*button);
401 group = groups["transport"];
402 button = new Button (1, "frm_right", *group);
403 buttons[0x55] = button;
404 controls.push_back (button);
405 controls_by_name["frm_right"] = button;
406 group->add (*button);
408 group = groups["transport"];
409 button = new Button (1, "loop", *group);
410 buttons[0x56] = button;
411 controls.push_back (button);
412 controls_by_name["loop"] = button;
413 group->add (*button);
415 group = groups["transport"];
416 button = new Button (1, "punch_in", *group);
417 buttons[0x57] = button;
418 controls.push_back (button);
419 controls_by_name["punch_in"] = button;
420 group->add (*button);
422 group = groups["transport"];
423 button = new Button (1, "punch_out", *group);
424 buttons[0x58] = button;
425 controls.push_back (button);
426 controls_by_name["punch_out"] = button;
427 group->add (*button);
429 group = groups["transport"];
430 button = new Button (1, "home", *group);
431 buttons[0x59] = button;
432 controls.push_back (button);
433 controls_by_name["home"] = button;
434 group->add (*button);
436 group = groups["transport"];
437 button = new Button (1, "end", *group);
438 buttons[0x5a] = button;
439 controls.push_back (button);
440 controls_by_name["end"] = button;
441 group->add (*button);
443 group = groups["transport"];
444 button = new Button (1, "rewind", *group);
445 buttons[0x5b] = button;
446 controls.push_back (button);
447 controls_by_name["rewind"] = button;
448 group->add (*button);
450 group = groups["transport"];
451 button = new Button (1, "ffwd", *group);
452 buttons[0x5c] = button;
453 controls.push_back (button);
454 controls_by_name["ffwd"] = button;
455 group->add (*button);
457 group = groups["transport"];
458 button = new Button (1, "stop", *group);
459 buttons[0x5d] = button;
460 controls.push_back (button);
461 controls_by_name["stop"] = button;
462 group->add (*button);
464 group = groups["transport"];
465 button = new Button (1, "play", *group);
466 buttons[0x5e] = button;
467 controls.push_back (button);
468 controls_by_name["play"] = button;
469 group->add (*button);
471 group = groups["transport"];
472 button = new Button (1, "record", *group);
473 buttons[0x5f] = button;
474 controls.push_back (button);
475 controls_by_name["record"] = button;
476 group->add (*button);
478 group = groups["cursor"];
479 button = new Button (1, "cursor_up", *group);
480 buttons[0x60] = button;
481 controls.push_back (button);
482 controls_by_name["cursor_up"] = button;
483 group->add (*button);
485 group = groups["cursor"];
486 button = new Button (1, "cursor_down", *group);
487 buttons[0x61] = button;
488 controls.push_back (button);
489 controls_by_name["cursor_down"] = button;
490 group->add (*button);
492 group = groups["cursor"];
493 button = new Button (1, "cursor_left", *group);
494 buttons[0x62] = button;
495 controls.push_back (button);
496 controls_by_name["cursor_left"] = button;
497 group->add (*button);
499 group = groups["cursor"];
500 button = new Button (1, "cursor_right", *group);
501 buttons[0x63] = button;
502 controls.push_back (button);
503 controls_by_name["cursor_right"] = button;
504 group->add (*button);
506 group = groups["none"];
507 button = new Button (1, "zoom", *group);
508 buttons[0x64] = button;
509 controls.push_back (button);
510 controls_by_name["zoom"] = button;
511 group->add (*button);
513 group = groups["none"];
514 button = new Button (1, "scrub", *group);
515 buttons[0x65] = button;
516 controls.push_back (button);
517 controls_by_name["scrub"] = button;
518 group->add (*button);
520 group = groups["user"];
521 button = new Button (1, "user_a", *group);
522 buttons[0x66] = button;
523 controls.push_back (button);
524 controls_by_name["user_a"] = button;
525 group->add (*button);
527 group = groups["user"];
528 button = new Button (1, "user_b", *group);
529 buttons[0x67] = button;
530 controls.push_back (button);
531 controls_by_name["user_b"] = button;
532 group->add (*button);
534 group = groups["master"];
535 button = new Button (1, "fader_touch", *group);
536 buttons[0x70] = button;
537 controls.push_back (button);
538 group->add (*button);
540 group = groups["none"];
541 led = new Led (1, "timecode", *group);
543 controls.push_back (led);
544 controls_by_name["timecode"] = led;
547 group = groups["none"];
548 led = new Led (1, "beats", *group);
550 controls.push_back (led);
551 controls_by_name["beats"] = led;
554 group = groups["none"];
555 led = new Led (1, "solo", *group);
557 controls.push_back (led);
558 controls_by_name["solo"] = led;
561 group = groups["none"];
562 led = new Led (1, "relay_click", *group);
564 controls.push_back (led);
565 controls_by_name["relay_click"] = led;
569 void MackieSurface::init_strips ()
575 for (uint32_t i = 0; i < _max_strips; ++i) {
577 std::ostringstream os;
578 uint32_t unit_index = i % _unit_strips;
579 uint32_t unit_ordinal = unit_index + 1;
581 os << "strip_" << unit_ordinal;
582 std::string name = os.str();
584 Strip* strip = new Strip (name, i);
586 groups[name] = strip;
589 fader = new Fader (unit_ordinal, "gain", *strip);
590 faders[0x00+unit_index] = fader;
591 controls.push_back (fader);
594 pot = new Pot (unit_ordinal, "vpot", *strip);
595 pots[0x10+unit_index] = pot;
596 controls.push_back (pot);
599 button = new Button (unit_ordinal, "recenable", *strip);
600 buttons[0x00+unit_index] = button;
601 controls.push_back (button);
602 strip->add (*button);
604 button = new Button (unit_ordinal, "solo", *strip);
605 buttons[0x08+unit_index] = button;
606 controls.push_back (button);
607 strip->add (*button);
609 button = new Button (unit_ordinal, "mute", *strip);
610 buttons[0x10+unit_index] = button;
611 controls.push_back (button);
612 strip->add (*button);
614 button = new Button (unit_ordinal, "select", *strip);
615 buttons[0x18+unit_index] = button;
616 controls.push_back (button);
617 strip->add (*button);
619 button = new Button (unit_ordinal, "vselect", *strip);
620 buttons[0x20+unit_index] = button;
621 controls.push_back (button);
622 strip->add (*button);
624 button = new Button (unit_ordinal, "fader_touch", *strip);
625 buttons[0x68+unit_index] = button;
626 controls.push_back (button);
627 strip->add (*button);