Final project

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 image: pres 1 Final project image: pres 2 Final project image: pres 3 Final project image: pres 4 Final project image: pres 5 Final project image: pres 6

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.

Final project image: fin1

3D - Main volume for the top-shell

Final project image: ass3.1

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.

Final project image: ass3.2 Final project image: ass3.3

3D - Middle wooden element

Final project image: ass3.4

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.

Final project image: ass3.5

3D - Bottom shell main volume

Final project image: ass3.6

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.

Final project image: ass3.7 Final project image: ass3.8

Now that I have all the 3 volumes, I can start to work on the elements that will connect them.

3D - Top shell details

Final project image: ass3.9

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.

Final project image: ass3.10 Final project image: ass3.11

3D - Bottom shell details

Final project image: ass3.12

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.

Final project image: ass3.13 Final project image: ass3.14

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.

Final project image: ass3.15

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.

Final project image: ass3.16

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.

Final project image: ass6.5.2 Final project image: ass6.5.3 Final project image: ass6.5.4

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.

Final project image: ass6.6.0 Final project image: ass6.7 Final project image: ass6.8

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!

Final project image: ass6.9 Final project image: ass6.10 Final project image: ass6.11

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.

Final project image: ass6.12 Final project image: ass6.13 Final project image: ass6.14 Final project image: ass6.15

Final project image: ass6.16 Final project image: ass6.17

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.

Final project image: ass6.18 Final project image: ass6.19

CAM for the middle element (handle)

Final project image: ass8.7

I made the wooden element using a CNC milling machine. FreeCAD’s Path workbench generated the G-code for the job. Final project image: ass8.9

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.
Final project image: ass8.14

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.
Final project image: ass8.15

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.
Final project image: fin2

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.
Final project image: fin3

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.
Final project image: fin4 Final project image: fin5 Final project image: fin6 Final project image: fin7

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.
Final project image: fin8 Final project image: fin9

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 project image: fin10 Final project image: fin11

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