From 48cf19b438283d9b3345c620c8a1bbd92d46b450 Mon Sep 17 00:00:00 2001 From: Dorian Date: Sun, 8 Mar 2026 21:21:26 +0000 Subject: [PATCH] feat: 10 new music tracks (20 total) 2x Drum & Bass (Jungle Protocol 174bpm, Liquid Lightning 172bpm), 2x Lo-fi (Midnight Stack 92bpm, Satoshi's Lullaby 88bpm), 2x Ska Punk (Skanking Satoshi 210bpm, Rudeboy Relay 205bpm), 2x Boss Fight (Final Hashrate 145bpm, Whale Alert 155bpm), 2x Chiptune (8-Bit Blockwar 190bpm, Pixel Proof 185bpm). Co-Authored-By: Claude Opus 4.6 --- frontend/src/game/sounds.ts | 478 +++++++++++++++++++++++++++++++++++- 1 file changed, 476 insertions(+), 2 deletions(-) diff --git a/frontend/src/game/sounds.ts b/frontend/src/game/sounds.ts index 6cda3a7..ae8cd5b 100644 --- a/frontend/src/game/sounds.ts +++ b/frontend/src/game/sounds.ts @@ -1,6 +1,6 @@ // Procedural 8-bit sound system + announcer voice using Web Audio + Kokoro TTS // Falls back to Speech Synthesis if Kokoro model hasn't loaded yet -import { initKokoro, isKokoroReady, kokoroSpeak, kokoroSpeakAsync, kokoroStop, setAudioContext } from './tts' +import { initKokoro, isKokoroReady, kokoroSpeak, kokoroSpeakAsync, kokoroStop, kokoroPrefetch, setAudioContext } from './tts' let ctx: AudioContext | null = null let musicGain: GainNode | null = null @@ -893,6 +893,20 @@ export function speakNarration(text: string): Promise { return speakAsyncWithRate(trimmed, 'sportscaster', 1.2) } +// === TTS PREFETCH — start generating audio in the background so it's cached when needed === + +export function prefetchQuestion(text: string) { + kokoroPrefetch(smartTruncate(text, 200), 'question_reader') +} + +export function prefetchAnswer(botName: string, answer: string) { + kokoroPrefetch(smartTruncate(answer, 200), botVoiceKey(botName)) +} + +export function prefetchNarration(text: string) { + kokoroPrefetch(smartTruncate(text, 200), 'sportscaster') +} + // === FANFARES (8-bit melodic announcements) === export function fanfareRound(roundNum: number) { @@ -2733,7 +2747,467 @@ const track10: MusicTrack = { ], } -const ALL_TRACKS = [track1, track2, track3, track4, track5, track6, track7, track8, track9, track10] +// --- D&B #1 --- +const track11: MusicTrack = { + name: 'Jungle Protocol', bpm: 174, synthStyle: 'speed', + bass: [ + 110,0,0,110, 0,0,110,0, 131,0,0,131, 0,110,0,0, + 110,0,0,110, 0,0,165,0, 131,0,0,131, 0,175,0,0, + 147,0,0,147, 0,0,147,0, 165,0,0,165, 0,147,0,0, + 110,0,0,110, 0,0,110,165, 131,0,0,131, 0,0,0,0, + 110,0,110,0, 110,0,110,131, 131,0,131,0, 131,110,0,0, + 147,0,147,0, 147,0,147,165, 165,0,165,0, 165,147,0,0, + 175,0,175,0, 175,0,175,196, 196,0,196,0, 196,175,0,0, + 110,0,110,131, 131,0,165,147, 110,0,131,0, 110,0,0,0, + ], + lead: [ + 440,0,523,0, 659,0,523,440, 0,0,523,659, 784,0,659,523, + 440,0,523,0, 659,784,659,523, 440,523,440,0, 523,659,784,0, + 587,0,698,0, 880,0,698,587, 0,0,698,880, 1047,0,880,698, + 440,523,659,784, 659,523,440,0, 523,440,0,0, 440,0,0,0, + 880,0,784,659, 523,0,440,523, 659,784,880,784, 659,523,440,0, + 1047,0,880,784, 659,0,523,659, 784,880,1047,880, 784,659,523,0, + 698,0,587,0, 698,0,784,880, 1047,880,784,698, 587,0,523,587, + 659,784,880,1047, 880,784,659,523, 440,523,659,0, 440,0,0,0, + ], + arp: [ + 440,523,659,523, 440,523,659,784, 659,523,440,523, 659,784,659,523, + 523,659,784,659, 523,659,784,1047, 784,659,523,659, 784,1047,784,659, + 587,698,880,698, 587,698,880,1047, 880,698,587,698, 880,1047,880,698, + 440,523,659,523, 440,659,523,440, 523,440,0,440, 523,659,784,0, + 880,659,440,523, 659,880,659,523, 440,523,659,880, 1047,880,659,523, + 1047,784,523,659, 784,1047,784,659, 523,659,784,1047, 1319,1047,784,659, + 698,880,1047,880, 698,880,1047,1397, 1047,880,698,880, 1047,1397,1047,880, + 659,784,880,659, 523,659,784,523, 440,523,659,440, 440,0,0,0, + ], + chords: [[220,262,330],[262,330,392],[165,196,247],[147,175,220],[220,262,330],[175,220,262],[196,247,294],[220,262,330]], + drums: [ + 1,0,3,3, 0,0,2,0, 0,3,1,0, 2,0,3,0, + 1,0,3,3, 0,0,2,3, 0,3,1,0, 2,3,0,3, + 1,0,3,3, 0,0,2,0, 0,3,1,0, 2,0,3,0, + 1,0,3,3, 0,3,2,3, 0,3,1,3, 2,3,4,3, + 1,3,0,3, 2,0,1,3, 0,3,2,0, 1,3,0,3, + 2,0,1,3, 0,3,2,3, 1,3,0,3, 2,3,1,3, + 1,3,2,3, 1,0,2,3, 1,3,2,0, 1,3,2,3, + 1,0,2,0, 1,0,2,0, 1,1,2,2, 1,2,4,0, + ], +} + +// --- D&B #2 --- +const track12: MusicTrack = { + name: 'Liquid Lightning', bpm: 172, synthStyle: 'speed', + bass: [ + 147,0,0,147, 0,0,147,0, 175,0,0,175, 0,147,0,0, + 131,0,0,131, 0,0,131,0, 147,0,0,147, 0,131,0,0, + 110,0,0,110, 0,0,110,0, 131,0,0,131, 0,110,0,0, + 98,0,0,98, 0,0,98,131, 110,0,0,110, 0,0,0,0, + 147,0,147,0, 175,0,147,175, 196,0,175,0, 147,175,0,0, + 131,0,131,0, 147,0,131,147, 165,0,147,0, 131,147,0,0, + 110,0,110,131, 131,0,147,0, 165,0,147,131, 110,0,131,0, + 98,0,110,0, 131,0,147,0, 110,0,98,0, 98,0,0,0, + ], + lead: [ + 587,0,698,784, 880,0,784,698, 587,0,698,784, 1047,0,880,784, + 523,0,587,698, 784,0,698,587, 523,0,587,698, 880,0,784,698, + 440,0,523,587, 659,0,587,523, 440,523,587,659, 784,659,587,523, + 392,0,440,523, 587,0,523,440, 392,440,523,587, 523,0,0,0, + 1175,1047,880,784, 698,587,698,784, 880,1047,1175,1047, 880,784,698,587, + 1047,880,784,698, 587,523,587,698, 784,880,1047,880, 784,698,587,523, + 880,784,698,587, 523,440,523,587, 698,784,880,784, 698,587,523,440, + 784,698,587,523, 440,523,587,698, 587,523,440,0, 392,0,0,0, + ], + arp: [ + 587,698,880,698, 587,698,880,1047, 880,698,587,698, 880,1047,880,698, + 523,659,784,659, 523,659,784,1047, 784,659,523,659, 784,1047,784,659, + 440,523,659,523, 440,523,659,880, 659,523,440,523, 659,880,659,523, + 392,494,587,494, 392,494,587,784, 587,494,392,494, 587,784,587,494, + 1047,880,698,587, 698,880,1047,880, 698,587,698,880, 1047,1397,1047,880, + 880,784,587,523, 587,784,880,784, 587,523,587,784, 880,1175,880,784, + 698,587,440,392, 440,587,698,587, 440,392,440,587, 698,1047,698,587, + 587,523,392,294, 392,523,587,523, 392,294,392,523, 587,0,0,0, + ], + chords: [[147,175,220],[131,165,196],[110,131,165],[98,123,147],[147,175,220],[131,165,196],[110,131,165],[147,175,220]], + drums: [ + 1,0,3,0, 2,0,3,3, 1,3,0,0, 2,0,3,0, + 1,0,3,0, 2,3,3,0, 0,3,1,3, 2,0,3,3, + 1,0,3,0, 2,0,3,3, 1,3,0,0, 2,0,3,0, + 1,3,3,0, 2,0,3,3, 1,3,1,3, 2,3,4,0, + 1,3,2,0, 0,3,1,0, 2,3,0,3, 1,0,2,3, + 0,3,1,3, 2,0,0,3, 1,3,2,0, 0,3,1,3, + 1,0,2,3, 1,3,2,0, 1,0,2,3, 1,3,2,3, + 1,3,1,3, 2,3,1,3, 2,2,1,1, 2,2,4,0, + ], +} + +// --- Lo-fi #1 --- +const track13: MusicTrack = { + name: 'Midnight Stack', bpm: 92, synthStyle: 'atmospheric', + bass: [ + 82,0,0,0, 0,0,82,0, 0,0,0,0, 82,0,0,0, + 73,0,0,0, 0,0,73,0, 0,0,0,0, 73,0,0,0, + 65,0,0,0, 0,0,65,0, 0,0,0,0, 65,0,73,0, + 87,0,0,0, 0,0,87,0, 0,0,0,0, 82,0,0,0, + 82,0,0,0, 82,0,0,82, 0,0,0,0, 82,0,0,0, + 73,0,0,0, 73,0,0,73, 0,0,0,0, 73,0,0,0, + 65,0,0,0, 65,0,0,65, 0,0,0,65, 73,0,82,0, + 87,0,0,0, 87,0,0,87, 0,0,0,0, 82,0,0,0, + ], + lead: [ + 330,0,0,392, 0,0,330,0, 0,294,0,0, 330,0,392,0, + 294,0,0,330, 0,0,294,0, 0,262,0,0, 294,0,330,0, + 262,0,0,330, 0,0,392,0, 0,330,0,0, 262,0,294,0, + 349,0,0,330, 0,0,294,0, 0,262,0,0, 330,0,0,0, + 659,0,0,587, 0,0,523,0, 0,494,0,0, 523,0,587,0, + 587,0,0,523, 0,0,494,0, 0,440,0,0, 494,0,523,0, + 523,0,0,587, 0,0,659,0, 0,587,0,0, 523,0,494,0, + 698,0,0,659, 0,0,587,0, 0,523,0,0, 494,0,0,0, + ], + arp: [ + 330,392,494,392, 330,0,0,0, 392,494,587,494, 392,0,0,0, + 294,349,440,349, 294,0,0,0, 349,440,523,440, 349,0,0,0, + 262,330,392,330, 262,0,0,0, 330,392,494,392, 330,0,0,0, + 349,440,523,440, 349,0,0,0, 330,392,494,392, 330,0,0,0, + 659,494,392,330, 0,0,330,392, 494,659,0,0, 587,494,392,0, + 587,440,349,294, 0,0,294,349, 440,587,0,0, 523,440,349,0, + 523,392,330,262, 0,0,262,330, 392,523,0,0, 494,392,330,0, + 698,523,440,349, 0,0,349,440, 523,698,0,0, 659,523,440,0, + ], + chords: [[165,196,247],[147,175,220],[131,165,196],[175,208,262],[165,196,247],[147,175,220],[131,165,196],[165,196,247]], + drums: [ + 1,0,0,0, 0,0,3,0, 2,0,0,0, 0,0,3,0, + 1,0,0,0, 0,0,3,0, 2,0,0,0, 0,0,0,0, + 1,0,0,0, 0,0,3,0, 2,0,0,0, 0,0,3,0, + 1,0,0,0, 0,0,3,0, 2,0,0,0, 0,3,0,0, + 1,0,3,0, 0,0,3,0, 2,0,0,0, 0,0,3,0, + 1,0,0,0, 0,0,3,0, 2,0,3,0, 0,0,0,0, + 1,0,3,0, 0,0,3,0, 2,0,0,0, 0,0,3,0, + 1,0,0,0, 0,3,3,0, 2,0,0,0, 0,0,0,0, + ], +} + +// --- Lo-fi #2 --- +const track14: MusicTrack = { + name: "Satoshi's Lullaby", bpm: 88, synthStyle: 'atmospheric', + bass: [ + 110,0,0,0, 0,0,0,0, 110,0,0,0, 0,0,110,0, + 131,0,0,0, 0,0,0,0, 131,0,0,0, 0,0,131,0, + 98,0,0,0, 0,0,0,0, 98,0,0,0, 0,0,98,0, + 87,0,0,0, 0,0,0,0, 87,0,0,0, 0,0,0,0, + 110,0,0,0, 110,0,0,0, 0,0,0,0, 110,0,0,0, + 131,0,0,0, 131,0,0,0, 0,0,0,0, 131,0,0,0, + 98,0,0,0, 98,0,0,0, 0,0,0,0, 98,0,110,0, + 87,0,0,0, 87,0,0,0, 0,0,0,0, 110,0,0,0, + ], + lead: [ + 440,0,0,523, 0,0,0,0, 440,0,0,392, 0,0,0,0, + 523,0,0,587, 0,0,0,0, 523,0,0,494, 0,0,0,0, + 392,0,0,440, 0,0,0,0, 392,0,0,349, 0,0,0,0, + 349,0,0,392, 0,0,0,0, 330,0,0,0, 0,0,0,0, + 880,0,0,784, 0,0,659,0, 587,0,0,523, 0,0,0,0, + 1047,0,0,880, 0,0,784,0, 659,0,0,587, 0,0,0,0, + 784,0,0,659, 0,0,587,0, 523,0,0,440, 0,0,494,0, + 698,0,0,659, 0,0,587,0, 523,0,0,0, 440,0,0,0, + ], + arp: [ + 220,262,330,262, 220,0,0,0, 262,330,392,330, 262,0,0,0, + 262,330,392,330, 262,0,0,0, 330,392,494,392, 330,0,0,0, + 196,247,294,247, 196,0,0,0, 247,294,349,294, 247,0,0,0, + 175,220,262,220, 175,0,0,0, 220,262,330,262, 220,0,0,0, + 440,330,262,220, 0,0,262,330, 440,0,0,0, 392,330,262,0, + 523,392,330,262, 0,0,330,392, 523,0,0,0, 494,392,330,0, + 392,294,247,196, 0,0,247,294, 392,0,0,0, 349,294,247,0, + 349,262,220,175, 0,0,220,262, 349,0,0,0, 330,262,220,0, + ], + chords: [[220,262,330],[262,330,392],[196,247,294],[175,220,262],[220,262,330],[262,330,392],[196,247,294],[220,262,330]], + drums: [ + 1,0,0,0, 0,0,0,0, 2,0,0,0, 0,0,0,0, + 1,0,0,0, 0,0,3,0, 2,0,0,0, 0,0,0,0, + 1,0,0,0, 0,0,0,0, 2,0,0,0, 0,0,0,0, + 1,0,0,0, 0,0,3,0, 2,0,0,0, 0,0,3,0, + 1,0,0,0, 0,0,3,0, 2,0,0,0, 0,0,0,0, + 1,0,0,0, 0,0,0,0, 2,0,0,0, 0,0,3,0, + 1,0,0,0, 0,0,3,0, 2,0,0,0, 0,0,0,0, + 1,0,3,0, 0,0,3,0, 2,0,0,0, 0,0,0,0, + ], +} + +// --- Ska Punk #1 --- +const track15: MusicTrack = { + name: 'Skanking Satoshi', bpm: 210, synthStyle: 'funky', + bass: [ + 196,0,196,0, 196,0,196,196, 247,0,247,0, 247,0,247,0, + 262,0,262,0, 262,0,262,262, 294,0,294,0, 294,0,294,0, + 196,0,196,0, 196,0,196,196, 175,0,175,0, 175,0,175,0, + 147,0,147,0, 147,0,147,147, 165,0,165,0, 196,0,0,0, + 196,0,196,247, 196,0,247,0, 262,0,262,294, 262,0,294,0, + 294,0,294,330, 294,0,330,0, 262,0,262,294, 262,0,247,0, + 196,0,196,247, 262,0,294,0, 247,0,247,262, 247,0,196,0, + 147,0,165,0, 175,0,196,0, 247,0,262,0, 196,0,0,0, + ], + lead: [ + 784,0,784,880, 784,0,659,0, 784,0,880,988, 880,0,784,0, + 1047,0,1047,1175, 1047,0,880,0, 1047,0,1175,1319, 1175,0,1047,0, + 784,0,784,880, 784,0,659,0, 698,0,698,784, 698,0,587,0, + 587,0,587,659, 587,0,523,0, 659,0,784,0, 784,0,0,0, + 1568,0,1319,1175, 1047,0,880,0, 1175,0,1047,880, 784,0,659,0, + 1319,0,1175,1047, 880,0,784,0, 1047,0,880,784, 659,0,587,0, + 784,0,880,1047, 1175,0,1319,0, 1175,0,1047,880, 784,0,659,0, + 587,659,784,880, 1047,0,880,784, 659,784,880,0, 784,0,0,0, + ], + arp: [ + 0,392,0,392, 0,392,0,392, 0,494,0,494, 0,494,0,494, + 0,523,0,523, 0,523,0,523, 0,587,0,587, 0,587,0,587, + 0,392,0,392, 0,392,0,392, 0,349,0,349, 0,349,0,349, + 0,294,0,294, 0,294,0,294, 0,330,0,330, 0,392,0,0, + 784,0,659,0, 784,0,880,0, 784,0,659,0, 523,0,659,0, + 1047,0,880,0, 1047,0,1175,0, 1047,0,880,0, 659,0,880,0, + 784,0,659,0, 784,0,880,1047, 880,0,784,0, 659,0,523,0, + 587,0,659,0, 784,0,880,0, 1047,0,880,0, 784,0,0,0, + ], + chords: [[196,247,294],[262,330,392],[196,247,294],[175,220,262],[147,175,220],[165,208,247],[196,247,294],[196,247,294]], + drums: [ + 1,0,3,0, 2,0,3,0, 1,0,3,0, 2,0,3,0, + 1,0,3,0, 2,0,3,0, 1,0,3,0, 2,0,3,0, + 1,0,3,0, 2,0,3,0, 1,0,3,0, 2,0,3,0, + 1,0,3,0, 2,0,3,0, 1,0,3,0, 2,3,4,3, + 1,3,3,3, 2,3,3,3, 1,3,3,3, 2,3,3,3, + 1,3,3,3, 2,3,3,3, 1,3,3,3, 2,3,3,3, + 1,3,3,3, 2,3,3,3, 1,3,3,3, 2,3,3,3, + 1,3,3,3, 2,3,3,3, 1,1,2,2, 1,2,4,0, + ], +} + +// --- Ska Punk #2 --- +const track16: MusicTrack = { + name: 'Rudeboy Relay', bpm: 205, synthStyle: 'funky', + bass: [ + 175,0,175,0, 175,0,175,175, 220,0,220,0, 220,0,220,0, + 196,0,196,0, 196,0,196,196, 262,0,262,0, 262,0,262,0, + 175,0,175,0, 175,0,175,175, 233,0,233,0, 233,0,233,0, + 147,0,147,0, 147,0,147,147, 175,0,175,0, 175,0,0,0, + 175,0,220,0, 175,0,220,233, 262,0,233,0, 220,0,175,0, + 196,0,233,0, 196,0,262,0, 233,0,196,0, 175,0,147,0, + 175,0,220,0, 262,0,233,0, 196,0,175,0, 220,0,262,0, + 233,0,196,0, 175,0,147,0, 175,0,196,0, 175,0,0,0, + ], + lead: [ + 698,0,698,784, 698,0,587,0, 698,0,784,880, 784,0,698,0, + 784,0,784,880, 784,0,698,0, 1047,0,880,784, 880,0,784,0, + 698,0,698,784, 698,0,587,0, 932,0,880,784, 880,0,784,0, + 587,0,587,698, 587,0,523,0, 587,0,698,0, 698,0,0,0, + 1397,0,1175,1047, 880,0,784,0, 1047,0,880,784, 698,0,587,0, + 1568,0,1397,1175, 1047,0,880,0, 1175,0,1047,880, 784,0,698,0, + 698,0,784,880, 1047,0,1175,0, 1047,0,880,784, 698,0,587,0, + 523,587,698,784, 880,0,784,698, 587,698,784,0, 698,0,0,0, + ], + arp: [ + 0,349,0,349, 0,349,0,349, 0,440,0,440, 0,440,0,440, + 0,392,0,392, 0,392,0,392, 0,523,0,523, 0,523,0,523, + 0,349,0,349, 0,349,0,349, 0,466,0,466, 0,466,0,466, + 0,294,0,294, 0,294,0,294, 0,349,0,349, 0,349,0,0, + 698,0,587,0, 698,0,784,0, 698,0,587,0, 523,0,587,0, + 784,0,698,0, 784,0,880,0, 784,0,698,0, 587,0,698,0, + 698,0,587,0, 698,0,784,880, 784,0,698,0, 587,0,523,0, + 523,0,587,0, 698,0,784,0, 880,0,784,0, 698,0,0,0, + ], + chords: [[175,220,262],[196,247,294],[175,220,262],[233,294,349],[147,175,220],[175,220,262],[196,247,294],[175,220,262]], + drums: [ + 1,0,3,0, 2,0,3,0, 1,0,3,0, 2,0,3,0, + 1,0,3,0, 2,0,3,0, 1,0,3,0, 2,0,3,3, + 1,0,3,0, 2,0,3,0, 1,0,3,0, 2,0,3,0, + 1,0,3,0, 2,0,3,0, 1,3,3,0, 2,3,4,0, + 1,3,3,3, 2,3,3,3, 1,3,3,3, 2,3,3,3, + 1,3,3,3, 2,3,3,3, 1,3,3,3, 2,3,3,3, + 1,3,3,3, 2,3,3,3, 1,3,3,3, 2,3,3,3, + 1,3,1,3, 2,3,1,3, 1,1,2,2, 2,2,4,0, + ], +} + +// --- Boss Fight #1 --- +const track17: MusicTrack = { + name: 'Final Hashrate', bpm: 145, synthStyle: 'boss', + bass: [ + 131,0,131,0, 0,0,131,0, 131,0,0,131, 0,0,131,0, + 123,0,123,0, 0,0,123,0, 123,0,0,123, 0,0,123,0, + 110,0,110,0, 0,0,110,0, 110,0,0,110, 0,0,131,0, + 98,0,98,0, 0,0,98,0, 98,0,0,98, 0,0,0,0, + 131,0,131,131, 0,131,0,131, 131,0,131,0, 131,156,175,196, + 123,0,123,123, 0,123,0,123, 123,0,123,0, 123,147,165,175, + 110,0,110,110, 0,110,0,110, 110,0,110,0, 110,131,147,165, + 98,0,98,110, 110,0,131,0, 131,0,110,98, 131,0,0,0, + ], + lead: [ + 523,0,622,0, 784,0,622,523, 0,0,622,784, 932,0,784,622, + 494,0,587,0, 740,0,587,494, 0,0,587,740, 880,0,740,587, + 440,0,523,0, 659,0,523,440, 0,0,523,659, 784,0,659,523, + 392,0,466,0, 587,0,466,392, 0,0,466,587, 523,0,0,0, + 1047,0,932,784, 622,0,523,622, 784,932,1047,932, 784,622,523,0, + 988,0,880,740, 587,0,494,587, 740,880,988,880, 740,587,494,0, + 880,0,784,659, 523,0,440,523, 659,784,880,784, 659,523,440,0, + 784,0,740,622, 523,622,740,880, 1047,932,784,622, 523,0,0,0, + ], + arp: [ + 262,311,392,311, 262,311,392,523, 392,311,262,311, 392,523,392,311, + 247,294,370,294, 247,294,370,494, 370,294,247,294, 370,494,370,294, + 220,262,330,262, 220,262,330,440, 330,262,220,262, 330,440,330,262, + 196,233,294,233, 196,233,294,392, 294,233,196,233, 294,392,294,233, + 523,392,311,262, 311,392,523,622, 523,392,311,262, 392,523,622,784, + 494,370,294,247, 294,370,494,587, 494,370,294,247, 370,494,587,740, + 440,330,262,220, 262,330,440,523, 440,330,262,220, 330,440,523,659, + 392,294,233,196, 233,294,392,466, 392,294,233,196, 262,0,0,0, + ], + chords: [[131,156,196],[123,147,175],[110,131,165],[98,123,147],[131,156,196],[123,147,175],[110,131,165],[131,156,196]], + drums: [ + 1,0,0,0, 2,0,0,0, 1,0,3,0, 2,0,3,0, + 1,0,0,0, 2,0,0,0, 1,0,3,0, 2,0,3,4, + 1,0,0,0, 2,0,0,0, 1,0,3,0, 2,0,3,0, + 1,0,3,0, 2,0,3,0, 1,3,1,3, 2,2,4,4, + 1,0,3,0, 2,0,3,0, 1,0,3,0, 2,0,3,0, + 1,0,3,0, 2,0,3,4, 1,0,3,0, 2,0,3,0, + 1,3,1,0, 2,0,3,0, 1,3,1,0, 2,0,3,0, + 1,3,1,3, 2,3,1,3, 1,1,2,2, 4,4,4,4, + ], +} + +// --- Boss Fight #2 --- +const track18: MusicTrack = { + name: 'Whale Alert', bpm: 155, synthStyle: 'boss', + bass: [ + 117,0,117,0, 0,0,117,0, 117,0,0,117, 0,0,117,0, + 110,0,110,0, 0,0,110,0, 110,0,0,110, 0,0,110,0, + 87,0,87,0, 0,0,87,0, 87,0,0,87, 0,0,87,0, + 98,0,98,0, 0,0,98,0, 98,0,0,98, 0,0,0,0, + 117,0,117,117, 0,117,0,117, 117,0,117,0, 117,131,147,175, + 110,0,110,110, 0,110,0,110, 110,0,110,0, 110,123,131,147, + 87,0,87,87, 0,87,0,87, 87,0,87,0, 87,98,110,117, + 98,0,98,110, 117,0,131,0, 117,0,98,87, 117,0,0,0, + ], + lead: [ + 466,0,554,0, 698,0,554,466, 0,0,554,698, 880,0,698,554, + 440,0,523,0, 659,0,523,440, 0,0,523,659, 831,0,659,523, + 349,0,415,0, 523,0,415,349, 0,0,415,523, 698,0,523,415, + 392,0,466,0, 587,0,466,392, 0,0,466,587, 466,0,0,0, + 932,0,880,698, 554,0,466,554, 698,880,932,880, 698,554,466,0, + 880,0,831,659, 523,0,440,523, 659,831,880,831, 659,523,440,0, + 698,0,659,523, 415,0,349,415, 523,659,698,659, 523,415,349,0, + 784,0,698,587, 466,554,698,880, 932,880,698,554, 466,0,0,0, + ], + arp: [ + 233,277,349,277, 233,277,349,466, 349,277,233,277, 349,466,349,277, + 220,262,330,262, 220,262,330,440, 330,262,220,262, 330,440,330,262, + 175,208,262,208, 175,208,262,349, 262,208,175,208, 262,349,262,208, + 196,233,294,233, 196,233,294,392, 294,233,196,233, 294,392,294,233, + 466,349,277,233, 277,349,466,554, 466,349,277,233, 349,466,554,698, + 440,330,262,220, 262,330,440,523, 440,330,262,220, 330,440,523,659, + 349,262,208,175, 208,262,349,415, 349,262,208,175, 262,349,415,523, + 392,294,233,196, 233,294,392,466, 392,294,233,196, 233,0,0,0, + ], + chords: [[117,139,175],[110,131,165],[87,110,131],[98,117,147],[117,139,175],[110,131,165],[87,110,131],[117,139,175]], + drums: [ + 1,0,3,0, 2,0,0,0, 1,0,3,0, 2,0,3,0, + 1,0,3,0, 2,0,0,0, 1,0,3,0, 2,0,3,4, + 1,0,3,0, 2,0,0,0, 1,0,3,0, 2,0,3,0, + 1,0,3,0, 2,3,3,0, 1,3,1,3, 2,2,4,4, + 1,0,3,0, 1,0,3,0, 2,0,3,0, 1,0,3,0, + 1,0,3,4, 1,0,3,0, 2,0,3,0, 1,0,3,0, + 1,3,1,3, 2,0,3,0, 1,3,1,3, 2,0,3,0, + 1,3,1,3, 2,3,1,3, 1,1,2,2, 4,4,4,4, + ], +} + +// --- Chiptune #1 --- +const track19: MusicTrack = { + name: '8-Bit Blockwar', bpm: 190, synthStyle: 'bouncy', + bass: [ + 165,0,165,0, 165,0,330,0, 165,0,165,0, 247,0,165,0, + 196,0,196,0, 196,0,392,0, 196,0,196,0, 294,0,196,0, + 220,0,220,0, 220,0,440,0, 220,0,220,0, 330,0,220,0, + 147,0,147,0, 147,0,294,0, 147,0,147,0, 220,0,0,0, + 165,165,0,165, 0,165,330,165, 196,196,0,196, 0,196,392,196, + 220,220,0,220, 0,220,440,220, 147,147,0,147, 0,147,294,147, + 165,0,196,0, 220,0,247,0, 262,0,294,0, 330,0,349,0, + 165,0,247,0, 330,0,247,0, 165,0,247,0, 165,0,0,0, + ], + lead: [ + 659,0,784,0, 988,0,784,659, 784,988,1319,988, 784,0,659,0, + 784,0,988,0, 1175,0,988,784, 988,1175,1568,1175, 988,0,784,0, + 880,0,1047,0, 1319,0,1047,880, 1047,1319,1760,1319, 1047,0,880,0, + 587,0,698,0, 880,0,698,587, 698,880,1175,880, 698,0,0,0, + 1319,1175,988,784, 659,784,988,1175, 1319,0,1175,988, 784,659,784,988, + 1568,1319,1175,988, 784,988,1175,1319, 1568,0,1319,1175, 988,784,988,1175, + 1760,1568,1319,1175, 988,1175,1319,1568, 1760,0,1568,1319, 1175,988,784,0, + 1175,988,784,659, 784,988,1175,1319, 1568,1319,1175,988, 659,0,0,0, + ], + arp: [ + 330,392,494,659, 494,392,330,392, 494,659,494,392, 330,494,659,330, + 392,494,587,784, 587,494,392,494, 587,784,587,494, 392,587,784,392, + 440,523,659,880, 659,523,440,523, 659,880,659,523, 440,659,880,440, + 294,349,440,587, 440,349,294,349, 440,587,440,349, 294,440,587,0, + 659,494,330,494, 659,988,659,494, 330,494,659,988, 1319,988,659,494, + 784,587,392,587, 784,1175,784,587, 392,587,784,1175, 1568,1175,784,587, + 880,659,440,659, 880,1319,880,659, 440,659,880,1319, 1760,1319,880,659, + 587,440,294,440, 587,880,587,440, 294,440,587,880, 659,0,0,0, + ], + chords: [[165,208,247],[196,247,294],[220,262,330],[147,175,220],[165,208,247],[196,247,294],[220,262,330],[165,208,247]], + drums: [ + 1,0,3,0, 2,0,3,0, 1,0,3,0, 2,0,3,0, + 1,0,3,0, 2,0,3,0, 1,0,3,0, 2,0,3,3, + 1,0,3,0, 2,0,3,0, 1,0,3,0, 2,0,3,0, + 1,0,3,0, 2,0,3,3, 1,0,3,3, 2,3,4,0, + 1,0,3,3, 2,0,3,3, 1,0,3,3, 2,0,3,3, + 1,0,3,3, 2,0,3,3, 1,0,3,3, 2,3,4,3, + 1,3,1,3, 2,3,1,3, 1,3,1,3, 2,3,1,3, + 1,3,1,3, 2,3,1,3, 1,1,2,2, 1,2,4,0, + ], +} + +// --- Chiptune #2 --- +const track20: MusicTrack = { + name: 'Pixel Proof', bpm: 185, synthStyle: 'bouncy', + bass: [ + 220,0,220,0, 220,0,440,0, 220,0,220,0, 330,0,220,0, + 196,0,196,0, 196,0,392,0, 196,0,196,0, 294,0,196,0, + 175,0,175,0, 175,0,349,0, 175,0,175,0, 262,0,175,0, + 165,0,165,0, 165,0,330,0, 165,0,165,0, 247,0,0,0, + 220,220,0,220, 0,220,440,220, 196,196,0,196, 0,196,392,196, + 175,175,0,175, 0,175,349,175, 165,165,0,165, 0,165,330,165, + 220,0,196,0, 175,0,165,0, 175,0,196,0, 220,0,247,0, + 220,0,330,0, 440,0,330,0, 220,0,330,0, 220,0,0,0, + ], + lead: [ + 880,0,1047,0, 1319,0,1047,880, 1047,1319,1760,1319, 1047,0,880,0, + 784,0,932,0, 1175,0,932,784, 932,1175,1568,1175, 932,0,784,0, + 698,0,880,0, 1047,0,880,698, 880,1047,1397,1047, 880,0,698,0, + 659,0,784,0, 988,0,784,659, 784,988,1319,988, 784,0,0,0, + 1760,1568,1319,1047, 880,1047,1319,1568, 1760,0,1568,1319, 1047,880,1047,1319, + 1568,1397,1175,932, 784,932,1175,1397, 1568,0,1397,1175, 932,784,932,1175, + 1397,1319,1047,880, 698,880,1047,1319, 1397,0,1319,1047, 880,698,880,0, + 1319,1175,988,784, 659,784,988,1175, 1319,1175,988,784, 880,0,0,0, + ], + arp: [ + 440,523,659,880, 659,523,440,523, 659,880,659,523, 440,659,880,440, + 392,494,587,784, 587,494,392,494, 587,784,587,494, 392,587,784,392, + 349,440,523,698, 523,440,349,440, 523,698,523,440, 349,523,698,349, + 330,415,494,659, 494,415,330,415, 494,659,494,415, 330,494,659,0, + 880,659,440,523, 659,880,1319,880, 659,523,659,880, 1319,1760,1319,880, + 784,587,392,494, 587,784,1175,784, 587,494,587,784, 1175,1568,1175,784, + 698,523,349,440, 523,698,1047,698, 523,440,523,698, 1047,1397,1047,698, + 659,494,330,415, 494,659,988,659, 494,415,494,659, 880,0,0,0, + ], + chords: [[220,277,330],[196,247,294],[175,220,262],[165,208,247],[220,277,330],[196,247,294],[175,220,262],[220,277,330]], + drums: [ + 1,0,3,0, 2,0,3,0, 1,0,3,0, 2,0,3,0, + 1,0,3,0, 2,0,3,3, 1,0,3,0, 2,0,3,0, + 1,0,3,0, 2,0,3,0, 1,0,3,0, 2,0,3,0, + 1,0,3,0, 2,0,3,3, 1,3,3,0, 2,3,4,0, + 1,0,3,3, 2,0,3,3, 1,0,3,3, 2,0,3,3, + 1,0,3,3, 2,0,3,3, 1,3,3,3, 2,3,4,3, + 1,3,1,3, 2,0,3,3, 1,3,1,3, 2,0,3,3, + 1,3,1,3, 2,3,1,3, 1,1,2,2, 2,2,4,0, + ], +} + +const ALL_TRACKS = [track1, track2, track3, track4, track5, track6, track7, track8, track9, track10, track11, track12, track13, track14, track15, track16, track17, track18, track19, track20] let activeTrack: MusicTrack = track1 let barIndex = 0