Из журнала ZX-Guide#4.5, Рязань, 08.2002 Автор: Alone Coder (Dima Bystrov) Цифровые плейеры В этот раз я хочу рассказать свои мысли по поводу улучшения качества звучания циф- ровых плейеров, не иллюстрируя их исходни- ками, так как этих исходников пока нет :] Начнём с того, что больше всего портит нам жизнь... А что, собственно, портит нам её больше всего в данной области? 1) Низкая частота выборки (дискретизации); 2) Неравномерность выборки: 2.1) Неравномерность внутри главного цикла (Chip Tracker); 2.2) Рывки во время зацикливания сэмпла (Extreme's Tracker v2.10) 2.3) Рывки во время обработки нотного тек- ста и периодичных команд (таких как gliss и т.п.) 3) Отсутствие интерполяции сэмплов при их передискретизации; 4) Узкий динамический диапазон,"низкая би- тность" 1. Низкая частота выборки. В прошлом номере я рассмотрел один из способов разрешения этой проблемы. 15 и выше кГц достаточны для того, чтобы музыка играла более-менее отчётливо, а хорошо на- строенный аналоговый фильтр на RC-цепочках может дать весьма и весьма приемлемое ка- чество звучания. Верхних частот практичес- ки до границы полосы слышимости может до- бавить использование Turbo + Cache. В сущности, эта проблема - самая, если можно так сказать, легкоизбегаемая. Созда- тели цифровых плейеров в основном с ней и борются. Альтернативные варианты решения: а) при физическом отсутствии канала в дан- ный момент звучания использовать другой плейер, с меньшим числом каналов и,соот- ветственно,более быстрый.Сложность в не- обходимости подгонки плейеров друг под друга и под скорость компьютера, но эта проблема решаема автоподстройкой.К сожа- лению,отдельные каналы выключаются в ме- лодии редко; б) не использовать громкость. Жестокий ме- тод, но применён во многих музыкальных редакторах. Громкость довольно сильно влияет на частоту дискретизации,где-то у меня были графики...да шут с ними. Недо- статок громкости в тексте музыкального произведения можно компенсировать испо- льзованием команд Sample offset для не- зацикленных затухающих сэмплов и дубли- рованием сэмплов в памяти с двумя-тремя разными громкостями; в) выделить один канал как ударник,в кото- ром все сэмплы звучат на одной и той же ноте. (Разумеется,для этого нужен специ- альный редактор и/или терпение компози- тора.) 2.1. Неравномерность выборки внутри главного цикла. Эта проблема формулируется как плаваю- щее время расчёта-выдачи одного кванта вы- ходного сигнала, заметное в масштабах нес- кольких квантов. Как правило,теория вероятностей сглажи- вает это время, если рассматривать звук в более крупных масштабах.Так и происходит в Chip Tracker'е. Сам недостаток слабо влияет на чистоту звучания,но если его можно избежать,то из- бежать его имеет смысл. Обычно это доволь- но просто, например,используя сложение че- рез конструкции вида: ... LD A,C ADD A,B LD C,A ADC A,L SUB C LD L,A ADC A,H SUB L LD H,A ... В случае методов с таблицами подпрог- рамм можно округлять времена выполнения всех подпрограмм до совпадения с самой ме- дленной из них. Как правило,время выполне- ния таких программ сильно коррелировано с высотой нот, поэтому во избежание НЕВЕРО- ЯТНОСТНОГО характера искажения желательно всё-таки пожертвовать выборкой и - округ- лить... 2.2. Рывки во время зацикливания сэмпла. Обработка окончания инструмента - один из самых сложных моментов сэмплового прин- ципа синтеза цифрового звука. Если поместить проверку окончания сэмп- ла в главный (поквантовый) цикл,то частота дискретизации ощутимо страдает. Поэтому такая проверка должна проходить не чаще каждого N-го кванта... В этом случае про- сто необходимо "добивать" окончание сэмпла фрагментом начала его же зацикливания, чтобы точка зацикливания не замечалась на слух. Но как быть, если выход из цикла после проверки на цикл, изменение параметров и последующий вход в цикл занимают весьма значительное время? Особенно когда сэмпл настолько короткий, что зацикливания воз- никают ОЧЕНЬ часто? А если критическим по времени выполнения фрагметном является, к примеру, смена текущей странички при пере- ходе сэмпла с одной на другую,а этот самый короткий сэмпл как раз пересекает эту гра- ницу? Результаты такого зацикливания сове- ршенно плачевные - сонг при проигрывании станет совсем на себя не похож... Поэтому для таких коротких сэмплов при- ходится применять РАСЧИПОВЫВАНИЕ.Этот про- цесс заключается в искусственном увеличе- нии длины сэмпла за счёт многократного по- вторения фрагмента его зацикливания. Как правило, Loop (цикл) длиной 256 байт и бо- лее сводит негативные последствия почти на нет, но плейеры могут быть такие разные, и не исключено,что в каком-нибудь конкретном случае не хватит даже килобайта. 2.3. Рывки во время обработки нотного текста и периодичных команд. Во время возникновения условного преры- вания плейер начинает просматривать нотный текст. Это, в зависимости от сложности си- стемы команд, предусмотренных форматом,мо- жет занять до нескольких тысяч тактов. Эта величина соотносительно со временем работы цикла синтеза звука занимает,прямо скажем, ЗНАЧИТЕЛЬНОЕ время. Но всё это время звук не синтезируется. В результате возникает постоянное искажение, заметно ухудшающее акустические характеристики. Что обидно,нет ничего сложнее,чем побе- дить ту проблему! Что можно предложить? а) перед проигрыванием сохранить параметры плейера на каждый такт времени в некоем "открытом и быстродоступном" формате; - не панацея... ;( б) разделить расчёт и проигрывание плюс включить несколько OUT'ов в процедуру просмотра нотного текста плюс фиксиро- вать время её выполнения. - ОЧЕНЬ сложно настраивать ;( 3. Отсутствие интерполяции сэмплов. Этот недостаток обладает почти самым сильным влиянием на звук, если не считать, конечно, низкие частоты дискретизации. Интерполяция на лету - довольно медлен- ное занятие. Можно реализовать её в чистом виде (существует три метода), но есть ва- риант: использовать расширенную память ЭВМ (звучит? ;)) для хранения увеличенной, на- пример,вдвое,с интерполяцией,копии сэмпла. При fдиск.плейера є fдиск.сэмпла интерпо- лированный сэмпл будет почти неотличим от сэмпла с вдвое большей частотой дискрети- зации :) Не всегда это даст что-то,поэтому можно задуматься и о настоящем сглаживании, нап- ример, линейном... Интерполяцию можно применять как к са- мим сэмплам,так и к выходному сигналу.Вто- рое проще, первое лучше. Есть выбор ;) 4. "Низкая битность". Проблема возникает при использовании простейшего способа микширования N каналов в один ЦАП - сложением. Разумеется, это не самое эффективное использование диапазона. Например, если помещать в 8-битный канал 4 7-битных сэмпла с обрезанием переполнения, это самое переполнение возникнет вовсе не так уж часто,чтобы создавать искажение ти- па "дисторшн" ;) Сложно - реализовать БЫСТРОЕ сложение с контролем переполнения! Мы вступим на территорию многих других проблем, если попытаемся реализовать дейс- твительно многоканальные плейеры. Беда тут в том, что если каналов больше четырёх, то можно смело считать число их стремящимся к бесконечности, более того, не обязательно чётным и наверняка не со стандартным рас- положением каналов... Как быть? У меня в рукаве осталось то- лько два метода: а) быстрое преобразование Фурье (ну-ну ;)) б) "затенение" каналов - в группе из M ка- налов звучит каждый раз не более N самых громких... Сделаем? ;)