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.

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

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

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


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

Похожие статьи:
Обратная связь - адреса редакции.
Конкурс - Конкурс продолжается...
Капля припоя - Резервы ZX-Spectrum.
Amiga Club - Новая статья бывшего Спектрумиста Макса Петрова об Amiga.
Описание - описание программы 'CONVER-Commander V 4.23 pro' (часть первая).

В этот день...   24 апреля