diff options
| author | Paul Buetow <paul@buetow.org> | 2026-04-26 16:50:24 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-04-26 16:50:24 +0300 |
| commit | f075b701736d8e7527b00a0b9bdd47e3466c698b (patch) | |
| tree | 1a46917e8f58d9c6820c439fa84c5f1dc10c8c0f | |
| parent | 13b5543b13a780942c052dad5baa057a6fce0339 (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.go | 2 | ||||
| -rw-r--r-- | internal/generator/theme_sounds.go | 1220 |
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(), +} |
