I’ve been spending time recently with my Music Thing Modular Workshop System: a complete modular synth in a small peli-style case. It’s mostly analogue, but it has a digital computer module on the left that’s powered by cards. For each card the hardware stays the same (a few knobs, a switch, two audio in jacks, two CV in jacks, two pulse in jacks (and the same for audio/cv/pulse out)) and the card you plug in decides what the thing actually does. Reverb today, Turing machine tomorrow, something I wrote myself the day after.

Siren is one of those something-I-wrote-myself cards. It’s a multi-algorithm drone oscillator, and the code is on GitHub.

Why?

A few reasons, really.

The Forge TME Vhikk X had been on my radar for ages – its SEED/SCAN paradigm (structural randomisation on one knob, timbral morphing on another) is a really nice way to think about a drone, because it separates “what is this thing fundamentally made of” from “what does it sound like right now.” I think that split is the bit that makes it interesting to play with rather than just set and forget.

But Vhikk X is a popular module, and as a result a hard one to get and also on the expensive side. I also didn’t really want another module taking up rack space when I wasn’t sure that I needed it. So the obvious thing was to write the card I wanted and use it as a trial to see if this was a module that I should get.

The other reason is that I’d been wanting an excuse to get into the Workshop Computer development side of things. There’s a vibrant little community building cards in C++, Rust, Python, Lua — and the ComputerCard.h header gives you a really clean abstraction over the hardware. I dipped my toe earlier by adding some arpeggiator features to the chord blimey card, But now I wanted to do something myself.

What it does

This is where I took lots and lots of inspiration from Vhikk X and its documentation. Six oscillator banks, each with its own character:

  • SINE — multi-sine cluster with phase feedback. The purest of the lot.
  • CLST — tightly detuned oscillators for beating and phaser textures.
  • DTON — diatonic intervals using just intonation, with wavefolding. Comes out as actual chords.
  • ANLG — two oscillators that crossfade between cross-modulation and ring modulation.
  • WSHP — FM-ish timbres via tanh waveshaping. Metallic, bright.
  • WAVE — wavetable scanning with bit reduction. The most digital-sounding bank.

The six parameters that I took exactly from the ones on Vhikk X (WARP, SPAN, MORPH, SEED, SCAN, BASIS) are spread across two switch positions on the three knobs. Each parameter does something different in each bank, which is the bit I find genuinely fun, though also a little confusing at times: the same MORPH knob is shifting per-oscillator amplitudes in SINE, swapping waveforms in CLST, and scanning carriers in WSHP. Same physical gesture, six different behaviours. It rewards exploration.

Effects, filtering, modulation are things that are in the ‘original’ or real module, but for this card I left these roles to external modules. I think that’s the right call. There’s already enough going on inside the card without trying to be a complete signal chain.

Some things I had to figure out

A few quick notes on bits that took thought.

Knob pickup. When you switch between Up and Middle on the switch, the knobs are now controlling completely different parameters. If they jumped instantly to whatever the physical knob position said, you’d get ugly parameter snaps every time you switched. So I borrowed the Arturia MicroFreak’s behaviour: the parameter holds its old value until the physical knob crosses near it, and only then does it start tracking. It’s the kind of thing you don’t notice when it works, which is the point.

Fitting everything onto so few controls. The real Vhikk X module has a lot more knobs and space on it. The Workshop System Computer, not so much. I had to figure out how to map these different controls onto the Computer. It’s not perfect, but I think my idea on settling on Z-switch positions to determine what each knob does combined with the knob pickup kind of solves it.

Fixed-point everything. The Workshop Computer runs on an RP2040, which is a lovely little chip but doesn’t have hardware floating point. So all the DSP is fixed-point — Q15 for audio, Q16.16 for phase accumulators. Lookup tables for the waveforms (1024 points, linearly interpolated) and the nonlinearities (tanh, wavefold). Estimated CPU usage is around 20–40% of budget per sample at 48 kHz, which leaves headroom for the crossfade buffer to do its thing.

Status

It works. It’s running on a card in my workshop system. There are two videos on the GitHub repo if you want to hear it: an overview of the banks and a short jam. The code is MIT licensed, the build instructions are in the README, and if you’ve got a Workshop System or the standalone Workshop Computer with a blank card lying around you can flash it yourself. You can find the latest uf2 to download and flash here (it’s card number 27): https://tomwhitwell.github.io/Workshop_Computer/index.html

Things I’ve learnt

  • The ComputerCard.h abstraction is genuinely good: most of the work was DSP, not hardware-wrangling.
  • There’s some great instructions and background in the wonderfully named WORKSHOP_COMPUTER_AI_DIRECTIVE that I gave to Claude to help with everything.
  • Crossfading bank transitions made a much bigger difference to how the card feels than I’d expected. Worth the buffer.
  • The community on Discord for the Workshop System/Computer is super nice, gives incredible feedback and is a great place to learn things. Thank you to all those kind folks there.
  • It’s a lot of fun to play with, a little bit confusing with all of the controls at times, but to me it’s a good way of dipping my toe into the Vhikk X ecosystem.

If you’ve got a Workshop System or Workshop Computer, give it a go. If you don’t, the Vhikk X is likely far better but also a little more expensive.

Leave a comment

Your email address will not be published. Required fields are marked *