На wave форме видно, что волна начинается не с 0, получается это не синусойда, а косинусойда. Щелчек этот фазовый, образуется из-за того что в цикле фаза сигнала не совпадает.
d.m.k
> attack/decay надо
Не заметил.
Тоже не знаю что это такое.
Длину затухания взял по 0,02 сек (или 20 миллисекунд).
Кажется помогло: стал ковырять код - нашёл небольшую ошибку в логике прошлого алгоритма линейного затухания. Исправил. Теперь вроде без щелчков.
[file=108408]
Vierarmig
> На wave форме видно, что волна начинается не с 0
Чем смотрел?
Vierarmig
> получается это не синусойда, а косинусойда.
А в чём разница?
Vierarmig
> Щелчек этот фазовый, образуется из-за того что в цикле фаза сигнала не
> совпадает.
Не совпадает с чём?
Народ, послушайте этот линейно сглаженный трек ([file=108408]) на предмет щелчков. Достаточно ли сглаживания? Не слишком ли "мягкое" сглаживание или надо более крутой формулой сглаживать (не линейно, а скажем через полиномы 3-й степени)?
Трэд не читал, когда делал нечто подобное, то замечал щелчки между переходами с тона одной частоты на тон другой. Пришёл к выводу, что это происходит из-за резкого смена фаз синусоиды, то есть график колебаний в одном месте испытывает скачёк. Подкрутил так, что фаза следующего тона подхватывала последнюю фазу предыдущего. Код намного усложнился из-за появления состояния, дальше интерес к ковырянию пропал.
Короче целчки из-за резких разрывов в амплитуде, мембрану колбасит и она щёлкает.
Zefick
> Трэд не читал
> Короче целчки из-за резких разрывов в амплитуде, мембрану колбасит и она щёлкает.
Зря не читал. У меня проблема точно не в обрыве синусойды.
Epsilon
> Тоже не знаю что это такое.
Эм, ну это как бы основы синтеза же
Oscillator, ADSR, modulation, filters, LFO. Простейшие вещи. Без этого получишь только пищалку, а не синтезатор.
Разрыв в производных по идее щелчки не должен создавать по крайней мере в рамках 90 градусов. Когда свой тонгенератор писал тоже столкнулся по молодости с фазовыми скачками. Решение очень простое. Использовать один массив - предвычесленную синусоиду (один полный цикл) частотой 1гц. Т.е. в случае 44100 это будет массив в 44100 значений. Частота будет просто задавать скорость движения по этому массиву. При изменении частоты меняется только скорость, а фаза всегда непрерывная. Насколько я знаю по такому принципу даже железячные OPL синты делаются.
d.m.k
> Oscillator, ADSR, modulation, filters, LFO.
А плавное затухание звуковой синусойды - это который из них?
Dexus
Насчёт кеша возможных значений синусойды - подумаю.
========================== (опять этот запрет минусов((
Похоже тему можно считать закрытой.
Щелчков вроде нету. (Хотя я проверяю на встроенных динамиках в ноуте, и музыкальный слух у меня не сильно острый.)
Синусоиду можно генерить поворотом фазы (держим одновременно две величины - косинус и синус текущей фазы, вспоминаем школьную формулу синуса и косинуса суммы углов). Так легко можно задействовать SSE и считать одновременно четыре разных синусоиды.
> А плавное затухание звуковой синусойды - это который из них?
ADSR, когда используется для амплитудной модуляции.
Dmitry_Milk
> Синусоиду можно генерить поворотом фазы (держим одновременно две величины -
> косинус и синус текущей фазы, вспоминаем школьную формулу синуса и косинуса
> суммы углов). Так легко можно задействовать SSE и считать одновременно четыре
> разных синусоиды.
Кстати, я использую такой метод в своём синтезаторе, но вроде как оказалось, что в midi ноты имеют переменную частоту. Там есть параметр, pitch bend называется. Можно ли этот способ адаптировать для неё? Я так понимаю, что переменный шаг всё поломает и синус разойдётся?
> Можно ли этот способ адаптировать для неё? Я так понимаю, что переменный шаг всё поломает и синус разойдётся?
Чтоб синус не разошелся, надо просто контролировать модуль текущей пары синус/косинус. По-простому можно вообще просто ограничивать верхнее значение вычисляемого синуса и косинуса единицей (опять же можно и в SSE через maxps c единицами). Ну и модуль поворачивающей пары тоже должен быть всегда в районе единицы, чуть-чуть больше ее, чтоб генератор самопроизвольно не затух из-за неточностей в плавающей точке.
А вообще вопрос к писателям синтезаторов - вы знакомы с такими терминами, как VST, VSTi, VST-хост? не проще ли сваять свой VST-хост для своего игрового движка и пользоваться готовыми VSTi-плагинами (тысячи их!)? :)
gammaker
Ты про то, как http://www.gamedev.ru/code/forum/?id=202212&page=5#m63 переделать на переменную частоту?
Dmitry_Milk
> А вообще вопрос к писателям синтезаторов - вы знакомы с такими терминами, как
> VST, VSTi, VST-хост?
Я нет. У меня всё синтезируется полностью программно без готовых семплов. А как я понял по небольшому гуглингу VST и есть семплы?
Dmitry_Milk
> ADSR, когда используется для амплитудной модуляции.
Судя по https://ru.wikipedia.org/wiki/ADSR-огибающая я нечто подобное и сделал.
Спасибо за небольшое углубление моих познаний.
FordPerfect
> Ты про то, как http://www.gamedev.ru/code/forum/?id=202212&page=5#m63
> переделать на переменную частоту?
Ну да. Хотя бы без экспоненты, но лучше с ней тоже.
Dmitry_Milk
> А вообще вопрос к писателям синтезаторов - вы знакомы с такими терминами, как
> VST, VSTi, VST-хост? не проще ли сваять свой VST-хост для своего игрового
> движка и пользоваться готовыми VSTi-плагинами (тысячи их!)? :)
В первый раз слышу.
gammaker
> У меня всё синтезируется полностью программно без готовых семплов.
Такая же фигня.
Тема в архиве.