3. Почему на Sega Mega Drive так убого звучат семплы? Конечно, я понимаю, что они 8-битные и частота дискретизации маленькая, но, по-моему, на компьютерных звуковых картах (даже очень старых) звук с аналогичными параметрами звучит куда лучше.
Может дело в том, что у Mega Drive нет отдельного ЦАП для семплов и используется встроенный ЦАП YM2612, который для таких целей не предназначен? Чисто теоретически, у YM2612 должен быть нормальный ЦАП, так как сам по себе он звучит достаточно чисто. Если бы у Mega Drive был отдельный ЦАП для семплов, то было бы их звучание качественней?
Из-за убогой реализации этого дела. Буду краток.
Семплы играются Ямахой. На Sega Master System для этого использовали PSG, т.к. другого не было (через попу), но на мегадрайве пользуются почти всегда Ямахой, тоже, в общем-то, через попу, но эта попа по другим причинам.
У Ямахи один ЦАП, 9 бит.
У Ямахи 6 FM каналов + 7-й "канал" - регистр, который используется для вывода семплов. Его и называют DAC. Каналов вывода у Ямахи 6, поэтому регистр DAC делит вывод с 6-м FM-каналом. Есть специальный флаг, который говорит, выводить на ЦАП 6-й канал или DAC. Кстати, регистры FM-каналов 14-битные, но при выводе на ЦАП они урезаются до 9 бит. А регистр DAC 8-битный.
ЦАП один и 9-битный, а каналов 6. Если их суммировать, потеряем почти 3 бита чёткости. Поэтому каналы при выводе не суммируются, а разносятся во времени. Вот в этой теме есть картинка
http://gendev.spritesmind.net/forum/viewtopic.php?f=24&t=386&start=360Частота таких тактов примерно 318 кГц - это на все 6 каналов, а частота "одного канала" - 53 кГц.
Как выводятся "семплы"? Очень просто: что записано в регистре DAC, то и выводится на ЦАП на каждом такте. Если значение во времени не меняется, звука не слышно. Единственный способ проигрывать семплы - записывать нужные значения в этот регистр с нужной частотой.
Ямаха не умеет читать сама семплы из памяти, зато даже дендик это умеет, афаик. Т.е. надо нагружать M68k или Z80, чтобы те отвлекались от своих основных задач и каждые, например, 200 тактов, читали из памяти новый байт и писали в этот регистр.
Если писать слишком часто, семплы будут пропадать чисто по железным причинам. Чтобы такого не было, надо считывать из некого порта бит и проверять его на "свободность" - при этом управляющий процессор по сути ничего полезного не делает. Я тестировал это на разных приставках, и максимальная скорость пуляния семплов без потерь, т.е. с ожиданием, отличалась на разных приставках. Насколько я помню, на одной было около 18 кГц, на другой - аж 38 кГц.
Таким образом, синхронизация почти никакая и сжирает ресурсы процев. А в случае с M68k, он занимает шину Z80, и обращение Z80 к Ямахе приходится остановить на время проигрывания семпла. Это видно, например, в Golden Axe 1 (во время смерти врага) и в Rock'n'Roll Racing (голос Ларри) - при проигрывании семпла музыка пропадает.
Немного про Z80 написано в этой статье
http://emu-russia.net/ru/articles/common/rom-music-rip/Высокий samplerate можно получить только в демках. В настоящих играх используется, как правило, 6-8 кГц. Максимальный, который я видел, был около 11 кГц, кажется, в какой-то из Streets of Rage.
Вот и получается: 8-бит, низкий семпл рейт, плохая синхронизация. Плюс на эмуляторах эта синхронизация может работать в худшую сторону, плюс у приставки звук приглушается на верхних частотах, поэтому артефакты на эмуле сильнее заметны. В итоге звук - говно.
У живого ЦАП есть искажения, но здесь они большой роли не играют.
Кстати, ЦАП "сам по себе достаточно чисто" не звучит. В эмуляторах не заморачиваются и используют 14-битный ЦАП (ну или 16-битный, просто регистры в Ямахе в принципе не больше 14 бит), из-за чего пропадает некая объёмность звука (ещё играют роль искажения ЦАП), а на тихом звуке так вообще разница огромная. Сравни звук на приставке и на эмуляторе.
Если записать с приставки один канал, усилить верхние частоты (выровнять с нижними), то грязь будет.