lo-fi FM-capable mono/poly

Norns port of Max4Live projects bitters and onebit. I wanted to try my hand at learning a little SuperCollider, and this seemed like a great excuse. I implemented a “polynomial transition region” oscillator UGen; the pulse wave is essentially due to Peter McCulloch; I did the asymmetric triangle wave. Like the original, bitters is inspired by chiptune sounds, but doesn’t attempt to emulate anything out there. The architecture is as follows: each oscillator has an FM pair to modulate it a little like Just Friends or W/Synth. The oscillators are mixed and optionally degraded before reaching the filter, which is highpass-into-lowpass like the MS-20. The polyphony code is cribbed from @infinitedigits’s mx.synths, and I added @tehn’s halfsecond softcut delay from Awake.


norns, MIDI input


Requires a SuperCollider restart after first running the script: the script checks to see whether my UGens, TrianglePTR and PulsePTR are installed and installs them if not. SuperCollider needs a restart in order to find these UGens.

221022 Update: If you have not updated the script, I highly recommend doing so; I significantly improved how the script handles its UGens; this will allow future scripts using TrianglePTR and PulsePTR to more easily coexist with bitters.

E1 scrolls pages
K2 and K3 switch tabs
E2 scrolls params
E3 edits params




github link


Man. This song. It’s in my blood and my bones.


gotta love a good Mario theme


Is the structure of the FM engine at all similar to the one found in later NES carts? Or was the use of this track merely out of an enjoyment for the sound?

1 Like

just enjoyment of the sound! the FM is Chowning-style phase modulation, but the carrier is a pulse or asymmetric triangle wave, not something derived from a sine


This is why it sounds so familiar! The VRC6 chip (an additional FM sound chip added to Castlevania 3 in Japan but not present in the US version) is a simple FM chip that added 2 extra pulse-wave channels with FM properties and a 3rd sawtooth channel. That pulse-wave FM sound is really distinct, which pinged me in a way!

I love this and will try to check it out tomorrow! That’s really really cool and such a fun coincidence!!


Amaaaaaaaaaaazing sound. Love what you landed on here with tone choices. Underwater theme fills me with so much joy/blooper paranoia :octopus:

If you ever want a cheeky lemon mascot for this lemme know the size and I can try and whip something up! :lemon:


Cute! Awesome script. Idea for a feature: randomization :smiley:


this sounds amazing! great work :smiley: and thanks for sharing


wow @alanza it sounds brilliant! and such a wonderful demo. I’m amazed by your work in SuperCollider, and how you wrote your own C++ plugins for this. :slight_smile: its inspirational.


thank you!! I really owe a lot to your SuperCollider drone demo getting me started and of course your polyphony management too.


this is spectacular work

i love the bit fam of instruments and congratulate you on the succesful port

well done!


I’m definitely going to use this. I’ve been hoping for some more chippy sounds on my norns :smiling_face_with_three_hearts::+1::grimacing:

EDIT: this script is awesome. Can get really thick and gnarly in a good way. I don’t really know what I’m doing when it comes to osculators, but I’ll figured it out as I go with this script. I’m a big fan.


I’ll continue to throw my hat in the ring for love of this script. There’s not enough PWM in the world anymore. There can never be enough PWM in the world. And it’s so cool to have a mix of FM and PWM.


Bitters = Bass


Bitters 0.2: Parameter Randomization

As suggested by @Ukasz, there’s now a trigger on the Params page that will randomize all the parameters—with the exception of those parameters having to do with the pitch (beyond octave control), the filters, and the FM. The reason for the omissions was to try and present a “usable” (or even just audible!) sound more often when you click randomize. Even with all these omissions, there are some pretty wild spots you can get to with the remaining “knobs”, so expect weirdness.

Thanks for sharing @McNUG!! It’s really cool to hear how other people are using bitters, especially in how that usage differs from my habits with it!


Thank you very moch :heart_eyes:

1 Like

This is lovely, thank you :blush:

1 Like

pushed a fix quashing a silly bug that prevented the mod envelope decay amount from being affected by anything the user did. All because of an errant space in a string. so it goes.


If you’re on the discord, you may have seen that I spent most of this past weekend trying to fix a little “notch” that was appearing in the code for the triangle oscillator. It is indeed fixed, reducing the amount of aliasing significantly!

Update Process

If you already have Bitters installed, you can update it from Maiden just fine, but afterwards you’ll need to run the following command to take advantage of the new TrianglePTR:

util.os_capture("cp /home/we/dust/code/bitters/bin/TrianglePTR/ /home/we/.local/share/SuperCollider/Extensions/TrianglePTR/")

Updating post 221022

util.os_capture("cp /home/we/dust/code/bitters/ignore/TrianglePTR/ /home/we/.local/share/SuperCollider/Extensions/TrianglePTR/")