Inferno #10
30 апреля 2007

Возможности Спектрума - Способы воспроизведения многоканальной музыки на бипере.

                           О бипере

Тут я немного постараюсь обобщить всё то, что мы знаем о
Спектруме в качестве звукового комбайна. Возможно, здесь я
чего-то упущу (я почти ничего не знаю о приставках aka Covox, GS
и т.д.), однако они стоят далеко не у каждого пользователя,
потому отсутствие их обзора с этой точки зрения является
целесообразным. Впрочем, кто захочет, тот добавит.

"1". Оцифровка. 
"2". Проигрывание. 

"H" - возврат в этот текст. 
"B" - начало текста. 
"E" - конец текста. 
"F" - поиск. 
"N" - искать дальше. 
 

  Несмотря  на свою техническую простоту,
бипер  может  давать  весьма  интересное и
разнообразное звучание.
   Существует  как минимум 5 принципиально
различных  способов  играть многоканальную
 музыку на бипере:
  1. Сложение  каналов и вывод бита по по─
 рогу. Пример - Robin of the Wood. 
  2. Чередование  каналов  внутри  периода
дискретизации  (>16 кГц). Используется,  в 
частности,в Savage и в редакторе Wham! The 
 Music Box. 
  3. Генерация узких импульсов по перепол─
нению счётчиков-таймеров (каждому каналу - 
по счётчику). Используется в плейерах Fol─ 
lin brothers (Agent X и др. игры), Special 
FX (Midnight Resistance) и David'а Whitta─ 
ker'а (игры фирмы Code Masters ). Даёт бо─ 
лее  чистый звук по сравнению с предыдущим 
методом,если считать при том же количестве 
каналов.Обычно их здесь от 3 до 5.Импульсы 
применяются достаточно узкие,чтобы генери─ 
руемые частоты не плыли в зависимости друг 
от друга. Сигнал,генерируемый таким плейе─ 
ром, похож  на наложение нескольких перио─ 
дических  сигналов с высокими скважностями 
(скважность - отношение периода повторения 
импульсов  к их  длительности). Импульсы в 
разных каналах редко попадают друг на дру─ 
га, а если попадают,то на практике (в силу 
метода) в таких  случаях  генерируется два 
раздельных импульса.Понятнее описать метод 
довольно сложно,лучше посмотрите код отла─ 
 дчиком. Лучший пример - Agent X 2. 
  4. Сложение  каналов  и  вывод с помощью
ШИМ. Позволяет  применять сэмплы с разряд─ 
ностью в несколько бит (не 1).Не использу─ 
 ется. 
  5. Арпеджио - быстрое  переключение нот.
Использовалось  в  очень  старых  играх  и 
даже  в какой-то несерьёзной древней прог─ 
рамме (уже  не  вспомню  и  название) типа 
электронного музыкального инструмента. 
   Для  экзотических тембров можно предус─
мотреть и специальный синтез, например,как
в программе tune в приложении - два прямо─
угольных  генератора  с близкими периодами
накладываются  по  XOR. У  плейера  в игре
Athena  похожий принцип, хотя он не очеви─ 
ден.

                Мой плейер
           (игра "Канализация")

   Преимущество метода 2 перед методом 3 -
постоянный  (более-менее)  период  прохода
главного  цикла, что  позволяет  воспроиз─
водить  оцифрованные  ударные инструменты.
(Возможно,потом я попытаюсь реализовать их
и в 3-ем методе.)
   В Wham! авторы ограничились двумя кана─
лами, что  дало  возможность держать время
выполнения главного цикла постоянным с то─
чностью до такта. Однако при большем коли─
честве  каналов и фич это затруднительно и
может привести  к замедлению главного цик─
ла (если  его  период  попадёт  в слышимую
область, будет  свист). Поэтому мой плейер
имеет главный цикл с плавающей длительнос─
тью и звучит несколько грязновато.
   Мой набор ударных инструментов (8 штук)
большей  частью  сконвертирован с реальных
оцифровок. Проблему  вызвали  бочки - одну
пришлось сгенерировать программно,а другую
чистить от шума вручную.Громкость однобит─
ных оцифровок регулируется очень плохо.Ес─
ли просто переводить верхние полупериоды в
1, а нижние  в 0, то исходная громкость ни 
на что влиять не будет.Я использовал гене─
рацию импульсов "1" разной длины - в зави─
симости  от  площади верхнего полупериода.
Однако коэффициент пропорциональности при─
шлось для каждого сэмпла устанавливать от─
дельно.
   Конвертор  сэмплов  SUB16.H,  генератор
бочки  GENBOCH.H, сборщик  массива сэмплов
MERGSNAR.H  и плейер  BF8TIMEX.H (с треком 
из игры) лежат в приложении к журналу.
   Музыка  пишется в виде процедур-инстру─
ментов и таблиц-партитур (паттерновую сис─
тему я реализовать не успел, только разде─
лил каналы).Для каждого инструмента требу─
ется процедура, вызываемая в начале нот, и
процедура, вызываемая с периодичностью по─
рядка 70 Гц на протяжении ноты.Первая про─
цедура, к примеру, установит  длительность
"0" равной  длительности "1", а вторая бу─ 
дет постепенно  понижать одну длительность
за счёт другой. Скважность влияет на гром─
кость  канала, но  затрагивает также и его
тембр.
   Подключение процедур и смена других па─
