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.
Requirements
Norns, MIDI input, grid (optional).
Documentation
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.
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
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
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.
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.
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)
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.
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.
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]