在GBDK c中使用采样音频播放时如何运行代码?

isa*_*mpl 6 c audio gameboy

我正在为GBDK中的GameBoy制作游戏,我正在尝试为游戏添加声音.GBDK有一个从一组值中播放声音的功能,唯一的问题是,当它播放声音时,脚本的其余部分会冻结.有没有办法可以让它们同时运行?

Pok*_*u22 2

使用采样音频播放时无法运行代码。这是因为它实际上使用了完整的 CPU 来执行此播放。如果您想使用常规音效,则需要在游戏进行时暂停游戏,或者使用不同的方法。我将尝试使用下面的其他播放方法进行总结,但它有点复杂,而且我不是专家。

\n
\n

使用“正常”音效

\n

这是一种 WIP - 我对此不太有经验,但它应该可以让您开始。

\n

要使用音效,您需要写入 GameBoy 音频寄存器。这可以在 GBDK 的 中找到hardware.h,它自动包含在对 的引用中gb\\gb.h。但是(当然)寄存器没有任何文档。此信息可在GB Cribsheet上找到。还有这个声音文档文件(不幸的是,它在 Windows 编码上表现得很奇怪 - 使用记事本以外的其他工具打开),以及在Devrs.com 声音文档中找到的一些其他信息。

\n

GBSOUND.TXT 的工作:

\n
\n

可以访问声道的地址为:
\n$Addresses: (描述), (寄存器简写)
\n$FF10 -- $FF14: 通道 1,称为 NR10-NR14
\n$FF15 未使用,可能是通道 2 的扫描寄存器
\
n$FF16 -- $FF19:通道 2,称为 NR21-NR24
\n$FF1A -- $FF1E:通道 3,称为 NR30-NR34
\ n$FF1F 未使用,可能是通道 4 的扫描寄存器
\
n$FF20 -- $FF23:通道 4,称为 NR41-NR44
\n$FF24 控制 Vin 状态和音量,称为如NR50
\n$FF25选择每个通道到哪个输出,简称NR51
\n$FF26是状态寄存器,也控制声音电路的电源。
\n称为 NR52
\n$FF27 - $FF2F 未使用。
\n$FF30 -- $FF3F 是通道 4 位样本的加载寄存器空间
\n3

\n
\n

在 GBDK 中,寄存器被命名为NR10_REG, NR11_REG, NR12_REG, 等。

\n

另外,尝试查看示例程序sound.c,不幸的是,它无法为我编译。我可能会编辑此内容以包含更多信息。

\n
\n

回答@franklin的问题:

\n
\n

这就引出了一个问题,Gameboy 如何同时玩游戏和声音?

\n
\n

他们通常不会在播放样本时这样做。例如,如果您查看 Pok\xc3\xa9mon Yellow,皮卡丘的哭声是通过示例播放完成的。但在播放的同时,没有做任何其他事情。另一方面,像普通背景音乐这样的事情是使用其他音频硬件完成的(抱歉,不是很详细的维基链接)。同样,虽然移动声音效果通过噪声通道(也用于样本播放)完成的,但它们实际上并不是采样的音频。这样,游戏就可以继续运行。

\n