Лучшие звуковые карты для DOS игр. Выбор, настройка, оптимизация.
#381
Отправлено 31 Май 2017 - 11:34
#383
Отправлено 31 Май 2017 - 12:45
RUS (31 Май 2017 - 11:34) писал:
Это непросто реализовать. Adlib - это не MIDI-устройство, а OPL-синтезатор. А OPL-синтезатор понятия не имеет не только о GM-мэппинге, а и вообще о каких-либо инструментах. Он понимает входящие сигналы в духе "задать первому осциллятору форму пилы, второму - синуса, параметры LFO выставить так-то, играть такую-то ноту длительностью столько-то".
Для того, чтобы играть через него MIDI-файлы, используют специальный драйвер-транслятор, который получает GM MIDI-сообщения, например: проиграть такую-то ноту инструментом "фортепиано". Затем драйвер смотрит в специальную таблицу, где каждому инструменту соответствуют настройки осцилляторов, LFO и тому подобных вещей, которые понимает OPL-синтезатор. Ну и передает команды из таблицы в порт 388h.
С необходимостью трансляции MIDI-сообщений в OPL-сообщения сталкивался любой программист, решавший задачу проигрывания MIDI-файлов на Adlib-совместимых устройствах. Я не пишу "FM-совместимых устройствах", так как более продвинутые FM-синтезаторы, такие как IBM PC Music Feature card (IMFC), имели понятие об инструментах, хотя их мэппинг ничуть не совпадал с General MIDI по причине того, что GM появился намного позже IMFC. Так вот, для проигрывания MIDI на OPL2/3 необходим банк инструментов, каждая запись в котором представляет собой набор реалтайм-инструкций для OPL.
У всех наверное навязли в зубах странные файлы sample.ad или скажем fat.ad, валяющиеся в рабочей директории каждой второй игры.

Так вот, это и есть пресловутые банки OPL2-инструкций для Adlib. A sample.opl/fat.opl - банк инструкций соответственно для OPL3. Так решил задачу John Miles, разработавший звуковую библиотеку Audio Interface Library; что до дефолтного банка, то его создала студия "Fat Man" откуда и названия fat.ad/fat.opl.

Таким же путем пошла и Human Machine Interfaces, разве что сделав отдельный банк для мелодических инструментов, и отдельный для ударных.

