diff --git a/index.html b/index.html
index 0aa6983..e6c926e 100644
--- a/index.html
+++ b/index.html
@@ -108,14 +108,18 @@ canvas{display:block;}
Leaderboard
No scores yet.
-
+
+
+
+
@@ -1923,16 +1927,69 @@ const SINGALONG_PIECES=(function(){
1,1,1,1,1,1,1,1,2,1,1,1,1,2,
1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,2,1,3],
4,A3);
- return [drunken,wellerman,molly,whiskey,parting,amazing,auld,saints,clementine,scarborough,bonnie];
+ // ── Leave Her Johnny ──
+ var leavejohnny=pub("Leave Her Johnny","Sea Shanty (Trad.)",105,
+ [A3,A3,C4,D4,E4,E4,D4,C4,A3,G3,A3,C4,D4,E4,G4,E4,D4,C4,A3,G3,A3,C4,E4,D4,C4,A3],
+ [0,0,1,0,2,2,0,1,0,3,0,1,0,2,3,2,0,1,0,3,0,1,2,0,1,0],
+ [1,1,1,1,2,1,1,1,2,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,3],
+ 5,A3);
+ // ── Blow the Man Down ──
+ var blowman=pub("Blow the Man Down","Sea Shanty (Trad.)",120,
+ [C4,E4,G4,G4,F4,E4,D4,C4,D4,E4,F4,E4,D4,C4,C4,E4,G4,C5,B4,A4,G4,F4,E4,D4,C4],
+ [0,2,3,3,1,2,1,0,1,2,1,2,1,0,0,2,3,0,3,0,3,1,2,1,0],
+ [1,1,2,1,1,1,1,2,1,1,1,1,1,3,1,1,2,1,1,1,1,1,1,1,4],
+ 5,C4);
+ // ── Randy Dandy Oh ──
+ var randy=pub("Randy Dandy Oh","Sea Shanty (Trad.)",130,
+ [G4,G4,A4,B4,B4,A4,G4,E4,D4,G4,G4,A4,B4,D5,B4,A4,G4,E4,D4,G4,A4,B4,D5,B4,G4],
+ [3,3,0,3,3,0,3,2,1,3,3,0,3,1,3,0,3,2,1,3,0,3,1,3,3],
+ [1,1,1,2,1,1,1,1,2,1,1,1,2,1,1,1,1,1,2,1,1,2,1,1,4],
+ 5,G4);
+ // ── South Australia ──
+ var southaus=pub("South Australia","Sea Shanty (Trad.)",115,
+ [C4,C4,D4,E4,G4,G4,E4,D4,C4,E4,G4,A4,G4,E4,C4,D4,E4,G4,E4,D4,C4,C4,E4,G4,E4,C4],
+ [0,0,1,2,3,3,2,1,0,2,3,0,3,2,0,1,2,3,2,1,0,0,2,3,2,0],
+ [1,1,1,1,2,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,4],
+ 5,C4);
+ // ── Roll the Old Chariot ──
+ var chariot=pub("Roll the Old Chariot Along","Sea Shanty (Trad.)",120,
+ [C4,E4,G4,G4,G4,A4,G4,E4,C4,D4,E4,F4,E4,D4,C4,C4,E4,G4,C5,A4,G4,E4,D4,C4],
+ [0,2,3,3,3,0,3,2,0,1,2,1,2,1,0,0,2,3,0,0,3,2,1,0],
+ [1,1,1,1,1,1,1,1,2,1,1,1,1,1,3,1,1,1,2,1,1,1,1,4],
+ 5,C4);
+ // ── Haul Away Joe ──
+ var hauljoe=pub("Haul Away Joe","Sea Shanty (Trad.)",115,
+ [D4,D4,F4,A4,A4,G4,F4,D4,D4,F4,A4,C5,A4,G4,F4,D4,F4,A4,G4,F4,D4,C4,D4],
+ [0,0,1,0,0,3,1,0,0,1,0,0,0,3,1,0,1,0,3,1,0,1,0],
+ [1,1,1,2,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,2,1,4],
+ 5,D4);
+ // ── Spanish Ladies ──
+ var spanish=pub("Spanish Ladies","Royal Navy Shanty (1790s)",110,
+ [E4,E4,D4,C4,D4,E4,F4,G4,A4,G4,F4,E4,D4,C4,D4,E4,F4,E4,D4,C4,B3,A3,G3,A3,B3,C4,D4,E4],
+ [2,2,1,0,1,2,1,3,0,3,1,2,1,0,1,2,1,2,1,0,3,0,3,0,3,0,1,2],
+ [1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,4],
+ 5,C4);
+ // ── The Skye Boat Song ──
+ var skye=pub("The Skye Boat Song","Scottish (1884)",85,
+ [C4,F4,A4,G4,F4,E4,F4,G4,A4,C5,A4,G4,F4,E4,D4,C4,F4,A4,G4,F4,E4,F4,G4,A4,F4,D4,C4],
+ [0,1,0,3,1,2,1,3,0,0,0,3,1,2,1,0,1,0,3,1,2,1,3,0,1,1,0],
+ [1,2,1,1,1,1,1,2,1,2,1,1,1,1,1,2,2,1,1,1,1,1,2,1,1,1,4],
+ 4,F4);
+ // ── Bella Ciao ──
+ var bella=pub("Bella Ciao","Italian Partisan Folk (1900s)",120,
+ [A3,B3,C4,D4,D4,C4,D4,E4,A3,B3,C4,D4,D4,C4,B3,A3,E4,E4,D4,E4,F4,F4,E4,D4,C4,B3,A3,C4,B3,A3],
+ [0,3,0,1,1,0,1,2,0,3,0,1,1,0,3,0,2,2,1,2,1,1,2,1,0,3,0,1,3,0],
+ [1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,1,2,1,1,1,1,1,2,1,1,4],
+ 5,A3);
+ return [drunken,wellerman,molly,whiskey,parting,leavejohnny,blowman,randy,southaus,chariot,hauljoe,spanish,skye,bella,amazing,auld,saints,clementine,scarborough,bonnie];
})();
var SYNTH_GENRES={"Singalong":SINGALONG_PIECES,"Christmas":CHRISTMAS_PIECES,"Folk":FOLK_PIECES,"Classical":CLASSICAL_PIECES,"Video Games":VIDEOGAME_PIECES,"Chiptune Originals":CHIPTUNE_PIECES};
function buildClassicalNotes(piece){
- var raw=piece.melody.filter(function(m){return activePads[m.l];})
+ return piece.melody.filter(function(m){return activePads[m.l];})
.map(function(m){
- // Find matching frequency from background notes at same time
- var freq=261.63; // default C4
+ var freq=261.63;
for(var i=0;i=MIN_GAP){
- result.push(raw[i]);lastTime=raw[i].time;
- }
- }
- return result;
}
function beginClassical(){
@@ -1977,7 +2024,8 @@ let laneFlash=[0,0,0,0,0],msgTmr=null,prevBtns={},gameSynthNodes=[],classicalHit
let paused=false,pauseTime=0;
var gpMap=JSON.parse(localStorage.getItem("drgameGpMap")||"null")||{0:2,1:3,2:0,3:1,4:4,8:4};
var remapping=false,remapStep=0,remapResult={};
-var gameSpeed=1.0,masterVolume=1.0;
+var _savedSettings=JSON.parse(localStorage.getItem("drgameSettings")||"{}");
+var gameSpeed=_savedSettings.speed||1.0,masterVolume=_savedSettings.volume||1.0;
let gameRhythm=null;
const HIT_WIN=0.17,SPEED=260;
@@ -1999,6 +2047,16 @@ function buildPadToggles(){
});
}
buildPadToggles();
+function saveSettings(){localStorage.setItem("drgameSettings",JSON.stringify({speed:gameSpeed,volume:masterVolume}));}
+function setSpeed(v){gameSpeed=v/100;document.getElementById("speed-val").textContent=v+"%";saveSettings();}
+function setVolume(v){masterVolume=v/100;document.getElementById("vol-val").textContent=v+"%";saveSettings();}
+function resetSettings(){gameSpeed=1.0;masterVolume=1.0;document.getElementById("speed-slider").value=100;document.getElementById("vol-slider").value=100;document.getElementById("speed-val").textContent="100%";document.getElementById("vol-val").textContent="100%";saveSettings();}
+function loadSettings(){
+ document.getElementById("speed-slider").value=Math.round(gameSpeed*100);
+ document.getElementById("speed-val").textContent=Math.round(gameSpeed*100)+"%";
+ document.getElementById("vol-slider").value=Math.round(masterVolume*100);
+ document.getElementById("vol-val").textContent=Math.round(masterVolume*100)+"%";
+}
function setHitMode(m){
classicalHitMode=m;
document.getElementById("hitmode-drums").className="smbtn"+(m==='drums'?' purple':'');
@@ -2045,7 +2103,7 @@ function buildMenu(){
});
updateHitModeVisibility();
}
-buildMenu();
+buildMenu();loadSettings();
function addPlayer(){players.push({name:"Player "+(players.length+1)});buildMenu();}
function setMode(m){
mode=m;