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.
71 lines
1.8 KiB
Plaintext
71 lines
1.8 KiB
Plaintext
MIDIClient.init;
|
|
MIDIIn.connectAll;
|
|
|
|
(
|
|
SynthDef(\rhubarb, {
|
|
|freq = 440, gate = 1, cutoff = 1000, rq = 0.3, amp = 0.05, modDepth = 0.3, noiseLevel = 0.05|
|
|
var env, osc, filt, lfo, noise, sig;
|
|
|
|
// Single Sawtooth Oscillator
|
|
osc = SinOsc.ar(freq);
|
|
|
|
// Subtle Noise Layer
|
|
// noise = PinkNoise.ar(noiseLevel);
|
|
|
|
// LFO to Modulate Filter
|
|
lfo = LFNoise0.kr(4).range(1 - modDepth, 1 + modDepth); // Triangle LFO at 2.94 Hz
|
|
|
|
// Low-pass filter modulated by LFO
|
|
filt = RLPF.ar(osc, cutoff * lfo, rq);
|
|
|
|
// ADSR Envelope with Long Attack & Release
|
|
env = EnvGen.kr(Env.adsr(0.0, 0.3, 0.8, 2.0), gate, doneAction: 2);
|
|
|
|
sig = Pan2.ar(filt * env * amp, 0);
|
|
|
|
// Output
|
|
Out.ar(0, sig);
|
|
}).add;
|
|
)
|
|
|
|
|
|
(
|
|
~midiNotes = Dictionary.new; // Store active notes
|
|
|
|
MIDIdef.noteOn(\rhubarb_on, { |vel, num, chan, src|
|
|
var freq = num.midicps; // Convert MIDI note to frequency
|
|
var amp = vel / 127; // Normalize velocity (0 to 1)
|
|
|
|
// Create the synth and store it in a dictionary
|
|
~midiNotes[num] = Synth(\rhubarb, [
|
|
\freq, freq,
|
|
\amp, amp * 0.1, // Adjust for a reasonable volume
|
|
\cutoff, 1200
|
|
]);
|
|
});
|
|
|
|
MIDIdef.noteOff(\rhubarb_off, { |vel, num, chan, src|
|
|
~midiNotes[num].set(\gate, 0); // Release the synth
|
|
~midiNotes.remove(num); // Remove from dictionary
|
|
});
|
|
)
|
|
|
|
|
|
|
|
(
|
|
Pbind(
|
|
\instrument, \rhubarb,
|
|
/*\degree, Pseq([
|
|
[2, 4, 7, 12], [1, 5, 9], [4, 7, 11], [5, 9, 8]
|
|
], inf), // Chord progression*/
|
|
\degree, Pseq([[2, 7, 11], [1, 5, 9], [3, 9], [1,3,5]], inf),
|
|
\dur, 0.5, // Duration of each chord
|
|
\amp, 0.08, // Volume
|
|
\cutoff, 1200,
|
|
//\cutoff, Pseq([400, 600, 800]), // Filter cutoff frequency
|
|
\detune, 12, // Slight detune
|
|
\pan, Pwhite(-0.3, 0.3), // Random stereo width
|
|
).play;
|
|
)
|
|
|