H4

H4

Log in to post a comment.

// 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 });