ditty.bpm = 120;
// ==================================================
// BASE
// ==================================================
sine.attack = 0;
sine.release = 0.1;
// ==================================================
// DRUMS – évolutifs
// ==================================================
// Kick 4/4 avec respirations
const kick = synth.def(
(phase, env) => Math.sin(phase * 48) * env.value,
{ attack: 0, release: 0.08 }
);
loop(() => {
// phrase 1
for (let i = 0; i < 12; i++) {
kick.play(c1); sleep(1);
}
sleep(4); // respiration
}, { name: "Kick" });
// Clap avec variations
const clap = synth.def(
() => (Math.random() * 2 - 1),
{ attack: 0, release: 0.05 }
);
loop(() => {
for (let i = 0; i < 6; i++) {
sleep(1);
clap.play(c4);
sleep(1);
}
sleep(4);
}, { name: "Clap" });
// Hi-hat change de densité
const hat = synth.def(
() => (Math.random() * 2 - 1),
{ attack: 0, release: 0.02 }
);
loop(() => {
for (let i = 0; i < 16; i++) {
hat.play(c6); sleep(0.25);
}
for (let i = 0; i < 8; i++) {
hat.play(c6); sleep(0.5);
}
}, { name: "Hat" });
// ==================================================
// BASSE – vraie ligne mélodique
// ==================================================
const bass = synth.def(
(phase, env) => Math.sin(phase * Math.PI * 2) * env.value,
{ attack: 0, release: 0.25 }
);
loop(() => {
// Phrase A
bass.play(a1); sleep(0.75);
bass.play(c2); sleep(0.25);
bass.play(e2); sleep(0.5);
bass.play(c2); sleep(0.5);
bass.play(g1); sleep(0.75);
bass.play(c2); sleep(0.25);
bass.play(e2); sleep(0.5);
bass.play(d2); sleep(0.5);
// Phrase B
bass.play(f1); sleep(0.75);
bass.play(a1); sleep(0.25);
bass.play(c2); sleep(0.5);
bass.play(a1); sleep(0.5);
bass.play(g1); sleep(1);
bass.play(e1); sleep(1);
}, { name: "Bass" });
// ==================================================
// PAD – progression harmonique
// ==================================================
const pad = synth.def(
(phase, env) => Math.sin(phase * Math.PI * 2) * env.value * 0.6,
{ attack: 1.2, release: 2.4 }
);
loop(() => {
pad.play(a3); sleep(8);
pad.play(f3); sleep(8);
pad.play(c4); sleep(8);
pad.play(g3); sleep(8);
}, { name: "Pad" });
// ==================================================
// STABS – réponses rythmiques
// ==================================================
const stab = synth.def(
(phase, env) => Math.sin(phase * Math.PI * 2) * env.value * 0.7,
{ attack: 0, release: 0.09 }
);
loop(() => {
sleep(0.5);
stab.play(a3); sleep(0.25);
sleep(1.25);
sleep(0.5);
stab.play(c4); sleep(0.25);
sleep(1.25);
sleep(2); // variation
}, { name: "Stabs" });
// ==================================================
// LEAD – MÉLODIQUE, CHANTANT, ÉVOLUTIF
// ==================================================
function lead(note, d) {
sine.play(note + 12); // au-dessus du mix
sleep(d);
}
loop(() => {
// Thème A
for (let i = 0; i < 4; i++) {
lead(e4,0.5);
lead(g4,0.5);
lead(a4,1);
}
// Thème B
for (let i = 0; i < 4; i++) {
lead(c5,0.5);
lead(a4,0.5);
lead(g4,1);
}
// Thème C (émotion)
for (let i = 0; i < 2; i++) {
lead(a4,1);
lead(g4,1);
lead(e4,2);
}
// Respiration
sleep(8);
}, { name: "Lead" });
// ==================================================
// ARP – BRILLANT, AÉRIEN
// ==================================================
const arp = synth.def(
(phase, env) => Math.sin(phase * Math.PI * 2) * env.value,
{ attack: 0, release: 0.06 }
);
loop(() => {
arp.play(a4); sleep(0.5);
arp.play(c5); sleep(0.5);
arp.play(e5); sleep(0.5);
arp.play(c5); sleep(0.5);
sleep(2);
}, { name: "Arp" });