2017-01-20 1 views
2

Я все еще новичок, поэтому для меня это будет довольно продвинутый проект, но я хочу начать его сейчас и использовать в качестве текущей вещи (я не намерен выкатывать готовый продукт через 2 недели, даже не создавать что-то, что я буду использовать, просто опыт обучения).Что мне нужно знать, чтобы начать программирование синтезатора на C++/другом языке?

Я хочу построить синтезатор, который будет использоваться в качестве vst3-плагина для живой версии 9. Я думал, что первым шагом было бы просто сделать что-то, что выводит произвольную форму сигнала и реагирует на вход midi (частота изменяется с в отношении примечания) и базовый шаблон графического интерфейса. Затем я попытался бы ввести различные формы сигнала, а затем больше осцилляторов и расстройки, затем голоса, затем фильтры, затем несколько голосов и т. Д.

Как бы я начал это делать? Я знаю базовый C++, но я, например, не знаю, как создать форму волны и вывести ее как звук. Является ли C++ хорошим языком для использования в этом типе приложения?

+0

Этот вопрос слишком широк для этого сайта. Он также запрашивает мнение (* что мне нужно знать *), что делает его не по теме. Сначала вам нужно будет провести собственное исследование, а затем вернуться сюда с конкретными вопросами, как только вы это сделаете. Пожалуйста, уделите несколько минут, чтобы завершить [тур] и просмотреть страницы [помощи], особенно [о каких темах я могу спросить здесь?] (Http://stackoverflow.com/help/on-topic) и [Какие типы вопрос мне следует избегать?] (http://stackoverflow.com/help/dont-ask). –

ответ

5

Хотя ваш вопрос довольно широк, я могу дать некоторое представление о том, с чего начать.

Во-первых, вам нужно копию VST3 SDK от Steinberg

Из моего опыта, есть довольно большой кривой обучения для начала работы с VST SDK. Поэтому я бы предложил найти библиотеку, которая предоставляет оболочку поверх нее. Например, JUCE

Использование обертки поможет вам преодолеть много программируемых шаблонов, которые необходимо выполнить, чтобы сделать работу VST.

Что касается генерации сигнала, фильтрации и других концепций, связанных с DSP ... здесь так много, что я даже не мог описать его.

Взгляните на musicdsp и The STK на некоторые основные понятия.

Получить книгу по теме. Классическим будет The Audio Programming Book

Кроме того, вам необходимо убедиться, что у вас есть сильное понимание теории звука. Взгляните на Introduction to Computer Music: Volume One.

И, конечно же, Google - ваш друг.

EDIT:

Чтобы ответить на ваш вопрос более полно. Да C++ (или C) был бы языком выбора для такого типа приложений (хотя это был не единственный возможный выбор)

Я бы изучил использование Audio API, прежде чем вникать в разработку VST, это позволит вам работать над ваши навыки без проблем развития VST.

Что касается аудио библиотек, ehese являются два популярных варианта:

  • PortAudio (написан на С)
  • RtAudio (написан на C++, но не с ++ 11 или выше)

    Или вы можете взглянуть на libzaudio Что такое Audio API, над которым я сейчас работаю.(Это в настоящее время зависит от Portaudio, но обеспечивает более современный C++ 11 способ стиль работы с аудио)

Предполагая, что вы установили Portaudio & libzaudio Ниже будет генерировать грех 440Гц волну за одну секунду:

#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; 
} 

(Pulled from one of my example files)

Я был бы счастлив, чтобы объяснить более подробно, если вы хотите связаться со мной в другом месте. (Длительное обсуждение этой темы не будет разрешено при переполнении стека)

Смежные вопросы