Two-layer polysynth

Clone of a clone — Yamaha CS-80 via Deckard’s Dream

(image or video forthcoming or audio or something)

Each voice consists of two layers; each layer has:

  • A saw or pulse wave or both
  • Noise
  • A dedicated LFO for PWM
  • A resonant high pass filter and resonant low pass filter in series
  • A dedicated envelope for the filters
  • A sine wave at the fundamental added after the filters
  • An envelope on amplitude.

You can control the mix of the layers, and add more modulation from a per-voice or global lfo. Velocity and polyphonic pressure modulation of many parameters is built in at a deep level.

This is a GAS-buster script for me. I was thinking “I would love to have some kind of a hands-on polysynth to play with MPE” and there I was shoulder deep in YouTube when I realized I had a Norns and some supercollider ability so I could see what I could do with those skills.

I didn’t exactly fully succeed at not buying anything for this project, though. The CS-80 or DDRM has so many dang sliders, and it would be a shame not to have a hands-on experience creating patches, so I bought a used MIDI Fighter Twister, and designed the script to use three pages of two layers of sixteen knobs with LED rings. It’s not necessary to play this script though — you can access everything from the params menu, most of everything from the keys and encoders of norns, and a grid will give you a fast path to parameter selection once you’re used to it (and/or act as an isomorphic keyboard).

Can load Deckard’s Dream preset files.

There is still more tweaking to do, both on the interface and on some sound features (the support for paired voices is still a little preliminary), but I want to get this posted now because it’s entirely usable.

Oh yeah, and while you can use the script standalone to play synths, it’s also a rockin’ nb voice. Turn it on as a mod to access that.


Required: norns
Recommended: midi controller, midi fighter twister or grid


Install, restart norns, you know the drill.

When you start doubledecker with a MIDI Fighter Twister connected, it will flash the MFT with its own config.

To use from norns without a grid or MFT, edit params using the param menu or use e1 to select parameter pages, k2 and k3 to navigate pairs of params on the 4x4 param grid per page, and edit param values with e2 and e2.

With a grid, you can toggle between isomorphic keyboard mode and param edit mode by pressing the bottom left corner. In the params you can select how many half-steps x and y are, which allows you to do anything from a standard linnstrument-style half-steps dx and fourths dy to wiki-hayden fourths dx and fifths dy, which makes whole steps along the diagonals. In the param edit mode, you can press a key to highlight pairs of params to edit with e2 and e3 by pressing the corresponding grid key. The top contains 4x4 grids for each layer, and the bottom contains a grid for the both-layer parameters.

With an MFT, use the side buttons to switch pages. The pages control Layer 1, Layer 2, and the both-layer parameters, in order. When there are two parameters to a grid slot, push the encoder and turn to edit the secondary parameter. For example, push the filter cutoff and turn to edit resonance. I have chosen colors for the color LEDs that are reminiscent of the sldier caps on the original CS-80, but with black replaced by dark blue/purple and white replaced by light blue/cyan.

Doubledecker can load presets directly from a file, even if you’re using it as an nb voice from another script, so you can share Doubledecker presets between scripts. It accepts two types of preset formats:

  • a norns preset file; it’ll load only the relevant doubledecker params, if any
  • a Deckard’s Dream preset or bank file. You can select numbered presets from the bank. I haven’t got the parameter tuning 100% right yet, but the presets mostly sound sensible-ish. @21echoes has been helping me get it right, but dear lord there are so many dang parameters to tune. Anyway if you have a DDRM tell me how close you think it is.

To use doubledecker as an nb voice, activate it as a mod, then restart. I highly recommend picking the mono version to use with scripts like n.kria, if you’re only using it on one voice. The poly versions will be too much CPU unless you’re not using other synths too.

