Hello,
Intuitively, what would be your starting point to synthesize the sound of a Celesta ?
FM ? Additive ? Physical modeling ?
Hello,
Intuitively, what would be your starting point to synthesize the sound of a Celesta ?
FM ? Additive ? Physical modeling ?
Maybe all of these could be used, but FM is great for bells and metallic sounds so I would start there (although I am biased as I LOVE FM!).
I would try envelopes with exponential decay for amp and modulation duties as they sound very natural for percussive hits.
Best,
Paul
Had a little play with PMOsc to try this out - found that stacking and summing octaves seems to get closer to the sound.
(
SynthDef(\fm,
{ arg out=0, freq=440, amp=0.5;
var ampEnv = Env.perc(0.02, 1.3).ar(2);
var modEnv = Env.perc(0.01, 0.02).ar;
var snd = PMOsc.ar([freq, freq * 2, freq * 4],
[freq * 2, freq * 4, freq * 8],
modEnv * 0.1,
mul: ampEnv * [0.5, 1, 0.7]
).sum;
Out.ar(out, 0.2 * snd ! 2)
}).add;
)
(
a = Prand(#[60, 61, 63, 65, 72, 73, 75, 77, 84], inf).asStream;
b = Prand(#[0.5, 0.7, 0.2], inf).asStream;
Routine({
loop({
Synth(\fm, [\freq, a.next.midicps, \amp, b.next]);
[0.2, 0.2, 0.4, 0.4, 0.8].choose.wait;
})
}).play;
)
This is just a quick try. Itās not yet close enough (e.g. getting the felt hammer sound is hard), but may be a starting point for experimenting.
Hope that helps,
Paul
While I havenāt directly synthesised celesta sounds, I would like to share some speculative thoughts based on my experience synthesising piano, guitar, pyeongyeong (a Korean instrument), and other instruments.
Analysis Tools and Approach From my synthesis experience, Iāve found additive or subtractive synthesis to be viable approaches. My typical analysis process involves:
While I believe these steps might be achievable entirely within SuperCollider, I havenāt fully explored this possibility, especially for steps 1 and 2. Iād appreciate any insights on how to accomplish these steps natively in SuperCollider. For step 2, while EnvFollow could be used, Iāve noticed that the resulting envelope is curved.
Practical Considerations From my synthesis experience, Iāve learnt that exact spectral matching isnāt always crucial, as natural instruments vary significantly with:
While FM synthesis could potentially produce rich spectra, achieving precise characteristics can be challenging. (I mean controlling modulation frequency and modulation index to get similar sound characteristics is not easy.) Physical modelling could theoretically provide accurate results, but it requires specific implementation tools. I do not know which class in SuperCollider is best suited in this case.
Implementation Thoughts Iāve found that focusing on proper envelope application often yields better results than pursuing exact spectral matching. The post-transient spectrum can be particularly useful, as harmonic amplitudes tend to follow predictable decay patterns.
These are theoretical suggestions based on my related experience, and I welcome insights from those with synthesis expertise.
Amazing that this exists, but if you go here:
and search for celeste, you get a whole bunch of terrible patches that could āeasilyā be made with the FM7 plugin.
I just canāt believe someone took the time to make this site.
Sam
For an additive approach to percussive instruments, Iām a big fan of modal synthesis because you get a nice natural decay, and the noise exciter is different for every note, so youāll get subtle tone color variations between notes. A Formlet serves well as one partial, or, if the note doesnāt need to change pitch in the middle, Klank.ar(with decay characteristics) - Klank.ar(with attack characteristics) is equivalent.
Not convenient to post an example now, maybe later.
hjh
And that exampleā¦
(
SynthDef(\modal, { |out, gate = 1, freq = 440, amp = 0.1, pan = 0,
atk = 0.01, dcy = 5,
excAtk = 0.01, excDcy = 0.05|
var n = 5; // change this to add more partials
var ratios = NamedControl.kr(\ratios, 1 ! n);
var amps = NamedControl.kr(\amps, 1 ! n);
var timeScales = NamedControl.kr(\scales, 1 ! n);
var excEg = EnvGen.ar(Env.perc(excAtk, excDcy));
var exc = PinkNoise.ar * excEg;
var attackModes = Klank.ar(`[
ratios, amps, timeScales
], exc, freq, 0, atk);
var decayModes = Klank.ar(`[
ratios, amps, timeScales
], exc, freq, 0, dcy);
// see Formlet help -- this is basically a bank of Formlets
var sig = decayModes - attackModes;
// a trick to support instant damping of notes
// if you set the gate to -1.1, it will cut off the note in 0.099 seconds
var cutoffEg = EnvGen.kr(Env([1, 0], [0.03], releaseNode: 0), gate + 0.001, doneAction: 2);
DetectSilence.ar(sig, doneAction: 2);
Out.ar(out, Pan2.ar(sig * (cutoffEg * amp), pan));
}).add;
)
(instrument: \modal, ratios: [[1, 2, 3.5]], amps: [[1, 0.7, 0.4, 0, 0]], sendGate: false).play;
(instrument: \modal, ratios: [[1, 2, 3.5]], amps: [[1, 0.7, 0.4, 0, 0]], dcy: 12, sendGate: false).play;
x = Synth(\modal, [ratios: [1, 2, 3.5], amps: [1, 0.7, 0.4, 0, 0], dcy: 12]);
// wait a tic
x.set(\gate, -1.1);
(
p = Pbind(
\instrument, \modal,
\degree, Pwhite(-7, 7, inf),
\dur, Pexprand(0.05, 1.2, inf),
// \dcy, Pkey(\dur) * Pexprand(1.3, 4.0, inf),
\dcy, Pexprand(1.5, 4.5, inf),
\ratios, [[1, 2, 3.5, 5, 11]],
\amps, [[1, 0.7, 0.4, 0.5, 0.2]],
\scales, [[1, 1, 1, 1, 0.4]]
).play;
)
p.stop;
Those arenāt celesta harmonics but if you could find those, plugging them in here might get kinda close.
hjh