Архивы: по дате | по разделам | по авторам

kX Project: альтернатива драйверам Creative для звуковых карт Creative SB Audigy и Audigy 2

АрхивЗвук
автор : Андрей Волов   26.11.2003

Тестируем независимый WDM-драйвер от kX Project для всех звуковых карт, основанных на чипах EMU10K1 и EMU10K2.

«Если звезды зажигают, значит, это кому-то нужно...»

Многие владельцы звуковых карт от Creative Labs (Live!, Audigy, Audigy2) сталкивались с ситуацией, когда очень хотелось бы раскинуть стерео звук по всем (четырем, пяти, шести и т.д.) колонкам, где надо поварьировав задержку, чтоб на истинный пространственный звук похоже было. Прибегать к ограниченно своенравному CMSS желания мало, больно уж специфична сия хваленая примочка от «Креатив». Тем временем большая часть накопленного музона в исключительно стерео форматах, и переход гурьбой на многоканальные форматы звука что-то не брезжит на обозримом российском горизонте. Короче, покаместь «не видать Красной Армии». Заветные пять колонок с сабом тем временем уже куплены. Посему тишь да блажь во всех каналах за исключением фронтальных раздражает все сильнее. Что же делать?

Ясно, что из тупого запараллеливания обычного стерео на другие каналы (центральный, тыловые) истинного пространственного звука не получишь. Поэтому «Креатив» и соорудила режим CMSS, но решила не усложнять жизнь пользователям, да и себе заодно, лишив этот режим гибких настроек. Получилось некое подобие идеи готового к употреблению псевдо-эквалайзера, расплодившегося в домашних музыкальных центрах и бумбоксах, ориентированных на людей, не требовательных к звуку. Иметь набор готовых, намертво забитых установок-шаблонов эквалайзера, вместо самого эквалайзера с его настраиваемыми полосовыми фильтрами — так же не удобно, как спать на потолке. Не спасут и 10, и 20 стандартных шаблонов, притянутых за уши каким-нибудь умником-рационализатором. Более того, возможность подправить-подстроить звучок под свой личный вкус, да под свою акустику ну очень греет душу меломану.

