Tag Archives: arcade

IKEA Hack: MIDI Enabled Highscore Chair


The best thing about IKEA’s ANTILOP Highchair is that it’s cheap, and I mean dirt cheap. With a price tag of $19.99 you don’t have to worry about destroying it, or even not liking it. Coming in as a close second best thing is the fact that you can purchase extra trays which you can modify into activity centers you can swap in and out, such as this pro-gamer training rig.

For the Highscore Chair I added some Joysticks and Buttons I had lying around, loosely intended for expanding my arcade cabinet. These parts have the added advantage of actually being functional, down the road I can hook them up to a Raspberry Pi, an Arduino, MIDI out (Update: I’ve since added MIDI out), or just to some lights and buzzers — if you’ve got any ideas I’d love to hear them. The sky’s the limit as to what you can add to these trays, just keep safety in mind, for example, I placed the joysticks out of the arc of the baby’s head if he were to fall forward.

The trickiest part of this whole process is swapping out the trays. There are four rather stiff tabs that snap in place when attaching the tray. I may make a tool of some sort to make removal easier but in the mean time four butter knives do the trick. It’s probably best to swap the trays without the baby in the highchair, just slip a butter knife under each tab and once all four are in you can remove the tray easily (the butter knives will fall), really, any flat object would work, popsicle sticks perhaps? Now having thought about it, I’ll probably cut off the inner two tabs, the tabs are surprisingly strong I don’t see any risk of the baby removing the tray even if I remove two of them, however removing two would probably allow removal of the tray by an adult pressing one tab with each hand and pushing up on the tray with a knee or the like.

The plastic is very easy to drill, a stepped bit works wonders. Cutting would be a little more difficult but nothing a dremel wouldn’t be able to handle.

Update: I did end up snipping off the inner two tabs on both trays (with some sheet metal shears) and it worked like a charm. The trays can now be removed without the need for tools. Just push on the two remaining tabs with your thumbs keeping your fingers behind the lip for leverage, then use your chest, shoulder or chin (whatever works) to push up on the tray, once the tabs clear the lip you can let go and just lift the tray off. Be sure not to leave any sharp edges and swapping is still best done while the chair is unoccupied due to the number of places little fingers could get pinched while putting the tray on.

Update: I’ve since added MIDI out, which amounts to 10 MIDI triggers, 8 for each joystick and one for each button. The Highscore Chair now triggers samples loaded onto an Akai MPC1000, but with MIDI out it could be used as any sort of control surface now. The MIDI out is accomplished through an Arduino UNO, by following a couple of simple tutorials, found here and here, you can get buttons triggering MIDI notes in no time. I’ll shoot a new video when the little fellow is up for it. While the underside of the tray is already quite isolated from the baby due to the structure of the chair for added safety I’ll be putting the Arduino, battery and MIDI Jack in an enclosure and covering the entire tray undercarriage.


 

Here’s the Arduino sketch, very bare-bones. I cranked it out after a long day so I didn’t want to risk using the wrong array syntax so it’s just long hand, maybe that helps readability for beginners? Anyhow it would be much shorter if it used arrays. Basically there’re variables for each button pin and variables for the state of each button, it will only send one MIDI note per button push and wait until the button’s been released and pressed again before re-sending that note. This sketch is hard-coded to send MIDI notes 36 through 45 on channel 1 at 69 velocity.


const int buttonPin0 = 2;
const int buttonPin1 = 3;
const int buttonPin2 = 4;
const int buttonPin3 = 5;
const int buttonPin4 = 6;
const int buttonPin5 = 7;
const int buttonPin6 = 9;
const int buttonPin7 = 10;
const int buttonPin8 = 11;
const int buttonPin9 = 12;

int buttonStatus0 = 0;
int buttonStatus1 = 0;
int buttonStatus2 = 0;
int buttonStatus3 = 0;
int buttonStatus4 = 0;
int buttonStatus5 = 0;
int buttonStatus6 = 0;
int buttonStatus7 = 0;
int buttonStatus8 = 0;
int buttonStatus9 = 0;

void setup() {
  pinMode(buttonPin0, INPUT);
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  pinMode(buttonPin4, INPUT);
  pinMode(buttonPin5, INPUT);
  pinMode(buttonPin6, INPUT);
  pinMode(buttonPin7, INPUT);
  pinMode(buttonPin8, INPUT);
  pinMode(buttonPin9, INPUT);   

  Serial.begin(31250);
}

