Если осциллятор представляет собой PCM-проигрыватель, как в нем реализовать PWM?
Выше об этом говорилось. Например, как один из вариантов PWM на основе сэмплов можно реализовать на основе "скольжения" по таблицы семплов (известно как Вейвтейбл синтез ещё с 1981 года на примере синтезатора PPG Wave), где каждое процентное соотношение скважности, это отдельный луп. Примеры PWM на основе вейвтейбл сэмплов есть в базовых пресетах синтезатора Серум. Можете ознакомиться.
Roland D-50, который вышел в 87-ом, также мог позаимствовать у PPG Wave из 81 эту технологию, чтоб создать PWM в своём синте. А то, что в основе PWM Роланда D-50 лежат именно сэмплы - в этом легко убедиться, послушав, как некачественно звучит PWM на самых нижних октавах, там явно прослеживается падение спектра волны прямоугольного пульса, как в обычных сэмплерах при транспонировании прямоугольника, когда не хватает зоны с отдельным сэмплом в нижних октавах. Приходится транспонировать сэмпл из более высоких зон. Соответственно, всё что было по спектру в упор до 20 кГц - съезжает вниз и становится более глухим. В синтезаторах 90-ых проблемы с памятью уже так остро не стояли, поэтому покрытие зон там более качественное.
Ещё один из вариантов, как можно создать PWM на основе сэмплов - это банальный LFO рассинхрон двух пил. Можете ознакомиться тут
Третий вариант описан в мануале JV-1080, там суть состоит в выборе определённой структуры синтеза между двумя сэмплерными осцилляторами ... не помню, кажется с ринг модуляцией. Посмотрите описание на странице структур синтеза, там точно где-то об этом упоминалось в одной из структур.
Наверняка существуют ещё какие-то варианты, сейчас так не припомню...
Как генерируются ЛФО (а они много где заметно алиасят)?
На счёт LFO не понял. Не вникал, как они генерируются, но думаю всё так же на основе сэмплов. В чём тут трудность? Алиасинг - это наоборот, когда очень высокая частота, когда гармоники уходят выше частоты дискретизации. А LFO это тот же сэмпл, только низкий. Какие могут быть проблемы с LFO, не совсем понял.
Так ли ресурсоемок генератор пилы или квадрата на фоне остальной "математики" вроде синхронизации, АМ, ФМ, фильтра итд?
Трудность заключается в том, чтоб уместить ровно целый период волны в целое кол-во отсчётов. Соответственно сгенерить квадрат для определённой частоты - вообще не трудно, но для соседних частот этот же квадрат будет давать большие искажения. Например, мы можем сгенерить условно квадрат с такими значениями амплитуды:
0%, 0, 0 ,0 , 100, 100, 100, 100, 0, 0, 0 ,0 , 100, 100, 100, 100 (как видим здесь по 4 раза чередуется минимальное и максимальное значение амплитуды)
Для частоты в два раза выше (на октаву выше) квадрат будет таким:
0 ,0 , 100, 100, 0 ,0 , 100, 100, 0 ,0 , 100, 100, (как видим здесь по 2 раза чередуется минимальное и максимальное значение амплитуды)
Но для промежуточных нот, не возможно такой простой алгоритмизацией описать квадрат только позицией "есть сигнал" , "нету сигнала"
Например для ноты между верхними двумя примерам такой квадрат в примитивном коде должен был бы выглядеть так
0, 0, 0, 100, 100, 0, 0, 100, 100, 100,
Как видим, тут сначала три раза чередуются ноли, потом два раза сотни .... потом наоборот, три раза сотни, два раза ноли. В целом на большом промежутке в среднем нолей и сотен будет одинаковое кол-во , но при детальном рассмотрении видим, что квадрат-то не совсем квадратный, а искажённый. Это звучит как алиасинг/интермодуляционные искажения. Да, такие примеры алгоритмической генерации есть, но они не практичны. Для чистого же звука правильней использовать чистый квадрат, который целым периодом уложен в целое кол-во отсчётов, и потом транспонирован с оверсемплингом и отфильтрован.
Более подробно со скринами этот же процесс я описывал здесь,
Ребят, какая принципиальная разница между синтезаторами CS1X vs AN1X? Я так понимаю в CS1X была куча волн - и "аналоговые" и "неаналоговые"(и пилы, и квадраты, а также и рояли, гитары, скрипки, итд). А потом вышла AN1X, в которой убрали вторую часть и оставили только "аналоговые"...
rmmedia.ru
ознакомьтесь и посмотрите на скрины, где отображается настоящий чистый отфильтрованный квадрат, и Вы поймёте, что не так просто его сделать на основе примитивной генерации, описанной выше.
Что касается пилы - её ждут те же трудности.
Но, интересное решение применили при синтезе пилы в D-50. Там используется рингл модуляция между синусом и квадратом - получается скруглённая пила, на основе полупериодов синуса. Как в некоторых ямаховскимх чипах. Зачем был применёно такой метод пока не совсем понимаю. Может чтоб добиться мягкого характера пилы, как у аналоговых синтов, ведь пила там тоже не всегда ровная. Не зря ведь существуют Ром карты с винтажных синтов, где с каждого синта засемплированы казалось бы банальные пилы, а ведь каждая со своими нюансами относительно формы казалось бы простой пилы.
на фоне остальной "математики" вроде синхронизации, АМ, ФМ, фильтра итд?
Это как раз очень простые операции
Синхронизация - просто перезапускает сэмпл с определённым периодом, грубо говоря меняются точки лупа в своей памяти.
АМ - просто перемножение двух сигналов. Элементарная арифметическая операция.
ФМ - прибавление сигнала к множителю частоты другого сигнала, тоже относительно простая операция.
Фильтр - да! Это целая тема. Оттого многие цифровые фильтры звучат просто убого! Но в хороших синтах на обработку фильтра выделена целая микросхема, как и для осцилляторов со всеми огибающими. Например, в Yamaha SY99 , там FM+PCM осцилляторы - это одна микросхема. И отдельно для фильтра другая. Представляете, одна микруха для целого FM синтеза с тучей осцилляторов, модуляций, огибающих итп, и отдельная микруха только для фильтров. Не просто так.