// Define the bass synth
(
SynthDef(\boC_bass, {
    arg freq = 440, detune = 1.001, amp = 0.4, cutoff = 1000, attack = 0.5, decay = 1;

    var osc1, osc2, mix, filter, env;

    // Two sawtooth oscillators detuned slightly
    osc1 = Pulse.ar(freq, amp); // First oscillator, base frequency
    osc2 = Pulse.ar(freq * detune, amp); // Second oscillator, slightly detuned

    // Mix both oscillators
    mix = osc1 + osc2;

    // Apply a low-pass filter to smooth the high frequencies
    filter = LPF.ar(mix, cutoff); // Low-pass filter with customizable cutoff

    // Envelope for shaping the sound
    env = EnvGen.kr(Env.perc(attack, decay), doneAction: 2); // Short attack and decay

    // Apply envelope to the filter and mix the result
    filter = filter * env;

    // Output the final sound to both left and right channels
    Out.ar(0, filter.dup);
}).add;
)

// Play the synth with default values
x = Synth(\boC_bass, [\freq, 30.midicps]);

// You can also play the synth with custom arguments
x = Synth(\boC_bass, [
    \freq, 220,  // Set frequency
    \detune, 1.005,  // Slightly different detune
    \amp, 0.5,  // Amp (volume)
    \cutoff, 400,  // Filter cutoff frequency
    \attack, 0.05,  // Attack time
    \decay, 0.3   // Decay time
]);