раметров плейера (например,способа наложе─
ния  накоторых пар каналов - можно обычное
чередование,можно AND/OR/XOR) происходит в
партитуре, кодами типа POKE addr,n (макрос
pb ) и  кодами типа  DPOKE addr,nn (макрос 
pw ). 
   Для  предсказуемости звука, получаемого
при  наложении каналов, имеющих равные или
кратные  частоты, следует управлять фазами
генераторов.
   При использовании  слишком коротких пе─
риодов  весь плейер начинает работать мед─
леннее и может фальшивить - используйте их
как можно реже!

                   ШИМ

   GriV (см.статью в приложении) предлага─
ет играть цифровой звук на бипере, предва─
рительного  пересчитав звук на более высо─
кую частоту дискретизации,управляя уровнем
сигнала на выходе звуковой системы с помо─
щью  коротких импульсов. При этом сохраня─
ются  все  высокие  частоты, однако звук с
такой высокой частотой дискретизации зани─
мает очень много места и плохо пакуется.
   Более  предпочтительным, с  моей  точки
зрения, способом вывода оцифровок на бипе─
ре  является  широтно-импульсная модуляция
(ШИМ).
   Статья о ШИМ в IG#6 содержит ряд неточ─
 ностей.
  0. Разумеется, частота 22100 Гц не явля─
ется  стандартной. Стандартен  ряд 11025 - 
22050 - 44100 Гц. Впрочем,на слух 22100 Гц 
 от 22050 Гц не отличить. 
  1. В  упомянутом  там  третьим  по счёту
методе "без названия" непостоянный  период 
следования  импульсов выливается в шумовые 
искажения звука по всему спектру.Это заме─ 
чание относится и к методу GriV'а, особен─ 
но если учесть,что период следования импу─ 
льсов  не ограничен сверху и может попасть 
 в слышимые частоты. 
  2. Изменение  фазы импульсов ШИМ (в при─
водимом там плейере для Covox) - тоже, вне 
всякого сомнения,создаёт шумы. Видимо,луч─ 
шим вариантом ШИМ был бы импульс,отцентро─ 
ванный в периоде (такой режим есть в неко─ 
торых  микроконтроллерах), но для програм─ 
мной  реализации на Z80 это довольно проб─ 
лематично (нужно  держать по процедуре для 
каждого  положения и для каждой фазы алго─ 
ритма распаковки). Поэтому следует остано─ 
виться на импульсе, начало которого внутри 
 периода зафиксировано. 
  3. Сигнал  на  выходе  звуковой  системы
(он, как правило, профильтрован,чаще всего 
RC-цепочкой) после  одного  периода ШИМ не 
может  попасть  в уровень, соответствующий 
установившемуся значению для данной скваж─ 
ности сигнала.При этом наш конвертор звука 
не  может  предсказать  средний уровень на 
одном  периоде,  поскольку  характеристики 
применяемых  фильтров  могут  быть  самыми 
разными. Поэтому нежелательно использовать 
весь  динамический  диапазон бипера. Лучше 
ограничиться  средними  уровнями - 30-70%. 
Полной предсказуемости достичь невозможно, 
но при таком ограничении на сигнал хотя бы 
скорости  роста и падения выходного напря─ 
жения будут более-менее постоянны. 

   Сжатие 6-битного звука 4-битным дельта-
кодом (приращения ограничены -8..+7) слабо
искажает  звук и весьма применимо на прак─
тике.Сжатие по моей разновидности 2-битно─
го ADPCM (выбор текущего приращения проис─
ходит только из 4 вариантов, возможных для
предыдущего приращения; приращения ограни─
чены -7..+7) даёт много шума,зато звук за─
нимает в 2 раза меньше места, чем 4-битный
 дельта-код. 2-битный ADPCM (здесь:
         http://wiki.multimedia.cx/
       index.php?title=Covox_ADPCM
описан  оригинальный метод) хорошо годится 
для кодирования речи. Однако таблицы весят
#3c00 байт - для 48k это неприемлемо.В та─ 
блицах для каждого входного байта и каждо─
го  предыдущего приращения указаны 4 новых
приращения. Можно  написать ADPCM плейер с
маленькой таблицей (4 приращения в зависи─
мости  от предыдущего - именно по этой ма─
ленькой  таблице  генерируется большая), с
более низкой частотой ШИМ!
   Мои  примеры  ШИМ-плейеров, лежащие  на
