summaryrefslogtreecommitdiffstats
path: root/res/controllers/DJTechTools-MIDIFighter-scripts.js
blob: 12843eb4c1b9693f3390daa6472653da1c18fcf8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// DJ Tech Tools MIDI Fighter
// By RJ Ryan (rryan@mit.edu)
// For Mixxx 1.8.0+

// These scripts are the basics of mapping buttons on the MIDI Fighter to do
// things in Mixxx. Since everyone will have their own preference for what each
// button should do, the basic mappings do nothing more than assign player 1's
// hotcues 1-8 on the top two rows and player 2's hotcues 1-8 on the bottom two
// rows.

// If no mapping is given for a button then the function
// MIDIFighter.buttonX_down will be called when the button is pressed, and
// MIDIFighter.buttonX_up will be called when the button is depressed. This
// makes it easy to extend this script with custom functionality.

// The MIDI Fighter is laid out like this (in terms of the button numbers
// referenced below:
//
//     || <-- usb wire
// ================
// |  1  2  3  4  |
// |  5  6  7  8  |
// |  9 10 11 12  |
// | 13 14 15 16  |
// | MIDI FIGHTER |
// ================

// A big thanks go to Ean Golden of DJ Tech Tools for sending me a MIDI
// Fighter. Mixxx would not have a mapping for the MIDI Fighter if it weren't
// for his generosity.

function MIDIFighter() {}

MIDIFighter.control_map = {
    0x30: 1,
    0x31: 2,
    0x32: 3,
    0x33: 4,
    0x2C: 5,
    0x2D: 6,
    0x2E: 7,
    0x2F: 8,
    0x28: 9,
    0x29: 10,
    0x2A: 11,
    0x2B: 12,
    0x24: 13,
    0x25: 14,
    0x26: 15,
    0x27: 16,
};

MIDIFighter.button_mappings = {
};

MIDIFighter.map_button = function (button, control_object) {
    MIDIFighter.button_mappings[button] = control_object;
}

MIDIFighter.init = function(id) {
    MIDIFighter.id = id;
    print("MIDI Fighter " + MIDIFighter.id + " initialized.");

    // Channels are ordered the same way the waveforms are onscreen.
    MIDIFighter.map_button(1, {'group': '[Channel3]', 'item': 'hotcue_1_activate'});
    MIDIFighter.map_button(2, {'group': '[Channel3]', 'item': 'hotcue_2_activate'});
    MIDIFighter.map_button(3, {'group': '[Channel3]', 'item': 'hotcue_3_activate'});
    MIDIFighter.map_button(4, {'group': '[Channel3]', 'item': 'hotcue_4_activate'});

    MIDIFighter.map_button(5, {'group': '[Channel1]', 'item': 'hotcue_1_activate'});
    MIDIFighter.map_button(6, {'group': '[Channel1]', 'item': 'hotcue_2_activate'});
    MIDIFighter.map_button(7, {'group': '[Channel1]', 'item': 'hotcue_3_activate'});
    MIDIFighter.map_button(8, {'group': '[Channel1]', 'item': 'hotcue_4_activate'});

    MIDIFighter.map_button(9, {'group': '[Channel2]', 'item': 'hotcue_1_activate'});
    MIDIFighter.map_button(10, {'group': '[Channel2]', 'item': 'hotcue_2_activate'});
    MIDIFighter.map_button(11, {'group': '[Channel2]', 'item': 'hotcue_3_activate'});
    MIDIFighter.map_button(12, {'group': '[Channel2]', 'item': 'hotcue_4_activate'});

    MIDIFighter.map_button(13, {'group': '[Channel4]', 'item': 'hotcue_1_activate'});
    MIDIFighter.map_button(14, {'group': '[Channel4]', 'item': 'hotcue_2_activate'});
    MIDIFighter.map_button(15, {'group': '[Channel4]', 'item': 'hotcue_3_activate'});
    MIDIFighter.map_button(16, {'group': '[Channel4]', 'item': 'hotcue_4_activate'});
}

MIDIFighter.shutdown = function() {
    print("MIDI Fighter " + MIDIFighter.id + " shutting down.");
}

MIDIFighter.button_down = function (channel, control, value, status) {
    //print("Button down " + channel + " " + control + " " + value);
    var button_number = MIDIFighter.control_map[control];
    var button_name = 'button' + button_number;
    var button_name_down = 'button' + button_number + "_down";
    if (button_number in MIDIFighter.button_mappings) {
        var control = MIDIFighter.button_mappings[button_number];
        engine.setValue(control.group, control.item, 1);
    } else if (button_name_down in MIDIFighter) {
        MIDIFighter[button_name_down]();
    } else if (button_name in MIDIFighter) {
        MIDIFighter[button_name](1);
    }
}

MIDIFighter.button_up = function (channel, control, value, status) {
    //print("Button up " + channel + " " + control + " " + value);
    var button_number = MIDIFighter.control_map[control];
    var button_name = 'button' + button_number;
    var button_name_up = 'button' + button_number + "_up";

    if (button_number in MIDIFighter.button_mappings) {
        var control = MIDIFighter.button_mappings[button_number];
        engine.setValue(control.group, control.item, 0);
    } else if (button_name_up in MIDIFighter) {
        print ("Calling " + button_name_up);
        MIDIFighter[button_name_up]();
    } else if (button_name in MIDIFighter) {
        MIDIFighter[button_name](0);
    }
}

MIDIFighter.button1_down = function() {
    // Example, if no mapping is made for button 1 then this will be called when
    // button 1 is pressed.
}

MIDIFighter.button1_up = function() {
    // Example, if no mapping is made for button 1 then this will be called when
    // button 1 is released.
}

MIDIFighter.button1 = function() {
    // Example, if no mapping is given for button 1, and no button1_up or
    // button1_down method is defined, then this function will be called with
    // the argument 1 for the button being pressed and 0 for the button being
    // released.
}