(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 на
экран.
Удачи!