Celesta synthesis

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

1 Like

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:

  1. Spectrum analysis using Audacityā€™s Plot Spectrum feature:
  • Export frequency and amplitude data for use in SuperCollider
  • If necessary, analyse both transient and sustained portions
  1. Envelope analysis in Audacity for amplitude shaping
  2. If necessary, consider separately:
  • Mechanical noise (relatively consistent across pitches)
  • Harmonic components (pitch-specific but scalable)
  1. Create synth definitions (both additive and subtractive)
  2. Create some sound examples similar to @TXModā€™s example
  3. Listen to and compare the results, then improve the code and choose the best one

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:

  • Time evolution
  • Key velocity
  • (Playing technique) ā† In the first phase, it is not necessary to think about it, just use a simple playing technique.

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

3 Likes

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

1 Like