From a7dcef302be8ca60505b1d028a7830c08a24b547 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Thu, 2 Apr 2026 00:16:42 -0400 Subject: [PATCH] Raga Midnight: doubled length, 808 drop, proper raga form MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 56 bars (~2:30). Tambura alone opening, extended alap/jor, gat with dhol, jhala with sitar arp, tabla solo, then THE DROP — 808 at vol 1.0 with Re→Ga→Re→Pa(-36) pattern building 20→40 velocity. Sitar gat reprises over the thunder. Declarative part names restored. Co-Authored-By: Claude Opus 4.6 (1M context) --- tracks/raga_midnight.py | 556 ++++++++++++++++++++++++---------------- 1 file changed, 340 insertions(+), 216 deletions(-) diff --git a/tracks/raga_midnight.py b/tracks/raga_midnight.py index 841bf73..eabb03e 100644 --- a/tracks/raga_midnight.py +++ b/tracks/raga_midnight.py @@ -1,6 +1,9 @@ """ -RAGA MIDNIGHT — tabla solo with tambura drone, sitar melody, and dhol. -Drenched in reverb. Pythagorean tuning for that pure fifth resonance. +RAGA MIDNIGHT — a Bhairavi raga in four movements. +Alap, jor, gat, jhala — the traditional Hindustani form. +Tambura drone, sitar melody, dhol, hand-written tabla solo. +Then the 808 drops and the sitar comes back over thunder. +D Phrygian, shruti just intonation, 90 BPM. """ from pytheory import Key, Duration, Score, play_score @@ -21,29 +24,40 @@ Ni = s[6] # C (komal Ni) score = Score("4/4", bpm=90, system="shruti", temperament="just") # ── Tabla Bols ────────────────────────────────────────────────── -NA = DrumSound.TABLA_NA # sharp dayan rim -TIN = DrumSound.TABLA_TIN # open dayan ring -GE = DrumSound.TABLA_GE # deep bayan bass -tDHA = DrumSound.TABLA_DHA # both drums (prefixed to avoid sargam clash) -TIT = DrumSound.TABLA_TIT # light dayan flick -KE = DrumSound.TABLA_KE # muted bayan slap -GEB = DrumSound.TABLA_GE_BEND # bayan bend +NA = DrumSound.TABLA_NA +TIN = DrumSound.TABLA_TIN +GE = DrumSound.TABLA_GE +tDHA = DrumSound.TABLA_DHA +TIT = DrumSound.TABLA_TIT +KE = DrumSound.TABLA_KE +GEB = DrumSound.TABLA_GE_BEND -# ── TABLA — with fills every 8 bars ───────────────────────────── -score.drums("tabla solo", repeats=20, fill="bayan", fill_every=8) -score.set_drum_effects(reverb=0.4, reverb_decay=1.8, volume=0.35, humanize=0.1) +# ═══════════════════════════════════════════════════════════════════ +# STRUCTURE (48 bars, ~2:08): +# Bars 1-8: Tambura alone — the space opens, no rhythm +# Bars 9-16: Sitar alap — slow, meditative, exploring the raga +# Bars 17-24: Jor — rhythm emerges, sitar climbs to Pa and beyond +# Bars 25-32: Gat — dhol + drums enter, the composition begins +# Bars 33-40: Jhala — fast chikari, sitar arp enters, climax +# Bars 41-44: Sitar finale — descending runs, last burst +# Bars 45-48: Tabla solo — the voice speaks alone +# ═══════════════════════════════════════════════════════════════════ -# ── DHOL — the driving heartbeat, enters bar 9 ───────────────── -dhol = score.part("heartbeat", synth="sine", volume=0.0, +# ── TABLA DRUMS — auto-generated, enters bar 25 ──────────────── +score.drums("tabla solo", repeats=40, fill="bayan", fill_every=8) +score.set_drum_effects(reverb=0.2, reverb_decay=0.8, volume=0.35, humanize=0.1) + +# ── DHOL — the driving heartbeat, enters bar 25 ──────────────── +dhol = score.part("dhol", synth="sine", volume=0.0, reverb=0.25, reverb_decay=1.0, delay=0.1, delay_time=0.333, delay_feedback=0.15, humanize=0.08) -# Silent for 8 bars -for _ in range(8): +# Bars 1-24: silent — no rhythm yet +for _ in range(24): dhol.rest(Duration.WHOLE) -# Bars 9-16: dhol drives the gat and jhala +# Bars 25-32: dhol drives the gat dhol.set(volume=0.7) for _ in range(8): dhol.hit(DrumSound.DHOL_BOTH, Duration.QUARTER, velocity=100, articulation="accent") @@ -54,8 +68,18 @@ for _ in range(8): dhol.hit(DrumSound.DHOL_DAGGA, Duration.EIGHTH, velocity=75) dhol.hit(DrumSound.DHOL_BOTH, Duration.EIGHTH, velocity=90, articulation="accent") -# Bars 17-20: fade out — velocity list -for vel in [80, 60, 40, 20]: +# Bars 33-40: jhala — dhol stays strong +for _ in range(8): + dhol.hit(DrumSound.DHOL_BOTH, Duration.QUARTER, velocity=105, articulation="accent") + dhol.hit(DrumSound.DHOL_TILLI, Duration.EIGHTH, velocity=72) + dhol.hit(DrumSound.DHOL_DAGGA, Duration.EIGHTH, velocity=82) + dhol.hit(DrumSound.DHOL_TILLI, Duration.EIGHTH, velocity=68) + dhol.hit(DrumSound.DHOL_TILLI, Duration.EIGHTH, velocity=62) + dhol.hit(DrumSound.DHOL_DAGGA, Duration.EIGHTH, velocity=78) + dhol.hit(DrumSound.DHOL_BOTH, Duration.EIGHTH, velocity=92, articulation="accent") + +# Bars 41-44: fade out during sitar finale +for vel in [85, 65, 42, 22]: dhol.hit(DrumSound.DHOL_BOTH, Duration.QUARTER, velocity=vel, articulation="accent") dhol.hit(DrumSound.DHOL_TILLI, Duration.EIGHTH, velocity=max(15, vel - 25)) dhol.hit(DrumSound.DHOL_DAGGA, Duration.EIGHTH, velocity=max(15, vel - 15)) @@ -64,199 +88,218 @@ for vel in [80, 60, 40, 20]: dhol.hit(DrumSound.DHOL_DAGGA, Duration.EIGHTH, velocity=max(15, vel - 20)) dhol.hit(DrumSound.DHOL_BOTH, Duration.EIGHTH, velocity=max(15, vel - 10)) -# Silent through tabla solo +# Bars 45-48: silent through tabla solo for _ in range(4): dhol.rest(Duration.WHOLE) -# ── TAMBURA — the earth beneath everything ─────────────────────── -tambura = score.part("earth", synth="sine", envelope="pad", volume=0.3, +# ── TAMBURA — the earth beneath everything ────────────────────── +tambura = score.part("tambura", synth="sine", envelope="pad", volume=0.3, reverb=0.45, reverb_type="taj_mahal", chorus=0.4, chorus_rate=0.1, chorus_depth=0.01, lowpass=1200, pan=-0.3, saturation=0.2) -# Sa-Pa drone cycle -for _ in range(20): - tambura.add(Sa.add(-24), Duration.HALF) # Sa low (D2) - tambura.add(Pa.add(-24), Duration.HALF) # Pa low (A2) -# Fade out for tabla solo — velocity list -for vel in [50, 38, 25, 12]: +# Bars 1-40: Sa-Pa drone cycle — the foundation +for _ in range(40): + tambura.add(Sa.add(-24), Duration.HALF) + tambura.add(Pa.add(-24), Duration.HALF) + +# Bars 41-48: fade out for finale and tabla solo +for vel in [55, 45, 35, 25, 18, 12, 8, 5]: tambura.add(Sa.add(-24), Duration.HALF, velocity=vel) tambura.add(Pa.add(-24), Duration.HALF, velocity=max(5, vel - 8)) -# ── TAMBURA HIGH — the sky above ───────────────────────────────── -tambura_hi = score.part("sky", synth="sine", envelope="pad", volume=0.3, +# ── TAMBURA HIGH — the sky above ──────────────────────────────── +tambura_hi = score.part("tambura_hi", synth="sine", envelope="pad", volume=0.3, reverb=0.45, reverb_type="taj_mahal", chorus=0.5, chorus_rate=0.08, chorus_depth=0.012, lowpass=2000, pan=0.3, saturation=0.15) -for _ in range(20): - tambura_hi.add(Sa.add(-12), Duration.WHOLE) # Sa mid (D3) -for vel in [45, 30, 15, 5]: - tambura_hi.add(Sa.add(-12), Duration.WHOLE, velocity=vel) +for _ in range(40): + tambura_hi.add(Sa.add(-12), Duration.WHOLE) +for vel in [50, 38, 25, 15, 10, 6, 3, 0]: + if vel > 0: + tambura_hi.add(Sa.add(-12), Duration.WHOLE, velocity=vel) + else: + tambura_hi.rest(Duration.WHOLE) -# ── SITAR — raga melody ───────────────────────────────────────── +# ── SITAR — the raga melody ──────────────────────────────────── sitar = score.part("sitar", instrument="sitar", volume=0.75, reverb=0.25, reverb_type="taj_mahal", delay=0.2, delay_time=0.333, delay_feedback=0.25, pan=-0.15, saturation=0.25, humanize=0.1) -# ── Alap — slow, meditative opening (bars 1-4) ────────────────── -sitar.hold(Sa.add(-12), Duration.WHOLE * 4, velocity=60) # Sa drone -sitar.add(Sa, Duration.HALF, velocity=70) # Sa -sitar.rest(Duration.HALF) -sitar.hold(Sa.add(-12), Duration.WHOLE * 2, velocity=55) -sitar.add(Re, Duration.QUARTER, velocity=60) # Re (komal) -sitar.add(Sa, Duration.HALF, velocity=80) # Sa +# Bars 1-8: silent — tambura alone, the space breathes +for _ in range(8): + sitar.rest(Duration.WHOLE) + +# ── Alap — slow, meditative (bars 9-16) ──────────────────────── +# Exploring Sa, Re, Ga — no rush +sitar.add(Sa, Duration.WHOLE, velocity=70, bend=-0.15) +sitar.rest(Duration.WHOLE) +sitar.add(Re, Duration.HALF, velocity=65) +sitar.add(Sa, Duration.HALF, velocity=75) +sitar.rest(Duration.WHOLE) + +sitar.add(Ga, Duration.DOTTED_HALF, velocity=82) sitar.rest(Duration.QUARTER) -sitar.hold(Pa.add(-12), Duration.WHOLE, velocity=50) # Pa drone -sitar.add(Pa.add(-12), Duration.HALF, velocity=65) # Pa low -sitar.add(Sa, Duration.QUARTER, velocity=75) # Sa -sitar.add(Re, Duration.QUARTER, velocity=90) # Re — peak -sitar.hold(Sa.add(-12), Duration.WHOLE, velocity=55) -sitar.add(Ga, Duration.DOTTED_HALF, velocity=100) # Ga — strongest -sitar.rest(Duration.QUARTER) - -# ── Jor — picking up rhythm (bars 5-8) ────────────────────────── -sitar.hold(Sa.add(-12), Duration.WHOLE * 4, velocity=60) -sitar.hold(Ma, Duration.HALF, velocity=70) # double stop -sitar.add(Ma, Duration.QUARTER, velocity=90) # Ma -sitar.add(Ga, Duration.QUARTER, velocity=75) # Ga -sitar.add(Re, Duration.QUARTER, velocity=70) # Re -sitar.add(Sa, Duration.QUARTER, velocity=65) # Sa — descend -sitar.hold(Pa.add(-12), Duration.WHOLE, velocity=55) -sitar.add(Pa.add(-12), Duration.QUARTER, velocity=60) # Pa low -sitar.add(Sa, Duration.EIGHTH, velocity=70) # Sa -sitar.add(Re, Duration.EIGHTH, velocity=80) # Re -sitar.add(Ga, Duration.QUARTER, velocity=95) # Ga — climb -sitar.add(Ma, Duration.QUARTER, velocity=105) # Ma -sitar.hold(Sa.add(-12), Duration.HALF, velocity=55) -sitar.add(Pa, Duration.QUARTER, velocity=110) # Pa — peak -sitar.add(Ma, Duration.EIGHTH, velocity=85) # Ma -sitar.add(Ga, Duration.EIGHTH, velocity=75) # Ga -sitar.add(Re, Duration.QUARTER, velocity=65) # Re -sitar.add(Sa, Duration.QUARTER, velocity=55) # Sa — settle -sitar.hold(Pa.add(-12), Duration.WHOLE, velocity=50) -sitar.add(Sa, Duration.HALF, velocity=60) # Sa +sitar.add(Ma, Duration.QUARTER, velocity=75) +sitar.add(Ga, Duration.QUARTER, velocity=70) +sitar.add(Re, Duration.QUARTER, velocity=68) +sitar.add(Sa, Duration.QUARTER, velocity=72, bend=-0.15) +sitar.rest(Duration.WHOLE) sitar.rest(Duration.HALF) +sitar.add(Pa.add(-12), Duration.HALF, velocity=65) -# ── Gat — main composition (bars 9-12) ────────────────────────── -sitar.hold(Sa.add(-12), Duration.WHOLE * 4, velocity=65) -sitar.hold(Pa.add(-12), Duration.WHOLE * 2, velocity=55) -sitar.add(Sa.add(12), Duration.QUARTER, velocity=110) # Sa high -sitar.add(Ni, Duration.EIGHTH, velocity=90) # Ni -sitar.add(Dha, Duration.EIGHTH, velocity=80) # Dha -sitar.add(Pa, Duration.QUARTER, velocity=95) # Pa -sitar.add(Ma, Duration.QUARTER, velocity=75) # Ma -sitar.add(Ga, Duration.EIGHTH, velocity=65) # Ga -sitar.add(Ma, Duration.EIGHTH, velocity=80) # Ma -sitar.add(Pa, Duration.QUARTER, velocity=100) # Pa -sitar.hold(Sa.add(-12), Duration.HALF, velocity=60) -sitar.add(Dha, Duration.EIGHTH, velocity=85) # Dha -sitar.add(Pa, Duration.EIGHTH, velocity=75) # Pa -sitar.add(Ma, Duration.QUARTER, velocity=70) # Ma -sitar.hold(Pa.add(-12), Duration.WHOLE, velocity=55) -sitar.add(Pa, Duration.QUARTER, velocity=90) # Pa -sitar.add(Sa.add(12), Duration.QUARTER, velocity=115) # Sa high — climax -sitar.add(Ni, Duration.EIGHTH, velocity=95) # Ni -sitar.add(Dha, Duration.EIGHTH, velocity=85) # Dha -sitar.add(Pa, Duration.QUARTER, velocity=80) # Pa -sitar.hold(Sa.add(-12), Duration.WHOLE, velocity=60) -sitar.add(Ma, Duration.QUARTER, velocity=75) # Ma -sitar.add(Ga, Duration.QUARTER, velocity=65) # Ga -sitar.add(Re, Duration.QUARTER, velocity=55) # Re -sitar.add(Sa, Duration.QUARTER, velocity=50) # Sa — resolve +# ── Jor — rhythm emerges (bars 17-24) ────────────────────────── +# Climbing higher — Pa, Dha, reaching for Ni +sitar.add(Sa, Duration.QUARTER, velocity=80) +sitar.add(Re, Duration.QUARTER, velocity=75) +sitar.add(Ga, Duration.QUARTER, velocity=85) +sitar.add(Ma, Duration.QUARTER, velocity=80) +sitar.add(Pa, Duration.HALF, velocity=90, bend=-0.15) +sitar.add(Ma, Duration.QUARTER, velocity=78) +sitar.add(Ga, Duration.QUARTER, velocity=75) +sitar.add(Re, Duration.HALF, velocity=80) +sitar.add(Sa, Duration.HALF, velocity=82, bend=-0.15) +sitar.rest(Duration.WHOLE) -# ── Jhala — fast climax (bars 13-16) ──────────────────────────── +# Second jor phrase — reaching higher +sitar.add(Ma, Duration.QUARTER, velocity=85) +sitar.add(Pa, Duration.QUARTER, velocity=92) +sitar.add(Dha, Duration.QUARTER, velocity=88) +sitar.add(Pa, Duration.QUARTER, velocity=85) +sitar.add(Ma, Duration.QUARTER, velocity=80) +sitar.add(Ga, Duration.QUARTER, velocity=75) +sitar.add(Re, Duration.QUARTER, velocity=72) +sitar.add(Sa, Duration.QUARTER, velocity=78, bend=-0.15) + +# Touching Ni for the first time — the peak of exploration +sitar.add(Pa, Duration.QUARTER, velocity=95) +sitar.add(Dha, Duration.QUARTER, velocity=90) +sitar.add(Ni, Duration.HALF, velocity=100, bend=-0.2) +sitar.add(Dha, Duration.QUARTER, velocity=85) +sitar.add(Pa, Duration.QUARTER, velocity=82) +sitar.add(Ma, Duration.QUARTER, velocity=78) +sitar.add(Sa, Duration.QUARTER, velocity=75, bend=-0.15) + +# ── Gat — the composition (bars 25-32) ───────────────────────── +sitar.add(Sa.add(12), Duration.QUARTER, velocity=110) +sitar.add(Ni, Duration.EIGHTH, velocity=90) +sitar.add(Dha, Duration.EIGHTH, velocity=80) +sitar.add(Pa, Duration.QUARTER, velocity=95) +sitar.add(Ma, Duration.QUARTER, velocity=75) +sitar.add(Ga, Duration.EIGHTH, velocity=65) +sitar.add(Ma, Duration.EIGHTH, velocity=80) +sitar.add(Pa, Duration.QUARTER, velocity=100) +sitar.add(Dha, Duration.EIGHTH, velocity=85) +sitar.add(Pa, Duration.EIGHTH, velocity=75) +sitar.add(Ma, Duration.QUARTER, velocity=70) + +# Gat develops — climbing higher +sitar.add(Pa, Duration.QUARTER, velocity=90) +sitar.add(Sa.add(12), Duration.QUARTER, velocity=115, bend=-0.15) +sitar.add(Ni, Duration.EIGHTH, velocity=95) +sitar.add(Dha, Duration.EIGHTH, velocity=85) +sitar.add(Pa, Duration.QUARTER, velocity=80) +sitar.add(Ma, Duration.QUARTER, velocity=75) +sitar.add(Ga, Duration.QUARTER, velocity=65) +sitar.add(Re, Duration.QUARTER, velocity=55) +sitar.add(Sa, Duration.HALF, velocity=80, bend=-0.2) + +# Gat repeats with variation +sitar.add(Sa.add(12), Duration.QUARTER, velocity=112) +sitar.add(Ni, Duration.EIGHTH, velocity=92) +sitar.add(Dha, Duration.EIGHTH, velocity=82) +sitar.add(Pa, Duration.QUARTER, velocity=98) +sitar.add(Dha, Duration.EIGHTH, velocity=88) +sitar.add(Pa, Duration.EIGHTH, velocity=82) +sitar.add(Ma, Duration.QUARTER, velocity=78) +sitar.add(Ga, Duration.EIGHTH, velocity=72) +sitar.add(Ma, Duration.EIGHTH, velocity=78) +sitar.add(Pa, Duration.QUARTER, velocity=102) +sitar.add(Sa.add(12), Duration.QUARTER, velocity=118, bend=-0.15) +sitar.add(Ni, Duration.EIGHTH, velocity=98) +sitar.add(Dha, Duration.EIGHTH, velocity=88) +sitar.add(Pa, Duration.QUARTER, velocity=85) +sitar.add(Ma, Duration.QUARTER, velocity=78) +sitar.add(Ga, Duration.QUARTER, velocity=68) +sitar.add(Sa, Duration.QUARTER, velocity=72, bend=-0.15) + +# ── Jhala — fast climax (bars 33-40) ─────────────────────────── sitar.set(volume=0.8) -sitar.hold(Sa.add(-12), Duration.WHOLE * 4, velocity=70) -sitar.hold(Pa.add(-12), Duration.WHOLE * 4, velocity=65) -sitar.hold(Sa, Duration.WHOLE * 2, velocity=60) # chikari -sitar.add(Sa.add(12), Duration.EIGHTH, velocity=120) # Sa high accented -sitar.add(Pa, Duration.EIGHTH, velocity=75) # Pa chikari -sitar.add(Sa.add(12), Duration.EIGHTH, velocity=115) # Sa high -sitar.add(Pa, Duration.EIGHTH, velocity=70) # Pa -sitar.add(Ni, Duration.EIGHTH, velocity=110) # Ni -sitar.add(Pa, Duration.EIGHTH, velocity=75) # Pa -sitar.add(Dha, Duration.EIGHTH, velocity=105) # Dha -sitar.add(Pa, Duration.EIGHTH, velocity=70) # Pa -sitar.add(Ma, Duration.EIGHTH, velocity=100) # Ma -sitar.add(Pa, Duration.EIGHTH, velocity=75) # Pa -sitar.add(Dha, Duration.EIGHTH, velocity=110) # Dha -sitar.add(Pa, Duration.EIGHTH, velocity=70) # Pa -sitar.add(Ma, Duration.EIGHTH, velocity=95) # Ma -sitar.add(Ga, Duration.EIGHTH, velocity=85) # Ga -sitar.add(Re, Duration.EIGHTH, velocity=75) # Re -sitar.add(Sa, Duration.EIGHTH, velocity=65) # Sa — descend -sitar.hold(Sa.add(-12), Duration.WHOLE * 2, velocity=70) -sitar.add(Sa.add(12), Duration.EIGHTH, velocity=125) # Sa high — back up! -sitar.add(Re.add(12), Duration.EIGHTH, velocity=120) # Re high -sitar.add(Sa.add(12), Duration.EIGHTH, velocity=115) # Sa high -sitar.add(Ni, Duration.EIGHTH, velocity=105) # Ni -sitar.add(Dha, Duration.EIGHTH, velocity=95) # Dha -sitar.add(Pa, Duration.EIGHTH, velocity=85) # Pa -sitar.add(Ma, Duration.EIGHTH, velocity=75) # Ma -sitar.add(Ga, Duration.EIGHTH, velocity=65) # Ga -sitar.add(Re, Duration.EIGHTH, velocity=55) # Re -sitar.add(Sa, Duration.EIGHTH, velocity=50) # Sa -sitar.add(Re, Duration.EIGHTH, velocity=60) # Re — upturn -sitar.add(Ga, Duration.EIGHTH, velocity=70) # Ga -sitar.hold(Sa.add(-12), Duration.DOTTED_HALF, velocity=65) -sitar.hold(Pa.add(-12), Duration.DOTTED_HALF, velocity=55) -sitar.add(Ma, Duration.QUARTER, velocity=80) # Ma -sitar.add(Sa, Duration.HALF, velocity=60) # Sa — land +# Chikari alternation — melody + open string +for note, vel in [(Sa.add(12), 120), (Ni, 110), (Dha, 105), + (Pa, 115), (Ma, 100), (Dha, 110), + (Ni, 115), (Sa.add(12), 120)]: + sitar.add(note, Duration.EIGHTH, velocity=vel) + sitar.add(Pa, Duration.EIGHTH, velocity=75) -# ── Sitar Finale (bars 17-20) ─────────────────────────────────── +# Ascending run +for note, vel in [(Sa.add(12), 115), (Re.add(12), 120), + (Sa.add(12), 115), (Ni, 105), + (Dha, 95), (Pa, 85), (Ma, 75), (Ga, 65)]: + sitar.add(note, Duration.EIGHTH, velocity=vel) + +# Second jhala phrase — wider, more urgent +for note, vel in [(Sa.add(12), 122), (Pa, 78), (Ni, 115), (Pa, 75), + (Dha, 108), (Pa, 78), (Pa, 100), (Ma, 72), + (Ma, 95), (Pa, 78), (Dha, 110), (Pa, 75), + (Ni, 115), (Pa, 78), (Sa.add(12), 125), (Pa, 80)]: + sitar.add(note, Duration.SIXTEENTH, velocity=vel) + +# Descending 16ths +for note in [Sa.add(12), Ni, Dha, Pa, Ma, Ga, Re, Sa, + Re, Ga, Ma, Pa, Dha, Ni, Sa.add(12), Re.add(12)]: + sitar.add(note, Duration.SIXTEENTH, velocity=115) + +# One more ascending wave +for note in [Sa.add(12), Re.add(12), Sa.add(12), Ni, + Dha, Pa, Ma, Ga, Re, Sa, Re, Ga, + Ma, Pa, Dha, Ni]: + sitar.add(note, Duration.SIXTEENTH, velocity=118) + +sitar.add(Sa.add(12), Duration.HALF, velocity=120, bend=-0.2) +sitar.add(Pa, Duration.HALF, velocity=105) + +# ── Sitar Finale (bars 41-44) ────────────────────────────────── sitar.set(volume=0.7) -sitar.hold(Sa.add(-12), Duration.WHOLE * 4, velocity=65) -sitar.hold(Pa.add(-12), Duration.WHOLE * 4, velocity=55) -sitar.add(Sa, Duration.HALF, bend=-0.25, velocity=100) # Sa with shimmer -sitar.add(Pa, Duration.HALF, bend=-0.25, velocity=110) # Pa with shimmer +sitar.add(Sa, Duration.HALF, bend=-0.25, velocity=100) +sitar.add(Pa, Duration.HALF, bend=-0.25, velocity=110) # Fast descending run -sitar.add(Sa.add(12), Duration.QUARTER, velocity=120) # Sa high -sitar.add(Dha, Duration.EIGHTH, velocity=90) # Dha -sitar.add(Pa, Duration.EIGHTH, velocity=100) # Pa -sitar.add(Ma, Duration.EIGHTH, velocity=80) # Ma -sitar.add(Ga, Duration.EIGHTH, velocity=70) # Ga -sitar.add(Re, Duration.EIGHTH, velocity=60) # Re -sitar.add(Sa, Duration.EIGHTH, velocity=50) # Sa -# Last burst — fast 16ths -sitar.add(Sa.add(12), Duration.SIXTEENTH, velocity=127) # Sa high — full force -sitar.add(Ni, Duration.SIXTEENTH, velocity=115) # Ni -sitar.add(Dha, Duration.SIXTEENTH, velocity=105) # Dha -sitar.add(Pa, Duration.SIXTEENTH, velocity=95) # Pa -sitar.add(Ma, Duration.SIXTEENTH, velocity=85) # Ma -sitar.add(Ga, Duration.SIXTEENTH, velocity=75) # Ga -sitar.add(Re, Duration.SIXTEENTH, velocity=60) # Re -sitar.add(Sa, Duration.SIXTEENTH, velocity=45) # Sa — fade +sitar.add(Sa.add(12), Duration.QUARTER, velocity=120) +sitar.add(Dha, Duration.EIGHTH, velocity=90) +sitar.add(Pa, Duration.EIGHTH, velocity=100) +sitar.add(Ma, Duration.EIGHTH, velocity=80) +sitar.add(Ga, Duration.EIGHTH, velocity=70) +sitar.add(Re, Duration.EIGHTH, velocity=60) +sitar.add(Sa, Duration.EIGHTH, velocity=50) +# Last burst — 16ths +for note, vel in [(Sa.add(12), 127), (Ni, 115), (Dha, 105), (Pa, 95), + (Ma, 85), (Ga, 75), (Re, 60), (Sa, 45)]: + sitar.add(note, Duration.SIXTEENTH, velocity=vel) sitar.rest(Duration.HALF) -# Final held note — Sa, home -sitar.hold(Sa.add(-12), Duration.WHOLE, velocity=70) -sitar.hold(Pa.add(-12), Duration.WHOLE, velocity=60) -sitar.add(Sa, Duration.WHOLE, bend=-0.25, velocity=90) # Sa +# Final held Sa +sitar.add(Sa, Duration.WHOLE, bend=-0.25, velocity=90) -# ── Tabla solo (bars 21-24) — sitar drops out ─────────────────── +# Bars 45-48: tabla solo — sitar drops out then returns sitar.rest(Duration.WHOLE) sitar.rest(Duration.WHOLE) sitar.rest(Duration.WHOLE) -# Bar 24: sitar returns with one final strike -sitar.hold(Sa.add(-12), Duration.WHOLE, velocity=80) -sitar.hold(Pa.add(-12), Duration.WHOLE, velocity=70) -sitar.hold(Sa, Duration.WHOLE, velocity=60) -sitar.add(Sa.add(12), Duration.QUARTER, velocity=127) # Sa high! -sitar.add(Sa, Duration.DOTTED_HALF, velocity=80) # Sa — ring out +# Bar 48: one final strike +sitar.add(Sa.add(12), Duration.QUARTER, velocity=127) +sitar.add(Sa, Duration.DOTTED_HALF, velocity=80) -# ── SITAR ARP — shimmering cascade ────────────────────────────── -sitar_arp = score.part("cascade", instrument="sitar", volume=0.65, +# ── SITAR ARP — shimmering cascade, enters bar 33 ────────────── +sitar_arp = score.part("sitar_arp", instrument="sitar", volume=0.65, reverb=0.15, reverb_decay=0.8, delay=0.25, delay_time=0.167, delay_feedback=0.3, lowpass=3500, pan=0.4, saturation=0.2, humanize=0.1) -# Silent for 8 bars -for _ in range(8): +# Bars 1-32: silent +for _ in range(32): sitar_arp.rest(Duration.WHOLE) -# Bars 9-16: rapid arpeggio patterns built from scale -# Sa-Ga-Pa-Sa' ascending/descending +# Bars 33-40: rapid arpeggio patterns arp_phrases = [ [Sa, Ga, Pa, Sa.add(12), Pa, Ga, Sa, Pa.add(-12), Sa, Ga, Pa, Sa.add(12), Pa, Ga, Sa, Pa.add(-12)], @@ -272,47 +315,38 @@ for _ in range(2): for note in phrase: sitar_arp.add(note, Duration.SIXTEENTH) -# Fade out during finale -sitar_arp.set(volume=0.15) -for phrase in arp_phrases[:2]: - for note in phrase: - sitar_arp.add(note, Duration.SIXTEENTH) -sitar_arp.set(volume=0.0) -for _ in range(6): +# Bars 41-44: fade out +for vel in [50, 35, 20, 10]: + for note in arp_phrases[0]: + sitar_arp.add(note, Duration.SIXTEENTH, velocity=vel) + +# Bars 45-48: silent +for _ in range(4): sitar_arp.rest(Duration.WHOLE) -# ── TABLA SOLO (bars 21-24) — the voice speaks alone ──────────── -tabla = score.part("voice", volume=0.35, +# ── TABLA SOLO (bars 45-48) — the voice speaks alone ─────────── +tabla = score.part("tabla_solo", volume=0.35, reverb=0.2, reverb_decay=1.2, delay=0.15, delay_time=0.333, delay_feedback=0.25, humanize=0.05) -# Silent for 20 bars -for _ in range(20): +# Silent for 44 bars +for _ in range(44): tabla.rest(Duration.WHOLE) # ═══════════════════════════════════════════════════════════════════ # TABLA SOLO — Peshkara → Kaida → Tukra → Tihai # ═══════════════════════════════════════════════════════════════════ -# ── Bar 21: PESHKARA — theme stated with dignity ──────────────── -tabla.hit(tDHA, Duration.QUARTER, velocity=110, articulation="accent") -tabla.hit(GE, Duration.EIGHTH, velocity=90) -tabla.hit(NA, Duration.EIGHTH, velocity=85) -tabla.hit(tDHA, Duration.QUARTER, velocity=105) -tabla.hit(TIT, Duration.SIXTEENTH, velocity=60) -tabla.hit(TIT, Duration.SIXTEENTH, velocity=55) -tabla.hit(NA, Duration.EIGHTH, velocity=80) -tabla.hit(KE, Duration.EIGHTH, velocity=70) -# Repeat with bayan bend answer -tabla.hit(tDHA, Duration.QUARTER, velocity=112, articulation="accent") -tabla.hit(GEB, Duration.EIGHTH, velocity=120) -tabla.hit(NA, Duration.EIGHTH, velocity=88) -tabla.hit(tDHA, Duration.EIGHTH, velocity=100) -tabla.rest(Duration.EIGHTH) -tabla.hit(GEB, Duration.QUARTER, velocity=125) +# ── Bar 45: PESHKARA — theme stated with dignity ────────────── +tabla.hit(tDHA, Duration.QUARTER, velocity=105, articulation="accent") +tabla.hit(GE, Duration.EIGHTH, velocity=78) +tabla.hit(NA, Duration.EIGHTH, velocity=72) +tabla.hit(tDHA, Duration.QUARTER, velocity=98, articulation="accent") +tabla.hit(NA, Duration.EIGHTH, velocity=70) +tabla.hit(KE, Duration.EIGHTH, velocity=60) -# ── Bar 22: KAIDA — developing, clean 8ths and 16ths ─────────── +# ── Bar 46: KAIDA — developing, clean 8ths and 16ths ────────── tabla.hit(tDHA, Duration.EIGHTH, velocity=108, articulation="accent") tabla.hit(GE, Duration.EIGHTH, velocity=82) tabla.hit(NA, Duration.EIGHTH, velocity=78) @@ -321,7 +355,7 @@ tabla.hit(GEB, Duration.EIGHTH, velocity=112, articulation="accent") tabla.hit(NA, Duration.EIGHTH, velocity=80) tabla.hit(tDHA, Duration.EIGHTH, velocity=105) tabla.hit(KE, Duration.EIGHTH, velocity=65) -# Second half: 16ths +# 16ths tabla.hit(tDHA, Duration.SIXTEENTH, velocity=110, articulation="accent") tabla.hit(GE, Duration.SIXTEENTH, velocity=78) tabla.hit(NA, Duration.SIXTEENTH, velocity=82) @@ -333,7 +367,7 @@ tabla.hit(GEB, Duration.SIXTEENTH, velocity=118) tabla.hit(tDHA, Duration.QUARTER, velocity=115, articulation="accent") tabla.hit(GEB, Duration.QUARTER, velocity=120) -# ── Bar 23: TUKRA — virtuosic, all 16ths on the grid ─────────── +# ── Bar 47: TUKRA — virtuosic, all 16ths ────────────────────── tabla.hit(tDHA, Duration.SIXTEENTH, velocity=112, articulation="accent") tabla.hit(GE, Duration.SIXTEENTH, velocity=82) tabla.hit(NA, Duration.SIXTEENTH, velocity=85) @@ -347,29 +381,16 @@ tabla.hit(NA, Duration.SIXTEENTH, velocity=80) tabla.hit(tDHA, Duration.SIXTEENTH, velocity=112) tabla.hit(GE, Duration.SIXTEENTH, velocity=78) tabla.hit(tDHA, Duration.QUARTER, velocity=120, articulation="accent") -# Second half: 16ths building -tabla.hit(tDHA, Duration.SIXTEENTH, velocity=115, articulation="accent") -tabla.hit(NA, Duration.SIXTEENTH, velocity=85) -tabla.hit(GEB, Duration.SIXTEENTH, velocity=120) -tabla.hit(TIT, Duration.SIXTEENTH, velocity=58) -tabla.hit(tDHA, Duration.SIXTEENTH, velocity=118, articulation="accent") -tabla.hit(GEB, Duration.SIXTEENTH, velocity=122) -tabla.hit(NA, Duration.SIXTEENTH, velocity=88) -tabla.hit(tDHA, Duration.SIXTEENTH, velocity=120) -tabla.hit(GEB, Duration.QUARTER, velocity=127, articulation="accent") -# ── Bar 24: TIHAI — three-fold cadence, clean on the grid ────── -# 1st +# ── Bar 48: TIHAI — three-fold cadence ───────────────────────── tabla.hit(tDHA, Duration.EIGHTH, velocity=108, articulation="accent") tabla.hit(NA, Duration.SIXTEENTH, velocity=82) tabla.hit(GEB, Duration.SIXTEENTH, velocity=110) tabla.rest(Duration.EIGHTH) -# 2nd tabla.hit(tDHA, Duration.EIGHTH, velocity=118, articulation="accent") tabla.hit(NA, Duration.SIXTEENTH, velocity=88) tabla.hit(GEB, Duration.SIXTEENTH, velocity=118) tabla.rest(Duration.EIGHTH) -# 3rd — strongest tabla.hit(tDHA, Duration.EIGHTH, velocity=127, articulation="accent") tabla.hit(NA, Duration.SIXTEENTH, velocity=95) tabla.hit(GEB, Duration.SIXTEENTH, velocity=125) @@ -377,6 +398,109 @@ tabla.hit(GEB, Duration.SIXTEENTH, velocity=125) tabla.rest(Duration.QUARTER) tabla.hit(tDHA, Duration.DOTTED_HALF, velocity=127, articulation="fermata") +# ═══════════════════════════════════════════════════════════════════ +# THE DROP — sitar returns with 808, bars 49-56 +# ═══════════════════════════════════════════════════════════════════ + +# Extend tambura for the drop +tambura.set(volume=0.25) +for _ in range(8): + tambura.add(Sa.add(-24), Duration.HALF, velocity=50) + tambura.add(Pa.add(-24), Duration.HALF, velocity=42) + +# Extend tambura_hi +for _ in range(8): + tambura_hi.add(Sa.add(-12), Duration.WHOLE, velocity=35) + +# Extend dhol — comes back for the drop +for _ in range(6): + dhol.hit(DrumSound.DHOL_BOTH, Duration.QUARTER, velocity=95, articulation="accent") + dhol.hit(DrumSound.DHOL_TILLI, Duration.EIGHTH, velocity=68) + dhol.hit(DrumSound.DHOL_DAGGA, Duration.EIGHTH, velocity=78) + dhol.hit(DrumSound.DHOL_TILLI, Duration.EIGHTH, velocity=62) + dhol.hit(DrumSound.DHOL_TILLI, Duration.EIGHTH, velocity=58) + dhol.hit(DrumSound.DHOL_DAGGA, Duration.EIGHTH, velocity=72) + dhol.hit(DrumSound.DHOL_BOTH, Duration.EIGHTH, velocity=88, articulation="accent") +# Fade last 2 bars +for vel in [70, 40]: + dhol.hit(DrumSound.DHOL_BOTH, Duration.QUARTER, velocity=vel) + dhol.hit(DrumSound.DHOL_TILLI, Duration.EIGHTH, velocity=max(15, vel - 25)) + dhol.hit(DrumSound.DHOL_DAGGA, Duration.EIGHTH, velocity=max(15, vel - 15)) + dhol.hit(DrumSound.DHOL_TILLI, Duration.EIGHTH, velocity=max(15, vel - 30)) + dhol.hit(DrumSound.DHOL_TILLI, Duration.EIGHTH, velocity=max(15, vel - 35)) + dhol.hit(DrumSound.DHOL_DAGGA, Duration.EIGHTH, velocity=max(15, vel - 20)) + dhol.hit(DrumSound.DHOL_BOTH, Duration.EIGHTH, velocity=max(15, vel - 10)) + +# ── 808 — the floor drops in ────────────────────────────────── +sub = score.part("808", synth="sine", envelope="pad", volume=1.0, + lowpass=250, distortion=0.3, distortion_drive=4.0, + sub_osc=0.5, sidechain=0.3, saturation=0.5) + +# Bars 1-48: silent +for _ in range(48): + sub.rest(Duration.WHOLE) + +# Bars 49-56: 808 drops — Re, Ga, Re, Pa below — builds intensity +bass_pattern = [ + (Re.add(-24), 20), (Ga.add(-24), 27), (Re.add(-24), 33), (Pa.add(-36), 40), +] +for cycle in range(2): + for note, vel in bass_pattern: + sub.add(note, Duration.WHOLE, velocity=vel + cycle * 5) + +# ── Sitar reprise — gat returns over the 808 ────────────────── +sitar.set(volume=0.85) +# Repeat the gat — the main composition, now with weight underneath +sitar.add(Sa.add(12), Duration.QUARTER, velocity=115) +sitar.add(Ni, Duration.EIGHTH, velocity=95) +sitar.add(Dha, Duration.EIGHTH, velocity=85) +sitar.add(Pa, Duration.QUARTER, velocity=100) +sitar.add(Ma, Duration.QUARTER, velocity=80) +sitar.add(Ga, Duration.EIGHTH, velocity=70) +sitar.add(Ma, Duration.EIGHTH, velocity=82) +sitar.add(Pa, Duration.QUARTER, velocity=105) +sitar.add(Dha, Duration.EIGHTH, velocity=90) +sitar.add(Pa, Duration.EIGHTH, velocity=80) +sitar.add(Ma, Duration.QUARTER, velocity=75) + +sitar.add(Pa, Duration.QUARTER, velocity=95) +sitar.add(Sa.add(12), Duration.QUARTER, velocity=120, bend=-0.15) +sitar.add(Ni, Duration.EIGHTH, velocity=100) +sitar.add(Dha, Duration.EIGHTH, velocity=90) +sitar.add(Pa, Duration.QUARTER, velocity=85) +sitar.add(Ma, Duration.QUARTER, velocity=80) +sitar.add(Ga, Duration.QUARTER, velocity=70) +sitar.add(Re, Duration.QUARTER, velocity=65) +sitar.add(Sa, Duration.HALF, velocity=85, bend=-0.2) + +# Final 16th note burst — one last blaze +for note, vel in [(Sa.add(12), 125), (Ni, 118), (Dha, 112), (Pa, 105), + (Ma, 98), (Ga, 90), (Re, 82), (Sa, 75)]: + sitar.add(note, Duration.SIXTEENTH, velocity=vel) +sitar.rest(Duration.HALF) + +# Last Sa — ringing out over the 808 +sitar.add(Sa, Duration.WHOLE, velocity=90, bend=-0.25) +sitar.rest(Duration.WHOLE) +sitar.rest(Duration.WHOLE) + +# Extend cascade for the drop +sitar_arp.set(volume=0.5) +for _ in range(2): + for phrase in arp_phrases: + for note in phrase: + sitar_arp.add(note, Duration.SIXTEENTH, velocity=70) +# Fade +for vel in [50, 30]: + for note in arp_phrases[0]: + sitar_arp.add(note, Duration.SIXTEENTH, velocity=vel) +for _ in range(2): + sitar_arp.rest(Duration.WHOLE) + +# Tabla solo part rests through the drop +for _ in range(8): + tabla.rest(Duration.WHOLE) + # ═════════════════════════════════════════════════════════════════ import sys