Для обладателей активной акустики со встроенным Dolby Surround Pro Logic II декодером (см. http://www.terralab.ru/multimedia/25293/) проблемы превращения любого стерео в многоканальный звук в общем то не существует. Но и тут с настроечками особо не порезвишься, да и цена такой акустики кусается.

Главное, пространственный звук — штуковина дюже нежная и без тонкой настройки каналов под конкретную акустику-усиление в конкретном помещении в принципе не достижим, хоть шестью, хоть восемью супер-пупер колонками обставься.

Другую часть обзавевшихся вышеупомянутыми звуковыми картами — музыкантов не устраивают многочисленные ограничения, налагаемые «родными» WDM (под все последние Windows) драйверами, которые идут в комплекте. Эти ограничения не раскрывают полностью потенциал, заложенный в применяемых «Креативом» аудио-процессорах (DSP).

Как известно, линейки Live! и Audigy имеют на борту аудио процессор «k1», некогда разработанный славной Emu, тогда как семейство Audigy2 может похвастаться усовершенствованным аудио процессором, получившим аббревиатуру «k2». Обрадует ли нас «Креатив» следующей аудио ди-эс-пишкой («k3» ?) — вопрос времени, но вот когда именно это произойдёт — пока неизвестно. Думаю, активная работа в этом направлении ведется. О страшной засекреченности свидетельствует тот факт, что о технических подробностях даже «k2» разузнать ой непросто.

 

Аудио процессор Emu10k1

Основные характеристики (по сведениям разработчика1)

— изготовлен по 0.35-микронной CMOS-технологии;
— содержит 2 439 711 транзисторов;
— программируемый;
— температура от рассеивания тепла в наихудшем случае не превышает 105 С (при окружающей температуре воздуха 70 С);
— реализован 64-канальный синтезатор, цифровой фильтр, генератор огибающей, низкочастотный интерполирующий осциллятор и блок логики маршрутизации/смешивания;
— имеет буферную память 16 Кбайт + 1 Мбайт (itram/xtram);
— 32-битные регистры общего назначения;
— оперирует с целочисленными потоками (16-24 бит) как на входе, так и на выходе;
— имеет арифметическое запоминающее устройство с 67-битным сумматором.

Суть большинства алгоритмов цифровой обработки сигналов, например, FIR-фильтров, состоит в умножении с накоплением суммы. Постоянно контролировать сумматор по поводу переполнения довольно накладно, проще увеличить его разрядность, что и было сделано в «k1». Так называемый эффект-процессор (по сути, некая часть Emu10k1) создает выходной звуковой сигнал, который, пройдя через ЦАП, попадет на колонки или в наушники. Именно эффект-процессор отвечает за создание трехмерного 3D-звука как в играх, так и в режиме CMSS. Инструкции эффект-процессора используют 4 адреса регистров и имеют разрядность 32 бита, чтобы обеспечить точность обработки сигналов, в частности при рекурсивной фильтрации.

EMU10K1 в подсистеме РС-аудио: все источники
звука проходят через «эффект-процессор».

Emu10k1 специально разработан, чтобы получать цифровые данные напрямую, например, с CD-ROM и DVD-устройств. Однако, исторически сложилось, что частота дискретизации аудио-сигналов может быть различной: 8-22.05 кГц (ранний звук на РС, практически вся подзвучка в «виндах»), 44.1 кГц (СD аудио диски, и, как следствие, большинство МP3), 48 кГц (DVD-видео диски, DATA), 96-192 кГц (DVD-audio). Получается, что поступающие с разных источников аудио потоки имеют, упрощенно говоря, свои «локальные» часы с разной точностью хода. Поэтому, чтобы передавать такие потоки, нужно уметь их приводить к одним «мастер» часам. Иначе может возникнуть подобие того, что происходит с воспроизводимым звуком, если замедлить рукой движение магнитофонной ленты или пластинки. В профессиональных аудио-системах через все соединяемые друг с другом цифровые аудио-устройства вместе с аудио-данными передаются и «мастер» часы, но это очень дорогое удовольствие. Более экономичное решение — использовать передискретизацию, чтобы привязать все многообразие входных сигналов к единому выходу. В Emu10k1 заложено выдавать прошедшие через него сигналы с фиксированной частотой дискретизации: 48 кГц. Отсюда и оперирование с данными внутри Emu10k, как бы оцифрованными с 48 кГц (на самом деле передискретизированными в 48 кГц).

Почему именно 48 кГц? Да потому, что когда разрабатывался аудио процессор «k1» (а было это более 10 лет назад), о дискретизации звуковых сигналов с частотой более 48 кГц на мультимедийном компьютере никто и не помышлял.

Аудио DSP Emu10k1 способен поддерживать одновременно 3 стерео-потока, используя высококачественную (как уверяет разработчик) асинхронную передискретизацию.

Чтобы получить аудио-данные с новой частотой дискретизации, необходимо либо вставить в аудио-поток недостающие дискреты-сэмплы (в случае повышения частоты), либо убрать лишние. В любом случае без интерполяции не обойдешься, ведь новые неизвестные сэмплы из воздуха не возьмешь. Простейшая интерполяция — по методу ближайшего соседа, от точки к точке переходят грубыми ступеньками. Математика не требуется, но качество плохое. Более сложная интерполяция — линейная: точки-сэмплы соединяются прямыми линиями друг с другом, что в конце концов дает ломанную линию. Самая качественная — многоточечная интерполяция, когда точки соединяются плавными кривыми линиями, и каждая новая точка получается с учетом нескольких сэмплов. Чем больше сэмплов участвуют в создании новой точки, тем больше требуется вычислений. При этом требуется обеспечить, чтобы шум, превносимый передискретизацией, оказался меньше шума от разброса в младшем разряде входного (обрабатываемого) сигнала. Так, 20-битный входной цифровой сигнал может иметь динамический диапазон около 120 дБ (в идеале). Чтобы получить на выходе сигнал, эквивалентный 20 бит, шум от передискретизации должен составить не выше -120 дБ. Для реализации подобной процедуры требуется уйма вычислительных ресурсов (для преобразования стерео сигнала процессор должен иметь производительность более чем 320 миллионов инструкций в секунду2).

Какова производительность Emu10k1 официально не заявляется (сравнение по MOPS/MIPS в лоб с универсальным CPU типа «Пентиум» по меньшей мере не корректно, см. http://www.computerra.ru/offline/2000/370/5804/). Очевидно, не столь огромна, чтобы разбрасываться ресурсами на передискретизацию. Ведь еще и 3D-обработку потоков в реальном времени надо успевать делать! Поэтому применяется относительная (условная) многоточечная линейная интерполяция. Расплатой за скорость вычислений при такой передискретизации является привнесение искажений в выходной сигнал. Однако, Emu10k1 использует перцептуальную (perceptual, идеология широко применяется при сжатии в МP3, WMA, OGG, AC-3 и т.п.) оптимизацию, обеспечивающую неслышимость привнесенных искажений. В связи с чем даже имеется патент США. Отметьте «на манжетах»: неслышимость человеком огрехов цифровой обработки, реализованной «Креатив», это ключевой момент! За огрехи передискретизации, видимые на графиках-спектрах с высоким разрешением, креативовским звуковым картам все косточки давно перемыли. Только вот устроить экспертное прослушивание мало кто удосужился. Да, кое-кто с «золотыми ушами», да на Hi-Fi акустике способен услышать привносимые передискретизацией искажения. Но основная масса людей их попросту не замечает. Что не удивительно, поскольку маскирующий фон от искажений иной природы в преобладающем количестве бытовых музыкальных записей чудовищно высок по сравнению с искажениями передискретизации, преподносимыми Emu10k1.

 

Аудио процессор Emu10k2

Основные характеристики

— в два раза больше регистров общего назначения;
— в два раза больше регистров для external delay lines;
— в два раза больше выбор посылов (send routings) — per channel;
— в 4 раза больше fxbusses;
— поддержка direct spdif recording;
— несколько подправленный интерполятор.

Всё остальное — абсолютно так же, как и у Emu10k1.

Спрашивается, как же Emu10k2 оперирует с аудио-сигналами 96..192 кГц, если прежде чем их обработать, приходится делать передискретизацию в 48 кГц?! А вот так и работает, то и дело норовя обрезать полезные частотные составляющие выше 24 кГц (см. http://www.terralab.ru/multimedia/25232/)! Правда, какова реальная польза от этих ультразвуковых составляющих — вопрос по-прежнему открытый. Но уж поскольку вовсю пошло DVD-audio с рабочей полосой частот, простирающейся до 48..96 кГц, согласитесь, досадно до рта не доносить то, что уже оплачено и лежит перед носом на тарелочке «с голубой каёмочкой».

Эх, если бы аудио-процессор обрабатывал потоки, «перегнанные» в 192 кГц! Тогда бы не пришлось мудрить с избирательным подходом ко всем потокам с любой частотой дискретизации вплоть до 192 кГц. Правда, из 48 кГц надо будет еще слепить корректные 192 кГц : между старыми сэмплами новые просто так от балды не навтыкаешь.

«Креатив» в своих драйверах упорно игнорирует обход 10k1/10k2, тихой сапой напирая: аудио-процессор, гордо реющий на карте, не просто так молотит все подряд потоки. Как выясняется при подробном рассмотрении, обработка посредством аудио-процессора направлена на улучшение отношения сигнал/шум в слышимой, по классическим понятиям, области частот (аудио-процессор и ЦАП получаются связанными не одной веревочкой). Особенно это касается аудио-карт семейства Audigy2 с их рекламируемым >106 дБА. Замечу, в режиме воспроизведения (а при записи ой как далеко до рубежа в 100 дБ)! Ценность абстрактной величины хитро измеренного отношения сигнал-шум не обсуждается. Короче, хочешь не хочешь, а жуй что дают, и выбора «Креатив» не предлагает. Обидно, понимаешь!

Приведенный пример — всего лишь макушка айсберга. «Креатив» будет по своему прав (лучше меньше, зато без глюков), не перегружая рядового пользователя обилием того, что могут делать её звуковые карты, но продвинутым юзерам от этого радости мало.

 

kX Project (не перевелись еще на земле русской Кулибины)

Цель: «Предоставлять конечным пользователям свободный доступ ко всем аппаратным возможностям kХ-совместимых звуковых плат, пропагандировать развитие дополнительных прикладных программ и поощрять свободный обмен информацией, необходимой для развития программного обеспечения всех кХ-совместимых звуковых карт».

Девиз: «Расширять Потенциал Экспоненциально».

Независимый разработчик весной 2001 года задумал разработать WDM-драйверы, ... , что открыло бы двери к фактически неограниченному программному развитию 10kХ плат (см. www.kxproject.com).

Преимущества:

— открытый проект (документация SDK полностью доступна);
— абсолютно бесплатен (меценатство приветствуется);
— возможна разработка нестандартных микшеров и других приложений;
— квалифицированные пользователи могут писать свои эффекты и плагины;
— малый объем драйвера, что обеспечивает быстрый апгрейд;
— лучшая поддержка ЦОС «ди-эс-пи» (аппаратное ускорение звуковых эффектов);
— оперативная возможность массовой маршрутизации виртуальных сигналов;
— завершенное и гибкое управление аппаратными средствами;
— прямая не интерполированная («бит в бит») запись SPDIF запись с оптических, коаксиальных и других цифровых источников;
— поддержка ASIO для всех kХ-звуковых карт;
— лучшая поддержка MIDI.

Следующие возможности полностью либо частично реализованы в последней (5.10.00.3535) версии драйвера:

— Воспроизведение и запись Wave;
— MIDI-Синтезатор (Synth Engine);
— MIDI UART In/Out (поддержка внешних MIDI-устройств);
— DirectSound 2D;
— DirectSound 3D / EAX;
— Soundfonts;
— Полная поддержка ASIO;
— Поддержка загрузки микрокода для DSP;
— Полный контроль над AC97 кодеком;
— Поддержка декодирования AC3-звука;
— Поддержка GSIF.

Кому это все надо? Прежде всего музыкантам. Потом тем, кому нужна качественная запись с различных источников (с цифровых — бит в бит). Геймерам, жаждущим EAX4, пока нет никакого смысла устанавливать kХ-драйвер. Меломаны, купившие Ау2, потеряют возможность крутить DVD-аудио диски, так как софтовый плеер от «Креатив» понимает только родной драйвер, а WinDVD 5.0 (золотой и платиновой версий) за плагинчик DVD-аудио требует денежку и не малую.

Приведу пример из жизни.Мой давний приятель задумал добавить к фронтальной стерео-паре самопальный активный сабвуфер и озадачил меня вопросом: а есть ли недорогая (<33 у.е.) звуковуха, имеющая настраиваемый по частоте (т.е. с регулируемым цифровым фильтром) отдельный выход. Таковую звуковую карту в продаже найти не удалось. А вот бесплатный драйвер, позволяющий делать вышеобозначенное с 5-канальным Live!, откопал.

 

Инсталляция

Инсталляция kХ-драйвера проходит без проблем. Однако появившийся выбор аудио-устройств может смутить даже опытного пользователя.

Пять аудио-устройств на воспроизведение
и два на запись, не считая миди.

Аудио-устройство, получившее индекс «0/1», полностью повторяет свойства типичного аудио-устройства воспроизведения, которое в многоканальных схемах звука не отдает предпочтения какому либо каналу. Тогда как аудио-устройство «4/5» отправляет звук только на фронтальные каналы. Соответственно, «6/7» подает звук исключительно на тыловые каналы. Ну а «8/9» разбирается в индивидуальном порядке с центральным и сабвуферным каналами. Устройства под индексом «2/3» не существует по объективным причинам.

Аудио-устройство, обозначенное «HQ» (как на воспроизведение, так и на запись), появилось в версии 3535 и предназначено для работы со звуком 24 бит 96 кГц напрямую, т.е. минуя аудио-процессор с его передискретизацией и прочими заморочками.

Поскольку драйвер предоставляет гибкую настройку всего чего можно, то в управлении он не прост, и сначала надо научиться с ним обращаться. Итак, вооружимся схемой входов-выходов, приведенной на сайте разработчиков (в Help к драйверу эта же схема пристуствует).  

Схема входов-выходов звуковых карт
с аудио-процессорами Emu10 k1/k2.

К схеме «входов-выходов» мы еще вернемся. А пока заметим, что маршрутизатор драйвера, обозначенный как kX-Router, способен направлять на входы аудио-процессора звуковые потоки с всевозможных входов.

Микшер драйвера разбит на 3 раздела, оформленные как отдельные панели: «мастер», «входы-выходы», «запись». После микшера «Креатив», в котором все отмеченные функции маячат в одном окне, такое разнесение поначалу сбивает столку. Кстати, текст помощи kХ-драйвера на английском, но всплывающие подсказки на русском, чем следует воспользоваться. В левом верхнем углу микшера будут светить три неизменные иконки. Они соответствуют трем разделам, указанным выше. Группа из трех иконок в виде белых листков, расположенная ниже отправит к загрузке MIDI-фонтов, настройке функций и анализатору. Самая верхняя иконка в форме динамика соответствует разделу микшера «мастер».

Первая настройка (в виде ползунковых регуляторов) — общий уровень громкости. Кликнув на одинокой круглой кнопочке, можно выключить звук. Кликнув на спаренных кругляшках-яйцах, можно расцепить или сцепить ползунки регуляторов левого и правого каналов. Вторая настройка-регулировка — уровень громкости воспроизведения WAV-файлов. Третья — громкости воспроизведения MIDI-файлов.

Панель «мастер».

Далее следует иконка, изображающая динамик под знаком вопроса. Это как раз и есть настройка «звук вокруг». Сначала надо выбрать количество колонок-каналов из списка: 2.1, 4.1 или 5.1. Далее предлагается включить процессорную обработку (On) для получения окружающего звука или задействовать режим дублирования (Copy) фронтальных каналов на тыловые (при этом поканальные настройки исчезнут, останется лишь регулировка выхода на сабвуфер). Первая настройка (VCenterA) позволяет настроить выходную амплитуду (а значит и громкость) центрального канала. Вторая настройка (VRearA) — настроить амплитуду тыла. Третья (VRearW) — ширину тыла, т.е. виртуальное ощущение расширения локализации источников звука. Все перечисленные параметры выражаются в относительных единицах из диапазона от 0 до 1. Четвертая (VRearD) — задержку аудио-сигналов, направляемых на тыловые колонки. Последняя настройка, выражаемая в миллисекнудах, крайне важна для получения пространственного звука. К сожалению, чтобы точно настроить задержку, придется использовать метод тыка.

Галочка «использовать выход на сабвуфер» (Use Subwoofer output) выполняет роль предбанника. В саму баню попадаешь, нажав на следующую галочку: «перенаправление баса» (Bass Redirection). Тут появляется ползунок настройки частоты среза и на сабвуфер, если он подключен к сабвуферному выходу звуковой карты, начинает поступать низкочастотный сигнал, отфильтрованный из смикшированного стерео-сигнала фронта.

«Звук вокруг» и его настройки.

Звучание на пяти колонах с сабвуфером с задействованной пространственной обработкой протрясает! То, что эффекты, записанные с кульбитом по фазе, полностью ушли на тыловые каналы —теперь не удивительно: «долби проложик 2» выполняет примерно тоже самое. А вот раскладка звуков по всей глубине от фронта до тыла однозначно уникальна. Очевидно, секрет кроется в индивидуальной настройке задержки тыла, подкрепленной его же панорамированием. Следует отметить, что тыловые сателлиты во время прослушивания (Creative MegaWorks 510D) размещались в обычной комнате (~12 кв. метров), будучи расставленными очень широко между собой и с малым удалением от фронта с центром, т.е. совсем не идеально для 5 колонок. Что касается активного задействования сабвуфера с перенаправлением баса kХ-драйвером, то и тут настройка частоты среза отразилась самым благодатным образом. Вдобавок, появилась возможность оживить убитые по низким частотам записи.

Начиная с версии 3535 в разделе «мастер» появился плагиновый блок под названием «P16V» (именно так «Креатив» окрестил-засекретил микросхему специального режима 24 бит 96 кГц, функционирующую параллельно молотилке аудио-процессора). Данный блок предоставляет возможность направить поток высококачественного звука на запись по-особенному, например, на «10kХ 0» или на «I2S 0».

Сейчас необходимо рассказать поподробнее про иконку «поменять местами фронт и тыл», расположенную сразу под регуляторами общего уровня громкости. Из приведенной выше схемы видно, что сигнал на тыловые каналы попадает, минуя АС97 кодек. Как результат, такой сигнал меньше искажен и зашумлен. Поэтому владельцам классических стерео пар разумнее использовать сигнал не с выхода на фронт, а с выхода на тыл. Чтобы на сей выход перебросить воспроизводимый сигнал, предназначенный для фронта, в kХ-драйвере и сделана функция, которая, образно говоря, меняет местами фронт с тылом.

Назначение следующей иконки — «вывод наушников через Центр/Сабвуфер» — комментировать, надеюсь, не нужно. Для осчастливленных владельцев звуковых карт с выносным модулем (на котором имеется специальный выход на наушники) сей сервис не актуален.

Оставшиеся иконки предназначены для манипулирования с установками для цифровых потоков, идущих через SPDIF. Новички здесь могут понабивать шишек, но без самостоятельного обучения «чистую цифру» не освоить, посему разжевывать большого смысла нет.

Переходим в раздел микшера «Входы и выходы». Слева направо вверху идут «ползунки» настройки уровня цифровых каналов отдельно для фронта, тыла и саба с центром. Пригодятся, если используется подключение по цифре активной акустики, особенно креативовской стройным SP-DIF входом.

Далее по аналогии с типичным микшером. Например, если некий внешний источник звука подключен к аналоговому входу Line-In (для платиновой ЕХ-карты их три), то, включив соответствующий вход, можно отрегулировать уровень приходящего звука, тем самым обеспечивая воспроизведение с оптимальным соотношением сигнал / шум.  

Панель «входы-выходы».

Раздел микшера «запись». Здесь почти все подобно типичному микшеру, за исключением настроек реверберации и хоруса. Последнее означает, что записывать можно обработанный в реальном времени сигнал.

Панель «записи».

Один из самых важных разделов микшера: DSP. Не пытайтесь сходу въехать, где здесь вход, а где здесь выход! Пути сигнальные неисповедимы! Многочисленные нити, отображаемые на сей панели, не «приклеены» намертво. Их можно перебрасывать куда нужно (используя манипулятор мышь по принципу drag&drop). Здесь же можно выбрать из предложенных (а их немало!) желаемую звуковую фенечку. Желаете запрограммировать самостоятельно? Вам и карты в руки!

DSP-панель: здесь можно подключить
почти что угодно, в частности, индикатор уровня ...


... или какой-нибудь плагинчик покруче.

В качестве примера, сигнал на выходе с «p16v» был запараллелен на введенный в действие пиковый индикатор уровня (№11, см выше). Имеется возможность сигнал запустить и на эквалайзер, однако тогда на выходе с эквалайзера о передаче сигнала бит в бит не может быть и речи даже при положении «ползунков» строго по линеечке.

Панель эквалайзера пока не обросла графическими красотами.

Прилагаемый 10-полосный эквалайзер опирается на мощь аудио-процессора и работает намного лучше примочек для встроенных в материнские платы звуковых карт. Тем не менее, пользоваться эквалайзером надо предельно аккуратно, особенно при записи. В идеале лучше вообще не пользоваться, а обзавестись приличными акустическими системами.

 

Вместо заключения

Очень интересная эмуляция пространственного звука. Даже аппаратная Dolby Prologic 2 по сравнению с грамотно настроенной surround-обработкой звука посредством kХ-драйвера слушается менее убедительно.

Версии 3534 и 3535 в Windows XP работали заметно безглючнее, чем в Windows ME (в 98SE и 2000 лично не тестировал).

Команде талантливых энтузиастов, развивающей kX Project, состязаться с исполином Creative, мягко говоря, не просто. Тем не менее, без сомнения, «Креатив» заполучил достойного соперника в разработке драйверов. Немало юзеров предпочтут установить бесплатный kХ-драйвер. По большому счету большого бизнеса, kX Project вряд ли станет конкурентом Creative Labs: все-таки свое «железо» всегда будет сказываться. Но совершенствующиеся оригинальные kХ-драйверы всяко не дадут протухнуть «Креативу» в отсутствии явных конкурентов на мировом рынке непрофессиональных звуковых карт. Так пожелаем же славной команде соотечественников дальнейших творческих успехов!

А к разговору о технических подробностях и дополнительных возможностях в плане создания музыки kХ-драйверов мы еще вернемся. Тем временем, надеюсь, и новые версии появятся, еще более user-friendly, еще более функциональные...


1. T.C. Savell The EMU10k1 Digital Audio Processor. Joint Emu/Creative Technology Center. 1999 IEEE [вернуться]

2. R.E.Crochiere and L.R.Rabiner. Multirate Digital Signal Processing. Prentice-Hall, Upper Saddle River, N.J. , 1983, pp.127-190. [вернуться]

© ООО "Компьютерра-Онлайн", 1997-2019
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.