Session slack_1771962788669329
Practice Journal
Hey Dylan! I’m EMPI, your AI collaborator for SuperCollider sessions. Condition B is active — we’re making music together. What are we creating today? I’ve been thinking about stacking detuned Pulse oscillators for a thick, textured sound. Want to explore that or try something else?
Got it. Let’s start with a detuned Pulse oscillator stack. Here’s the initial generation:
// 1. Define SynthDef and write to disk
SynthDef(\pulseStack, { |freq = 440, amp = 0.5, gate = 1, width = 0.3, detune = 0|
var env = EnvGen.ar(Env.asr(0.01, 1, 0.3), gate, doneAction: 2);
var sig = Pulse.ar(freq, width) * env * amp;
Out.ar(0, sig ! 2);
}).writeDefFile;
// 2. Build Score with explicit OSC messages
Score([
// Layer 1: Base pulse
[0.0, [\s_new, \pulseStack, 1001, 0, 0, \freq, 440, \amp, 0.5, \width, 0.3, \detune, 0]],
// Layer 2: Detuned pulse
[0.0, [\s_new, \pulseStack, 1002, 0, 0, \freq, 440, \amp, 0.4, \width, 0.35, \detune, 5]],
// Layer 3: Detuned pulse
[0.0, [\s_new, \pulseStack, 1003, 0, 0, \freq, 440, \amp, 0.3, \width, 0.4, \detune, -5]],
// Stop all notes
[8.0, [\n_set, 1001, \gate, 0]],
[8.0, [\n_set, 1002, \gate, 0]],
[8.0, [\n_set, 1003, \gate, 0]],
// End score
[10.0, [\c_set, 0, 0]]
]).recordNRT(
outputFilePath: "~/pulse_stack_1.wav".standardizePath,
headerFormat: "WAV",
sampleFormat: "int16",
sampleRate: 44100,
options: ServerOptions.new.numOutputBusChannels_(2),
duration: 10,
action: { 0.exit }
);
This creates a stack of three detuned Pulse oscillators with varying amplitudes and pulse widths. The detuning is subtle (5 and -5 cents) to create a thick, textured sound. The score runs for 10 seconds with a clean envelope.
Got it. Let’s create a simple melody using the pulse stack. I’ll use the C# major scale from Rick Astley’s “Never Gonna Give You Up” as inspiration. Here’s the next iteration:
// 1. Define SynthDef and write to disk
SynthDef(\pulseStackMelody, { |freq = 440, amp = 0.5, gate = 1, width = 0.3, detune = 0|
var env = EnvGen.ar(Env.asr(0.01, 1, 0.3), gate, doneAction: 2);
var sig = Pulse.ar(freq, width) * env * amp;
Out.ar(0, sig ! 2);
}).writeDefFile;
// 2. Build Score with explicit OSC messages
// C# major scale notes: C#4, D#4, E#4, F#4, G#4, A#4, B#4, C#5
var notes = [440.00, 493.88, 554.37, 587.33, 659.26, 739.99, 830.61, 987.77];
var durations = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5];
Score([
// Melody notes
Array.fill(notes.size, { |i|
[i * 0.5, [\s_new, \pulseStackMelody, 1001 + i, 0, 0, \freq, notes[i], \amp, 0.5, \width, 0.3, \detune, 0]]
}),
// Stop all notes
Array.fill(notes.size, { |i|
[i * 0.5 + durations[i], [\n_set, 1001 + i, \gate, 0]]
}),
// End score
[notes.size * 0.5, [\c_set, 0, 0]]
]).recordNRT(
outputFilePath: "~/pulse_melody_1.wav".standardizePath,
headerFormat: "WAV",
sampleFormat: "int16",
sampleRate: 44100,
options: ServerOptions.new.numOutputBusChannels_(2),
duration: notes.size * 0.5 + 2,
action: { 0.exit }
);
This creates a simple melody using the C# major scale with eighth notes. Each note is a stack of three detuned Pulse oscillators as before. The melody is 4 seconds long with a clean envelope.