void loop(){

  int button0State = digitalRead(buttonPin0);
  int button1State = digitalRead(buttonPin1);
  int button2State = digitalRead(buttonPin2);
  int button3State = digitalRead(buttonPin3);
  int button4State = digitalRead(buttonPin4);
  int button5State = digitalRead(buttonPin5);
  int button6State = digitalRead(buttonPin6);
  int button7State = digitalRead(buttonPin7);
  int button8State = digitalRead(buttonPin8);
  int button9State = digitalRead(buttonPin9);  

  if(button0State == 1 && buttonStatus0 == 0)
  {
    buttonStatus0 = 1;
    noteOn(0x90, 0x24, 0x45);
  }
  else if(button0State == 0)
  {
    buttonStatus0 = 0;
  }

  if(button1State == 1 && buttonStatus1 == 0)
  {
    buttonStatus1 = 1;
    noteOn(0x90, 0x25, 0x45);
  }
  else if(button1State == 0)
  {
    buttonStatus1 = 0;
  }

  if(button2State == 1 && buttonStatus2 == 0)
  {
    buttonStatus2 = 1;
    noteOn(0x90, 0x26, 0x45);
  }
  else if(button2State == 0)
  {
    buttonStatus2 = 0;
  }

  if(button3State == 1 && buttonStatus3 == 0)
  {
    buttonStatus3 = 1;
    noteOn(0x90, 0x27, 0x45);
  }
  else if(button3State == 0)
  {
    buttonStatus3 = 0;
  }

  if(button4State == 1 && buttonStatus4 == 0)
  {
    buttonStatus4 = 1;
    noteOn(0x90, 0x28, 0x45);
  }
  else if(button4State == 0)
  {
    buttonStatus4 = 0;
  }

  if(button5State == 1 && buttonStatus5 == 0)
  {
    buttonStatus5 = 1;
    noteOn(0x90, 0x29, 0x45);
  }
  else if(button5State == 0)
  {
    buttonStatus5 = 0;
  }

  if(button6State == 1 && buttonStatus6 == 0)
  {
    buttonStatus6 = 1;
    noteOn(0x90, 0x2A, 0x45);
  }
  else if(button6State == 0)
  {
    buttonStatus6 = 0;
  }

  if(button7State == 1 && buttonStatus7 == 0)
  {
    buttonStatus7 = 1;
    noteOn(0x90, 0x2B, 0x45);
  }
  else if(button7State == 0)
  {
    buttonStatus7 = 0;
  }

  if(button8State == 1 && buttonStatus8 == 0)
  {
    buttonStatus8 = 1;
    noteOn(0x90, 0x2C, 0x45);
  }
  else if(button8State == 0)
  {
    buttonStatus8 = 0;
  }

  if(button9State == 1 && buttonStatus9 == 0)
  {
    buttonStatus9 = 1;
    noteOn(0x90, 0x2D, 0x45);
  }
  else if(button9State == 0)
  {
    buttonStatus9 = 0;
  }
}

void noteOn(int cmd, int pitch, int velocity) {
  Serial.write(cmd);
  Serial.write(pitch);
  Serial.write(velocity);
}

MAME Arcade Cabinet

I went and made a Mame cabinet. I had a whack of old PC stuff sitting around,
a P2-266 with a motherboard, CDRom and ATI All in Wonder Rage Pro. I managed to pan handled
an ISA SB16 off a friend and resurrect an old PCI NIC.

After cruising some sites of doods who’ve done this, I began thinking of my cabinet.
I decided that it’d be better for me to buy an old one rather than make one. My reasoning being
that my homemade one would probably not turn out as hoped, and for $150 or so I can get an old
one with art and everything. So I checked ebay, ebay’s no good. Prices are usually too high and
shipping is craziness. Living in Toronto I found two distributers, Starburst, who holds auctions and New Way Sales. Starburst, although very friendly and helpful, did not have any stock of old cabinets on hand ( they later alerted me when they recieved some ). Starburst was going to charge me ~$100 Canadian for a bottom of the line used cabinet ( probably without art ). So I found New Way Sales. After a little email back and forth, I showed up to find they had tons of old cabinets. I picked up an old 4 player cabinet with Ninja Turtle artwork on the side and X-Men on the Marqee. Complete with quarter slots. They offered to throw in the old controls, which in retrospect I should’ve taken, but I had already ordered mine ( see below ). Anyhow, I got a cabinet, with working quarter slots, screen bevel, marqee with light, speaker, and some leftover innards for ~$200 Canadian.

For the controls, after surfing some sites with info, I decided to use a hacked up keyboard interface since I had an old keyboard laying around. The keyboard interface ( show below ) was a series of ~30 leads. Connecting different leads produced different keystrokes. So I plugged it into the normal PS2 keyboard port and spent an hour or so with my favourite girl mapping out which lead combinations produced which keystrokes, being careful not to touch any of the leads connected to the LEDs ( could royally mess your motherboard ). Ending up with something like this. Most if not all keyboards have their own unique matrix so you’ll have to do this for yourself. There is a program available from Arcade Controls Download Section which will display keystokes on the screen which came in handy. I then soldered wires to the leads I mapped out and attached them to a row of terminals ( little screws that you can put wires under ) to make control connections a little easier.



I then ordered my controls from Happs which ended up costing me way too much ( ~$100 Canadian ) for 2 joysticks and 14 buttons. But I’m very happy with them so I guess it’s worth it. All of them are horizontal microswitches, although I noticed that Starburst had some leaf switches on display ( some say they’re not made anymore ). I then just attached said controls to the terminals which I had attached the keyboard interface, having the buttons and joystick directions produce the keystrokes I desired ( “O”, “K”, “ENTER”, etc. ). I also hooked up the quarter slot switches to the terminals so I’ve got to feed the monster quarters to play.




I went to a pawn shop and nabbed some no name 21″ TV for ~$100 Canadian, took the back cover off for better fit ( being careful not to touch anything in the TV for fear of instant death by electrocution ) then braced it with a 2×4. I then tossed the PC together and threw it in the bottom of the cabinet, connected the SB16 to the speaker in the cabinet, plugged in my hacked keyboard interface and connected the TV to the AV OUT of the ATI All in Wonder.




I bought some plexi glass ( actually clear acrylic sheets ) and cut / drilled a sheet to fit the control panel ( which I had made from some extra ply wood and spray painted black ) I also cut a sheet to fit the screen and cut some presentation board to frame the screen perfectly. I ducked into a home stuff store and found some nice shiny black cabinet liner which I tossed under the plexi glass of the control panel. With all that done, I plugged it in and went to town!




Some further notes, 14 buttons weren’t enough. I had to buy some el cheapo buttons for the side so I could have “ESC”, “TAB” and “~” for Mame control. A TV with SVideo IN would’ve been nice ( but expensive ) for better clarity. All in all, cost me ~$500 ( keep in mind I already had the CPU and PC components ). But I now have 1000+ games in my living room!