Plutonium #18
30 июня 2001

Программирование - как накодить индикаторы музыкального сопрацессора в чанках.

<b>Программирование</b> - как накодить индикаторы музыкального сопрацессора в чанках.
(c) Lynx/Explos!ve team.

   Мдямс...  Что-то давно  ни в одном издании не слышно было про
кодинг.  Или  всем  на всё посрать стало, или чё? Всё только про
пьянки, да про пьянки. Надоело, честно говоря...
   Дык  вот.  Решил  я  вам  рассказать  сегодня,  как  накодить
индикаторы  музыкального  сопра в чанках, как я сделал в плагине
savage  в  zx-navigator  v.1.2  (вечная память ему и слава, кому
надо  сырцы,  пишите  на емыл:lynx_gmd@pisem.net). А сделано там
было  очень  неплохо.  Индикаторы,  как бы, смывались :)) motion
blur'ом влево (или вправо :).
   Сделать   это   ужасно  просто,  но  и  выглядит  убийственно
поразительно :). Начнем с объяснения.
   Итак.  Перед  нами,  как обычно, матрица из чанков. По высоте
нам  должно  хватить  (да  и  хватит)  трети  экрана. Получается
матрица  размером  64х16  точек,  в  которую  мы  будем рисовать
столбики,  означающие  частоту  и громкость звучащего звука. Чем
правее,  тем  выше  частота  звука,  чем  выше, тем громче звук.
Оговоримся,  что  на  шумы  нам  по$бени,  а  все  три канала мы
впечатаем  на  одну матрицу. Да и печать линий будем производить
на  прерываниях,  чтобы  чаще :)).. Всмысле не вывод на экран, а
печать линий в матрицу. Произведем это следующими процедурами:

;---  Гон собачий, так, перифирийные процедуры...
fucker
           RRA
           RR      E
           RRA
           RR      E
           RRA
           RR      E
           LD      A,E
           RET
dat        DB      0
andez      PUSH    AF,BC
           LD      A,(dat)
           ADD     A,B
           LD      (dat),A
           POP     BC,AF
           RET
;--- А вот и печать линии...
; А data1 - это чанковый буфер.
line       CALL    fucker
           CALL    andez
           PUSH    AF
           LD      A,B
           OR      A
           JR      Z,lret
           POP     AF
           NEG
           LD      HL,data1+64*16;рег. A- частота
           LD      E,A;B - уровень звука (громкость)
           LD      D,0
           ADD     HL,DE
           LD      C,A
ln         LD      (HL),#d
           LD      DE,lent*2
           AND     A
           SBC     HL,DE
           DJNZ    ln
           RET
lret       POP     AF
           RET
;- а вот процедура опроса портов музыкалки.
;- из неё непосредственно вызывается процедура печати линии.
; Эту процедуру надо вызывать на прерываниях.

init       LD      BC,#fffd
           LD      A,1
           OUT     (C),A
           IN      A,(C)
           LD      E,0
           OUT     (C),E
           IN      E,(C)
           LD      D,8
           OUT     (C),D
           PUSH    AF
           IN      A,(C)
           AND     #0f
           LD      B,A
           POP     AF
           CALL    line
;----------------- CHANNEL B ----------------------
           LD      BC,#fffd
           LD      A,3
           OUT     (C),A
           IN      A,(C)
           LD      E,2
           OUT     (C),E
           IN      E,(C)
           LD      D,9
           OUT     (C),D
           PUSH    AF
           IN      A,(C)
           AND     #0f
           LD      B,A
           POP     AF
           CALL    line
;----------------- CHANNEL C ----------------------
           LD      BC,#fffd
           LD      A,5
           OUT     (C),A
           IN      A,(C)
           LD      E,4
           OUT     (C),E
           IN      E,(C)
           LD      D,10
           OUT     (C),D
           PUSH    AF
           IN      A,(C)
           AND     #0f
           LD      B,A
           POP     AF
           CALL    line
           LD      A,(fl0_4)
           OR      A
           CALL    Z,filla
           RET

   С   этим  покончили.  Теперь  мы  в  чанковой  матрице  имеем
нарисованные  линий  для всех трёх каналов. И чё, думаете - всё?
Хер  в  стакан.  Нам  надо  ещё  всё  это "заблурить", чтобы оно
смазывалось.  И  использовать нам для этого надо "гасящий блур".
Т.е.  не просто размытие точек, а с уменьшением интенсивности их
свечения :)). Яркости, говоря русским языком.
   Вы  можете  намутить  там свои, супер качественные, красивые,
тормозные   фильтры...  Я  же  просто  взял  так  и  использовал
упрощенный   (мной)  motion  blur,  чтобы  изображение  гасло  и
сдвигалось. Вот как выглядит схема данного фильтра:

            +1  +1   0   0   0   0   0

             0   0   0   0   0   0  (0) - центр фильтра (т.е.
                                              печатаемая точка).
             0  +1  +1   0   0   0   0

    плюс  ещё  делитель  равняется  8. Т.е. число, полученное от
