|
Plutonium
#18
30 июня 2001 |
|
Программирование - как накодить индикаторы музыкального сопрацессора в чанках.

(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 на экран. Удачи!
Другие статьи номера:
Похожие статьи:
В этот день... 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