Monorepo for Aesthetic.Computer aesthetic.computer
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(percussion): two-step clap + open hi-hat with down/up bursts

Clap and open hi-hat now fire in two distinct stages instead of one
simultaneous cluster:

- Clap DOWN: darker palm-strike (900Hz noise + 260Hz body thump),
panned slightly left of center
- Clap UP: bright release transient (3200Hz square click + 5200Hz
noise + airy tail), panned slightly opposite — delayed by
flam * rn(1.3, 1.7) so the gap scales with BPM

- Open hi-hat DOWN: short metallic chip strike (8200Hz noise +
5400Hz square), brief cymbal contact
- Open hi-hat UP: sustained airy shimmer that blooms after the chip,
delayed by flam * rn(0.8, 1.2), panned slightly opposite

All stochastic jitter (rj/rn) preserved so hits remain organic, and
the BPM-locked flam timing means the two-step gap tightens at higher
tempos and widens at slower ones.

+32 -13
+32 -13
fedac/native/pieces/notepat.mjs
··· 616 616 sound.synth({ type: "square", tone: rj(180, 0.04) * pf, duration: rj(0.05, 0.10), volume: rj(0.2, 0.10) * v, attack: 0.001, decay: 0.045, pan }); 617 617 break; 618 618 619 - case "e": // clap — jittered click + BPM-locked flam body 620 - // 1. Click — tone jitter ±10%, brightness ±8% 621 - sound.synth({ type: "square", tone: rj(2500, 0.10) * pf, duration: 0.004, volume: rj(0.9, 0.08) * v, attack: 0.0003, decay: 0.0035, pan: pan * rn(0.6, 0.9) }); 622 - sound.synth({ type: "noise", tone: rj(6000, 0.12) * pf, duration: 0.003, volume: rj(0.6, 0.10) * v, attack: 0.0003, decay: 0.0025, pan: pan * rn(0.6, 0.9) }); 623 - // 2. Body: 3 flam bursts. Timings scale with BPM AND jitter ±30% per hit. 624 - sound.synth({ type: "noise", tone: rj(1600, 0.08) * pf, duration: 0.008, volume: rj(0.75, 0.08) * v, attack: 0.0003, decay: 0.007, pan }); 625 - setTimeout(() => sound.synth({ type: "noise", tone: rj(1700, 0.09) * pf, duration: 0.008, volume: rj(0.6, 0.10) * v, attack: 0.0003, decay: 0.007, pan }), Math.round(flam * rn(0.4, 0.6))); 626 - setTimeout(() => sound.synth({ type: "noise", tone: rj(1500, 0.10) * pf, duration: 0.008, volume: rj(0.5, 0.12) * v, attack: 0.0003, decay: 0.007, pan }), Math.round(flam * rn(1.0, 1.3))); 627 - // 3. Tail 628 - setTimeout(() => sound.synth({ type: "noise", tone: rj(1800, 0.08) * pf, duration: 0.025, volume: rj(0.45, 0.10) * v, attack: 0.0005, decay: 0.024, pan }), Math.round(flam * rn(1.7, 2.0))); 619 + case "e": // clap — two-step: DOWN (dark palm strike) then UP (bright release) 620 + // STEP 1 — DOWN: palms meet. Darker body thump + low-mid noise burst. 621 + // Lower-pitched, meatier, slightly left of center for stereo interest. 622 + { 623 + const downPan = pan + rn(-0.08, 0.02); 624 + sound.synth({ type: "noise", tone: rj(900, 0.10) * pf, duration: 0.010, volume: rj(0.85, 0.08) * v, attack: 0.0003, decay: 0.009, pan: downPan }); 625 + sound.synth({ type: "square", tone: rj(260, 0.06) * pf, duration: 0.012, volume: rj(0.55, 0.10) * v, attack: 0.0004, decay: 0.011, pan: downPan }); 626 + sound.synth({ type: "noise", tone: rj(1400, 0.10) * pf, duration: 0.006, volume: rj(0.50, 0.12) * v, attack: 0.0003, decay: 0.0055, pan: downPan }); 627 + } 628 + // STEP 2 — UP: hands separate, bright transient + airy tail. 629 + // Delayed by ~1.5 flam units (scales with BPM) with jitter so hits vary. 630 + // Panned slightly opposite for L/R call-response feel. 631 + setTimeout(() => { 632 + const upPan = pan + rn(-0.02, 0.10); 633 + sound.synth({ type: "square", tone: rj(3200, 0.10) * pf, duration: 0.004, volume: rj(0.80, 0.08) * v, attack: 0.0002, decay: 0.0035, pan: upPan }); 634 + sound.synth({ type: "noise", tone: rj(5200, 0.12) * pf, duration: 0.008, volume: rj(0.70, 0.10) * v, attack: 0.0003, decay: 0.007, pan: upPan }); 635 + sound.synth({ type: "noise", tone: rj(2400, 0.08) * pf, duration: 0.018, volume: rj(0.45, 0.10) * v, attack: 0.0005, decay: 0.017, pan: upPan }); 636 + }, Math.round(flam * rn(1.3, 1.7))); 629 637 break; 630 638 631 639 case "f": // snap — finger snap, tone jitter for variation ··· 639 647 sound.synth({ type: "noise", tone: rj(5000, 0.08) * pf, duration: 0.04, volume: rj(0.20, 0.10) * v, attack: 0.0005, decay: 0.035, pan }); 640 648 break; 641 649 642 - case "a": // open hi-hat — decay + brightness vary 643 - sound.synth({ type: "noise", tone: rj(6500, 0.07) * pf, duration: rj(0.28, 0.10), volume: rj(0.30, 0.08) * v, attack: 0.001, decay: 0.27, pan }); 644 - sound.synth({ type: "noise", tone: rj(4800, 0.07) * pf, duration: rj(0.20, 0.10), volume: rj(0.18, 0.10) * v, attack: 0.001, decay: 0.19, pan }); 650 + case "a": // open hi-hat — two-step: DOWN (chip strike) then UP (airy shimmer) 651 + // STEP 1 — DOWN: short metallic chip — initial cymbal contact. 652 + { 653 + const downPan = pan + rn(-0.06, 0.04); 654 + sound.synth({ type: "noise", tone: rj(8200, 0.08) * pf, duration: 0.012, volume: rj(0.45, 0.08) * v, attack: 0.0003, decay: 0.011, pan: downPan }); 655 + sound.synth({ type: "square", tone: rj(5400, 0.08) * pf, duration: 0.008, volume: rj(0.18, 0.10) * v, attack: 0.0005, decay: 0.0075, pan: downPan }); 656 + } 657 + // STEP 2 — UP: sustained airy shimmer that blooms after the chip. Decay 658 + // + brightness vary per hit, panned slightly opposite for call/response. 659 + setTimeout(() => { 660 + const upPan = pan + rn(-0.02, 0.08); 661 + sound.synth({ type: "noise", tone: rj(6500, 0.07) * pf, duration: rj(0.26, 0.10), volume: rj(0.28, 0.08) * v, attack: 0.003, decay: 0.25, pan: upPan }); 662 + sound.synth({ type: "noise", tone: rj(4800, 0.07) * pf, duration: rj(0.19, 0.10), volume: rj(0.17, 0.10) * v, attack: 0.003, decay: 0.18, pan: upPan }); 663 + }, Math.round(flam * rn(0.8, 1.2))); 645 664 break; 646 665 647 666 case "b": // ride — metallic shimmer with per-hit harmonic variation