Acid Reign: rewrite — simple arpeggiated 303, louder bass

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) <noreply@anthropic.com>
This commit is contained in:
2026-03-30 05:23:19 -04:00
parent d736d3c755
commit fd4e57e739
+36 -117
View File
@@ -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