mirror of
https://github.com/kennethreitz/pytheory.git
synced 2026-06-05 23:00:20 +00:00
v0.27.0: High-quality drum sounds, Dance Party song
All 15 drum sounds rewritten with inharmonic partials, proper transients, multi-mode resonance, and saturation. Song #19: Dance Party at the Reitz House — for Sarah and Malachi. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,11 @@
|
||||
|
||||
All notable changes to PyTheory are documented here.
|
||||
|
||||
## 0.27.0
|
||||
|
||||
- Rewrite all 15 drum sounds for higher quality (inharmonic partials, proper transients, multi-mode resonance, saturation)
|
||||
- 19 example songs including Dance Party at the Reitz House
|
||||
|
||||
## 0.26.3
|
||||
|
||||
- Stereo drum panning — each sound placed in the stereo field (hat right, crash left, toms spread, kick/snare center)
|
||||
|
||||
+63
-1
@@ -925,6 +925,67 @@ def glass_and_silk():
|
||||
play_song(score)
|
||||
|
||||
|
||||
def dance_party():
|
||||
"""Dance party — bouncy, joyful, impossible not to move."""
|
||||
print(" Dance Party at the Reitz House")
|
||||
print(" disco 128bpm | FM sparkle | square chiptune arps | supersaw pump")
|
||||
|
||||
from pytheory.rhythm import _Hit, DrumSound
|
||||
|
||||
score = Score("4/4", bpm=128)
|
||||
score.drums("disco", repeats=8, fill="buildup", fill_every=8)
|
||||
|
||||
for bar in range(8):
|
||||
for beat in range(4):
|
||||
score._drum_hits.append(_Hit(DrumSound.KICK, bar * 4.0 + beat, 120))
|
||||
score._drum_pattern_beats = max(score._drum_pattern_beats, 32.0)
|
||||
|
||||
bass = score.part("bass", synth="square", envelope="pluck",
|
||||
volume=0.45, lowpass=500, lowpass_q=1.3,
|
||||
sidechain=0.75, sidechain_release=0.12)
|
||||
sparkle = score.part("sparkle", synth="fm", envelope="bell",
|
||||
volume=0.3, pan=0.4, reverb=0.3, reverb_decay=1.5,
|
||||
delay=0.2, delay_time=0.234, delay_feedback=0.3)
|
||||
chords_part = score.part("chords", synth="supersaw", envelope="pad",
|
||||
volume=0.2, detune=12, spread=0.7,
|
||||
reverb=0.4, reverb_type="plate", sidechain=0.7)
|
||||
fun = score.part("fun", synth="square", envelope="staccato",
|
||||
volume=0.2, pan=-0.5, delay=0.15, delay_time=0.117,
|
||||
delay_feedback=0.25, reverb=0.2)
|
||||
|
||||
for sym in ["C", "Am", "F", "G"] * 2:
|
||||
chords_part.add(Chord.from_symbol(sym), Duration.WHOLE)
|
||||
|
||||
for n in ["C2", "C2", "C3", "C2", "A1", "A1", "A2", "A1",
|
||||
"F1", "F1", "F2", "F1", "G1", "G1", "G2", "G1"] * 2:
|
||||
bass.add(n, Duration.QUARTER)
|
||||
|
||||
for n, v, d in [
|
||||
("E5", 100, 0.5), ("G5", 110, 0.5), ("C6", 120, 1), (None, 0, 0.5),
|
||||
("B5", 100, 0.5), ("G5", 90, 0.5), ("E5", 100, 0.5),
|
||||
("C5", 90, 0.5), ("E5", 100, 0.5), ("G5", 110, 1), (None, 0, 0.5),
|
||||
("A5", 100, 0.5),
|
||||
("C6", 120, 0.5), ("A5", 100, 0.5), ("F5", 90, 0.5), ("A5", 100, 0.5),
|
||||
("C6", 110, 1), (None, 0, 1),
|
||||
("B5", 100, 0.5), ("D6", 120, 0.5), ("B5", 100, 0.5), ("G5", 90, 0.5),
|
||||
("D5", 80, 0.5), ("G5", 100, 1), (None, 0, 0.5),
|
||||
("E5", 100, 0.5), ("G5", 110, 0.5), ("C6", 120, 1),
|
||||
("E6", 125, 1), (None, 0, 0.5),
|
||||
("D6", 110, 0.5), ("C6", 100, 0.5), ("B5", 90, 0.5),
|
||||
("A5", 100, 0.5), ("G5", 110, 0.5), ("E5", 90, 1), (None, 0, 0.5),
|
||||
("F5", 100, 0.5), ("A5", 110, 0.5), ("C6", 120, 1), (None, 0, 0.5),
|
||||
("B5", 100, 0.5), ("G5", 110, 0.5), ("D6", 120, 0.5),
|
||||
("C6", 110, 1), ("G5", 90, 0.5), ("C6", 120, 1), (None, 0, 0.5),
|
||||
]:
|
||||
sparkle.rest(d) if n is None else sparkle.add(n, d, velocity=v)
|
||||
|
||||
for sym in ["C", "Am", "F", "G", "C", "Am", "F", "G"]:
|
||||
pat = "up" if sym in ("C", "F") else "updown"
|
||||
fun.arpeggio(sym, bars=1, pattern=pat, octaves=2, division=Duration.EIGHTH)
|
||||
|
||||
play_song(score)
|
||||
|
||||
|
||||
SONGS = {
|
||||
"1": ("Bossa Nova in A minor", bossa_nova_girl),
|
||||
"2": ("Bebop in Bb major", bebop_in_bb),
|
||||
@@ -944,6 +1005,7 @@ SONGS = {
|
||||
"16": ("Late Night Texts (Drake-style)", drake_vibes),
|
||||
"17": ("Neon Grid (Stereo Acid)", neon_grid),
|
||||
"18": ("Glass and Silk (Sine+Triangle)", glass_and_silk),
|
||||
"19": ("Dance Party at the Reitz House", dance_party),
|
||||
}
|
||||
|
||||
if __name__ == "__main__":
|
||||
@@ -957,7 +1019,7 @@ if __name__ == "__main__":
|
||||
print(f" {key:>2}. {name}")
|
||||
|
||||
print()
|
||||
choice = input(" Pick a song (1-18, or 'all'): ").strip()
|
||||
choice = input(" Pick a song (1-19, or 'all'): ").strip()
|
||||
print()
|
||||
|
||||
if choice == "all":
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "pytheory"
|
||||
version = "0.26.3"
|
||||
version = "0.27.0"
|
||||
description = "Music Theory for Humans"
|
||||
readme = "README.md"
|
||||
license = "MIT"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
"""PyTheory: Music Theory for Humans."""
|
||||
|
||||
__version__ = "0.26.3"
|
||||
__version__ = "0.27.0"
|
||||
|
||||
from .tones import Tone, Interval
|
||||
from .systems import System, SYSTEMS
|
||||
|
||||
Reference in New Issue
Block a user