Простейшее решение.
Как решить такую задачу в лоб? Например, сжать время, не изменяя высоту.
Очень просто. Разрезаем волну на куски:
Сдвигаем куски:
Получили тоже самое, но проигрываться будет быстрее. Хорошо работает, например, на ритмах,
если разрезать по сетке. Но плохо работает на всем остальном, потому что появляются стыки
и часть волны просто пропадает бесследно. При растяжении времени же появляется неприятное
дублирование звуков:
Гранулярный подход.
Улучшим наше простейшее решение. Избавим его от резких стыков. Для этого нужно не резать
волну на прямоугольные куски, а разбивать ее на гранулы, с более плавными переходами.
Вот так:
Важное условие к гранулам: сделать так, чтобы после смешивания,
амлитуда не исказилась:
Форма гранул.
В остальном, с формой гранул можно поэкспериментировать:
Трапеция и треугольник всё-таки плохие формы, потому что порождают изломы, которые
дают искажение (появляются высокие частоты, которых не было в исходном сигнале):
Поэтому иногда лучше использовать гладкие гранулы, например, приподнятый косинус:
Источник: http://myachin.com/pitch_02.htm |