diff --git a/index.html b/index.html
index 09bf13e..56c508f 100644
--- a/index.html
+++ b/index.html
@@ -1429,7 +1429,7 @@ const CLASSICAL_PIECES=(function(){
})();
function buildClassicalNotes(piece){
- return piece.melody.filter(function(m){return activePads[m.l];})
+ var raw=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
@@ -1440,6 +1440,16 @@ function buildClassicalNotes(piece){
return{time:m.t,lane:m.l,freq:freq,hit:false,missed:false};
})
.sort(function(a,b){return a.time-b.time;});
+ // Enforce minimum gap between notes so stacked/simultaneous notes are playable
+ // Without this, fast passes create 2-3 notes within 0.07s on different lanes
+ var MIN_GAP=0.12;
+ var result=[],lastTime=-1;
+ for(var i=0;i=MIN_GAP){
+ result.push(raw[i]);lastTime=raw[i].time;
+ }
+ }
+ return result;
}
function beginClassical(){
@@ -1449,7 +1459,7 @@ function beginClassical(){
gameStartTime=ac.currentTime+0.15;
for(var i=0;ilaneFlash[lane]=0,120);
if(!playing)return;
@@ -1705,15 +1717,15 @@ function triggerPad(lane){
// Play orchestral hit sound for classical mode
if(isClassicalOrch&&best.freq){
var ac=getAc(),ct=ac.currentTime;
- playSynth(ac,best.freq,ct,0.3,'strings',0.5,[]);
- playSynth(ac,best.freq,ct,0.3,'brass',0.3,[]);
+ playSynth(ac,best.freq,ct,0.35,'strings',0.7,[]);
+ playSynth(ac,best.freq,ct,0.35,'brass',0.4,[]);
} else if(isClassicalOrch){
- playDrumAt(getAc(),lane,getAc().currentTime,8,[]);
+ playDrumAt(getAc(),lane,getAc().currentTime,3,[]);
}
showMsg(bestD<0.05?"PERFECT!":"GOOD",bestD<0.05?"#68d391":"#d69e2e");
} else {
- // Miss — play drum sound as feedback even in orchestra mode
- if(isClassicalOrch)playDrumAt(getAc(),lane,getAc().currentTime,4,[]);
+ // Miss — quiet drum thud as feedback
+ if(isClassicalOrch)playDrumAt(getAc(),lane,getAc().currentTime,2,[]);
cStreak=0;showMsg("MISS","#fc8181");
}
updateHud();