summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-26 16:50:24 +0300
committerPaul Buetow <paul@buetow.org>2026-04-26 16:50:24 +0300
commitf075b701736d8e7527b00a0b9bdd47e3466c698b (patch)
tree1a46917e8f58d9c6820c439fa84c5f1dc10c8c0f
parent13b5543b13a780942c052dad5baa057a6fce0339 (diff)
audio: make ambient music hard, fast, and aggressive
Complete rewrite of all 19 theme ambient presets to eliminate the slow waltz/lo-fi feel. Every preset now targets a driving rock/ industrial/hardstyle vibe with: - **Much faster BPM**: normal 120–180, wild 180–260 (was 60–70 / 120–140) - **Power chords** replace major/minor triads — aggressive distortion-ready - **Straight eighth-note drive** replaces swung waltz melodies — punchy, rhythmic, no floaty legato - **More active drum patterns**: double-kick, snare backbeats, sixteenth-note hats, clap stabs on the 16th - **Shorter attack / release** on normal (0.3→0.02, 0.5→0.15) so everything hits harder - **Higher filter cutoffs** for a brighter, more aggressive timbre - **Three drone voices** (was 4) with lower fundamental octave, fewer frequencies, more focused. Sub-bass added via buildRockSong octave divider. - **buildRockSong** replaces buildSong: adds sub-bass (/2 voice) and bass hits per measure, making each bar feel like a down-beat impact - **buildDriveMelody** replaces buildSwingMelody: straight eighth notes, no swing - **buildStabMelody** for wild mode: short 16th-note bursts with gaps Also bumped test BPM cap from 250→400 to accommodate the new range.
-rw-r--r--internal/generator/generator_test.go2
-rw-r--r--internal/generator/theme_sounds.go1220
2 files changed, 606 insertions, 616 deletions
diff --git a/internal/generator/generator_test.go b/internal/generator/generator_test.go
index 49d1a2f..47b4cd3 100644
--- a/internal/generator/generator_test.go
+++ b/internal/generator/generator_test.go
@@ -187,7 +187,7 @@ func TestThemeSoundPresetsAmbientValuesBounded(t *testing.T) {
if a.Gain <= 0 || a.Gain > 0.15 {
t.Errorf("theme %q ambient.%s gain=%f; want (0, 0.15]", name, mode, a.Gain)
}
- if a.BPM <= 0 || a.BPM > 250 {
+ if a.BPM <= 0 || a.BPM > 400 {
t.Errorf("theme %q ambient.%s bpm=%f; want (0, 250]", name, mode, a.BPM)
}
if a.PulseInterval < 0 || a.PulseInterval > 10 {
diff --git a/internal/generator/theme_sounds.go b/internal/generator/theme_sounds.go
index 05bd89b..a4c4f0c 100644
--- a/internal/generator/theme_sounds.go
+++ b/internal/generator/theme_sounds.go
@@ -103,6 +103,11 @@ func minor(freq float64) [3]float64 {
return [3]float64{freq, freq * intMinor3rd, freq * intPerf5th}
}
+// power returns a root+5th power chord (only two voices — aggressive and clear).
+func power(freq float64) [3]float64 {
+ return [3]float64{freq, freq * intPerf5th, 0}
+}
+
// chordArp returns an up/down arpeggio of a triad; each note sustains for 'dur'
// while the sequencer only advances by 'step', so multiple voices overlap.
func chordArp(chord [3]float64, dur, step float64) []melodyNote {
@@ -112,60 +117,61 @@ func chordArp(chord [3]float64, dur, step float64) []melodyNote {
}
}
-func bass(freq, dur, step float64) melodyNote {
+// powerArp arpeggiates a power chord (root→5th→root→5th).
+func powerArp(chord [3]float64, dur, step float64) []melodyNote {
+ return []melodyNote{
+ ns(chord[0], dur, step), ns(chord[1], dur, step),
+ ns(chord[0], dur, step), ns(chord[1], dur, step),
+ }
+}
+
+func bassNote(freq, dur, step float64) melodyNote {
return ns(freq, dur, step)
}
-func concatNotes(groups ...[]melodyNote) []melodyNote {
+// ── song builders ──────────────────────────────────────────────────
+
+// buildRockSong creates a 4-bar loop with power-chord pads, sub-bass, and a
+// driving melody line. BPM is fast; every slot is a 16th-note.
+func buildRockSong(
+ bassOct [4]float64, chords [4][3]float64, melody [4][]melodyNote,
+ step float64,
+) []melodyNote {
var out []melodyNote
- for _, g := range groups {
- out = append(out, g...)
+ for i := 0; i < 4; i++ {
+ // Sub-bass: low octave, long sustain so drone + bass overlap
+ out = append(out, bassNote(bassOct[i]/2, step*7.9, step*8))
+ // Main bass hits on each beat
+ out = append(out, bassNote(bassOct[i], step*3.8, step*4))
+ // Power chord stab (sustains across the measure)
+ out = append(out, powerArp(chords[i], step*3.5, step)...)
+ // Melody top-line
+ out = append(out, melody[i]...)
}
return out
}
-// buildMeasure creates one measure: bass + chord pad + melody top-line.
-func buildMeasure(bassFreq float64, chord [3]float64, melody []melodyNote, step float64) []melodyNote {
- bassDur := step * 7.5
- chordDur := step * 3.0
- if bassFreq < 120 {
- bassFreq *= 2
- }
- if chord[0] < 200 {
- chord = [3]float64{chord[0] * 4, chord[1] * 4, chord[2] * 4}
- } else if chord[0] < 260 {
- chord = [3]float64{chord[0] * 2, chord[1] * 2, chord[2] * 2}
- }
- var notes []melodyNote
- notes = append(notes, bass(bassFreq, bassDur, step))
- notes = append(notes, chordArp(chord, chordDur, step)...)
- for _, nn := range melody {
- notes = append(notes, nn)
- }
- return notes
-}
-
-// buildSong creates a 4-measure loop from a chord progression and melodies.
-func buildSong(bassFreqs [4]float64, chords [4][3]float64, melodies [4][]melodyNote, step float64) []melodyNote {
+// buildDriveMelody: straight eighth-note drive, no swing. Each note is a short
+// punch stab so the line stays rhythmic and aggressive.
+func buildDriveMelody(freqs []float64, step float64) []melodyNote {
var out []melodyNote
- for i := 0; i < 4; i++ {
- out = append(out, buildMeasure(bassFreqs[i], chords[i], melodies[i], step)...)
+ for _, freq := range freqs {
+ out = append(out, ns(freq, step*0.85, step))
}
return out
}
-// ── swing melody builder ────────────────────────────────────────────
-
-// buildSwingMelody converts a list of freqs into a swing-pattern melody:
-// even-index notes (on-beat) hold longer; odd-index notes (off-beat) are shorter.
-func buildSwingMelody(freqs []float64, baseStep float64) []melodyNote {
+// buildStabMelody: short 16th-note stabs with gaps for air. Perfect for fast
+// drum-and-bass, hardstyle, or industrial grooves.
+func buildStabMelody(freqs []float64, step float64) []melodyNote {
var out []melodyNote
for i, freq := range freqs {
+ // On-beat stabs hit hard; off-beat ghosts are tighter
+ dur := step * 0.4
if i%2 == 0 {
- out = append(out, ns(freq, baseStep*1.8, baseStep*1.0))
- } else {
- out = append(out, ns(freq, baseStep*0.8, baseStep*0.5))
+ dur = step * 0.8
}
+ out = append(out, ns(freq, dur, step))
}
return out
}
@@ -176,30 +182,8 @@ func pat(names ...string) []string {
return names
}
-var themeSoundPresets = map[string]themeSounds{
- "neon": soundsNeon(),
- "terminal": soundsTerminal(),
- "synthwave": soundsSynthwave(),
- "plasma": soundsPlasma(),
- "brutalist": soundsBrutalist(),
- "volcano": soundsVolcano(),
- "aurora": soundsAurora(),
- "matrix": soundsMatrix(),
- "ocean": soundsOcean(),
- "dos": soundsDos(),
- "retro": soundsRetro(),
- "cosmos": soundsCosmos(),
- "retrofuture": soundsRetrofuture(),
- "spaceage": soundsSpaceage(),
- "tropicale": soundsTropical(),
- "noir": soundsNoir(),
- "cathedral": soundsCathedral(),
- "surveillance": soundsSurveillance(),
- "biomech": soundsBiomech(),
-}
-
// ════════════════════════════════════════════════════════════════════
-// NEON – bright synth-pop in C major
+// NEON – synth-pop banger, C major, 150/220
// ════════════════════════════════════════════════════════════════════
func soundsNeon() themeSounds {
var s themeSounds
@@ -210,47 +194,47 @@ func soundsNeon() themeSounds {
s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 880, 261.63, 0.16, 0.09
s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "square", 180, 90, 0.12, 0.1
- c, f, g1, c2 := major(65.41), major(87.31), major(98.00), major(130.81)
+ c, f, g1, c2 := power(65.41), power(87.31), power(98.00), power(130.81)
- normalMel := buildSong(
+ normalMel := buildRockSong(
[4]float64{130.81, 174.61, 196.00, 130.81},
[4][3]float64{c, f, g1, c2},
[4][]melodyNote{
- buildSwingMelody([]float64{523.25, 587.33, 659.25, 523.25}, 0.5),
- buildSwingMelody([]float64{698.46, 783.99, 880.00, 698.46}, 0.5),
- buildSwingMelody([]float64{783.99, 880.00, 1046.5, 783.99}, 0.5),
- buildSwingMelody([]float64{523.25, 659.25, 783.99, 1046.5}, 0.5),
- }, 0.5)
+ buildDriveMelody([]float64{523.25, 587.33, 659.25, 783.99}, 0.25),
+ buildDriveMelody([]float64{698.46, 783.99, 880.00, 1046.5}, 0.25),
+ buildDriveMelody([]float64{783.99, 880.00, 1046.5, 783.99}, 0.25),
+ buildDriveMelody([]float64{523.25, 659.25, 783.99, 1046.5}, 0.25),
+ }, 0.25)
- wildMel := buildSong(
+ wildMel := buildRockSong(
[4]float64{261.63, 349.23, 392.00, 261.63},
[4][3]float64{c, f, g1, c2},
[4][]melodyNote{
- buildSwingMelody([]float64{1046.5, 1174.66, 1318.5, 1046.5}, 0.25),
- buildSwingMelody([]float64{1396.92, 1567.98, 1760.00, 1396.92}, 0.25),
- buildSwingMelody([]float64{1567.98, 1760.00, 2093.0, 1567.98}, 0.25),
- buildSwingMelody([]float64{1046.5, 1318.5, 1567.98, 2093.0}, 0.25),
- }, 0.25)
+ buildStabMelody([]float64{1046.5, 1174.66, 1318.5, 1567.98}, 0.125),
+ buildStabMelody([]float64{1396.92, 1567.98, 1760.00, 2093.0}, 0.125),
+ buildStabMelody([]float64{1567.98, 1760.00, 2093.0, 1567.98}, 0.125),
+ buildStabMelody([]float64{1046.5, 1318.5, 1567.98, 2093.0}, 0.125),
+ }, 0.125)
s.Ambient.Normal = ambientPreset{
- Gain: 0.028, BPM: 70, Wave: "sine",
- DroneFreqs: []float64{130.81, 174.61, 196.00, 261.63},
- Attack: 0.3, Release: 0.8, CutoffMin: 800, CutoffMax: 3000,
- Drums: pat("kick", "_", "hat", "_", "kick", "_", "hat", "_", "kick", "_", "hat", "_", "kick", "_", "hat", "_"),
+ Gain: 0.028, BPM: 150, Wave: "square",
+ DroneFreqs: []float64{130.81, 196.00, 261.63},
+ Attack: 0.02, Release: 0.15, CutoffMin: 1200, CutoffMax: 5000,
+ Drums: pat("kick", "_", "hat", "kick", "snare", "kick", "hat", "kick", "kick", "kick", "hat", "snare", "kick", "_", "hat", "clap"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.055, BPM: 130, Wave: "triangle",
- DroneFreqs: []float64{261.63, 349.23, 392.00, 523.25},
- Attack: 0.1, Release: 0.4, CutoffMin: 1500, CutoffMax: 6000, DetuneCents: 8,
- Drums: pat("kick", "hat", "hat", "_", "kick", "hat", "snare", "hat", "kick", "hat", "hat", "_", "kick", "hat", "snare", "hat"),
+ Gain: 0.055, BPM: 220, Wave: "square",
+ DroneFreqs: []float64{130.81, 196.00, 261.63, 392.00},
+ Attack: 0.02, Release: 0.08, CutoffMin: 2000, CutoffMax: 7000, DetuneCents: 12,
+ Drums: pat("kick", "kick", "hat", "kick", "snare", "kick", "hat", "kick", "kick", "kick", "hat", "snare", "kick", "kick", "hat", "clap"),
Melody: wildMel,
}
return s
}
// ════════════════════════════════════════════════════════════════════
-// TERMINAL – dark industrial, E minor
+// TERMINAL – dark industrial, E minor, 160/240
// ════════════════════════════════════════════════════════════════════
func soundsTerminal() themeSounds {
var s themeSounds
@@ -261,44 +245,44 @@ func soundsTerminal() themeSounds {
s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "square", 900, 400, 0.14, 0.09
s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "square", 200, 100, 0.1, 0.1
- e, b, a := minor(82.41), minor(61.74), minor(110.00)
+ e, b, a := power(82.41), power(61.74), power(110.00)
- normalMel := buildSong(
+ normalMel := buildRockSong(
[4]float64{164.81, 123.47, 220.00, 164.81}, [4][3]float64{e, b, a, e},
[4][]melodyNote{
- buildSwingMelody([]float64{329.63, 392.00, 440.00, 329.63}, 0.5),
- buildSwingMelody([]float64{246.94, 293.66, 329.63, 246.94}, 0.5),
- buildSwingMelody([]float64{440.00, 523.25, 587.33, 440.00}, 0.5),
- buildSwingMelody([]float64{329.63, 392.00, 493.88, 329.63}, 0.5),
- }, 0.5)
- wildMel := buildSong(
+ buildDriveMelody([]float64{329.63, 392.00, 440.00, 523.25}, 0.233),
+ buildDriveMelody([]float64{246.94, 293.66, 329.63, 392.00}, 0.233),
+ buildDriveMelody([]float64{440.00, 523.25, 587.33, 440.00}, 0.233),
+ buildDriveMelody([]float64{329.63, 392.00, 493.88, 329.63}, 0.233),
+ }, 0.233)
+ wildMel := buildRockSong(
[4]float64{329.63, 246.94, 440.00, 329.63}, [4][3]float64{e, b, a, e},
[4][]melodyNote{
- buildSwingMelody([]float64{659.25, 783.99, 880.00, 659.25}, 0.25),
- buildSwingMelody([]float64{493.88, 587.33, 659.25, 493.88}, 0.25),
- buildSwingMelody([]float64{880.00, 1046.5, 1174.66, 880.00}, 0.25),
- buildSwingMelody([]float64{659.25, 783.99, 987.77, 659.25}, 0.25),
- }, 0.25)
+ buildStabMelody([]float64{659.25, 783.99, 880.00, 1046.5}, 0.117),
+ buildStabMelody([]float64{493.88, 587.33, 659.25, 783.99}, 0.117),
+ buildStabMelody([]float64{880.00, 1046.5, 1174.66, 880.00}, 0.117),
+ buildStabMelody([]float64{659.25, 783.99, 987.77, 659.25}, 0.117),
+ }, 0.117)
s.Ambient.Normal = ambientPreset{
- Gain: 0.025, BPM: 65, Wave: "square",
+ Gain: 0.028, BPM: 160, Wave: "square",
DroneFreqs: []float64{82.41, 123.47, 164.81},
- Attack: 0.1, Release: 0.3,
- Drums: pat("kick", "kick", "hat", "kick", "snare", "kick", "hat", "kick", "kick", "kick", "hat", "clap", "snare", "kick", "hat", "kick"),
+ Attack: 0.02, Release: 0.1, CutoffMin: 1000, CutoffMax: 5000,
+ Drums: pat("kick", "_", "hat", "kick", "snare", "kick", "hat", "snare", "kick", "kick", "hat", "kick", "snare", "_", "hat", "clap"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.055, BPM: 140, Wave: "square",
- DroneFreqs: []float64{164.81, 246.94, 329.63},
- Attack: 0.05, Release: 0.15,
- Drums: pat("kick", "kick", "hat", "kick", "snare", "kick", "hat", "kick", "kick", "kick", "hat", "clap", "snare", "kick", "hat", "kick"),
+ Gain: 0.055, BPM: 240, Wave: "square",
+ DroneFreqs: []float64{164.81, 246.94, 329.63, 440.00},
+ Attack: 0.02, Release: 0.05, CutoffMin: 2000, CutoffMax: 7000, DetuneCents: 15,
+ Drums: pat("kick", "kick", "hat", "kick", "snare", "kick", "hat", "snare", "kick", "kick", "hat", "kick", "snare", "kick", "hat", "clap"),
Melody: wildMel,
}
return s
}
// ════════════════════════════════════════════════════════════════════
-// SYNTHWAVE – retro-future, A minor
+// SYNTHWAVE – retro-future racing, A minor, 140/200
// ════════════════════════════════════════════════════════════════════
func soundsSynthwave() themeSounds {
var s themeSounds
@@ -309,717 +293,703 @@ func soundsSynthwave() themeSounds {
s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 440, 110, 0.17, 0.09
s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "sine", 150, 75, 0.14, 0.09
- am, f, c, g := minor(55.00), major(87.31), major(65.41), major(98.00)
+ am, f, c, g := minor(55.00), power(87.31), power(65.41), power(98.00)
- normalMel := buildSong(
+ normalMel := buildRockSong(
[4]float64{110.00, 174.61, 130.81, 196.00}, [4][3]float64{am, f, c, g},
[4][]melodyNote{
- buildSwingMelody([]float64{220.00, 261.63, 293.66, 220.00}, 0.5),
- buildSwingMelody([]float64{349.23, 392.00, 440.00, 349.23}, 0.5),
- buildSwingMelody([]float64{261.63, 329.63, 392.00, 261.63}, 0.5),
- buildSwingMelody([]float64{392.00, 440.00, 493.88, 392.00}, 0.5),
- }, 0.5)
- wildMel := buildSong(
+ buildDriveMelody([]float64{220.00, 261.63, 293.66, 349.23}, 0.268),
+ buildDriveMelody([]float64{349.23, 392.00, 440.00, 523.25}, 0.268),
+ buildDriveMelody([]float64{261.63, 329.63, 392.00, 440.00}, 0.268),
+ buildDriveMelody([]float64{220.00, 293.66, 349.23, 392.00}, 0.268),
+ }, 0.268)
+ wildMel := buildRockSong(
[4]float64{220.00, 349.23, 261.63, 392.00}, [4][3]float64{am, f, c, g},
[4][]melodyNote{
- buildSwingMelody([]float64{440.00, 523.25, 587.33, 440.00}, 0.25),
- buildSwingMelody([]float64{698.46, 783.99, 880.00, 698.46}, 0.25),
- buildSwingMelody([]float64{523.25, 659.25, 783.99, 523.25}, 0.25),
- buildSwingMelody([]float64{783.99, 880.00, 987.77, 783.99}, 0.25),
- }, 0.25)
+ buildStabMelody([]float64{440.00, 523.25, 587.33, 698.46}, 0.134),
+ buildStabMelody([]float64{698.46, 783.99, 880.00, 1046.5}, 0.134),
+ buildStabMelody([]float64{523.25, 659.25, 783.99, 880.00}, 0.134),
+ buildStabMelody([]float64{440.00, 587.33, 698.46, 783.99}, 0.134),
+ }, 0.134)
s.Ambient.Normal = ambientPreset{
- Gain: 0.03, BPM: 70, Wave: "sine",
- DroneFreqs: []float64{110.00, 130.81, 174.61, 196.00},
- Attack: 0.3, Release: 0.8,
- Drums: pat("kick", "_", "hat", "_", "kick", "_", "hat", "_", "kick", "_", "hat", "_", "snare", "_", "hat", "_"),
+ Gain: 0.03, BPM: 140, Wave: "square",
+ DroneFreqs: []float64{110.00, 174.61, 220.00},
+ Attack: 0.02, Release: 0.15, CutoffMin: 1200, CutoffMax: 5000,
+ Drums: pat("kick", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "kick", "clap"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.065, BPM: 130, Wave: "triangle",
- DroneFreqs: []float64{220.00, 261.63, 349.23, 392.00},
- Attack: 0.1, Release: 0.4, DetuneCents: 12,
- Drums: pat("kick", "_", "hat", "_", "kick", "_", "hat", "_", "kick", "_", "hat", "_", "snare", "_", "hat", "_"),
+ Gain: 0.06, BPM: 200, Wave: "square",
+ DroneFreqs: []float64{220.00, 349.23, 440.00, 523.25},
+ Attack: 0.02, Release: 0.06, CutoffMin: 2000, CutoffMax: 7000, DetuneCents: 12,
+ Drums: pat("kick", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "kick", "hat", "snare", "hat", "kick", "kick", "kick", "clap"),
Melody: wildMel,
}
return s
}
// ════════════════════════════════════════════════════════════════════
-// PLASMA – energetic, D minor
+// PLASMA – white-hot fusion drive, F# minor, 170/250
// ════════════════════════════════════════════════════════════════════
func soundsPlasma() themeSounds {
var s themeSounds
- s.Splash.Freqs = []float64{311.13, 415.3, 466.16, 622.25}
- s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.08, 0.095, "triangle"
- s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 246.94, "sine", 0.085, 0.11
- s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "triangle", 349.23, 698.46, 0.15, 0.1
- s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 523.25, 174.61, 0.17, 0.09
- s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "triangle", 200, 100, 0.13, 0.09
+ s.Splash.Freqs = []float64{369.99, 493.88, 587.33, 739.99}
+ s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.055, 0.09, "sine"
+ s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 246.94, "square", 0.055, 0.11
+ s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "sine", 370, 740, 0.14, 0.1
+ s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "square", 740, 246.94, 0.17, 0.09
+ s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "square", 120, 60, 0.1, 0.1
- dm, bb, f, c := minor(73.42), major(58.27), major(87.31), major(65.41)
+ fsm, bm, cs, d := minor(92.50), minor(61.74), power(69.30), power(73.42)
- normalMel := buildSong(
- [4]float64{146.83, 116.54, 174.61, 130.81}, [4][3]float64{dm, bb, f, c},
+ normalMel := buildRockSong(
+ [4]float64{185.00, 246.94, 138.59, 146.83}, [4][3]float64{fsm, bm, cs, d},
[4][]melodyNote{
- buildSwingMelody([]float64{293.66, 349.23, 392.00, 293.66}, 0.5),
- buildSwingMelody([]float64{233.08, 293.66, 349.23, 233.08}, 0.5),
- buildSwingMelody([]float64{349.23, 440.00, 523.25, 349.23}, 0.5),
- buildSwingMelody([]float64{261.63, 329.63, 392.00, 261.63}, 0.5),
- }, 0.5)
- wildMel := buildSong(
- [4]float64{293.66, 233.08, 349.23, 261.63}, [4][3]float64{dm, bb, f, c},
+ buildDriveMelody([]float64{369.99, 440.00, 493.88, 554.37}, 0.22),
+ buildDriveMelody([]float64{493.88, 554.37, 587.33, 369.99}, 0.22),
+ buildDriveMelody([]float64{277.18, 329.63, 369.99, 440.00}, 0.22),
+ buildDriveMelody([]float64{293.66, 349.23, 392.00, 293.66}, 0.22),
+ }, 0.22)
+ wildMel := buildRockSong(
+ [4]float64{369.99, 493.88, 277.18, 293.66}, [4][3]float64{fsm, bm, cs, d},
[4][]melodyNote{
- buildSwingMelody([]float64{587.33, 698.46, 783.99, 587.33}, 0.25),
- buildSwingMelody([]float64{466.16, 587.33, 698.46, 466.16}, 0.25),
- buildSwingMelody([]float64{698.46, 880.00, 1046.5, 698.46}, 0.25),
- buildSwingMelody([]float64{523.25, 659.25, 783.99, 523.25}, 0.25),
- }, 0.25)
+ buildStabMelody([]float64{739.99, 880.00, 987.77, 1108.73}, 0.11),
+ buildStabMelody([]float64{987.77, 1108.73, 1174.66, 739.99}, 0.11),
+ buildStabMelody([]float64{554.37, 659.25, 739.99, 880.00}, 0.11),
+ buildStabMelody([]float64{587.33, 698.46, 783.99, 587.33}, 0.11),
+ }, 0.11)
s.Ambient.Normal = ambientPreset{
- Gain: 0.035, BPM: 70, Wave: "triangle",
- DroneFreqs: []float64{146.83, 233.08, 349.23},
- Attack: 0.4, Release: 0.9, DetuneCents: 15,
- Drums: pat("kick", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "snare", "hat"),
+ Gain: 0.028, BPM: 170, Wave: "square",
+ DroneFreqs: []float64{92.50, 138.59, 185.00},
+ Attack: 0.02, Release: 0.12, CutoffMin: 1400, CutoffMax: 5500,
+ Drums: pat("kick", "_", "hat", "kick", "snare", "kick", "hat", "snare", "kick", "kick", "hat", "kick", "snare", "_", "hat", "clap"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.07, BPM: 150, Wave: "square",
- DroneFreqs: []float64{293.66, 466.16, 698.46},
- Attack: 0.1, Release: 0.4, DetuneCents: 25,
- CutoffMin: 400, CutoffMax: 3000, NoiseGain: 0.02,
- Drums: pat("kick", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "snare", "hat"),
+ Gain: 0.055, BPM: 250, Wave: "square",
+ DroneFreqs: []float64{92.50, 138.59, 185.00, 277.18},
+ Attack: 0.02, Release: 0.04, CutoffMin: 2400, CutoffMax: 7500, DetuneCents: 15,
+ Drums: pat("kick", "kick", "hat", "kick", "snare", "kick", "hat", "snare", "kick", "kick", "hat", "kick", "snare", "kick", "hat", "clap"),
Melody: wildMel,
}
return s
}
// ════════════════════════════════════════════════════════════════════
-// BRUTALIST – concrete minimalism, D major
+// BRUTALIST – concrete demolition, C minor, 140/210
// ════════════════════════════════════════════════════════════════════
func soundsBrutalist() themeSounds {
var s themeSounds
- s.Splash.Freqs = []float64{100, 150, 200, 120}
- s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.07, 0.14, "square"
- s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 120, "square", 0.07, 0.13
- s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "square", 200, 400, 0.12, 0.11
- s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "square", 400, 100, 0.14, 0.1
- s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "square", 120, 60, 0.1, 0.12
-
- d, a := major(73.42), major(55.00)
+ s.Splash.Freqs = []float64{261.63, 329.63, 392.00, 523.25}
+ s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.09, 0.1, "square"
+ s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 440, "square", 0.06, 0.11
+ s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "square", 440, 880, 0.15, 0.1
+ s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "square", 660, 220, 0.15, 0.09
+ s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "square", 200, 100, 0.1, 0.1
- normalMel := buildSong(
- [4]float64{146.83, 110.00, 146.83, 110.00}, [4][3]float64{d, a, d, a},
+ cm, gm, dm := minor(65.41), minor(98.00), minor(73.42)
+ normalMel := buildRockSong(
+ [4]float64{130.81, 196.00, 146.83, 130.81}, [4][3]float64{cm, gm, dm, cm},
[4][]melodyNote{
- buildSwingMelody([]float64{293.66, 349.23, 392.00, 293.66}, 0.5),
- buildSwingMelody([]float64{220.00, 261.63, 293.66, 220.00}, 0.5),
- buildSwingMelody([]float64{293.66, 392.00, 440.00, 293.66}, 0.5),
- buildSwingMelody([]float64{220.00, 293.66, 349.23, 220.00}, 0.5),
- }, 0.5)
- wildMel := buildSong(
- [4]float64{293.66, 220.00, 293.66, 220.00}, [4][3]float64{d, a, d, a},
+ buildDriveMelody([]float64{261.63, 311.13, 392.00, 523.25}, 0.268),
+ buildDriveMelody([]float64{392.00, 415.30, 523.25, 392.00}, 0.268),
+ buildDriveMelody([]float64{293.66, 349.23, 392.00, 293.66}, 0.268),
+ buildDriveMelody([]float64{261.63, 311.13, 392.00, 523.25}, 0.268),
+ }, 0.268)
+ wildMel := buildRockSong(
+ [4]float64{261.63, 196.00, 146.83, 261.63}, [4][3]float64{cm, gm, dm, cm},
[4][]melodyNote{
- buildSwingMelody([]float64{587.33, 698.46, 783.99, 587.33}, 0.25),
- buildSwingMelody([]float64{440.00, 523.25, 587.33, 440.00}, 0.25),
- buildSwingMelody([]float64{587.33, 783.99, 880.00, 587.33}, 0.25),
- buildSwingMelody([]float64{440.00, 587.33, 698.46, 440.00}, 0.25),
- }, 0.25)
+ buildStabMelody([]float64{523.25, 622.25, 783.99, 1046.5}, 0.134),
+ buildStabMelody([]float64{783.99, 830.61, 1046.5, 783.99}, 0.134),
+ buildStabMelody([]float64{587.33, 698.46, 783.99, 587.33}, 0.134),
+ buildStabMelody([]float64{523.25, 622.25, 783.99, 1046.5}, 0.134),
+ }, 0.134)
s.Ambient.Normal = ambientPreset{
- Gain: 0.03, BPM: 60, Wave: "triangle",
- DroneFreqs: []float64{73.42, 110.00, 146.83},
- Attack: 0.5, Release: 1.0,
- Drums: pat("kick", "kick", "hat", "kick", "snare", "kick", "hat", "kick", "kick", "kick", "hat", "clap", "snare", "kick", "hat", "kick"),
+ Gain: 0.03, BPM: 140, Wave: "square",
+ DroneFreqs: []float64{65.41, 98.00, 130.81},
+ Attack: 0.02, Release: 0.15, CutoffMin: 1200, CutoffMax: 5000,
+ Drums: pat("kick", "_", "hat", "kick", "snare", "kick", "hat", "kick", "kick", "kick", "hat", "snare", "kick", "_", "hat", "clap"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.065, BPM: 120, Wave: "square",
- DroneFreqs: []float64{146.83, 220.00, 293.66},
- Attack: 0.05, Release: 0.3,
- Drums: pat("kick", "kick", "hat", "kick", "snare", "kick", "hat", "kick", "kick", "kick", "hat", "clap", "snare", "kick", "hat", "kick"),
+ Gain: 0.065, BPM: 210, Wave: "square",
+ DroneFreqs: []float64{65.41, 98.00, 130.81, 196.00},
+ Attack: 0.02, Release: 0.05, CutoffMin: 2000, CutoffMax: 7000, DetuneCents: 18,
+ Drums: pat("kick", "kick", "hat", "kick", "snare", "kick", "hat", "kick", "kick", "kick", "hat", "snare", "kick", "kick", "hat", "clap"),
Melody: wildMel,
}
return s
}
// ════════════════════════════════════════════════════════════════════
-// VOLCANO – molten, C major
+// VOLCANO – molten hardstyle, D minor, 160/240
// ════════════════════════════════════════════════════════════════════
func soundsVolcano() themeSounds {
var s themeSounds
- s.Splash.Freqs = []float64{196, 246.94, 293.66, 349.23}
- s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.08, 0.1, "sine"
- s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 180, "sine", 0.09, 0.11
- s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "triangle", 261.63, 523.25, 0.16, 0.1
- s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 392, 98, 0.17, 0.09
- s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "sine", 160, 80, 0.13, 0.1
-
- c, d, f, g := major(65.41), major(73.42), major(87.31), major(98.00)
-
- normalMel := buildSong(
- [4]float64{130.81, 146.83, 174.61, 196.00}, [4][3]float64{c, d, f, g},
+ s.Splash.Freqs = []float64{293.66, 369.99, 440.00, 587.33}
+ s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.09, 0.095, "triangle"
+ s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 196, "triangle", 0.085, 0.1
+ s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "triangle", 293.66, 587.33, 0.16, 0.1
+ s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 440, 146.83, 0.18, 0.09
+ s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "triangle", 130, 65, 0.12, 0.09
+
+ dm, am, gm := minor(73.42), power(110.00), power(98.00)
+ normalMel := buildRockSong(
+ [4]float64{146.83, 220.00, 196.00, 146.83}, [4][3]float64{dm, am, gm, dm},
[4][]melodyNote{
- buildSwingMelody([]float64{261.63, 293.66, 329.63, 261.63}, 0.5),
- buildSwingMelody([]float64{293.66, 349.23, 392.00, 293.66}, 0.5),
- buildSwingMelody([]float64{349.23, 440.00, 523.25, 349.23}, 0.5),
- buildSwingMelody([]float64{392.00, 440.00, 493.88, 392.00}, 0.5),
- }, 0.5)
- wildMel := buildSong(
- [4]float64{261.63, 293.66, 349.23, 392.00}, [4][3]float64{c, d, f, g},
+ buildDriveMelody([]float64{293.66, 349.23, 440.00, 493.88}, 0.233),
+ buildDriveMelody([]float64{440.00, 493.88, 587.33, 440.00}, 0.233),
+ buildDriveMelody([]float64{392.00, 440.00, 493.88, 392.00}, 0.233),
+ buildDriveMelody([]float64{293.66, 349.23, 440.00, 587.33}, 0.233),
+ }, 0.233)
+ wildMel := buildRockSong(
+ [4]float64{293.66, 440.00, 392.00, 293.66}, [4][3]float64{dm, am, gm, dm},
[4][]melodyNote{
- buildSwingMelody([]float64{523.25, 587.33, 659.25, 523.25}, 0.25),
- buildSwingMelody([]float64{587.33, 698.46, 783.99, 587.33}, 0.25),
- buildSwingMelody([]float64{698.46, 880.00, 1046.5, 698.46}, 0.25),
- buildSwingMelody([]float64{783.99, 880.00, 987.77, 783.99}, 0.25),
- }, 0.25)
+ buildStabMelody([]float64{587.33, 698.46, 880.00, 987.77}, 0.117),
+ buildStabMelody([]float64{880.00, 987.77, 1174.66, 880.00}, 0.117),
+ buildStabMelody([]float64{783.99, 880.00, 987.77, 783.99}, 0.117),
+ buildStabMelody([]float64{587.33, 698.46, 880.00, 1174.66}, 0.117),
+ }, 0.117)
s.Ambient.Normal = ambientPreset{
- Gain: 0.03, BPM: 60, Wave: "sine",
- DroneFreqs: []float64{65.41, 130.81, 174.61},
- Attack: 1.0, Release: 2.0,
- Drums: pat("kick", "_", "hat", "_", "_", "snare", "hat", "_", "_", "kick", "hat", "_", "_", "snare", "hat", "_"),
+ Gain: 0.03, BPM: 160, Wave: "square",
+ DroneFreqs: []float64{73.42, 110.00, 146.83},
+ Attack: 0.02, Release: 0.15, CutoffMin: 1200, CutoffMax: 5000,
+ Drums: pat("kick", "hat", "kick", "hat", "snare", "kick", "hat", "snare", "kick", "kick", "hat", "kick", "snare", "_", "hat", "clap"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.06, BPM: 110, Wave: "triangle",
- DroneFreqs: []float64{130.81, 261.63, 349.23},
- Attack: 0.2, Release: 0.6, NoiseGain: 0.015,
- Drums: pat("kick", "_", "hat", "_", "_", "snare", "hat", "_", "_", "kick", "hat", "_", "_", "snare", "hat", "_"),
+ Gain: 0.065, BPM: 240, Wave: "square",
+ DroneFreqs: []float64{73.42, 110.00, 146.83, 196.00},
+ Attack: 0.02, Release: 0.05, CutoffMin: 2000, CutoffMax: 7000, DetuneCents: 12,
+ Drums: pat("kick", "kick", "hat", "kick", "snare", "kick", "hat", "snare", "kick", "kick", "hat", "kick", "snare", "kick", "hat", "clap"),
Melody: wildMel,
}
return s
}
// ════════════════════════════════════════════════════════════════════
-// AURORA – ethereal, E major
+// AURORA – arctic storm surge, G major, 130/190
// ════════════════════════════════════════════════════════════════════
func soundsAurora() themeSounds {
var s themeSounds
- s.Splash.Freqs = []float64{659.25, 880, 987.77, 1046.5}
- s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.07, 0.085, "sine"
- s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 440, "sine", 0.1, 0.09
- s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "sine", 523.25, 880, 0.2, 0.09
- s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 704, 352, 0.18, 0.085
- s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "sine", 220, 110, 0.15, 0.08
-
- e, bcm, a := major(82.41), minor(69.30), major(55.00)
-
- normalMel := buildSong(
- [4]float64{164.81, 138.59, 110.00, 164.81}, [4][3]float64{e, bcm, a, e},
+ s.Splash.Freqs = []float64{392.00, 493.88, 587.33, 783.99}
+ s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.08, 0.09, "sine"
+ s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 261.63, "triangle", 0.085, 0.1
+ s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "sine", 390, 780, 0.16, 0.1
+ s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 523, 196, 0.18, 0.09
+ s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "triangle", 180, 90, 0.12, 0.09
+
+ gm, d, em, c := power(98.00), power(73.42), power(82.41), power(65.41)
+ normalMel := buildRockSong(
+ [4]float64{196.00, 146.83, 164.81, 130.81}, [4][3]float64{gm, d, em, c},
[4][]melodyNote{
- buildSwingMelody([]float64{329.63, 369.99, 440.00, 329.63}, 0.5),
- buildSwingMelody([]float64{277.18, 329.63, 369.99, 277.18}, 0.5),
- buildSwingMelody([]float64{220.00, 261.63, 293.66, 220.00}, 0.5),
- buildSwingMelody([]float64{329.63, 369.99, 440.00, 329.63}, 0.5),
- }, 0.5)
- wildMel := buildSong(
- [4]float64{329.63, 277.18, 220.00, 329.63}, [4][3]float64{e, bcm, a, e},
+ buildDriveMelody([]float64{392.00, 440.00, 493.88, 587.33}, 0.288),
+ buildDriveMelody([]float64{293.66, 349.23, 392.00, 440.00}, 0.288),
+ buildDriveMelody([]float64{329.63, 392.00, 440.00, 523.25}, 0.288),
+ buildDriveMelody([]float64{261.63, 329.63, 392.00, 523.25}, 0.288),
+ }, 0.288)
+ wildMel := buildRockSong(
+ [4]float64{196.00, 146.83, 164.81, 130.81}, [4][3]float64{gm, d, em, c},
[4][]melodyNote{
- buildSwingMelody([]float64{659.25, 739.99, 880.00, 659.25}, 0.25),
- buildSwingMelody([]float64{554.37, 659.25, 739.99, 554.37}, 0.25),
- buildSwingMelody([]float64{440.00, 523.25, 587.33, 440.00}, 0.25),
- buildSwingMelody([]float64{659.25, 739.99, 880.00, 659.25}, 0.25),
- }, 0.25)
+ buildStabMelody([]float64{783.99, 880.00, 987.77, 1174.66}, 0.144),
+ buildStabMelody([]float64{587.33, 698.46, 783.99, 880.00}, 0.144),
+ buildStabMelody([]float64{659.25, 783.99, 880.00, 1046.5}, 0.144),
+ buildStabMelody([]float64{523.25, 659.25, 783.99, 1046.5}, 0.144),
+ }, 0.144)
s.Ambient.Normal = ambientPreset{
- Gain: 0.028, BPM: 60, Wave: "sine",
- DroneFreqs: []float64{82.41, 110.00, 138.59, 164.81},
- Attack: 1.2, Release: 2.5,
- Drums: pat("kick", "_", "_", "hat", "_", "_", "hat", "_", "kick", "_", "_", "hat", "_", "snare", "hat", "_"),
+ Gain: 0.03, BPM: 130, Wave: "square",
+ DroneFreqs: []float64{98.00, 146.83, 196.00},
+ Attack: 0.02, Release: 0.18, CutoffMin: 1000, CutoffMax: 4500,
+ Drums: pat("kick", "_", "hat", "_", "kick", "_", "hat", "_", "kick", "_", "hat", "_", "snare", "_", "hat", "_"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.055, BPM: 120, Wave: "sine",
- DroneFreqs: []float64{164.81, 220.00, 277.18, 329.63},
- Attack: 0.3, Release: 0.8, DetuneCents: 20,
- Drums: pat("kick", "_", "_", "hat", "_", "_", "hat", "_", "kick", "_", "_", "hat", "_", "snare", "hat", "_"),
+ Gain: 0.055, BPM: 190, Wave: "square",
+ DroneFreqs: []float64{98.00, 146.83, 196.00, 261.63},
+ Attack: 0.02, Release: 0.08, CutoffMin: 1800, CutoffMax: 6000, DetuneCents: 12,
+ Drums: pat("kick", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "kick", "hat", "snare", "hat", "kick", "kick", "hat", "clap"),
Melody: wildMel,
}
return s
}
// ════════════════════════════════════════════════════════════════════
-// MATRIX – cyberpunk, E minor
+// MATRIX – hard-grid cyberpunk, C minor, 160/240
// ════════════════════════════════════════════════════════════════════
func soundsMatrix() themeSounds {
var s themeSounds
- s.Splash.Freqs = []float64{523.25, 587.33, 659.25, 698.46}
- s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.05, 0.09, "square"
- s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 523.25, "square", 0.045, 0.11
- s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "square", 880, 1318.5, 0.11, 0.1
- s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "square", 880, 330, 0.13, 0.09
- s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "square", 260, 130, 0.1, 0.09
-
- e, dd, c, b := minor(82.41), major(73.42), major(65.41), major(61.74)
-
- normalMel := buildSong(
- [4]float64{164.81, 146.83, 130.81, 123.47}, [4][3]float64{e, dd, c, b},
+ s.Splash.Freqs = []float64{261.63, 311.13, 392.00, 466.16}
+ s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.08, 0.1, "square"
+ s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 440, "square", 0.055, 0.11
+ s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "square", 440, 880, 0.13, 0.1
+ s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "square", 660, 220, 0.15, 0.09
+ s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "square", 180, 90, 0.1, 0.1
+
+ cm, fm, gm, cm2 := minor(65.41), power(87.31), power(98.00), minor(130.81)
+ normalMel := buildRockSong(
+ [4]float64{130.81, 196.00, 196.00, 130.81}, [4][3]float64{cm, fm, gm, cm2},
[4][]melodyNote{
- buildSwingMelody([]float64{329.63, 392.00, 440.00, 329.63}, 0.5),
- buildSwingMelody([]float64{293.66, 349.23, 392.00, 293.66}, 0.5),
- buildSwingMelody([]float64{261.63, 329.63, 392.00, 261.63}, 0.5),
- buildSwingMelody([]float64{246.94, 293.66, 349.23, 246.94}, 0.5),
- }, 0.5)
- wildMel := buildSong(
- [4]float64{329.63, 293.66, 261.63, 246.94}, [4][3]float64{e, dd, c, b},
+ buildDriveMelody([]float64{523.25, 587.33, 659.25, 783.99}, 0.233),
+ buildDriveMelody([]float64{698.46, 783.99, 880.00, 523.25}, 0.233),
+ buildDriveMelody([]float64{783.99, 880.00, 932.33, 587.33}, 0.233),
+ buildDriveMelody([]float64{523.25, 659.25, 783.99, 932.33}, 0.233),
+ }, 0.233)
+ wildMel := buildRockSong(
+ [4]float64{261.63, 392.00, 392.00, 261.63}, [4][3]float64{cm, fm, gm, cm2},
[4][]melodyNote{
- buildSwingMelody([]float64{659.25, 783.99, 880.00, 659.25}, 0.25),
- buildSwingMelody([]float64{587.33, 698.46, 783.99, 587.33}, 0.25),
- buildSwingMelody([]float64{523.25, 659.25, 783.99, 523.25}, 0.25),
- buildSwingMelody([]float64{493.88, 587.33, 698.46, 493.88}, 0.25),
- }, 0.25)
+ buildStabMelody([]float64{1046.5, 1174.66, 1318.5, 1567.98}, 0.117),
+ buildStabMelody([]float64{1396.92, 1567.98, 1760.00, 1046.5}, 0.117),
+ buildStabMelody([]float64{1567.98, 1760.00, 1864.66, 1174.66}, 0.117),
+ buildStabMelody([]float64{1046.5, 1318.5, 1567.98, 1864.66}, 0.117),
+ }, 0.117)
s.Ambient.Normal = ambientPreset{
- Gain: 0.03, BPM: 70, Wave: "square",
- DroneFreqs: []float64{82.41, 130.81, 164.81},
- Attack: 0.1, Release: 0.3,
- Drums: pat("kick", "_", "hat", "_", "kick", "snare", "hat", "_", "kick", "_", "hat", "_", "snare", "hat", "kick", "_"),
+ Gain: 0.028, BPM: 160, Wave: "square",
+ DroneFreqs: []float64{65.41, 130.81, 196.00},
+ Attack: 0.02, Release: 0.12, CutoffMin: 1200, CutoffMax: 5000, DetuneCents: 6,
+ Drums: pat("kick", "_", "hat", "_", "kick", "snare", "hat", "_", "kick", "_", "hat", "_", "snare", "_", "hat", "_"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.07, BPM: 150, Wave: "square",
- DroneFreqs: []float64{164.81, 261.63, 329.63},
- Attack: 0.05, Release: 0.15,
- Drums: pat("kick", "_", "hat", "_", "kick", "snare", "hat", "_", "kick", "_", "hat", "_", "snare", "hat", "kick", "_"),
+ Gain: 0.065, BPM: 240, Wave: "square",
+ DroneFreqs: []float64{130.81, 196.00, 261.63, 392.00},
+ Attack: 0.02, Release: 0.04, CutoffMin: 2000, CutoffMax: 7000, DetuneCents: 18,
+ Drums: pat("kick", "kick", "hat", "kick", "snare", "kick", "hat", "kick", "kick", "kick", "hat", "snare", "kick", "kick", "hat", "clap"),
Melody: wildMel,
}
return s
}
// ════════════════════════════════════════════════════════════════════
-// OCEAN – flowing, G major
+// OCEAN – deep-current surge, E minor, 130/200
// ════════════════════════════════════════════════════════════════════
func soundsOcean() themeSounds {
var s themeSounds
- s.Splash.Freqs = []float64{174.61, 196, 220, 246.94}
- s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.095, 0.095, "sine"
- s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 196, "triangle", 0.1, 0.09
- s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "sine", 349.23, 523.25, 0.2, 0.09
- s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 415.3, 246.94, 0.18, 0.085
- s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "sine", 140, 70, 0.15, 0.08
-
- g, d, em, c := major(98.00), major(73.42), minor(82.41), major(65.41)
-
- normalMel := buildSong(
- [4]float64{196.00, 146.83, 164.81, 130.81}, [4][3]float64{g, d, em, c},
+ s.Splash.Freqs = []float64{329.63, 392.00, 493.88, 587.33}
+ s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.09, 0.095, "triangle"
+ s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 220, "sine", 0.08, 0.1
+ s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "triangle", 329.63, 659.25, 0.18, 0.1
+ s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 493.88, 164.81, 0.18, 0.09
+ s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "triangle", 140, 70, 0.12, 0.09
+
+ em, c, d, e2 := minor(82.41), power(65.41), power(73.42), minor(164.81)
+ normalMel := buildRockSong(
+ [4]float64{164.81, 130.81, 146.83, 329.63}, [4][3]float64{em, c, d, e2},
[4][]melodyNote{
- buildSwingMelody([]float64{392.00, 440.00, 493.88, 392.00}, 0.5),
- buildSwingMelody([]float64{293.66, 349.23, 392.00, 293.66}, 0.5),
- buildSwingMelody([]float64{329.63, 392.00, 440.00, 329.63}, 0.5),
- buildSwingMelody([]float64{261.63, 329.63, 392.00, 261.63}, 0.5),
- }, 0.5)
- wildMel := buildSong(
- [4]float64{392.00, 293.66, 329.63, 261.63}, [4][3]float64{g, d, em, c},
+ buildDriveMelody([]float64{329.63, 392.00, 440.00, 493.88}, 0.288),
+ buildDriveMelody([]float64{261.63, 311.13, 392.00, 440.00}, 0.288),
+ buildDriveMelody([]float64{293.66, 349.23, 440.00, 523.25}, 0.288),
+ buildDriveMelody([]float64{329.63, 392.00, 493.88, 659.25}, 0.288),
+ }, 0.288)
+ wildMel := buildRockSong(
+ [4]float64{329.63, 261.63, 293.66, 659.25}, [4][3]float64{em, c, d, e2},
[4][]melodyNote{
- buildSwingMelody([]float64{783.99, 880.00, 987.77, 783.99}, 0.25),
- buildSwingMelody([]float64{587.33, 698.46, 783.99, 587.33}, 0.25),
- buildSwingMelody([]float64{659.25, 783.99, 880.00, 659.25}, 0.25),
- buildSwingMelody([]float64{523.25, 659.25, 783.99, 523.25}, 0.25),
- }, 0.25)
+ buildStabMelody([]float64{659.25, 783.99, 880.00, 987.77}, 0.144),
+ buildStabMelody([]float64{523.25, 622.25, 783.99, 880.00}, 0.144),
+ buildStabMelody([]float64{587.33, 698.46, 880.00, 1046.5}, 0.144),
+ buildStabMelody([]float64{659.25, 783.99, 987.77, 1318.5}, 0.144),
+ }, 0.144)
s.Ambient.Normal = ambientPreset{
- Gain: 0.028, BPM: 60, Wave: "sine",
- DroneFreqs: []float64{98.00, 130.81, 164.81, 196.00},
- Attack: 1.5, Release: 3.0, NoiseGain: 0.02,
- Drums: pat("kick", "_", "hat", "_", "_", "snare", "hat", "_", "kick", "_", "hat", "_", "_", "snare", "hat", "_"),
+ Gain: 0.028, BPM: 130, Wave: "square",
+ DroneFreqs: []float64{82.41, 130.81, 164.81},
+ Attack: 0.02, Release: 0.18, CutoffMin: 1000, CutoffMax: 4500,
+ Drums: pat("kick", "_", "hat", "_", "kick", "_", "hat", "_", "kick", "_", "hat", "_", "snare", "_", "hat", "_"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.06, BPM: 120, Wave: "triangle",
- DroneFreqs: []float64{196.00, 261.63, 329.63, 392.00},
- Attack: 0.3, Release: 0.7, NoiseGain: 0.04,
- Drums: pat("kick", "_", "hat", "_", "_", "snare", "hat", "_", "kick", "_", "hat", "_", "_", "snare", "hat", "_"),
+ Gain: 0.055, BPM: 200, Wave: "square",
+ DroneFreqs: []float64{82.41, 130.81, 164.81, 196.00},
+ Attack: 0.02, Release: 0.08, CutoffMin: 1800, CutoffMax: 6500, DetuneCents: 12,
+ Drums: pat("kick", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "kick", "hat", "snare", "hat", "kick", "kick", "hat", "clap"),
Melody: wildMel,
}
return s
}
// ════════════════════════════════════════════════════════════════════
-// DOS – 8-bit chip-tune, C major
+// DOS – chiptune blast, C major, 180/260
// ════════════════════════════════════════════════════════════════════
func soundsDos() themeSounds {
var s themeSounds
- s.Splash.Freqs = []float64{800, 1000}
- s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.08, 0.12, "square"
- s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 1000, "square", 0.03, 0.1
- s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "square", 400, 800, 0.1, 0.1
- s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "square", 800, 200, 0.1, 0.09
- s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "square", 300, 150, 0.08, 0.1
-
- c, gg, am, ff := major(65.41), major(98.00), minor(110.00), major(87.31)
-
- normalMel := buildSong(
- [4]float64{130.81, 196.00, 220.00, 174.61}, [4][3]float64{c, gg, am, ff},
+ s.Splash.Freqs = []float64{261.63, 329.63, 392.00, 523.25}
+ s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.06, 0.08, "square"
+ s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 440, "square", 0.05, 0.11
+ s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "square", 440, 880, 0.14, 0.1
+ s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "square", 660, 220, 0.15, 0.09
+ s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "square", 180, 90, 0.1, 0.1
+
+ c, f, g1, c2 := power(65.41), power(87.31), power(98.00), power(130.81)
+ normalMel := buildRockSong(
+ [4]float64{130.81, 174.61, 196.00, 130.81}, [4][3]float64{c, f, g1, c2},
[4][]melodyNote{
- buildSwingMelody([]float64{523.25, 587.33, 659.25, 523.25}, 0.5),
- buildSwingMelody([]float64{783.99, 880.00, 987.77, 783.99}, 0.5),
- buildSwingMelody([]float64{880.00, 1046.5, 1174.66, 880.00}, 0.5),
- buildSwingMelody([]float64{698.46, 783.99, 880.00, 698.46}, 0.5),
- }, 0.5)
- wildMel := buildSong(
- [4]float64{261.63, 392.00, 440.00, 349.23}, [4][3]float64{c, gg, am, ff},
+ buildDriveMelody([]float64{523.25, 587.33, 659.25, 783.99}, 0.2),
+ buildDriveMelody([]float64{698.46, 783.99, 880.00, 1046.5}, 0.2),
+ buildDriveMelody([]float64{783.99, 880.00, 1046.5, 783.99}, 0.2),
+ buildDriveMelody([]float64{523.25, 659.25, 783.99, 1046.5}, 0.2),
+ }, 0.2)
+ wildMel := buildRockSong(
+ [4]float64{261.63, 349.23, 392.00, 261.63}, [4][3]float64{c, f, g1, c2},
[4][]melodyNote{
- buildSwingMelody([]float64{1046.5, 1174.66, 1318.5, 1046.5}, 0.25),
- buildSwingMelody([]float64{1567.98, 1760.00, 1975.53, 1567.98}, 0.25),
- buildSwingMelody([]float64{1760.00, 2093.0, 2349.32, 1760.00}, 0.25),
- buildSwingMelody([]float64{1396.92, 1567.98, 1760.00, 1396.92}, 0.25),
- }, 0.25)
+ buildStabMelody([]float64{1046.5, 1174.66, 1318.5, 1567.98}, 0.1),
+ buildStabMelody([]float64{1396.92, 1567.98, 1760.00, 2093.0}, 0.1),
+ buildStabMelody([]float64{1567.98, 1760.00, 2093.0, 1567.98}, 0.1),
+ buildStabMelody([]float64{1046.5, 1318.5, 1567.98, 2093.0}, 0.1),
+ }, 0.1)
s.Ambient.Normal = ambientPreset{
- Gain: 0.03, BPM: 75, Wave: "square",
- DroneFreqs: []float64{65.41, 130.81, 196.00, 220.00},
- Attack: 0.05, Release: 0.15,
- Drums: pat("kick", "hat", "snare", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "snare", "hat"),
+ Gain: 0.03, BPM: 180, Wave: "square",
+ DroneFreqs: []float64{130.81, 196.00, 261.63},
+ Attack: 0.02, Release: 0.1, CutoffMin: 1500, CutoffMax: 6000,
+ Drums: pat("kick", "_", "hat", "kick", "snare", "kick", "hat", "kick", "kick", "_", "hat", "snare", "kick", "kick", "hat", "clap"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.07, BPM: 180, Wave: "square",
- DroneFreqs: []float64{130.81, 261.63, 392.00, 440.00},
- Attack: 0.02, Release: 0.08,
- Drums: pat("kick", "hat", "snare", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "snare", "hat"),
+ Gain: 0.065, BPM: 260, Wave: "square",
+ DroneFreqs: []float64{130.81, 196.00, 261.63, 392.00},
+ Attack: 0.02, Release: 0.03, CutoffMin: 2500, CutoffMax: 7500, DetuneCents: 8,
+ Drums: pat("kick", "kick", "hat", "kick", "snare", "kick", "hat", "kick", "kick", "kick", "hat", "snare", "kick", "kick", "hat", "clap"),
Melody: wildMel,
}
return s
}
// ════════════════════════════════════════════════════════════════════
-// RETRO – warm nostalgia, C major
+// RETRO – CRT scanline banger, A minor, 140/200
// ════════════════════════════════════════════════════════════════════
func soundsRetro() themeSounds {
var s themeSounds
- s.Splash.Freqs = []float64{1046.5, 1318.5}
- s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.12, 0.1, "square"
- s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 1200, "square", 0.04, 0.11
- s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "square", 800, 1600, 0.14, 0.1
- s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "square", 1600, 400, 0.15, 0.09
- s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "square", 400, 200, 0.1, 0.1
-
- c, am, f, ggg := major(65.41), minor(55.00), major(87.31), major(98.00)
-
- normalMel := buildSong(
- [4]float64{130.81, 110.00, 174.61, 196.00}, [4][3]float64{c, am, f, ggg},
+ s.Splash.Freqs = []float64{220.00, 261.63, 329.63, 440.00}
+ s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.08, 0.09, "sine"
+ s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 164.81, "triangle", 0.085, 0.1
+ s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "triangle", 220, 440, 0.16, 0.1
+ s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 330, 110, 0.16, 0.09
+ s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "triangle", 150, 75, 0.12, 0.09
+
+ am, dm, em, am2 := minor(55.00), minor(73.42), minor(82.41), minor(110.00)
+ normalMel := buildRockSong(
+ [4]float64{110.00, 146.83, 164.81, 110.00}, [4][3]float64{am, dm, em, am2},
[4][]melodyNote{
- buildSwingMelody([]float64{261.63, 329.63, 392.00, 261.63}, 0.5),
- buildSwingMelody([]float64{220.00, 261.63, 293.66, 220.00}, 0.5),
- buildSwingMelody([]float64{349.23, 392.00, 440.00, 349.23}, 0.5),
- buildSwingMelody([]float64{392.00, 440.00, 493.88, 392.00}, 0.5),
- }, 0.5)
- wildMel := buildSong(
- [4]float64{261.63, 220.00, 349.23, 392.00}, [4][3]float64{c, am, f, ggg},
+ buildDriveMelody([]float64{220.00, 293.66, 329.63, 440.00}, 0.268),
+ buildDriveMelody([]float64{293.66, 349.23, 392.00, 440.00}, 0.268),
+ buildDriveMelody([]float64{329.63, 392.00, 440.00, 493.88}, 0.268),
+ buildDriveMelody([]float64{220.00, 261.63, 329.63, 440.00}, 0.268),
+ }, 0.268)
+ wildMel := buildRockSong(
+ [4]float64{220.00, 146.83, 164.81, 220.00}, [4][3]float64{am, dm, em, am2},
[4][]melodyNote{
- buildSwingMelody([]float64{523.25, 659.25, 783.99, 523.25}, 0.25),
- buildSwingMelody([]float64{440.00, 523.25, 587.33, 440.00}, 0.25),
- buildSwingMelody([]float64{698.46, 783.99, 880.00, 698.46}, 0.25),
- buildSwingMelody([]float64{783.99, 880.00, 987.77, 783.99}, 0.25),
- }, 0.25)
+ buildStabMelody([]float64{440.00, 587.33, 659.25, 880.00}, 0.134),
+ buildStabMelody([]float64{587.33, 698.46, 783.99, 880.00}, 0.134),
+ buildStabMelody([]float64{659.25, 783.99, 880.00, 987.77}, 0.134),
+ buildStabMelody([]float64{440.00, 523.25, 659.25, 880.00}, 0.134),
+ }, 0.134)
s.Ambient.Normal = ambientPreset{
- Gain: 0.03, BPM: 70, Wave: "square",
- DroneFreqs: []float64{65.41, 110.00, 130.81, 174.61},
- Attack: 0.1, Release: 0.3,
+ Gain: 0.028, BPM: 140, Wave: "square",
+ DroneFreqs: []float64{55.00, 110.00, 164.81},
+ Attack: 0.02, Release: 0.18, CutoffMin: 1000, CutoffMax: 4500,
Drums: pat("kick", "_", "hat", "_", "kick", "_", "hat", "_", "kick", "_", "hat", "_", "snare", "_", "hat", "_"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.06, BPM: 140, Wave: "square",
- DroneFreqs: []float64{130.81, 220.00, 261.63, 349.23},
- Attack: 0.05, Release: 0.15, DetuneCents: 30, NoiseGain: 0.02,
- Drums: pat("kick", "_", "hat", "_", "kick", "_", "hat", "_", "kick", "_", "hat", "_", "snare", "_", "hat", "_"),
+ Gain: 0.055, BPM: 200, Wave: "square",
+ DroneFreqs: []float64{110.00, 220.00, 261.63, 329.63},
+ Attack: 0.02, Release: 0.06, CutoffMin: 1800, CutoffMax: 6500, DetuneCents: 10,
+ Drums: pat("kick", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "kick", "hat", "snare", "hat", "kick", "kick", "hat", "clap"),
Melody: wildMel,
}
return s
}
// ════════════════════════════════════════════════════════════════════
-// COSMOS – vast space, A major
+// COSMOS – supernova impact, D minor, 150/220
// ════════════════════════════════════════════════════════════════════
func soundsCosmos() themeSounds {
var s themeSounds
- s.Splash.Freqs = []float64{220, 277.18, 329.63, 392}
- s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.09, 0.09, "sine"
- s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 277.18, "sine", 0.09, 0.09
- s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "triangle", 392, 587.33, 0.22, 0.09
- s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 587.33, 196, 0.2, 0.085
- s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "sine", 170, 85, 0.16, 0.08
-
- a, ddd, ccc, g := major(55.00), major(73.42), major(65.41), major(98.00)
-
- normalMel := buildSong(
- [4]float64{110.00, 146.83, 130.81, 196.00}, [4][3]float64{a, ddd, ccc, g},
- [4][]melodyNote{
- buildSwingMelody([]float64{220.00, 261.63, 293.66, 220.00}, 0.5),
- buildSwingMelody([]float64{293.66, 349.23, 392.00, 293.66}, 0.5),
- buildSwingMelody([]float64{261.63, 329.63, 392.00, 261.63}, 0.5),
- buildSwingMelody([]float64{392.00, 440.00, 493.88, 392.00}, 0.5),
- }, 0.5)
- wildMel := buildSong(
- [4]float64{220.00, 293.66, 261.63, 392.00}, [4][3]float64{a, ddd, ccc, g},
+ s.Splash.Freqs = []float64{293.66, 369.99, 440.00, 523.25}
+ s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.08, 0.09, "sine"
+ s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 220, "triangle", 0.08, 0.1
+ s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "triangle", 293.66, 587.33, 0.16, 0.1
+ s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 440, 146.83, 0.18, 0.09
+ s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "triangle", 150, 75, 0.12, 0.09
+
+ dm, am, gm, dm2 := minor(73.42), power(110.00), power(98.00), minor(146.83)
+ normalMel := buildRockSong(
+ [4]float64{146.83, 220.00, 196.00, 146.83}, [4][3]float64{dm, am, gm, dm2},
[4][]melodyNote{
- buildSwingMelody([]float64{440.00, 523.25, 587.33, 440.00}, 0.25),
- buildSwingMelody([]float64{587.33, 698.46, 783.99, 587.33}, 0.25),
- buildSwingMelody([]float64{523.25, 659.25, 783.99, 523.25}, 0.25),
- buildSwingMelody([]float64{783.99, 880.00, 987.77, 783.99}, 0.25),
+ buildDriveMelody([]float64{293.66, 349.23, 440.00, 493.88}, 0.25),
+ buildDriveMelody([]float64{440.00, 493.88, 587.33, 293.66}, 0.25),
+ buildDriveMelody([]float64{392.00, 440.00, 493.88, 349.23}, 0.25),
+ buildDriveMelody([]float64{293.66, 349.23, 440.00, 587.33}, 0.25),
}, 0.25)
+ wildMel := buildRockSong(
+ [4]float64{293.66, 440.00, 392.00, 293.66}, [4][3]float64{dm, am, gm, dm2},
+ [4][]melodyNote{
+ buildStabMelody([]float64{587.33, 698.46, 880.00, 987.77}, 0.125),
+ buildStabMelody([]float64{880.00, 987.77, 1174.66, 587.33}, 0.125),
+ buildStabMelody([]float64{783.99, 880.00, 987.77, 698.46}, 0.125),
+ buildStabMelody([]float64{587.33, 698.46, 880.00, 1174.66}, 0.125),
+ }, 0.125)
s.Ambient.Normal = ambientPreset{
- Gain: 0.025, BPM: 60, Wave: "sine",
- DroneFreqs: []float64{55.00, 110.00, 146.83, 196.00},
- Attack: 1.5, Release: 3.0,
- Drums: pat("kick", "_", "hat", "_", "_", "snare", "hat", "_", "kick", "_", "hat", "_", "_", "snare", "hat", "_"),
+ Gain: 0.028, BPM: 150, Wave: "square",
+ DroneFreqs: []float64{73.42, 110.00, 146.83},
+ Attack: 0.02, Release: 0.15, CutoffMin: 1200, CutoffMax: 5000,
+ Drums: pat("kick", "_", "hat", "kick", "snare", "kick", "hat", "kick", "kick", "_", "hat", "snare", "kick", "_", "hat", "clap"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.06, BPM: 120, Wave: "triangle",
- DroneFreqs: []float64{110.00, 220.00, 293.66, 392.00},
- Attack: 0.3, Release: 0.8,
- Drums: pat("kick", "_", "hat", "_", "_", "snare", "hat", "_", "kick", "_", "hat", "_", "_", "snare", "hat", "_"),
+ Gain: 0.06, BPM: 220, Wave: "square",
+ DroneFreqs: []float64{73.42, 146.83, 196.00, 293.66},
+ Attack: 0.02, Release: 0.05, CutoffMin: 2000, CutoffMax: 7000, DetuneCents: 12,
+ Drums: pat("kick", "kick", "hat", "kick", "snare", "kick", "hat", "kick", "kick", "kick", "hat", "snare", "kick", "kick", "hat", "clap"),
Melody: wildMel,
}
return s
}
// ════════════════════════════════════════════════════════════════════
-// RETROFUTURE – retro sci-fi, E minor
+// RETROFUTURE – atomic twilight stomp, E major, 140/210
// ════════════════════════════════════════════════════════════════════
func soundsRetrofuture() themeSounds {
var s themeSounds
- s.Splash.Freqs = []float64{196, 246.94, 329.63, 440}
- s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.085, 0.095, "triangle"
- s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 277.18, "triangle", 0.085, 0.1
- s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "sine", 330, 523.25, 0.18, 0.09
- s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 415.3, 165, 0.17, 0.085
- s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "triangle", 190, 95, 0.14, 0.09
-
- em, ccc, gg, ddd := minor(82.41), major(65.41), major(98.00), major(73.42)
+ s.Splash.Freqs = []float64{329.63, 415.30, 493.88, 659.25}
+ s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.09, 0.095, "triangle"
+ s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 246.94, "sine", 0.085, 0.1
+ s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "triangle", 329.63, 659.25, 0.18, 0.1
+ s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 493.88, 164.81, 0.2, 0.09
+ s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "triangle", 160, 80, 0.14, 0.09
- normalMel := buildSong(
- [4]float64{164.81, 130.81, 196.00, 146.83}, [4][3]float64{em, ccc, gg, ddd},
+ em, am, bm, e2 := power(82.41), power(55.00), power(61.74), power(164.81)
+ normalMel := buildRockSong(
+ [4]float64{164.81, 110.00, 123.47, 329.63}, [4][3]float64{em, am, bm, e2},
[4][]melodyNote{
- buildSwingMelody([]float64{329.63, 392.00, 440.00, 329.63}, 0.5),
- buildSwingMelody([]float64{261.63, 329.63, 392.00, 261.63}, 0.5),
- buildSwingMelody([]float64{392.00, 440.00, 493.88, 392.00}, 0.5),
- buildSwingMelody([]float64{293.66, 349.23, 392.00, 293.66}, 0.5),
- }, 0.5)
- wildMel := buildSong(
- [4]float64{329.63, 261.63, 392.00, 293.66}, [4][3]float64{em, ccc, gg, ddd},
+ buildDriveMelody([]float64{329.63, 392.00, 440.00, 493.88}, 0.268),
+ buildDriveMelody([]float64{220.00, 261.63, 293.66, 329.63}, 0.268),
+ buildDriveMelody([]float64{246.94, 293.66, 329.63, 369.99}, 0.268),
+ buildDriveMelody([]float64{329.63, 392.00, 493.88, 659.25}, 0.268),
+ }, 0.268)
+ wildMel := buildRockSong(
+ [4]float64{329.63, 220.00, 246.94, 329.63}, [4][3]float64{em, am, bm, e2},
[4][]melodyNote{
- buildSwingMelody([]float64{659.25, 783.99, 880.00, 659.25}, 0.25),
- buildSwingMelody([]float64{523.25, 659.25, 783.99, 523.25}, 0.25),
- buildSwingMelody([]float64{783.99, 880.00, 987.77, 783.99}, 0.25),
- buildSwingMelody([]float64{587.33, 698.46, 783.99, 587.33}, 0.25),
- }, 0.25)
+ buildStabMelody([]float64{659.25, 783.99, 880.00, 987.77}, 0.134),
+ buildStabMelody([]float64{440.00, 523.25, 587.33, 659.25}, 0.134),
+ buildStabMelody([]float64{493.88, 587.33, 659.25, 739.99}, 0.134),
+ buildStabMelody([]float64{659.25, 783.99, 987.77, 1318.5}, 0.134),
+ }, 0.134)
s.Ambient.Normal = ambientPreset{
- Gain: 0.03, BPM: 60, Wave: "triangle",
- DroneFreqs: []float64{82.41, 130.81, 164.81, 196.00},
- Attack: 0.8, Release: 1.8,
+ Gain: 0.03, BPM: 140, Wave: "square",
+ DroneFreqs: []float64{82.41, 110.00, 164.81},
+ Attack: 0.02, Release: 0.18, CutoffMin: 1000, CutoffMax: 4500,
Drums: pat("kick", "_", "hat", "_", "kick", "_", "hat", "_", "kick", "_", "hat", "_", "snare", "_", "hat", "_"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.06, BPM: 130, Wave: "square",
- DroneFreqs: []float64{164.81, 261.63, 329.63, 392.00},
- Attack: 0.05, Release: 0.15,
- Drums: pat("kick", "_", "hat", "_", "kick", "_", "hat", "_", "kick", "_", "hat", "_", "snare", "_", "hat", "_"),
+ Gain: 0.06, BPM: 210, Wave: "square",
+ DroneFreqs: []float64{82.41, 164.81, 220.00, 329.63},
+ Attack: 0.02, Release: 0.06, CutoffMin: 1800, CutoffMax: 6500, DetuneCents: 10,
+ Drums: pat("kick", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "kick", "hat", "snare", "hat", "kick", "kick", "hat", "clap"),
Melody: wildMel,
}
return s
}
// ════════════════════════════════════════════════════════════════════
-// SPACEAGE – mid-century optimism, C major
+// SPACEAGE – booster-ignition, G major, 130/200
// ════════════════════════════════════════════════════════════════════
func soundsSpaceage() themeSounds {
var s themeSounds
- s.Splash.Freqs = []float64{440, 554.37, 659.25, 880}
- s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.07, 0.085, "sine"
- s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 554.37, "triangle", 0.075, 0.09
- s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "sine", 440, 880, 0.18, 0.09
- s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 659.25, 330, 0.17, 0.085
- s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "sine", 240, 120, 0.13, 0.08
-
- c, am, ff, ggg := major(65.41), minor(55.00), major(87.31), major(98.00)
-
- normalMel := buildSong(
- [4]float64{130.81, 110.00, 174.61, 196.00}, [4][3]float64{c, am, ff, ggg},
+ s.Splash.Freqs = []float64{392.00, 493.88, 587.33, 783.99}
+ s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.1, 0.1, "sine"
+ s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 261.63, "triangle", 0.085, 0.1
+ s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "triangle", 392, 784, 0.17, 0.1
+ s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 587, 196, 0.19, 0.09
+ s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "triangle", 130, 65, 0.12, 0.09
+
+ gm, em, cm, gm2 := power(98.00), power(82.41), power(65.41), power(196.00)
+ normalMel := buildRockSong(
+ [4]float64{196.00, 164.81, 130.81, 392.00}, [4][3]float64{gm, em, cm, gm2},
[4][]melodyNote{
- buildSwingMelody([]float64{261.63, 329.63, 392.00, 261.63}, 0.5),
- buildSwingMelody([]float64{220.00, 261.63, 293.66, 220.00}, 0.5),
- buildSwingMelody([]float64{349.23, 392.00, 440.00, 349.23}, 0.5),
- buildSwingMelody([]float64{392.00, 440.00, 493.88, 392.00}, 0.5),
- }, 0.5)
- wildMel := buildSong(
- [4]float64{261.63, 220.00, 349.23, 392.00}, [4][3]float64{c, am, ff, ggg},
+ buildDriveMelody([]float64{392.00, 440.00, 493.88, 587.33}, 0.288),
+ buildDriveMelody([]float64{329.63, 369.99, 392.00, 440.00}, 0.288),
+ buildDriveMelody([]float64{261.63, 293.66, 329.63, 392.00}, 0.288),
+ buildDriveMelody([]float64{392.00, 440.00, 587.33, 783.99}, 0.288),
+ }, 0.288)
+ wildMel := buildRockSong(
+ [4]float64{392.00, 329.63, 261.63, 392.00}, [4][3]float64{gm, em, cm, gm2},
[4][]melodyNote{
- buildSwingMelody([]float64{523.25, 659.25, 783.99, 523.25}, 0.25),
- buildSwingMelody([]float64{440.00, 523.25, 587.33, 440.00}, 0.25),
- buildSwingMelody([]float64{698.46, 783.99, 880.00, 698.46}, 0.25),
- buildSwingMelody([]float64{783.99, 880.00, 987.77, 783.99}, 0.25),
- }, 0.25)
+ buildStabMelody([]float64{783.99, 880.00, 987.77, 1174.66}, 0.144),
+ buildStabMelody([]float64{659.25, 739.99, 783.99, 880.00}, 0.144),
+ buildStabMelody([]float64{523.25, 587.33, 659.25, 783.99}, 0.144),
+ buildStabMelody([]float64{783.99, 880.00, 1174.66, 1567.98}, 0.144),
+ }, 0.144)
s.Ambient.Normal = ambientPreset{
- Gain: 0.028, BPM: 60, Wave: "sine",
- DroneFreqs: []float64{65.41, 110.00, 130.81, 174.61},
- Attack: 0.8, Release: 1.5,
- Drums: pat("kick", "_", "hat", "_", "kick", "_", "hat", "_", "kick", "_", "hat", "_", "snare", "hat", "hat", "_"),
+ Gain: 0.028, BPM: 130, Wave: "square",
+ DroneFreqs: []float64{98.00, 130.81, 196.00},
+ Attack: 0.02, Release: 0.18, CutoffMin: 1000, CutoffMax: 4500,
+ Drums: pat("kick", "_", "hat", "_", "kick", "_", "hat", "_", "kick", "_", "hat", "_", "snare", "_", "hat", "_"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.06, BPM: 130, Wave: "triangle",
- DroneFreqs: []float64{130.81, 220.00, 261.63, 349.23},
- Attack: 0.1, Release: 0.4,
- Drums: pat("kick", "_", "hat", "_", "kick", "_", "hat", "_", "kick", "_", "hat", "_", "snare", "hat", "hat", "_"),
+ Gain: 0.055, BPM: 200, Wave: "square",
+ DroneFreqs: []float64{98.00, 196.00, 261.63, 392.00},
+ Attack: 0.02, Release: 0.06, CutoffMin: 1800, CutoffMax: 6500, DetuneCents: 10,
+ Drums: pat("kick", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "kick", "hat", "snare", "hat", "kick", "kick", "hat", "clap"),
Melody: wildMel,
}
return s
}
// ════════════════════════════════════════════════════════════════════
-// TROPICALE – island vacation, C major
+// TROPICAL – typhoon rush, F major, 170/260
// ════════════════════════════════════════════════════════════════════
func soundsTropical() themeSounds {
var s themeSounds
- s.Splash.Freqs = []float64{523.25, 659.25, 783.99, 1046.5}
- s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.085, 0.08, "sine"
- s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 880, "sine", 0.07, 0.07
- s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "sine", 440, 880, 0.18, 0.08
- s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 660, 330, 0.17, 0.075
- s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "sine", 200, 100, 0.12, 0.07
-
- c, gg, am, ff := major(65.41), major(98.00), minor(110.00), major(87.31)
+ s.Splash.Freqs = []float64{349.23, 440.00, 523.25, 698.46}
+ s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.09, 0.095, "triangle"
+ s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 233.08, "sine", 0.085, 0.1
+ s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "triangle", 349.23, 698.46, 0.18, 0.1
+ s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 523.25, 174.61, 0.2, 0.09
+ s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "triangle", 170, 85, 0.12, 0.09
- normalMel := buildSong(
- [4]float64{130.81, 196.00, 220.00, 174.61}, [4][3]float64{c, gg, am, ff},
+ fm, dm, gm, c := power(87.31), minor(73.42), power(98.00), power(65.41)
+ normalMel := buildRockSong(
+ [4]float64{174.61, 146.83, 196.00, 130.81}, [4][3]float64{fm, dm, gm, c},
[4][]melodyNote{
- buildSwingMelody([]float64{261.63, 293.66, 329.63, 261.63}, 0.5),
- buildSwingMelody([]float64{392.00, 440.00, 493.88, 392.00}, 0.5),
- buildSwingMelody([]float64{440.00, 523.25, 587.33, 440.00}, 0.5),
- buildSwingMelody([]float64{349.23, 392.00, 440.00, 349.23}, 0.5),
- }, 0.5)
- wildMel := buildSong(
- [4]float64{261.63, 392.00, 440.00, 349.23}, [4][3]float64{c, gg, am, ff},
+ buildDriveMelody([]float64{349.23, 440.00, 523.25, 587.33}, 0.22),
+ buildDriveMelody([]float64{293.66, 349.23, 392.00, 440.00}, 0.22),
+ buildDriveMelody([]float64{392.00, 440.00, 493.88, 523.25}, 0.22),
+ buildDriveMelody([]float64{261.63, 349.23, 392.00, 523.25}, 0.22),
+ }, 0.22)
+ wildMel := buildRockSong(
+ [4]float64{349.23, 293.66, 196.00, 261.63}, [4][3]float64{fm, dm, gm, c},
[4][]melodyNote{
- buildSwingMelody([]float64{523.25, 587.33, 659.25, 523.25}, 0.25),
- buildSwingMelody([]float64{783.99, 880.00, 987.77, 783.99}, 0.25),
- buildSwingMelody([]float64{880.00, 1046.5, 1174.66, 880.00}, 0.25),
- buildSwingMelody([]float64{698.46, 783.99, 880.00, 698.46}, 0.25),
- }, 0.25)
+ buildStabMelody([]float64{698.46, 880.00, 1046.5, 1174.66}, 0.11),
+ buildStabMelody([]float64{587.33, 698.46, 783.99, 880.00}, 0.11),
+ buildStabMelody([]float64{783.99, 880.00, 987.77, 1046.5}, 0.11),
+ buildStabMelody([]float64{523.25, 698.46, 783.99, 1046.5}, 0.11),
+ }, 0.11)
s.Ambient.Normal = ambientPreset{
- Gain: 0.028, BPM: 70, Wave: "sine",
- DroneFreqs: []float64{65.41, 130.81, 196.00, 220.00},
- Attack: 0.6, Release: 1.5, NoiseGain: 0.015,
- Drums: pat("kick", "hat", "snare", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "snare", "clap", "kick", "hat", "snare", "hat"),
+ Gain: 0.03, BPM: 170, Wave: "square",
+ DroneFreqs: []float64{87.31, 174.61, 196.00},
+ Attack: 0.02, Release: 0.15, CutoffMin: 1200, CutoffMax: 5000,
+ Drums: pat("kick", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "kick", "hat", "snare", "hat", "kick", "kick", "hat", "clap"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.06, BPM: 140, Wave: "triangle",
- DroneFreqs: []float64{130.81, 261.63, 392.00, 440.00},
- Attack: 0.1, Release: 0.3, NoiseGain: 0.03,
- Drums: pat("kick", "hat", "snare", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "snare", "clap", "kick", "hat", "snare", "hat"),
+ Gain: 0.06, BPM: 260, Wave: "square",
+ DroneFreqs: []float64{87.31, 174.61, 196.00, 261.63},
+ Attack: 0.02, Release: 0.04, CutoffMin: 2000, CutoffMax: 7500, DetuneCents: 12,
+ Drums: pat("kick", "kick", "hat", "kick", "snare", "kick", "hat", "kick", "kick", "kick", "hat", "snare", "kick", "kick", "hat", "clap"),
Melody: wildMel,
}
return s
}
// ════════════════════════════════════════════════════════════════════
-// NOIR – smoky film noir, D minor
+// NOIR – midnight chase, D minor, 130/190
// ════════════════════════════════════════════════════════════════════
func soundsNoir() themeSounds {
var s themeSounds
- s.Splash.Freqs = []float64{174.61, 220, 261.63}
- s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.12, 0.09, "sine"
- s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 196, "triangle", 0.08, 0.09
- s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "sine", 220, 392, 0.18, 0.085
- s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "triangle", 330, 165, 0.2, 0.08
- s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "triangle", 130, 65, 0.14, 0.08
-
- dm, ccc, bb, aa := minor(73.42), major(65.41), major(58.27), major(55.00)
-
- normalMel := buildSong(
- [4]float64{146.83, 130.81, 116.54, 110.00}, [4][3]float64{dm, ccc, bb, aa},
+ s.Splash.Freqs = []float64{293.66, 349.23, 440.00, 523.25}
+ s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.09, 0.09, "sine"
+ s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 196, "square", 0.055, 0.11
+ s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "triangle", 293.66, 587.33, 0.16, 0.1
+ s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 440, 146.83, 0.18, 0.09
+ s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "square", 130, 65, 0.12, 0.09
+
+ dm, am, c, dm2 := minor(73.42), minor(110.00), power(65.41), minor(146.83)
+ normalMel := buildRockSong(
+ [4]float64{146.83, 220.00, 130.81, 146.83}, [4][3]float64{dm, am, c, dm2},
[4][]melodyNote{
- buildSwingMelody([]float64{293.66, 349.23, 392.00, 293.66}, 0.5),
- buildSwingMelody([]float64{261.63, 293.66, 329.63, 261.63}, 0.5),
- buildSwingMelody([]float64{233.08, 261.63, 293.66, 233.08}, 0.5),
- buildSwingMelody([]float64{220.00, 246.94, 277.18, 220.00}, 0.5),
- }, 0.5)
- wildMel := buildSong(
- [4]float64{293.66, 261.63, 233.08, 220.00}, [4][3]float64{dm, ccc, bb, aa},
+ buildDriveMelody([]float64{293.66, 349.23, 440.00, 523.25}, 0.288),
+ buildDriveMelody([]float64{440.00, 493.88, 587.33, 293.66}, 0.288),
+ buildDriveMelody([]float64{261.63, 311.13, 392.00, 261.63}, 0.288),
+ buildDriveMelody([]float64{293.66, 349.23, 440.00, 587.33}, 0.288),
+ }, 0.288)
+ wildMel := buildRockSong(
+ [4]float64{293.66, 440.00, 261.63, 293.66}, [4][3]float64{dm, am, c, dm2},
[4][]melodyNote{
- buildSwingMelody([]float64{587.33, 698.46, 783.99, 587.33}, 0.25),
- buildSwingMelody([]float64{523.25, 587.33, 659.25, 523.25}, 0.25),
- buildSwingMelody([]float64{466.16, 523.25, 587.33, 466.16}, 0.25),
- buildSwingMelody([]float64{440.00, 493.88, 554.37, 440.00}, 0.25),
- }, 0.25)
+ buildStabMelody([]float64{587.33, 698.46, 880.00, 1046.5}, 0.144),
+ buildStabMelody([]float64{880.00, 987.77, 1174.66, 587.33}, 0.144),
+ buildStabMelody([]float64{523.25, 622.25, 783.99, 523.25}, 0.144),
+ buildStabMelody([]float64{587.33, 698.46, 880.00, 1174.66}, 0.144),
+ }, 0.144)
s.Ambient.Normal = ambientPreset{
- Gain: 0.028, BPM: 60, Wave: "sine",
- DroneFreqs: []float64{73.42, 110.00, 130.81, 146.83},
- Attack: 1.0, Release: 2.0, NoiseGain: 0.015,
- Drums: pat("kick", "_", "_", "hat", "_", "snare", "_", "hat", "kick", "_", "_", "hat", "_", "snare", "hat", "_"),
+ Gain: 0.028, BPM: 130, Wave: "square",
+ DroneFreqs: []float64{73.42, 110.00, 146.83},
+ Attack: 0.02, Release: 0.18, CutoffMin: 1000, CutoffMax: 4500,
+ Drums: pat("kick", "_", "hat", "_", "kick", "_", "hat", "_", "kick", "_", "hat", "_", "snare", "_", "hat", "_"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.055, BPM: 120, Wave: "triangle",
- DroneFreqs: []float64{146.83, 220.00, 261.63, 293.66},
- Attack: 0.3, Release: 0.7,
- Drums: pat("kick", "_", "_", "hat", "_", "snare", "_", "hat", "kick", "_", "_", "hat", "_", "snare", "hat", "_"),
+ Gain: 0.055, BPM: 190, Wave: "square",
+ DroneFreqs: []float64{73.42, 146.83, 196.00, 293.66},
+ Attack: 0.02, Release: 0.08, CutoffMin: 1800, CutoffMax: 6500, DetuneCents: 12,
+ Drums: pat("kick", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "kick", "hat", "snare", "hat", "kick", "kick", "hat", "clap"),
Melody: wildMel,
}
return s
}
// ════════════════════════════════════════════════════════════════════
-// CATHEDRAL – sacred organ, A minor
+// CATHEDRAL – bell-tower assault, C major, 120/180
// ════════════════════════════════════════════════════════════════════
func soundsCathedral() themeSounds {
var s themeSounds
- s.Splash.Freqs = []float64{293.66, 392, 587.33}
- s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.14, 0.1, "sine"
- s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 293.66, "triangle", 0.11, 0.09
- s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "sine", 392, 783.99, 0.22, 0.09
- s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 523.25, 196, 0.22, 0.085
- s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "sine", 180, 90, 0.18, 0.08
-
- am, ccc, gg, ddd := minor(55.00), major(65.41), major(98.00), major(73.42)
+ s.Splash.Freqs = []float64{261.63, 329.63, 392.00, 523.25}
+ s.Splash.Spacing, s.Splash.Gain, s.Splash.Wave = 0.1, 0.09, "sine"
+ s.Nav.Freq, s.Nav.Wave, s.Nav.Dur, s.Nav.Gain = 196, "triangle", 0.09, 0.1
+ s.Open.Wave, s.Open.Start, s.Open.End, s.Open.Dur, s.Open.Gain = "triangle", 261.63, 523.25, 0.2, 0.1
+ s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 392, 130.81, 0.22, 0.09
+ s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "triangle", 160, 80, 0.14, 0.09
- normalMel := buildSong(
- [4]float64{110.00, 130.81, 196.00, 146.83}, [4][3]float64{am, ccc, gg, ddd},
+ cm, fm, gm, c2 := power(65.41), power(87.31), power(98.00), power(130.81)
+ normalMel := buildRockSong(
+ [4]float64{130.81, 174.61, 196.00, 130.81}, [4][3]float64{cm, fm, gm, c2},
[4][]melodyNote{
- buildSwingMelody([]float64{220.00, 261.63, 293.66, 220.00}, 0.5),
- buildSwingMelody([]float64{261.63, 329.63, 392.00, 261.63}, 0.5),
- buildSwingMelody([]float64{392.00, 440.00, 493.88, 392.00}, 0.5),
- buildSwingMelody([]float64{293.66, 349.23, 392.00, 293.66}, 0.5),
- }, 0.5)
- wildMel := buildSong(
- [4]float64{220.00, 261.63, 392.00, 293.66}, [4][3]float64{am, ccc, gg, ddd},
+ buildDriveMelody([]float64{523.25, 587.33, 659.25, 783.99}, 0.31),
+ buildDriveMelody([]float64{698.46, 783.99, 880.00, 1046.5}, 0.31),
+ buildDriveMelody([]float64{783.99, 880.00, 1046.5, 783.99}, 0.31),
+ buildDriveMelody([]float64{523.25, 659.25, 783.99, 1046.5}, 0.31),
+ }, 0.31)
+ wildMel := buildRockSong(
+ [4]float64{261.63, 349.23, 392.00, 261.63}, [4][3]float64{cm, fm, gm, c2},
[4][]melodyNote{
- buildSwingMelody([]float64{440.00, 523.25, 587.33, 440.00}, 0.25),
- buildSwingMelody([]float64{523.25, 659.25, 783.99, 523.25}, 0.25),
- buildSwingMelody([]float64{783.99, 880.00, 987.77, 783.99}, 0.25),
- buildSwingMelody([]float64{587.33, 698.46, 783.99, 587.33}, 0.25),
- }, 0.25)
+ buildStabMelody([]float64{1046.5, 1174.66, 1318.5, 1567.98}, 0.155),
+ buildStabMelody([]float64{1396.92, 1567.98, 1760.00, 2093.0}, 0.155),
+ buildStabMelody([]float64{1567.98, 1760.00, 2093.0, 1567.98}, 0.155),
+ buildStabMelody([]float64{1046.5, 1318.5, 1567.98, 2093.0}, 0.155),
+ }, 0.155)
s.Ambient.Normal = ambientPreset{
- Gain: 0.03, BPM: 60, Wave: "sine",
- DroneFreqs: []float64{55.00, 110.00, 130.81, 196.00},
- Attack: 1.5, Release: 3.0,
- Drums: pat("kick", "_", "_", "_", "_", "snare", "_", "_", "kick", "_", "_", "_", "_", "snare", "_", "_"),
+ Gain: 0.03, BPM: 120, Wave: "square",
+ DroneFreqs: []float64{65.41, 130.81, 196.00},
+ Attack: 0.02, Release: 0.2, CutoffMin: 800, CutoffMax: 4000,
+ Drums: pat("kick", "_", "hat", "_", "kick", "_", "hat", "_", "kick", "_", "hat", "_", "snare", "_", "hat", "_"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.06, BPM: 120, Wave: "triangle",
- DroneFreqs: []float64{110.00, 220.00, 261.63, 392.00},
- Attack: 0.3, Release: 0.8,
- Drums: pat("kick", "_", "_", "_", "_", "snare", "_", "_", "kick", "_", "_", "_", "_", "snare", "_", "_"),
+ Gain: 0.055, BPM: 180, Wave: "square",
+ DroneFreqs: []float64{65.41, 130.81, 196.00, 261.63},
+ Attack: 0.02, Release: 0.08, CutoffMin: 1600, CutoffMax: 6000, DetuneCents: 10,
+ Drums: pat("kick", "hat", "kick", "hat", "snare", "hat", "kick", "hat", "kick", "hat", "snare", "hat", "kick", "kick", "hat", "clap"),
Melody: wildMel,
}
return s
}
// ════════════════════════════════════════════════════════════════════
-// SURVEILLANCE – spy tension, E major
+// SURVEILLANCE – spy chase, E major, 150/200
// ════════════════════════════════════════════════════════════════════
func soundsSurveillance() themeSounds {
var s themeSounds
@@ -1030,44 +1000,43 @@ func soundsSurveillance() themeSounds {
s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "square", 990, 330, 0.14, 0.085
s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "square", 280, 140, 0.09, 0.09
- e, ccc, ddd, bbb := major(82.41), major(65.41), major(73.42), major(61.74)
-
- normalMel := buildSong(
- [4]float64{164.81, 130.81, 146.83, 123.47}, [4][3]float64{e, ccc, ddd, bbb},
- [4][]melodyNote{
- buildSwingMelody([]float64{329.63, 369.99, 440.00, 329.63}, 0.5),
- buildSwingMelody([]float64{261.63, 293.66, 329.63, 261.63}, 0.5),
- buildSwingMelody([]float64{293.66, 349.23, 392.00, 293.66}, 0.5),
- buildSwingMelody([]float64{246.94, 277.18, 311.13, 246.94}, 0.5),
- }, 0.5)
- wildMel := buildSong(
- [4]float64{329.63, 261.63, 293.66, 246.94}, [4][3]float64{e, ccc, ddd, bbb},
+ em, cm, dm, bm := power(82.41), power(65.41), power(73.42), power(61.74)
+ normalMel := buildRockSong(
+ [4]float64{164.81, 130.81, 146.83, 123.47}, [4][3]float64{em, cm, dm, bm},
[4][]melodyNote{
- buildSwingMelody([]float64{659.25, 739.99, 880.00, 659.25}, 0.25),
- buildSwingMelody([]float64{523.25, 587.33, 659.25, 523.25}, 0.25),
- buildSwingMelody([]float64{587.33, 698.46, 783.99, 587.33}, 0.25),
- buildSwingMelody([]float64{493.88, 554.37, 622.25, 493.88}, 0.25),
+ buildDriveMelody([]float64{329.63, 369.99, 440.00, 493.88}, 0.25),
+ buildDriveMelody([]float64{261.63, 311.13, 329.63, 392.00}, 0.25),
+ buildDriveMelody([]float64{293.66, 349.23, 392.00, 440.00}, 0.25),
+ buildDriveMelody([]float64{246.94, 293.66, 329.63, 369.99}, 0.25),
}, 0.25)
+ wildMel := buildRockSong(
+ [4]float64{329.63, 261.63, 293.66, 246.94}, [4][3]float64{em, cm, dm, bm},
+ [4][]melodyNote{
+ buildStabMelody([]float64{659.25, 739.99, 880.00, 987.77}, 0.125),
+ buildStabMelody([]float64{523.25, 622.25, 659.25, 783.99}, 0.125),
+ buildStabMelody([]float64{587.33, 698.46, 783.99, 880.00}, 0.125),
+ buildStabMelody([]float64{493.88, 587.33, 659.25, 739.99}, 0.125),
+ }, 0.125)
s.Ambient.Normal = ambientPreset{
- Gain: 0.03, BPM: 70, Wave: "square",
- DroneFreqs: []float64{82.41, 130.81, 146.83, 164.81},
- Attack: 0.2, Release: 0.5,
- Drums: pat("kick", "_", "hat", "kick", "snare", "_", "hat", "kick", "kick", "_", "hat", "clap", "snare", "_", "hat", "kick"),
+ Gain: 0.025, BPM: 150, Wave: "square",
+ DroneFreqs: []float64{82.41, 130.81, 164.81},
+ Attack: 0.02, Release: 0.15, CutoffMin: 1200, CutoffMax: 5000,
+ Drums: pat("kick", "_", "hat", "kick", "snare", "kick", "hat", "kick", "kick", "_", "hat", "snare", "kick", "_", "hat", "clap"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.065, BPM: 140, Wave: "square",
- DroneFreqs: []float64{164.81, 261.63, 293.66, 329.63},
- Attack: 0.05, Release: 0.15,
- Drums: pat("kick", "_", "hat", "kick", "snare", "_", "hat", "kick", "kick", "_", "hat", "clap", "snare", "_", "hat", "kick"),
+ Gain: 0.065, BPM: 200, Wave: "square",
+ DroneFreqs: []float64{164.81, 261.63, 329.63, 493.88},
+ Attack: 0.02, Release: 0.04, CutoffMin: 2000, CutoffMax: 7000, DetuneCents: 18,
+ Drums: pat("kick", "kick", "hat", "kick", "snare", "kick", "hat", "kick", "kick", "kick", "hat", "snare", "kick", "kick", "hat", "clap"),
Melody: wildMel,
}
return s
}
// ════════════════════════════════════════════════════════════════════
-// BIOMECH – organic meets machine, C# major
+// BIOMECH – organic stomper, C# major, 160/240
// ════════════════════════════════════════════════════════════════════
func soundsBiomech() themeSounds {
var s themeSounds
@@ -1078,37 +1047,36 @@ func soundsBiomech() themeSounds {
s.Close.Wave, s.Close.Start, s.Close.End, s.Close.Dur, s.Close.Gain = "sine", 392, 130.81, 0.2, 0.09
s.Bounce.Wave, s.Bounce.Start, s.Bounce.End, s.Bounce.Dur, s.Bounce.Gain = "triangle", 160, 80, 0.14, 0.09
- cs, am, em, bm := major(69.30), major(55.00), major(82.41), major(61.74)
-
- normalMel := buildSong(
- [4]float64{138.59, 110.00, 164.81, 123.47}, [4][3]float64{cs, am, em, bm},
+ cs, am, emin, bm := power(69.30), power(55.00), power(82.41), power(61.74)
+ normalMel := buildRockSong(
+ [4]float64{138.59, 110.00, 164.81, 123.47}, [4][3]float64{cs, am, emin, bm},
[4][]melodyNote{
- buildSwingMelody([]float64{277.18, 329.63, 369.99, 277.18}, 0.5),
- buildSwingMelody([]float64{220.00, 261.63, 293.66, 220.00}, 0.5),
- buildSwingMelody([]float64{329.63, 392.00, 440.00, 329.63}, 0.5),
- buildSwingMelody([]float64{246.94, 293.66, 329.63, 246.94}, 0.5),
- }, 0.5)
- wildMel := buildSong(
- [4]float64{277.18, 220.00, 329.63, 246.94}, [4][3]float64{cs, am, em, bm},
+ buildDriveMelody([]float64{277.18, 329.63, 369.99, 440.00}, 0.233),
+ buildDriveMelody([]float64{220.00, 261.63, 293.66, 329.63}, 0.233),
+ buildDriveMelody([]float64{329.63, 392.00, 440.00, 493.88}, 0.233),
+ buildDriveMelody([]float64{246.94, 293.66, 329.63, 369.99}, 0.233),
+ }, 0.233)
+ wildMel := buildRockSong(
+ [4]float64{277.18, 220.00, 329.63, 246.94}, [4][3]float64{cs, am, emin, bm},
[4][]melodyNote{
- buildSwingMelody([]float64{554.37, 659.25, 739.99, 554.37}, 0.25),
- buildSwingMelody([]float64{440.00, 523.25, 587.33, 440.00}, 0.25),
- buildSwingMelody([]float64{659.25, 783.99, 880.00, 659.25}, 0.25),
- buildSwingMelody([]float64{493.88, 587.33, 659.25, 493.88}, 0.25),
- }, 0.25)
+ buildStabMelody([]float64{554.37, 659.25, 739.99, 880.00}, 0.117),
+ buildStabMelody([]float64{440.00, 523.25, 587.33, 659.25}, 0.117),
+ buildStabMelody([]float64{659.25, 783.99, 880.00, 987.77}, 0.117),
+ buildStabMelody([]float64{493.88, 587.33, 659.25, 739.99}, 0.117),
+ }, 0.117)
s.Ambient.Normal = ambientPreset{
- Gain: 0.03, BPM: 60, Wave: "triangle",
- DroneFreqs: []float64{69.30, 110.00, 138.59, 164.81},
- Attack: 0.7, Release: 1.5, DetuneCents: 8,
- Drums: pat("kick", "hat", "kick", "snare", "kick", "hat", "snare", "hat", "kick", "hat", "kick", "snare", "kick", "hat", "snare", "clap"),
+ Gain: 0.03, BPM: 160, Wave: "square",
+ DroneFreqs: []float64{69.30, 110.00, 138.59},
+ Attack: 0.02, Release: 0.12, CutoffMin: 1200, CutoffMax: 5000,
+ Drums: pat("kick", "_", "hat", "kick", "snare", "kick", "hat", "kick", "kick", "_", "hat", "snare", "kick", "_", "hat", "clap"),
Melody: normalMel,
}
s.Ambient.Wild = ambientPreset{
- Gain: 0.06, BPM: 140, Wave: "square",
- DroneFreqs: []float64{138.59, 220.00, 277.18, 329.63},
- Attack: 0.1, Release: 0.3, DetuneCents: 18,
- Drums: pat("kick", "hat", "kick", "snare", "kick", "hat", "snare", "hat", "kick", "hat", "kick", "snare", "kick", "hat", "snare", "clap"),
+ Gain: 0.06, BPM: 240, Wave: "square",
+ DroneFreqs: []float64{69.30, 138.59, 220.00, 277.18},
+ Attack: 0.02, Release: 0.04, CutoffMin: 2000, CutoffMax: 7000, DetuneCents: 18,
+ Drums: pat("kick", "kick", "hat", "kick", "snare", "kick", "hat", "kick", "kick", "kick", "hat", "snare", "kick", "kick", "hat", "clap"),
Melody: wildMel,
}
return s
@@ -1130,3 +1098,25 @@ func themeSoundsJSON(themeName string) template.JS {
}
return template.JS(b) //nolint:gosec // JSON from fixed structs
}
+
+var themeSoundPresets = map[string]themeSounds{
+ "neon": soundsNeon(),
+ "terminal": soundsTerminal(),
+ "synthwave": soundsSynthwave(),
+ "plasma": soundsPlasma(),
+ "brutalist": soundsBrutalist(),
+ "volcano": soundsVolcano(),
+ "aurora": soundsAurora(),
+ "matrix": soundsMatrix(),
+ "ocean": soundsOcean(),
+ "dos": soundsDos(),
+ "retro": soundsRetro(),
+ "cosmos": soundsCosmos(),
+ "retrofuture": soundsRetrofuture(),
+ "spaceage": soundsSpaceage(),
+ "tropicale": soundsTropical(),
+ "noir": soundsNoir(),
+ "cathedral": soundsCathedral(),
+ "surveillance": soundsSurveillance(),
+ "biomech": soundsBiomech(),
+}