Octodrum

Play Video
The Octodrum

The Octodrum is a midi drum with eight pressure-sensitive drum pads that can be arranged individually with various adapters.

The Octodrum can be played with the whole hand, not just with your fingers. This is important because you also use your hand when you play a conventional drum. Furthermore, the Octodrum offers the musician the possibility of operating it with his feet—the bass drum does not have to be played by hand. Its drum pads have soft faces, to ensure a soft hit.

The Drum Pads

When completing the design, I constructed a prototype of the drum pads to test their functionality. It was obligatory to work with precision to avoid mechanical failure affecting the functionality.

Filmstrip view of the building process of the Drum Pads
The building process for the pads. See the drill? Safety first.

The drum pads use force-sensing resistors that convert the physical hit into a computer signal. This enables the velocity to be caught as a parameter, which is important in making the drums dynamic. I also had to make sure the mechanics were accurate to ensure equal velocity at each drum.

Fritzing and the Board

For development I used a breadboard where the cables could be repositioned flexibly. In the final version I used the Fritzing software to produce a real circuit board.

Breadboard with eight FSRs
The breadboard during development.

Arduino Code

The code is very simple. MIDI notes helped me to convert the analog signal into a digital one, allowing any MIDI software to be controlled by the Octodrum.

int fsrPin[] = { A9, A8, A7, A6, A5, A4, A3, A2 };
int fsrReading[8];
int value[8];
boolean drumActive[8];

int noten[] = { 84, 83, 81, 79, 77, 76, 74, 72 };

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  for(int i = 0; i < 8; i++) {
    fsrReading[i] = analogRead(fsrPin[i]);
    if(fsrReading[i] > 20) {
        value[i] = constrain(fsrReading[i], 21, 700);
        value[i] = map(value[i], 21, 700, 0, 127);
      if(!drumActive[i]) {
        if(value[i] > 10) {
          usbMIDI.sendNoteOn(noten[i], value[i], 1);
        }
        drumActive[i] = true;
      } 
    } else {
      drumActive[i] = false;
      usbMIDI.sendNoteOff(noten[i], value[i], 1);
    }
  }
  delay(20);
}