
    Sound System, 1.6.1998
    Dmitry Vassiliev, Russia, Togliatti, (8482) 41-62-91.
    SlyDiman@mail.ru
    SlyDiman@usa.net
    
********************************************************************************

    Объявляется благодарность:
    Антону Меркушеву, который нарисовал крутой (как ему кажется) новый
    интерфейс в 3D Studio.
    Олегу Корелину, который постоянно выдавал дикие идеи и каждый день
    заставлял писать эту программку, добавлять что-нибудь новое.

********************************************************************************

    Просто Fix 30 июля 1999 г.
    Bug Fix 13 марта 1999 г. (кое-что не работало на шине >= 83Mhz)

********************************************************************************

    Сие произведение, являясь продолжением незаконченной первой версии тем
    более не закончено и в нем еще больше багов, чем в первой версии. 

    Автор не несет никакой ответственности за последствия использования
    этой программы, будь то головная боль или потеря FAT'а диска C.
    
 Итак, что это такое:

    Player, recorder, converter, speaker, CD grabber с возможностью
    воспроизведения, FM тюнер, эквалайзер, scope и анализатор спектра
    собранные в одном музыкальном центре.

 Особенно стоит отметить:
    - программный realtime эквалайзер (не нужно сравнивать с WinAMP,
      так как там эквалайзер работает только при распаковке MP3 файлов,
      сдесь же он работает с MP3, WAV, MOD, а при наличии 2 звуковых карт
      или GUS можно обрабатывать реальный звук в реальном времени);
    - возможность работы одновременно с двумя звуковыми платами
      (одна на вход, другая на выход), поддержка full duplex на GUS MAX;
    - поддержка FM тюнера (в MS-DOS больше нет нигде);
    - проигрывание MP2, MP3, в том числе с WAVE заголовком (часто встречается
      на CD и в MS-DOS не проигрывается ничем);
    - чтение аудио CD в цифровом виде с возможностью записи в WAV файл
      (параллельного воспроизведения да еще и с эквалайзером нет нигде);
    - проговаривание текстовых файлов на русском с возможностью записи в WAV.

 Требования:
    - 386+;
    - для проигрывания MP3 с качеством 100% (без ключей /2 или /4) нужен
      примерно Pentium 90MHz;
    - для realtime эквалайзера при проигрывании WAVE файла в режиме 16 бит,
      стерео, 44 кГц (на SB16) нужен примерно Pentium 100MHz;
    - для проигрывания MP3 на SB16 с realtime эквалайзером нужен примерно
      Pentium 166MHz;
    - VESA-совместимый SVGA видеоадаптер с 1Mb видеопамяти
    - мышь;
    - примерно 2Мб свободного ОЗУ.

    Программа написана под DOS4GW, поэтому она работает в MS-DOS, Windows'95,
    OS/2 и везде где запускается DOS4GW. Но не стоит всем этим злоупотреблять,
    писалась эта программа в первую очередь для MS-DOS, там ее и надо
    пользовать.

 Поддерживаются:
    - совместимая с SoundBlaster звуковая плата (от v1.x до SB 16);
    - звуковые платы на базе чипов ESS (Edison Gold 16);
    - Gravis UltraSound и Gravis UltraSound MAX;
    - для страдающих отсутствием звуковой платы - PC Speaker;
    - FM тюнер, встроенный в SB16 (возможно будут работать и другие модели).

    Полностью все возможности проявляются только на Sound Blaster 16.

 Пакет:
    DOS4GW.EXE
    SND_SYS.EXE
    SND_SYS.DAT
    SND_SYS.TXT
    При первом запуске после настройки создается файл SND_SYS.CFG

 Запуск:
    SND_SYS.EXE [options] [<filename>]

 Параметры командной строки:
         /? - this help
         /S - run setup (autorun if file SND_SYS.CFG not found)
         /P - pause after load data until press any key
         /L - loop playback <filename>
         /D - DOS shell while playback <filename>

         /2 - dawnsample MP3 files 1:2 (for slow machine)
         /4 - dawnsample MP3 files 1:4 (for very slow machine)

    При первом запуске или если указан ключик /S в SVGA режиме вываливается 
 табличка, где можно все установить. При обычном запуске все параметры для 
 звуковых плат берутся из CFG файла и кроме GUS ничего не проверяется. 
 Поэтому все настройки, относящиеся к звуковым платам должны быть 
 ПРАВИЛЬНЫМИ!
    При изменении номера порта звуковой платы происходит autodetect по 
 этому порту. Буква CD-ROM'а используется только при 2-х и более CD-ROM'ах. 
 Первый байт в CFG файле (0 или 1) определяет качество вывода на PC Speaker 
 (тихо и качественно или громко и некачественно). Если кому надо, исправляйте 
 этот байтик руками. Вообще поддержка PC Speaker'а сделана для прикола, 
 поэтому качество и даже вообще его работа НЕ ГАРАНТИРУЕТСЯ. 
    
    Если в командной строке указано имя файла, то из SND_SYS.CFG берется
 необходимая информация и этот файл проигрывается один раз без включения
 SVGA режима (прерывается по Esc). Во время проигрывания в текстовом режиме
 выводится всякая полезная информация.
    С ключиком /D можно вывалиться в DOS SHELL, если только звук выводится
 не на PC Speaker, файл полностью поместился в память и этот файл не MP3
 (или WAVE с упаковкой MP3) и не текстовый.


 Поддерживаемые форматы файлов:

    - Практически любые файлы типа WAVE (в том числе и неизвестных форматов) 
 частоты 4..48kHz, моно или стерео, 8 и 16 бит или сжатые (можно настраивать
 руками).
    - Чистые MP3, MP2 (MPEG Layer 1,2,3) и WAVE файлы с упаковкой MP3.
    Все параметры автоматически определяются для следующих файлов: WAV, MP3,
 MP2, VOC, AUD, AIF, SAD, SND, PAT, AU. Существует множество разновидностей 
 (отличие в формате заголовка) VOC файлов. Поддерживаются 3 известных мне. 
 В файлах PAT может находиться несколько инструментов (точнее один инструмент, 
 а в нем куча WAV'ов). Для таких файлов установки берутся из заголовка 
 первого инструмента (WAV'а). Полностью поддерживаются пока только алгоритмы 
 сжатия A-Law и u-Law (или m-Law), криво поддерживаются сжатые VOC.
    - MOD файлы 4, 6 и 8 каналов (старые 15-инструментные, ProTracker, 
 StarTracker, FastTracker). Также понимаются файлы NST. Теоретически могут 
 играться MOD файлы 1..16-канальные, практически же играются только
 перечисленные выше. Если мне попадется MOD не 4-, 6- или 8-канальный и
 в нем будет все как я думаю, сей недостаток будет исправлен. Для старых
 15-инструментных MOD файлов нет конкретного идентификатора, поэтому
 какой-нибудь текстовый файл переименованный в MOD может все повесить. Есть
 конечно проверки типа по таким-то адресам байтики должны принимать значения
 в таких-то пределах, но это неэффективно ! При загрузке MOD файла некоторые
 глюки в данных могут игнорироваться. Теоретически файл попорчен, но другие
 player'ы его играют...
    Проговариваются текстовые файлы для DOS пока только на русском (все 
 устанавливается автоматически по расширению TXT), правильно проговариваются 
 целые числа. Не шибко шикарно, но ... ну лень мне с этим возиться!
    Текстовые и MOD файлы полностью загружаются в память. Если памяти не
 хватает, sorry. Если памяти не хватает для WAV или MP3 файла, он подгружается 
 по частям с диска (кэш 256K). В этом случае он не будет воспроизводиться в
 DOS Shell. Распаковка файлов MP3 дополнительно кэшируется (512k) примерно 
 на 3 секунды вперед. Это необходимо, так как распаковка не весит на 
 прерывании звуковой платы, а вызывается из основного цикла программы, где 
 могут быть большие задержки из-за опроса CD-ROM и т. д. По этой же причине 
 MP3 не играются в DOS SHELL. Также в DOS SHELL не работает зацикливание 
 группы файлов при проигрывании и проговаривание текстовых файлов.
    Определяются, загружаются, но пока не играются (!) MID файлы с
 использованием инструментов (PAT) от GravisUltrasound (наверное уже никогда
 не будут инраться).


 Про интерфейс: 

    Правая кнопка мыши устанавливает крайние нижнее и верхнее положение 
 экрана. Два раза Esc - выход. При выходе в CFG записываются состояния кнопок 
 CD Power и Tuner Power, а также выбранная станция на FM тюнере. При загрузке 
 все восстанавливается.

 По порядку сверху вниз, как это выглядит на экране:

    Spectrum / scope analyzer пояснений не требует. Имеется всего две 
 кнопки: Power (вкл./выкл.) и Mode (переключает spectrum/scope). Обычно
 это висит на таймере и обновляется каждые 18.2 с. На SoundBlaster 1.x и 
 PC Speaker'е analyzer вызывается в основном цикле и может наблюдаться 
 торможение, особенно при проигрывании CD digital и MP3.

    Input selector / equalizer / mixer - самая главная часть системы.
 Кнопка Power в этом блоке - выход из программы. Левые десять движков 
 относятся к эквалайзеру, который включается верхней кнопкой с красным
 индикатором. Когда эквалайзер активен, индикатор светится. Кнопочка
 ниже устанавливает все движки эквалайзера в среднее положение. Рстальные
 кнопочки не работают. Эквалайзер может быть активен при воспроизведении
 файлов или CD трека (при чтении его в цифровом виде) и при двух звуковых
 платах, когда звук оцифровывается на одной, и выводится на другой плате. 
    В правой части - mixer. Регулятор SPK (PC Speaker) работает ьолько на 
 SB16. Регуляторы Line In и MIDI двухполосные (если зацепить в центре, 
 двигаются движки обоих каналов). Совсем справа общий регулятор громкости и 
 общий баланс. Уровень входного сигнала регулируется только на SB16. 
    Кнопки внизу позволяют выбрать источник. File - воспроизведение файла,  
 CD digital - воспроизведение CD трека с чтением в цифровом виде, остальные 
 кнопки включают оцифровку звука с соответствующих входов и отображение на 
 spectrum analyzer. При двух звуковых платах выходной сигнал будет 
 задерживаться относительно входного на 0.1 - 2 сек (это зависит от частоты, 
 режимов стерео/моно и 8/16 бит). Используя микрофон можно получить весьма 
 разнообразное эхо. На SB16 все входные сигналы микшируются, так что между 
 этими кнопками разница только в частоте и некоторых других параметрах 
 оцифровки. На ходу (желательно это делять заранее, а не на ходу) можно 
 менять параметры звуковой платы для оцифровки или воспроизведения: частоту, 
 стерео/моно, 8/16 бит.

    File selector - позволяет выбрать файл или группу файлов для 
 проигрывания. Текущий файл отмечается знаком "<". Отмечать можно средней
 кнопкой мыши или "пробелом" и Insert'ом. Выделить все/ничего - кнопки +/-.
 По файлам можно перемещаться стрелками, работают кнопки Home, End. 
 Enter - воспроизведение/остановка. Если в окошке над каталогами установить
 Target, то можно выбрать или ввести в окошке над файлами имя файла для
 записи/конвертирования. Пока записываются только WAV файлы. Воизбежание
 путаницы лучше указывать расширение WAV. Запись/конвертирование включаются
 кнопкой Record в ЛЮБОЕ время! При конвертировании с CD трека в цифровом виде 
 чтение начинается с начала текущего трека. Параметры воспроизведения/записи
 выбираются автоматически, но можно покрутить руками самому. Справа
 регулируется громкость Wave.

    FM tuner. ... Справа кнопки выбора 5 настроенных станций. Название 
 станции можно изменить, ткнув в него мышкой. Регулятор громкости 
 запараллелен с регулятором Line In.

    CD player работает как обычно, если в input selector не выбрано 
 CD digital. Если выбрано, CD считывается в цифровом виде и воспроизводится
 как WAVE файл. В этом случае регулятор громкости запараллелен с регулятором 
 Wave.


    Если воспроизведение файла прекращается на середине и под анализатором
 спектра появляется сообщение "Time out ...", значит процессор не успевает
 обрабатывать данные. Можно попробывать отключить эквалайзер, отключить
 анализатор, отключить CD player (постоянно с периодичностью 2 сек. 
 опрашивает состояние CD-ROM), наконец уменьшить частоту вывода на звуковую 
 плату, переключить на моно и на SB16 и GUS можно уменшить разрядность (8 бит 
 вместо 16). Если это случается при воспроизведении аудио CD при чтении в 
 цифровом виде (CD digital) скорее всего не успевает CD-ROM, sorry...


 Про железо и всякие "особенности":

                     В ЛЮБОЙ ПРОГРАММЕ ЕСТЬ ОШИБКИ!

     Программа эта взаимодействует почти со всеми системами компьютера, 
 через соответствующие драйвера. Я постарался сделать взаимодействие со 
 всеми драйверами стандартно, исключить глюки, приводящие к всеобщему краху, 
 перепроверить и отследить все кривые данные и т.д. Так что возможные 
 зависания будут на 90% по причине кривости каких-либо драйверов или базовых 
 библиотек WATCOM C++. Часто встречается кривой видео BIOS (например на 
 S3Trio64V+ или Cirrus Logic, как правило помогает драйвер UniVBE (SDD) или 
 типа того), свести с ума MSCDEX абсолютно корректными командами вообще 
 ничего не стоит (этот сборник вирусов и ошибок Microsoft совсем ничем не 
 лечится), иногда подвисают WATCOM'овские функции на файлах с меткой VOL и 
 т.д. 

    При выборе логического диска на компьютере с одним дисководом есть одна
 особенность. DOS эмулирует диск B и включает его в список доступных драйвов.
 Поэтому при переходе на диск B где-то там пишется строка типа "вставте диск B
 и нажмите any кнопочку" и DOS ждет пока не нажмут эту самую кнопочку. Можно
 конечно поподробнее посмотреть имеющиеся диски, но мне лень этим заниматься.

 Мышь: 

    Если не устраивает скорость мыши или изображение двигается рывками, 
 подберите параметры для вашего драйвера мыши. Многие драйвера почему-то 
 вообще не хотят выполнять функции установки скорости движения курсора и 
 порога удвоеной скорости, поэтому я не стал с этим возиться. Некоторые
 драйверы мыши принимают SVGA режим за текстовый и выдают дурацкие координаты
 (например по X: 0, 8, 16..). В этом случае могут быть сложности с попаданием
 курсором в нужную точку. На тормозных компьютерах или не на тормозных с 
 включенным эквалайзером и при проигрвании MP3 может притормаживать реакция 
 на нажатие кнопки мыши. Координата нажатия и отпускания запоминается, так 
 что держать кнопку мыши нажатой до срабатывания не нужно.

 Sound Blaster: 
    
    На SB версии меньше 2.0 не поддерживается autoinitialized DMA. Анализатор
 в этом случае не вешается на таймер, а вызывается в основном цикле где 
 много всяких задержек. Поэтому может наблюдаться торможение анализатора.
 Hardware миксера на SB до версии 2.x включительно нет, так что громкость
 можно лишь частично регулировать эквалайзером.
    Параметры воспроизведения и записи: до 22/44kHz, моно, 8 бит.

 Sound Blaster 16: 
    
    Во всяких AWE 32/64 на уровне цифрового звука ничего лучше не придумали, 
 поэтому какие-либо особые примочки к ним не поддерживается. На не Plug & Play
 BIOS'ах SND_SYS автоматически конфигурирует SB 16, так что в DOS'е ничего
 грузить ненужно.
    Параметры воспроизведения и записи: до 44kHz, стерео/моно, 8/16 бит.

 ESS и Sound Blaster PRO:
    
    Могут быть проблемы с определением IRQ и DMA на звуковых картах 
 ESS Plug & Play (неправильно определяется DMA или звуковая плата не 
 определяется совсем, т.к. не вызывает установленное по умолчаннию 
 прерывание). На ESS можно перепрограммировать IRQ и DMA, если запустить 
 SND_SYS с ключиком /S и просто менять нужные параметры (тип платы должен 
 быть ESS AudioDrive). Не всегда и не все варианты IRQ и DMA допустимы. 
 ESS очень капризные платы. После CUBIC PLAYER v1.7 почему-то не работает 
 миксер на Edison Gold 16 (причем ни в одной программе; что уж он там пихает 
 в порты я не знаю). На некоторых платах ESS левый и правый каналы меняются 
 местами.
    Параметры воспроизведения и записи: до 44kHz моно / 22kHz стерео, 8 бит.

 Gravis UltraSound:

    Все параметры кроме базового порта берутся из переменной окружения DOS
 ULTRASND (ее формат: PORT, DMA_ADC, DMA_DRAM, IRQ_GF1, IRQ_MIDI). Проверьте
 свой AUTOEXEC.BAT! При воспроизведении данные предварительно пересылаются
 в память GUS в качестве иснтрумента. При этом приходится ждать окончания
 передачи воизбежание глюков (хотя в документации по GUS сказано, что можно
 и не ждать). Это очень сильно снижает производительность. В документации к
 одной программе по этому поводу написано "... is shit slow". При
 воспроизведении в режиме стерео данные для левого и правого каналов
 необходимо передовать отдельно как разные инструменты. Так как мне лень
 было с этим возиться и к тому же это вызвало бы дополнительное снижение
 производительности, воспроизведение реализовано только в режиме моно.
 Не работает пауза. Не поддерживается две платы GUS одновременно.
    Параметры воспроизведения: до 44kHz моно, 8/16 бит.
    Параметры записи:          до 44kHz моно/стерео, 8 бит.
 
 Gravis UltraSound MAX:
    
    Параметры для GUS MAX берутся из переменных окружения DOS
 ULTRASND и ULTRA16 (их формат соответственно: PORT_GUS, DMA_PLAY, DMA_REC,
 IRQ, ... и PORT_MAX, ...). Проверьте свой AUTOEXEC.BAT! Не работает пауза.
 Поддерживается одновременное воспроизведение и запись на одной плате
 (FULL DUPLEX). Чтобы входной сигнал не смешивался с преобразованным выходным,
 нужно грамкость входного сигнала убирать на минимум. Оцифровка происходит
 со средней громкостью. Пока GUS MAX не работает как source sound card в
 паре с Sound Blaster или PC Speaker. Почему-то пока GUS MAX не хочет
 оцифровывать в режиме 16 бит. Не поддерживается две платы GUS MAX одновременно.
    Параметры воспроизведения: до 48kHz моно/стерео, 8/16 бит.
    Параметры записи:          до 48kHz моно/стерео, 8 бит.

 PC speaker:

    При выводе звука на PC Speaker эмулируется только таймер (значение 4-х
 байт по адресу 0x046C инкрементируется с частотой 18.2 Гц), поэтому
 DOS'овские часы в это время стоят. Качество и вообще работа PC Speaker'а
 не гарантируется. Код на С++, а не на ассемблере, в защищенном режиме пока
 дело дойдет до обработчика INT 8 пройдет куча времени, все по 10 раз
 заэмулируется и т.д. Так что воспринимать использование PC Speaker'а
 серьезно не стоит. В setup'е частоту PC Speaker'а особо завышать не нужно,
 по вышеупомянутым причинам просто не хватит времени на обработку прерывания
 и все повиснет. Не работает пауза.

 CD-ROM:

    Все взаимодействие с CD-ROM происходит через MSCDEX. Для чтения аудио
 CD необходимо, чтобы CD-ROM поддерживал чтение в RAW mode, т.е. чтение полных
 секторов размером 2352 байта. Некоторые CD-ROM'ы "говорят", что вроде бы
 могут это делать, но на самом деле читают не все 2352 байта, а сколько умеют,
 а остальное забивают нулями. CD grab не работает со Smartdrv - появляется
 треск (нужно ставить ключик не кэшировать CD-ROM). Бывает что под DOS чтение
 в RAW mode поддерживается, а под Win'95 нет (глюки в драйверах), поэтому
 SND_SYS будет пытаться читать CD независимо от выдаваемой ему информации о
 CD-ROM'е (из под Windows'95 обычно всетаки не получается). Чтение с CD
 кэшируется (128k). Идеально работает с 20X Samsung на любых дисках!
    Если при чтении блока в 27 секторов например на 2-ом секторе прилипла
 пылинка, остальные 25 секторов не читаются и в этом месте получается заикание
 (обычно пишется CD-ROM: Sector not found). Автоматическая остановка на этот
 случай отключена. Громкость CD (громкость наушников) при запуске
 устанавливается на максимум. Могут быть конфликты с CD player'ом под Win'95
 (нажимаешь stop, а Wind'осовский CD player включает воспроизведение снова). 

  Video:

    Если ничего не пишет при запуске и сразу же повисает, виноват 
 Video BIOS. Все видео глюки устраняет драйвер UniVBE (SDD).
 На S3Trio64V+ с UniVBE 5.2 проявляется глюк - нельзя запрашивать информацию
 о текущем видеорежиме - повисает. Вообще S3Trio64V+ очень кривая карта, в
 различных версиях BIOS разный набор ошибок. Наиболее часто встречается
 неправильное определение текущего банка видеопамяти (этот недостаток на
 SND_SYS уже не влияет). На Cirrus Logic обычно очень извращенный BIOS
 (банк видеопамяти почему-то не устанавливается вообще) - лечится UniVBE.
 На ET6000 банк видеопамяти для записи и чтения устанавливается отдельно.
 Кажется я это поправил, но еще не проверял. Желательно также в BIOS
 установить PCI/VGA Palette Snoop: Disable.

 OS:
    В Windows'95 не OSR2 имеется превосходный набор ошибок (гораздо больше,
 чем в OSR2). Например, там вообще не работает запись, так как Windows
 неправильно эмулирует буфер для передачи данных через DMA. Если при запуске
 под Win'95 играл какой-нибудь WAV файл, все накроется (Win'95 не даст доступа
 к звуковой плате и прекратит процесс). При переключении под Windows'95 в
 другое приложение и обратно возможны глюки или вообще закрытие программы.

    Под OS/2 глюки с путями. Если путь к SND_SYS.EXE больше 21 символа, то
 почему-то подставляется первый путь из PATH и SND_SYS не может найти свои
 файлики (и наверное запишет новый CFG файл в другом месте).

    Под MS-DOS лучше запускать без EMM386 или QEMM.

