// Composition dans le style Motown/funk énergique - Groove festif
ditty.bpm = 128;
// BASSE FUNKY avec slap
const funkBass = synth.def((phase, env) => {
const fundamental = Math.sin(phase * Math.PI * 2);
const slap = Math.sin(phase * Math.PI * 2 * 3) * 0.4;
const harmonics = Math.sin(phase * Math.PI * 2 * 2) * 0.2;
return (fundamental + slap + harmonics) * env.value * 0.7;
}, { attack: 0.005, decay: 0.08, sustain: 0.3, release: 0.1 });
// CUIVRES PUISSANTS (section de trompettes/saxo)
const brass = synth.def((phase, env, tick) => {
const saw1 = 2 * ((phase * 1.0) % 1) - 1;
const saw2 = 2 * ((phase * 2.01) % 1) - 1;
const saw3 = 2 * ((phase * 3.02) % 1) - 1;
return (saw1 + saw2 * 0.5 + saw3 * 0.3) * 0.25 * env.value;
}, { attack: 0.05, decay: 0.1, sustain: 0.8, release: 0.2 });
// GUITARE FUNK (wah-wah style)
const funkGuitar = synth.def((phase, env, tick) => {
const square = phase % 1 < 0.5 ? 1 : -1;
const filtered = square * (1 + Math.sin(tick * 4) * 0.5);
return filtered * env.value * 0.15;
}, { attack: 0.001, decay: 0.05, sustain: 0.1, release: 0.05 });
// CLAVIER ÉLECTRIQUE (Rhodes/Wurlitzer style)
const electricPiano = synth.def((phase, env) => {
const bell = Math.sin(phase * Math.PI * 2);
const harmonics = Math.sin(phase * Math.PI * 2 * 3) * 0.3;
const metal = Math.sin(phase * Math.PI * 2 * 7) * 0.1;
return (bell + harmonics + metal) * env.value * 0.4;
}, { attack: 0.01, decay: 0.3, sustain: 0.2, release: 0.3 });
// KICK groovy
const kick = synth.def((phase, env, tick) => {
return Math.sin(phase * Math.PI * 2 * (2.5 - tick * 10)) * env.value;
}, { attack: 0.001, release: 0.25 });
// SNARE avec punch
const snare = synth.def((phase, env) => {
const noise = Math.random() * 2 - 1;
const tone = Math.sin(phase * Math.PI * 2 * 180);
return (noise * 0.8 + tone * 0.2) * env.value * 0.6;
}, { attack: 0.001, release: 0.15 });
// HI-HAT fermé
const closedHat = synth.def((phase, env) => {
return (Math.random() * 2 - 1) * env.value * 0.2;
}, { attack: 0.001, release: 0.04 });
// CLAPS (handclaps)
const clap = synth.def((phase, env) => {
return (Math.random() * 2 - 1) * env.value * 0.4;
}, { attack: 0.001, release: 0.08 });
// LIGNE DE BASSE FUNKY (groove syncopé en E)
loop(() => {
// Mesure 1
funkBass.play(E2, { duration: 0.25, amp: 1.0 });
sleep(0.25);
funkBass.play(E2, { duration: 0.125, amp: 0.6 });
sleep(0.25);
funkBass.play(E3, { duration: 0.125, amp: 0.7 });
sleep(0.25);
funkBass.play(E2, { duration: 0.25, amp: 0.9 });
sleep(0.5);
funkBass.play(G2, { duration: 0.125, amp: 0.8 });
sleep(0.25);
funkBass.play(E2, { duration: 0.25, amp: 0.7 });
sleep(0.5);
// Mesure 2
funkBass.play(A2, { duration: 0.25, amp: 1.0 });
sleep(0.25);
funkBass.play(A2, { duration: 0.125, amp: 0.6 });
sleep(0.25);
funkBass.play(A3, { duration: 0.125, amp: 0.7 });
sleep(0.25);
funkBass.play(G2, { duration: 0.25, amp: 0.9 });
sleep(0.5);
funkBass.play(E2, { duration: 0.125, amp: 0.8 });
sleep(0.25);
funkBass.play(E2, { duration: 0.25, amp: 0.7 });
sleep(0.5);
}, { amp: 0.85 });
// SECTION DE CUIVRES (stabs puissants)
loop((loopCount) => {
if (loopCount > 0) {
// Stab 1
brass.play(E4, { duration: 0.5, pan: -0.3 });
brass.play(G4, { duration: 0.5, pan: 0 });
brass.play(B4, { duration: 0.5, pan: 0.3 });
sleep(0.5);
sleep(0.5);
// Stab 2
brass.play(E4, { duration: 0.5, pan: -0.3, amp: 0.8 });
brass.play(G4, { duration: 0.5, pan: 0, amp: 0.8 });
brass.play(B4, { duration: 0.5, pan: 0.3, amp: 0.8 });
sleep(0.5);
sleep(1.5);
// Stab 3
brass.play(A4, { duration: 0.5, pan: -0.2 });
brass.play(C5, { duration: 0.5, pan: 0.1 });
brass.play(E5, { duration: 0.5, pan: 0.4 });
sleep(0.5);
sleep(0.5);
// Stab 4
brass.play(G4, { duration: 0.5, pan: -0.3, amp: 0.8 });
brass.play(B4, { duration: 0.5, pan: 0, amp: 0.8 });
brass.play(D5, { duration: 0.5, pan: 0.3, amp: 0.8 });
sleep(0.5);
sleep(1.5);
} else {
sleep(4);
}
}, { amp: 0.7 });
// GUITARE FUNK (rythme scratch)
loop(() => {
for (let i = 0; i < 16; i++) {
if (i % 4 === 0 || i % 4 === 2) {
funkGuitar.play(E4, { duration: 0.125, pan: Math.random() * 0.4 - 0.2 });
}
sleep(0.25);
}
});
// CLAVIER ÉLECTRIQUE (accords)
loop((loopCount) => {
if (loopCount > 1) {
// Accord E
electricPiano.play(E3, { duration: 1.5, pan: -0.2 });
electricPiano.play(G3, { duration: 1.5, pan: 0 });
electricPiano.play(B3, { duration: 1.5, pan: 0.2 });
sleep(2);
// Accord A
electricPiano.play(A3, { duration: 1.5, pan: -0.2 });
electricPiano.play(C4, { duration: 1.5, pan: 0 });
electricPiano.play(E4, { duration: 1.5, pan: 0.2 });
sleep(2);
} else {
sleep(4);
}
}, { amp: 0.5 });
// KICK - Pattern dance classique
loop(() => {
kick.play(C1, { amp: 1.0 });
sleep(1);
kick.play(C1, { amp: 0.8 });
sleep(0.5);
kick.play(C1, { amp: 0.6 });
sleep(0.5);
kick.play(C1, { amp: 0.9 });
sleep(1);
kick.play(C1, { amp: 0.7 });
sleep(1);
});
// SNARE - Sur les backbeats (2 et 4)
loop(() => {
sleep(1);
snare.play(D3, { amp: 0.9 });
sleep(2);
snare.play(D3, { amp: 0.9 });
sleep(1);
});
// HI-HAT - Pattern serré
loop(() => {
for (let i = 0; i < 8; i++) {
closedHat.play(Fs5, { amp: i % 2 === 0 ? 0.3 : 0.2 });
sleep(0.5);
}
});
// HANDCLAPS - Pour l'énergie festive
loop((loopCount) => {
if (loopCount > 1) {
sleep(1);
clap.play(D4, { pan: -0.3 });
clap.play(D4, { pan: 0.3 });
sleep(2);
clap.play(D4, { pan: -0.2 });
clap.play(D4, { pan: 0.2 });
sleep(1);
} else {
sleep(4);
}
}, { amp: 0.6 });
// MÉLODIE LEAD (hook accrocheur)
loop((loopCount) => {
if (loopCount > 3) {
// Phrase mélodique énergique
brass.play(B4, { duration: 0.5, amp: 0.6 });
sleep(0.5);
brass.play(B4, { duration: 0.25, amp: 0.5 });
sleep(0.5);
brass.play(A4, { duration: 0.5, amp: 0.6 });
sleep(0.5);
brass.play(G4, { duration: 0.75, amp: 0.7 });
sleep(1);
brass.play(E4, { duration: 1.0, amp: 0.65 });
sleep(1.5);
brass.play(G4, { duration: 0.5, amp: 0.6 });
sleep(0.5);
brass.play(A4, { duration: 0.5, amp: 0.6 });
sleep(0.5);
brass.play(B4, { duration: 1.0, amp: 0.7 });
sleep(1.5);
} else {
sleep(4);
}
}, { amp: 0.65 });