mirror of
https://github.com/kennethreitz/interpretations.git
synced 2026-06-05 06:46:15 +00:00
a9b356f5cc
Silk Road: mellotron_flute in finale. The Dialogue: drift pad, mellotron ending. Acid Reign: wavefold in breakdown. Chakra: drift at crown. Raga Midnight: mellotron_strings over 808 drop. The Temple: granular_pad texture. Sleight of Hand: mellotron_choir. Gravity: drift tambura. Ghost Protocol: NES pulled back. An Exception: psycho bass 0.3. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
958 lines
39 KiB
Python
958 lines
39 KiB
Python
"""
|
|
THE TEMPLE — devotional layers inside a vast stone chamber.
|
|
Every sound fills the room. The reverb IS the instrument.
|
|
|
|
A Phrygian (Bhairavi), shruti just intonation, A=432 Hz, 65 BPM.
|
|
Singing bowls, tambura, harmonium, sitar, bansuri, tabla.
|
|
"""
|
|
|
|
from pytheory import Key, Duration, Score, Tone, play_score
|
|
from pytheory.rhythm import DrumSound
|
|
|
|
key = Key("A", "phrygian")
|
|
s = key.scale # A Bb C D E F G
|
|
|
|
Sa = s[0] # A (Sa)
|
|
Re = s[1] # Bb (komal Re)
|
|
Ga = s[2] # C (komal Ga)
|
|
Ma = s[3] # D (Ma)
|
|
Pa = s[4] # E (Pa)
|
|
Dha = s[5] # F (komal Dha)
|
|
Ni = s[6] # G (komal Ni)
|
|
|
|
score = Score("4/4", bpm=65, system="shruti", temperament="just",
|
|
reference_pitch=432.0)
|
|
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
# STRUCTURE (72 bars, ~7 min):
|
|
# Bars 1-8: Singing bowl alone — the space announces itself
|
|
# Bars 9-16: Tambura drone fades in — Sa-Pa, the foundation
|
|
# Bars 17-24: Harmonium breathes — slow chords, glacial
|
|
# Bars 25-40: Sitar enters — sparse melody, ornamental
|
|
# Bars 33-48: Bansuri (flute) — long held notes with bends
|
|
# Bars 41-48: Tabla — softest possible, just a heartbeat
|
|
# Bars 49-56: TABLA SOLO — peshkara → kaida → tukra → tihai
|
|
# Bars 57-68: SITAR SOLO — gat → jhala → tihai (3 sitars)
|
|
# Bars 69-72: Everything dissolving back into silence
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
|
|
# ── ROOM TONE — the reverb tail of an empty temple ──────────────
|
|
room = score.part("room", synth="noise", envelope="pad", volume=0.03,
|
|
reverb=1.0, reverb_type="taj_mahal",
|
|
lowpass=300)
|
|
room.lfo("lowpass", rate=0.01, min=150, max=500, bars=72, shape="sine")
|
|
room.lfo("volume", rate=0.008, min=0.015, max=0.04, bars=72, shape="triangle")
|
|
|
|
for _ in range(72):
|
|
room.add(Sa, Duration.WHOLE, velocity=25)
|
|
|
|
# ── GRAIN — granular pad, subliminal texture ───────────────────
|
|
grain = score.part("grain", instrument="granular_pad", volume=0.05,
|
|
reverb=0.4, reverb_type="taj_mahal",
|
|
pan=0.25)
|
|
|
|
# Bars 1-8: silent
|
|
for _ in range(8):
|
|
grain.rest(Duration.WHOLE)
|
|
|
|
# Bars 9-64: Sa drone an octave below, whole notes
|
|
for _ in range(56):
|
|
grain.add(Sa.add(-12), Duration.WHOLE, velocity=28)
|
|
|
|
# Bars 65-72: fade out
|
|
for vel in [22, 18, 14, 10, 6, 0, 0, 0]:
|
|
if vel > 0:
|
|
grain.add(Sa.add(-12), Duration.WHOLE, velocity=vel)
|
|
else:
|
|
grain.rest(Duration.WHOLE)
|
|
|
|
# ── SINGING BOWL — the space itself ─────────────────────────────
|
|
bowl = score.part("bowl", instrument="singing_bowl", volume=0.55,
|
|
reverb=1.0, reverb_type="taj_mahal",
|
|
delay=0.3, delay_time=0.923, delay_feedback=0.45)
|
|
|
|
# Bars 1-8: solo — one strike, let it ring, another strike
|
|
bowl.add(Sa.add(-24), Duration.WHOLE, velocity=80)
|
|
bowl.rest(Duration.WHOLE)
|
|
bowl.rest(Duration.WHOLE)
|
|
bowl.rest(Duration.WHOLE)
|
|
bowl.add(Pa.add(-24), Duration.WHOLE, velocity=72)
|
|
bowl.rest(Duration.WHOLE)
|
|
bowl.rest(Duration.WHOLE)
|
|
bowl.add(Sa.add(-12), Duration.WHOLE, velocity=68)
|
|
|
|
# Bars 9-16: every 4 bars
|
|
bowl.add(Sa.add(-24), Duration.WHOLE, velocity=75)
|
|
bowl.rest(Duration.WHOLE)
|
|
bowl.rest(Duration.WHOLE)
|
|
bowl.rest(Duration.WHOLE)
|
|
bowl.add(Pa.add(-24), Duration.WHOLE, velocity=70)
|
|
bowl.rest(Duration.WHOLE)
|
|
bowl.rest(Duration.WHOLE)
|
|
bowl.rest(Duration.WHOLE)
|
|
|
|
# Bars 17-72: every 8 bars, fading gradually
|
|
for section in range(7):
|
|
vel = max(30, 70 - section * 5)
|
|
bowl.add(Sa.add(-24), Duration.WHOLE, velocity=vel)
|
|
for _ in range(7):
|
|
bowl.rest(Duration.WHOLE)
|
|
|
|
# ── SINGING BOWL HIGH — shimmer, octave above ──────────────────
|
|
bowl_hi = score.part("bowl_hi", instrument="singing_bowl_ring", volume=0.3,
|
|
reverb=1.0, reverb_type="taj_mahal",
|
|
delay=0.25, delay_time=0.692, delay_feedback=0.4,
|
|
pan=0.25)
|
|
|
|
# Bars 1-16: silent
|
|
for _ in range(16):
|
|
bowl_hi.rest(Duration.WHOLE)
|
|
|
|
# Bars 17-64: gentle ring every 6 bars offset from the low bowl
|
|
for _ in range(4):
|
|
bowl_hi.rest(Duration.WHOLE)
|
|
bowl_hi.rest(Duration.WHOLE)
|
|
bowl_hi.add(Sa, Duration.WHOLE, velocity=50)
|
|
bowl_hi.rest(Duration.WHOLE)
|
|
bowl_hi.rest(Duration.WHOLE)
|
|
bowl_hi.rest(Duration.WHOLE)
|
|
bowl_hi.add(Pa, Duration.WHOLE, velocity=45)
|
|
bowl_hi.rest(Duration.WHOLE)
|
|
bowl_hi.rest(Duration.WHOLE)
|
|
bowl_hi.rest(Duration.WHOLE)
|
|
bowl_hi.add(Ma, Duration.WHOLE, velocity=42)
|
|
bowl_hi.rest(Duration.WHOLE)
|
|
|
|
# Bars 65-72: silent through ending
|
|
for _ in range(8):
|
|
bowl_hi.rest(Duration.WHOLE)
|
|
|
|
# ── TAMBURA — the drone bed ────────────────────────────────────
|
|
tambura = score.part("tambura", synth="sine", envelope="pad", volume=0.25,
|
|
reverb=0.8, reverb_type="taj_mahal",
|
|
chorus=0.5, chorus_rate=0.06, chorus_depth=0.012,
|
|
lowpass=900, pan=-0.2, saturation=0.15)
|
|
|
|
# Bars 1-8: silent — bowl alone
|
|
for _ in range(8):
|
|
tambura.rest(Duration.WHOLE)
|
|
|
|
# Bars 9-16: fade in
|
|
for vel in [15, 20, 25, 30, 35, 40, 45, 50]:
|
|
tambura.add(Sa.add(-24), Duration.HALF, velocity=vel)
|
|
tambura.add(Pa.add(-24), Duration.HALF, velocity=max(10, vel - 8))
|
|
|
|
# Bars 17-64: full drone — Sa-Pa cycle
|
|
for _ in range(48):
|
|
tambura.add(Sa.add(-24), Duration.HALF, velocity=55)
|
|
tambura.add(Pa.add(-24), Duration.HALF, velocity=48)
|
|
|
|
# Bars 65-72: fade out
|
|
for vel in [50, 42, 35, 28, 20, 14, 8, 0]:
|
|
if vel > 0:
|
|
tambura.add(Sa.add(-24), Duration.HALF, velocity=vel)
|
|
tambura.add(Pa.add(-24), Duration.HALF, velocity=max(5, vel - 8))
|
|
else:
|
|
tambura.rest(Duration.WHOLE)
|
|
|
|
# ── TAMBURA HIGH — octave shimmer, widens the drone ────────────
|
|
tambura_hi = score.part("tambura_hi", synth="sine", envelope="pad", volume=0.18,
|
|
reverb=0.85, reverb_type="taj_mahal",
|
|
chorus=0.6, chorus_rate=0.04, chorus_depth=0.015,
|
|
lowpass=1400, pan=0.25, saturation=0.1)
|
|
|
|
# Bars 1-16: silent
|
|
for _ in range(16):
|
|
tambura_hi.rest(Duration.WHOLE)
|
|
|
|
# Bars 17-64: Sa drone an octave up
|
|
for _ in range(48):
|
|
tambura_hi.add(Sa.add(-12), Duration.WHOLE, velocity=42)
|
|
|
|
# Bars 65-72: fade
|
|
for vel in [35, 28, 20, 14, 10, 6, 3, 0]:
|
|
if vel > 0:
|
|
tambura_hi.add(Sa.add(-12), Duration.WHOLE, velocity=vel)
|
|
else:
|
|
tambura_hi.rest(Duration.WHOLE)
|
|
|
|
# ── HARMONIUM — breathing chords ───────────────────────────────
|
|
harmonium = score.part("harmonium", instrument="harmonium", volume=0.12,
|
|
reverb=0.75, reverb_type="taj_mahal",
|
|
chorus=0.15, chorus_rate=0.08, chorus_depth=0.005,
|
|
humanize=0.08)
|
|
|
|
# Bars 1-16: silent
|
|
for _ in range(16):
|
|
harmonium.rest(Duration.WHOLE)
|
|
|
|
# Bars 17-24: breathe in, breathe out — one chord per 2 bars
|
|
harm_chords = key.progression("i", "iv", "i", "v")
|
|
for chord in harm_chords:
|
|
harmonium.add(chord, Duration.WHOLE, velocity=50)
|
|
harmonium.rest(Duration.WHOLE)
|
|
|
|
# Bars 25-48: fuller, still glacial
|
|
for _ in range(3):
|
|
for chord in harm_chords:
|
|
harmonium.add(chord, Duration.WHOLE, velocity=55)
|
|
harmonium.rest(Duration.WHOLE)
|
|
|
|
# Bars 49-56: one last cycle, warmer
|
|
harm_chords_2 = key.progression("i", "VI", "iv", "i")
|
|
for chord in harm_chords_2:
|
|
harmonium.add(chord, Duration.WHOLE, velocity=52)
|
|
harmonium.rest(Duration.WHOLE)
|
|
|
|
# Bars 57-64: holds through tabla/sitar solos
|
|
for _ in range(2):
|
|
for chord in harm_chords:
|
|
harmonium.add(chord, Duration.WHOLE, velocity=48)
|
|
harmonium.rest(Duration.WHOLE)
|
|
|
|
# Bars 65-72: fading — just i chord dissolving
|
|
harmonium.add(key.progression("i")[0], Duration.WHOLE, velocity=40)
|
|
harmonium.rest(Duration.WHOLE)
|
|
harmonium.add(key.progression("i")[0], Duration.WHOLE, velocity=30)
|
|
harmonium.rest(Duration.WHOLE)
|
|
harmonium.add(key.progression("i")[0], Duration.WHOLE, velocity=20)
|
|
for _ in range(3):
|
|
harmonium.rest(Duration.WHOLE)
|
|
|
|
# ── SITAR — sparse, ornamental melody ──────────────────────────
|
|
sitar = score.part("sitar", instrument="sitar", volume=0.55,
|
|
reverb=0.6, reverb_type="taj_mahal",
|
|
delay=0.35, delay_time=0.461, delay_feedback=0.4,
|
|
pan=-0.15, saturation=0.2, humanize=0.1)
|
|
|
|
# Bars 1-24: silent
|
|
for _ in range(24):
|
|
sitar.rest(Duration.WHOLE)
|
|
|
|
# Bars 25-28: alap — slow, exploring the raga, lots of space
|
|
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=72)
|
|
sitar.rest(Duration.WHOLE)
|
|
|
|
# Bars 29-32: reaching upward
|
|
sitar.add(Ga, Duration.DOTTED_HALF, velocity=78)
|
|
sitar.rest(Duration.QUARTER)
|
|
sitar.add(Ma, Duration.QUARTER, velocity=72)
|
|
sitar.add(Ga, Duration.QUARTER, velocity=68)
|
|
sitar.add(Re, Duration.QUARTER, velocity=65)
|
|
sitar.add(Sa, Duration.QUARTER, velocity=70)
|
|
sitar.rest(Duration.WHOLE)
|
|
|
|
# Bars 33-36: the peak phrase — Pa reached
|
|
sitar.hold(Sa.add(-12), Duration.WHOLE * 2, velocity=55)
|
|
sitar.add(Pa, Duration.HALF, velocity=85, bend=-0.2)
|
|
sitar.add(Ma, Duration.QUARTER, velocity=75)
|
|
sitar.add(Ga, Duration.QUARTER, velocity=70)
|
|
sitar.add(Re, Duration.HALF, velocity=68)
|
|
sitar.add(Sa, Duration.HALF, velocity=72)
|
|
|
|
# Bars 37-40: descending, settling
|
|
sitar.add(Dha.add(-12), Duration.HALF, velocity=65)
|
|
sitar.add(Pa.add(-12), Duration.HALF, velocity=60)
|
|
sitar.add(Sa, Duration.WHOLE, velocity=70, bend=-0.15)
|
|
sitar.rest(Duration.WHOLE)
|
|
sitar.rest(Duration.WHOLE)
|
|
|
|
# Bars 41-48: second statement — more ornamental
|
|
sitar.hold(Sa.add(-12), Duration.WHOLE * 2, velocity=55)
|
|
sitar.add(Re, Duration.EIGHTH, velocity=65)
|
|
sitar.add(Ga, Duration.EIGHTH, velocity=70)
|
|
sitar.add(Ma, Duration.QUARTER, velocity=78)
|
|
sitar.add(Pa, Duration.HALF, velocity=82)
|
|
sitar.add(Dha, Duration.QUARTER, velocity=75, bend=-0.25)
|
|
sitar.add(Pa, Duration.QUARTER, velocity=72)
|
|
sitar.add(Ma, Duration.QUARTER, velocity=68)
|
|
sitar.add(Ga, Duration.QUARTER, velocity=65)
|
|
sitar.add(Re, Duration.HALF, velocity=62)
|
|
sitar.add(Sa, Duration.WHOLE, velocity=70, bend=-0.15)
|
|
sitar.rest(Duration.WHOLE)
|
|
sitar.rest(Duration.WHOLE)
|
|
|
|
# Bars 49-56: sitar responds to tabla solo — short phrases between the bols
|
|
sitar.add(Sa, Duration.HALF, velocity=72, bend=-0.15)
|
|
sitar.rest(Duration.HALF)
|
|
sitar.rest(Duration.WHOLE)
|
|
sitar.add(Ga, Duration.QUARTER, velocity=68)
|
|
sitar.add(Re, Duration.QUARTER, velocity=65)
|
|
sitar.add(Sa, Duration.HALF, velocity=70)
|
|
sitar.rest(Duration.WHOLE)
|
|
sitar.add(Pa, Duration.QUARTER, velocity=78)
|
|
sitar.add(Ma, Duration.EIGHTH, velocity=70)
|
|
sitar.add(Ga, Duration.EIGHTH, velocity=65)
|
|
sitar.add(Re, Duration.HALF, velocity=68)
|
|
sitar.rest(Duration.WHOLE)
|
|
sitar.rest(Duration.WHOLE)
|
|
sitar.rest(Duration.WHOLE)
|
|
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
# Bars 57-70: SITAR SOLO — the temple speaks through the strings
|
|
# Gat → Jhala → Tihai. Builds from meditative to ecstatic.
|
|
# Dry sitar — cuts through the reverb wash.
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
solo = score.part("sitar_solo", instrument="sitar", volume=1.0,
|
|
reverb=0.45, reverb_type="taj_mahal",
|
|
delay=0.2, delay_time=0.461, delay_feedback=0.3,
|
|
pan=-0.2, saturation=0.3, humanize=0.08)
|
|
|
|
# Second sitar — panned right, slightly less volume, adds width
|
|
solo_r = score.part("sitar_solo_r", instrument="sitar", volume=0.85,
|
|
reverb=0.4, reverb_type="taj_mahal",
|
|
delay=0.25, delay_time=0.346, delay_feedback=0.3,
|
|
pan=0.35, saturation=0.25, humanize=0.12)
|
|
|
|
# Third sitar — center-ish, octave down, thickens the bottom
|
|
solo_low = score.part("sitar_solo_low", instrument="sitar", volume=0.7,
|
|
reverb=0.5, reverb_type="taj_mahal",
|
|
delay=0.15, delay_time=0.461, delay_feedback=0.25,
|
|
pan=-0.05, saturation=0.2, humanize=0.1,
|
|
lowpass=2500)
|
|
|
|
# All solos silent for bars 1-56 (tabla solo is 49-56)
|
|
for _ in range(56):
|
|
solo.rest(Duration.WHOLE)
|
|
solo_r.rest(Duration.WHOLE)
|
|
solo_low.rest(Duration.WHOLE)
|
|
|
|
# Wet sitar drops to drone during both solos
|
|
sitar.set(volume=0.25)
|
|
sitar.hold(Sa.add(-12), Duration.WHOLE * 24, velocity=50)
|
|
|
|
# Bars 57-58: GAT — confident, full velocity
|
|
solo.add(Sa.add(12), Duration.QUARTER, velocity=120)
|
|
solo.add(Ni, Duration.EIGHTH, velocity=110)
|
|
solo.add(Dha, Duration.EIGHTH, velocity=105)
|
|
solo.add(Pa, Duration.QUARTER, velocity=115)
|
|
solo.add(Ma, Duration.QUARTER, velocity=108)
|
|
solo.add(Ga, Duration.EIGHTH, velocity=100)
|
|
solo.add(Ma, Duration.EIGHTH, velocity=105)
|
|
solo.add(Pa, Duration.QUARTER, velocity=118)
|
|
solo.add(Dha, Duration.EIGHTH, velocity=108)
|
|
solo.add(Pa, Duration.EIGHTH, velocity=105)
|
|
solo.add(Ma, Duration.QUARTER, velocity=100)
|
|
|
|
# Bars 59-60: GAT develops — climbing, with 32nd note shred bursts
|
|
solo.add(Pa, Duration.QUARTER, velocity=118)
|
|
solo.add(Sa.add(12), Duration.QUARTER, velocity=125, bend=-0.15)
|
|
# 32nd note burst — ripping up the scale
|
|
solo.add(Re, 0.125, velocity=115)
|
|
solo.add(Ga, 0.125, velocity=118)
|
|
solo.add(Ma, 0.125, velocity=120)
|
|
solo.add(Pa, 0.125, velocity=122)
|
|
solo.add(Dha, 0.125, velocity=125)
|
|
solo.add(Ni, 0.125, velocity=127)
|
|
solo.add(Sa.add(12), 0.125, velocity=127)
|
|
solo.add(Ni, 0.125, velocity=122)
|
|
# Back to 8ths
|
|
solo.add(Pa, Duration.QUARTER, velocity=115)
|
|
solo.add(Ma, Duration.EIGHTH, velocity=108)
|
|
solo.add(Ga, Duration.EIGHTH, velocity=105)
|
|
solo.add(Re, Duration.QUARTER, velocity=100)
|
|
solo.add(Sa, Duration.QUARTER, velocity=110, bend=-0.2)
|
|
|
|
# Bars 61-62: JHALA — chikari 16ths, full power
|
|
solo.add(Sa.add(12), Duration.SIXTEENTH, velocity=125)
|
|
solo.add(Pa, Duration.SIXTEENTH, velocity=95)
|
|
solo.add(Sa.add(12), Duration.SIXTEENTH, velocity=122)
|
|
solo.add(Pa, Duration.SIXTEENTH, velocity=92)
|
|
solo.add(Ni, Duration.SIXTEENTH, velocity=120)
|
|
solo.add(Pa, Duration.SIXTEENTH, velocity=95)
|
|
solo.add(Dha, Duration.SIXTEENTH, velocity=118)
|
|
solo.add(Pa, Duration.SIXTEENTH, velocity=92)
|
|
solo.add(Ma, Duration.SIXTEENTH, velocity=115)
|
|
solo.add(Pa, Duration.SIXTEENTH, velocity=95)
|
|
solo.add(Dha, Duration.SIXTEENTH, velocity=120)
|
|
solo.add(Pa, Duration.SIXTEENTH, velocity=92)
|
|
solo.add(Ni, Duration.SIXTEENTH, velocity=122)
|
|
solo.add(Pa, Duration.SIXTEENTH, velocity=95)
|
|
solo.add(Sa.add(12), Duration.SIXTEENTH, velocity=127)
|
|
solo.add(Pa, Duration.SIXTEENTH, velocity=95)
|
|
# Bar 62 — 32nd note shred ascending then descending
|
|
solo.add(Sa, 0.125, velocity=118)
|
|
solo.add(Re, 0.125, velocity=120)
|
|
solo.add(Ga, 0.125, velocity=122)
|
|
solo.add(Ma, 0.125, velocity=125)
|
|
solo.add(Pa, 0.125, velocity=127)
|
|
solo.add(Dha, 0.125, velocity=127)
|
|
solo.add(Ni, 0.125, velocity=127)
|
|
solo.add(Sa.add(12), 0.125, velocity=127)
|
|
solo.add(Sa.add(12), 0.125, velocity=127)
|
|
solo.add(Ni, 0.125, velocity=125)
|
|
solo.add(Dha, 0.125, velocity=122)
|
|
solo.add(Pa, 0.125, velocity=120)
|
|
solo.add(Ma, 0.125, velocity=118)
|
|
solo.add(Ga, 0.125, velocity=115)
|
|
solo.add(Re, 0.125, velocity=112)
|
|
solo.add(Sa, 0.125, velocity=110)
|
|
# 32nd note shred back up — higher this time
|
|
solo.add(Re, 0.125, velocity=118)
|
|
solo.add(Ma, 0.125, velocity=122)
|
|
solo.add(Dha, 0.125, velocity=125)
|
|
solo.add(Sa.add(12), 0.125, velocity=127)
|
|
solo.add(Re.add(12), 0.125, velocity=127, bend=-0.2)
|
|
solo.add(Sa.add(12), 0.125, velocity=125)
|
|
solo.add(Ni, 0.125, velocity=122)
|
|
solo.add(Pa, 0.125, velocity=118)
|
|
|
|
# Bars 63-64: PEAK — furious 16ths + 32nd shred runs
|
|
solo.add(Sa.add(12), Duration.SIXTEENTH, velocity=127)
|
|
solo.add(Pa, Duration.SIXTEENTH, velocity=100)
|
|
solo.add(Sa.add(12), Duration.SIXTEENTH, velocity=127)
|
|
solo.add(Pa, Duration.SIXTEENTH, velocity=98)
|
|
solo.add(Ni, Duration.SIXTEENTH, velocity=125)
|
|
solo.add(Pa, Duration.SIXTEENTH, velocity=100)
|
|
solo.add(Dha, Duration.SIXTEENTH, velocity=122)
|
|
solo.add(Pa, Duration.SIXTEENTH, velocity=98)
|
|
# 32nd note blaze — the fastest moment
|
|
solo.add(Sa.add(12), 0.125, velocity=127, bend=-0.2)
|
|
solo.add(Ni, 0.125, velocity=125)
|
|
solo.add(Sa.add(12), 0.125, velocity=127)
|
|
solo.add(Dha, 0.125, velocity=122)
|
|
solo.add(Pa, 0.125, velocity=120)
|
|
solo.add(Dha, 0.125, velocity=122)
|
|
solo.add(Ni, 0.125, velocity=125)
|
|
solo.add(Sa.add(12), 0.125, velocity=127)
|
|
# Full descending 32nd note run
|
|
solo.add(Sa.add(12), 0.125, velocity=127)
|
|
solo.add(Ni, 0.125, velocity=125)
|
|
solo.add(Dha, 0.125, velocity=122)
|
|
solo.add(Pa, 0.125, velocity=120)
|
|
solo.add(Ma, 0.125, velocity=118)
|
|
solo.add(Ga, 0.125, velocity=115)
|
|
solo.add(Re, 0.125, velocity=112)
|
|
solo.add(Sa, 0.125, velocity=110)
|
|
# Rocket back up
|
|
solo.add(Re, 0.125, velocity=118)
|
|
solo.add(Ga, 0.125, velocity=122)
|
|
solo.add(Ma, 0.125, velocity=125)
|
|
solo.add(Pa, 0.125, velocity=127)
|
|
solo.add(Dha, 0.125, velocity=127)
|
|
solo.add(Ni, 0.125, velocity=127)
|
|
solo.add(Sa.add(12), 0.125, velocity=127)
|
|
solo.add(Re.add(12), 0.125, velocity=127)
|
|
|
|
# Bars 65-66: TIHAI — three-fold cadence, maximum impact
|
|
solo.add(Sa.add(12), Duration.EIGHTH, velocity=127, bend=-0.15)
|
|
solo.add(Ni, Duration.SIXTEENTH, velocity=118)
|
|
solo.add(Dha, Duration.SIXTEENTH, velocity=112)
|
|
solo.add(Pa, Duration.QUARTER, velocity=122)
|
|
solo.rest(Duration.EIGHTH)
|
|
# 2nd
|
|
solo.add(Sa.add(12), Duration.EIGHTH, velocity=127, bend=-0.15)
|
|
solo.add(Ni, Duration.SIXTEENTH, velocity=120)
|
|
solo.add(Dha, Duration.SIXTEENTH, velocity=115)
|
|
solo.add(Pa, Duration.QUARTER, velocity=125)
|
|
solo.rest(Duration.EIGHTH)
|
|
# 3rd — strongest
|
|
solo.add(Sa.add(12), Duration.EIGHTH, velocity=127, bend=-0.15)
|
|
solo.add(Ni, Duration.SIXTEENTH, velocity=125)
|
|
solo.add(Dha, Duration.SIXTEENTH, velocity=120)
|
|
solo.add(Pa, Duration.QUARTER, velocity=127)
|
|
# SAM — home
|
|
solo.rest(Duration.QUARTER)
|
|
solo.add(Sa, Duration.DOTTED_HALF, velocity=120, bend=-0.25)
|
|
|
|
# Bars 69-72: aftermath — ringing out, returning to stillness
|
|
solo.set(volume=0.5)
|
|
solo.add(Sa, Duration.WHOLE, velocity=70, bend=-0.15)
|
|
solo.add(Sa, Duration.WHOLE, velocity=45, bend=-0.1)
|
|
for _ in range(2):
|
|
solo.rest(Duration.WHOLE)
|
|
|
|
# ── SITAR RIGHT — enters at jhala, adds stereo width ───────────
|
|
# Bars 49-52: silent (gat is solo only)
|
|
for _ in range(4):
|
|
solo_r.rest(Duration.WHOLE)
|
|
|
|
# Bars 53-54: jhala doubled — same pattern, panned right
|
|
solo_r.set(volume=0.45)
|
|
solo_r.add(Sa.add(12), Duration.EIGHTH, velocity=100)
|
|
solo_r.add(Pa, Duration.EIGHTH, velocity=65)
|
|
solo_r.add(Sa.add(12), Duration.EIGHTH, velocity=98)
|
|
solo_r.add(Pa, Duration.EIGHTH, velocity=62)
|
|
solo_r.add(Ni, Duration.EIGHTH, velocity=95)
|
|
solo_r.add(Pa, Duration.EIGHTH, velocity=65)
|
|
solo_r.add(Dha, Duration.EIGHTH, velocity=92)
|
|
solo_r.add(Pa, Duration.EIGHTH, velocity=62)
|
|
solo_r.add(Ma, Duration.EIGHTH, velocity=88)
|
|
solo_r.add(Pa, Duration.EIGHTH, velocity=65)
|
|
solo_r.add(Dha, Duration.EIGHTH, velocity=95)
|
|
solo_r.add(Pa, Duration.EIGHTH, velocity=62)
|
|
solo_r.rest(Duration.QUARTER)
|
|
solo_r.rest(Duration.QUARTER)
|
|
|
|
# Bars 55-56: 16ths doubled
|
|
solo_r.set(volume=0.5)
|
|
for note, vel in [(Sa.add(12),110),(Pa,70),(Ni,102),(Pa,68),
|
|
(Dha,100),(Pa,65),(Pa,95),(Ma,62),
|
|
(Ma,90),(Pa,68),(Dha,102),(Pa,65),
|
|
(Ni,108),(Pa,70),(Sa.add(12),112),(Pa,68)]:
|
|
solo_r.add(note, Duration.SIXTEENTH, velocity=vel)
|
|
for note, vel in [(Sa.add(12),115),(Re.add(12),110),(Sa.add(12),108),(Ni,100),
|
|
(Dha,95),(Pa,90),(Ma,82),(Ga,78),
|
|
(Re,70),(Sa,65),(Re,72),(Ga,80),
|
|
(Ma,88),(Pa,95),(Dha,102),(Ni,110)]:
|
|
solo_r.add(note, Duration.SIXTEENTH, velocity=vel)
|
|
|
|
# Bars 57-58: peak doubled
|
|
solo_r.set(volume=0.55)
|
|
for note, vel in [(Sa.add(12),120),(Pa,72),(Sa.add(12),118),(Pa,70),
|
|
(Ni,112),(Pa,72),(Dha,110),(Pa,70),
|
|
(Sa.add(12),122),(Ni,110),(Dha,105),(Pa,100),
|
|
(Ma,92),(Ga,85),(Re,78),(Sa,70)]:
|
|
solo_r.add(note, Duration.SIXTEENTH, velocity=vel)
|
|
for note, vel in [(Sa.add(12),122),(Re.add(12),118),(Sa.add(12),115),(Ni,108),
|
|
(Sa.add(12),120),(Ni,105),(Dha,100),(Pa,95),
|
|
(Ma,88),(Ga,80),(Re,72),(Sa,68),
|
|
(Re,75),(Ga,82),(Ma,90),(Pa,105)]:
|
|
solo_r.add(note, Duration.SIXTEENTH, velocity=vel)
|
|
|
|
# Bars 59-60: tihai doubled
|
|
solo_r.add(Sa.add(12), Duration.EIGHTH, velocity=110, bend=-0.15)
|
|
solo_r.add(Ni, Duration.SIXTEENTH, velocity=90)
|
|
solo_r.add(Dha, Duration.SIXTEENTH, velocity=82)
|
|
solo_r.add(Pa, Duration.QUARTER, velocity=100)
|
|
solo_r.rest(Duration.EIGHTH)
|
|
solo_r.add(Sa.add(12), Duration.EIGHTH, velocity=115, bend=-0.15)
|
|
solo_r.add(Ni, Duration.SIXTEENTH, velocity=95)
|
|
solo_r.add(Dha, Duration.SIXTEENTH, velocity=88)
|
|
solo_r.add(Pa, Duration.QUARTER, velocity=105)
|
|
solo_r.rest(Duration.EIGHTH)
|
|
solo_r.add(Sa.add(12), Duration.EIGHTH, velocity=122, bend=-0.15)
|
|
solo_r.add(Ni, Duration.SIXTEENTH, velocity=102)
|
|
solo_r.add(Dha, Duration.SIXTEENTH, velocity=95)
|
|
solo_r.add(Pa, Duration.QUARTER, velocity=110)
|
|
solo_r.rest(Duration.QUARTER)
|
|
solo_r.add(Sa, Duration.DOTTED_HALF, velocity=90, bend=-0.25)
|
|
|
|
# Bars 69-72: fade
|
|
solo_r.add(Sa, Duration.WHOLE, velocity=55, bend=-0.15)
|
|
for _ in range(3):
|
|
solo_r.rest(Duration.WHOLE)
|
|
|
|
# ── SITAR LOW — octave down, enters at peak for thickness ──────
|
|
# Bars 57-64: silent (enters at bar 65)
|
|
for _ in range(8):
|
|
solo_low.rest(Duration.WHOLE)
|
|
|
|
# Bars 57-58: peak doubled octave down — massive
|
|
solo_low.set(volume=0.35)
|
|
for note, vel in [(Sa,115),(Pa.add(-12),70),(Sa,112),(Pa.add(-12),68),
|
|
(Ni.add(-12),108),(Pa.add(-12),70),(Dha.add(-12),105),(Pa.add(-12),68),
|
|
(Sa,118),(Ni.add(-12),105),(Dha.add(-12),100),(Pa.add(-12),95),
|
|
(Ma.add(-12),88),(Ga.add(-12),82),(Re.add(-12),75),(Sa.add(-12),68)]:
|
|
solo_low.add(note, Duration.SIXTEENTH, velocity=vel)
|
|
for note, vel in [(Sa,118),(Re,112),(Sa,110),(Ni.add(-12),102),
|
|
(Sa,115),(Ni.add(-12),100),(Dha.add(-12),95),(Pa.add(-12),90),
|
|
(Ma.add(-12),82),(Ga.add(-12),78),(Re.add(-12),72),(Sa.add(-12),65),
|
|
(Re.add(-12),70),(Ga.add(-12),78),(Ma.add(-12),85),(Pa.add(-12),95)]:
|
|
solo_low.add(note, Duration.SIXTEENTH, velocity=vel)
|
|
|
|
# Bars 59-60: tihai octave down
|
|
solo_low.add(Sa, Duration.EIGHTH, velocity=105)
|
|
solo_low.add(Ni.add(-12), Duration.SIXTEENTH, velocity=85)
|
|
solo_low.add(Dha.add(-12), Duration.SIXTEENTH, velocity=78)
|
|
solo_low.add(Pa.add(-12), Duration.QUARTER, velocity=95)
|
|
solo_low.rest(Duration.EIGHTH)
|
|
solo_low.add(Sa, Duration.EIGHTH, velocity=110)
|
|
solo_low.add(Ni.add(-12), Duration.SIXTEENTH, velocity=90)
|
|
solo_low.add(Dha.add(-12), Duration.SIXTEENTH, velocity=82)
|
|
solo_low.add(Pa.add(-12), Duration.QUARTER, velocity=100)
|
|
solo_low.rest(Duration.EIGHTH)
|
|
solo_low.add(Sa, Duration.EIGHTH, velocity=118)
|
|
solo_low.add(Ni.add(-12), Duration.SIXTEENTH, velocity=98)
|
|
solo_low.add(Dha.add(-12), Duration.SIXTEENTH, velocity=90)
|
|
solo_low.add(Pa.add(-12), Duration.QUARTER, velocity=108)
|
|
solo_low.rest(Duration.QUARTER)
|
|
solo_low.add(Sa.add(-12), Duration.DOTTED_HALF, velocity=85, bend=-0.25)
|
|
|
|
# Bars 69-72: fade
|
|
solo_low.add(Sa.add(-12), Duration.WHOLE, velocity=55)
|
|
for _ in range(3):
|
|
solo_low.rest(Duration.WHOLE)
|
|
|
|
# Wet sitar resumes for the ending (bars 69-72)
|
|
sitar.set(volume=0.4)
|
|
sitar.add(Sa, Duration.WHOLE, velocity=55, bend=-0.15)
|
|
for _ in range(3):
|
|
sitar.rest(Duration.WHOLE)
|
|
|
|
# ── BANSURI (flute) — long tones, breathy, ethereal ────────────
|
|
# Using triangle wave + heavy reverb to approximate bansuri
|
|
bansuri = score.part("bansuri", synth="triangle", envelope="pad", volume=0.2,
|
|
reverb=0.85, reverb_type="taj_mahal",
|
|
chorus=0.3, chorus_rate=0.15, chorus_depth=0.008,
|
|
delay=0.2, delay_time=0.461, delay_feedback=0.3,
|
|
lowpass=3000, pan=0.3, humanize=0.06)
|
|
|
|
# Bars 1-32: silent
|
|
for _ in range(32):
|
|
bansuri.rest(Duration.WHOLE)
|
|
|
|
# Bars 33-40: long held notes — like breathing through bamboo
|
|
bansuri.add(Pa, Duration.WHOLE, velocity=55, bend=0.15)
|
|
bansuri.add(Pa, Duration.WHOLE, velocity=52)
|
|
bansuri.rest(Duration.WHOLE)
|
|
bansuri.add(Ma, Duration.WHOLE, velocity=50, bend=-0.1)
|
|
bansuri.add(Ga, Duration.DOTTED_HALF, velocity=48)
|
|
bansuri.rest(Duration.QUARTER)
|
|
bansuri.rest(Duration.WHOLE)
|
|
bansuri.add(Pa, Duration.WHOLE, velocity=55, bend=0.2)
|
|
bansuri.rest(Duration.WHOLE)
|
|
|
|
# Bars 41-48: a slow melody emerges
|
|
bansuri.add(Sa.add(12), Duration.HALF, velocity=60, bend=-0.15)
|
|
bansuri.add(Ni, Duration.HALF, velocity=55)
|
|
bansuri.add(Dha, Duration.WHOLE, velocity=52, bend=0.1)
|
|
bansuri.rest(Duration.WHOLE)
|
|
bansuri.add(Pa, Duration.HALF, velocity=58, bend=0.15)
|
|
bansuri.add(Dha, Duration.HALF, velocity=55, bend=-0.1)
|
|
bansuri.add(Pa, Duration.WHOLE, velocity=52)
|
|
bansuri.add(Ma, Duration.HALF, velocity=50)
|
|
bansuri.add(Ga, Duration.HALF, velocity=48, bend=0.1)
|
|
bansuri.rest(Duration.WHOLE)
|
|
|
|
# Bars 49-56: singing with sitar — call and response
|
|
bansuri.rest(Duration.WHOLE)
|
|
bansuri.rest(Duration.WHOLE)
|
|
bansuri.add(Ni, Duration.WHOLE, velocity=62, bend=0.2)
|
|
bansuri.add(Dha, Duration.HALF, velocity=58)
|
|
bansuri.add(Pa, Duration.HALF, velocity=55, bend=-0.15)
|
|
bansuri.rest(Duration.WHOLE)
|
|
bansuri.rest(Duration.WHOLE)
|
|
bansuri.add(Ga, Duration.WHOLE, velocity=50, bend=0.1)
|
|
bansuri.add(Sa, Duration.WHOLE, velocity=48, bend=-0.1)
|
|
|
|
# Bars 57-64: holds a quiet drone under the solos
|
|
for _ in range(8):
|
|
bansuri.add(Sa, Duration.WHOLE, velocity=30, bend=0.05)
|
|
|
|
# Bars 65-72: dissolving — one last breath
|
|
bansuri.add(Sa, Duration.WHOLE, velocity=35, bend=0.1)
|
|
bansuri.add(Sa, Duration.WHOLE, velocity=25)
|
|
for _ in range(6):
|
|
bansuri.rest(Duration.WHOLE)
|
|
|
|
# ── THEREMIN — emotional peak, wailing above the sitars ─────────
|
|
theremin = score.part("theremin", instrument="theremin", volume=0.4,
|
|
reverb=0.6, reverb_type="taj_mahal",
|
|
delay=0.3, delay_time=0.461, delay_feedback=0.35,
|
|
pan=0.15, humanize=0.06)
|
|
|
|
# Bars 1-62: silent — waiting for the peak
|
|
for _ in range(62):
|
|
theremin.rest(Duration.WHOLE)
|
|
|
|
# Bars 63-64: entrance — one long note rising from nothing
|
|
theremin.add(Pa, Duration.WHOLE, velocity=70, bend=1.5)
|
|
theremin.add(Sa.add(12), Duration.WHOLE, velocity=85, bend=-0.5)
|
|
|
|
# Bars 65-66: the solo takes flight — soaring above the sitar jhala
|
|
theremin.add(Sa.add(12), Duration.QUARTER, velocity=105, bend=0.5)
|
|
theremin.add(Ni, Duration.EIGHTH, velocity=92)
|
|
theremin.add(Dha, Duration.EIGHTH, velocity=88)
|
|
theremin.add(Pa, Duration.HALF, velocity=95, bend=-0.25)
|
|
theremin.add(Dha, Duration.QUARTER, velocity=100, bend=1.0)
|
|
theremin.add(Sa.add(12), Duration.QUARTER, velocity=112, bend=0.5)
|
|
theremin.add(Re.add(12), Duration.HALF, velocity=118, bend=-0.5)
|
|
theremin.add(Sa.add(12), Duration.HALF, velocity=108)
|
|
|
|
# Bars 67-68: climax — highest point, the cry
|
|
theremin.add(Re.add(12), Duration.QUARTER, velocity=120, bend=2.0)
|
|
theremin.add(Sa.add(12), Duration.QUARTER, velocity=115, bend=1.0)
|
|
theremin.add(Ni, Duration.QUARTER, velocity=110, bend=0.5)
|
|
theremin.add(Sa.add(12), Duration.QUARTER, velocity=125, bend=-1.0)
|
|
# Descending — the release
|
|
theremin.add(Dha, Duration.QUARTER, velocity=105, bend=0.5)
|
|
theremin.add(Pa, Duration.QUARTER, velocity=95)
|
|
theremin.add(Ma, Duration.QUARTER, velocity=85, bend=-0.5)
|
|
theremin.add(Ga, Duration.QUARTER, velocity=75)
|
|
|
|
# Bars 69-72: fading — one last held note dissolving
|
|
theremin.add(Sa, Duration.WHOLE, velocity=65, bend=0.25)
|
|
theremin.add(Sa, Duration.WHOLE, velocity=40, bend=-0.15)
|
|
for _ in range(2):
|
|
theremin.rest(Duration.WHOLE)
|
|
|
|
# ── TABLA — the softest heartbeat ──────────────────────────────
|
|
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 = score.part("tabla", volume=0.4,
|
|
reverb=0.6, reverb_type="cathedral", reverb_decay=2.5, humanize=0.1)
|
|
|
|
# Bars 1-40: silent — no pulse yet
|
|
for _ in range(40):
|
|
tabla.rest(Duration.WHOLE)
|
|
|
|
# Bars 41-48: barely there — slow tintal, all ghost notes
|
|
for bar in range(8):
|
|
if bar % 8 == 7:
|
|
# Gentle fill
|
|
tabla.hit(tDHA, Duration.QUARTER, velocity=85, articulation="accent")
|
|
tabla.hit(GEB, Duration.QUARTER, velocity=95)
|
|
tabla.hit(NA, Duration.EIGHTH, velocity=68)
|
|
tabla.hit(TIT, Duration.EIGHTH, velocity=52)
|
|
tabla.hit(GEB, Duration.QUARTER, velocity=90)
|
|
else:
|
|
tabla.hit(tDHA, Duration.QUARTER, velocity=75)
|
|
tabla.hit(TIT, Duration.EIGHTH, velocity=48)
|
|
tabla.hit(NA, Duration.EIGHTH, velocity=58)
|
|
tabla.hit(tDHA, Duration.QUARTER, velocity=72)
|
|
tabla.hit(TIT, Duration.EIGHTH, velocity=45)
|
|
tabla.hit(NA, Duration.EIGHTH, velocity=55)
|
|
|
|
# Bars 49-56: tabla accompaniment continues under the tabla solo
|
|
for bar in range(8):
|
|
tabla.hit(tDHA, Duration.QUARTER, velocity=65)
|
|
tabla.hit(TIT, Duration.EIGHTH, velocity=40)
|
|
tabla.hit(NA, Duration.EIGHTH, velocity=48)
|
|
tabla.hit(tDHA, Duration.QUARTER, velocity=62)
|
|
tabla.hit(TIT, Duration.EIGHTH, velocity=38)
|
|
tabla.hit(NA, Duration.EIGHTH, velocity=45)
|
|
|
|
# Bars 57-64: stays under the sitar solo, supportive
|
|
for bar in range(8):
|
|
tabla.hit(tDHA, Duration.QUARTER, velocity=70)
|
|
tabla.hit(TIT, Duration.EIGHTH, velocity=42)
|
|
tabla.hit(NA, Duration.EIGHTH, velocity=52)
|
|
tabla.hit(tDHA, Duration.QUARTER, velocity=68)
|
|
tabla.hit(TIT, Duration.EIGHTH, velocity=40)
|
|
tabla.hit(NA, Duration.EIGHTH, velocity=50)
|
|
|
|
# Bars 65-72: one last dha, then silence
|
|
tabla.hit(tDHA, Duration.HALF, velocity=50)
|
|
tabla.rest(Duration.HALF)
|
|
for _ in range(7):
|
|
tabla.rest(Duration.WHOLE)
|
|
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
# TABLA SOLO — Peshkara → Kaida → Tukra → Tihai (bars 49-56)
|
|
# Dry, present, builds from dignified to virtuosic.
|
|
# Overlaps into sitar solo — last 2 bars (57-58) they play together.
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
tabla_solo = score.part("tabla_solo", volume=0.6,
|
|
reverb=0.15, reverb_decay=0.8,
|
|
humanize=0.06)
|
|
|
|
# Bars 1-48: silent
|
|
for _ in range(48):
|
|
tabla_solo.rest(Duration.WHOLE)
|
|
|
|
# ── Bar 49: PESHKARA — theme stated, strong on the beat ─────────
|
|
tabla_solo.hit(tDHA, Duration.QUARTER, velocity=105, articulation="accent")
|
|
tabla_solo.hit(GE, Duration.EIGHTH, velocity=78)
|
|
tabla_solo.hit(NA, Duration.EIGHTH, velocity=72)
|
|
tabla_solo.hit(tDHA, Duration.QUARTER, velocity=98, articulation="accent")
|
|
tabla_solo.hit(NA, Duration.EIGHTH, velocity=70)
|
|
tabla_solo.hit(KE, Duration.EIGHTH, velocity=60)
|
|
|
|
# ── Bar 50: PESHKARA answer — bayan responds ──────────────────
|
|
tabla_solo.hit(tDHA, Duration.QUARTER, velocity=108, articulation="accent")
|
|
tabla_solo.hit(GEB, Duration.EIGHTH, velocity=112)
|
|
tabla_solo.hit(NA, Duration.EIGHTH, velocity=75)
|
|
tabla_solo.hit(GEB, Duration.QUARTER, velocity=115, articulation="accent")
|
|
tabla_solo.hit(NA, Duration.EIGHTH, velocity=70)
|
|
tabla_solo.hit(tDHA, Duration.EIGHTH, velocity=95)
|
|
|
|
# ── Bar 51: KAIDA — developing, 8ths ───────────────────────────
|
|
tabla_solo.hit(tDHA, Duration.EIGHTH, velocity=102, articulation="accent")
|
|
tabla_solo.hit(GE, Duration.EIGHTH, velocity=72)
|
|
tabla_solo.hit(NA, Duration.EIGHTH, velocity=68)
|
|
tabla_solo.hit(tDHA, Duration.EIGHTH, velocity=98)
|
|
tabla_solo.hit(GEB, Duration.EIGHTH, velocity=108, articulation="accent")
|
|
tabla_solo.hit(NA, Duration.EIGHTH, velocity=72)
|
|
tabla_solo.hit(tDHA, Duration.EIGHTH, velocity=95)
|
|
tabla_solo.hit(KE, Duration.EIGHTH, velocity=60)
|
|
|
|
# ── Bar 52: KAIDA variation — more bayan ──────────────────────
|
|
tabla_solo.hit(tDHA, Duration.EIGHTH, velocity=105, articulation="accent")
|
|
tabla_solo.hit(GEB, Duration.EIGHTH, velocity=112)
|
|
tabla_solo.hit(NA, Duration.EIGHTH, velocity=75)
|
|
tabla_solo.hit(tDHA, Duration.EIGHTH, velocity=100)
|
|
tabla_solo.hit(GEB, Duration.QUARTER, velocity=118, articulation="accent")
|
|
tabla_solo.hit(tDHA, Duration.EIGHTH, velocity=95)
|
|
tabla_solo.hit(NA, Duration.EIGHTH, velocity=70)
|
|
|
|
# ── Bar 53: TUKRA — 16ths into 32nd note cascade ───────────────
|
|
tabla_solo.hit(tDHA, Duration.SIXTEENTH, velocity=110, articulation="accent")
|
|
tabla_solo.hit(TIT, Duration.SIXTEENTH, velocity=50)
|
|
tabla_solo.hit(NA, Duration.SIXTEENTH, velocity=78)
|
|
tabla_solo.hit(TIT, Duration.SIXTEENTH, velocity=48)
|
|
tabla_solo.hit(tDHA, Duration.SIXTEENTH, velocity=108, articulation="accent")
|
|
tabla_solo.hit(GEB, Duration.SIXTEENTH, velocity=105)
|
|
tabla_solo.hit(NA, Duration.SIXTEENTH, velocity=75)
|
|
tabla_solo.hit(TIT, Duration.SIXTEENTH, velocity=48)
|
|
# 32nd note burst — hands flying
|
|
tabla_solo.hit(tDHA, 0.125, velocity=115, articulation="accent")
|
|
tabla_solo.hit(TIT, 0.125, velocity=55)
|
|
tabla_solo.hit(NA, 0.125, velocity=82)
|
|
tabla_solo.hit(TIT, 0.125, velocity=52)
|
|
tabla_solo.hit(GEB, 0.125, velocity=118)
|
|
tabla_solo.hit(NA, 0.125, velocity=78)
|
|
tabla_solo.hit(tDHA, 0.125, velocity=120, articulation="accent")
|
|
tabla_solo.hit(GEB, 0.125, velocity=115)
|
|
|
|
# ── Bar 54: TUKRA — full 32nd note shred ──────────────────────
|
|
# First half: 32nd note roll building
|
|
tabla_solo.hit(tDHA, 0.125, velocity=112, articulation="accent")
|
|
tabla_solo.hit(TIT, 0.125, velocity=55)
|
|
tabla_solo.hit(NA, 0.125, velocity=80)
|
|
tabla_solo.hit(TIT, 0.125, velocity=52)
|
|
tabla_solo.hit(tDHA, 0.125, velocity=118, articulation="accent")
|
|
tabla_solo.hit(GEB, 0.125, velocity=115)
|
|
tabla_solo.hit(NA, 0.125, velocity=82)
|
|
tabla_solo.hit(TIT, 0.125, velocity=55)
|
|
tabla_solo.hit(GEB, 0.125, velocity=120, articulation="accent")
|
|
tabla_solo.hit(tDHA, 0.125, velocity=122)
|
|
tabla_solo.hit(NA, 0.125, velocity=85)
|
|
tabla_solo.hit(GEB, 0.125, velocity=125)
|
|
tabla_solo.hit(tDHA, 0.125, velocity=125, articulation="accent")
|
|
tabla_solo.hit(GEB, 0.125, velocity=127)
|
|
tabla_solo.hit(tDHA, 0.125, velocity=127, articulation="accent")
|
|
tabla_solo.hit(GEB, 0.125, velocity=127)
|
|
|
|
# ── Bar 55: TIHAI — three-fold cadence on the beat ──────────────
|
|
# 1st
|
|
tabla_solo.hit(tDHA, Duration.EIGHTH, velocity=105, articulation="accent")
|
|
tabla_solo.hit(NA, Duration.SIXTEENTH, velocity=78)
|
|
tabla_solo.hit(GEB, Duration.SIXTEENTH, velocity=108)
|
|
tabla_solo.rest(Duration.EIGHTH)
|
|
# 2nd
|
|
tabla_solo.hit(tDHA, Duration.EIGHTH, velocity=115, articulation="accent")
|
|
tabla_solo.hit(NA, Duration.SIXTEENTH, velocity=82)
|
|
tabla_solo.hit(GEB, Duration.SIXTEENTH, velocity=115)
|
|
tabla_solo.rest(Duration.EIGHTH)
|
|
# 3rd — strongest
|
|
tabla_solo.hit(tDHA, Duration.EIGHTH, velocity=125, articulation="accent")
|
|
tabla_solo.hit(NA, Duration.SIXTEENTH, velocity=90)
|
|
tabla_solo.hit(GEB, Duration.SIXTEENTH, velocity=122)
|
|
|
|
# ── Bar 56: SAM + handoff ───────────────────────────────────────
|
|
tabla_solo.hit(tDHA, Duration.WHOLE, velocity=120, articulation="fermata")
|
|
|
|
# Bars 57-58: tabla solo continues under sitar — supportive fills
|
|
tabla_solo.set(volume=0.35)
|
|
tabla_solo.hit(tDHA, Duration.QUARTER, velocity=80, articulation="accent")
|
|
tabla_solo.hit(GE, Duration.EIGHTH, velocity=55)
|
|
tabla_solo.hit(NA, Duration.EIGHTH, velocity=62)
|
|
tabla_solo.hit(GEB, Duration.QUARTER, velocity=85)
|
|
tabla_solo.hit(NA, Duration.EIGHTH, velocity=58)
|
|
tabla_solo.hit(TIT, Duration.EIGHTH, velocity=42)
|
|
tabla_solo.hit(tDHA, Duration.QUARTER, velocity=75)
|
|
tabla_solo.hit(GEB, Duration.EIGHTH, velocity=80)
|
|
tabla_solo.hit(NA, Duration.EIGHTH, velocity=55)
|
|
tabla_solo.hit(tDHA, Duration.QUARTER, velocity=70)
|
|
tabla_solo.hit(TIT, Duration.EIGHTH, velocity=40)
|
|
tabla_solo.hit(NA, Duration.EIGHTH, velocity=48)
|
|
|
|
# Bars 59-72: silent — sitar owns the space
|
|
for _ in range(14):
|
|
tabla_solo.rest(Duration.WHOLE)
|
|
|
|
# ── TINGSHA — crystalline accents, very sparse ──────────────────
|
|
tingsha = score.part("tingsha", instrument="tingsha", volume=0.15,
|
|
reverb=0.5, reverb_decay=2.5)
|
|
|
|
# One strike every ~8 bars, offset from bowl
|
|
for _ in range(4):
|
|
tingsha.rest(Duration.WHOLE)
|
|
tingsha.add(Sa.add(12), Duration.WHOLE, velocity=50)
|
|
for _ in range(7):
|
|
tingsha.rest(Duration.WHOLE)
|
|
tingsha.add(Pa.add(12), Duration.WHOLE, velocity=45)
|
|
for _ in range(7):
|
|
tingsha.rest(Duration.WHOLE)
|
|
tingsha.add(Sa.add(12), Duration.WHOLE, velocity=42)
|
|
for _ in range(7):
|
|
tingsha.rest(Duration.WHOLE)
|
|
tingsha.add(Ma.add(12), Duration.WHOLE, velocity=38)
|
|
for _ in range(7):
|
|
tingsha.rest(Duration.WHOLE)
|
|
tingsha.add(Sa.add(12), Duration.WHOLE, velocity=35)
|
|
for _ in range(7):
|
|
tingsha.rest(Duration.WHOLE)
|
|
tingsha.add(Sa.add(12), Duration.WHOLE, velocity=28)
|
|
for _ in range(7):
|
|
tingsha.rest(Duration.WHOLE)
|
|
# Rest out through solos and ending
|
|
for _ in range(20):
|
|
tingsha.rest(Duration.WHOLE)
|
|
|
|
# ── KICK — the temple's heartbeat ───────────────────────────────
|
|
K = DrumSound.KICK
|
|
kick = score.part("kick", volume=0.55, humanize=0.03)
|
|
|
|
# Bars 1-48: silent
|
|
for _ in range(48):
|
|
kick.rest(Duration.WHOLE)
|
|
|
|
# Bars 49-56: enters with tabla solo — slow pulse, beat 1 only
|
|
for _ in range(8):
|
|
kick.hit(K, Duration.QUARTER, velocity=100)
|
|
kick.rest(Duration.DOTTED_HALF)
|
|
|
|
# Bars 57-64: sitar gat/jhala — four on the floor, building
|
|
for bar in range(8):
|
|
vel = min(120, 100 + bar * 3)
|
|
for beat in range(4):
|
|
kick.hit(K, Duration.QUARTER, velocity=vel)
|
|
|
|
# Bars 65-68: peak — full power
|
|
for _ in range(4):
|
|
for beat in range(4):
|
|
kick.hit(K, Duration.QUARTER, velocity=120)
|
|
|
|
# Bars 69-72: fading out with everything
|
|
for bar in range(4):
|
|
vel = max(25, 110 - bar * 25)
|
|
for beat in range(4):
|
|
kick.hit(K, Duration.QUARTER, velocity=vel)
|
|
|
|
# ── SUB DRONE — deep sine, barely audible grounding ────────────
|
|
sub = score.part("sub", synth="sine", envelope="pad", volume=0.15,
|
|
lowpass=80, saturation=0.1)
|
|
|
|
# Bars 1-8: silent
|
|
for _ in range(8):
|
|
sub.rest(Duration.WHOLE)
|
|
|
|
# Bars 9-64: deep Sa drone — felt more than heard
|
|
for _ in range(56):
|
|
sub.add(Sa.add(-36), Duration.WHOLE, velocity=55)
|
|
|
|
# Bars 65-72: fade
|
|
for vel in [45, 35, 25, 18, 12, 8, 4, 0]:
|
|
if vel > 0:
|
|
sub.add(Sa.add(-36), Duration.WHOLE, velocity=vel)
|
|
else:
|
|
sub.rest(Duration.WHOLE)
|
|
|
|
# ═════════════════════════════════════════════════════════════════
|
|
import sys
|
|
|
|
print(f"Key: {key}")
|
|
print(f"Temperament: shruti / just intonation / A=432 Hz")
|
|
print(f"Parts: {list(score.parts.keys())}")
|
|
print(f"Duration: {score.duration_ms / 1000:.1f}s | {score.measures} measures")
|
|
|
|
if "--live" in sys.argv:
|
|
print("Playing THE TEMPLE (live engine)...")
|
|
from pytheory_live.live import LiveEngine
|
|
engine = LiveEngine(buffer_size=1024)
|
|
engine.play_score(score)
|
|
else:
|
|
print("Playing THE TEMPLE...")
|
|
play_score(score)
|