2
// Nintendo Wii Remote Game Controller HID mapping
3
// Copyright (C) 2012, Ilkka Tuohela
4
// For Mixxx version 1.11.x
7
// WiiMoteController is defined in Wiimote.hid.js
8
Wiimote = new WiimoteController();
10
Wiimote.activeDeck = 1;
12
// Mandatory function for mixxx controllers
13
Wiimote.init = function(id) {
15
// Required to make virtual deck resolution work
16
Wiimote.controller.activeDeck = 1;
17
Wiimote.controller.auto_repeat_interval = 100;
18
Wiimote.registerInputPackets();
19
Wiimote.registerCallbacks();
21
var controller = Wiimote.controller;
22
controller.registerAutoRepeatTimer = function() {
23
controller.auto_repeat_timer = engine.beginTimer(
24
controller.auto_repeat_interval,
25
"Wiimote.controller.controlAutoRepeat()"
29
script.HIDDebug("Wiimote controller initialized: " + Wiimote.id);
32
// Mandatory function for mixxx controllers
33
Wiimote.shutdown = function() {
34
Wiimote.controller.close();
35
script.HIDDebug("Wiimote controller shutdown: " + Wiimote.id);
38
// Mandatory function to receive anything from HID
39
Wiimote.incomingData = function(data,length) {
40
Wiimote.controller.parsePacket(data,length);
43
// Register callbacks for 'hid' controls defined in WiimoteController
44
Wiimote.registerCallbacks = function(id) {
45
var packet = Wiimote.controller.resolveInputPacket('control');
46
if (packet==undefined) {
47
script.HIDDebug("No input packet 'control' defined");
50
var controller = Wiimote.controller;
51
if (controller==undefined) {
52
script.HIDDebug("Error registrering callbacks: controller is undefined");
56
// Link HID buttons to deck1 and deck2 play buttons
57
controller.linkModifier("hid","button_bottom","shift");
58
controller.registerInputCallback("control","hid","button_home",Wiimote.deck_cue);
59
controller.registerInputCallback("control","hid","button_a",Wiimote.play_load);
61
controller.registerInputCallback("control","hid","button_minus",Wiimote.jog);
62
controller.registerInputCallback("control","hid","button_plus",Wiimote.jog);
63
controller.enableBitAutoRepeat("hid","button_minus");
64
controller.enableBitAutoRepeat("hid","button_plus");
66
controller.registerInputCallback("control","hid","arrow_left",Wiimote.seek_loop);
67
controller.registerInputCallback("control","hid","arrow_right",Wiimote.seek_loop);
69
controller.registerInputCallback("control","hid","arrow_up",Wiimote.select);
70
controller.registerInputCallback("control","hid","arrow_down",Wiimote.select);
71
controller.enableBitAutoRepeat("hid","arrow_up");
72
controller.enableBitAutoRepeat("hid","arrow_down");
74
controller.registerInputCallback("control","hid","button_1",Wiimote.hotcue);
75
controller.registerInputCallback("control","hid","button_2",Wiimote.hotcue);
80
Wiimote.seek_loop = function(field) {
81
var controller = Wiimote.controller;
83
var group = controller.resolveDeckGroup(Wiimote.activeDeck);
86
if (field.value==controller.buttonStates.released)
90
if (controller.modifierIsSet('shift')) {
91
if (field.name=="arrow_left")
92
engine.setValue(group,'back',value);
93
if (field.name=="arrow_right")
94
engine.setValue(group,'fwd',value);
96
// Reset back/gwd states (can be left on if you release shift)
97
if (engine.getValue(group,'back'))
98
engine.setValue(group,'back',false);
99
if (engine.getValue(group,'fwd'))
100
engine.setValue(group,'fwd',false);
101
if (field.value==controller.buttonStates.released)
103
if (field.name=="arrow_left")
104
engine.setValue(group,'loop_in',value);
105
if (field.name=="arrow_right")
106
if (engine.getValue(group,'loop_enabled'))
107
engine.setValue(group,'reloop_exit',true);
109
engine.setValue(group,'loop_out',true);
113
Wiimote.select = function(field) {
114
var controller = Wiimote.controller;
115
if (!controller.modifierIsSet('shift')) {
116
if (field.value==controller.buttonStates.released)
118
if (field.name=="arrow_up")
119
engine.setValue("[Playlist]","SelectPrevTrack",true);
120
if (field.name=="arrow_down")
121
engine.setValue("[Playlist]","SelectNextTrack",true);
123
var group = controller.resolveDeckGroup(Wiimote.activeDeck);
125
if (group==undefined)
127
if (field.name=="arrow_up") {
128
value = engine.getValue(group,'rate')+0.02;
129
engine.setValue(group,"rate",value);
131
if (field.name=="arrow_down") {
132
value = engine.getValue(group,'rate')-0.02;
133
engine.setValue(group,"rate",value);
138
// Call cue_default, or select deck if shift (bottom button) is pressed
139
Wiimote.deck_cue = function(field) {
140
var controller = Wiimote.controller;
141
if (!controller.modifierIsSet('shift')) {
142
var group = controller.resolveDeckGroup(Wiimote.activeDeck);
143
if (field.value==controller.buttonStates.released)
144
engine.setValue(group,'cue_default',false);
146
engine.setValue(group,'cue_default',true);
148
if (field.value==controller.buttonStates.released)
150
switch (Wiimote.activeDeck) {
151
case 1: Wiimote.activeDeck = 2; break;
152
case 2: Wiimote.activeDeck = 1; break;
153
default: Wiimote.activeDeck = 1; break;
155
script.HIDDebug("Active deck now " + Wiimote.activeDeck);
159
Wiimote.play_load = function(field) {
160
var controller = Wiimote.controller;
161
var group = controller.resolveDeckGroup(Wiimote.activeDeck);
162
if (group==undefined)
164
if (field.value==controller.buttonStates.released)
166
if (!controller.modifierIsSet('shift')) {
167
controller.togglePlay(group,field);
169
engine.setValue(group,"LoadSelectedTrack",true);
173
Wiimote.jog = function(field) {
174
var controller = Wiimote.controller;
175
var group = controller.resolveDeckGroup(Wiimote.activeDeck);
176
if (group==undefined)
178
if (field.name=='button_minus')
179
if (field.value==controller.buttonStates.released)
180
engine.setValue(group,'jog',0);
182
engine.setValue(group,'jog',-4);
183
if (field.name=='button_plus')
184
if (field.value==controller.buttonStates.released)
185
engine.setValue(group,'jog',0);
187
engine.setValue(group,'jog',4);
190
Wiimote.hotcue = function(field) {
191
var controller = Wiimote.controller;
192
var group = controller.resolveDeckGroup(Wiimote.activeDeck);
193
if (group==undefined)
195
if (controller.modifierIsSet('shift')) {
196
if (field.value==controller.buttonStates.released)
198
if (field.name=="button_1")
199
engine.setValue(group,"hotcue_1_clear",true);
200
if (field.name=="button_2")
201
engine.setValue(group,"hotcue_2_clear",true);
203
if (field.value==controller.buttonStates.released)
205
if (field.name=="button_1")
206
engine.setValue(group,"hotcue_1_activate",true);
207
if (field.name=="button_2")
208
engine.setValue(group,"hotcue_2_activate",true);