#synth #synthesizer #audio #sound #audio-stream #no-std

no-std sonant

支持流媒体的Sonant 4K合成器Rust移植版

2个不稳定版本

0.2.0 2024年4月23日
0.1.0 2019年11月3日

#189 in 嵌入式开发

Download history 154/week @ 2024-04-19 18/week @ 2024-04-26 3/week @ 2024-07-05

每月 70 次下载

MIT 许可证

36KB
635

Sonant-rs

Crates.io Documentation GitHub actions unsafe forbidden

带有流媒体支持的Sonant 4K合成器的Rust移植版。

Sonant (C) 2008-2009 Jake Taylor [ Ferris / Youth Uprising ]

这是什么?

这是一个专为4K引言编写的微型合成器。它可以用很少的代码和乐器数据产生高质量的音频。歌曲文件大小仅略超过3KB,但如果您有更严格的尺寸预算,还可以对其进行定制以减少乐器音轨或模式的数量。

sonant::Synth类型被实现为一个迭代器,这使得它非常适合产生实时音频流,并且内存开销很小;歌曲数据大约为6.2KB,另一个2.5KB用于缓冲音符频率。它最初是为了针对任天堂64而编写的,该设备的系统内存基准为4MB!

遗憾的是,它在N64的93MHz CPU上运行得太慢。它可能能在RCP上运行,例如通过在向量单元上每次计算8个样本。但这将需要将样本生成器移植到使用16位定点数。然后还有rustc无法针对RCP的问题。哦,算了!

它是如何工作的?

数学和魔法!我完全不知道。合成器对我来说很奇怪,但它们能制作出非常动听的音乐。

每首歌曲有八个乐器音轨,每个乐器有两个振荡器。振荡器协同工作(或者如果你喜欢,相互抵消)来改变乐器频率。乐器的“个性”由四种波形之一提供: SineSquareSawTriangle。振荡器的频率调节这些基本波形以产生最终的声音。

除了主要振荡器之外,每个乐器还有一个自己的低频振荡器(LFO),这就是你在电子音乐中经常听到的慢速音调变化的原因。

最后,每个乐器都有一个独立的效果通道,可以进行HighPass(高通滤波)、LowPass(低通滤波)、BandPass(带通滤波)和Notch(陷波滤波)。效果还提供了简单的共振、延迟(回声)和声像。

歌曲结构的其余部分对于轨道音乐来说相当标准;每个乐器可以有最多10种模式。任何模式都可以从一个48元素的序列中引用。每种模式本身包含32个音符。

延迟效果通过额外的音符来实现,这大大减少了内存占用。原始实现使用超过42MB的内存来维护延迟缓冲区。我通过在需要时重新计算所有延迟样本来权衡以获得更好的内存效率。

如果您想了解更多关于合成器、追踪器或歌曲格式的信息,请参阅Sonant手册(包含在Pouët上的原始发布存档中)。

如何使用它?

请参阅player示例,了解一些加载和播放.snt文件的代码。

cargo run --release --example player -- ./examples/poseidon.snt

您可以使用原始发布中的sonant-tool创建.snt文件。您还可以使用Sonant Live上的“保存”按钮(不是“保存JavaScript”按钮!),但别忘了查看它的手册

限制

原始合成器除了.snt格式能够存储的内容之外,没有很多限制。尽管这个版本的实现基于迭代器,但也带来了一些限制。例如,每个乐器轨道同时最多只能播放8个重叠音符。sonant-tool能够生成需要每个乐器轨道最多100个重叠音符的.snt文件,但这仅在极端情况下才是真的。.snt格式本身理论上能够需要最多1,536个重叠音符!

使用大量延迟效果的乐器歌曲将更快达到重叠音符的限制。如果您需要支持更多的重叠音符,可以简单地增加consts.rs中的值;任何值到32都将工作,无需其他更改。

由于延迟音符的工作方式,四分音符的长度不能是奇数。这会导致八分音符的长度成为小数,并使“在过去的音符中找到音符”的过程复杂化。为了解决冲突,四分音符的长度通过“向下取整”到最近的偶数来调整为偶数。这会对播放时长产生轻微的影响;四分钟的歌曲将比其他播放器的渲染时长短大约1秒。

Sonant以相反的顺序生成样本。我们必须按时间顺序生成样本。这会任意地改变单个音符的波形相位(这取决于音符长度、包络和非确定性LFO)。这些差异太微妙,以至于人类无法区分,但值得一提。

依赖关系

~1MB
~17K SLoC