This project aims to develop a prototype electronic drum kit using sensors, an Arduino, and Max 7. These tools will create MIDI data for this drum kit and output audio.
The following list outlines all the design criteria of the project:
- Have an electronic drum kit with at least 5 drum pads, that outputs audio on a connected computer.
- Presets for different virtual drum kits should exist, changing the note played by each of the drum pads.
- A looping mechanism should exist, allowing someone to play a phrase on the drum kit and then loop it for as long as necessary.
- Physical buttons should be used to control the start and stop of recording and playback of the above loop.
In order to create drum pads, sensors designed to convert a vibration into an electronic signal were necessary. Specifically, piezoelectric sensors that put out an analog voltage when vibrated were chosen. The model 7BB-35-3L0 was chosen for it’s size, voltage range, and cost.
The sensors are, however, quite small and some material was needed to increase their areas. This material would also require giving the sensors a drum-like feel. After testing out various materials, a prototype that met both requirements was developed. Using a section of sonotube (cardboard tube used as mold for concrete pillars), a hose clamp, and a type of paper known as “rock paper”, a drum pad that could be hit with drum sticks was created. As well, to add a bit of strength to the paper top, a layer of adhesive laminating paper was added to the underside of the paper. Tape was used to carefully mount the sensor to the underside of the paper, without impacting the look or feel of the drum pad. This was found to work quite well in increasing the amount of area that can be hit, as well as providing a drum-like feel.
The sensor generates an analog voltage depending on the amount of force applied to the drum pad. This can correlate with MIDI velocity, such that the force applied to the drum pad will determine how loud the MIDI note generated will sound. The analog pins on the Arduino can read the analog voltage generated by the sensor and then map it to a value between 0 and 127, which can be used to represent the MIDI velocity.
The Arduino writes to a serial port which sensor was struck and the corresponding MIDI velocity. A Max patch, created with Max 7, reads the data from the same serial port and takes in these two numbers. With a value for the MIDI velocity and a sensor number, the Max patch generates MIDI data that is output as audio using the computer’s internal synthesizer. The MIDI data is sent out on channel 10, the reserved percussion channel of the General MIDI standard.
A looping mechanism was also made available by using the seq object in the Max patch. Using a physical push-button on the breadboard, you can start and stop recording of the MIDI data. To read the buttons, the Arduino uses an interrupt service routine (ISR) attached to its second digital pin. If a rising edge occurs on the pin, the ISR will automatically be called. The ISR will write a value to the serial port. When this value is read by Max, it triggers the recording of any MIDI data that gets generated when playing the drum kit. Pressing the same button again will stop the recording.
Pressing another button will start playback of the recorded MIDI data. The button uses an ISR in much the same way as was mentioned above, only it is attached to the third digital pin. The playback will loop until the same button is pressed again.
The Max patch has presets to choose different virtual drum kits. As well, knobs are provided in the Max patch for a user to choose which notes they would like for each drum pad.
Figure 3: The completed drum kit
Figure 4: A view from above of the completed drum kit
The circuit and 4 drum pads are placed on a common folding table. Another drum pad is mounted vertically on a type of easel, so it can be struck by a drum pedal from an actual drum kit. The buttons are available on the shield on top of the Arduino; blue is to start and stop recording and red is to start and stop playback.
The schematic of the circuit used can be seen in the following figure, where the row of sensors at the top of the breadboard represent the piezoelectric sensors:
The following is a snippet of code uploaded to the Arduino which illustrates what occurs when a sensor is struck (click here to download the entire code uploaded to the Arduino):
At the start of every loop, the Arduino reads the ADC for any voltage coming from the piezoelectric sensors. If it does read a value, and this value is above a minimum threshold, then it will attempt to find the maximum value output by the sensor. This ensures that only the maximum force of the impact is measured. The Arduino will then write the sensor number and the maximum value returned to the serial port. The maximum value is mapped to a value between 32 and 127 before being written to the serial port. A lower bound of 32 was chosen to ensure that the note can still be heard if struck with a minimum amount of force. A delay of 50 milliseconds is used to help debounce the signal and prevent any additional voltages from being read in by the ADC.
The following is an image of the final Max patch used for the drum kit:
Figure 6: Image of the main Max patch used to interface with the drum kit
The Max patch above uses three abstractions to simplify the overall look of the patch. The following images show the patch for each abstraction:
Figure 7: Image of the arduino_2in abstraction
Figure 8: Image of the note_number_selector abstraction
The resulting hardware works rather well with the completed software, as can be seen by the video below of the project in action:
There is, however, some room for improvement. The very minimal debouncing for the analog sensors, which is performed by waiting 50 milliseconds after writing data to the serial port, is not very effective. The use of a more complex conditioning circuit might be necessary to improve the response of the sensors and to output one and only one value to the ADC of the Arduino. The current debouncing solution occasionally produces an echo effect to some of the sensors that is unwanted, but a longer delay would potentially lose notes if the drums were played at a very fast tempo. Another issue with the drum kit is that it has trouble playing two notes at the same time. This might be an issue with ADC reading speed on the Arduino or might be caused by the current debouncing solution. A protoboard would have improved the usability of the buttons, because it would have prevented them from being lost in the wires on the Arduino breadboard shield. Finally, when filming the video above, it was noticed that the very small delay between hitting the sensors and the note being played out made the drum kit rather difficult to play rhythmically. It is difficult to pinpoint where the bottleneck occurs, so more exacting testing would need to be performed.
In conclusion, the goals of the project were met. An electronic drum kit, that uses sensors to interface with an Arduino, which then sends the data to a Max patch that outputs MIDI drum data, was developed. The look and feel of the completed drum kit met my expectations. The software interface with Max 7 also very much met my expectations. The responsiveness between the drum kit and software, however, does need some improvement. However, for a prototype, I believe this drum kit works quite well and I am happy with the results.
Many thanks to Laura and Karen Den Hertog for the use of studio space and their help with finding materials to make the drum pads with. Also, many thanks to Dirk and Annie Dubois for their help in making the drum pads and Annie’s incredible video shooting and editing skills. I could not have done it without you all.