MCP: build fix
[ardour.git] / libs / surfaces / mackie / mackie_surface.cc
1 #include <cmath>
2 #include <sstream>
3 #include <string>
4
5 #include "mackie_surface.h"
6 #include "surface_port.h"
7 #include "mackie_midi_builder.h"
8
9 using namespace Mackie;
10
11 void 
12 MackieSurface::display_timecode( SurfacePort & port, MackieMidiBuilder & builder, const std::string & timecode, const std::string & timecode_last )
13 {
14         port.write( builder.timecode_display( port, timecode, timecode_last ) );
15 }
16
17 float 
18 MackieSurface::scaled_delta( const ControlState & state, float current_speed )
19 {
20         return state.sign * ( std::pow( float(state.ticks + 1), 2 ) + current_speed ) / 100.0;
21 }
22
23 void 
24 Mackie::MackieSurface::init_controls()
25 {
26         Pot* pot = 0;
27         Button* button = 0;
28         Led* led = 0;
29
30         // intialise groups and strips
31         Group * group = 0;
32         
33         // make sure there are enough strips
34         strips.resize (8);
35         
36         group = new Group  ("user");
37         groups["user"] = group;
38         
39         group = new Group  ("assignment");
40         groups["assignment"] = group;
41         
42         group = new Group  ("none");
43         groups["none"] = group;
44         
45         group = new MasterStrip  ("master", 0);
46         groups["master"] = group;
47         strips[0] = dynamic_cast<Strip*> (group);
48         
49         group = new Group  ("cursor");
50         groups["cursor"] = group;
51         
52
53         group = new Group  ("functions");
54         groups["functions"] = group;
55         
56         group = new Group  ("automation");
57         groups["automation"] = group;
58         
59
60         group = new Group  ("display");
61         groups["display"] = group;
62                 
63         group = new Group  ("transport");
64         groups["transport"] = group;
65         
66         group = new Group  ("modifiers");
67         groups["modifiers"] = group;
68         
69         group = new Group  ("bank");
70         groups["bank"] = group;
71         
72         group = groups["none"];
73         pot = new Jog  (1, "jog", *group);
74         pots[0x3c] = pot;
75         controls.push_back (pot);
76         controls_by_name["jog"] = pot;
77         group->add (*pot);
78
79         group = groups["none"];
80         pot = new Pot  (1, "external", *group);
81         pots[0x2e] = pot;
82         controls.push_back (pot);
83         controls_by_name["external"] = pot;
84         group->add (*pot);
85
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;
91         group->add (*button);
92
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;
98         group->add (*button);
99
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);
106
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);
113
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);
120
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);
127
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);
134
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);
141
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);
148
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);
155
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);
162
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);
169
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);
176
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);
183
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);
190
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);
197
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);
204
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);
211
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);
218
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);
225
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);
232
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);
239
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);
246
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);
253
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);
260
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);
267
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);
274
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);
281
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);
288
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);
295
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);
302
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);
309
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);
316
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);
323
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);
330
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);
337
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);
344
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);
351
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);
358
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);
365
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);
372
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);
379
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);
386
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);
393
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);
400
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);
407
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);
414
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);
421
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);
428
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);
435
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);
442
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);
449
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);
456
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);
463
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);
470
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);
477
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);
484
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);
491
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);
498
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);
505
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);
512
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);
519
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);
526
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);
533
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);
539
540         group = groups["none"];
541         led = new Led  (1, "timecode", *group);
542         leds[0x71] = led;
543         controls.push_back (led);
544         controls_by_name["timecode"] = led;
545         group->add (*led);
546
547         group = groups["none"];
548         led = new Led  (1, "beats", *group);
549         leds[0x72] = led;
550         controls.push_back (led);
551         controls_by_name["beats"] = led;
552         group->add (*led);
553
554         group = groups["none"];
555         led = new Led  (1, "solo", *group);
556         leds[0x73] = led;
557         controls.push_back (led);
558         controls_by_name["solo"] = led;
559         group->add (*led);
560
561         group = groups["none"];
562         led = new Led  (1, "relay_click", *group);
563         leds[0x76] = led;
564         controls.push_back (led);
565         controls_by_name["relay_click"] = led;
566         group->add (*led);
567 }
568
569 void MackieSurface::init_strips ()
570 {
571         Fader* fader = 0;
572         Pot* pot = 0;
573         Button* button = 0;
574
575         for (uint32_t i = 0; i < _max_strips; ++i) {
576
577                 std::ostringstream os;
578                 uint32_t unit_index = i % _unit_strips;
579                 uint32_t unit_ordinal = unit_index + 1;
580
581                 os << "strip_" << unit_ordinal;
582                 std::string name = os.str();
583                 
584                 Strip* strip = new Strip (name, i);
585                 
586                 groups[name] = strip;
587                 strips[i] = strip;
588
589                 fader = new Fader (unit_ordinal, "gain", *strip);
590                 faders[0x00+unit_index] = fader;
591                 controls.push_back (fader);
592                 strip->add (*fader);
593
594                 pot = new Pot  (unit_ordinal, "vpot", *strip);
595                 pots[0x10+unit_index] = pot;
596                 controls.push_back (pot);
597                 strip->add (*pot);
598
599                 button = new Button  (unit_ordinal, "recenable", *strip);
600                 buttons[0x00+unit_index] = button;
601                 controls.push_back (button);
602                 strip->add (*button);
603
604                 button = new Button  (unit_ordinal, "solo", *strip);
605                 buttons[0x08+unit_index] = button;
606                 controls.push_back (button);
607                 strip->add (*button);
608
609                 button = new Button  (unit_ordinal, "mute", *strip);
610                 buttons[0x10+unit_index] = button;
611                 controls.push_back (button);
612                 strip->add (*button);
613
614                 button = new Button  (unit_ordinal, "select", *strip);
615                 buttons[0x18+unit_index] = button;
616                 controls.push_back (button);
617                 strip->add (*button);
618
619                 button = new Button  (unit_ordinal, "vselect", *strip);
620                 buttons[0x20+unit_index] = button;
621                 controls.push_back (button);
622                 strip->add (*button);
623
624                 button = new Button  (unit_ordinal, "fader_touch", *strip);
625                 buttons[0x68+unit_index] = button;
626                 controls.push_back (button);
627                 strip->add (*button);
628         }
629 }