2025-03-13

Ottopot

  1. Introduction
  2. Features
  3. Build
  4. Software Setup
  5. Ideas
  6. Thanks

Introduction

3 ottopot variants in different colors

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

Replacing the grease on the pots for lower turning resistance

Opening a potentiometer

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.

Removing the circlet

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.

Remove the factory grease

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 new grease on the shaft

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

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.

Reinstall the wiper

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.

Reinstall the plastic body part

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.

Finished pot

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.

Positions for the heat-set inserts
Put the heat-set inserts into the top case at these positions. I use a soldering iron at 250°C to insert them almost all of the way and then use a flat metal object to push them in the rest so they're flush with the case. It might be a bit overkill to use 10 screws, so feel free to skip some. Previously I've only used 4 on the edges but I've always seen slight gaps between the parts.

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

The blank PCB
Start with the multiplexer ICs. Take care that the notch on the IC is on the left where it is marked on the board. You might have to bend the pins to make it fit, I usually press it upright against the tabletop to straighten them out. With all trough hole components, I start by soldering one leg only. This will keep it in place so I can flip the board and make sure the component sits flat against it. If it's a bit off, you can simply heat this one pin again and press the component in place while the solder is molten. Also solder the caps next to the ICs and snip off their legs on the back.
Teensy with added pin headers
Solder pin headers to the Teensy like shown in the picture; when you buy the Teensy with pin headers, it doesn't come with all of the necessary connections, so you'll need to add the bottom row as well. If you have the Teensy version with header pins but don't have additional headers on hand, you can use something like a resistor leg to connect the 3v3 pin on the bottom (check the official Teensy pinout). Then solder the Teensy to the board using the pins.
Molex connector for the LEDs on the board
If you're going to add the LED boards, you'll need to solder the connector for them now. Mind the orientation, the white outline on the PCB makes it clear where it goes. The pitch of this connector is quite a bit smaller than the rest; I often ended up with bridges on the first try and had to go over it with some solder wick to remove excess solder.
Potentiometers soldered to the PCB
Next, let's solder the potentiometers. Once again I'm making sure that I solder a single leg per potentiometer first and then use the case to make sure that the fit is good. If anything is crooked, it's easy to fix with just one leg soldered, much harder if there are multiple connections. Once the fit is good, solder the other legs.
Potentiometers soldered to the PCB, other side
That's the PCB soldered!

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.

Potentiometers from the top with numbers

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.

View of a single LED board with areas for the solder bridges

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

First board with the required bridges

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:

Placing and connecting the LED boards (optional)

LED boards in the top case
Wire the LED boards up like in the picture; make sure that the boards are oriented so that the connectors face the front of the case. With the wires, I'm starting on the top right with board one, then follow along to the left, from there to the bottom and finally to the right. Don't get confused: This does not match the numbering of the LED boards since board number 5 is on the bottom right while the wires connect from board 4 down to 8. The order of the connections does not matter for the functionality but the placement of the boards (i.e. the solder bridges on the boards) does. The low right board will only have one cable connected. Connect the PCB to the unused connector on board 1, top right. Place the washers on top of the LED boards, and then place the PCB on top of those with the potentiometers going through the holes; watch the orientation of the PCB using the slot in the case for the cable. This is probably the most fiddly part of the build. The washers and LED boards need to stay in place, and you'll have to make sure that you don't trap any wires from the LED boards between the potentiometers and the boards.
Top side of the case showing the nuts
Secure the potentiometers with nuts from the top side — there isn't a lot of thread engagement. If the nut doesn't screw in, there's probably a wire trapped on the inside. They are m10, I use a socket to screw them just hand tight.
Everything connected on the inside
Connect the USB cable like shown; if you're worried about it, you can add some zip ties for strain relief. Put on the bottom and take care that you don't squeeze any of the wires between the halves, then screw in the bottom, push in the knobs and maybe glue on some rubber feet.

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

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.