Kinetic MIDI Controller
An experimental MIDI controller
My idea for the Fab Academy final project is to design a MIDI controller that uses sensors alongside the usual buttons and knobs. Although almost any kind of sensor can be used to modulate sound, it is hard to find musical interfaces, especially in the mainstream market, that go beyond a box with buttons and knobs. I aim to question this approach and come up with something new. More specifically, I would like to develop an instrument that uses a gyroscope to interact with sound. I imagine a device that users could hold in their hands and rotate to change the sounds they play.
Structure of the device
The device should be compact, easy to handle, relatively quick to make, and affordable. I chose a “sandwich” structure: two 3D-printed shells around a wooden element that the user holds. Visual feedback will show what the sensors detect. The top will have 12 buttons, with the gyroscope in the centre.

Final project for Fab Academy 2020
The following sections describe the steps I followed to make my final project. Throughout the programme, I tried to connect each assignment to the development of the MIDI controller. I added documentation as the work progressed.

3D - Main volume for the top-shell

The first part I designed was the top shell of my “sandwich-shaped” MIDI controller. In FreeCAD’s Part Design workbench, I created a part, drew a sketch, and extruded it with the Pad command. I repeated the process to add a feature that fits inside the wooden element. I used Chamfer to smooth the upper edge and Thickness to hollow out the volume. Then I used Sketch and Pocket to make the button holes, repeating them with Polar Pattern twice to create 12 holes. Finally, I added holes for the LEDs and switch.

3D - Middle wooden element

With the main volume of the top shell complete, I moved to the wooden element that the user will hold. I drew a sketch and used Extrude in the Part workbench rather than Pad. This created an independent solid instead of adding to the previous part. After adjusting its colour and transparency, I moved on to the next component.

3D - Bottom shell main volume

The bottom shell will hold the battery, MIDI socket, and a tag with my name. I created a new part and padded a sketch so that it extended into the wooden element and protruded slightly. I then drew the shell’s profile, making sure it intersected the previous pad, and used Revolve to create a rotational solid. I used Thickness to hollow out the shell and modelled a simple battery volume to check the fit. If necessary, I could adjust the revolved sketch to make more room. Finally, I drew a circular sketch and used Pocket to make the MIDI socket opening.

Now that I have all the 3 volumes, I can start to work on the elements that will connect them.
3D - Top shell details

I extruded a column from the bottom of the top shell to connect it to the lower shell. Using Sketch and Pad, followed by mirrored features, I added the connection columns, PCB supports, and reinforcing elements around the shell. Finally, I added a support for the gyroscope.

3D - Bottom shell details

The bottom shell followed a similar process. The main difference was the series of Pad and Pocket operations needed to create the battery compartment, MIDI socket support, and tag recess. I used similar commands to make a cover for the battery compartment.

2D - design a mark to communicate the gyroscope position
CAD work usually starts in 2D and moves to 3D, but here I returned to 2D after modelling the main parts. I wanted a subtle graphic to mark the gyroscope’s position in the centre of the device. In Inkscape, I designed a pattern representing the X and Y axes in Morse code. I drew it with Bézier curves and used “Stroke to Path” to turn the stroke widths into closed shapes that could be extruded in FreeCAD.

2D - import the vectors in FreeCAD
Once the graphic was ready, I imported it into FreeCAD, converted it to a sketch in the Draft workbench, and used it for a Pocket operation in the top shell.

3D printing tests
I used Slic3r Prusa Edition to position the models and adjust the print settings. The preview helped me check the overhangs and bridges, including the angled PCB support. I chose a layer height of 0.15 mm. After exporting the G-code to an SD card, I moved to the Prusa i3 MK3. First, I loaded the PLA filament. I preheated the extruder to 215 degrees and gently fed in the filament. Then I inserted the SD card containing the G-code. The printer used its PINDA sensor to detect the build plate before starting the print. The result looked good, and the surface supporting the PCB was smooth. Some filament failed to attach around the circular bridge perimeter, leaving a little “spaghetti” inside, but the surface was still strong and stable. I considered the test a success.

Next, I printed a section of the lower shell. It includes the battery compartment’s large bridging area, a MIDI socket opening, and a small frame for the tag. Some holes sit above the build plate. I added a thin surface over those features to turn the unsupported outlines into bridges. The screws can easily break through that thin layer during assembly. Following the same process as for the upper shell gave good results, with only minor issues around the bridge perimeter.

3 – Testing component fit
Next, I checked whether the buttons, battery, accelerometer, MIDI socket, and tag fitted the printed parts. Almost everything fitted, but the tag needed adjustment. I also noticed that the gap between the circuit support and lower shell was almost zero, leaving insufficient room for the circuit.
So I came back to FreeCAD and fixed those problems and I also made some more STL files to test other components like LEDs and the switch.
After a little bit of ping-pong I managed to make everything fit perfectly!

Printing the complete shells
Finally, I exported and printed the complete shells. Their size made me a little nervous, but the earlier tests gave me confidence.

The upper shell had some thin strands of filament across its surface. These can be removed with hot air from a heat gun. I suspected that the extruder pressure was too high or the nozzle was too close to the bed, so I recalibrated the printer before printing the bottom shell, which came out well.
Finally, I placed the components inside the shells. I was very happy with the result.

CAM for the middle element (handle)

I made the wooden element using a CNC milling machine. FreeCAD’s Path workbench generated the G-code for the job.
Milling final project wooden element (handle)
The MIDI controller’s handle will be milled from a piece of fir wood.
As before, I set the milling origin and sent the job to the machine. I then removed the tabs with a Proxxon and smoothed the piece with sandpaper.
Assembly test for the wooden element
The printed shells fitted the wooden element perfectly. Once secured with screws, the assembly was firm and stable. I really like the combination of black plastic and wood. I may stain the wood before applying a protective finish.
Electronics
I also developed the electronics during the assignments. The controller has 12 buttons and a gyroscope as inputs. Its outputs include LEDs for visual feedback and a MIDI connector to send messages to a sound device.
The electronics consist of a Satshakit and a separate PCB for the input and output devices.
I designed them as two semicircular boards that fit inside the shells. I used KiCad and the KiCad StepUp add-on, which lets me work on PCB outlines with FreeCAD tools.
During the COVID-19 lockdown, I had a manufacturer produce the Satshakit, trying the outsourced production process Neil had mentioned.
I milled the input/output PCB myself, generating the G-code in FlatCAM and using the Stepcraft 2/600 Black Edition.
I soldered the components to the boards and fitted them inside the device. Soldering was challenging, with a noticeable difference between the milled board and the manufactured board with solder mask.
Once the assembly looked ready, I uploaded the code through the Arduino IDE. It was largely the same as in the output devices assignment, but I changed the baud rate to 31250 for MIDI communication.
Using the device
I connected the controller to my computer through a MIDI-to-USB adapter and used it with LMMS. It worked: rotating the device sent MIDI Control Change messages!
Final remarks
I’m happy with the final result, although there is plenty of room for improvement, especially in the electronics I milled and soldered. When I reopen the device, I’ll investigate the loose part inside, improve the soldering on the milled PCB, and work on integrating a voltage regulator.
Source files
Here are all the source files for the final project
1 – Top shell STL
2 – Bottom shell STL
3 – Full 3D model - FreeCAD
4 - wooden handle CAM
5 - PCB Satshakit KiCad files
6 - PCB Output devices KiCad files
7 - code with LED + MIDI
