Tag Archives: buttons

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);
}