mirror of
https://github.com/kennethreitz/interpretations.git
synced 2026-06-05 23:00:19 +00:00
2b01b93587
- Didgeridoo opens the track (vol 0.08, fades over 24 bars) - Theremin enters bar 21 with slow bending melody — the emotional core - Vocal synth "ohhh" at low octave (B1, F#1 range) from bar 16 - Harmonium pulled back 0.1 → 0.06 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
238 lines
9.3 KiB
Python
238 lines
9.3 KiB
Python
"""
|
|
DEEP TIME — ambient drone. No rhythm, no melody, just texture and space.
|
|
Like listening to the earth breathe through a cathedral.
|
|
"""
|
|
|
|
from pytheory import Key, Duration, Score, Tone, play_score
|
|
|
|
key = Key("B", "minor")
|
|
s = key.scale
|
|
|
|
B = s[0]; Cs = s[1]; D = s[2]; E = s[3]
|
|
Fs = s[4]; G = s[5]; A = s[6]
|
|
|
|
score = Score("4/4", bpm=40, temperament="just")
|
|
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
# No structure. Just layers appearing and dissolving.
|
|
# 48 bars at 40 BPM = ~7.5 minutes
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
|
|
# ── DIDGERIDOO — primal opening, first voice heard ──────────────
|
|
didge = score.part("didge", instrument="didgeridoo", volume=0.08,
|
|
chorus=0.2, chorus_rate=0.05, chorus_depth=0.01,
|
|
lowpass=300)
|
|
|
|
for _ in range(16):
|
|
didge.add(B.add(-24), Duration.WHOLE, velocity=65)
|
|
# Fade out as other layers build
|
|
for vel in [55, 45, 35, 25, 18, 12, 8, 5]:
|
|
didge.add(B.add(-24), Duration.WHOLE, velocity=vel)
|
|
for _ in range(24):
|
|
didge.rest(Duration.WHOLE)
|
|
|
|
# ── DRONE 1 — deep sine, the foundation of the earth ───────────
|
|
earth = score.part("earth", synth="sine", envelope="pad", volume=0.25,
|
|
reverb=0.9, reverb_type="taj_mahal",
|
|
chorus=0.3, chorus_rate=0.03, chorus_depth=0.015,
|
|
lowpass=400)
|
|
|
|
for _ in range(48):
|
|
earth.add(B.add(-36), Duration.WHOLE, velocity=60)
|
|
|
|
# ── DRONE 2 — fifth above, slow beating ────────────────────────
|
|
fifth = score.part("fifth", synth="sine", envelope="pad", volume=0.18,
|
|
reverb=0.9, reverb_type="taj_mahal",
|
|
chorus=0.4, chorus_rate=0.02, chorus_depth=0.02,
|
|
lowpass=500, pan=0.3)
|
|
|
|
for _ in range(4):
|
|
fifth.rest(Duration.WHOLE)
|
|
for _ in range(44):
|
|
fifth.add(Fs.add(-24), Duration.WHOLE, velocity=50)
|
|
|
|
# ── DRONE 3 — octave, barely there ─────────────────────────────
|
|
octave = score.part("octave", synth="sine", envelope="pad", volume=0.12,
|
|
reverb=0.9, reverb_type="taj_mahal",
|
|
chorus=0.5, chorus_rate=0.015, chorus_depth=0.025,
|
|
lowpass=600, pan=-0.3)
|
|
|
|
for _ in range(8):
|
|
octave.rest(Duration.WHOLE)
|
|
for _ in range(40):
|
|
octave.add(B.add(-24), Duration.WHOLE, velocity=45)
|
|
|
|
# ── HARMONIUM — breathing chords, glacial ──────────────────────
|
|
harmonium = score.part("harmonium", instrument="harmonium", volume=0.06,
|
|
reverb=0.8, reverb_type="taj_mahal",
|
|
chorus=0.3, chorus_rate=0.1, chorus_depth=0.01)
|
|
|
|
for _ in range(12):
|
|
harmonium.rest(Duration.WHOLE)
|
|
|
|
# One chord every 4 bars — like breathing
|
|
chords = [
|
|
key.progression("i")[0],
|
|
key.progression("iv")[0],
|
|
key.progression("i")[0],
|
|
key.progression("v")[0],
|
|
key.progression("i")[0],
|
|
key.progression("VI")[0],
|
|
key.progression("iv")[0],
|
|
key.progression("i")[0],
|
|
key.progression("i")[0],
|
|
]
|
|
for chord in chords:
|
|
harmonium.add(chord, Duration.WHOLE, velocity=45)
|
|
harmonium.rest(Duration.WHOLE)
|
|
harmonium.rest(Duration.WHOLE)
|
|
harmonium.rest(Duration.WHOLE)
|
|
|
|
# ── SINGING BOWL — one strike, ages apart ──────────────────────
|
|
bowl = score.part("bowl", instrument="singing_bowl", volume=0.25,
|
|
reverb=0.95, reverb_type="taj_mahal")
|
|
|
|
# Strike once every 8 bars
|
|
for i in range(6):
|
|
bowl.add(B.add(-12), Duration.WHOLE, velocity=max(35, 70 - i * 5))
|
|
for _ in range(7):
|
|
bowl.rest(Duration.WHOLE)
|
|
|
|
# ── HIGH TEXTURE — triangle shimmer, almost subliminal ─────────
|
|
shimmer = score.part("shimmer", synth="triangle", envelope="pad", volume=0.06,
|
|
reverb=0.9, reverb_type="taj_mahal",
|
|
chorus=0.6, chorus_rate=0.05, chorus_depth=0.03,
|
|
lowpass=2000, pan=-0.4)
|
|
shimmer.lfo("lowpass", rate=0.01, min=800, max=3000, bars=48, shape="sine")
|
|
|
|
for _ in range(16):
|
|
shimmer.rest(Duration.WHOLE)
|
|
|
|
# Slowly evolving — holds for 4 bars at a time
|
|
shimmer_notes = [Fs, D, E, Fs, B, A, Fs, D]
|
|
for note in shimmer_notes:
|
|
for _ in range(4):
|
|
shimmer.add(note.add(12), Duration.WHOLE, velocity=35)
|
|
|
|
# ── VOCAL — low "ohhh", enters bar 16 ──────────────────────────
|
|
vocal = score.part("vocal", instrument="vocal", volume=0.12,
|
|
reverb=0.85, reverb_type="taj_mahal",
|
|
chorus=0.3, chorus_rate=0.06, chorus_depth=0.012)
|
|
|
|
for _ in range(16):
|
|
vocal.rest(Duration.WHOLE)
|
|
|
|
# Low sustained notes — like a monk humming
|
|
vocal_notes = [B.add(-24), Fs.add(-24), D.add(-12), B.add(-24),
|
|
Fs.add(-24), E.add(-12), D.add(-12), B.add(-24)]
|
|
for note in vocal_notes:
|
|
vocal.add(note, Duration.WHOLE, velocity=40)
|
|
vocal.add(note, Duration.WHOLE, velocity=38)
|
|
vocal.rest(Duration.WHOLE)
|
|
vocal.rest(Duration.WHOLE)
|
|
|
|
# ── CHOIR — voices from nowhere, enters bar 20 ─────────────────
|
|
choir = score.part("choir", instrument="choir", volume=0.1,
|
|
reverb=0.9, reverb_type="taj_mahal",
|
|
chorus=0.4, chorus_rate=0.08, chorus_depth=0.015)
|
|
|
|
for _ in range(20):
|
|
choir.rest(Duration.WHOLE)
|
|
|
|
# Held chords, glacial — one every 4 bars
|
|
choir_notes = [
|
|
(B.add(-12), Fs),
|
|
(D, A),
|
|
(E, B),
|
|
(Fs, Cs.add(12)),
|
|
(D, A),
|
|
(B.add(-12), Fs),
|
|
(B.add(-12), Fs),
|
|
]
|
|
for low, high in choir_notes:
|
|
choir.hold(low, Duration.WHOLE * 4, velocity=40)
|
|
choir.add(high, Duration.WHOLE, velocity=35)
|
|
choir.rest(Duration.WHOLE)
|
|
choir.rest(Duration.WHOLE)
|
|
choir.rest(Duration.WHOLE)
|
|
|
|
# ── NOISE WASH — the wind ──────────────────────────────────────
|
|
wind = score.part("wind", synth="noise", envelope="pad", volume=0.03,
|
|
reverb=0.8, reverb_type="taj_mahal",
|
|
lowpass=500)
|
|
wind.lfo("lowpass", rate=0.008, min=200, max=1500, bars=48, shape="sine")
|
|
wind.lfo("volume", rate=0.015, min=0.01, max=0.05, bars=48, shape="triangle")
|
|
|
|
for _ in range(48):
|
|
wind.add(B, Duration.WHOLE, velocity=30)
|
|
|
|
# ── THEREMIN — emotional break, center of the piece ─────────────
|
|
theremin = score.part("theremin", instrument="theremin", volume=0.15,
|
|
reverb=0.8, reverb_type="taj_mahal",
|
|
delay=0.2, delay_time=0.75, delay_feedback=0.3,
|
|
humanize=0.06)
|
|
|
|
for _ in range(20):
|
|
theremin.rest(Duration.WHOLE)
|
|
|
|
# Bars 21-32: slow, aching melody — the emotional core
|
|
theremin.add(Fs, Duration.WHOLE, velocity=45, bend=0.5)
|
|
theremin.add(Fs, Duration.WHOLE, velocity=48)
|
|
theremin.rest(Duration.WHOLE)
|
|
theremin.rest(Duration.WHOLE)
|
|
theremin.add(B, Duration.WHOLE, velocity=52, bend=-0.25)
|
|
theremin.add(A, Duration.WHOLE, velocity=50)
|
|
theremin.add(Fs, Duration.WHOLE, velocity=48, bend=0.5)
|
|
theremin.rest(Duration.WHOLE)
|
|
theremin.add(D.add(12), Duration.WHOLE, velocity=55, bend=-0.5)
|
|
theremin.add(Cs.add(12), Duration.WHOLE, velocity=50)
|
|
theremin.add(B, Duration.WHOLE, velocity=45, bend=0.25)
|
|
theremin.add(Fs, Duration.WHOLE, velocity=40)
|
|
|
|
# Bars 33-48: silent — let it dissolve
|
|
for _ in range(16):
|
|
theremin.rest(Duration.WHOLE)
|
|
|
|
# ── CELLO — one long note, enters late, the human voice ────────
|
|
cello = score.part("cello", instrument="cello", volume=0.15,
|
|
reverb=0.7, reverb_type="taj_mahal",
|
|
humanize=0.05)
|
|
|
|
for _ in range(32):
|
|
cello.rest(Duration.WHOLE)
|
|
|
|
# Bars 33-44: one held note that slowly rises
|
|
cello.add(B.add(-12), Duration.WHOLE, velocity=40)
|
|
cello.add(B.add(-12), Duration.WHOLE, velocity=45)
|
|
cello.add(B.add(-12), Duration.WHOLE, velocity=50)
|
|
cello.add(B.add(-12), Duration.WHOLE, velocity=55)
|
|
cello.add(Cs, Duration.WHOLE, velocity=50)
|
|
cello.add(Cs, Duration.WHOLE, velocity=48)
|
|
cello.add(D, Duration.WHOLE, velocity=52)
|
|
cello.add(D, Duration.WHOLE, velocity=50)
|
|
cello.add(Cs, Duration.WHOLE, velocity=45)
|
|
cello.add(B.add(-12), Duration.WHOLE, velocity=42)
|
|
cello.add(B.add(-12), Duration.WHOLE, velocity=38)
|
|
cello.add(B.add(-12), Duration.WHOLE, velocity=30)
|
|
|
|
# Bars 45-48: silence — dissolve
|
|
for _ in range(4):
|
|
cello.rest(Duration.WHOLE)
|
|
|
|
# ═════════════════════════════════════════════════════════════════
|
|
import sys
|
|
|
|
print(f"Key: {key}")
|
|
print(f"BPM: 40 (just intonation)")
|
|
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 DEEP TIME (live engine)...")
|
|
from pytheory_live.live import LiveEngine
|
|
engine = LiveEngine(buffer_size=1024)
|
|
engine.play_score(score)
|
|
else:
|
|
print("Playing DEEP TIME...")
|
|
play_score(score)
|