diff --git a/index.html b/index.html
index 9280dac..c76d36b 100644
--- a/index.html
+++ b/index.html
@@ -3971,11 +3971,93 @@ const SINGALONG_PIECES=(function(){
bg.push({t:t,f:r/2,d:1.5,i:'timpani',v:0.55});mel.push({t:t,l:4});
return {n:name,composer:origin,bpm:bpm,duration:Math.ceil(t+2.5),isClassical:true,bg:bg,melody:mel};
}
- var drunken=pub("Drunken Sailor","Sea Shanty (Trad.)",140,
- [D4,D4,D4,D4,E4,F4,D4,D4,D4,D4,E4,D4,C4,D4,D4,D4,E4,F4,D4,D4,F4,E4,C4,A3,D4,D4,D4,D4,F4,A4,A4,G4,F4,E4,D4,C4,D4],
- [0,0,0,0,2,1,0,0,0,0,2,0,1,0,0,0,2,1,0,0,1,2,1,0,0,0,0,0,1,0,0,3,1,2,0,1,0],
- [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,8],
- 4,D4);
+ var drunken=(function(){
+ // Accurate "What Shall We Do With A Drunken Sailor" from sheet music
+ // D minor, 4/4, ~140 BPM
+ var bg=[],mel=[],t=0,q=60/140; // quarter note duration at 140 bpm
+ var e=q/2; // eighth note
+ function note(f,dur,lane,inst,v){
+ bg.push({t:t,f:f,d:dur*0.85,i:inst||'strings',v:v||0.35});
+ mel.push({t:t,l:lane});
+ t+=dur;
+ }
+ function chord(fs,dur,inst,v){
+ fs.forEach(function(f){bg.push({t:t,f:f,d:dur*0.85,i:inst||'strings',v:v||0.25});});
+ }
+ function rest(dur){t+=dur;}
+
+ for(var pass=0;pass<3;pass++){
+ var v=0.25+pass*0.1;
+ var inst=pass===0?'woodwind':pass===1?'strings':'brass';
+ // Add bass + chord backing
+ if(pass>0){
+ var ct=t;
+ // Am chord backing per measure (8 measures per verse+chorus)
+ var chords=[[A3,C4,E4],[A3,C4,E4],[G3,B3,D4],[G3,B3,D4],
+ [A3,C4,E4],[A3,C4,E4],[C4,E4,G4],[D4,F4,A4]];
+ chords.forEach(function(ch,ci){
+ ch.forEach(function(f){bg.push({t:ct+ci*q*4,f:f,d:q*3.5,i:'strings',v:v*0.3});});
+ bg.push({t:ct+ci*q*4,f:ch[0]/2,d:q*3.5,i:'bass',v:v*0.35});
+ });
+ }
+
+ // M1-2: "What shall we do with a drunken sailor?" (Am)
+ // A A A, A A A, A A, D F A
+ note(A4,e,0,inst,v); note(A4,e,0,inst,v); note(A4,e,0,inst,v);
+ note(A4,e,0,inst,v); note(A4,e,0,inst,v);
+ note(A4,e,0,inst,v); note(A4,e,0,inst,v);
+ note(A4,e,0,inst,v);
+ note(D4,q,1,inst,v); note(F4,q,1,inst,v); note(A4,q*2,0,inst,v);
+
+ // M3-4: "What shall we do with a drunken sailor?" (G)
+ note(G4,e,3,inst,v); note(G4,e,3,inst,v); note(G4,e,3,inst,v);
+ note(G4,e,3,inst,v); note(G4,e,3,inst,v);
+ note(G4,e,3,inst,v); note(G4,e,3,inst,v);
+ note(G4,e,3,inst,v);
+ note(C4,q,2,inst,v); note(E4,q,2,inst,v); note(G4,q*2,3,inst,v);
+
+ // M5-6: "What shall we do with a drunken sailor" (Am)
+ note(A4,e,0,inst,v); note(A4,e,0,inst,v); note(A4,e,0,inst,v);
+ note(A4,e,0,inst,v); note(A4,e,0,inst,v);
+ note(A4,e,0,inst,v); note(A4,e,0,inst,v);
+ note(A4,e,0,inst,v);
+ note(B4,q,3,inst,v); note(C5,q,1,inst,v); note(D5,q*2,1,inst,v);
+
+ // M7-8: "early in the morning?" (C-A-G-E-D-D)
+ note(C5,q,0,inst,v); note(A4,q,0,inst,v);
+ note(G4,q,3,inst,v); note(E4,q,2,inst,v);
+ note(D4,q*2,1,inst,v); note(D4,q*2,1,inst,v);
+
+ // M9-10: "Way hey and up she ri-ses" (chorus)
+ note(A4,q*2,0,inst,v*1.2);
+ note(A4,q+e,0,inst,v*1.2); note(A4,e,0,inst,v*1.2);
+ note(A4,q,0,inst,v*1.2); note(D4,q,1,inst,v*1.2);
+ note(F4,q,1,inst,v*1.2); note(A4,q,0,inst,v*1.2);
+
+ // M11-12: "Way hey and up she ri-ses" (on G)
+ note(G4,q*2,3,inst,v*1.2);
+ note(G4,q+e,3,inst,v*1.2); note(G4,e,3,inst,v*1.2);
+ note(G4,q,3,inst,v*1.2); note(C4,q,2,inst,v*1.2);
+ note(E4,q,2,inst,v*1.2); note(G4,q,3,inst,v*1.2);
+
+ // M13-14: "Way hey and up she ri-ses"
+ note(A4,q*2,0,inst,v*1.2);
+ note(A4,q+e,0,inst,v*1.2); note(A4,e,0,inst,v*1.2);
+ note(A4,q,0,inst,v*1.2); note(B4,q,3,inst,v*1.2);
+ note(C5,q,1,inst,v*1.2); note(D5,q,1,inst,v*1.2);
+
+ // M15-16: "Ear-ly in the morning" (ending)
+ note(C5,q,0,inst,v*1.2); note(A4,q,0,inst,v*1.2);
+ note(G4,q,3,inst,v*1.2); note(E4,q,2,inst,v*1.2);
+ note(D4,q*2,1,inst,v*1.2); note(D4,q*2,1,inst,v*1.2);
+
+ t+=q; // small gap between passes
+ }
+ // Finale chord
+ [A3,C4,E4,A4].forEach(function(f){bg.push({t:t,f:f,d:2.5,i:'brass',v:0.55});bg.push({t:t,f:f,d:2.5,i:'strings',v:0.4});});
+ bg.push({t:t,f:A3/2,d:2.0,i:'timpani',v:0.6});mel.push({t:t,l:4});
+ return {n:"Drunken Sailor",composer:"Sea Shanty (Trad.)",bpm:140,duration:Math.ceil(t+3),isClassical:true,bg:bg,melody:mel};
+ })();
var molly=pub("Molly Malone","Irish (1880s)",100,
[C4,E4,E4,E4,F4,G4,G4,G4,A4,G4,F4,E4,D4,E4,F4,G4,A4,C5,C5,B4,A4,G4,F4,E4,D4,C4,E4,G4,C5,C5,B4,A4,G4,F4,E4,D4,C4],
[0,2,2,2,1,3,3,3,0,3,1,2,1,2,1,3,0,0,0,3,0,3,1,2,1,0,2,3,0,0,3,0,3,1,2,1,0],