制作Aetheryte电台
摘要
一个使用Web Audio API和JavaScript创建随机化音频组件的教程,模拟来自游戏《FFXIV》中的电台,通过随机的嗡嗡声和呼呼声实现逼真效果。
暂无内容
查看缓存全文
缓存时间: 2026/08/29 15:37
# 制作以太节点电台
来源:https://haz.ee/posts/aetheryte-radio.html
《最终幻想XIV》会随机播放嗡嗡声,其间隔、音高和增益(音量)均不固定。所有这些随机参数共同营造出一种"生命感",使得资源重复时更难被察觉。幸运的是,游戏提供了这些随机参数的最小和最大值,因此很容易用 JavaScript 进行模拟:
```javascript
const whirIndex = Math.floor(Math.random() * whirs.length);
const whirPlaybackRate = Math.random() * (1 - 0.794) + 0.794;
whirGainNode.gain.value = Math.random() * (1 - 0.6) + 0.6;
```
如果你曾手动构建音频图谱,流程通常包括:创建节点、设置元数据并连接。以下是设置低鸣声的代码:
```javascript
const humSource = audioContext.createBufferSource();
humSource.buffer = await loadSample(
audioContext,
isSafari ? "assets/hum.wav.opus.aac" : "assets/hum.wav.opus",
);
humSource.playbackRate.value = 0.63;
humSource.connect(humGainNode);
humSource.loop = true;
humSource.start(0);
```
实际上,在设置循环前连接节点是可行的,因为节点在调用 `start()` 之前不会生成采样数据。
另一个关键部分是嗡嗡声的循环。这并非传统的循环控制流——我不使用 `while (true)` 搭配随机"休眠",而是用 `setTimeout` 来按随机间隔调度下一次嗡嗡声。
```javascript
function chooseWhir() {
const whirSource = audioContext.createBufferSource();
const whirIndex = Math.floor(Math.random() * whirs.length);
const whirPlaybackRate = Math.random() * (1 - 0.794) + 0.794;
whirGainNode.gain.value = Math.random() * (1 - 0.6) + 0.6;
whirSource.buffer = whirs[whirIndex];
whirSource.playbackRate.value = whirPlaybackRate;
whirSource.connect(whirGainNode);
whirSource.start(0);
whirSource.onended = () => {
whirSource.disconnect(whirGainNode);
const nextWhirDelay = Math.floor(Math.random() * 2001);
setTimeout(chooseWhir, nextWhirDelay);
};
}
```
这里的逻辑类似:创建源节点、随机选择音频资源、设置播放速率(音高)、增益(音量),并将其连接到增益节点(该节点在整个过程中保持连接,仅修改其值)。关键在于,当源音频播放结束时,我们不进行循环,而是将该节点从图谱中移除,并通过再次调用 `chooseWhir` 添加新节点。由于下一次嗡嗡声前本就存在预期延迟,因此通过随机计算引入的额外延迟可以接受——这很可能微乎其微。
相似文章
Show HN: Chiptune Radio
Chiptune Radio 是 Aleph Void, LLC 的一个辅助项目,通过持续的 Twitch 直播,播放为经典音频硬件创作的芯片音乐。
Show HN: Airy – 免费、快速、简单的语音内容创作
Airy 是一款在 Hacker News 上展示的免费、快速、简单的语音内容创作工具。
MiniMax Music 3 无限电台
一个名为TAPEDECK的开源、自托管AI音乐生成电台工具,使用MiniMax Music 3从用户本地GPU上的音乐库创建无限的、个性化电台。
在Arduino上使用Magenta Realtime 2实现无限音乐故障
一位开发者使用ESP32微控制器、MacBook、用于实时音乐生成的Magenta Realtime 2、用于转录的MLX Whisper,以及用于工具调用的Qwen模型,构建了一个本地语音控制的音乐系统,实现了对音乐元素(如流派和乐器)的对话式控制。
@ClaudeDevs: /radio
ClaudeDevs 宣布了 Claude 的新 /radio 功能,可能是一种音频或流媒体模式。