From fd4e57e73975110b2c7787005fdad38d78f46186 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 30 Mar 2026 05:23:19 -0400 Subject: [PATCH] =?UTF-8?q?Acid=20Reign:=20rewrite=20=E2=80=94=20simple=20?= =?UTF-8?q?arpeggiated=20303,=20louder=20bass?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stripped to essentials: 303 arps through i-VII-VI-v progression, kick/clap/hats. Uses .arpeggio() for clean patterns. Legato+glide, sub_osc, resonant filter sweep. Volume 0.7. Co-Authored-By: Claude Opus 4.6 (1M context) --- tracks/acid_reign.py | 153 ++++++++++--------------------------------- 1 file changed, 36 insertions(+), 117 deletions(-) diff --git a/tracks/acid_reign.py b/tracks/acid_reign.py index e3ee2b3..9361bb5 100644 --- a/tracks/acid_reign.py +++ b/tracks/acid_reign.py @@ -1,16 +1,13 @@ """ -ACID REIGN — the filthiest 303 bass line in human existence. -Squelchy, resonant, relentless. Filter sweeps that melt faces. +ACID REIGN — 303 acid bass. Simple, raw, relentless. """ -from pytheory import Key, Duration, Score, Tone, play_score +from pytheory import Key, Duration, Score, play_score from pytheory.rhythm import DrumSound key = Key("A", "minor") s = key.scale - -A = s[0]; B = s[1]; C = s[2]; D = s[3] -E = s[4]; F = s[5]; G = s[6] +prog = key.progression("i", "VII", "VI", "v") score = Score("4/4", bpm=135) @@ -19,107 +16,43 @@ CL = DrumSound.CLAP CH = DrumSound.CLOSED_HAT OH = DrumSound.OPEN_HAT -# ═══════════════════════════════════════════════════════════════════ -# STRUCTURE (64 bars, ~3 min): -# Bars 1-8: Just the 303, alone. Raw. -# Bars 9-16: Kick enters. The groove locks. -# Bars 17-32: Full beat, filter opening, acid intensifying -# Bars 33-40: Breakdown — 303 goes mental, filter wide -# Bars 41-56: Peak — everything, filter sweeping wildly -# Bars 57-64: Outro — stripped back, 303 alone again -# ═══════════════════════════════════════════════════════════════════ - -# ── THE 303 — squelchy saw, high resonance, the whole point ───── -acid = score.part("303", synth="saw", envelope="organ", volume=0.5, +# ── 303 — arpeggiated chords, legato, squelchy ───────────────── +acid = score.part("303", synth="saw", envelope="organ", volume=0.7, lowpass=800, lowpass_q=4.0, distortion=0.4, distortion_drive=5.0, - saturation=0.3, humanize=0.03, - legato=True, glide=0.04, sub_osc=0.5) -# The filter sweep — slow open across the whole track + saturation=0.3, legato=True, glide=0.04, + sub_osc=0.5) acid.lfo("lowpass", rate=0.015, min=400, max=8000, bars=64, shape="triangle") -# The pattern — classic acid: 16th notes with slides and accents -# Mostly root and fifth with chromatic approach notes -acid_bars = [ - # Pattern A: driving root - [(A.add(-24), 100), (None, 0), (A.add(-24), 90), (E.add(-24), 85), - (A.add(-24), 95), (None, 0), (G.add(-36), 80), (A.add(-24), 100), - (None, 0), (A.add(-24), 88), (None, 0), (E.add(-24), 82), - (A.add(-24), 95), (G.add(-36), 78), (A.add(-24), 92), (None, 0)], - # Pattern B: climbing - [(A.add(-24), 95), (B.add(-24), 85), (C.add(-12), 90), (None, 0), - (E.add(-12), 100), (None, 0), (C.add(-12), 88), (A.add(-24), 82), - (None, 0), (G.add(-36), 78), (A.add(-24), 95), (None, 0), - (C.add(-12), 92), (E.add(-12), 98), (C.add(-12), 85), (A.add(-24), 90)], - # Pattern C: menacing - [(A.add(-24), 100), (None, 0), (None, 0), (A.add(-24), 105), - (Tone.from_string("Ab1"), 90), (A.add(-24), 100), (None, 0), (E.add(-24), 88), - (None, 0), (None, 0), (A.add(-24), 95), (Tone.from_string("Bb1"), 85), - (A.add(-24), 100), (None, 0), (G.add(-36), 80), (A.add(-24), 98)], - # Pattern D: wild — big intervals - [(A.add(-24), 105), (E.add(-12), 95), (A.add(-24), 100), (None, 0), - (C.add(-12), 92), (None, 0), (A.add(-24), 98), (E.add(-12), 90), - (G.add(-36), 85), (A.add(-24), 100), (E.add(-12), 95), (None, 0), - (C.add(-12), 90), (A.add(-24), 102), (None, 0), (E.add(-12), 95)], -] - -# Bars 1-8: just the 303 alone — pattern A and B +# Bars 1-8: 303 alone — arped progression, one octave down for _ in range(2): - for bar in acid_bars[:2]: - for note, vel in bar: - if note is None: - acid.rest(Duration.SIXTEENTH) - else: - acid.add(note, Duration.SIXTEENTH, velocity=vel) + for chord in prog: + acid.arpeggio(chord, bars=1, pattern="updown", + division=Duration.SIXTEENTH, octaves=2) -# Bars 9-16: patterns cycle -for bar in acid_bars: - for note, vel in bar: - if note is None: - acid.rest(Duration.SIXTEENTH) - else: - acid.add(note, Duration.SIXTEENTH, velocity=vel) -for bar in acid_bars: - for note, vel in bar: - if note is None: - acid.rest(Duration.SIXTEENTH) - else: - acid.add(note, Duration.SIXTEENTH, velocity=min(127, vel + 5)) +# Bars 9-32: same but louder patterns kick in around it +for _ in range(6): + for chord in prog: + acid.arpeggio(chord, bars=1, pattern="updown", + division=Duration.SIXTEENTH, octaves=2) -# Bars 17-32: all patterns, louder +# Bars 33-40: breakdown — sustained chords, filter wide +for chord in prog: + acid.add(chord, Duration.WHOLE) +for chord in prog: + acid.add(chord, Duration.WHOLE) + +# Bars 41-56: back to arps, peak energy for _ in range(4): - for bar in acid_bars: - for note, vel in bar: - if note is None: - acid.rest(Duration.SIXTEENTH) - else: - acid.add(note, Duration.SIXTEENTH, velocity=min(127, vel + 10)) + for chord in prog: + acid.arpeggio(chord, bars=1, pattern="updown", + division=Duration.SIXTEENTH, octaves=2) -# Bars 33-40: breakdown — 303 goes mental, pattern D repeated -for _ in range(8): - for note, vel in acid_bars[3]: - if note is None: - acid.rest(Duration.SIXTEENTH) - else: - acid.add(note, Duration.SIXTEENTH, velocity=min(127, vel + 15)) - -# Bars 41-56: peak — cycling all patterns at max -for _ in range(4): - for bar in acid_bars: - for note, vel in bar: - if note is None: - acid.rest(Duration.SIXTEENTH) - else: - acid.add(note, Duration.SIXTEENTH, velocity=min(127, vel + 15)) - -# Bars 57-64: just the 303 again, filtering down +# Bars 57-64: fading arps for _ in range(2): - for bar in acid_bars[:2]: - for note, vel in bar: - if note is None: - acid.rest(Duration.SIXTEENTH) - else: - acid.add(note, Duration.SIXTEENTH, velocity=max(40, vel - 20)) + for chord in prog: + acid.arpeggio(chord, bars=1, pattern="up", + division=Duration.EIGHTH, octaves=1) # ── KICK — four on the floor, enters bar 9 ───────────────────── kick = score.part("kick", volume=0.5, humanize=0.03) @@ -131,7 +64,6 @@ for _ in range(48): for beat in range(4): kick.hit(K, Duration.QUARTER, velocity=115) -# Bars 57-64: fading for bar in range(8): vel = max(30, 110 - bar * 10) for beat in range(4): @@ -156,7 +88,7 @@ for bar in range(8): clap.rest(Duration.QUARTER) clap.hit(CL, Duration.QUARTER, velocity=vel) -# ── HATS — 16th notes, open hat on offbeats, enters bar 17 ───── +# ── HATS — 16ths, enters bar 17 ──────────────────────────────── hats = score.part("hats", volume=0.25, humanize=0.04) for _ in range(16): @@ -164,32 +96,19 @@ for _ in range(16): for _ in range(40): for beat in range(4): - hats.hit(CH, Duration.SIXTEENTH, velocity=75) - hats.hit(CH, Duration.SIXTEENTH, velocity=45) - hats.hit(OH if beat % 2 == 1 else CH, Duration.SIXTEENTH, velocity=60) + hats.hit(CH, Duration.SIXTEENTH, velocity=72) hats.hit(CH, Duration.SIXTEENTH, velocity=42) + hats.hit(OH if beat % 2 == 1 else CH, Duration.SIXTEENTH, velocity=58) + hats.hit(CH, Duration.SIXTEENTH, velocity=40) for bar in range(8): - vel = max(20, 70 - bar * 6) + vel = max(20, 65 - bar * 6) for beat in range(4): hats.hit(CH, Duration.SIXTEENTH, velocity=vel) hats.hit(CH, Duration.SIXTEENTH, velocity=max(15, vel - 25)) - hats.hit(CH, Duration.SIXTEENTH, velocity=max(15, vel - 15)) + hats.hit(CH, Duration.SIXTEENTH, velocity=max(15, vel - 12)) hats.hit(CH, Duration.SIXTEENTH, velocity=max(15, vel - 28)) -# ── SUB BASS — octave below 303, just the root ───────────────── -sub = score.part("sub", synth="sine", envelope="pad", volume=0.3, - lowpass=80) - -for _ in range(8): - sub.rest(Duration.WHOLE) - -for _ in range(48): - sub.add(A.add(-36), Duration.WHOLE, velocity=90) - -for bar in range(8): - sub.add(A.add(-36), Duration.WHOLE, velocity=max(20, 85 - bar * 10)) - # ═════════════════════════════════════════════════════════════════ import sys