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.

74 lines
2.2 KiB
Plaintext

(
SynthDef(\prophet5style, {
|out=0, freq=440, amp=0.5, detune=0, osc1Wave=0, osc2Wave=1, filterCutoff=600, filterResonance=0.5,
attack=0.1, decay=1, sustain=0.7, release=0.3, lfoRate=0.5, lfoDepth=0.5,
lfoFreq=1, lfoWave=1, filterModDepth=0.3|
// Oscillators
var osc1, osc2, lfo, env, filter, filteredSignal, drySignal;
// Oscillator 1 & 2: Waveforms and detuning
osc1 = Select.ar(osc1Wave, [SinOsc.ar(freq), Saw.ar(freq), Pulse.ar(freq, 0.5)]);
osc2 = Select.ar(osc2Wave, [SinOsc.ar(freq + detune), Saw.ar(freq + detune), Pulse.ar(freq + detune, 0.5)]);
// Envelope
env = EnvGen.kr(Env.perc(attack, decay, sustain, release), doneAction: 2);
// LFO for modulation (filter or other params)
lfo = SinOsc.kr(lfoRate, 0, lfoDepth);
// Filter
// filter = osc1 + osc2;
filter = BPF.ar(osc1 + osc2, filterCutoff, filterResonance);
filteredSignal = filter * env;
// Modulate filter with LFO
filteredSignal = filteredSignal * (1 + lfo * filterModDepth);
// Dry signal (unfiltered)
drySignal = (osc1 + osc2) * env;
// Output mixed signal
Out.ar(out, (filteredSignal + drySignal).dup * amp);
}).add;
)
MIDIClient.init;
MIDIIn.connectAll;
x = Synth(\prophet5style);
// Mapping MIDI CCs to synth parameters
(
~midiMap = {
|num, val|
var osc1Wave, osc2Wave, release, cutoff, resonance;
// Conditional mappings for parameters
osc1Wave = num == 1 ifTrue: { val.linlin(0, 127, 0, 2).round } ifFalse: { 0 };
osc2Wave = num == 2 ifTrue: { val.linlin(0, 127, 0, 2).round } ifFalse: { 0 };
release = num == 8 ifTrue: { val.linlin(0, 127, 0.01, 3) } ifFalse: { 0.3 };
cutoff = num == 74 ifTrue: { val.linlin(0, 127, 20, 2000) } ifFalse: { 1000 };
resonance = num == 71 ifTrue: { val.linlin(0, 127, 0, 1) } ifFalse: { 0.5 };
// Return a dictionary with mapped parameters
^(
\osc1Wave -> osc1Wave,
\osc2Wave -> osc2Wave,
\release -> release,
\cutoff -> cutoff,
\resonance -> resonance
);
};
)
// Use the midi map to update synth parameters
MIDIIn.control = { |num, val|
var mappedParams = ~midiMap.(num, val);
Synth(\prophet5styleModular, mappedParams);
};