Melodic Sine

Testing code and music

Log in to post a comment.

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