Differences from the hardware

  1. I have only made six voices accessible, rather than eight, because that’s what I can get out of my Pi 3b+ shield without crackles.
  2. I haven’t yet implemented the two kinds of voice allocation.
  3. No chorus or ring mod (sorry) (yet?)
  4. Paired voice implementation is experimental and incomplete
  5. Only portomento, no glissando.
  6. In Doubledecker you can change the keytracking independently per layer, you can set either filter IL or AL bipolarly, not just negative for IL and positive for AL… some other minor extra flexibility like this.
  7. Unfortunately, for performance reasons, a layer will use non-bandlimited waves when both saw and pulse are on. If you’re only using one per layer, it’ll be the band-limited version.


  • Better screen interface
  • Quadrature LFOs for paired voices
  • Ring mod or chorus?



doubledecker on github


Many thanks to the Black Corporation for writing a really good manual
to @JulesV for the code to load configs into a MFT.
and especially to @21echoes for an intense amount of answering questions and measuring parameters on a physical Deckard’s Dream.


wow, this is really impressive. thanks a lot for sharing your hard work!


All of this is truly astounding…can’t wait to test it!!! Thanks for the super work!!!

1 Like

wow a CS-80 on norns! :heart:

thanks! looking forwarding to trying it.

1 Like

Oooooh yes, gloriously complex sounds. Have had this running nonstop for two hours now.

Loving how the grid display works with the columns acting as faders with gradual brightness of the buttons showing the changes in level of that parameter. Very visually pleasing.

Optional feedback:
One thought would be to have that fader section of the grid which currently displays the level also be a control surface. This would allow jumps in parameters akin to a fast slider movement on the originals.

Hitting a button in any related column brings up the level of that parameter to the equivalent of the first brightness level for that row. Subquent presses on the same row increment the level 1 to 10 until the max is reached for that row and then it decreases it 10 to 1. Or it could be one press brings it to the mid level for that row and the encoder fine tunes.

Either way the idea is to enable both big jumps and fine control.


This is so so so well done. :sparkling_heart: About to travel for a month and was definitely not going to bring the DDRM… and now that feels just fine.

Also, remember to use the reverb, folks! :rocket:


This is amazing, I’ve been dreaming of a Deckard’s too, and the built-in MFT integration? Awesome. Thank you so much for your work!


This is glorious. The twister addition as well is chef’s kiss


Well, I just disappeared for two hours…. This is great!
Actually considering getting a twister again…

With the DDRM presets, are they accessible somewhere? Can’t seem to see them if they are meant to be there


I did include the presets that I could extract from J F Sebastian, a DDRM companion app. I should make them easier to get to. Right now I will not vouch for their verisimilitude, except that I think I got the filter cutoffs fairly exact. They are good jumping-off points for tweaking and twiddling, at least.

The file is home/we/dust/code/doubledecker/lib/dd_f.p

You can load it from the bottom of the doubledecker section in params.


Awesome! Thank you. Look forward to playing with those

When I make presets easier to access, I’ll include my favorites of my own creation too… and also any of y’all’s favorites, if you want to contribute them. So if you have a favorite preset, please send me the Norns pset file if you’re willing, and I’ll distribute them with doubledecker soon.


Oh my word. This is so awesome. Have been gassing on DD for a few years now…and I already have a midi fighter. Meant to be!

The simple version of this is done. You can use the grid to jump the values, but it doesn’t have fine control - for that still use the encoders.

I also rearranged the preset loading parameters a little so as to make it easier to explicitly load the preset instead of having it do so automatically — that was conflicting with the normal params preset load. And I set up the default DDRM bank as the default source of presets to load.


This one is lovely, and the controls are super intuitive!

1 Like

you are a blessing and a remarkable asset to this community, thank you for sharing this and all the work that you do!


The collection of presets on the script is great, I’ve been gradually playing through all of them.

In addition I’ve been exploring this preset collection by Paul Schilling.

CS80_preset_bank.p (12.3 KB)

However the output volume across most of the presets is very quiet. I’m wondering if there is something about them that is different to the JS Sebastian ones.


Awesome! really good sounding synth @sixolet Is a joy using as a nb voice, specially within wrms or rpls!

I think I got a bug: when using as nb voice the presets don´t load


1 Like

Should be fixed now. Had forgotten to write a cleanup for the main doubledecker script.