Fuller Beethoven's 5th orchestra: harmony voices, woodwinds, horns
Replaced thin orch() helper (strings + brass + bass) with tutti() that creates 5 simultaneous voices per note: - 1st violins (melody), trumpets (doubling), 2nd violins (5th below), clarinets (3rd below), cellos/basses (octave below) Added between sections: - Horn pad (sustained Eb+G brass) on held notes - Woodwind countermelody (clarinets in 3rds) on soft restatement - Viola parallel motion on scalar passages - Bass walking on downbeats during runs - Full 3-note chord voicings on power chord section (was 2-note) - Choir with harmony voices (Eb+G+C) on recapitulation - Brass + strings + choir triple-layered on final chord Background nodes: 438 → 565 (29% more orchestral depth) Same 113 hittable melody notes, same 54s duration. https://claude.ai/code/session_01GdFrFqAe9e2DaJ86jZPEZE
This commit is contained in:
+102
-51
@@ -643,101 +643,152 @@ const CLASSICAL_PIECES=(function(){
|
||||
// ── Beethoven's 5th Symphony (Opening) ──
|
||||
var b5=(function(){
|
||||
var q=0.375,e=q/2,bg=[],mel=[];
|
||||
function orch(t,freq,dur,v){
|
||||
bg.push({t:t,f:freq,d:dur,i:'strings',v:v||0.35});
|
||||
bg.push({t:t,f:freq,d:dur,i:'brass',v:(v||0.35)*0.6});
|
||||
if(freq>200)bg.push({t:t,f:freq/2,d:dur,i:'bass',v:(v||0.35)*0.5});
|
||||
// Full orchestra: melody + harmony voices + woodwinds + horns + bass + timpani
|
||||
function tutti(t,freq,dur,v){
|
||||
v=v||0.35;
|
||||
bg.push({t:t,f:freq,d:dur,i:'strings',v:v}); // 1st violins (melody)
|
||||
bg.push({t:t,f:freq,d:dur,i:'brass',v:v*0.6}); // trumpets doubling
|
||||
bg.push({t:t,f:freq*0.75,d:dur,i:'strings',v:v*0.4}); // 2nd violins (harmony 5th below)
|
||||
bg.push({t:t,f:freq*0.6,d:dur,i:'woodwind',v:v*0.35}); // clarinets (harmony 3rd)
|
||||
if(freq>200)bg.push({t:t,f:freq/2,d:dur,i:'bass',v:v*0.5}); // cellos/basses
|
||||
}
|
||||
// Sustained horn/woodwind pad for held notes
|
||||
function pad(t,dur,v){
|
||||
bg.push({t:t,f:Eb4,d:dur,i:'brass',v:(v||0.3)*0.3}); // horn Eb
|
||||
bg.push({t:t,f:G3,d:dur,i:'brass',v:(v||0.3)*0.25}); // horn G
|
||||
bg.push({t:t,f:C4,d:dur,i:'woodwind',v:(v||0.3)*0.2}); // bassoon C
|
||||
}
|
||||
function str(t,freq,dur,v){bg.push({t:t,f:freq,d:dur,i:'strings',v:v||0.3});}
|
||||
// === EXPOSITION ===
|
||||
// Section 1: G-G-G-Eb (THE famous motif, ff)
|
||||
orch(0,G4,0.18,0.5);orch(q,G4,0.18,0.5);orch(q*2,G4,0.18,0.5);
|
||||
orch(q*3,Eb4,1.8,0.55);
|
||||
// Section 1: G-G-G-Eb (THE motif — full orchestra unison, ff)
|
||||
tutti(0,G4,0.18,0.55);tutti(q,G4,0.18,0.55);tutti(q*2,G4,0.18,0.55);
|
||||
tutti(q*3,Eb4,1.8,0.6);pad(q*3,1.8,0.5);
|
||||
bg.push({t:0,f:G3,d:0.18,i:'timpani',v:0.4});
|
||||
mel.push({t:0,l:0},{t:q,l:0},{t:q*2,l:0},{t:q*3,l:3});
|
||||
// Section 2: F-F-F-D (answer phrase)
|
||||
// Section 2: F-F-F-D (answer, whole orchestra)
|
||||
var s=3.2;
|
||||
orch(s,F4,0.18,0.5);orch(s+q,F4,0.18,0.5);orch(s+q*2,F4,0.18,0.5);
|
||||
orch(s+q*3,D4,1.8,0.55);
|
||||
tutti(s,F4,0.18,0.55);tutti(s+q,F4,0.18,0.55);tutti(s+q*2,F4,0.18,0.55);
|
||||
tutti(s+q*3,D4,1.8,0.6);
|
||||
bg.push({t:s+q*3,f:Bb3,d:1.8,i:'brass',v:0.2});bg.push({t:s+q*3,f:F3,d:1.8,i:'woodwind',v:0.18});
|
||||
mel.push({t:s,l:1},{t:s+q,l:1},{t:s+q*2,l:1},{t:s+q*3,l:3});
|
||||
// Section 3: Motif restated by strings (softer echo)
|
||||
// Section 3: Strings restate softly, woodwinds add color
|
||||
s=6.8;
|
||||
str(s,G4,0.16,0.3);str(s+q,G4,0.16,0.3);str(s+q*2,G4,0.16,0.3);
|
||||
str(s+q*3,Eb4,1.2,0.35);
|
||||
bg.push({t:s,f:G4,d:0.16,i:'strings',v:0.3});bg.push({t:s,f:Eb4,d:0.16,i:'woodwind',v:0.2});
|
||||
bg.push({t:s+q,f:G4,d:0.16,i:'strings',v:0.3});bg.push({t:s+q,f:Eb4,d:0.16,i:'woodwind',v:0.2});
|
||||
bg.push({t:s+q*2,f:G4,d:0.16,i:'strings',v:0.3});bg.push({t:s+q*2,f:Eb4,d:0.16,i:'woodwind',v:0.2});
|
||||
bg.push({t:s+q*3,f:Eb4,d:1.2,i:'strings',v:0.35});bg.push({t:s+q*3,f:C4,d:1.2,i:'woodwind',v:0.2});bg.push({t:s+q*3,f:G3,d:1.2,i:'bass',v:0.2});
|
||||
mel.push({t:s,l:0},{t:s+q,l:0},{t:s+q*2,l:0},{t:s+q*3,l:3});
|
||||
s=9.5;
|
||||
str(s,F4,0.16,0.3);str(s+q,F4,0.16,0.3);str(s+q*2,F4,0.16,0.3);
|
||||
str(s+q*3,D4,1.2,0.35);
|
||||
bg.push({t:s,f:F4,d:0.16,i:'strings',v:0.3});bg.push({t:s,f:D4,d:0.16,i:'woodwind',v:0.2});
|
||||
bg.push({t:s+q,f:F4,d:0.16,i:'strings',v:0.3});bg.push({t:s+q,f:D4,d:0.16,i:'woodwind',v:0.2});
|
||||
bg.push({t:s+q*2,f:F4,d:0.16,i:'strings',v:0.3});bg.push({t:s+q*2,f:D4,d:0.16,i:'woodwind',v:0.2});
|
||||
bg.push({t:s+q*3,f:D4,d:1.2,i:'strings',v:0.35});bg.push({t:s+q*3,f:Bb3,d:1.2,i:'woodwind',v:0.2});bg.push({t:s+q*3,f:F3,d:1.2,i:'bass',v:0.2});
|
||||
mel.push({t:s,l:1},{t:s+q,l:1},{t:s+q*2,l:1},{t:s+q*3,l:3});
|
||||
// === DEVELOPMENT ===
|
||||
// Section 4: Faster motifs (compressed)
|
||||
// Section 4: Faster motifs, full orchestra
|
||||
s=12.0;
|
||||
orch(s,G4,0.15,0.45);orch(s+e,G4,0.15,0.45);orch(s+e*2,G4,0.15,0.45);
|
||||
orch(s+e*3,Eb4,0.5,0.5);
|
||||
tutti(s,G4,0.15,0.5);tutti(s+e,G4,0.15,0.5);tutti(s+e*2,G4,0.15,0.5);
|
||||
tutti(s+e*3,Eb4,0.5,0.55);pad(s+e*3,0.5,0.4);
|
||||
mel.push({t:s,l:0},{t:s+e,l:0},{t:s+e*2,l:0},{t:s+e*3,l:3});
|
||||
s=13.0;
|
||||
orch(s,F4,0.15,0.45);orch(s+e,F4,0.15,0.45);orch(s+e*2,F4,0.15,0.45);
|
||||
orch(s+e*3,D4,0.5,0.5);
|
||||
tutti(s,F4,0.15,0.5);tutti(s+e,F4,0.15,0.5);tutti(s+e*2,F4,0.15,0.5);
|
||||
tutti(s+e*3,D4,0.5,0.55);
|
||||
mel.push({t:s,l:1},{t:s+e,l:1},{t:s+e*2,l:1},{t:s+e*3,l:3});
|
||||
// Section 5: Extended scalar passage (descending then ascending)
|
||||
// Section 5: Scalar passage — violins lead, violas in 3rds below, bass walks
|
||||
s=14.2;
|
||||
[G4,F4,Eb4,D4,C4,B3,C4,D4,Eb4,F4,G4,Ab4,Bb4,Ab4,G4,F4,Eb4,D4,C4,B3].forEach(function(f,i){
|
||||
var t2=s+i*e;orch(t2,f,0.16,0.4);mel.push({t:t2,l:[2,1,0,1][i%4]});
|
||||
var scale=[G4,F4,Eb4,D4,C4,B3,C4,D4,Eb4,F4,G4,Ab4,Bb4,Ab4,G4,F4,Eb4,D4,C4,B3];
|
||||
scale.forEach(function(f,i){
|
||||
var t2=s+i*e;
|
||||
bg.push({t:t2,f:f,d:e*0.85,i:'strings',v:0.45});
|
||||
bg.push({t:t2,f:f*0.8,d:e*0.85,i:'strings',v:0.25}); // violas in parallel
|
||||
bg.push({t:t2,f:f*0.6,d:e*0.85,i:'woodwind',v:0.2}); // bassoon
|
||||
if(i%4===0)bg.push({t:t2,f:f/2,d:e*3,i:'bass',v:0.3}); // bass on downbeats
|
||||
mel.push({t:t2,l:[2,1,0,1][i%4]});
|
||||
});
|
||||
// Section 6: Power chords with timpani
|
||||
// Section 6: Power chords — full C minor harmony, horns + timpani
|
||||
s=18.0;
|
||||
[[G4,Eb4],[Ab4,F4],[Bb4,G4],[Ab4,F4],[G4,Eb4],[F4,D4],[Eb4,C4],[D4,B3]].forEach(function(ch,i){
|
||||
var t2=s+i*0.7;ch.forEach(function(f){orch(t2,f,0.6,0.55);});
|
||||
bg.push({t:t2,f:ch[1]/2,d:0.6,i:'timpani',v:0.5});mel.push({t:t2,l:4});
|
||||
[[G4,Eb4,C4],[Ab4,F4,C4],[Bb4,G4,Eb4],[Ab4,F4,C4],[G4,Eb4,C4],[F4,D4,Bb3],[Eb4,C4,Ab3],[D4,B3,G3]].forEach(function(ch,i){
|
||||
var t2=s+i*0.7;
|
||||
ch.forEach(function(f){
|
||||
bg.push({t:t2,f:f,d:0.6,i:'brass',v:0.55});
|
||||
bg.push({t:t2,f:f,d:0.6,i:'strings',v:0.45});
|
||||
});
|
||||
bg.push({t:t2,f:ch[2],d:0.6,i:'bass',v:0.4});
|
||||
bg.push({t:t2,f:ch[2]/2,d:0.6,i:'timpani',v:0.55});
|
||||
mel.push({t:t2,l:4});
|
||||
});
|
||||
// === RECAPITULATION ===
|
||||
// Section 7: Motif returns fortissimo with choir
|
||||
// Section 7: Motif fff — full orchestra + choir + horns
|
||||
s=24.0;
|
||||
orch(s,G4,0.18,0.6);orch(s+q,G4,0.18,0.6);orch(s+q*2,G4,0.18,0.6);
|
||||
orch(s+q*3,Eb4,1.5,0.65);bg.push({t:s+q*3,f:Eb4,d:1.5,i:'choir',v:0.3});
|
||||
tutti(s,G4,0.18,0.65);tutti(s+q,G4,0.18,0.65);tutti(s+q*2,G4,0.18,0.65);
|
||||
tutti(s+q*3,Eb4,1.5,0.7);pad(s+q*3,1.5,0.6);
|
||||
bg.push({t:s+q*3,f:Eb4,d:1.5,i:'choir',v:0.3});bg.push({t:s+q*3,f:G4,d:1.5,i:'choir',v:0.25});
|
||||
bg.push({t:s,f:G3,d:0.2,i:'timpani',v:0.5});
|
||||
mel.push({t:s,l:0},{t:s+q,l:0},{t:s+q*2,l:0},{t:s+q*3,l:3});
|
||||
s=27.0;
|
||||
orch(s,F4,0.18,0.6);orch(s+q,F4,0.18,0.6);orch(s+q*2,F4,0.18,0.6);
|
||||
orch(s+q*3,D4,1.5,0.65);bg.push({t:s+q*3,f:D4,d:1.5,i:'choir',v:0.3});
|
||||
tutti(s,F4,0.18,0.65);tutti(s+q,F4,0.18,0.65);tutti(s+q*2,F4,0.18,0.65);
|
||||
tutti(s+q*3,D4,1.5,0.7);
|
||||
bg.push({t:s+q*3,f:D4,d:1.5,i:'choir',v:0.3});bg.push({t:s+q*3,f:F4,d:1.5,i:'choir',v:0.25});
|
||||
bg.push({t:s+q*3,f:Bb3,d:1.5,i:'brass',v:0.25});
|
||||
mel.push({t:s,l:1},{t:s+q,l:1},{t:s+q*2,l:1},{t:s+q*3,l:3});
|
||||
// Section 8: Ascending scalar with full orchestra
|
||||
// Section 8: Ascending scalar — full orchestra layered
|
||||
s=30.0;
|
||||
[C4,D4,Eb4,F4,G4,Ab4,Bb4,C5,D5,Eb5,D5,C5,Bb4,Ab4,G4,F4].forEach(function(f,i){
|
||||
var t2=s+i*e;orch(t2,f,0.16,0.5);mel.push({t:t2,l:[0,1,2,3][i%4]});
|
||||
var t2=s+i*e;
|
||||
bg.push({t:t2,f:f,d:e*0.85,i:'strings',v:0.5});
|
||||
bg.push({t:t2,f:f,d:e*0.85,i:'woodwind',v:0.25});
|
||||
bg.push({t:t2,f:f*0.75,d:e*0.85,i:'strings',v:0.25});
|
||||
if(i%4===0)bg.push({t:t2,f:f/2,d:e*3,i:'bass',v:0.35});
|
||||
mel.push({t:t2,l:[0,1,2,3][i%4]});
|
||||
});
|
||||
// Section 9: Rapid motif at rising pitches
|
||||
// Section 9: Rapid motif rising — brass + strings unison
|
||||
s=33.5;
|
||||
[[G4,Eb4],[Ab4,F4],[Bb4,G4],[C5,Ab4],[D5,Bb4]].forEach(function(fr,fi){
|
||||
var t2=s+fi*0.9;
|
||||
orch(t2,fr[0],0.14,0.55);orch(t2+e,fr[0],0.14,0.55);orch(t2+e*2,fr[0],0.14,0.55);
|
||||
orch(t2+e*3,fr[1],0.45,0.6);
|
||||
tutti(t2,fr[0],0.14,0.6);tutti(t2+e,fr[0],0.14,0.6);tutti(t2+e*2,fr[0],0.14,0.6);
|
||||
tutti(t2+e*3,fr[1],0.45,0.65);
|
||||
if(fi%2===0)bg.push({t:t2,f:fr[1]/2,d:0.4,i:'timpani',v:0.45});
|
||||
mel.push({t:t2,l:0},{t:t2+e,l:0},{t:t2+e*2,l:0},{t:t2+e*3,l:3});
|
||||
});
|
||||
// Section 10: Dramatic sustained chords with choir
|
||||
// Section 10: Sustained chords — choir + horns + strings (harmonic richness)
|
||||
s=38.5;
|
||||
[[C4,Eb4,G4],[Bb3,D4,F4],[Ab3,C4,Eb4],[G3,B3,D4]].forEach(function(ch,i){
|
||||
var t2=s+i*1.5;
|
||||
ch.forEach(function(f){orch(t2,f,1.3,0.6);bg.push({t:t2,f:f,d:1.3,i:'choir',v:0.25});});
|
||||
bg.push({t:t2,f:NT.C3,d:1.3,i:'timpani',v:0.55});
|
||||
ch.forEach(function(f){
|
||||
bg.push({t:t2,f:f,d:1.3,i:'strings',v:0.5});
|
||||
bg.push({t:t2,f:f,d:1.3,i:'brass',v:0.4});
|
||||
bg.push({t:t2,f:f,d:1.3,i:'choir',v:0.3});
|
||||
});
|
||||
bg.push({t:t2,f:ch[0]/2,d:1.3,i:'bass',v:0.4});
|
||||
bg.push({t:t2,f:ch[0]/2,d:1.3,i:'timpani',v:0.55});
|
||||
mel.push({t:t2,l:4},{t:t2+0.75,l:i%2===0?0:1});
|
||||
});
|
||||
// Section 11: Final motif statement fff
|
||||
// Section 11: Final motif fff — everything playing
|
||||
s=45.0;
|
||||
orch(s,G4,0.2,0.7);orch(s+q,G4,0.2,0.7);orch(s+q*2,G4,0.2,0.7);
|
||||
orch(s+q*3,Eb4,2.0,0.7);
|
||||
bg.push({t:s+q*3,f:Eb4,d:2.0,i:'choir',v:0.4});
|
||||
tutti(s,G4,0.2,0.75);tutti(s+q,G4,0.2,0.75);tutti(s+q*2,G4,0.2,0.75);
|
||||
tutti(s+q*3,Eb4,2.0,0.75);pad(s+q*3,2.0,0.7);
|
||||
bg.push({t:s+q*3,f:Eb4,d:2.0,i:'choir',v:0.4});bg.push({t:s+q*3,f:G4,d:2.0,i:'choir',v:0.35});bg.push({t:s+q*3,f:C4,d:2.0,i:'choir',v:0.3});
|
||||
bg.push({t:s,f:G3,d:0.2,i:'timpani',v:0.6});
|
||||
mel.push({t:s,l:0},{t:s+q,l:0},{t:s+q*2,l:0},{t:s+q*3,l:3});
|
||||
// Section 12: Final chords
|
||||
// Section 12: Final chords — Cm tutti with timpani
|
||||
s=48.5;
|
||||
[0,0.5,1.0,1.5,2.0].forEach(function(dt){
|
||||
var t2=s+dt;
|
||||
[C4,Eb4,G4].forEach(function(f){orch(t2,f,0.4,0.7);});
|
||||
bg.push({t:t2,f:NT.C3,d:0.4,i:'timpani',v:0.65});mel.push({t:t2,l:4});
|
||||
[C4,Eb4,G4].forEach(function(f){
|
||||
bg.push({t:t2,f:f,d:0.4,i:'brass',v:0.7});
|
||||
bg.push({t:t2,f:f,d:0.4,i:'strings',v:0.6});
|
||||
});
|
||||
bg.push({t:t2,f:C3,d:0.4,i:'bass',v:0.55});
|
||||
bg.push({t:t2,f:C3,d:0.4,i:'timpani',v:0.65});mel.push({t:t2,l:4});
|
||||
});
|
||||
// Very final long chord
|
||||
// Final long chord — full orchestra + choir sustain
|
||||
s=51.0;
|
||||
[C4,Eb4,G4,C5].forEach(function(f){orch(s,f,2.5,0.65);bg.push({t:s,f:f,d:2.5,i:'choir',v:0.35});});
|
||||
bg.push({t:s,f:NT.C3,d:2.0,i:'timpani',v:0.6});
|
||||
[C4,Eb4,G4,C5].forEach(function(f){
|
||||
bg.push({t:s,f:f,d:2.5,i:'brass',v:0.65});
|
||||
bg.push({t:s,f:f,d:2.5,i:'strings',v:0.55});
|
||||
bg.push({t:s,f:f,d:2.5,i:'choir',v:0.4});
|
||||
});
|
||||
bg.push({t:s,f:C3,d:2.5,i:'bass',v:0.5});
|
||||
bg.push({t:s,f:C3,d:2.0,i:'timpani',v:0.6});
|
||||
return {n:"Beethoven's 5th (Opening)",composer:"Beethoven",bpm:160,duration:54,isClassical:true,bg:bg,melody:mel};
|
||||
})();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user