Add Christmas and Singalong genres (65 synth pieces, 48 min total)
Christmas (10 carols, all public domain): - Jingle Bells (1857), Silent Night (1818), Deck the Halls (1862) - We Wish You a Merry Christmas (1500s), O Christmas Tree (1824) - The First Noel (1823), Joy to the World (1719) - Away in a Manger (1885), 12 Days of Christmas (1780) - Hark the Herald Angels Sing (1840) Uses choir synth for festive choral sound on later passes. Singalong (10 campfire/pub/shanty songs, all public domain): - Drunken Sailor (sea shanty), Molly Malone (Irish, 1880s) - Whiskey in the Jar (Irish trad.), The Parting Glass (Irish/Scots) - Amazing Grace (1779), Auld Lang Syne (1788) - When the Saints Go Marching In (spiritual) - Oh My Darling Clementine (1884), Scarborough Fair (medieval) - My Bonnie Lies Over the Ocean (Scottish, 1881) Total: 14 genres, 65 synth pieces, 48 minutes of content Still a single index.html file with no dependencies. https://claude.ai/code/session_01GdFrFqAe9e2DaJ86jZPEZE
This commit is contained in:
+157
-2
@@ -1733,7 +1733,162 @@ const FOLK_PIECES=(function(){
|
|||||||
})();
|
})();
|
||||||
|
|
||||||
// Synth genre lookup — all genres that use bg+melody synth mode
|
// Synth genre lookup — all genres that use bg+melody synth mode
|
||||||
var SYNTH_GENRES={"Classical":CLASSICAL_PIECES,"Video Games":VIDEOGAME_PIECES,"Chiptune Originals":CHIPTUNE_PIECES,"Folk":FOLK_PIECES};
|
// ── CHRISTMAS (public domain carols) ──
|
||||||
|
const CHRISTMAS_PIECES=(function(){
|
||||||
|
var C3=NT.C3,D3=NT.D3,E3=NT.E3,F3=NT.F3,G3=NT.G3,A3=NT.A3,B3=NT.B3,
|
||||||
|
C4=NT.C4,D4=NT.D4,Eb4=NT.Eb4,E4=NT.E4,F4=NT.F4,G4=NT.G4,A4=NT.A4,Bb4=NT.Bb4,B4=NT.B4,
|
||||||
|
C5=NT.C5,D5=NT.D5,E5=NT.E5,F5=NT.F5,G5=NT.G5;
|
||||||
|
function carol(name,origin,bpm,theme,lanes,durations,passes,root){
|
||||||
|
var bg=[],mel=[],t=0,q=0.25;
|
||||||
|
for(var rep=0;rep<passes;rep++){
|
||||||
|
var v=0.2+rep*0.08;
|
||||||
|
var inst=rep<Math.floor(passes*0.3)?'woodwind':rep<Math.floor(passes*0.7)?'strings':'brass';
|
||||||
|
theme.forEach(function(f,i){
|
||||||
|
var d=(durations?durations[i]:1)*q;
|
||||||
|
bg.push({t:t,f:f,d:d*0.85,i:inst,v:v});
|
||||||
|
if(rep>1)bg.push({t:t,f:f/2,d:d*0.85,i:'bass',v:v*0.35});
|
||||||
|
if(rep>Math.floor(passes*0.5))bg.push({t:t,f:f,d:d*0.85,i:'choir',v:v*0.3});
|
||||||
|
if(rep>Math.floor(passes*0.7))bg.push({t:t,f:f,d:d*0.85,i:'brass',v:v*0.35});
|
||||||
|
mel.push({t:t,l:lanes[i]});t+=d;
|
||||||
|
});
|
||||||
|
t+=0.4;
|
||||||
|
}
|
||||||
|
var r=root||theme[0];
|
||||||
|
[r,r*5/4,r*3/2,r*2].forEach(function(f){bg.push({t:t,f:f,d:2.5,i:'choir',v:0.45});bg.push({t:t,f:f,d:2.5,i:'strings',v:0.4});});
|
||||||
|
bg.push({t:t,f:r/2,d:2.0,i:'timpani',v:0.5});mel.push({t:t,l:4});
|
||||||
|
return {n:name,composer:origin,bpm:bpm,duration:Math.ceil(t+3),isClassical:true,bg:bg,melody:mel};
|
||||||
|
}
|
||||||
|
var jingle=carol("Jingle Bells","J. Pierpont (1857)",140,
|
||||||
|
[E4,E4,E4,E4,E4,E4,E4,G4,C4,D4,E4,F4,F4,F4,F4,F4,E4,E4,E4,E4,D4,D4,E4,D4,G4,E4,E4,E4,E4,E4,E4,E4,G4,C4,D4,E4,F4,F4,F4,F4,F4,E4,E4,G4,G4,F4,D4,C4],
|
||||||
|
[2,2,2,2,2,2,2,3,0,1,2,1,1,1,1,1,2,2,2,2,1,1,2,1,3,2,2,2,2,2,2,2,3,0,1,2,1,1,1,1,1,2,2,3,3,1,1,0],
|
||||||
|
[1,1,2,1,1,2,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,2,1,1,2,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,4],
|
||||||
|
4,C4);
|
||||||
|
var silent=carol("Silent Night","F. Gruber (1818)",72,
|
||||||
|
[G4,A4,G4,E4,G4,A4,G4,E4,D5,D5,B4,C5,C5,G4,A4,A4,C5,B4,A4,G4,A4,G4,E4,A4,A4,C5,B4,A4,G4,A4,G4,E4,D5,D5,F5,D5,B4,C5,E5,C5,G4,E4,G4,F4,D4,C4],
|
||||||
|
[3,0,3,2,3,0,3,2,0,0,3,0,0,3,0,0,0,3,0,3,0,3,2,0,0,0,3,0,3,0,3,2,0,0,1,0,3,0,2,0,3,2,3,1,1,0],
|
||||||
|
[2,1,2,3,2,1,2,3,2,1,3,2,1,3,2,1,2,1,2,2,1,2,3,2,1,2,1,2,2,1,2,3,2,1,2,1,3,2,2,2,2,1,1,1,1,4],
|
||||||
|
3,C4);
|
||||||
|
var deck=carol("Deck the Halls","Welsh (1862)",130,
|
||||||
|
[C5,B4,A4,G4,F4,G4,A4,F4,G4,A4,Bb4,G4,A4,G4,F4,E4,D4,E4,F4,G4,A4,G4,F4,E4,F4,G4,A4,Bb4,C5,A4,G4,F4],
|
||||||
|
[0,3,0,3,1,3,0,1,3,0,2,3,0,3,1,2,1,2,1,3,0,3,1,2,1,3,0,2,0,0,3,1],
|
||||||
|
[2,1,1,2,1,1,1,2,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,2,1,1,4],
|
||||||
|
4,F4);
|
||||||
|
var wish=carol("We Wish You a Merry Christmas","English (1500s)",140,
|
||||||
|
[G4,C5,C5,D5,C5,B4,A4,A4,D5,D5,E5,D5,C5,B4,G4,E5,E5,F5,E5,D5,C5,A4,G4,G4,A4,D5,B4,C5],
|
||||||
|
[3,0,0,1,0,3,0,0,1,1,2,1,0,3,3,2,2,1,2,1,0,0,3,3,0,1,3,0],
|
||||||
|
[1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,4],
|
||||||
|
5,C4);
|
||||||
|
var ocometree=carol("O Christmas Tree","German (1824)",100,
|
||||||
|
[F4,Bb4,Bb4,Bb4,C5,D5,D5,D5,C5,D5,Eb4,C5,A4,Bb4,F4,Bb4,Bb4,Bb4,C5,D5,D5,D5,C5,D5,Eb4,C5,A4,Bb4],
|
||||||
|
[1,2,2,2,0,1,1,1,0,1,2,0,0,2,1,2,2,2,0,1,1,1,0,1,2,0,0,2],
|
||||||
|
[1,2,1,1,1,2,1,1,1,1,1,1,1,3,1,2,1,1,1,2,1,1,1,1,1,1,1,4],
|
||||||
|
4,Bb4);
|
||||||
|
var firstnoel=carol("The First Noel","English (1823)",95,
|
||||||
|
[E4,D4,C4,D4,E4,F4,G4,A4,B4,C5,B4,A4,G4,A4,B4,C5,B4,A4,G4,A4,B4,C5,G4,F4,E4,D4,C4,D4,C4],
|
||||||
|
[2,1,0,1,2,1,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,1,2,1,0,1,0],
|
||||||
|
[1,1,2,1,1,1,2,1,1,2,1,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,2,1,4],
|
||||||
|
4,C4);
|
||||||
|
var joy=carol("Joy to the World","G.F. Handel (1719)",120,
|
||||||
|
[C5,B4,A4,G4,F4,E4,D4,C4,G4,A4,A4,B4,B4,C5,C5,C5,B4,A4,G4,G4,F4,E4,C5,C5,B4,A4,G4,G4,F4,E4,D4,C4],
|
||||||
|
[0,3,0,3,1,2,1,0,3,0,0,3,3,0,0,0,3,0,3,3,1,2,0,0,3,0,3,3,1,2,1,0],
|
||||||
|
[2,1,1,2,1,1,1,3,2,1,2,1,2,1,2,1,1,1,2,1,1,3,2,1,1,1,2,1,1,1,1,4],
|
||||||
|
4,C4);
|
||||||
|
var away=carol("Away in a Manger","J.Murray (1885)",80,
|
||||||
|
[C4,F4,F4,F4,G4,A4,F4,F4,A4,G4,F4,G4,F4,D4,C4,C4,F4,F4,F4,G4,A4,F4,F4,A4,G4,F4,G4,F4,D4,C4,Bb4,A4,F4],
|
||||||
|
[0,1,1,1,3,0,1,1,0,3,1,3,1,1,0,0,1,1,1,3,0,1,1,0,3,1,3,1,1,0,2,0,1],
|
||||||
|
[1,2,1,1,1,2,1,1,2,1,1,1,2,1,3,1,2,1,1,1,2,1,1,2,1,1,1,2,1,2,1,1,4],
|
||||||
|
4,F4);
|
||||||
|
var twelve=carol("12 Days of Christmas","English (1780)",110,
|
||||||
|
[C4,F4,F4,F4,F4,E4,F4,G4,A4,Bb4,A4,G4,F4,G4,A4,Bb4,A4,G4,F4,G4,A4,Bb4,C5,A4,Bb4,G4,A4,F4],
|
||||||
|
[0,1,1,1,1,2,1,3,0,2,0,3,1,3,0,2,0,3,1,3,0,2,0,0,2,3,0,1],
|
||||||
|
[1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,4],
|
||||||
|
5,F4);
|
||||||
|
var hark=carol("Hark the Herald Angels Sing","Mendelssohn (1840)",115,
|
||||||
|
[C4,F4,F4,E4,F4,A4,A4,G4,C5,A4,A4,G4,C5,A4,A4,G4,A4,Bb4,G4,A4,Bb4,C5,A4,F4,G4,Bb4,A4,G4,F4],
|
||||||
|
[0,1,1,2,1,0,0,3,0,0,0,3,0,0,0,3,0,2,3,0,2,0,0,1,3,2,0,3,1],
|
||||||
|
[1,2,1,1,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,4],
|
||||||
|
4,F4);
|
||||||
|
return [jingle,silent,deck,wish,ocometree,firstnoel,joy,away,twelve,hark];
|
||||||
|
})();
|
||||||
|
|
||||||
|
// ── SINGALONG (campfire, sea shanties, pub songs) ──
|
||||||
|
const SINGALONG_PIECES=(function(){
|
||||||
|
var C3=NT.C3,D3=NT.D3,E3=NT.E3,F3=NT.F3,G3=NT.G3,Ab3=NT.Ab3,A3=NT.A3,B3=NT.B3,
|
||||||
|
C4=NT.C4,D4=NT.D4,E4=NT.E4,F4=NT.F4,G4=NT.G4,A4=NT.A4,Bb4=NT.Bb4,B4=NT.B4,
|
||||||
|
C5=NT.C5,D5=NT.D5,E5=NT.E5,F5=NT.F5,G5=NT.G5;
|
||||||
|
function pub(name,origin,bpm,theme,lanes,durations,passes,root){
|
||||||
|
var bg=[],mel=[],t=0,q=0.25;
|
||||||
|
for(var rep=0;rep<passes;rep++){
|
||||||
|
var v=0.22+rep*0.07;
|
||||||
|
var inst=rep<Math.floor(passes*0.4)?'woodwind':rep<Math.floor(passes*0.7)?'strings':'brass';
|
||||||
|
theme.forEach(function(f,i){
|
||||||
|
var d=(durations?durations[i]:1)*q;
|
||||||
|
bg.push({t:t,f:f,d:d*0.85,i:inst,v:v});
|
||||||
|
if(rep>1)bg.push({t:t,f:f/2,d:d*0.85,i:'bass',v:v*0.35});
|
||||||
|
if(rep>Math.floor(passes*0.6))bg.push({t:t,f:f,d:d*0.85,i:'brass',v:v*0.4});
|
||||||
|
mel.push({t:t,l:lanes[i]});t+=d;
|
||||||
|
});
|
||||||
|
t+=0.4;
|
||||||
|
}
|
||||||
|
var r=root||theme[0];
|
||||||
|
[r,r*5/4,r*3/2,r*2].forEach(function(f){bg.push({t:t,f:f,d:2.0,i:'brass',v:0.5});bg.push({t:t,f:f,d:2.0,i:'strings',v:0.4});});
|
||||||
|
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],
|
||||||
|
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,3],
|
||||||
|
4,D4);
|
||||||
|
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],
|
||||||
|
[1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,4],
|
||||||
|
4,C4);
|
||||||
|
var whiskey=pub("Whiskey in the Jar","Irish (Trad.)",125,
|
||||||
|
[G4,G4,A4,B4,B4,A4,G4,E4,D4,E4,G4,G4,A4,B4,D5,B4,A4,G4,E4,D4,E4,G4,A4,B4,A4,G4,E4,D4,E4,G4],
|
||||||
|
[3,3,0,3,3,0,3,2,1,2,3,3,0,3,1,3,0,3,2,1,2,3,0,3,0,3,2,1,2,3],
|
||||||
|
[1,1,1,2,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,3],
|
||||||
|
5,G4);
|
||||||
|
var parting=pub("The Parting Glass","Irish/Scots (Trad.)",80,
|
||||||
|
[E4,G4,A4,B4,A4,G4,E4,D4,E4,G4,A4,B4,D5,B4,A4,G4,E4,G4,A4,B4,A4,G4,E4,D4,E4,G4,A4,B4,D5,B4,A4,G4],
|
||||||
|
[2,3,0,3,0,3,2,1,2,3,0,3,1,3,0,3,2,3,0,3,0,3,2,1,2,3,0,3,1,3,0,3],
|
||||||
|
[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,C5,E5,D5,C5,A4,G4,G4,C5,E5,C5,E5,D5,G5,E5,E5,C5,E5,D5,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,0,2,2,0,2,1,0,0,3,3,0,2,0,2,1,0],
|
||||||
|
[1,2,1,1,1,2,1,2,2,1,2,1,1,1,2,2,1,1,1,1,2,1,2,2,1,2,1,1,1,2,4],
|
||||||
|
4,C4);
|
||||||
|
var auld=pub("Auld Lang Syne","R. Burns (1788)",95,
|
||||||
|
[C4,F4,F4,F4,A4,G4,F4,G4,A4,G4,F4,F4,A4,C5,D5,D5,C5,A4,A4,F4,G4,F4,G4,A4,G4,F4,D4,D4,C4,F4],
|
||||||
|
[0,1,1,1,0,3,1,3,0,3,1,1,0,0,1,1,0,0,0,1,3,1,3,0,3,1,1,1,0,1],
|
||||||
|
[1,2,1,1,2,1,1,1,2,1,1,1,1,1,3,2,1,2,1,1,1,1,1,2,1,1,2,1,2,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,F4,E4,F4,G4,E4,C4,D4,C4],
|
||||||
|
[0,2,1,3,0,2,1,3,0,2,1,3,2,0,2,1,2,2,1,0,0,2,3,3,1,1,2,1,3,2,0,1,0],
|
||||||
|
[1,1,1,3,1,1,1,3,1,1,1,2,1,1,1,2,1,1,1,2,1,1,2,1,1,1,1,1,2,1,1,1,4],
|
||||||
|
4,C4);
|
||||||
|
var clementine=pub("Oh My Darling, Clementine","P. Montrose (1884)",110,
|
||||||
|
[C4,C4,C4,G3,E4,E4,E4,C4,C4,E4,G4,G4,F4,E4,F4,G4,G4,F4,E4,F4,E4,D4,C4,D4,E4,F4,F4,E4,D4,E4,C4],
|
||||||
|
[0,0,0,3,2,2,2,0,0,2,3,3,1,2,1,3,3,1,2,1,2,1,0,1,2,1,1,2,1,2,0],
|
||||||
|
[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,D4,A4,A4,E4,F4,E4,D4,A4,G4,A4,C5,B4,A4,B4,A4,G4,E4,D4,D4,A3,D4,E4,F4,E4,D4],
|
||||||
|
[0,0,0,0,0,2,1,2,0,0,3,0,0,3,0,3,0,3,2,0,0,4,0,2,1,2,0],
|
||||||
|
[2,1,2,2,1,1,1,2,2,1,1,1,2,1,2,1,2,1,1,2,1,2,1,1,1,2,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);
|
||||||
|
return [drunken,molly,whiskey,parting,amazing,auld,saints,clementine,scarborough,bonnie];
|
||||||
|
})();
|
||||||
|
|
||||||
|
var SYNTH_GENRES={"Classical":CLASSICAL_PIECES,"Video Games":VIDEOGAME_PIECES,"Chiptune Originals":CHIPTUNE_PIECES,"Folk":FOLK_PIECES,"Christmas":CHRISTMAS_PIECES,"Singalong":SINGALONG_PIECES};
|
||||||
|
|
||||||
function buildClassicalNotes(piece){
|
function buildClassicalNotes(piece){
|
||||||
var raw=piece.melody.filter(function(m){return activePads[m.l];})
|
var raw=piece.melody.filter(function(m){return activePads[m.l];})
|
||||||
@@ -1821,7 +1976,7 @@ function buildMenu(){
|
|||||||
gt.appendChild(b);
|
gt.appendChild(b);
|
||||||
});
|
});
|
||||||
// Synth genre tabs (Classical, Video Games, Chiptune Originals, Folk)
|
// Synth genre tabs (Classical, Video Games, Chiptune Originals, Folk)
|
||||||
var synthIcons={"Classical":"\uD83C\uDFBB","Video Games":"\uD83C\uDFAE","Chiptune Originals":"\uD83D\uDC7E","Folk":"\uD83C\uDFB6"};
|
var synthIcons={"Classical":"\uD83C\uDFBB","Video Games":"\uD83C\uDFAE","Chiptune Originals":"\uD83D\uDC7E","Folk":"\uD83C\uDFB6","Christmas":"\uD83C\uDF84","Singalong":"\uD83C\uDFB5"};
|
||||||
Object.keys(SYNTH_GENRES).forEach(function(sg){
|
Object.keys(SYNTH_GENRES).forEach(function(sg){
|
||||||
var cb=document.createElement("button");
|
var cb=document.createElement("button");
|
||||||
cb.className="gtab"+(curGenre===sg?" active":"");
|
cb.className="gtab"+(curGenre===sg?" active":"");
|
||||||
|
|||||||
Reference in New Issue
Block a user