Под масштабом я полагаю, вы имеете в виду горизонтальное увеличение, а не вертикальное.Аудио редакторы делают это, сканируя wavform, разбивая его на временные окна, где каждый пиксель в X представляет некоторое количество выборок.Это может быть дробное число, но вы можете избежать использования дробных коэффициентов масштабирования, не слишком раздражая пользователя.После небольшого уменьшения максимального значения всегда положительное целое число, а минимального значения всегда отрицательное целое.
для каждого пикселя на экране, вам необходимо знать минимальное значение выборки для этого пикселя.и максимальное значение образца.Поэтому вам нужна функция, которая сканирует данные формы сигнала в блоках и отслеживает накопленные максимальные и минимальные значения для этого блока.
Это медленный процесс, поэтому профессиональные редакторы аудио сохраняют предварительно рассчитанную таблицу минимальных и максимальных значений.значения при некотором фиксированном коэффициенте масштабирования.Это может быть в 512/1 или 1024/1.Когда вы рисуете с коэффициентом масштабирования> 1024 выборок / пиксель, вы используете предварительно рассчитанную таблицу.если вы ниже этого соотношения, вы получаете данные непосредственно из файла.Если вы не сделаете этого, вы обнаружите, что при уменьшении масштаба код рисования становится слишком медленным.
Стоит написать код, который обрабатывает все каналы файла за один проход при выполнениимедлительность этого сканирования заставит всю вашу программу чувствовать себя вялой, здесь важен дисковый ввод-вывод, процессор легко справляется, поэтому простой код C ++ хорош для построения таблиц min / max, но вы не хотитепросмотрите файл более одного раза, и вы хотите сделать это последовательно.
После того, как вы получите таблицы min / max, сохраните их.Вы хотите вернуться к диску как можно меньше, и многие причины, по которым вы хотите перекрасить окно, не требуют повторного сканирования ваших таблиц min / max.Стоимость памяти для их хранения не так высока по сравнению с диском, в первую очередь для их построения.
Затем вы рисуете форму волны, рисуя серию вертикальных линий шириной 1 пиксель между максимальными значениями.значение и минимальное значение для времени, представленного этим пикселем.Это должно быть довольно быстро, если вы рисуете из предварительно построенных таблиц мин / макс.
Ответ https://stackoverflow.com/users/234815/John%20Knoeller