Hi everybody,
I'm a Product Design Engineer and musician based in London. It has taken long for me to make this first blog post but I will hopefully start posting more regularly from now on.
I will start off by giving a short introduction of my project in its current state.
Kazumi
Kazumi is an accessible instrument for aspiring musicians and makers. It is self-contained and is designed as an open-source DIY kit so that users can adapt it easily. Each of the seven surfaces is a touch-pad that either triggers or modulates sounds, which are tuned differently depending on how the structure is rotated on its base. Playing music on Kazumi is a tactile, sensual experience, hands exploring and caressing to draw different notes from the integrated speaker. Experimental and immediately accessible, Kazumi is something to play, and therein lies its wonderful attraction, drawing those into music-making those who might feel alienated by more traditional instruments.
Hardware
Kazumi v1 is made up of the following:
Off-the-shelf:
1x Raspberry Pi 2 Model B
4x MPR121 Capacitive Sensing Breakout Boards
1x Raspberry Pi Soft-Shutdown Breakout Board
1x 6000mAh Power Bank
1x 2.5W Portable Speaker
10x 10mmx3mm Neodymium Magnets
Custom-made:
1x Structure:
- Foam base (laser cut)
- ABS base (laser cut)
- 7 Acrylic legs (laser cut)
- 7 Pad rests (laser cut acrylic + magnetic tape)
- ABS top (laser cut)
7x Touch Pads:
- Polypropylene tray (laser cut) + magnetic tape
- 5 Copper Adhesive Electrodes (cut on a vinyl cutter)
- Foam insert (laser cut)
- Reflective PVC cover (cut on vinyl cutter) + magnetic tape
Software
On startup, the Raspberry Pi is running a python script that asks the MPR121s for the baseline and filtered datastreams, subtracts them and sends the difference to Pure Data:
import socket import time import MPR121 # Create MPR121 instances cap1 = MPR121.MPR121() cap2 = MPR121.MPR121() cap3 = MPR121.MPR121() cap4 = MPR121.MPR121() # Initialize communication with all 4 MPR121 cap1.begin( 0x5a ) cap2.begin( 0x5b ) cap3.begin( 0x5c ) cap4.begin( 0x5d ) s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("localhost", 9001)) # Start loop while True: # Filtered and baseline data are commented out # filtered = [cap1.filtered_data(i) for i in range(12)] # print 'Filt:', '\t'.join(map(str, filtered)) # base = [cap1.baseline_data(i) for i in range(12)] # print 'Base:', '\t'.join(map(str, base)) # Difference for all 4 boards are calculated, printed in terminal and sent to Pure Data diff1 = [cap1.baseline_data(i)-cap1.filtered_data(i) for i in range(12)] print 'Diff1:', '\t'.join(map(str, diff1)) s.send('diff1: ' + '\t'.join(map(str, diff1)) + ';') diff2 = [cap2.baseline_data(i)-cap2.filtered_data(i) for i in range(12)] print 'Diff2:', '\t'.join(map(str, diff2)) s.send('diff2: ' + '\t'.join(map(str, diff2)) + ';') diff3 = [cap3.baseline_data(i)-cap3.filtered_data(i) for i in range(12)] print 'Diff3:', '\t'.join(map(str, diff3)) s.send('diff3: ' + '\t'.join(map(str, diff3)) + ';') diff4 = [cap4.baseline_data(i)-cap4.filtered_data(i) for i in range(12)] print 'Diff4:', '\t'.join(map(str, diff4)) s.send ('diff4: ' + '\t'.join(map(str, diff4)) + ';') # Short pause before repeating loop time.sleep(0.001)
In the background, Pure Data receives the datastreams and organises them into number boxes that correspond to each pad/note. It also gets the capacitance from the magnets from the base, in order to know if the top part is snapped into position and which side is the tonic note. I will share more about the patches in later posts, when I adapt this for Heavy Audio Tools to run on the Bela Platform and BeagleBone Black.
---
That's all for now. In the next post, I will talk about my objectives for this challenge and explain why I have decided to use BeagleBone Black.