From 9800ce7156a9e999ab7a5420de752b34c00a2b3b Mon Sep 17 00:00:00 2001 From: Richard Zink Date: Sun, 8 Nov 2026 00:12:08 +0100 Subject: [PATCH] Holiday music: a dark carol for Christmas, a spring tune for Easter, a harpsichord dance for Halloween During a holiday the title music plays its piece, the build music every fourth time. Co-Authored-By: Claude Opus 5.5 --- assets/music/holiday_christmas.xm | Bin 0 -> 86404 bytes assets/music/holiday_easter.xm | Bin 0 -> 94085 bytes assets/music/holiday_halloween.xm | Bin 0 -> 64114 bytes src/audio.rs | 67 ++++++++- src/main.rs | 13 +- src/tracks.rs | 5 +- src/xm.rs | 3 +- tools/compose_music.py | 239 +++++++++++++++++++++++++++++- 8 files changed, 319 insertions(+), 8 deletions(-) create mode 100644 assets/music/holiday_christmas.xm create mode 100644 assets/music/holiday_easter.xm create mode 100644 assets/music/holiday_halloween.xm diff --git a/assets/music/holiday_christmas.xm b/assets/music/holiday_christmas.xm new file mode 100644 index 0000000000000000000000000000000000000000..93d28c814ddf04c7df1f9c85cc9845d01853081d GIT binary patch literal 86404 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�mc zEnUGtaBy$r5OwSL0zJicO;IcD9w4 zwJT5WbJNx9=?<%FojTWKRfTPZP%7T%rq@>b7MMEOD*~b7t?{%_N`v>^Cc9Ljs=%tW zNgLh;m;fC0HtcFIjagw=HN*i8vL1y>^Xj4UfzFnFSFuQJilSy;O;Ty_lp<9#x?6xKSOJ*yc;S{oY;0l|3Y1e<&qsy>bWB$}7w1+vi`O@x+XMyY9YbXt+ z;HxMbEEQi#)DAzjLTQL|+!WxY!4B!APzz2=g=j)8;Bs+=O}@IFYVlmz1wQ&kskLe#Dg{99wTox&y5>N}aUWyq z&s~^d+q|->T|Apz3zKf^ifwl06Ve5MO?%h*Qm|pnTQ%c{0KHii~T1$D8~0hEkkrGAl?pZKU86LC zW;`!~t1T_czR(4&J)jMR{g79<1!WOi3$~a{pbeUeuvVIr4WCs*hj-Ot2dQ6+eqCEZ OjHWo(>Fms?_WuDX1jwZT literal 0 HcmV?d00001 diff --git a/assets/music/holiday_easter.xm b/assets/music/holiday_easter.xm new file mode 100644 index 0000000000000000000000000000000000000000..343dd5387f0fa9bedf531fd9a78f79e7983f4085 GIT binary patch literal 94085 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 x=osuZqmTU^+sRCydVT%>+xpuJNx21A#` Vec { // the calm tracks the music player offers (no battle, victory or defeat music) pub fn player_tracks() -> Vec { use Category as C; - TRACKS.iter().enumerate().filter(|(_, t)| matches!(t.1, C::Title | C::Build | C::Surface | C::Torture | C::Temple)).map(|(i, _)| i).collect() + TRACKS.iter().enumerate().filter(|(_, t)| matches!(t.1, C::Title | C::Build | C::Surface | C::Torture | C::Temple | C::Christmas | C::Easter | C::Halloween)).map(|(i, _)| i).collect() +} + +// the music of a holiday (holiday::current()), if it has one +pub fn holiday_music(holiday: u8) -> Option { + match holiday { + crate::holiday::CHRISTMAS => Some(Category::Christmas), + crate::holiday::EASTER => Some(Category::Easter), + crate::holiday::HALLOWEEN => Some(Category::Halloween), + _ => None, + } +} + +// the category actually played for `want` during a holiday: the title music always becomes the +// holiday's piece, the build music every fourth time (`build_picks`: build tracks picked so far) +pub fn holiday_category(want: Category, holiday: u8, build_picks: usize) -> Category { + match (want, holiday_music(holiday)) { + (Category::Title, Some(h)) => h, + (Category::Build, Some(h)) if build_picks % 4 == 3 => h, + _ => want, + } } pub fn track_id(t: usize) -> &'static str { @@ -366,6 +390,47 @@ mod tests { assert_eq!(track_title(track_by_id("build13").unwrap()), "Underground River"); } + #[test] + fn every_holiday_has_its_piece_for_the_title_and_now_and_then_the_build_music() { + use crate::holiday::{CHRISTMAS, EASTER, HALLOWEEN, NONE}; + for (h, c, id, title) in [ + (CHRISTMAS, Category::Christmas, "holiday_christmas", "Frostbound Carol"), + (EASTER, Category::Easter, "holiday_easter", "Eggs in the Moss"), + (HALLOWEEN, Category::Halloween, "holiday_halloween", "Crypt of Lanterns"), + ] { + let t = track_by_id(id).unwrap(); + assert_eq!(tracks_in(c), vec![t]); + assert_eq!(track_title(t), title); + assert!(player_tracks().contains(&t)); + assert_eq!(holiday_category(Category::Title, h, 0), c); + assert_eq!(holiday_category(Category::Title, h, 5), c); + let builds: Vec = (0..8).map(|k| holiday_category(Category::Build, h, k)).collect(); + assert_eq!(builds.iter().filter(|&&b| b == c).count(), 2, "now and then, not always"); + assert!(builds.iter().all(|&b| b == c || b == Category::Build)); + for other in [Category::Battle, Category::Surface, Category::Victory, Category::Torture] { + assert_eq!(holiday_category(other, h, 3), other); + } + // the piece plays: audible, finite and not clipping + let m = std::rc::Rc::new(xm::load(TRACKS[t].2).unwrap()); + let mut p = Player::new(m, 22050.0); + let mut buf = vec![0.0f32; 2 * 22050]; + let mut peak = 0.0f32; + for _ in 0..20 { + buf.iter_mut().for_each(|v| *v = 0.0); + p.render(&mut buf, MUSIC_GAIN); + for &v in &buf { + assert!(v.is_finite()); + peak = peak.max(v.abs()); + } + } + assert!(peak > 0.05 && peak < 1.0, "{} peak {}", id, peak); + } + for k in 0..8 { + assert_eq!(holiday_category(Category::Title, NONE, k), Category::Title); + assert_eq!(holiday_category(Category::Build, NONE, k), Category::Build); + } + } + #[test] fn engine_crossfade_and_sfx() { dc_audio_init(48000.0); diff --git a/src/main.rs b/src/main.rs index f9d6206..a42b283 100644 --- a/src/main.rs +++ b/src/main.rs @@ -492,11 +492,12 @@ fn apply_settings(s: &Settings, r3d: &mut R3d) { struct MusicDirector { next: std::collections::HashMap, // category -> next index within the category current: Option, + build_picks: usize, // build tracks picked so far (during a holiday every fourth is its piece) } impl MusicDirector { fn new() -> MusicDirector { - MusicDirector { next: std::collections::HashMap::new(), current: None } + MusicDirector { next: std::collections::HashMap::new(), current: None, build_picks: 0 } } fn pick(&mut self, c: audio::Category) -> usize { @@ -573,11 +574,17 @@ impl MusicDirector { } let rotate = matches!(want, C::Build | C::Title | C::Surface) && self.current == Some(want) && audio::music_loops() >= 2; // after the chosen track was let go, the director picks again - let foreign = chosen.is_none() && audio::current_track().map_or(false, |t| crate::tracks::TRACKS.get(t).map_or(false, |x| x.1 != want)) && calm && self.current == Some(want); + // (a holiday's piece belongs to the title and build music) + let holiday = holiday::current(); + let fits = |c: C| c == want || (matches!(want, C::Title | C::Build) && audio::holiday_music(holiday) == Some(c)); + let foreign = chosen.is_none() && audio::current_track().map_or(false, |t| crate::tracks::TRACKS.get(t).map_or(false, |x| !fits(x.1))) && calm && self.current == Some(want); if self.current != Some(want) || rotate || foreign || audio::current_track().is_none() { let before = self.current; self.current = Some(want); - let t = self.pick(want); + let t = self.pick(audio::holiday_category(want, holiday, self.build_picks)); + if want == C::Build { + self.build_picks += 1; + } // between the dungeon and the surface the music changes slowly let fade = if matches!(want, C::Victory | C::Defeat) { 1.0 diff --git a/src/tracks.rs b/src/tracks.rs index 7ec3b45..2b18893 100644 --- a/src/tracks.rs +++ b/src/tracks.rs @@ -3,7 +3,7 @@ use crate::audio::Category; -pub const TRACKS: [(&str, Category, &[u8]); 47] = [ +pub const TRACKS: [(&str, Category, &[u8]); 50] = [ ("title", Category::Title, include_bytes!("../assets/music/title.xm")), ("title2", Category::Title, include_bytes!("../assets/music/title2.xm")), ("build1", Category::Build, include_bytes!("../assets/music/build1.xm")), @@ -51,4 +51,7 @@ pub const TRACKS: [(&str, Category, &[u8]); 47] = [ ("victory", Category::Victory, include_bytes!("../assets/music/victory.xm")), ("victory2", Category::Victory, include_bytes!("../assets/music/victory2.xm")), ("defeat", Category::Defeat, include_bytes!("../assets/music/defeat.xm")), + ("holiday_christmas", Category::Christmas, include_bytes!("../assets/music/holiday_christmas.xm")), + ("holiday_easter", Category::Easter, include_bytes!("../assets/music/holiday_easter.xm")), + ("holiday_halloween", Category::Halloween, include_bytes!("../assets/music/holiday_halloween.xm")), ]; diff --git a/src/xm.rs b/src/xm.rs index 18d45a8..78b37de 100644 --- a/src/xm.rs +++ b/src/xm.rs @@ -1130,7 +1130,8 @@ mod tests { fn render_all_songs() { for (k, (name, _, data)) in crate::tracks::TRACKS.iter().enumerate() { let m = Rc::new(load(data).expect("load")); - assert!(m.channels == 8 || (m.channels == 10 && name.starts_with("surface")), "{} {}", name, m.channels); + // birds and wind above ground and in the spring + assert!(m.channels == 8 || (m.channels == 10 && (name.starts_with("surface") || *name == "holiday_easter")), "{} {}", name, m.channels); let mut p = Player::new(m, 48000.0); let mut buf = vec![0.0f32; 48000 * 2]; let mut peak = 0.0f32; diff --git a/tools/compose_music.py b/tools/compose_music.py index 2f72786..c00952b 100755 --- a/tools/compose_music.py +++ b/tools/compose_music.py @@ -75,6 +75,10 @@ CHORDS = { "C": ["C", "E", "G"], "Am": ["A", "C", "E"], "C7": ["C", "E", "Bb"], + "E": ["E", "G#", "B"], + "Em": ["E", "G", "B"], + "Bm": ["B", "D", "F#"], + "Eb": ["Eb", "G", "Bb"], } @@ -304,6 +308,15 @@ def wind(): return out[: n - k] +def harpsichord_cycle(amp=0.4): + # bright and nasal: a narrow pulse with a saw on top (many strong harmonics, like a plucked quill) + raw = [(1.0 if i < CYCLE * 0.18 else -0.22) + 0.6 * (2.0 * i / CYCLE - 1.0) for i in range(CYCLE)] + mean = sum(raw) / CYCLE + raw = [v - mean for v in raw] + m = max(abs(v) for v in raw) + return [amp * v / m for v in raw] + + def build_instruments(): return [ Instrument("Lead pulse 25%", Sample("pulse25", pulse(0.25), loop=(0, CYCLE), relnote=CYCLE_REL, finetune=CYCLE_FT), @@ -336,12 +349,14 @@ def build_instruments(): Instrument("Bird", Sample("bird", bird(), relnote=12)), Instrument("Wind", Sample("wind", wind(), loop=(0, len(wind())), relnote=12), env=[(0, 0), (60, 48), (120, 40)], sustain=2, fadeout=200), + Instrument("Harpsichord", Sample("harpsichord", harpsichord_cycle(), loop=(0, CYCLE), relnote=CYCLE_REL, finetune=CYCLE_FT), + env=[(0, 64), (2, 46), (14, 22), (40, 8), (70, 0)], fadeout=2400), ] LEAD, SQUARE, PAD, BASS, PLUCK, KICK, SNARE, HAT = range(1, 9) ORGAN, BELL, CHOIR, SUB, TOM, CRASH, HARP, TIMP = range(9, 17) -FLUTE, BIRD, WIND = range(17, 20) +FLUTE, BIRD, WIND, HARPSI = range(17, 21) # channel layout (the last two only for songs above ground: birds and wind) CH_LEAD, CH_COUNTER, CH_PAD1, CH_PAD2, CH_BASS, CH_ARP, CH_DRUM, CH_HAT, CH_BIRD, CH_WIND = range(10) CHANNELS = 10 @@ -1283,6 +1298,222 @@ def song_victory2(): return s +# ------------------------------------------------------------------ holiday pieces +# During a holiday the title music (and now and then the build music) plays the holiday's piece +# (see audio::holiday_category). Each one quotes the leitmotif in its own colours. + + +def sleigh(pat, vol=8): + """Sleigh bells: the hihat pitched up, every eighth, louder on the beats.""" + for r in range(0, pat.rows, 2): + pat.set(r, CH_HAT, note_num("C6"), HAT, vol + (6 if r % 4 == 0 else 0)) + + +def organ_pads(pat, chords, vol=18, octave=4): + r = 0 + for name, rows in chords: + notes = chord_notes(name, octave) + pat.set(r, CH_PAD1, notes[1], ORGAN, vol) + pat.set(r, CH_PAD2, notes[2], ORGAN, vol) + r += rows + + +def choir_pads(pat, chords, vol=18, octave=4): + r = 0 + for name, rows in chords: + notes = chord_notes(name, octave) + pat.set(r, CH_PAD1, notes[1], CHOIR, vol) + pat.set(r, CH_PAD2, notes[2], CHOIR, vol) + r += rows + + +def song_christmas(): + """Frostbound Carol: a dark carol in D minor on bells and choir, sleigh bells, a turn to + D major in the middle that falls back into the minor; the leitmotif rung on the bells.""" + s = Song("Frostbound Carol", 100) + mel_a = "A4:4 A4:4 Bb4:4 A4:4 | G4:4 F4:4 E4:8 | F4:4 G4:4 A4:4 D5:4 | C#5:12 -:4" + mel_b = "D5:4 C5:4 Bb4:4 A4:4 | Bb4:4 A4:4 G4:8 | F4:4 E4:4 D4:4 F4:4 | E4:6 C#4:2 D4:8" + mel_c = "F#4:4 A4:4 D5:8 | B4:4 A4:4 G4:8 | F#4:4 G4:4 A4:4 B4:4 | A4:12 -:4" + ch_a = bars(("Dm", 1), ("Gm", .5), ("A", .5), ("Dm", .5), ("F", .5), ("A", 1)) + ch_b = bars(("Bb", 1), ("Gm", 1), ("Dm", 1), ("A", .5), ("Dm", .5)) + ch_c = bars(("D", 1), ("G", 1), ("D", .5), ("G", .5), ("A", 1)) + ch_i = bars(("Dm", 1), ("Bb", 1), ("Gm", 1), ("A", 1)) + # intro: the bells toll over the choir, timpani like distant steps in the snow + p0 = Pattern() + p0.line(CH_LEAD, "D5:16 | D5:16 | D5:16 | C#5:16", BELL, 36) + choir_pads(p0, ch_i, vol=20) + p0.bass(ch_i, "R...............", inst=SUB, vol=42) + for k in (0, 32): + p0.set(k, CH_DRUM, note_num("C4"), TIMP, 44) + p1 = Pattern() + p1.line(CH_LEAD, transpose(mel_a, 12), BELL, 44) + choir_pads(p1, ch_a, vol=18) + p1.bass(ch_a, "R.......F.......", vol=40) + sleigh(p1, 6) + p2 = Pattern() + p2.line(CH_LEAD, transpose(mel_b, 12), BELL, 44) + choir_pads(p2, ch_b, vol=18) + p2.bass(ch_b, "R.......F.......", vol=40) + sleigh(p2, 6) + # second verse: the organ sings, the harp ripples, a soft kick + p3 = Pattern() + p3.line(CH_LEAD, mel_a, ORGAN, 38) + p3.line(CH_COUNTER, "D4:16 | Bb3:8 C#4:8 | D4:8 C4:8 | C#4:16", CHOIR, 22) + p3.pads(ch_a, vol=14) + p3.bass(ch_a, "R...R.F.R...F.O.", vol=40) + p3.arp(ch_a, step=2, vol=11, inst=HARP) + p3.drums(kick="x.......x.......", kv=44) + sleigh(p3, 8) + p4 = Pattern() + p4.line(CH_LEAD, mel_b, ORGAN, 38) + p4.line(CH_COUNTER, "F4:16 | D4:16 | A3:16 | G3:8 F3:8", CHOIR, 22) + p4.pads(ch_b, vol=14) + p4.bass(ch_b, "R...R.F.R...F.O.", vol=40) + p4.arp(ch_b, step=2, vol=11, inst=HARP) + p4.drums(kick="x.......x.......", kv=44) + sleigh(p4, 8) + # the turn to major: candle light for a moment + p5 = Pattern() + p5.line(CH_LEAD, transpose(mel_c, 12), BELL, 46) + p5.line(CH_COUNTER, "D4:16 | D4:16 | D4:8 B3:8 | C#4:16", ORGAN, 26) + choir_pads(p5, ch_c, vol=18) + p5.bass(ch_c, "R.......F.......", vol=42) + p5.arp(ch_c, step=4, vol=10, inst=HARP) + sleigh(p5, 8) + p5.set(48, CH_DRUM, note_num("C4"), TIMP, 40) + # the leitmotif on the bells, echoed by the harp + p6 = Pattern() + p6.line(CH_LEAD, transpose(MOTIF_A, 12), BELL, 42) + p6.echo(CH_LEAD, CH_COUNTER, 4, 18, HARP) + choir_pads(p6, CHORDS_A, vol=18) + p6.bass(CHORDS_A, "R.......F.......", inst=SUB, vol=42) + sleigh(p6, 6) + p7 = Pattern() + p7.line(CH_LEAD, transpose(MOTIF_B, 12), BELL, 42) + p7.echo(CH_LEAD, CH_COUNTER, 4, 18, HARP) + choir_pads(p7, CHORDS_B, vol=18) + p7.bass(CHORDS_B, "R.......F.......", inst=SUB, vol=42) + sleigh(p7, 6) + p7.set(48, CH_DRUM, note_num("C4"), TIMP, 42) + p = [s.add(x) for x in (p0, p1, p2, p3, p4, p5, p6, p7)] + s.order = [p[0], p[1], p[2], p[3], p[4], p[5], p[2], p[6], p[7], p[1], p[2]] + s.restart = 1 + return s + + +def song_easter(): + """Eggs in the Moss: light and playful in G major, flute and harp, birdsong, a bouncing + beat; the leitmotif turned into a spring tune.""" + s = Song("Eggs in the Moss", 120) + rng = random.Random(61) + mel_a = "G4:2 B4:2 D5:4 B4:2 D5:2 G5:4 | E5:2 D5:2 C5:2 B4:2 A4:8 | F#4:2 A4:2 D5:4 C5:2 B4:2 A4:4 | B4:4 G4:4 G4:8" + mel_b = "E5:4 D5:2 C5:2 B4:4 A4:4 | D5:4 C5:2 B4:2 A4:8 | G4:2 A4:2 B4:2 C5:2 D5:4 E5:4 | D5:8 -:8" + ch_a = bars(("G", 1), ("C", .5), ("D", .5), ("D", 1), ("G", 1)) + ch_b = bars(("Em", 1), ("D", 1), ("C", .5), ("G", .5), ("D", 1)) + mot_a = realize(MOTIF_DEG_A, NOTE_BASE["G"], "major", 4) + mot_b = realize(MOTIF_DEG_B, NOTE_BASE["G"], "major", 4) + ch_ma = bars(("G", 1), ("C", .5), ("D", .5), ("G", 1), ("Bm", 1)) + ch_mb = bars(("Em", 1), ("G", 1), ("D", 1), ("G", 1)) + bouncy = dict(kick="x.......x.......", snare="............x...", hat="..x...x...x...x.", hv=12, sv=28) + + def birds(pat): + for bar in range(pat.rows // BAR): + if rng.random() < 0.6: + row = bar * BAR + rng.choice([2, 5, 7, 10, 13]) + pat.set(row, CH_BIRD, note_num(rng.choice(["C4", "D4", "E4", "G4", "A4", "C5"])), BIRD, 12 + rng.randrange(10)) + + def verse(mel, ch, lead, lvol, echo=None): + p = Pattern() + p.line(CH_LEAD, mel, lead, lvol) + if echo: + p.echo(CH_LEAD, CH_COUNTER, 2, 16, echo) + p.pads(ch, vol=13) + p.bass(ch, "R.-.R.F.-.R.O.F.", vol=40) + p.arp(ch, step=2, vol=11, inst=HARP, order=(0, 1, 2, 1)) + p.drums(**bouncy) + birds(p) + return p + + p0 = Pattern() + choir_pads(p0, ch_a, vol=12) + p0.bass(ch_a, "R.......F.......", inst=SUB, vol=38) + p0.arp(ch_a, step=2, vol=11, inst=HARP, order=(0, 1, 2, 1)) + p0.drums(hat="..x...x...x...x.", hv=10) + birds(p0) + p0.set(0, CH_WIND, note_num("C4"), WIND, 10) + p1 = verse(mel_a, ch_a, FLUTE, 40) + p2 = verse(mel_b, ch_b, FLUTE, 40) + p3 = verse(transpose(mel_a, 12), ch_a, PLUCK, 34, HARP) + p4 = verse(transpose(mel_b, 12), ch_b, PLUCK, 34, HARP) + p5 = verse(mot_a, ch_ma, FLUTE, 40, HARP) + p6 = verse(mot_b, ch_mb, FLUTE, 40, HARP) + p = [s.add(x) for x in (p0, p1, p2, p3, p4, p5, p6)] + s.order = [p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[3], p[4], p[1], p[2]] + s.restart = 1 + return s + + +def song_halloween(): + """Crypt of Lanterns: a spooky dance in D harmonic minor, harpsichord and organ, midnight + bells, toms like knocking on coffin lids; the leitmotif on the harpsichord.""" + s = Song("Crypt of Lanterns", 120) + mel_a = "D4:4 F4:4 G#4:4 A4:4 | Bb4:6 A4:2 G#4:8 | A4:4 C5:4 Bb4:4 G4:4 | A4:16" + mel_b = "D5:2 Eb5:2 D5:4 A4:4 F4:4 | G4:2 F4:2 E4:4 C#4:8 | D4:2 E4:2 F4:2 G4:2 A4:2 Bb4:2 C#5:4 | D5:16" + ch_a = bars(("Dm", 1), ("E", 1), ("Gm", 1), ("A", 1)) + ch_b = bars(("Dm", 1), ("A", 1), ("Gm", .5), ("A", .5), ("Dm", 1)) + + def knock(pat): + for bar in range(pat.rows // BAR): + pat.set(bar * BAR + 14, CH_DRUM, note_num("A3"), TOM, 36) + + # midnight: twelve... well, four bells over an organ drone + p0 = Pattern() + p0.line(CH_LEAD, "D4:16 | D4:16 | D4:16 | C#4:16", BELL, 36) + p0.line(CH_PAD1, "D3:64", ORGAN, 20) + p0.line(CH_PAD2, "A3:32 | G#3:32", ORGAN, 18) + p0.bass(ch_a, "R...............", inst=SUB, vol=44) + p0.arp(ch_a, step=4, vol=9, octave=4, inst=HARPSI) + + def verse(mel, ch, lead, lvol, heavy=False): + p = Pattern() + p.line(CH_LEAD, mel, lead, lvol) + organ_pads(p, ch, vol=16) + p.bass(ch, "R.......R...F..." if not heavy else "R.R.....R.R.F...", inst=SUB, vol=44) + p.arp(ch, step=1, vol=10, octave=4, order=(0, 1, 2, 1), inst=HARPSI) + if heavy: + p.drums(kick="x.....x.x.......", snare="....x.......x...", hat="..x...x...x...x.", kv=52, sv=34, hv=10) + else: + p.drums(kick="x.......x.......", hat="..x...x...x...x.", kv=48, hv=9) + knock(p) + return p + + p1 = verse(transpose(mel_a, 12), ch_a, HARPSI, 40) + p2 = verse(transpose(mel_b, 12), ch_b, HARPSI, 40) + p3 = verse(mel_a, ch_a, ORGAN, 36, heavy=True) + p3.line(CH_COUNTER, "A3:16 | G#3:16 | Bb3:16 | C#4:16", HARPSI, 24) + p4 = verse(mel_b, ch_b, ORGAN, 36, heavy=True) + p4.line(CH_COUNTER, "F3:16 | E3:16 | D3:8 E3:8 | F3:16", HARPSI, 24) + # the leitmotif on the harpsichord with its own ghostly echo + p5 = verse(transpose(MOTIF_A, 12), CHORDS_A, HARPSI, 40) + p5.echo(CH_LEAD, CH_COUNTER, 3, 16, HARPSI) + p6 = verse(transpose(MOTIF_B, 12), CHORDS_B, HARPSI, 40) + p6.echo(CH_LEAD, CH_COUNTER, 3, 16, HARPSI) + # creeping down: a chromatic organ line over a pedal, the bells again + p7 = Pattern() + p7.line(CH_LEAD, "A4:8 G#4:8 | G4:8 F#4:8 | F4:8 E4:8 | Eb4:8 D4:8", ORGAN, 34) + p7.line(CH_PAD1, "D3:64", ORGAN, 16) + p7.line(CH_PAD2, "A3:64", ORGAN, 14) + p7.bass(ch_a, "R...............", inst=SUB, vol=44) + for k in (0, 32): + p7.set(k, CH_COUNTER, note_num("D5"), BELL, 30) + p7.set(k, CH_DRUM, note_num("C4"), TIMP, 46) + p7.arp(ch_a, step=2, vol=9, octave=4, inst=HARPSI, order=(0, 2)) + p = [s.add(x) for x in (p0, p1, p2, p3, p4, p5, p6, p7)] + s.order = [p[0], p[1], p[2], p[3], p[4], p[7], p[5], p[6], p[1], p[2], p[3], p[4]] + s.restart = 1 + return s + + def generated(spec_): return lambda: Gen(spec_).build() @@ -1317,6 +1548,9 @@ SONGS["mood_temple"] = ("temple", generated(MOOD_SPECS["temple"])) SONGS["victory"] = ("victory", song_victory) SONGS["victory2"] = ("victory", song_victory2) SONGS["defeat"] = ("defeat", song_defeat) +SONGS["holiday_christmas"] = ("christmas", song_christmas) +SONGS["holiday_easter"] = ("easter", song_easter) +SONGS["holiday_halloween"] = ("halloween", song_halloween) def write_rust_table(names): @@ -1331,7 +1565,8 @@ def write_rust_table(names): ] cat = {"title": "Title", "build": "Build", "battle": "Battle", "assault": "Assault", "boss_paladin": "BossPaladin", "boss_warden": "BossWarden", "torture": "Torture", "temple": "Temple", "victory": "Victory", "defeat": "Defeat", - "surface": "Surface", "surface_battle": "SurfaceBattle"} + "surface": "Surface", "surface_battle": "SurfaceBattle", "christmas": "Christmas", "easter": "Easter", + "halloween": "Halloween"} for n in names: lines.append(' ("%s", Category::%s, include_bytes!("../assets/music/%s.xm")),' % (n, cat[SONGS[n][0]], n)) lines.append("];")