use*_*469 5 c++ audio synthesizer
我还是初学者,所以对我来说这将是一个非常先进的项目,但我想现在开始并把它作为持续的事情(我不打算在2周内制作成品,甚至也不是建立我将使用的东西,只是一种学习经验).
我想构建一个合成器,用作forton live 9的vst3插件.我认为第一步就是制作输出任意波形并响应midi输入的内容(频率随音符变化而变化) )和一个基本的GUI模板.然后我会尝试引入不同的波形,然后是更多的振荡器和失谐,接着是声音,接着是滤波器,接着是多个声音等.
我该怎么做呢?我知道基本的c ++,但我不知道如何创建波形并将其输出为声音.c ++是否适合用于此类应用程序?
虽然您的问题非常广泛但我可以从一开始就深入了解.
首先,您需要Steinberg 的VST3 SDK副本
根据我的经验,开始使用VST SDK有很大的学习曲线.所以我建议找一个在它上面提供包装的库.例如JUCE
使用包装器将帮助您完成许多需要完成的样板编程,以使VST工作.
至于波形生成,过滤和其他DSP相关的概念......这里有很多主题,我甚至无法开始描述它.
得到一本关于这个主题的书.经典之作将是音频编程书
此外,您需要确保您对音频理论有很强的把握.看看计算机音乐简介:第一卷.
当然,谷歌是你的朋友.
编辑:
更完整地回答你的问题.是C++(或C)将是这种应用程序的首选语言(尽管不是唯一可能的选择)
在深入研究VST开发之前,我会考虑使用音频API,这样您就可以在没有VST开发麻烦的情况下使用您的技能.
至于音频库,ehese是两种流行的选择:
RtAudio(用C++编写,但不是c ++ 11或更高版本)
或者你可以看看libzaudio这是我目前正在研究的音频API.(它目前依赖于PortAudio,但提供了更现代的C++ 11风格的音频处理方式)
假设你已经安装了PortAudio和libzaudio,下面将生成一个sin 440hz波一秒钟:
#include <iostream>
#include <cmath>
#include <libzaudio/zaudio.hpp>
int main(int argc, char** argv)
{
try
{
//bring the needed zaudio components into scope
using zaudio::no_error;
using zaudio::sample;
using zaudio::sample_format;
using zaudio::stream_params;
using zaudio::time_point;
using zaudio::make_stream_context;
using zaudio::make_stream_params;
using zaudio::make_audio_stream;
using zaudio::start_stream;
using zaudio::stop_stream;
using zaudio::thread_sleep;
//create an alias for a 32 bit float sample
using sample_type = sample<sample_format::f32>;
//create a stream context with the default api (portaudio currently)
auto&& context = make_stream_context<sample_type>();
//create a stream params object
auto&& params = make_stream_params<sample_type>(44100,512,0,2);
//setup to generate a sine wave
constexpr sample_type _2pi = M_PI * 2.0;
float hz = 440.0;
sample_type phs = 0;
sample_type stp = hz / params.sample_rate() * _2pi;
//create a zaudio::stream_callback compliant lambda that generates a sine wave
auto&& callback = [&](const sample_type* input,
sample_type* output,
time_point stream_time,
stream_params<sample_type>& params) noexcept
{
for(std::size_t i = 0; i < params.frame_count(); ++i)
{
for(std::size_t j = 0; j < params.output_frame_width(); ++j)
{
*(output++) = std::sin(phs);
}
phs += stp;
if(phs > _2pi)
{
phs -= _2pi;
}
}
return no_error;
};
//create an audio stream using the params, context, and callback created above. Uses the default error callback
auto&& stream = make_audio_stream<sample_type>(params,context,callback);
//start the stream
start_stream(stream);
//run for 1 second
thread_sleep(std::chrono::seconds(1));
//stop the stream
stop_stream(stream);
}
catch (std::exception& e)
{
std::cout<<e.what()<<std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果您想在其他地方与我联系,我会很乐意详细解释.(Stack Overflow不允许对该主题进行长时间的讨论)