Отмечу, что Sound Operating System могла проигрывать мелодические инструменты OPL-синтезатором, а ударные - сэмплами (!), в таком случае вместо drum.bnk в игровой директории находился банк drum32.dig.
Но я увлекся. В общем, задача перехвата потока OPL-команд на 388 порту и трансляции их в MIDI-команды представляется мне нерешаемой. Точно так же несложно превратить MIDI-файл в цифровой звук, используя например SF2-банки инструментов, но невозможно превратить цифровой звук обратно в MIDI, даже имея на руках нужный SF2-банк.
Что же до вопроса "маппинг инструментов FM тот же, что и у GM?" - он не имеет смысла, так как у OPL нет ни инструментов, ни их мэппинга. Можно говорить о мэппинге инструментов в MIDI-файле - это если для хранения OPL-музыки в конкретной игре вообще используется MIDI, а не какой-нибудь трекерообразный файл наподобие CMF.
Обычно в целях экономии сил композитора и места на диске для хранения музыки использовали один набор GM-совместимых MIDI-файлов, но бывали и исключения - например, Blizzard и Bullfrog в каждую игру совали по несколько наборов с разным мэппингом под разные устройства.
Что касается Mortal Kombat - там используется неизвестная мне звуковая подсистема, а Prince of Persia использует написанную самой Broderbund библиотеку, о которой я тоже ничего не знаю. Мне кажется более реальным другой способ послушать музыку из этих игр на GM-синтезаторе - это захватить MIDI-поток в файл, затем преобразовать этот файл из мэппинга MT-32 в GM.
Впрочем, есть и третий способ: хакнуть игровые ресурсы. Начнем с Принца.
Мы видим, что Prince of Persia использует два набора MIDI-файлов: один для MT-32, другой видимо для всего остального. Несколько нехитрых манипуляций - и оба набора MIDI-файлов в наших руках: http://geryon.ru/princemid.zip
Проиграв эти MIDI, тут же понимаем, что я ошибся в своем предположении насчет двух наборов музыки - музыка одна, а набор MIDI-файлов для MT-32 - это как раз звуковые эффекты. В любом случае, MIDI-файлы вытащены, играй - не хочу.
Mortal Kombat. Не знаю, как и подойти к этому чудищу - с ходу непонятно, где тут файлы с музыкой. Может, если будет желание, покопаюсь в этом позже.
#384
Отправлено 31 Май 2017 - 13:58
Не знаю, допустим сделано. Тогда вопрос следующий: то, что играет гусь, отправляется на внешний миди-порт? Но, по результатам разъяснений bristlehog перевод команд OPL в команды MIDI технически невозможен.
bristlehog (Сегодня, 12:45) писал:
Вряд ли результат будет удобоваримым. Ведь LA очень близок к GM. Раз уж на MT-32 паршиво звучит, на GM ожидаемо то же.
Кстати, у GF1, вероятно, маппинг совпадает с GM? На AWE точно совпадает, иначе дочки на EMU8k не смогли бы работать корректно.
#385
Отправлено 31 Май 2017 - 15:04
RUS (31 Май 2017 - 13:58) писал:
Да, это они.
RUS (31 Май 2017 - 13:58) писал:
Я отменяю эти свои слова - когда писал, забыл об имплементациях OPL у GUS и таких поздних карт, как Aureal Vortex 2. Каким-то образом разработчики этих железок дешифруют OPL-команды и преобразуют если и не в MIDI, то во что-то похожее. Каким именно образом - даже представить не могу.
RUS (31 Май 2017 - 13:58) писал:
Я бы не спешил с выводами, ведь у MT-32 один банк, а для GM их сотни. Не первый, так десятый или пятидесятый банк будет звучать приемлемо или даже замечательно.
RUS (31 Май 2017 - 13:58) писал:
Опять не имеющий смысла вопрос, видимо вызванный к жизни незнанием принципиальных отличий в архитектуре разных звуковых карт. Хотя на каком-то уровне можно сказать, что у GUS-карт мэппинг совпадает с GM, но на деле всё сложнее.
Можно разбить звуковые карты, использующие сэмплы для проигрывания музыки, на три категории:
1. синтезатор-на-ISA-карте
Было такое решение - взять хорошо зарекомендовавший себя MIDI-синтезатор и сделать из него ISA-карту. Эту группу можно разбить на две подгруппы:
1.1. синтезатор, управляемый MIDI-командами через MPU-401
Это например Roland LAPC-I (с известными оговорками), Roland SCC-1, Yamaha SW60XG и многочисленные дочерние карты. Эти карты могут иметь как GM-совместимые (SCC-1), так и GM-несовместимые ROM-банки (LAPC-I).
1.2. синтезатор, управляемый иначе, то есть не MIDI-командами
Тут нужно пояснить, что оригинальные синтезаторы как раз управлялись MIDI-командами (чем же им еще управляться), но разработчики ISA-карт поступили иначе, и взаимодействие с синтезатором на карте происходило путем записи не имеющих отношения к MIDI команд в порты.
Это Turtle Beach Multisound Classic (синтезатор E-Mu Proteus 1/XR), семейство Sound Blaster AWE32/64 (синтезатор E-Mu 8000), семейство карт на базе синтезатора Sierra Semiconductor ARIA (например, Prometheus ARIA16 и Diamond Sonic Pro). И эти карты тоже могли иметь как GM-совместимые ROM-банки (SB AWE32), так и GM-несовместимые (TB Multisound), а в отношении ARIA я даже не знаю, является ли его ROM-банк GM-совместимым или нет, так как без загрузки файла с мэппингом карты на его базе не работают.
Чтобы проигрывать на GM-несовместимых синтезаторах MIDI файлы с GM-мэппингом, использовались разные сложные и не очень трюки. Хорошо, если синтезатор позволял свободно менять мэппинг, как ARIA - загрузил себе GM-мэппинг, и радуйся. А вот E-Mu Proteus не позволял сменить мэппинг, поэтому использовался обходной путь на уровне промежуточного драйвера: приходит в такой драйвер MIDI-сообщение, и он на лету подменяет номер инструмента согласно имеющейся таблице соответствия мэппинга Proteus мэппингу GM, а затем уже отправляет команду Proteus на проигрывание. Малоизвестный факт: именно после визита в Turtle Beach Systems и ознакомления с исходным кодом этого драйвера А.С. Пушкин и сочинил известные строки:
Едет с грамотой гонец,
И приехал наконец.
А ткачиха с поварихой,
С сватьей бабой Бабарихой,
Обобрать его велят;
Допьяна гонца поят
И в суму его пустую
Суют грамоту другую.
Я полагаю, что другого выхода у Turtle Beach и не было: несмотря на высочайшее по тем временам качество Proteus, писать MIDI-файлы под него решительно никто не хотел, в то время как под General MIDI треки писались тысячами. Поэтому и напрограммировали такой ремэппинговый костыль, чтобы продлить жизнь появившейся до введения стандарта GM карте.
Ну а для AWE32 есть программа Aweutil, которая слушает 330-й порт, перехватывает MIDI-сообщения и преобразовывает их в понятные AWE32 команды. В защищенном режиме она не работает, поэтому применимость ее ограничена.
2. сэмплер-на-ISA-карте
Эти карты не имели никакого ROM-банка, но зато имели память, куда можно было загружать сэмплы. В первую очередь это вышедшие в 1992 году друг за другом карты Omni Labs Audio Master (384 кб памяти для сэмплов) и Gravis UltraSound (512 кб). MIDI-команды эти карты не понимали, и схема работы была такая - сперва загрузить в память карты нужные сэмплы, затем их проигрывать, отдавая карте команды, не имеющие насколько я знаю отношения к MIDI.
Для Gravis UltraSound есть также программа UltraMid, которая грузит в память карты файлы сэмплов в соответствии с GM-мэппингом, а затем остается резидентной и слушает 330-й порт, перехватывая MIDI-сообщения и преобразовывая их в понятные для GUS команды. Опять же в защищенном режиме она не работает.
Есть и карты, которые комбинируют в себе типы 1.2 и 2 - это например GUS PnP, да и AWE32, строго говоря, тоже комбинированного типа, и несколько игр даже действительно используют AWE32 как сэмплер - например, Dungeon Keeper и Eradicator.
Чтобы весь этот жуткий зоопарк работал в играх, производители сотрудничали как напрямую с игровыми девелоперами, так и с авторами промежуточных звуковых библиотек. Последнее было наиболее удобно - разработчику игры было достаточно отправить промежуточному драйверу команду "проиграть вот этот миди-файл", а дальнейшее было уже не его заботой (хотя и с некоторыми оговорками).
Все вышеперечисленные карты поддерживались библиотекой Audio Interface Library, в чем можно убедиться, взглянув на часть списка приложенных к ней драйверов:
MPU-несовместимые:
ariaxmid.adv - для карт на базе Sierra Semiconductor ARIA
gf1midi.adv - для Gravis UltraSound
mmsynth.adv - для Omni Labs Audio Master
multisnd.adv - для Turtle Beach Multisound Classic
sbawe32.adv - для Sound Blaster AWE32
MPU-совместимые:
mt32mpu.adv - для LAPC-I
sc32mpu.adv - для Roland SCC-1
wave.adv - для Creative Wave Blaster
genmidi.adv - для прочих совместимых с GM карт, управляемых по MPU-401
Из всего этого несовместимого с MPU-401 многообразия, зародившегося в 91-92 годах, до середины 90-х дожили только AWE32 и GUS (OPL-карты я сейчас не рассматриваю). Остальные по разным причинам канули в Лету, и в системе Miles Sound System, ставшей наследницей Audio Interface Library в конце 1994 года, уже не поддерживались.
Расклад у MSS таков:
MPU-несовместимые:
iwave.mdi - для семейства Gravis UltraSound PnP
sbawe32.mdi - для SB 32/AWE32/AWE64
ultra.mdi - для семейства Gravis UltraSound
MPU-совместимые:
mdimaxi.mdi - для семейства Guillemot MaxiSound 64
nvmpu.mdi - для NVidia NV1
sndscape.mdi - для семейства Ensoniq SoundScape
mpu401.mdi - для прочих совместимых с GM карт, управляемых по MPU-401
Теперь наверное понятно, что, строго говоря, у карт на базе GF1 нет и не может быть никакого мэппинга, поскольку нет ROM. Но с другой стороны примем во внимание, что с 1992 года как раз и начинается расцвет GM в игростроении, поэтому GUS использовалась по большей части как GM-совместимый синтезатор - хотя это и выглядит кощунством с точки зрения возможностей GF1. То есть промежуточный драйвер грузил в GF1 GM-совместимый набор сэмплов, затем транслировал MIDI-сообщения в управляющие команды для GF1. Подавляющее большинство игр не имело отдельного набора MIDI-файлов для Ultrasound; редкие отдельные экземпляры имели - например Fade To Black содержит отдельный набор MIDI-файлов и патчей для GUS.
Премии за самый длинный пост дают? =)
P.S. Я прицепился к форме вопроса "Кстати, у GF1, вероятно, маппинг совпадает с GM?", и не задумался о цели этого вопроса. Если ты спрашиваешь, чтобы прикинуть возможность где-то перехватить поток команд, отправляемых эмулятором OPL для GUS, и перенаправить на MPU-401 совместимый синтезатор - то я на 99.9% уверен, что это невозможно, так как GUS управляется не MIDI-командами, а значит, даже перехватив поток, мы получим не MIDI-сообщения, а специфические команды для сэмплера Ensoniq, установленного на GUS.
Поэтому в развернутом виде я бы ответил так:
- Совместимы ли MIDI файлы, предназначенные для проигрывания на GUS, с General MIDI?
- Как правило да.
- Можно ли этим воспользоваться, чтобы с помощью GUS превратить поток OPL-команд в поток MIDI-команд для синтезатора, управляемого по MPU-401?
- Нет.
#386
Отправлено 01 Июнь 2017 - 09:59
#387
Отправлено 02 Июнь 2017 - 10:55
RUS (01 Июнь 2017 - 09:59) писал:
Да.
#388
Отправлено 01 Август 2022 - 05:22