1. 产品
  2.   声音的
  3.   C++
  4.   STK
 
  

免费 C++ API 用于音频合成与数字信号处理

领先的开源 C++ 库 STK(Synthesis ToolKit),使软件开发者能够进行音频合成和数字信号处理。探索其关键特性、实时音频能力,以及面向开发者的实用代码示例。

什么是 STK(Synthesis ToolKit)?

STK(C++ 合成工具包)是一款享有盛誉的开源库,专为音频信号处理和算法音乐合成而设计。它由斯坦福大学 CCRMA 开发,为开发者提供了一套强大的 C++ 类,简化了复杂音频软件的创建。与单体应用不同,STK 是一系列单元生成器——模块化构件——的集合,能够快速开发合成器、效果处理器和乐器。STK 库对从事数字乐器、音频效果软件、游戏音频引擎、声音合成研究、教育 DSP 项目等开发工作的人员非常有价值。

STK(C++ 合成工具包)是一款开源的 C++ 库,提供可重用的类用于音频信号处理、数字合成和乐器建模。它特别有用,因为它强调可移植性和易用性。它屏蔽了跨平台音频驱动和 MIDI 处理的底层复杂性,使开发者能够专注于声音设计的创意方面。无论您是构建专业插件还是教育工具,STK 都提供了实现高性能实时音频所需的稳定性和灵活性。与大型音频框架不同,STK 保持架构简洁透明。开发者可以轻松理解音频算法的工作原理并对其进行修改以进行自己的实验。它还提供了现成的乐器模型,如长笛、单簧管和拨弦模拟,使其成为构建软件合成器的绝佳起点。

Previous Next

STK 入门指南

请使用以下命令进行完整安装。

从 GitHub 安装 STK

 git clone https://github.com/thestk/stk.git

实时音频合成

STK 最强大的功能之一是对实时声音生成的支持。开发者可以在程序执行期间动态生成音频信号,而不是依赖预先录制的样本。这对于数字合成器、音乐制作工具和现场音频表演软件等应用至关重要。STK 提供高效的处理函数,能够持续生成音频帧并保持低延迟。正因为此能力,STK 常被用于需要响应式音频合成的研究和音乐技术环境中。下面是一个简单示例,演示了 STK 如何以编程方式生成声音。

如何通过 C++ 库以编程方式生成声音?

#include "SineWave.h"
#include "RtAudio.h"

int main() { stk::SineWave oscillator; oscillator.setFrequency(440.0); // A4 音符

for (int i = 0; i < 100; i++) { double sample = oscillator.tick(); std::cout << sample << std::endl; }

return 0; } 

物理建模乐器

开源的 STK 库包含内置类,使用物理建模算法模拟真实乐器。这些模型再现了乐器在物理世界中的行为。例如,长笛、单簧管、曼陀林以及弓弦乐器。物理建模很有用,因为它允许开发者控制诸如气压、弓力或弦振动等表现参数。

如何通过 STK 库创建逼真的数字乐器?

#include \"Clarinet.h\"

int main() { stk::Clarinet clarinet;
    
clarinet.noteOn(440.0, 0.8);

for(int i = 0; i < 200; i++) { double sound = clarinet.tick(); std::cout << sound << std::endl; }

clarinet.noteOff(0.5);

return 0; }  

内置音频和 MIDI 支持

STK 库还支持实时音频和 MIDI 输入/输出。这使得应用程序能够与外部设备(如 MIDI 键盘和音频接口)交互。通过 MIDI 集成,开发者可以实时控制合成参数,从而创建软件合成器、交互式音乐应用、现场表演工具等。下面的示例创建了一个监听传入 MIDI 消息的程序。

如何在 C++ 应用中监听并存储 MIDI 消息?

#include \"RtMidi.h\"

int main() { RtMidiIn midi;

if (midi.getPortCount() == 0) { std::cout << \"没有可用的 MIDI 端口!\" << std::endl; return 0; }

midi.openPort(0);

std::cout << \"正在监听 MIDI 输入...\" << std::endl;

while (true) { std::vector message; midi.getMessage(&message);

if (!message.empty()) { std::cout << \"收到 MIDI 消息!\" << std::endl; } }

return 0; }

 

通过 C++ 的模块化单元生成器

STK 库遵循模块化设计理念,提供大量的 "unit generators"(UGens)。这些包括振荡器、滤波器、包络和延迟效果,能够像虚拟模块化合成器一样进行拼接。此粒度让开发者对信号链拥有完全控制。由于每个类都被设计为高效处理音频帧,您只需连接不同的 STK 对象,就可以从简单的正弦波生成器构建到复杂的多阶段颗粒合成引擎。

 中国人