From f9af708f0ace2fae1768122558abf6dca4ed396c Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Wed, 25 Mar 2026 22:32:50 -0400 Subject: [PATCH] =?UTF-8?q?Add=20Glass=20and=20Silk=20(sine+triangle=20wal?= =?UTF-8?q?tz)=20to=20song=20player=20=E2=80=94=20#18?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pure sine and triangle only. Ab major waltz at 72bpm. Cathedral and Taj Mahal reverb. Triangle legato melody with glide. Co-Authored-By: Claude Opus 4.6 (1M context) --- examples/song.py | 69 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/examples/song.py b/examples/song.py index 83bfdc5..adc3393 100644 --- a/examples/song.py +++ b/examples/song.py @@ -859,6 +859,72 @@ def neon_grid(): play_song(score) +def glass_and_silk(): + """Pure sine and triangle — smooth shapes in a stereo cathedral.""" + print(" Glass and Silk in Ab major") + print(" sine + triangle only | waltz 72bpm | cathedral + Taj Mahal reverb") + + score = Score("3/4", bpm=72, swing=0.2) + score.drums("waltz", repeats=16) + + sub = score.part("sub", synth="sine", envelope="pad", + volume=0.3, pan=0.0, lowpass=120) + voice = score.part("voice", synth="triangle", envelope="strings", + volume=0.45, pan=0.2, legato=True, glide=0.07, + reverb=0.5, reverb_type="cathedral", + delay=0.2, delay_time=0.56, delay_feedback=0.4, + humanize=0.3) + pad = score.part("pad", synth="sine", envelope="pad", + volume=0.2, pan=0.0, detune=10, spread=0.6, + reverb=0.6, reverb_type="taj_mahal", + chorus=0.2, chorus_rate=0.3) + counter = score.part("counter", synth="triangle", envelope="strings", + volume=0.2, pan=-0.5, + reverb=0.4, reverb_type="plate", + delay=0.15, delay_time=0.83, delay_feedback=0.35, + humanize=0.25) + + chords = [Chord.from_symbol(s) for s in ["Ab", "Fm", "Db", "Eb"]] + for c in chords * 2: + for _ in range(3): + pad.add(c, Duration.DOTTED_HALF) + + for n in (["Ab2"] * 9 + ["F2"] * 9 + ["Db2"] * 9 + ["Eb2"] * 9) * 2: + sub.add(n, Duration.QUARTER) + + for n, v, d in [ + ("Ab4", 60, 3), ("C5", 70, 1.5), ("Eb5", 75, 1.5), + ("Ab5", 85, 4.5), (None, 0, 1.5), + ("F5", 75, 1.5), ("Ab5", 80, 1.5), ("C6", 90, 3), + ("Bb5", 80, 1.5), ("Ab5", 70, 1.5), (None, 0, 3), + ("Db5", 70, 1.5), ("Eb5", 80, 1.5), ("Ab5", 95, 3), + ("Bb5", 100, 3), ("C6", 105, 4.5), (None, 0, 1.5), + ("Bb5", 85, 1.5), ("Ab5", 75, 1.5), ("Eb5", 70, 3), + ("C5", 60, 3), ("Ab4", 55, 6), (None, 0, 3), + ("Eb5", 65, 3), ("Ab5", 80, 3), ("C6", 90, 4.5), (None, 0, 1.5), + ("Bb5", 85, 1.5), ("Ab5", 75, 1.5), ("F5", 70, 3), + ("Eb5", 65, 1.5), ("Db5", 60, 1.5), (None, 0, 3), + ("Eb5", 70, 1.5), ("F5", 80, 1.5), ("Ab5", 90, 3), + ("Bb5", 95, 3), ("Ab5", 85, 3), + ("Eb5", 70, 3), ("Ab4", 55, 9), + ]: + voice.rest(d) if n is None else voice.add(n, d, velocity=v) + + for _ in range(24): + counter.rest(Duration.QUARTER) + for n, v, d in [ + (None, 0, 3), ("C6", 55, 3), ("Eb6", 60, 4.5), (None, 0, 1.5), + ("Db6", 50, 3), ("C6", 45, 3), (None, 0, 6), + ("Eb6", 55, 4.5), ("Db6", 50, 1.5), ("C6", 45, 3), + ("Ab5", 40, 6), (None, 0, 3), + ("Bb5", 50, 3), ("C6", 55, 4.5), (None, 0, 1.5), + ("Ab5", 45, 9), + ]: + counter.rest(d) if n is None else counter.add(n, d, velocity=v) + + play_song(score) + + SONGS = { "1": ("Bossa Nova in A minor", bossa_nova_girl), "2": ("Bebop in Bb major", bebop_in_bb), @@ -877,6 +943,7 @@ SONGS = { "15": ("Liquid DnB in A minor", drum_and_bass), "16": ("Late Night Texts (Drake-style)", drake_vibes), "17": ("Neon Grid (Stereo Acid)", neon_grid), + "18": ("Glass and Silk (Sine+Triangle)", glass_and_silk), } if __name__ == "__main__": @@ -890,7 +957,7 @@ if __name__ == "__main__": print(f" {key:>2}. {name}") print() - choice = input(" Pick a song (1-17, or 'all'): ").strip() + choice = input(" Pick a song (1-18, or 'all'): ").strip() print() if choice == "all":