сложения  номиналов  этих  точек  ещё  делится на 8 и кладется в
центр.
  Tupoy Question > Что надо делать при ядерном взрыве?
  Hint > Главное не попасть в эпицентр.

   В коде это выглядит проще простого. Одна процедура :)

blur2        LD      IX,data1
             LD      BC,data1
ixel2
             LD      A,(IX-59)
             ADD     A,(IX-58)
             ADD     A,(IX+59)
             ADD     A,(IX+60)
             SRL     A
             SRL     A
             SRL     A

ix_3         LD      (IX),A
             INC     IX
             DEC     BC
             LD      A,B
             OR      C
             JR      NZ,ixel2
             RET

   Выглядит  это примерно так. Да. Совсем забыл! Для того, чтобы
всё  красиво  выглядело  надо сделать матрицу поболее размерами,
чтобы  были бордюры, которые не печатаются на экран. И затирайте
их. Чтобы с блуром не лезло всякое говно из недр памяти.
   Думаю,  что дал вам пищу для размышлений. Вам осталось убрать
все глюки (и добавить парочку:) и сделать вывод матрицы data1 на
экран.

                                                          Удачи!



Другие статьи номера:

Вступление - за последнее время стало появляться порядком. К чему бы это?

Новости - появление диска ЧЕРНЫЙ ВОРОН 2, Выпущен 1-ый номер сценовой газеты Scream, новый эмулятор ZX Spectrum на Sony Playstation.

Новости - Random сообщает, что Chaos Constructions 2001 demo party как минимум в этом году отменяется.

Почта - Ответ mr.Nuts'у. Редакция.

Мысли вслух - КОНЕЦ ИГРЫ (c) Сергей Лукьяненко (Невасильевич)

История одного спектрумиста - Я, спектрум и снова спектрум.

Люди - история Первоуральской группы Studio Stall.

Софт - STD-3 - новый монитор отладчик от Studio Stall.

Музыка - Антон Кубиков: "Техно - рай для барабанщика".

Софт - описание новой операционной системы для спектрума Vrcp Windows.

Чтиво - Дорожный уЖас пРеТ нА сЕвЕр (СтиВен КинГ).

Программирование - как накодить индикаторы музыкального сопрацессора в чанках.

Авторы - авторы газеты.


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

Похожие статьи:
Report - отчет NoViS с Ижевского фестиваля компьютерного искусства ASCII 2002.
Анекдоты
Введение - Вот и лето на исходе.
Code on - меню с бесконечной вложенностью.
Demo Scene - Commodore 64 - сцена, софт, традиции, термины.

В этот день...   1 января

SibNews #08, Woot! #01, Spectrum Magazine #01, ACNews #25, Psychoz #14, ACNews #14, Last 128 #08, Last 128 #06, Last 128 #05, Last 128 #04, Last 128 #03, Last 128 #02, Last 128 #09, Last 128 #3.5, Last 128 #8.025, Sinclair Club #05, Last 128 #M!R 01, Fantadrom #01, Buzz #20, Last 128 #01, DonNews #13, Nicron #120, Promised Land #01, Inferno #01, Marazm #25, Ultimathum #01, Marazm #21, Hooy Mag #02, KrNews #11, Marazm #22, Marazm #23, ZX Football 2000 #01, Codemania #01, Always #03, Bugs #02, IzhNews #08, Virtual Worlds #01, Listok #04, Scenergy #02, Flash Info #18, Marazm #16, Marazm #17, Zed #01, Balagan #02, ZX Format #08, ZX Power #03, Shock #01, Impulse #02, Deja Vu #03, ZX Club #08, ZX Club #06, Numberology #01, Marazm #13, Marazm #12, Marazm #14, Gorodok #02, Zodiac #01, Marazm #15, Deja Vu #07, Marazm #11, Deja Vu #07, Playboy #03, Crazy News #2, Crazy News #4, ZX Light #01, Crazy News #5, Playboy #02, ZX News #03, ZX Review #1-2, Read Me #02, Crazy News #3, Nicron #13, Read Me #01, Public Spirit #01, Faultless #06, Faultless #05, ZX Software #01, Stump #04, Speccy #07, Возраждение #0, Speccy #03, On-Line #17, Scene+ #01, Welcome Press #01, ZX Konig #04, Adventurer #01, Faultless #05, Faultless #04, Di Halt #01, Faultless #01, Playboy #01, Crazy News #1, Faultless #03, Pioneer #03, Sinclair Town #02, ZX Magazine #01, Eldorado #01, ZX Magazine #02, Spectron #01, ZX News #01, ZX Konig #02, 200 #W, Welcome Press #00, Dune #07, Subliminal Extacy #01, Subliminal Extacy #02, ZX Konig #01, Subliminal Extacy #00, Muchomor #01, Spectrofon #01, ZX Revija #02, Outlet #01, Outlet #1-3