Merge Prime genre into Nursery Rhymes (15 songs combined)

Moved 6 Prime songs (Twinkle Twinkle, Mary Had a Little Lamb, Happy
Birthday, Chopsticks, Lavender's Blue, Shortnin' Bread) into the
Nursery Rhymes genre using the rhyme() helper. Dropped Baa Baa Black
Sheep since it's the same melody as Twinkle Twinkle. Updated README
to reflect 18 genres, 124 synth pieces.

https://claude.ai/code/session_01FNZw4curZbJp38HFUaPXwR
This commit is contained in:
Claude
2026-03-31 03:48:34 +00:00
parent 8a7374a23d
commit 2aebd38cc2
2 changed files with 46 additions and 86 deletions
+38 -75
View File
@@ -3431,73 +3431,6 @@ const CHIPTUNE_PIECES=(function(){
return [platformer,spaceshooter,rpg,racing,dungeon,victory];
})();
// ── PRIME (easy beginner songs, verified from lead sheets) ──
const PRIME_PIECES=(function(){
var 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;
function primer(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.1;
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.3});
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:'strings',v:0.45});});
bg.push({t:t,f:r/2,d:1.5,i:'timpani',v:0.5});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};
}
// ── Twinkle Twinkle Little Star (C major, slow & simple) ──
var twinkle=primer("Twinkle Twinkle Little Star","Traditional (1760s)",75,
[C4,C4,G4,G4,A4,A4,G4,F4,F4,E4,E4,D4,D4,C4,G4,G4,F4,F4,E4,E4,D4,C4,C4,G4,G4,A4,A4,G4,F4,F4,E4,E4,D4,D4,C4],
[0,0,3,3,0,0,3,1,1,2,2,1,1,0,3,3,1,1,2,2,1,0,0,3,3,0,0,3,1,1,2,2,1,1,0],
[1,1,1,1,1,1,3,1,1,1,1,1,1,3,1,1,1,1,1,1,3,1,1,1,1,1,1,3,1,1,1,1,1,1,4],
3,C4);
// ── Mary Had a Little Lamb (C major, slow & simple) ──
var mary=primer("Mary Had a Little Lamb","S.J. Hale (1830)",80,
[E4,D4,C4,D4,E4,E4,E4,D4,D4,D4,E4,G4,G4,E4,D4,C4,D4,E4,E4,E4,D4,D4,E4,D4,C4],
[2,1,0,1,2,2,2,1,1,1,2,3,3,2,1,0,1,2,2,2,1,1,2,1,0],
[1,1,1,1,1,1,3,1,1,3,1,1,3,1,1,1,1,1,1,1,1,1,1,1,4],
3,C4);
// ── Happy Birthday (C major, slow & simple) ──
var birthday=primer("Happy Birthday","P.S. Hill (1893)",75,
[C4,C4,D4,C4,F4,E4,C4,C4,D4,C4,G4,F4,C4,C4,C5,A4,F4,E4,D4,Bb4,Bb4,A4,F4,G4,F4],
[0,0,1,0,1,2,0,0,1,0,3,1,0,0,0,0,1,2,1,2,2,0,1,3,1],
[1,1,2,2,2,3,1,1,2,2,2,3,1,1,2,1,1,1,2,1,1,1,1,2,4],
3,C4);
// ── Chopsticks (C major, simplified alternating pattern) ──
var chopsticks=primer("Chopsticks","Euphemia Allen (1877)",95,
[F4,G4,F4,G4,F4,G4,E4,G4,E4,G4,E4,G4,D4,F4,D4,F4,C4,E4,C4,E4,F4,G4,F4,G4,E4,G4,E4,G4,D4,F4,D4,F4,C4,E4,C4,E4],
[1,3,1,3,1,3,2,3,2,3,2,3,1,1,1,1,0,2,0,2,1,3,1,3,2,3,2,3,1,1,1,1,0,2,0,2],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4],
3,C4);
// ── Lavender's Blue (C major, gentle waltz feel) ──
var lavender=primer("Lavender's Blue","English Traditional (1670s)",80,
[E4,E4,D4,E4,F4,G4,G4,A4,G4,F4,F4,E4,D4,E4,E4,E4,D4,E4,F4,G4,G4,A4,G4,F4,E4],
[2,2,1,2,1,3,3,0,3,1,1,2,1,2,2,2,1,2,1,3,3,0,3,1,2],
[1,1,1,1,1,1,1,1,1,2,1,1,1,3,1,1,1,1,1,1,1,1,1,1,4],
3,C4);
// ── Shortnin' Bread (C major, bouncy but approachable) ──
var shortnin=primer("Shortnin' Bread","Traditional (1900s)",95,
[E5,E5,D5,C5,D5,C5,A4,G4,A4,G4,A4,G4,E5,E5,D5,C5,D5,C5,A4,G4,A4,G4,C5],
[2,2,1,0,1,0,0,3,0,3,0,3,2,2,1,0,1,0,0,3,0,3,0],
[1,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,4],
3,C4);
return [twinkle,mary,birthday,chopsticks,lavender,shortnin];
})();
// ── FOLK (public domain traditional songs) ──
const FOLK_PIECES=(function(){
@@ -4069,7 +4002,7 @@ const WORLD_PIECES=(function(){
// ── NURSERY RHYMES (very simple, beginner-friendly) ──
const NURSERY_PIECES=(function(){
var C4=NT.C4,D4=NT.D4,E4=NT.E4,F4=NT.F4,G4=NT.G4,A4=NT.A4,B4=NT.B4,
var 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,G3=NT.G3,A3=NT.A3,B3=NT.B3;
function rhyme(name,origin,bpm,theme,lanes,durations,passes,root){
var bg=[],mel=[],t=0,q=0.3;
@@ -4089,11 +4022,41 @@ const NURSERY_PIECES=(function(){
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};
}
// ── Baa Baa Black Sheep (same melody as Twinkle but different words) ──
var baa=rhyme("Baa Baa Black Sheep","English (1731)",70,
[C4,C4,G4,G4,A4,A4,G4,F4,F4,E4,E4,D4,D4,C4],
[0,0,3,3,0,0,3,1,1,2,2,1,1,0],
[1,1,1,1,1,1,3,1,1,1,1,1,1,4],
// ── Twinkle Twinkle Little Star (same melody as Baa Baa Black Sheep) ──
var twinkle=rhyme("Twinkle Twinkle Little Star","Traditional (1760s)",75,
[C4,C4,G4,G4,A4,A4,G4,F4,F4,E4,E4,D4,D4,C4,G4,G4,F4,F4,E4,E4,D4,C4,C4,G4,G4,A4,A4,G4,F4,F4,E4,E4,D4,D4,C4],
[0,0,3,3,0,0,3,1,1,2,2,1,1,0,3,3,1,1,2,2,1,0,0,3,3,0,0,3,1,1,2,2,1,1,0],
[1,1,1,1,1,1,3,1,1,1,1,1,1,3,1,1,1,1,1,1,3,1,1,1,1,1,1,3,1,1,1,1,1,1,4],
3,C4);
// ── Mary Had a Little Lamb ──
var mary=rhyme("Mary Had a Little Lamb","S.J. Hale (1830)",80,
[E4,D4,C4,D4,E4,E4,E4,D4,D4,D4,E4,G4,G4,E4,D4,C4,D4,E4,E4,E4,D4,D4,E4,D4,C4],
[2,1,0,1,2,2,2,1,1,1,2,3,3,2,1,0,1,2,2,2,1,1,2,1,0],
[1,1,1,1,1,1,3,1,1,3,1,1,3,1,1,1,1,1,1,1,1,1,1,1,4],
3,C4);
// ── Happy Birthday ──
var birthday=rhyme("Happy Birthday","P.S. Hill (1893)",75,
[C4,C4,D4,C4,F4,E4,C4,C4,D4,C4,G4,F4,C4,C4,C5,A4,F4,E4,D4,Bb4,Bb4,A4,F4,G4,F4],
[0,0,1,0,1,2,0,0,1,0,3,1,0,0,0,0,1,2,1,2,2,0,1,3,1],
[1,1,2,2,2,3,1,1,2,2,2,3,1,1,2,1,1,1,2,1,1,1,1,2,4],
3,C4);
// ── Chopsticks ──
var chopsticks=rhyme("Chopsticks","Euphemia Allen (1877)",95,
[F4,G4,F4,G4,F4,G4,E4,G4,E4,G4,E4,G4,D4,F4,D4,F4,C4,E4,C4,E4,F4,G4,F4,G4,E4,G4,E4,G4,D4,F4,D4,F4,C4,E4,C4,E4],
[1,3,1,3,1,3,2,3,2,3,2,3,1,1,1,1,0,2,0,2,1,3,1,3,2,3,2,3,1,1,1,1,0,2,0,2],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4],
3,C4);
// ── Lavender's Blue ──
var lavender=rhyme("Lavender's Blue","English Traditional (1670s)",80,
[E4,E4,D4,E4,F4,G4,G4,A4,G4,F4,F4,E4,D4,E4,E4,E4,D4,E4,F4,G4,G4,A4,G4,F4,E4],
[2,2,1,2,1,3,3,0,3,1,1,2,1,2,2,2,1,2,1,3,3,0,3,1,2],
[1,1,1,1,1,1,1,1,1,2,1,1,1,3,1,1,1,1,1,1,1,1,1,1,4],
3,C4);
// ── Shortnin' Bread ──
var shortnin=rhyme("Shortnin' Bread","Traditional (1900s)",95,
[E5,E5,D5,C5,D5,C5,A4,G4,A4,G4,A4,G4,E5,E5,D5,C5,D5,C5,A4,G4,A4,G4,C5],
[2,2,1,0,1,0,0,3,0,3,0,3,2,2,1,0,1,0,0,3,0,3,0],
[1,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,4],
3,C4);
// ── London Bridge ──
var london=rhyme("London Bridge Is Falling Down","English (1744)",75,
@@ -4149,7 +4112,7 @@ const NURSERY_PIECES=(function(){
[2,3,0,3,1,2,1,2,1,2,1,0,2,3,0,3,1,2,1,0],
[1,1,2,1,1,1,2,1,1,1,1,2,1,1,2,1,1,1,1,4],
3,C4);
return [baa,london,macdonald,row,mice,spider,weasel,hotcross,jack,humpty];
return [twinkle,mary,birthday,hotcross,london,macdonald,row,mice,spider,weasel,chopsticks,lavender,shortnin,jack,humpty];
})();
// ── RAGTIME (Scott Joplin & contemporaries, all public domain) ──
@@ -4238,7 +4201,7 @@ const RAGTIME_PIECES=(function(){
return [entertainer,maple,easyw,elite,solace,peacherine,cascades,pineapple];
})();
var SYNTH_GENRES={"Prime":PRIME_PIECES,"Nursery Rhymes":NURSERY_PIECES,"Singalong":SINGALONG_PIECES,"Christmas":CHRISTMAS_PIECES,"Folk":FOLK_PIECES,"Spirituals":SPIRITUAL_PIECES,"World":WORLD_PIECES,"Ragtime":RAGTIME_PIECES,"Classical":CLASSICAL_PIECES,"Video Games":VIDEOGAME_PIECES,"Chiptune Originals":CHIPTUNE_PIECES};
var SYNTH_GENRES={"Nursery Rhymes":NURSERY_PIECES,"Singalong":SINGALONG_PIECES,"Christmas":CHRISTMAS_PIECES,"Folk":FOLK_PIECES,"Spirituals":SPIRITUAL_PIECES,"World":WORLD_PIECES,"Ragtime":RAGTIME_PIECES,"Classical":CLASSICAL_PIECES,"Video Games":VIDEOGAME_PIECES,"Chiptune Originals":CHIPTUNE_PIECES};
function simplifyNotes(notes){
if(!simpleMode||notes.length<2)return notes;