// 设置速度:轻快的120 BPM
ditty.bpm = 120;
// 定义几种不同的音色
const lead = synth.def((phase, env) => {
// 主旋律音色:明亮的锯齿波
return (phase % 1 - 0.5) * 2 * env.value;
});
const bass = synth.def((phase, env) => {
// 贝斯音色:柔和的正弦波
return Math.sin(phase * Math.PI * 2) * env.value;
});
const pad = synth.def((phase, env) => {
// 和声音色:温暖的三角波
return (Math.abs(phase % 1 - 0.5) * 4 - 1) * env.value;
});
const kick = synth.def((phase, env) => {
// 底鼓音色
const pitch = 100 + (1 - phase) * 50;
const sine = Math.sin(phase * pitch);
return sine * env.value;
});
const snare = synth.def((phase, env) => {
// 军鼓音色:添加噪音
const noise = Math.random() * 2 - 1;
const tone = Math.sin(phase * 200);
return (tone * 0.3 + noise * 0.7) * env.value;
});
const hihat = synth.def((phase, env) => {
// 踩镲音色:纯噪音
const noise = Math.random() * 2 - 1;
return noise * env.value;
});
// 定义音符常量(C大调音阶)
const c4 = 261.63;
const d4 = 293.66;
const e4 = 329.63;
const f4 = 349.23;
const g4 = 392.00;
const a4 = 440.00;
const b4 = 493.88;
const c5 = 523.25;
const d5 = 587.33;
const e5 = 659.25;
const f5 = 698.46;
const g5 = 783.99;
const a5 = 880.00;
const b5 = 987.77;
const c6 = 1046.50;
// 低音区音符
const c2 = 65.41;
const g1 = 49.00;
const a1 = 55.00;
const f1 = 43.65;
// 主旋律循环
loop(() => {
// 轻快的旋律:C大调上行
lead.play(c5, { attack: 0.01, release: 0.15, duration: 0.25 });
sleep(0.25);
lead.play(e5, { attack: 0.01, release: 0.15, duration: 0.25 });
sleep(0.25);
lead.play(g5, { attack: 0.01, release: 0.15, duration: 0.25 });
sleep(0.25);
lead.play(c6, { attack: 0.01, release: 0.3, duration: 0.5 });
sleep(0.5);
lead.play(b4, { attack: 0.01, release: 0.15, duration: 0.25 });
sleep(0.25);
lead.play(d5, { attack: 0.01, release: 0.15, duration: 0.25 });
sleep(0.25);
lead.play(f5, { attack: 0.01, release: 0.15, duration: 0.25 });
sleep(0.25);
lead.play(b5, { attack: 0.01, release: 0.3, duration: 0.5 });
sleep(0.5);
lead.play(a4, { attack: 0.01, release: 0.15, duration: 0.25 });
sleep(0.25);
lead.play(c5, { attack: 0.01, release: 0.15, duration: 0.25 });
sleep(0.25);
lead.play(e5, { attack: 0.01, release: 0.15, duration: 0.25 });
sleep(0.25);
lead.play(a5, { attack: 0.01, release: 0.3, duration: 0.5 });
sleep(0.5);
lead.play(g4, { attack: 0.01, release: 0.15, duration: 0.25 });
sleep(0.25);
lead.play(b4, { attack: 0.01, release: 0.15, duration: 0.25 });
sleep(0.25);
lead.play(d5, { attack: 0.01, release: 0.15, duration: 0.25 });
sleep(0.25);
lead.play(g5, { attack: 0.01, release: 0.3, duration: 0.5 });
sleep(0.5);
}, { name: 'Melody' });
// 和声循环(分解和弦)
loop(() => {
// C 和弦
pad.play(c4, { attack: 0.05, release: 0.2, duration: 0.5 });
sleep(0.5);
pad.play(e4, { attack: 0.05, release: 0.2, duration: 0.5 });
sleep(0.5);
pad.play(g4, { attack: 0.05, release: 0.2, duration: 0.5 });
sleep(0.5);
pad.play(c5, { attack: 0.05, release: 0.2, duration: 0.5 });
sleep(0.5);
// G7 和弦
pad.play(g3, { attack: 0.05, release: 0.2, duration: 0.5 });
sleep(0.5);
pad.play(b3, { attack: 0.05, release: 0.2, duration: 0.5 });
sleep(0.5);
pad.play(d4, { attack: 0.05, release: 0.2, duration: 0.5 });
sleep(0.5);
pad.play(f4, { attack: 0.05, release: 0.2, duration: 0.5 });
sleep(0.5);
// Am 和弦
pad.play(a3, { attack: 0.05, release: 0.2, duration: 0.5 });
sleep(0.5);
pad.play(c4, { attack: 0.05, release: 0.2, duration: 0.5 });
sleep(0.5);
pad.play(e4, { attack: 0.05, release: 0.2, duration: 0.5 });
sleep(0.5);
pad.play(a4, { attack: 0.05, release: 0.2, duration: 0.5 });
sleep(0.5);
// F 和弦
pad.play(f3, { attack: 0.05, release: 0.2, duration: 0.5 });
sleep(0.5);
pad.play(a3, { attack: 0.05, release: 0.2, duration: 0.5 });
sleep(0.5);
pad.play(c4, { attack: 0.05, release: 0.2, duration: 0.5 });
sleep(0.5);
pad.play(f4, { attack: 0.05, release: 0.2, duration: 0.5 });
sleep(0.5);
}, { name: 'Harmony' });
// 贝斯循环
loop(() => {
bass.play(c2, { attack: 0.02, release: 0.3, duration: 0.5 });
sleep(0.5);
bass.play(g1, { attack: 0.02, release: 0.3, duration: 0.5 });
sleep(0.5);
bass.play(a1, { attack: 0.02, release: 0.3, duration: 0.5 });
sleep(0.5);
bass.play(f1, { attack: 0.02, release: 0.3, duration: 0.5 });
sleep(0.5);
bass.play(c2, { attack: 0.02, release: 0.3, duration: 0.5 });
sleep(0.5);
bass.play(g1, { attack: 0.02, release: 0.3, duration: 0.5 });
sleep(0.5);
bass.play(a1, { attack: 0.02, release: 0.5, duration: 1 });
sleep(1);
}, { name: 'Bass' });
// 鼓点循环
let beatCount = 0;
loop(() => {
// 底鼓:第1、3拍
if (beatCount % 2 === 0) {
kick.play(80, { attack: 0.001, release: 0.1, duration: 0.25 });
}
sleep(0.25);
// 军鼓:第2、4拍
if (beatCount % 2 === 1) {
snare.play(200, { attack: 0.001, release: 0.1, duration: 0.25 });
}
sleep(0.25);
// 踩镲:每拍都响
hihat.play(0, { attack: 0.001, release: 0.05, duration: 0.125 });
sleep(0.125);
hihat.play(0, { attack: 0.001, release: 0.05, duration: 0.125 });
sleep(0.125);
beatCount = (beatCount + 1) % 4;
}, { name: 'Drums' });