有C的声音库,可以从代码生成声音样本吗?[关闭]


10

我正在为C中的复古游戏开发引擎。我正在寻找一个声音库,该声音库可以从代码中产生芯片声音...我想为引擎创建自己的简单Chiptune跟踪器,以创建音乐。这样的事情存在吗?

我也对在项目中使用.nsf文件的库感兴趣。

我正在使用Linux进行开发。


我认为这个问题属于“使用哪种技术”类别。虽然这些利基请求通常不会产生大量响应,但我认为这不是建设性的。
MichaelHouse

好吧,问题是我似乎什么也找不到。我什至不知道从哪里开始...我发现的每个库都专注于从.wav等文件加载。如果我只想加载.mod或.xm模块,则可以使用libmikmod,但这不是我想要的。
rzrscm 2013年

我不认为这真的属于游戏开发范围。它是比游戏更普通的媒体。
PixelArtDragon

尝试搜索“ mod跟踪器”,或者搜索“ demoscene跟踪器”,以获得更一般的背景和资源。
Patrick Hughes

1
我个人认为这个问题是一个好问题。由于我喜欢编写复古游戏,因此如果不加入一些不起眼的社区,很难找到诸如此类的资源。
Zack The Human

Answers:


3

可能不是正确答案,但是这里有各种音频引擎的库

(向下滚动到音频库的第二部分)

12个引擎中至少有9个使用C。它们大多数还支持跟踪器文件。这与nsf(我认为这些是NES音乐文件)文件没有什么不同。


16

当然可以,让它听起来“不错”并不是一件容易的事。

我不知道如何在Linux中执行此操作,但是如果您可以播放PCM缓冲区,那么您所需要做的就是将其填充为所需的内容。

因此,假设您的缓冲区设置为以每秒44100个样本的速度在单声道,带符号的16位样本中播放,那么创建纯净(正弦)A4声音(440 Hz)非常简单

int16_t buffer[44100];
float frequency = 440.0f;
float sampling_ratio = 44100.0f;
float amplitude = 0.5f;
float t;
for (int i = 0; i < 44100; i++)
{
    float theta = ((float)i / sampling_ratio) * PI;
    buffer[i] = (int16_t)(sin(theta * frequency) * 32767.0f * amplitude);
}

但是,这种声音可能对您的兴趣非常沉闷,因此您必须做一些更复杂的事情。通常,声音合成有两种类型:加性减性。还有很多,但是这两个可能是最简单的。今天,我将讨论加法合成。

对于加法合成,您执行的操作与我刚才所做的相同,但是您不只是使用一个频率的一个振幅,而是将多个波加在一起。就像同时按下钢琴上的几个键一样。因此,您将代码修改为如下所示:

void add_sine_wave(int16_t* buffer, int buffer_length, float frequency, float sampling_ratio, float amplitude)
{
    for (int i = 0; i < buffer_length; i++)
    {
        float theta = ((float)i / sampling_ratio) * M_PI;
        // make sure to correct for overflows and underflows
        buffer[i] += (int16_t)(sin(theta * frequency) * 32767.0f * amplitude);
    }
}

然后像这样使用它:

int16_t buffer[44100];
memset(buffer, 0, sizeof(buffer));
// Create an A Major chord
add_sine_wave(buffer, 44100, 440.0f, 44100.0f, 0.5f);
add_sine_wave(buffer, 44100, 554.37f, 44100.0f, 0.5f);
add_sine_wave(buffer, 44100, 659.26f, 44100.0f, 0.5f);

顺便说一句,我是从得到我的频率这里(我使用的是相同的气质,但也有很多 其他可用调音)。

请注意,到目前为止,我只是一直在使用正弦波,但老合成器还支持方形三角形锯齿波为好,每一个都有自己有趣的声音特性。实现这些非常简单。

您可以做的其他事情可以增加声音的多样性:

  1. 振幅调制:改变整个缓冲器中波的振幅
  2. 调频:改变整个缓冲器中的波频率
  3. 混响:通过更改其形状和在缓冲区中的位置来重复采样。本身是一个非常复杂的话题。
  4. 包络:改变样品的振幅以延长样品寿命

这里的要点是这些技术本身并不是很困难,因此您实际上并不需要一个库来为您抽象它们。使用它们来创建有趣的声音是困难的。

最后一点。在尝试这样的声音时,将数据保存到WAV文件,然后在诸如Audacity之类的某些软件中进行可视化可能非常有用。这样,您可以更清楚地看到自己在做什么。


+1代表自己滚动。我没有看到许多支持NSF的Linux库。但是,这是规格:webcache.googleusercontent.com/…–
michael.bartnett

谢谢你的信息。现在,我可能会坚持为项目创建.nsf文件,因为我意识到要使声音听起来恰到好处我需要投入多少。
rzrscm

+1我认为对这个问题的任何回答都是乏味的。我对AM / FM知之甚少,但一般来说,波首先会被路由到滤波器,就像减法合成一样。另外,您的多个钢琴音符示例是正确的,一个更好的示例就是一个音符!单个钢琴音符会产生多个和声,使其具有音色。钢琴会创建> 5个波,将它们加在一起,而在大多数合成器中,2或3个就可以了。
Tony

在“ add_sine_wave”函数中检查溢出的正确方法是什么?
eadmaster 2014年

@eadmaster:我的意思是剪裁。在将值强制转换为short之前,请确保该值适合short
2014年

4

对于Chiptune音效,有一个明确的答案:sfxr

它是一个独立的应用程序,可用于生成示例,但如果要将其集成到代码中,也可以使用源代码。


3

我可以亲自推荐Blargg的音频库。您可能特别感兴趣的是他的Blip_Buffer

Blargg的站点上有几个“复古”音频合成器,我正在积极使用他的Game_Music_Emu在我正在编写的《洛克人》克隆中播放NSF文件。

许多库都是用C ++编写的,但是有些库也提供C接口。


肯定会尝试其中的一些...它们可能正是我正在寻找的东西,因为我正在开发一个旨在模仿NES游戏外观的游戏引擎。
rzrscm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.