diff --git a/index.html b/index.html index f13de3a..1bdf53b 100644 --- a/index.html +++ b/index.html @@ -1816,11 +1816,268 @@ const CLASSICAL_PIECES=(function(){ })(); // ── Flight of the Bumblebee ── - var bumblebee=tp("Flight of the Bumblebee","Rimsky-Korsakov",180, - [E5,Eb5,D5,C5,B4,Bb4,A4,Ab4,G4,Gb4,F4,E4,F4,Gb4,G4,Ab4,A4,Bb4,B4,C5,D5,Eb5], - [2,1,0,2,3,2,1,0,3,2,1,0,1,2,3,0,1,2,3,2,0,1], - [{d:0.20,v:0.2,i:'strings'},{d:0.16,v:0.26,i:'strings'},{d:0.14,v:0.32,i:'strings'},{d:0.12,v:0.38,i:'strings'},{d:0.11,v:0.44,i:'strings'},{d:0.10,v:0.48,i:'strings'},{d:0.09,v:0.52,i:'strings'},{d:0.08,v:0.56,i:'strings'},{d:0.07,v:0.6,i:'strings'}], - [E4,Ab4,B4,E5]); + // Conductor-style: ~80s, A minor, famous chromatic runs + // Fast chromatic passages play in background; player hits accent peaks/valleys + var bumblebee=(function(){ + var bg=[],mel=[]; + function tutti(time,freq,dur,v){ + bg.push({t:time,f:freq,d:dur,i:'strings',v:v}); + bg.push({t:time,f:freq,d:dur,i:'brass',v:v*0.5}); + if(freq>200)bg.push({t:time,f:freq/2,d:dur,i:'bass',v:v*0.4}); + } + function timp(time,v){bg.push({t:time,f:A3,d:0.4,i:'timpani',v:v||0.5});} + + // Chromatic scale note arrays + var chromDown=[E5,Eb5,D5,Db5,C5,B4,Bb4,A4,Ab4,G4,Gb4,F4,E4]; + var chromUp=[E4,F4,Gb4,G4,Ab4,A4,Bb4,B4,C5,Db5,D5,Eb5,E5]; + + // Helper: play a fast chromatic run (background) with accent hits + // Every 4th note is hittable — player conducts the peaks + function chromRun(t0,notes,lanes,v,speed){ + var ct=t0; + notes.forEach(function(f,i){ + bg.push({t:ct,f:f,d:speed*0.85,i:'strings',v:v*0.6}); + bg.push({t:ct,f:f,d:speed*0.85,i:'woodwind',v:v*0.3}); + if(i%4===0){ + mel.push({t:ct,l:lanes[Math.floor(i/4)%lanes.length]}); + bg.push({t:ct,f:f,d:speed*2,i:'strings',v:v}); // accent + } + ct+=speed; + }); + return ct; + } + + // === CONTINUOUS HARMONIC BED === + var harmony=[ + [0,5,[A3,C4,E4],0.06], // Am - intro + [5,20,[A3,C4,E4],0.1], // Am - first runs + [20,35,[A3,C4,E4],0.14], // Am - development + [35,50,[E4,G4,B4],0.12], // Em - modulation + [50,65,[A3,C4,E4],0.18], // Am - recapitulation + [65,80,[A3,C4,E4],0.22], // Am - climax + [80,88,[A3,C4,E4],0.14] // Am - coda + ]; + harmony.forEach(function(h){ + for(var ht=h[0];ht