********************************************************************************

    Программа написана на WATCOM C++32 v10.0. Использовались только стандартные
    библиотеки. Все исходники кроме фрагмента распаковки MP3 полностью МОИ.

    В отладке: аппаратный выбор входов и выходов на SB16 (есть некоторые
    приимущества перед SB PRO, особенно важно при работе с двумя звуковыми
    платами).
          
    В процессе дописания:
    Кнопочки Swap channel, surround, фильтры всякие и т.д. и т.п. в реальном 
    времени. Особенно полезная штука, когда есть две звуковые платы.

    В процессе дописания, переходящем в ближайшее будущее:
    Проигрывание MID на SoundBlaster с качеством GravisUltrasound (используя
    его инструменты и эффекты *.PAT).
    Распаковка сжатых VOC файлов.
    Поддержка сжатия GSM и всяких ADPCM (когда будет путное описание).

    Обязательно в будущем:
    Распознавание речи.

********************************************************************************

    Скорее всего следующая версия будет:
    во-первых под Win32, т.е. под Windows'95 и Windows NT;
    во-вторых уметь играть MOD, S3M, XM, IT, а также все хитро запакованные
    файлы типа WAV, все типы MP3;
    в-третьих иметь навороченный эквалайзер, тембры, эхо, ревербирацию и т.д.
    ...и наконец начнется писаться распознаваловка речи с проверкой орфографии
    стандартными Windows'овскими средствами.

    Все это возможно потому, что... УЖЕ ЕСТЬ исходники на C++ звуковых
    драйверов под Win32, исходники loader'ов для MOD, S3M, XM, IT,
    исходники эквалайзера, тембра, ревербирации, эха... В качестве эксперимента
    уже опробован новый анализатор спектра, и, кажется, совсем не плохо.
    
********************************************************************************

    Все это бред. Скорее всего следующей версии не будет никогда,
    Но обязательно будет распознавание речи под Win32!

