Skip to content

Instantly share code, notes, and snippets.

@audionerd
Last active October 2, 2024 20:47
Show Gist options
  • Save audionerd/fe50790b7601cba65ddd855caffb05ad to your computer and use it in GitHub Desktop.
Save audionerd/fe50790b7601cba65ddd855caffb05ad to your computer and use it in GitHub Desktop.
SuperSaw (Roland JP-8000 and JP-8080) in SuperCollider
// via https://web.archive.org/web/20191104212834/https://www.nada.kth.se/utbildning/grukth/exjobb/rapportlistor/2010/rapporter10/szabo_adam_10131.pdf
(
{ | freq = 523.3572, mix=0.75, detune = 0.75 |
var detuneCurve = { |x|
(10028.7312891634*x.pow(11)) -
(50818.8652045924*x.pow(10)) +
(111363.4808729368*x.pow(9)) -
(138150.6761080548*x.pow(8)) +
(106649.6679158292*x.pow(7)) -
(53046.9642751875*x.pow(6)) +
(17019.9518580080*x.pow(5)) -
(3425.0836591318*x.pow(4)) +
(404.2703938388*x.pow(3)) -
(24.1878824391*x.pow(2)) +
(0.6717417634*x) +
0.0030115596
};
var centerGain = { |x| (-0.55366 * x) + 0.99785 };
var sideGain = { |x| (-0.73764 * x.pow(2)) + (1.2841 * x) + 0.044372 };
var center = LFSaw.ar(freq, Rand());
var detuneFactor = freq * detuneCurve.(detune);
var freqs = [
(freq - (detuneFactor * 0.11002313)),
(freq - (detuneFactor * 0.06288439)),
(freq - (detuneFactor * 0.01952356)),
// (freq + (detuneFactor * 0)),
(freq + (detuneFactor * 0.01991221)),
(freq + (detuneFactor * 0.06216538)),
(freq + (detuneFactor * 0.10745242))
];
var side = Mix.fill(6, { |n|
LFSaw.ar(freqs[n], Rand(0, 2))
});
var sig = (center * centerGain.(mix)) + (side * sideGain.(mix));
sig = HPF.ar(sig ! 2, freq);
}.play(s);
)
@audionerd
Copy link
Author

improved performance with lower UGen count via @jamshark70, see: https://scsynth.org/t/simple-fm-synthesis-question/5483/10

@schollz
Copy link

schollz commented Dec 17, 2022

Thanks @audionerd !!!! So cool

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment