Change the number in line 5 to

Change the number in line 5 to get different melodies.

Log in to post a comment.

// --- Configuration Système de Niveaux ---
ditty.bpm = 124;

// CHANGE CE CHIFFRE (1 à 4) POUR CHANGER L'INTENSITÉ DU JEU
let gameLevel = 4; 

// --- INSTRUMENTS ---
const cyberPluck = synth.def((phase, env) => {
    const v = (phase % 1) < 0.5 ? 1 : -1;
    return Math.tanh(v * 2) * env.value; 
}, { attack: 0.001, release: 0.15 });

const industrialBass = synth.def((phase, env, tick) => {
    const v = (phase % 1) * 2 - 1; 
    // La basse s'ouvre avec le niveau
    const cutoff = (0.05 * gameLevel) + Math.abs(Math.sin(tick * 0.3)) * 0.2;
    return v * cutoff * env.value;
}, { attack: 0.01, release: 0.25 });

const hardKick = synth.def((phase, env, tick) => {
    const p = Math.exp(-tick * 18);
    return Math.sin(phase * 2 * Math.PI * (1 + p * 9)) * env.value;
}, { attack: 0.001, release: 0.35 });

const hatSynth = synth.def((phase, env) => (Math.random()*2-1) * env.value, {attack:0.001, release:0.05});

// --- LOGIQUE DE JEU (AUTO-LEVEL UP TOUTES LES 16 MESURES POUR TESTER) ---
loop((i) => {
    gameLevel = 1 + Math.floor((ditty.tick / 16) % 4);
    sleep(1);
}, { name: 'game_manager' });

// --- SÉQUENÇAGE DYNAMIQUE ---

// 1. MÉLODIE (DÉVERROUILLÉE AU NIVEAU 2)
const tetrisFull = [e5, b4, c5, d5, c5, b4, a4, a4, c5, e5, d5, c5, b4, c5, d5, e5, c5, a4, a4];
loop((i) => {
    if (gameLevel >= 2) {
        const note = tetrisFull[i % tetrisFull.length];
        cyberPluck.play(note, { amp: 0.3 });
        
        // Harmonies de Boss (Niveau 4 uniquement)
        if (gameLevel >= 4 && i % 4 === 0) {
            cyberPluck.play(note - 12, { amp: 0.2, release: 0.4 });
        }
    }
    sleep(0.25); 
}, { name: 'melody_layer' });

// 2. KICK (TOUJOURS PRÉSENT)
loop((i) => {
    hardKick.play(c2, { amp: 1.2 });
    // Le Rumble n'apparaît qu'au niveau 3
    if (gameLevel >= 3 && i % 2 === 1) {
        sleep(0.5);
        hardKick.play(c1, { amp: 0.5, attack: 0.05, release: 0.15 });
        return;
    }
    sleep(0.5); 
}, { name: 'kick_layer' });

// 3. BASSE (ÉVOLUE AVEC LE NIVEAU)
loop((i) => {
    const bassNotes = [a1, e1, a1, f1];
    industrialBass.play(bassNotes[i % bassNotes.length], { 
        amp: 0.4 + (gameLevel * 0.1) 
    });
    sleep(0.5);
}, { name: 'bass_layer' });

// 4. HI-HATS (DÉVERROUILLÉS AU NIVEAU 3)
loop((i) => {
    if (gameLevel >= 3) {
        sleep(0.5);
        hatSynth.play(c4, { amp: 0.15 });
        sleep(0.5);
    } else {
        sleep(1);
    }
}, { name: 'percussion_layer' });