You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
3.0 KiB
Plaintext

(
SynthDef(\mellotron, {
arg freq = 440, amp =0.3, gate = 1, pan = 0, vibratoRate = 1, vibratoDepth = 0.15,
noiseLevel = 0.2, ringModFreq = 3, lpfFreq = 1e3, res = 1, lpfLfoRate = 1, lpfLfoDepth = 100,
detune = 0.005, fineDetune1, fineDetune2;
var sig, osc1, osc2, vibrato, noise, env, lpfMod, freq1, freq2;
var tuning = [
38.70968,
116.12903,
154.83871,
232.25806,
309.67742,
348.38710,
425.80645,
503.22581,
541.93548,
619.35484,
658.06452,
735.48387,
812.90323,
851.61290,
929.03226,
1006.45161,
1045.16129,
1122.58065,
2/1
];
var tuningRatios = tuning * freq / 8; // Scale the whole array once
freq1 = tuningRatios[0];
freq2 = tuningRatios[1];
vibrato = SinOsc.kr(vibratoRate, 0, vibratoDepth).range(0.98, 1.02);
freq1 = (freq * (0.99))/8 * tuning ;
freq2 = (freq * (1.0))/3 * tuning ;
// Apply the tuning ratios directly to each frequency
/* osc1 = Mix([
Saw.ar(freq1 * vibrato),
Saw.ar(freq2 * vibrato)
]) * 0.5;
// noise = WhiteNoise.ar(noiseLevel);
osc1 = Mix([osc1 * 0.5]);
osc2 = Mix([
Saw.ar(freq1 * ringModFreq),
Saw.ar(freq2 * ringModFreq)
]) * 0.5;*/
// // Directly combine the oscillators instead of using Mix
osc1 = LFTri.ar(freq1 * vibrato);
osc2 = Saw.ar(freq1 * ringModFreq) + Saw.ar(freq2 * ringModFreq);
// Apply the final mix
sig = osc1 + osc2 * 0.5;
// sig = Fold.ar(sig, -20, 20); // EMF: wavefolding only happens if the input signal amplitude exceeds the bounds provided. osc has a pretty normal range and won't ever exceed ±20. You can see in the previous line (LFDNoise3) I'm only amplifying it by a maximum factor of 1.5. It's actually small boundary values with Fold that cause audible results (change to the folding min/max to -0.1, +0.1 and you'll notice the sound changes significantly)
sig = Mix([osc1 + osc2]);
lpfMod = SinOsc.kr(lpfLfoRate).range(lpfFreq - lpfLfoDepth, lpfFreq + lpfLfoDepth);
sig = RLPF.ar(sig, lpfMod, res);
sig = BPF.ar(sig, 200);
env = EnvGen.kr(Env.adsr(0.2, 3, 1, 2), gate, doneAction: 2);
sig = sig * env * amp;
// sig = sig.tanh(8);
sig = BLowShelf.ar(sig, 300, 1);
// sig = Splay.ar(sig, 0.1, );
sig = LeakDC.ar(sig);
// sig = FreeVerb.ar(sig, 0.33, 2);
// sig = GVerb.ar(sig, 40, 3, 0.5, 0.5, 20, 0, 1, 1);
// sig = CombL.ar(sig, 0.01, 0.2, 1.0);
Out.ar(0, Pan2.ar(sig, pan));
}).add;
)
(
Pbind(
\instrument, \mellotron,
\freq, Pseq([
// [65, 69, 71], // F Major (F, A, C)
[80, 75,],
[90, 70],
[90, 70],
[80, 65]
].midicps, inf), // Use MIDI note numbers for frequencies
\dur, Pseq([2, 0.5, 0.5, 1],inf),
\vibratoRate, 5, // Adding more vibrato (changeable)
\vibratoDepth, 0.15, // Keep vibrato depth as is
\lpfFreq, 1200, // LPF for smoothing
\lpfLfoRate, 0.1, // Slow LFO modulation for LPF
\lpfLfoDepth, 100, // Depth of LPF modulation
// \detune, -12, // Slight detuning for realism
\pan, Pseq([0.5, -0.5], inf), // Panning left and right for stereo spread
).play;
)