аудио — Что мне нужно знать, чтобы начать программирование на синтезаторе C + / другой язык?

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

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

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

3

Решение

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

Во-первых, вам понадобится копия VST3 SDK из Штайнберга

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

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

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

Взгляни на musicdsp а также СТК для некоторых основных понятий.

Получить книгу на эту тему. Классика будет Книга аудио программирования

Кроме того, вы должны убедиться, что вы хорошо разбираетесь в теории звука. Взгляни на Введение в компьютерную музыку: Том первый.

И, конечно же, Google — твой друг.

РЕДАКТИРОВАТЬ:

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

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

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

  • Portaudio (написано в C)
  • RTAudio (написано на C ++, но не на C ++ 11 или выше)

    Или вы могли бы взглянуть на libzaudio Это аудио 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;
}

(Взято из одного из моих примеров файлов)

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

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]