Customizable Synthesizer

In playing with MIDI synthesizers over the last few years, one thing that has frustrated me is their lack of customizability. MIDI synthesizers currently offer a pre-selected number of faders, knobs, and buttons, with the ability to customize the output of these inputs, but not the number of the inputs themselves. My goal with this customizable synthesizer project is to allow users to customize both the number of inputs and the outputs of these inputs in a quick and intuitive way.

Design Plan

Users will have a main hub unit, and be able to attach any combination of interface modules to this hub. Interface modules will consist of, but not be limited to, potentiometers, sliders, and buttons. Once module units are attached to the main hub unit and the main hub unit is attached it a host computer, a GUI can be used to assign MIDI outputs to each module. When interaction occurs with a component of an interface module the respective MIDI note will then be sent to the computer. MIDI notes can then be utilized by third party software such as popular Digital Audio Workstations (DAW) like Ableton and Logic. The main hub as well as the modules connected to the hub will have custom 3D printed housings and ports that allow them to be interconnected.

Demonstration Video

Technical Details

Main Module

The main module will be in a rectangular 3D printed housing and have slots for four cat5 female ports, one on each side. It will be powered using a 5V 2amp power supply with barrel jack connector. It will also have two female cat5 connections and a USB micro female connector configured to talk with a host via asynchronous serial communication at a baud of 115200. Interface modules will be connected directly to the main module with a cat5 cables. Full duplex SPI communication and power will be delivered over these cabled. The main module will translate the SPI data received in these ports, translate it to MIDI, and send it to the host computer over the USB type B connector. All of these functions will be controlled by a STM32F0 microcontroller.

Interface Modules

All interface modules will contain a STM32F030C6 microcontroller and two female cat5 connectors, one on the left and one on the right side of the board. These connectors will be configured as a SPI slave and SPI master respectively. The slave port can be connected to either a master port on the main module or a master port on another slave module. If a slave module is attached to a slave module, the main module must exist somewhere up the daisy chain. In addition to these SPI connections, each interface module will have interface devices as explained in their respective sections below.

Fader Interface Module

The fader interface module will have a rectangular 3D printed housing with 16 slider potentiometers arranged in eight columns and two rows. Each slider is simple a potentiometer that will vary an output voltage. This voltage will be converted to a digital value between 0 to 127. When a slider is moved, its new value will be sent to the main module or other modules according to the SPI protocol. When these values are received by the main module, they will be converted to MIDI CC commands and sent to the computer. Different MIDI channels are assigned to each potentiometer so that each one can control different outputs simultaneously.

Button Interface Module

The button interface module will have a square 3D printed housing with 16 silicon buttons that will utilize silicone elastomers available here on adafruit. The PCB will mimic adafruits trellis board, which allows the silicone elastomers to short a metal connector. MIDI commands will be sent on press and depress events.

Rotary Potentiometer Interface Module

The rotary potentiometer interface module will have a rectangular 3D printed housing with 16 rotary potentiometers arranged in eight columns and two rows. These potentiometers work identically to the slider potentiometers, the only difference being that these will rotate whereas the sliders vertically.

Touchscreen Interface Module

The Touchscreen module will have a rectangular 3D printed housing with the touchscreen on top. It will contain a 3.7” resistive touch screen produced by Adafruit Industries LLC. It contains four pins that will be connected to four ADC pins on the STM microcontroller. The microcontroller will actively poll these ADC pins in order to determine the x and y coordinates of the user’s finger. The user will be able to map both the x and y movements to two different MIDI channel outputs on the GUI. With continuous finger movement on the touch screen, a series of data will be read and sent to the main hub. The main hub will translate this series of data to MIDI commands that are sent to the host computer.


Cat5 cables connect interface modules to the main module as well as interface modules to one another. A single micro USB cable connects the host computer to the main module, and a 5V barrel jack power supply connector supplies power to the main module, which powers all interface modules.


Embedded Software

All modules will consist of the same SPI communication logic. This logic is as follows: any update to the state of interface module’s interface device will be sent immediately over its slave SPI port. An update to the state of the module will be determined by continuously polling inputs and updates will occur when the value of these inputs changes greater than a predetermined noise threshold. To filter noise an exponential moving average filter is implemented in software and decoupling capacitors are used in hardware. The master SPI port will be polled continuously if another module is connected and any data received on this port will be immediately forwarded to the interface module’s slave SPI port. In order for interface modules to be properly assigned on boot up, the first thing they will do after booting up is communicate their device type over their slave SPI port.

Computer Software

A python script is running on the host computer that does a few things. It communicates with the main hub via serial communication, and sends this data to a virtual MIDI port on the host computer. The serial port and MIDI port used by the program are selected by the user when booting up the python application. The main hub communicates the number of devices and their types to the host computer via serial, and the python hosts a web server that utilizes react to display this data in a web format. On connect and disconnects the GUI is automatically updated to show the current configuration and each module is given a default MIDI output. The GUI can be used to modify this output. Below is a screenshot of the GUI in action.

comments powered by Disqus