diff --git a/index.html b/index.html
index 7c47db5..9b42c93 100644
--- a/index.html
+++ b/index.html
@@ -849,8 +849,8 @@ const CLASSICAL_PIECES=(function(){
var hmk=(function(){
var bg=[],mel=[];
function orch(t,freq,dur,v,inst){bg.push({t:t,f:freq,d:dur,i:inst||'strings',v:v||0.3});}
- var theme=[A3,B3,C4,D4,E4,C4,E4,Eb4,E4,Eb4,E4,D4,C4,B3];
- var lanes=[0,1,2,0,1,2,1,3,1,3,1,0,2,1];
+ var theme=[A3,B3,C4,D4,E4,C4,E4,D4,B3,D4,Db4,A3,Db4,A3];
+ var lanes=[0,1,2,0,1,2,1,0,3,0,1,3,1,3];
var t=0;
// Pass 1: Very slow, barely audible (creeping start)
var d0=0.55;
@@ -2094,18 +2094,18 @@ const CLASSICAL_PIECES=(function(){
})();
// ── Morning Mood ──
- // Grieg's Peer Gynt — gentle sunrise in F major, ~80s
- // Famous flute melody rising like dawn, builds to full orchestra
+ // Grieg's Peer Gynt — gentle sunrise in E major, ~80s
+ // Famous flute melody: G#-A-B-C#-B-A, then G#-A-B-C#-E-D#-C#-B-A-G#
var morning=(function(){
var bg=[],mel=[],t=0,q=60/60; // slow, pastoral tempo
function ww(t,f,d,v){bg.push({t:t,f:f,d:d,i:'woodwind',v:v||0.25});}
function str(t,f,d,v){bg.push({t:t,f:f,d:d,i:'strings',v:v||0.3});}
function brs(t,f,d,v){bg.push({t:t,f:f,d:d,i:'brass',v:v||0.35});}
- // Gentle harmonic bed — sustained strings simulating dawn
+ // Gentle harmonic bed — E major sustained strings
var harm=[
- [0,18,[F3,A3,C4],0.06],[18,36,[F3,A3,C4],0.1],[36,54,[F3,A3,C4],0.15],
- [54,70,[Bb3,D4,F4],0.14],[70,85,[F3,A3,C4],0.18]
+ [0,18,[E3,Ab3,B3],0.06],[18,36,[E3,Ab3,B3],0.1],[36,54,[E3,Ab3,B3],0.15],
+ [54,70,[A3,Db4,E4],0.14],[70,85,[E3,Ab3,B3],0.18]
];
harm.forEach(function(h){
for(var ht=h[0];ht0)bg.push({t:t,f:n[0],d:n[1]*0.9,i:'brass',v:v2*0.5});
+ function str(t,f,d,v){bg.push({t:t,f:f,d:d,i:'strings',v:v||0.4});}
+ function brs(t,f,d,v){bg.push({t:t,f:f,d:d,i:'brass',v:v||0.35});}
+
+ // Harmonic bed
+ var harm=[
+ [0,12,[C3,E3,G3],0.06],[12,30,[C3,E3,G3],0.1],[30,50,[C3,E3,G3],0.14],
+ [50,65,[G3,B3,D4],0.12],[65,80,[C3,E3,G3],0.18]
+ ];
+ harm.forEach(function(h){
+ for(var ht=h[0];ht0)brs(t,n[0],n[1]*0.9,wv*0.4);
+ // Add waltz bass on beat 1 of each 3-beat group
+ if(n[1]>=q*2)waltz(t,C3,E3,wv);
+ mel.push({t:t,l:n[2]});t+=n[1];bi++;
+ });
+ t+=q;
+ }
+
+ // === SECTION 3 (30-50s): Second waltz — contrasting theme ===
+ // More lyrical flowing melody
+ var waltz2=[
+ [E4,q*2,2],[D4,q,1],[C4,q*3,0],[E4,q*2,2],[G4,q,3],
+ [G4,q*2,3],[F4,q,1],[E4,q*3,2],[D4,q*2,1],[E4,q,2],
+ [F4,q*2,1],[E4,q,2],[D4,q*3,1],[C4,q*3,0]
+ ];
+ for(var w2=0;w2<2;w2++){
+ var wv2=0.38+w2*0.08;
+ waltz2.forEach(function(n){
+ str(t,n[0],n[1]*0.9,wv2);
+ if(w2>0)brs(t,n[0],n[1]*0.9,wv2*0.4);
+ bg.push({t:t,f:n[0]/2,d:n[1]*0.9,i:'bass',v:wv2*0.3});
+ if(n[1]>=q*2)waltz(t,C3,E3,wv2);
mel.push({t:t,l:n[2]});t+=n[1];
});
- t+=0.4;
+ t+=q;
}
- // Recap theme 1 with full orchestra
- th1.forEach(function(n){
- bg.push({t:t,f:n[0],d:n[1]*0.9,i:'brass',v:0.55});bg.push({t:t,f:n[0],d:n[1]*0.9,i:'strings',v:0.45});
- bg.push({t:t,f:n[0]/2,d:n[1]*0.9,i:'bass',v:0.35});
+
+ // === SECTION 4 (50-65s): Waltz 1 returns — full orchestra ===
+ waltz1.forEach(function(n){
+ str(t,n[0],n[1]*0.9,0.52);brs(t,n[0],n[1]*0.9,0.4);
+ bg.push({t:t,f:n[0]/2,d:n[1]*0.9,i:'bass',v:0.3});
+ if(n[1]>=q*2)waltz(t,C3,E3,0.5);
mel.push({t:t,l:n[2]});t+=n[1];
});
- t+=0.4;
- // Finale waltz chords
- for(var c=0;c<4;c++){
- [C4,E4,G4,C5].forEach(function(f){bg.push({t:t,f:f,d:q*2.5,i:'brass',v:0.6});bg.push({t:t,f:f,d:q*2.5,i:'strings',v:0.5});});
+ t+=q;
+ // Faster, more energetic repeat
+ waltz1.forEach(function(n){
+ str(t,n[0],n[1]*0.85,0.55);brs(t,n[0],n[1]*0.85,0.45);
+ bg.push({t:t,f:n[0],d:n[1]*0.85,i:'choir',v:0.2});
+ mel.push({t:t,l:n[2]});t+=n[1]*0.9;
+ });
+
+ // === FINALE: Big waltz chords ===
+ t+=q;
+ for(var c=0;c<6;c++){
+ [C4,E4,G4,C5].forEach(function(f){brs(t,f,q*2.5,0.6);str(t,f,q*2.5,0.5);});
+ bg.push({t:t,f:C3,d:q*2,i:'timpani',v:0.5});
mel.push({t:t,l:4});t+=q*3;
}
- [C4,E4,G4,C5].forEach(function(f){bg.push({t:t,f:f,d:2.5,i:'brass',v:0.6});bg.push({t:t,f:f,d:2.5,i:'strings',v:0.5});});
+ [C4,E4,G4,C5].forEach(function(f){brs(t,f,2.5,0.65);str(t,f,2.5,0.55);});
bg.push({t:t,f:C3,d:2.0,i:'timpani',v:0.65});mel.push({t:t,l:4});
+
return {n:"The Blue Danube",composer:"J. Strauss II",bpm:180,duration:Math.ceil(t+3),isClassical:true,bg:bg,melody:mel};
})();
@@ -2573,10 +2633,10 @@ const CLASSICAL_PIECES=(function(){
// ── Dance of the Sugar Plum Fairy ──
var sugarplum=(function(){
var bg=[],mel=[],t=0,q=0.4;
- var theme=[E4,Eb4,E4,B3,E4,Eb4,E4,B3,E4,F4,E4,D4,C4,B3,A3,B3];
- var tLn=[2,1,2,3,2,1,2,3,2,1,2,0,1,3,0,3];
- var ans=[E4,G4,B4,E5,B4,G4,E4,B3];
- var aLn=[2,3,0,2,0,3,2,3];
+ var theme=[E4,Eb4,E4,B3,D4,C4,A3,C4,E4,A4,B3,E4,Ab4,B4,A4];
+ var tLn=[2,1,2,3,0,2,0,2,2,1,3,2,1,0,1];
+ var ans=[E4,Eb4,E4,B3,D4,C4,A3];
+ var aLn=[2,1,2,3,0,2,0];
for(var rep=0;rep<5;rep++){
var v=0.2+rep*0.08;
var inst=rep<2?'woodwind':rep<4?'strings':'brass';
@@ -2593,8 +2653,8 @@ const CLASSICAL_PIECES=(function(){
});
t+=0.4;
}
- [E4,G4,B4,E5].forEach(function(f){bg.push({t:t,f:f,d:2.0,i:'strings',v:0.5});});
- bg.push({t:t,f:E3,d:1.5,i:'bass',v:0.4});mel.push({t:t,l:4});
+ [E3,B3,E4,Ab4,B4].forEach(function(f){bg.push({t:t,f:f,d:2.0,i:'strings',v:0.5});});
+ bg.push({t:t,f:E3/2,d:1.5,i:'bass',v:0.4});mel.push({t:t,l:4});
return {n:"Dance of the Sugar Plum Fairy",composer:"Tchaikovsky",bpm:120,duration:Math.ceil(t+2.5),isClassical:true,bg:bg,melody:mel};
})();
@@ -2876,8 +2936,8 @@ const CLASSICAL_PIECES=(function(){
var bg=[],mel=[],t=0,q=0.35;
var motif=[E4,Eb4,E4,Eb4,E4,B3,D4,C4,A3];
var mLn=[2,1,2,1,2,3,0,2,0];
- var ph2=[C4,E4,A4,B4,E4,C5,B4,A4];
- var p2Ln=[1,2,0,3,2,0,3,0];
+ var ph2=[C4,E4,A4,B4,E4,Ab4,B4,A4];
+ var p2Ln=[1,2,0,3,2,1,3,0];
for(var rep=0;rep<5;rep++){
var v=0.2+rep*0.08;
var inst=rep<2?'woodwind':rep<3?'strings':'brass';
@@ -2909,8 +2969,9 @@ const CLASSICAL_PIECES=(function(){
var canon=(function(){
var bg=[],mel=[],t=0,q=0.55;
var bassLine=[D3,A3,B3,Gb3,G3,D3,G3,A3];
- var melody2=[A4,Gb4,G4,A4,Gb4,D4,Gb4,G4,A4,B4,G4,A4,Gb4,D4,E4,Gb4];
- var m2Ln=[1,2,3,1,2,0,2,3,1,0,3,1,2,0,1,2];
+ // Real Pachelbel violin melody: F#-E-D-C#-B-A-B-C# (var 1) then D-C#-B-A-G-F#-G-A (var 2)
+ var melody2=[Gb4,E4,D4,Db4,B3,A3,B3,Db4,D4,Db4,B3,A3,G3,Gb3,G3,A3];
+ var m2Ln=[2,1,0,1,3,0,3,1,0,1,3,0,3,2,3,0];
for(var rep=0;rep<4;rep++){
var v=0.2+rep*0.08;
bassLine.forEach(function(f,i){