http://alonecoder.narod.ru/zx/ , имеют пе─ 
риод в 163 такта,что даёт 21960 Гц на пен─
тагоне  с кварцем 14318 кГц. Ближе с 22050
Гц  с целым количеством тактов не подобра─ 
ться. Чтобы добиться в UnrealSpeccy более-
менее чистого  звучания ШИМ с периодом 163
такта, следует вместо 71680 тактов в кадре
указать  71800. Тогда низкочастотный пара─
зитный сигнал,вызванный квантованием,уйдёт
в область  более  низких  (менее слышимых)
частот. Теоретически  71882 было бы лучше,
но на практике при этом получается непоня─
тный мне треск. Периоды ШИМ, несоотносимые
с частотой 44100 Гц (вообще говоря, часто─
той,указанной в настройках,если она подде─
рживается звуковой картой), под эмулятором
звучат плохо. Но на реальной машине это не
играет роли,главное,чтобы частота ШИМ была
выше порога слышимости.
   Исходники плейеров и конверторов для 4-
битного дельта-кода  и 2-битного ADPCM ле─
жат в приложении.

           Редакторы под бипер

   Привожу  список  редакторов  под бипер,
используемых  польским композитором Mister
 Beep ( http://mister_beep.republika.pl/ ). 
  1. Music Maestro (C) 1988 - 3 канала,без
 ударных.
  2. The Music Studio (C) 1989 - 2 канала,
не  лучшие  ударные. Синтез похож на Music
 Box. 
  3. Orfeus Music Assembler (C) 1990  -  3
канала с хорошими ударными.Кроме того,есть
огибающие (но  их  нельзя  редактировать).
Пока лучший  в коллекции Mr Beep'а. Синтез
 типа 3.
  4. The Music Box(BEEPER version) (C)1985
- два  канала  тона (крайне прямоугольного
тембра). Есть ударные (можно редактировать
их огибающие), но во время их звучания тон
звучать не может. Многие из нас начинали с
 этого редактора :)
  5. Synthesizer KX-5 (C) 1987 - генератор
сэмплов (тон/шум). Эта  утилита  не  имеет
секвенсора, она сделана просто для генера─
ции разных интересных звуков. Мне вспомни─
лась  моя старая программа Sample Mixer, и
я собрал новую версию v2.0 (см. в приложе─
 нии).
  6. Sintetizador De Voz (C) 1985 - синтез
 речи на бипере.
  7. Loop Synthesizer (C) 1987 - ещё  один
 генератор сэмплов.
  8. Sampler (C) 1987 - простой оцифровщик
однобитного звука.Цифрует с магнитофонного
 входа.
  9. ZX-7  Polyphonic  Musical  Instrument
(C) 1988 - хотя в этой программе нет удар─ 
ных, зато есть 8(!) каналов с очень чистым
звучанием. Секвенсор, по словам Mr Beep'а,
напоминает  Roland TB-303.  Вся  программа
управляется пятью кнопками.Синтез выполнен
довольно интересно: с каждой новой нотой в
памяти  #c000..#ffff генерируется оцифров─
ка, которая будет проигрываться. Генериру─
ется  она быстро (впрочем, пауза заметна),
поскольку состоит только из нулей и 1-бай─
тных импульсов.Каждый канал заполняется по
 принципу LD (HL),C : ADD HL,DE.
  10. Virtual Synthesiser (C) 1985  -  ещё
один  генератор  звуков. Можно  в реальном
 времени менять и играть эти звуки.
  11. 3 Channel Synthesiser,  он же  Music
Synth (C) 1989 - весьма приличный редактор 
с двумя каналами тона (с огибающими) и ка─
налом ударных. Тоже синтез типа 3.  Фальши
можно избежать, если не использовать высо─
 кие ноты. Найти бы описание...
  12. Sample Tracker v2.0 (C) 1993 - 3-ка─
нальный цифровой редактор под AY / Covox /
Beeper.Можно загружать и использовать про─
извольные сэмплы.Эта программа у нас широ─
 ко известна по Спектрофону #19.
  13. Drum Machine  (C) 1984 - одноканаль─
ная драм-машина.Пока проигрывается дорожка
ударных,  можно  её  редактировать.  Почти
неюзабельно - разные  звучки  имеют разную
 длительность.
  14. Albert Einstein(A.E.) Drums (C) 1985
- ещё одна одноканальная драм-машина, тоже
с синтезированными звучками. Гораздо лучше
предыдущей.

   Tim Follin, скорее всего,не имел своего
специального  редактора, а  набирал музыку
непосредственно  кодами под специально на─
писанные плейеры. Во всяком случае,мне для
игры "Канализация" было проще набирать му─
зыку кодами, чем писать редактор.

                  * * *
 

   При программировании  под бипер следует
учесть, что  целевая  аудитория пользуется 
большей частью машинами зарубежного образ─ 
ца. Поэтому программа, а желательно,и дан─ 
ные,должна лежать в быстрой памяти (#8000- 
 #bfff и pg0 ). 
   Прерывания  надо  держать выключенными,
т.к. малейшая задержка  в случайном  месте 
плейера  слышна в виде грязи. Из-за преры─ 
ваний плейер в Savage звучит не так чисто, 
как плейер в Wham! The Music Box. 

Alone Coder 




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Всякая всячина - описание GloЬаl сommаnder v1.31.
Инструментарий - Инструкция по пользованию пакетом программ "ZX-WINWORD", предназначенных для подготовки иллюстрированных текстов.
Железо - Назначение перемычек 3.5" дисководов.

В этот день...   22 сентября