Skip to content

Instantly share code, notes, and snippets.

@2bbb
Created November 25, 2014 15:13
Show Gist options
  • Select an option

  • Save 2bbb/9d514423ea9e9b8b8d2a to your computer and use it in GitHub Desktop.

Select an option

Save 2bbb/9d514423ea9e9b8b8d2a to your computer and use it in GitHub Desktop.
Dualshock Controller parser for Max
autocompile = true;
outlets = 3;
var NoteOutlet = 0,
CCOutlet = 1,
OSCOutlet = 2;
var ps2 = (function() {
var Controller = {
Buttons: {
Push: {
x: 3, a: 4, b: 5, y: 6,
top: 61, right: 62, bottom: 63, left: 64,
l1: 9, r1: 10, l2: 7, r2: 8,
select: 12, start: 11
}
},
Dualshock: {
Left: {
horizontal: 16,
vertical: 17,
click: 13
},
Right: {
horizontal: 18,
vertical: 19,
click: 14
}
},
command: 15,
dualshockEnable: 20
}
var convertId = function(x) { return x; },
convertToggle = function(x) { return x * 255; },
convert7bit = function(x) { return x >> 1; };
var Buttons = Controller.Buttons,
Dualshock = Controller.Dualshock,
OSCAdderss = {},
Convert = {},
NoteOrCC = {},
PS2Map = {};
// **** ****
OSCAdderss[Buttons.Push.x] = "/ps2/buttons/push/x";
OSCAdderss[Buttons.Push.a] = "/ps2/buttons/push/a";
OSCAdderss[Buttons.Push.b] = "/ps2/buttons/push/b";
OSCAdderss[Buttons.Push.y] = "/ps2/buttons/push/y";
OSCAdderss[Buttons.Push.top] = "/ps2/buttons/push/top";
OSCAdderss[Buttons.Push.right] = "/ps2/buttons/push/right";
OSCAdderss[Buttons.Push.bottom] = "/ps2/buttons/push/bottom";
OSCAdderss[Buttons.Push.left] = "/ps2/buttons/push/left";
OSCAdderss[Buttons.Push.l1] = "/ps2/buttons/push/l1";
OSCAdderss[Buttons.Push.r1] = "/ps2/buttons/push/r1";
OSCAdderss[Buttons.Push.l2] = "/ps2/buttons/push/l2";
OSCAdderss[Buttons.Push.r2] = "/ps2/buttons/push/r2";
OSCAdderss[Buttons.Push.select] = "/ps2/buttons/push/select";
OSCAdderss[Buttons.Push.start] = "/ps2/buttons/push/start";
OSCAdderss[Dualshock.Left.horizontal] = "/ps2/dualshock/left/horizontal";
OSCAdderss[Dualshock.Left.vertical] = "/ps2/dualshock/left/vertical";
OSCAdderss[Dualshock.Left.click] = "/ps2/dualshock/left/click";
OSCAdderss[Dualshock.Right.horizontal] = "/ps2/dualshock/right/horizontal";
OSCAdderss[Dualshock.Right.vertical] = "/ps2/dualshock/right/vertical";
OSCAdderss[Dualshock.Right.click] = "/ps2/dualshock/right/click";
OSCAdderss[Controller.command] = "/ps2/command";
// **** ****
Convert[Buttons.Push.x] = convertToggle;
Convert[Buttons.Push.a] = convertToggle;
Convert[Buttons.Push.b] = convertToggle;
Convert[Buttons.Push.y] = convertToggle;
Convert[Buttons.Push.top] = convertToggle;
Convert[Buttons.Push.right] = convertToggle;
Convert[Buttons.Push.bottom] = convertToggle;
Convert[Buttons.Push.left] = convertToggle;
Convert[Buttons.Push.l1] = convertToggle;
Convert[Buttons.Push.r1] = convertToggle;
Convert[Buttons.Push.l2] = convertToggle;
Convert[Buttons.Push.r2] = convertToggle;
Convert[Buttons.Push.select] = convertToggle;
Convert[Buttons.Push.start] = convertToggle;
Convert[Dualshock.Left.horizontal] = convert7bit;
Convert[Dualshock.Left.vertical] = convert7bit;
Convert[Dualshock.Left.click] = convertToggle;
Convert[Dualshock.Right.horizontal] = convert7bit;
Convert[Dualshock.Right.vertical] = convert7bit;
Convert[Dualshock.Right.click] = convertToggle;
Convert[Controller.command] = convertId;
// **** ****
PS2Map[Buttons.Push.x] = 19;
PS2Map[Buttons.Push.a] = 20;
PS2Map[Buttons.Push.b] = 21;
PS2Map[Buttons.Push.y] = 22;
PS2Map[Buttons.Push.top] = 11;
PS2Map[Buttons.Push.right] = 12;
PS2Map[Buttons.Push.bottom] = 13;
PS2Map[Buttons.Push.left] = 14;
PS2Map[Buttons.Push.l1] = 17;
PS2Map[Buttons.Push.r1] = 18;
PS2Map[Buttons.Push.l2] = 15;
PS2Map[Buttons.Push.r2] = 16;
PS2Map[Buttons.Push.select] = 7;
PS2Map[Buttons.Push.start] = 10;
PS2Map[Dualshock.Left.horizontal] = 26;
PS2Map[Dualshock.Left.vertical] = 27;
PS2Map[Dualshock.Left.click] = 8;
PS2Map[Dualshock.Right.horizontal] = 28;
PS2Map[Dualshock.Right.vertical] = 29;
PS2Map[Dualshock.Right.click] = 9;
PS2Map[Controller.command] = convertId;
function crossButton(pos, value) {
if(value == 15) {
return 0;
} else {
switch(pos) {
case 1: return ((value <= 1) || (value == 7)) ? 1 : 0; break;
case 2: return ((1 <= value) && (value <= 3)) ? 1 : 0; break;
case 3: return ((3 <= value) && (value <= 5)) ? 1 : 0; break;
case 4: return ((5 <= value) && (value <= 7)) ? 1 : 0; break;
}
}
}
var State = {
isL2ButtonPushed: false,
isR2ButtonPushed: false,
isDualshockEnable: false
};
function ps2(address, value) {
switch(address) {
case 30:
case 54:
case 56:
case 69:
break;
case Buttons.Push.l2:
State.isL2ButtonPushed = (0 < value);
break;
case Buttons.Push.r2:
State.isR2ButtonPushed = (0 < value);
break;
case Controller.dualshockEnable:
State.isDualshockEnable = (value == 115);
break;
default:
if(State.isDualshockEnable) {
if(
address == Dualshock.Left.horizontal
|| address == Dualshock.Left.vertical
|| address == Dualshock.Right.horizontal
|| address == Dualshock.Right.vertical
) {
if(State.isL2ButtonPushed && State.isR2ButtonPushed) {
outlet(CCOutlet, PS2Map[address], Convert[address](value));
outlet(OSCOutlet, OSCAdderss[address], value);
}
} else if(address == Controller.command) {
outlet(NoteOutlet, PS2Map[Buttons.Push.top], crossButton(1, value) * 127);
outlet(OSCOutlet, OSCAdderss[Buttons.Push.top], crossButton(1, value));
outlet(NoteOutlet, PS2Map[Buttons.Push.right], crossButton(2, value) * 127);
outlet(OSCOutlet, OSCAdderss[Buttons.Push.right], crossButton(2, value));
outlet(NoteOutlet, PS2Map[Buttons.Push.bottom], crossButton(3, value) * 127);
outlet(OSCOutlet, OSCAdderss[Buttons.Push.bottom], crossButton(3, value));
outlet(NoteOutlet, PS2Map[Buttons.Push.left], crossButton(4, value) * 127);
outlet(OSCOutlet, OSCAdderss[Buttons.Push.left], crossButton(4, value));
} else {
outlet(NoteOutlet, PS2Map[address], Convert[address](value));
outlet(OSCOutlet, OSCAdderss[address], value);
}
} else {
if(address == Dualshock.Left.horizontal) {
outlet(NoteOutlet, PS2Map[Buttons.Push.right], (127 < value) ? 127 : 0);
outlet(OSCOutlet, OSCAdderss[Buttons.Push.right], (127 < value) ? 1 : 0);
outlet(NoteOutlet, PS2Map[Buttons.Push.left], (value < 127) ? 127 : 0);
outlet(OSCOutlet, OSCAdderss[Buttons.Push.left], (value < 127) ? 1 : 0);
} else if(address == Dualshock.Left.vertical) {
outlet(NoteOutlet, PS2Map[Buttons.Push.bottom], (127 < value) ? 127 : 0);
outlet(OSCOutlet, OSCAdderss[Buttons.Push.bottom], (127 < value) ? 1 : 0);
outlet(NoteOutlet, PS2Map[Buttons.Push.top], (value < 127) ? 127 : 0);
outlet(OSCOutlet, OSCAdderss[Buttons.Push.top], (value < 127) ? 1 : 0);
} else {
outlet(NoteOutlet, PS2Map[address], Convert[address](value));
outlet(OSCOutlet, OSCAdderss[address], value);
}
}
break;
}
}
return ps2;
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment