diff --git a/index.html b/index.html index 7c47db5..fc1c2ec 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){ @@ -3640,14 +3701,14 @@ const SINGALONG_PIECES=(function(){ [1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,3], 4,E4); var amazing=pub("Amazing Grace","J. Newton (1779)",80, - [G4,C5,E5,E5,D5,C5,A4,G4,G4,C5,E5,E5,D5,E5,E5,G5,G5,E5,C5,C5,A4,G4,G4,C5,E5,E5,D5,C5], - [3,0,2,2,1,0,0,3,3,0,2,2,1,2,2,3,3,2,0,0,0,3,3,0,2,2,1,0], - [1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,2,1,2,1,2,1,2,1,2,1,2,1,4], + [G4,C5,E5,C5,E5,D5,C5,A4,G4,G4,C5,E5,C5,E5,D5,G5,G5,E5,C5,C5,A4,G4,G4,C5,E5,C5,E5,D5,C5], + [3,0,2,0,2,1,0,0,3,3,0,2,0,2,1,3,3,2,0,0,0,3,3,0,2,0,2,1,0], + [1,2,1,1,2,2,1,2,2,1,2,1,1,2,4,2,1,2,1,2,1,2,1,2,1,1,2,2,4], 4,C4); var auld=pub("Auld Lang Syne","R. Burns (1788)",95, - [C4,F4,F4,F4,A4,G4,F4,G4,A4,F4,F4,A4,C5,D5,C5,D5,C5,D5,C5,A4,F4,G4,A4,G4,F4,G4], - [0,1,1,1,0,3,1,3,0,1,1,0,0,1,0,1,0,1,0,0,1,3,0,3,1,3], - [1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,2,1,1,1,2,1,1,1,2,1,4], + [C4,F4,F4,F4,A4,G4,F4,G4,A4,F4,F4,A4,C5,D5,D5,D5,C5,A4,F4,F4,G4,A4,G4,F4,D4,C4], + [0,1,1,1,0,3,1,3,0,1,1,0,0,1,1,1,0,0,1,1,3,0,3,1,1,0], + [1,2,1,1,1,2,1,1,1,2,1,1,1,4,1,1,1,2,1,1,1,2,1,2,1,4], 4,F4); var saints=pub("When the Saints Go Marching In","Spiritual (Trad.)",120, [C4,E4,F4,G4,C4,E4,F4,G4,C4,E4,F4,G4,E4,C4,E4,D4,E4,E4,D4,C4,C4,E4,G4,G4,F4,E4,F4,G4,E4,C4,D4,C4], @@ -3660,15 +3721,15 @@ const SINGALONG_PIECES=(function(){ [1,1,1,2,1,1,1,2,1,1,2,1,1,1,2,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,4], 4,C4); var scarborough=pub("Scarborough Fair","English (Medieval)",85, - [D4,D4,A4,A4,D5,D5,C5,D5,E5,D5,C5,A4,Bb4,A4,G4,B4,A4,G4,F4,F4,G4,A4,F4,E4,D4,E4,F4,D4,D4,F4,G4,A4,G4,F4,E4,D4], - [0,0,0,0,1,1,0,1,2,1,0,0,2,0,3,3,0,3,1,1,3,0,1,2,0,2,1,0,0,1,3,0,3,1,2,0], + [D4,D4,A4,A4,D5,D5,C5,D5,E5,D5,C5,A4,B4,A4,G4,B4,A4,G4,F4,F4,G4,A4,F4,E4,D4,E4,F4,D4,D4,F4,G4,A4,G4,F4,E4,D4], + [0,0,0,0,1,1,0,1,2,1,0,0,3,0,3,3,0,3,1,1,3,0,1,2,0,2,1,0,0,1,3,0,3,1,2,0], [3,3,2,1,3,1,1,1,3,2,1,1,1,1,2,1,3,3,1,2,1,1,1,1,2,1,3,3,1,1,1,3,1,1,1,4], 4,D4); var bonnie=pub("My Bonnie Lies Over the Ocean","Scottish (1881)",120, - [G4,F4,E4,F4,G4,A4,G4,F4,E4,C4,D4,E4,F4,G4,F4,E4,F4,G4,A4,G4,F4,E4,D4,C4,E4,G4,E4,C4], - [3,1,2,1,3,0,3,1,2,0,1,2,1,3,1,2,1,3,0,3,1,2,1,0,2,3,2,0], - [1,1,1,1,1,2,1,1,1,2,1,1,2,1,1,1,1,1,2,1,1,1,1,2,1,2,1,4], - 5,C4); + [G4,C5,C5,D5,E5,E5,D5,C5,A4,G4,C5,C5,D5,E5,G5,E5,D5,G4,C5,C5,D5,E5,E5,D5,C5,A4,A4,G4,F4,E4,F4,G4,E4,C4,E5,G5,G5,G5,E5,C5,C5,D5,E5,G5,G5,G5,F5,E5,D5,C5], + [3,0,0,1,2,2,1,0,0,3,0,0,1,2,3,2,1,3,0,0,1,2,2,1,0,0,0,3,1,2,1,3,2,0,2,3,3,3,2,0,0,1,2,3,3,3,1,2,1,0], + [1,1,1,1,1,2,1,1,2,1,1,1,1,1,2,1,2,1,1,1,1,1,2,1,1,2,1,1,1,1,1,2,1,4,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,4], + 4,C4); // ── Wellerman (accurate melody with driving stomp beat) ── var wellerman=(function(){ var bg=[],mel=[],t=0,q=0.32;