#!/usr/bin/env python3 """Synthesize the NOMEANSNO QUEST soundtrack — stdlib only. Five mood-override loops for MRPCI (music/.wav), built from the band's own vocabulary: overdriven bass riffs in odd meters, brushed noise hats, kick sweeps. 22050 Hz mono 16-bit, loop-safe (bar-aligned, short fades). The engine loops them at low volume under the room. python3 tools/gen_music.py """ import math import os import random import struct import wave SR = 22050 OUT = os.path.join(os.path.dirname(__file__), "..", "music") def clip(x): return math.tanh(x) # soft overdrive — the Rob Wright pedal def note_hz(semi): # semitones from A1 (55 Hz) return 55.0 * (2 ** (semi / 12.0)) class Mix: def __init__(self, seconds): self.buf = [0.0] * int(SR * seconds) def add(self, t0, samples, gain=1.0): i0 = int(t0 * SR) for i, s in enumerate(samples): j = i0 + i if 0 <= j < len(self.buf): self.buf[j] += s * gain def wav(self, path): n = len(self.buf) fade = int(SR * 0.02) out = bytearray() for i, v in enumerate(self.buf): g = min(1.0, i / fade, (n - 1 - i) / fade) out += struct.pack("