A midi controller tailored for bitwig with 8 encoders, 8 knobs and displays. Still pretty much WIP.
- raspberry pico 2
- 8 digital encoders with buttons EC11 (need to find a better choice)
- 3 CD74HC4051 analog muxers
- 8 NeoPixel Diffused 5mm Through-Hole LEDs
- 2 128x64 OLED displays connected via SPI
The 3d subfolder has openScad files and rendered STL for 3d printing.
The front_test.scad is mostly for prototyping:
| Front view | Side View |
|---|---|
![]() |
![]() |
aseqdump -l | grep Octacon
32:0 Octacon Octacon MIDI 1
aseqdump -p32:0
Source Event Ch Data
32:0 Control change 0, controller 9, value 51
32:0 Control change 0, controller 9, value 52
The encoders send 7bit values on cc 9 to 16. In 14-bit mode, the lsb is send on cc 41 to 49. The encoder buttons send values {0=off, 64=on} on cc 17 to 25.
Since Octacon uses usb midi and is a hobby project, we're using the 7D (prototyping, test, private use and experimentation).
The following commands are implemented:
- 00: (recv) parameter names:
00 + <ix> + <len> + <name>- id: 0...7
- len: len of name, truncated to fit the display
- name: ascii string data
- 01: (recv) pretty parameter value:
01 + <ix> + <len> + <name>- id: 0...7
- len: len of name, truncated to fit the display
- name: ascii string data
- 02: (recv) daw connected? :
02 + <connected>- connected: 0 = off, anything else = on
- when off, parameter names and pretty values are generated
The code uses platformIO. See platformio.ini for the used libraries.
alias pio=$HOME/.platformio/penv/bin/pio
pio test
Since we're using usb-midi, we can't use it for serial logging. I am simply using a nodemcu esp8266 as serial2. On the nodemcu connect EN to GND to disaled the ESP. Then connenct the nodemcu to the pico2 as follow:
| nodemcu esp8266 | raspberry pico2 |
|---|---|
| GND | GND |
| 3.3V | 3.3V |
| TX | UART1 TX, pin 6 |
| RX | UART1 RX, pin 7 |
Now plug the nodemcu to usb and open /dev/ttyUSB0 to see the serial log.
I've got inspiration from many other places. Let me mention a few similar projects:


