diff --git a/pd/synth.pd b/pd/synth.pd index 6eb662f..f686707 100644 --- a/pd/synth.pd +++ b/pd/synth.pd @@ -16,7 +16,6 @@ #X obj 20 190 r midi-pitch; #X obj 20 220 stripnote; #X obj 20 260 mtof; -#X obj 20 290 env~ 50 200 0.7 400; #X obj 140 260 osc~; #X obj 140 290 *~ 0.3; #X obj 220 260 osc~; @@ -26,7 +25,10 @@ #X obj 180 400 lop~; #X obj 180 460 *~; #X obj 320 460 *~; -#X obj 250 530 dac~; +#X obj 250 530 dac~ 1; +#X obj 20 290 line~ 0 50; +#X obj 20 330 *~ 0.0055; +#X obj 100 370 *~; #X obj 350 300 loadbang; #X obj 350 320 float 10000; #X obj 350 400 loadbang; @@ -48,22 +50,23 @@ #X connect 12 0 14 1; #X connect 13 0 14 0; #X connect 14 0 15 0; -#X connect 15 0 17 0; -#X connect 15 0 19 0; -#X connect 17 0 18 0; -#X connect 19 0 20 0; -#X connect 18 0 21 0; -#X connect 20 0 21 1; +#X connect 15 0 16 0; +#X connect 15 0 18 0; +#X connect 16 0 17 0; +#X connect 18 0 19 0; +#X connect 17 0 20 0; +#X connect 19 0 20 1; +#X connect 20 0 21 0; #X connect 21 0 22 0; #X connect 22 0 23 0; -#X connect 23 0 24 0; -#X connect 14 0 16 0; -#X connect 16 0 24 1; -#X connect 24 0 25 0; +#X connect 14 1 26 0; +#X connect 26 0 27 0; #X connect 27 0 28 0; -#X connect 28 0 23 1; +#X connect 23 0 28 1; +#X connect 28 0 24 0; #X connect 29 0 30 0; -#X connect 30 0 31 0; -#X connect 31 0 25 1; -#X connect 25 0 26 0; -#X connect 25 0 26 1; +#X connect 30 0 22 1; +#X connect 31 0 32 0; +#X connect 32 0 33 0; +#X connect 33 0 24 1; +#X connect 24 0 25 0; diff --git a/scripts/gen_synth_pd.py b/scripts/gen_synth_pd.py index 9d9577e..8a1aad7 100644 --- a/scripts/gen_synth_pd.py +++ b/scripts/gen_synth_pd.py @@ -54,7 +54,6 @@ def gen(): r_pitch = Obj(20, 190, "r midi-pitch") strip = Obj(20, 220, "stripnote") mtof = Obj(20, 260, "mtof") - env = Obj(20, 290, "env~ 50 200 0.7 400") osc1 = Obj(140, 260, "osc~") mul1 = Obj(140, 290, "*~ 0.3") osc2 = Obj(220, 260, "osc~") @@ -64,7 +63,13 @@ def gen(): filt = Obj(180, 400, "lop~") amp = Obj(180, 460, "*~") panscale = Obj(320, 460, "*~") - dac = Obj(250, 530, "dac~") + dac = Obj(250, 530, "dac~ 1") + # ── Vanilla AR envelope (line~, not cyclone env~) ── + # stripnote out1 = velocity (0-127) on note-on, 0 on note-off + # Scale velocity/127 * 0.7 ≈ velocity * 0.0055 for sustain approx 0.7 + env_ramp = Obj(20, 290, "line~ 0 50") + env_scale = Obj(20, 330, "*~ 0.0055") + env_mult = Obj(100, 370, "*~") connect(c, r_vel, 0, strip, 1) connect(c, r_pitch, 0, strip, 0) @@ -78,9 +83,12 @@ def gen(): connect(c, sum, 0, scale, 0) connect(c, scale, 0, filt, 0) connect(c, filt, 0, amp, 0) - connect(c, strip, 0, env, 0) - connect(c, env, 0, amp, 1) - connect(c, amp, 0, panscale, 0) + # stripnote out1 (gate: velocity on note-on, 0 on note-off) → line~ + connect(c, strip, 1, env_ramp, 0) + connect(c, env_ramp, 0, env_scale, 0) + connect(c, env_scale, 0, env_mult, 0) + connect(c, amp, 0, env_mult, 1) + connect(c, env_mult, 0, panscale, 0) # ── Controls (headless-safe: loadbang-initialized floats, not hsl) ── lb_cut = Obj(350, 300, "loadbang") @@ -95,9 +103,8 @@ def gen(): connect(c, float_vol, 0, div, 0) connect(c, div, 0, panscale, 1) - # ── Output ── + # ── Output (mono, matches -outchannels 1) ── connect(c, panscale, 0, dac, 0) - connect(c, panscale, 0, dac, 1) # ── Write ── lines = [