当前位置:  开发笔记 > 编程语言 > 正文

在c ++ /其他语言中开始编写合成器时我需要知道什么?

如何解决《在c++/其他语言中开始编写合成器时我需要知道什么?》经验,为你挑选了1个好方法。

我还是初学者,所以对我来说这将是一个非常先进的项目,但我想现在开始并把它作为持续的事情(我不打算在2周内制作成品,甚至也不是建立我将使用的东西,只是一种学习经验).

我想构建一个合成器,用作forton live 9的vst3插件.我认为第一步就是制作输出任意波形并响应midi输入的内容(频率随音符变化而变化) )和一个基本的GUI模板.然后我会尝试引入不同的波形,然后是更多的振荡器和失谐,接着是声音,接着是滤波器,接着是多个声音等.

我该怎么做呢?我知道基本的c ++,但我不知道如何创建波形并将其输出为声音.c ++是否适合用于此类应用程序?



1> Alex Zywicki..:

虽然您的问题非常广泛但我可以从一开始就深入了解.

首先,您需要Steinberg 的VST3 SDK副本

根据我的经验,开始使用VST SDK有很大的学习曲线.所以我建议找一个在它上面提供包装的库.例如JUCE

使用包装器将帮助您完成许多需要完成的样板编程,以使VST工作.

至于波形生成,过滤和其他DSP相关的概念......这里有很多主题,我甚至无法开始描述它.

看一下musicdsp和The STK的一些基本概念.

得到一本关于这个主题的书.经典之作将是音频编程书

此外,您需要确保您对音频理论有很强的把握.看看计算机音乐简介:第一卷.

当然,谷歌是你的朋友.

编辑:

更完整地回答你的问题.是C++(或C)将是这种应用程序的首选语言(尽管不是唯一可能的选择)

在深入研究VST开发之前,我会考虑使用音频API,这样您就可以在没有VST开发麻烦的情况下使用您的技能.

至于音频库,ehese是两种流行的选择:

PortAudio(用C编写)

RtAudio(用C++编写,但不是c ++ 11或更高版本)

或者你可以看看libzaudio这是我目前正在研究的音频API.(它目前依赖于PortAudio,但提供了更现代的C++ 11风格的音频处理方式)

假设你已经安装了PortAudio和libzaudio,下面将生成一个sin 440hz波一秒钟:

#include 
#include 
#include 

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;

        //create a stream context with the default api (portaudio currently)
        auto&& context = make_stream_context();

        //create a stream params object
        auto&& params = make_stream_params(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& 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(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<

(从我的一个示例文件中拉出)

如果您想在其他地方与我联系,我会很乐意详细解释.(Stack Overflow不允许对该主题进行长时间的讨论)

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有