Ottopot
Introduction
This is the ottopot. It's a MIDI controller I made with nothing but 8 dials. However, the dials I made in the highest quality that I possibly could. There are 2 things in particular that I haven't seen in any other similar devices:
High resolution with 14bit MIDI CCs (12bit effective resolution) and a quasi-1:1 mapping from physical movement to CC value; like you know from analog potentiometers but of course without the stops on either end.
The PCB was graciously contributed by Nervengift.
If you would like to build your own, I have published the 3D print files, PCB files, a build documentation and the source code here.
Here is an introduction and demonstration video
Features
14bit CCs
I've come across this a couple of years ago and I've been obsessed with it ever since. Usually you send MIDI control messages with a single CC that can hold a value between 0 to 127, so 7bit. That's a bit coarse for a lot of applications. 14bit CCs are a clever way of sending 2 CC messages in quick succession where the first one is the coarse value and the second one is the fine value. Since every bit doubles the resolution, this is huge improvement!
Now it feels like it is rather obscure, but I have found software support to be pretty good. Logic and Bitwig both support it; those are the DAWs I use, but from a quick search it seems like Ableton also supports it and probably others as well. For Bitwig and Logic, I wrote custom controller scripts.
Hardware support for 14bit CCs on the other hand is basically non-existent. That's one of the reasons why I built my own controller.
For the ottopot, I've settled with using 12bit for the read resolution.
1:1 mapping
With analog pots it feels like you are very much in control of the parameter; every movement on the dial directly translates into a change of the parameter. With typical MIDI controllers using encoders, it feels like there is a disconnect; like there's a layer of goop between the dial and the parameter. I think that is mostly because the relationship is not 1:1, so one full turn of the dial doesn't correspond to a full sweep through the parameter's range. They also often use acceleration so the value change is depending on the speed of your motion, not just the distance.
With the ottopot, it feels very close to analog potentiometers to me. There's no acceleration and I've made it so one full turn is one full sweep across the whole range. It makes for a much more musical feeling, at least it does to me.
Build
Overall cost for materials and shipping has been around 190€ for me. I have made a version of the faceplate that doesn't have the holes for the LEDs so you can just skip them — the code works the same without the LED boards connected. This way you can save ~100€ for the LED boards.
Another thing you could skip is the re-greasing of the pots, but I highly suggest that you do it. It feels so much better with lower resistance.
Materials
- Teensy 4.0 microcontroller — doesn't matter if you get the pins or not, we will add them plus some additional pins later.
- 8x Alpha RV112FF-40B1-15F-0B20K-0068
- 2x CD74HC4051E Multiplexer ICs
- 2x 0.1uF through hole capacitor
- optionally 1x Molex Connector for the LED boards
- optionally 8x Duppa RGB LED Ring Small; get the 10cm board to board cables
- 10x M3 threaded inserts
- 10x M3 screws (I use M3x8, but anything between M3x6 and M3x16 should be fine)
- Pin headers for the Teensy — you will need pins on the sides plus at least 2 more.
- 3D printed bottom case, top case and knobs
- Micro USB cable (to build into the case)
- Some rubber feet to glue on
- For replacing the grease in the pots: knife, pliers, degreaser, bearing grease (I'm using Shimano premium grease because I have it on hand)
Replacing the grease on the pots for lower turning resistance

Pry open the small legs that hold the metal part to the plastic base. I found it easiest to start with a utility knife and once they're opened a little bit, continue with pliers.

Remove the circlet using a pair of pliers. It's not easy! I found it helps to use a potentiometer knob to make it easier to hold on to the body.

Use degreaser to remove the factory grease from both the shaft as well as the base. That stuff is super sticky, it feels almost like glue. The shaft will turn very easily once the grease is gone. Make sure it is fully gone so the different pots will feel the same.
Best to do that in a sink and use some paper towels to dry and clean the parts. You can roll the edges of a piece of paper towel and use something like a tooth pick to get inside of the axle hole in the body.

Put some new grease on the shaft and the axle hole in the body. I'm using Shimano premium bearing grease and I really like the feel of it, just the right amount of resistance. Though I'm sure any other bearing grease will do the same. I'm putting a little grease on both parts and then insert the shaft and turn it around a couple of times before wiping the excess with a bit of paper towel.

Reinstall the circlet with a pair of pliers. Again, I found it helps to use a poti knob as kind of a stand for the shaft.

Put the wiper back on the body. There's a matching cutout on the wiper that fits into the shaft. The photo shows the orientation which I found to be easiest to make them fit.

Finally fit the body; there is a longer side which should face in the direction of the pins. Use pliers to bend the legs back over to hold the plastic part in place.

Done! You should have a pot that feels a lot easier and very nice to turn. Now just do it seven more times 🫠
3D printing the case and knobs
I've published the models on printables.
There's a top case for the version with LEDs and one for the one without.
The bottom part needs supports for the screw holes. I'm using paint-on grid-style supports and I break them off after printing with a screw from the other side.
I'm using the textured plate on my Prusa Mini+ with some 3dlac because I found it gives me the best looking bottom surface (which will become the top surface of the device). My current filament of choice is PolyTerra Charcoal Black.
For the knobs, I suggest printing 1 and checking the fit before committing to print all 8 in one go. I've varied between 100% and 103% scale depending
on the nozzle in my Prusa Mini+.
I use 10 heat set inserts from CNC kitchen in the top case and 10 generic m3x8 screws with allen heads to fasten the top case to the bottom.

Finally I use a couple of 3m rubber feet to glue onto the base to prevent slipping.
Ordering the PCB
So far we've only been using Aisler and the process could not be easier.
Click on the big “Get started” button on their homepage, unzip and upload this KiCAD PCB file and then go through their order process.
If you're using another PCB manufacturer, please let me know and I'll update this guide. The full KiCAD files are available in the git repository.
Soldering the PCB





Next, let's prepare the LED boards, if you'll add them.
Preparing the LED boards (optional)
Each of the 8 LED boards needs some specific solder bridges. I'll number them left to right, top to bottom.

This is the order of the potentiometers and LED boards seen from the top. Keep in mind we're working from the bottom so it will be flipped.

These are the areas in which we will need to add some solder bridges to set the i2c addresses and the pull-up resistors.

As an example, here's the first board with all solder bridges we need. This is the only board that will have the bridges for the resistors.
Here's a list of all solder bridges needed on the 8 LED boards:
- 1: Pull-up Resistors. SJ1. SJ6.
- 2: SJ3. SJ8.
- 3: SJ1. SJ8.
- 4: SJ2. SJ5.
- 5: SJ2. SJ6.
- 6: SJ2. SJ7.
- 7: SJ2. SJ8.
- 8: SJ3. SJ6.
Placing and connecting the LED boards (optional)



That wraps up the build!
Building & uploading the firmware
The code is a platformIO project so you'll have to have it installed. I'm using platformIO core from the command line but
the VSCode extension should be fine as well.
Clone the project from the repo to your computer.
If you have platformIO set up, make sure you connect the Teensy to your computer via USB and be sure that it is the only Teensy that is connected. Then run pio run --target upload
from the main directory of the repo and that should be it.
If you would like to change the LED color from the default blue, you can do so in main.h
.
Software Setup
Setup in Bitwig Studio
Download this Bitwig controller script and put it in your Controller Scripts folder. For macOS that is ~/Documents/Bitwig Studio/Controller Scripts
. It should recognize the ottopot under Settings->Controllers and you'll only need to activate it.
Setup in Logic Pro
Download this Logic MIDI Device Script and put it in the folder ~/Music/Audio Music Apps/MIDI Device Scripts/Teensyduino/Ottopot.device/
— it is important that the names match exactly, Logic can not be persuaded to look for it in different locations.
Once you start Logic, it should pick up the ottopot as a new control surface and Smart Controls should be mapped automatically.
Ideas for future versions
- Optimize for cost
- “Shift button” for small adjustments (going from 1:1 to something like 1:3)
- Forward and back buttons for changing remote pages
- Single pots as a sub-pcb that can communicate over something like i2c for easier custom made controllers
Thanks
Nervengift for the PCB contribution. I gave up on doing it myself and they saved v1 of the project by jumping in.
Polarity for testing and the publicity.
Bjørn and Juan for their work on the Endless Potentiometer code.
Input Labs for making the Alpakka controller and giving me the confidence that a homemade 3D printed product can easily rival industrially made commercial solutions.
Michael from CapraDesignStands for the advise and in advance for the help with the PCB.
Divergent Waves for helping with KiCad and the PCB.