Я начинаю писать программный синтезатор со своеобразной характеристикой: осцилляторы будут иметь ручку «непрерывной формы волны», которая позволит пользователям непрерывно выбирать синусоидальные, прямоугольные и зубчатые волны. То есть, если ручка находится до упора влево, на выходе будет синусоидальная волна, если она посередине, будет пилообразная волна, если до конца вправо, то будет прямоугольная волна. а затем из промежуточных положений будут выводиться волны, которые являются «интерполированными» версиями классических волн. - Положения регуляторов и типы волн могут быть изменены, но желательно иметь непрерывный способ изменения формы волны -
Я придумал несколько способов реализации осциллятора:
Придумайте функцию, которая принимает положение ручки и вычисляет спектр фактического сигнала (массив амплитуд и частот), а затем использует набор синусоидальных функций и блок суммы для реализации выходного сигнала.
Аналогично 1., но применяется обратное преобразование Фурье вместо синусов и суммы (хорошо, на данный момент я не уверен, что это на самом деле одно и то же.)
Сгенерируйте таблицу форм сигналов для каждого возможного регулятора расположите и используйте метод синтеза волновой таблицы для генерации выходного сигнала.
Начните с двух зубчатых волн (они содержат как четные, так и нечетные гармоники), инвертируйте одну и просуммируйте их, а затем контролируйте амплитуду каждой из них с помощью ручки. Волновые формы не будут
У меня несколько вопросов:
A. Я читал, что метод №1 очень интенсивен для процессора и практически неосуществим.Верно ли это для процессоров ARM, таких как iPad?
B. Какой бы метод я ни выбрал, можно ли решить проблему наложения спектров, просто подключив фильтр нижних частот к выходу генератора?
C. Есть ли другие предложения о том, как реализовать такой осциллятор?
D. Есть предложения, какой инструментарий C ++ использовать? Я смотрел STK от CCRMA, но не знаю, есть ли другие более подходящие библиотеки.
Пожелайте мне удачи! ;)
Редактировать: Кто-то указал мне на din прошлой ночью. Кривые Безье - еще один вариант, который следует рассмотреть.