A. Я читал, что методика № 1 очень ресурсоемкая и неосуществима. Это справедливо для процессоров ARM, таких как тот, что на iPad?
Это делает простую задачу сложной (каламбур). Accelerate.framework предоставляет оптимизированные варианты этих функций (fwiw), но все еще усложняет простую проблему. Как общее примечание: вычисления с плавающей точкой на устройствах являются медленными. Реализация с плавающей запятой может значительно снизить стоимость вашей программы. Скорее всего, это приведет к существенному ухудшению характеристик, полифонии или качества. Не зная требований, трудно сказать, можно ли обойтись с помощью вычислений с плавающей запятой.
B. Какой бы метод я ни выбрал, можно ли решить проблему сглаживания, просто подключив фильтр нижних частот к выходу генератора?
Это не сработает для сигналов, генерируемых во временной области, если вы не произвели чрезмерную выборку.
C. Любое другое предложение о том, как реализовать такой генератор?
см. Ниже
D. Какие-либо предложения по использованию инструментария C ++? Я искал STK из CCRMA, но я не знаю, есть ли другие более подходящие библиотеки.
STK больше похож на инструктивный инструмент, чем на инструментарий, разработанный для встроенных синтезаторов. Существуют более подходящие реализации.
Вариант 1. Придумайте функцию, которая принимает положение ручки и вычисляет спектр фактического сигнала (массив амплитуд и частот), а затем использует набор синусоидальных функций и блок суммирования для реализации выходного сигнала.
Вариант 2. Аналогичен 1. но применяет обратное преобразование Фурье вместо синусов и сумм (хорошо, на данный момент я не уверен, действительно ли они одно и то же).
Это относительно медленно на настольных компьютерах.
Вариант 4. Начните с двух волн зубьев пилы (они содержат как четные, так и нечетные гармоники), инвертируйте одну и суммируйте их, а также управляйте амплитудой каждой из них с помощью ручки. Форма волны не будет
Вы можете сделать это достаточно эффективно (например, с помощью BLIT) для генерации без псевдонимов. Тем не менее, BLIT ограничен несколькими сигналами (вы можете использовать его для Saw и Square). Вы можете оглянуться назад на историю и спросить «Как они решили эту проблему в аппаратных и программных синтезаторах около 2000 года». Это было одно решение. Еще было:
Вариант 3. Сгенерируйте таблицу формы волны для каждого возможного положения ручки и используйте метод синтеза таблицы колебаний для генерации выходного сигнала.
Учитывая возможности устройства, я бы рекомендовал реализацию int или BLIT.
За столом легко работать и работать, и он обеспечивает хороший звук и производительность процессора. Он также легко настраивается для компромиссов ЦП / Память / Качество.
Если вы хотите, чтобы псевдоним был свободен (или близок), выберите BLIT (или его родственник). Причина в том, что вам понадобится хороший кусок памяти и достаточное количество избыточной дискретизации для минимального или отсутствия звукового алиасинга с помощью волновых таблиц.
Реализация:
В сети существует множество реализаций BLIT (и семейных).
Вот салфетка-каракули для столов:
enum { WF_Sine, WF_Saw, WF_Square, WF_COUNT };
enum { TableSize = SomePowerOfTwo };
struct sc_waveform {
uint32_t at[TableSize];
};
enum { NPitches = Something };
sc_waveform oscs[WF_COUNT][NPitches];
После инициализации используйте аддитивный синтез для заполнения oscs
.
Во время воспроизведения используйте:
- интерполяция и передискретизация для чтения из таблиц
- или достаточное количество передискретизации сигнала и затем понижающей дискретизации (что эффективно для ЦП).
Для справки: я бы оценил линейную интерполяцию таблицы, которая потребляла безответственный объем памяти (учитывая доступный объем) без передискретизации, должна поддерживать частоты псевдонимов на уровне или ниже -40 дБ, если вы были не чтобы слышать самые высокие частоты, и вы рендерились на частоте 44,1 кГц. Это наивный подход грубой силы! Вы можете сделать лучше с небольшой дополнительной работой.
Наконец, вы также должны найти соответствующую информацию, если вы используете Google "Vector Synthesis" - то, что вы описываете, является его примитивной формой.