diff --git a/apps/game/assets/audio/ambience/meadows.wav b/apps/game/assets/audio/ambience/meadows.wav index 3b958b8..56524d8 100644 --- a/apps/game/assets/audio/ambience/meadows.wav +++ b/apps/game/assets/audio/ambience/meadows.wav Binary files differ diff --git a/apps/game/tools/audio/gen.mjs b/apps/game/tools/audio/gen.mjs index 05ebdef..20c9dd2 100644 --- a/apps/game/tools/audio/gen.mjs +++ b/apps/game/tools/audio/gen.mjs @@ -175,21 +175,28 @@ return normalize(s, 0.45); } -/** Амбиент лугов: низкий ветер + редкий гул, зациклен. */ +/** Амбиент лугов: настоящий ветер — воздушная полоса, порывы шумом, зациклен. */ function ambienceMeadows() { const dur = 8; - const wind = bandNoise(61, 100, 600, dur); + const air = bandNoise(62, 250, 1800, dur); + const whistle = bandNoise(63, 2000, 4000, dur); const r = makeRng(7); const gusts = []; - for (let i = 0; i < 3; i++) gusts.push({ at: r() * dur, len: 1.5 + r() }); + for (let i = 0; i < 4; i++) gusts.push({ at: r() * dur, len: 0.6 + r() * 1.2 }); const s = synth(dur, (t) => { - let v = wind() * 0.25; - // медленное «дыхание» ветра - v *= 0.6 + 0.4 * Math.sin(2 * Math.PI * t / dur * 2 + 1); + // «Дыхание» ветра: сумма нескольких медленных волн — без ровного прилива. + const breath = + 0.55 + + 0.22 * Math.sin((2 * Math.PI * t) / dur + 1) + + 0.14 * Math.sin((4 * Math.PI * t) / dur + 3.1) + + 0.09 * Math.sin((10 * Math.PI * t) / dur + 5.2); + let v = air() * 0.22 * breath; for (const g of gusts) { const d = t - g.at + (t < g.at ? dur : 0); // зациклить порывы - if (d >= 0 && d < g.len) v += Math.sin(2 * Math.PI * 82 * d) * 0.1 * decay(d, g.len, 2); + if (d >= 0 && d < g.len) v += air() * 0.16 * decay(d, g.len, 1.5); } + // Тихий высокий свист лишь на пике дыхания. + v += whistle() * 0.05 * Math.max(0, breath - 0.55) * 2; return v; }); return loopify(normalize(s, 0.5));