xD1 is an FM synth


xD1 is an FM synth with filters

This is an attempt at making a synthesizer without writing a UGen.
It’s based on FM7,
and uses the 32 FM algorithms from the DX7.
I haven’t striven for feature-parity with the DX7,
and in fact xD1 has filters, where the DX7 has none.
Nonetheless, the control setup is very similar.
Each operator has an envelope, a ratio and an index.


Norns, MIDI input, grid (optional).


Attach a MIDI controller, launch the script, make sure yr MIDI controller is selected in the Params menu, and you’re golden.

Grid control: think Earthsea. There’s one pattern recorder arranged along the left edge of the grid.
The buttons are, in order, rec, play, loop, clear.
As of 0.2 you shouldn’t really need it, but if you find yourself unable to clear stuck notes,
press the bottom key on the left edge of the grid to send a killall message.


v0.2 Github link

;install https://github.com/ryleelyman/xD1

this is amazing. It sounds absolutely wonderful and I love the interface!


hell yeah! :smiley:

congrats on the script, it sounds awesome. Love FM synthesis

1 Like

Hi so is this finally the update on FM7 (Norns) with a functional UI? Sweet.

@hallmar the best! =}


I will admit I was inspired by FM7, but not enough to fork it haha


This sounds gorgeous - thank you very much!

1 Like

20 Characters of Piano Phase! :smiley:


I belatedly realized that I could use that as my sequence while showing off choukanzu to @WilliamHazard a few weeks ago as a chance to look cool haha, so consider this making up for a missed opportunity :smiley:


Thanks for this! Been wanting to use these sounds.

Having had a very quick go so far I’ve noticed that the default amp value seems a bit too loud maybe, it clips easily if you play a few high velocity notes at once


thanks for the feedback! I lowered the amplitude by about 6dB.


Cool :slight_smile: I can still get it to clip fairly easily but anyway I usually map a controller slider to amp anyway

Another hopefully useful piece of feedback: I set some long release values and get CPU-overload-sounding distortion if I play a load of notes quickly

that tracks: xD1 generates 10 envelopes, an LFO and an instance of the FM7 UGen on each note; it’s not the cheapest synth.


Still version 0.1 changelog

I enabled Grid integration. Think earthsea: there is one (clocked) pattern recorder which listens to Grid and to Midi input. Enable it for the first time with either the REC key: (1,1) (top left corner) or PLAY key: (1,2) (just below that). this will record until REC is turned off, and the “tape length” is set when PLAY is turned off for the first time. Playback is with the PLAY key; looping may be toggled with the LOOP key (1,3). Patterns can be cleared with (1,4).

For some reason while using grid stuck notes may develop. I added a killall command to the engine (so this update requires a SYSTEM > RESTART) which gets rid of them. Trigger it with key (1,8) if need be.


Oh wow. @alanza thanks so much for this. Sounds incredible!


Squashed a few bugs:

  • the pattern recorder properly accepts and interprets MIDI input
  • the pattern recorder now no longer causes stuck notes
  • dead synths should hopefully no longer hang around when new notes are played on top of them—this should mitigate @Cementimental’s issue significantly :). This last one was a SuperCollider fix, so do the good old SYSTEM > RESTART to catch the latest.

v0.2 changelog

Added a tanh on the output to gracefully avoid clipping and distort instead.
(Thanks very much to @sixolet for talking through how to do Busses in SuperCollider.)
I therefore reverted the amplitude changes from earlier—I already find my norns kind of quiet,
so I prefer to have my synths loud by default, since you can always turn them down.
(Again, this is a SuperCollider change, so needs SYSTEM > RESTART)

(Okay that’s not a lot, but cumulatively I think we’ve earned 0.2)


v0.3 changelog

Discovered that FM7 does not mix together parallel outputs by default,
resulting in nearly every algorithm missing at least half of its utility;
so fixed that—and tweaked the levels down a bit,
although perceptually they should be about the same.
(This is a SuperCollider change, so needs SYSTEM > RESTART)
Also tweaked reflection, my pattern recorder
so that it should hopefully no longer cause dead notes and crackles.
Potential “gotcha”: while overdubbing,
newly recorded notes will not play back until recording is stopped,
either with the rec button or the play button;
for this reason it might be best to record one “pass” each time around the loop.


v0.4 changelog

xD1 is now multitimbral.
Well, the engine is; the script is still monotimbral.
If there’s significant interest in—and ideas for—implementing multitimbrality in this script,
I’ll happily do it or accept a PR.
Strictly speaking this update should be basically equivalent to v0.3,
but lays the groundwork for other possible uses for xD1.



no functional changes, but this update ensures that xD1 plays nicely when used inside of faeng


FYI the load screen still has version string 0.2, which might be confusing for users who’d expect it to match what’s being announced and discussed here.

[On legacy version control systems such as CVS this was done so that a preprocessor would converts special tags in source code files to version numbers in source files, but this isn’t the case with git]