Deja Vu
#0A
30 сентября 2000 |
|
Software - описания редактора звуков CYBERAX Sound Editor v1.0.
__________________________________________ (C) Max/CYBERAX Software/BDA __________________________________________ _________ _________ ___________ ____ _______ _ ___ / _____/ _ _____/ __ __ /_ | _ / / _____ | __)_ | | | | / /_ ____ / | | | / | | _/ ______ //_______ / /_______ / |____/ |___| / _____ / / / / / / CYBERAX Sound Editor v1.0 help file. Глава 1. Ух ты, какие кнопочки!.. Управление редактором осуществляется следующими частями клавиатуры: CURSOR KEYS, TRUE VIDEO, INV VIDEO - перемещение курсора ENTER - проигрывание сэмпла O, P - изменение параметров на единицу U, I - ускоренное изменение параметров SPACE - установка/снятие флажков L - очистка поля под курсором (cLear) 0 - очистка всех полей в строке сэмпла SS+Q - удаление строки сэмпла SS+W - вставка строки сэмпла Y - копирование поля под курсором в нижнюю строку и перемещение на нее (copY) T - установка метки повтора (loop To) R - установка флага повтора (Repeat) E - установка флага конца сэмпла (End) 1...8 - смена октавы Z, S, X, D, C, V, G, B, H, N, J, M - установка ноты Те же клавиши, нажатые вместе с CS, дадут частоту ноты лежащей на октаву выше. Таб- лица нот - REAL SOUND из PT3.4 SS - переход в режим прямого ввода пара- метров (между прочим, это весьма удобная фича!). Удерживая SS и нажимая при этом цифровые клавиши можно посимвольно ввести значение параметра. Если вводится гром- кость, то помимо цифровых можно нажимать и клавиши A, B, C, D, E, F. Нажатие SPACE приведет к отмене сделанных изменений, а отпускание SS - к их подтверждению. EXT MODE - выход из редактора. Глава 2. Ой, а что это за циферки такие ? Итак, сэмпл состоит из 256 позиций (или строк). После компиляции от него останут- ся только позиции с нулевой по метку END (или REPEAT). Присутствие одной из этих меток обяза- тельно. Позиция, содержащая метку конца, также проигрывается. Если зацикливание присутствует, то после проигрывания всех позиций звук не заглохнет, а продолжится с метки LOOP TO. Позиция состоит из следующих полей: 0) Метка LOOP TO 1) Номер (000 - 255) 2) Метка REPEAT или END 3) Громкость (0 - F) 4) Частота шума (0 - 31) 5) Частота тона (0 - 4095) Поля 4 и 5 содержат флажки, означающие маски шума и тона соответственно. Для чтения/записи сэмплов я надолбил небольшой глюк на BASIC'е. После загрузки редактора появится примерно такая менюшка: 1. Edit sample 2. Load sample 3. Save sample 4. Disk catalogue 5. Clear sample Опции активизируются нажатием соответ- ствующих цифр. Сразу предупреждаю, что никакого контроля дисковых ошибок не ве- дется. Также настоятельно советую не гру- зить в редактор левые файлы - декомпилятор ничего не проверяет и может завесить комп. Глава 3. А компакт диски в ваш плейер можно сувать? Плэйер по самым грубым прикидкам жрет максимум 300 тактов, что, я думаю, не так уж и много. Перед использованием он наве- шивается на player вашего любимого музы- кального редактора. Для примера пусть бу- дет ProTracker v3.x. ;----------------------------------------- ORG #6000 ENT MUS_PLR EQU #C000; адрес плэйера PT3 CHAN EQU 0; номер канала (0...2) RG_TNE EQU CHAN*2+MUS_PLR+#300 RG_NSE EQU MUS_PLR+#306 RG_MIX EQU MUS_PLR+#307 RG_VOL EQU MUS_PLR+#308+CHAN CALL MODIFY; коверкаем плэйер CALL AY_OFF; вырубаем AY CALL MUS_PLR; инициализируем музу SMP LD L,0; номер сэмпла CALL INI_SMP; инициализируем MAIN EI HALT CALL MUS_PLR+5; муза CALL SND_PLR; звуки CALL OUTPUT; вывод на AY LD A,#7F IN A,(#FE) BIT 1,A JR Z,SMP; SS - звук RRCA JR C,MAIN; SPC - выход JP AY_OFF ;L - SAMPLE INI_SMP LD H,0 ADD HL,HL LD BC,SM_ADTB ADD HL,BC LD A,(HL) INC HL LD H,(HL) LD L,A LD E,(HL) INC HL LD D,(HL) INC HL EX DE,HL ADD HL,DE XOR A LD (NO_SM_F),A; * LD (SND_PLR+2),A LD (REP_ADR+1),HL LD (SND_PLR+1),DE RET SND_PLR LD HL,0 LD A,H AND A JR NZ,SMP_ON NO_SM_F RET; * LD (RG_VOL),A; A=0 !!! * LD HL,RG_MIX; * LD A,(HL); * OR CHAN*3+2/2*9; * LD (HL),A; * LD A,#C9; * LD (NO_SM_F),A; * RET SMP_ON LD A,(RG_MIX) OR CHAN*3+2/2*9 LD C,A LD A,(HL) INC HL RRCA JR NC,NOT_NSE EX AF,AF LD A,(HL) INC HL LD (RG_NSE),A EX AF,AF RES CHAN+3,C NOT_NSE RRCA JR NC,NOT_TNE LD D,(HL) INC HL LD E,(HL) INC HL LD (RG_TNE),DE RES CHAN,C NOT_TNE RRCA JR NC,NOT_REP REP_ADR LD HL,0 NOT_REP RRCA JR NC,NOT_END LD H,0 NOT_END AND #0F LD (RG_VOL),A LD (SND_PLR+1),HL LD A,C LD (RG_MIX),A RET AY_OFF LD HL,MUS_PLR+#300+10 XOR A LD (HL),A DEC L LD (HL),A DEC L LD (HL),A DEC L CPL LD (HL),A OUTPUT LD DE,#FFBF LD BC,#FFFD LD HL,MUS_PLR+#300 OUT (C),L LD B,E OUTI !ASSM 12 LD B,D OUT (C),L LD B,E OUTI !CONT LD A,(HL) OR A RET Z LD B,D OUT (C),L LD B,E OUT (C),A XOR A LD (HL),A RET MODIFY LD HL,MUS_PLR+#6E1 LD (HL),#18 INC L LD (HL),#2D INC L LD HL,MUS_PLR+#717 LD A,6 CALL MODIFY2 LD (HL),#DD INC L LD (HL),#7D INC L INC A CALL MODIFY2 LD (HL),#18 INC L LD (HL),#21 INC L LD L,#44 LD A,13 CALL MODIFY2 LD (HL),#18 INC L LD (HL),4 RET MODIFY2 LD (HL),#32 INC L LD (HL),A INC L LD (HL),MUS_PLR&H+3 INC L RET ;Табличка адресов сэмплов. SM_ADTB DW SAMPLE0 DW SAMPLE1 DW SAMPLE2 ; ... ;А это сами сэмплы. SAMPLE0 LCODE "SMP0" SAMPLE1 LCODE "SMP1" SAMPLE2 LCODE "SMP2" ; ... ;Музон с плэйером в формате PT3.X ORG MUS_PLR LCODE "MUZAK" ;----------------------------------------- Когда первые восторги от звуков и музы- ки поутихнут, нетрудно заметить главный недостаток проигрывателя: если во время звучания продолжительного звука включить еще один, пусть даже коротенький и негром- кий, первый звук оборвется. Такой эффект свойственен не только моему плэйеру. Возь- мите любую игру со звуками и увидите ана- логичную картину (правда в одной из них в подобных случаях звук выводился в неза- нятый канал, но там не было музыки). Я предпринял попытку устранения таких накладок и написал еще один проигрыватель. Этот монстр жрет уже 1500 тактов максимум, но задачу свою выполняет. В общем-то, ничего нового и сверхъес- тественного я не придумал. Просто теперь при вызове звука необходимо указывать его приоритет (0-7). И если приоритет текущего эффекта выше приоритета нового эффекта, то последний будет пропущен. Правда, здесь есть одна особенность (а зачем, думаете, мне понадобилось аж полто- ры штуки тактов ?). Пусть играет продол- жительный сэмпл с приоритетом 4. Вы вызы- ваете еще один (короткий и с приоритетом 3). Первый звук прерывается, затем проиг- рывается второй, но после его окончания вновь начнет играть первый, причем не с того места где он был прерван, а так будто он играл непрерывно. Т.е. плэйер одновременно может играть до 8 сэмплов, но слышен только самый "при- оритетный" из них. Если же приоритет те- кущего и нового сэмпла равны, то текущий прерывается и удаляется из очереди, а его место занимает новый. Кроме того, внеся небольшие изменения в плэйер, можно ввести приоритет музона, тогда сэмпл с меньшим приоритетом будет слышен только когда в данном канале нет музыки. ;----------------------------------------- ORG #6000 ENT MUS_PLR EQU #C000; адрес плэйера PT3 CHAN EQU 0; номер канала (0...2) RG_TNE EQU CHAN*2+MUS_PLR+#300 RG_NSE EQU MUS_PLR+#306 RG_MIX EQU MUS_PLR+#307 RG_VOL EQU MUS_PLR+#308+CHAN CALL MODIFY; коверкаем плэйер CALL AY_OFF; вырубаем AY CALL MUS_PLR; инициализируем музу CALL CLR_SEQ; очищаем очередь SMP LD HL,#0002; H - приоритет CALL INI_SMP; L - номер звука LD HL,#0101 CALL INI_SMP LD HL,#0200 CALL INI_SMP MAIN EI HALT CALL MUS_PLR+5; муза CALL SND_PLR; звуки CALL OUTPUT; вывод на AY LD A,#7F IN A,(#FE) BIT 1,A JR Z,SMP; SS - звук RRCA JR C,MAIN; SPC - выход JP AY_OFF ;H=PRIORITY, L=SAMPLE INI_SMP LD A,H ADD A,A ADD A,A ADD A,SMP_SEQ+1&L LD E,A LD D,SMP_SEQ+1&H JR NC,$+3 INC D LD H,0 ADD HL,HL LD BC,SM_ADTB ADD HL,BC LD A,(HL) INC HL LD H,(HL) LD L,A LD C,(HL) INC HL LD B,(HL) INC HL XOR A LD (NO_SM_F+1),A; * LD (DE),A DEC DE LD A,L LD (DE),A INC DE INC DE LD A,H ADD HL,BC EX DE,HL LD (HL),E INC HL LD (HL),D DEC HL DEC HL LD (HL),A RET SND_PLR DI LD (NO_SMPS+1),SP LD SP,SMP_SEQ LD B,8; [4] XOR A SMP_FND POP HL OR H JR NZ,FOUND POP HL DJNZ SMP_FND NO_SM_F JR NO_SMPS; * LD (RG_VOL),A; A=0 !!! * LD HL,RG_MIX; * LD A,(HL); * OR CHAN*3+2/2*9; * LD (HL),A; * LD A,NO_SMPS-NO_SM_F-2; * LD (NO_SM_F+1),A; * JR NO_SMPS FOUND LD A,(RG_MIX) OR CHAN*3+2/2*9 LD C,A LD A,(HL) INC HL RRCA JR NC,NOT_NSE EX AF,AF LD A,(HL) INC HL LD (RG_NSE),A EX AF,AF RES CHAN+3,C NOT_NSE RRCA JR NC,NOT_TNE LD D,(HL) INC HL LD E,(HL) INC HL LD (RG_TNE),DE RES CHAN,C NOT_TNE RRCA JR NC,NOT_REP POP HL PUSH HL NOT_REP RRCA JR NC,NOT_END LD H,0 NOT_END AND #0F LD (RG_VOL),A PUSH HL POP HL,HL LD A,C LD (RG_MIX),A DEC B JR Z,NO_SMPS LD D,0 SMP_LP POP HL DEC H INC H JR Z,NOT_EN LD A,(HL) LD C,A INC HL AND 3 LD E,A ADD HL,DE BIT 2,C JR Z,NOT_RP POP HL PUSH HL NOT_RP BIT 3,C JR Z,NOT_EN LD H,D NOT_EN PUSH HL POP HL,HL DJNZ SMP_LP NO_SMPS LD SP,0 EI RET ;Эта маленькая процедурка - кардинальный ;способ вырубить все звуки. CLR_SEQ LD HL,SMP_SEQ+1 LD DE,4 LD B,8; [4] CLSQ_LP LD (HL),D ADD HL,DE DJNZ CLSQ_LP RET ;Процедуры AY_OFF, MODIFY и MODIFY2 абсо- ;лютно идентичны помещенным в первом лис- ;тинге, поэтому я их проскипаю. А если ;честно - анимация не влазит в статью... ;(Cardinal, блин, буфер под текст урезал:) SMP_SEQ DS 4*8; [4*4] ;Табличка адресов сэмплов. SM_ADTB DW SAMPLE0 DW SAMPLE1 DW SAMPLE2 ; ... ;А это сами сэмплы. SAMPLE0 LCODE "SMP0" SAMPLE1 LCODE "SMP1" SAMPLE2 LCODE "SMP2" ; ... ;Музон с плэйером в формате PT3.X ORG MUS_PLR LCODE "MUZAK" ;----------------------------------------- Теперь несколько замечаний по плэйерам. 1) Проигрыватели музыки и звуков лучше по- весить на прерывания. 2) После вызова процедуры MODIFY, плэйер музыки больше не влияет на регистры AY! Если нужно заглушить и музу и звуки - убирайте с прерываний вызов MUS_PLR и SND_PLR, затем вызывайте AY_OFF. 3) Когда звук(и) проиграются до конца, ка- нал глушится на 1 фрейм. Это сделано для того, чтобы не оставалось гудения от последней проигранной позиции звука. Если ваш музон в данном канале не за- тихает никогда, то он будет забивать это гудение и заглушку можно убрать. То же в случае если все ваши сэмплы окан- чиваются пустой позицией. За глушение в листингах отвечают строки, помеченные (*). 4) Если нужно отрубить звуки, то: а) для первого плэйера запихайте ноль по адресу SND_PLR+2 б) для второго плэйера вызовите CLR_SEQ (заглохнут все звуки), либо пихайте ноль по адресу P*4+SMP_SEQ+1, где P- приоритет звука подлежащего глушению В обоих случаях звук прекратится только после следующего вызова SND_PLR и OUTPUT (т.е. при следующем прерывании). 5) Совсем забыл! Во 2-м проигрывателе приоритет звуков изменяется от 0 до 7, причем 0 - высший приоритет. НИЗЯ за- давать приоритет больше семи !!! 6) WARNING! Если будете оптимизировать процедуры INI_SMP (на первый взгляд они написаны несколько коряво), то не наде- лайте глюков! Инициализатор таким сде- лан специально, чтобы во время его ра- боты могли приходить прерывания с ви- сящим на них плэйером. Если же сокра- тить эти процедуры, то плэйер может на- чать проигрывать "недоинициализирован- ный" сэмпл, у которого, скажем, инициа- лизатор успел выставить только млад- ший байт адреса начала... 7) Немного насчет быстродействия 2-го про- игрывателя. Старайтесь использовать меньший диапазон приоритетов. Например, если вам достаточно трех уровней прио- ритета, то используйте значения 7,6,5; если двух - 7,6 и т.п. Для большинства применений достаточно четырех уровней. В листинге кое-где встречаются закомментированные значения в квадратных скобках. Используйте их для переделки плэйера на 4 приоритета. Дальнейшее наворачивание player'а: 1) Можно для каждого сэмпла в очереди ввести дополнительные поля: смещение тона и смещение шума. Тогда один и тот же звук можно будет проиграть с разной высотой. 2) Можно туда же добавить и поле громкости звука. При этом появится возможность варьировать громкость звуков в игре, например, при изменении расстояния до их источника. Для регулирования громкости удобно использовать содержащуюся в плэйере PT3 табличку. Делается это так: LD A,#0X; текущая громкость 0...#F VLM OR #Y0; глобальная громкость*#10 LD L,A LD H,MUS_PLR&h+1 LD A,(HL); новая громкость 3) Неплохо бы ввести глобальные громкости для музона и для звуков. Делается это опять таки по табличке из плэйера. Глава 4. Ну ты, хацкер, блин даешь! Если вы загружали CSE 1.0, то наверняка заметили полное отсутствие удобного интер- фейса для работы с диском (если не считать BASIC). Честно говоря, мне влом было что- либо сочинять. Однако редактор написан таким образом, что к нему любой желающий может подцепить свой любимый файлер. Для этого вам пригодится данная глава. Кроме того, здесь приведена структура сэмплов, которая понадобится если вы захотите написать собственный компилятор звуков в нужный вам формат, конвертер в/из другого формата или плэйер. Редактор располагается в памяти с адре- са #D100 и до конца. Остальное ОЗУ сво- бодно и может быть использовано под фай- лер. Точки входа в редактор: - #D100 - очистка редактируемого сэмпла - #D103 - компиляция редактируемого сэмпла - #D106 - декомпиляция сэмпла - #D109 - редактирование Логика работы: 1) Перед тем как вызвать редактор, необхо- димо дать ему какой-нибудь сэмпл. Это можно сделать либо вызвав очистку, либо загрузив с диска сэмпл и вызвав деком- пилятор. 2) После редактирования нужно вызвать ком- пилятор и только после этого сохранять сэмпл. При выходе из компилятора в ре- гистре BC содержится длина звука. 3) В принципе, можете работать и с неком- пилированными звуками. Информация по местоположению в памяти сэмплов приве- дена ниже. 4) Рекомендую посмотреть BASIC-загрузчик, там все разжевано подробнее. Формат сэмплов. Звуки в редакторе представлены в двух форматах: некомпилированный и компилиро- ванный. Первый используется внутри CSE для редактирования звуков, а во втором формате сэмплы хранятся на диске и играют- ся плэйером. I) Формат некомпилированных сэмплов. В памяти sample располагается с адреса #F700. Длина sample'а фиксирована и соста- вляет 1024 байта. На одну позицию (строку) приходится 4 байта: Байт 0: бит 7 - метка REPEAT бит 6 - метка END бит 5 - метка LOOP TO биты 3-0 - громкость Байт 1: бит 7 - флаг NOISE биты 4-0 - частота шума Байт 2: бит 7 - флаг TONE биты 3-0 - старшие 4 бита частоты тона Байт 3: биты 7-0 - младшие 8 бит частоты тона Примечание1: флаг включен, если соответст- вующие ему бит равен 1 и вык- лючен, если бит равен 0. Примечание2: 7-й и 6-й биты 0-го байта не могут быть одновременно уста- новлены! Каждая из трех ме- ток может встречаться в сэмп- ле не более одного раза. II) Формат компилированных сэмплов. Компилированный сэмпл располагается в памяти с адреса #FB00. Длина sample'а пе- ременна и зависит от положения метки END (REPEAT) и от количества включенных флагов TONE и NOISE в сэмпле. Первые 2 байта содержат смещение от на- чала сэмпла+2 до позиции, на которую про- исходит зацикливание (LOOP TO). Далее идут сами позиции. На каждую при- ходится от 1 до 4 байт: Байт 0: биты 7-4 - громкость бит 3 - метка END бит 2 - метка REPEAT бит 1 - флаг TONE бит 0 - флаг NOISE Наличие остальных байтов зависит от значения байта 0: - если NOISE=TONE=0, то больше в данной позиции байтов нет. - если флаг NOISE=1, то младшие 5 бит сле- дующего байта содержат значение частоты шума. - если флаг TONE=1, то далее идет два бай- та частоты тона: сначала байт со старши- ми 4-мя битами частоты (содержатся в 4-х младших битах), затем байт с младшими восемью. - если NOISE=TONE=1, то сначала идет байт частоты шума, затем 2 байта тона. Признаком конца сэмпла служит включенный флаг END или REPEAT. Во втором случае осу- ществляется переход на метку LOOP TO. Глава 5. Yeah! Bonus pack! К редактору прилагается специ- альный bonus pack, в котором вы найдете коллекцию почти из #100 готовых звуков! Все это было мной надергано из MSX'овых саунд-моду- лей, которые, в свою очередь, я позаимствовал из музыкалок MSX-1...MSX-12 (это еще далеко не все звуки, я выбирал более-менее приличные). Сначала я хотел просто поместить звуки в zip-архиве, но потом подумал, что их не совсем удобно в таком виде прослушивать (нужно по-одному грузить в редактор). По- этому пришлось сделать небольшой плэйер с возможностью отгрузки сэмплов на диск. Изучая эти звуки в редакторе можно и самому научится клепать неплохие эффекты (как-никак их делали профессионалы для игрушек на MSX). Кстати, попробуйте най- ти в этой коллекции лай собаки из METAL GEAR... Глава 6. Пишите, Шура, пишите! По всем вопросам связанным с CSE пишите в редакцию. Если вам позарез нужна какая- либо функция (например, копирование кусков сэмпла в буфер и обратно) - пишите. Если я сочту вашу идею рациональной и у меня будет время и желание - сделаю поддержку. Если вдруг обнаружатся какие-либо глюки (особенно фатальные) - не поленитесь и сообщите. В принципе, могу помочь с адаптацией проигрывателя звуков к другому музыкально- му редактору (PSC, ST PRO, FT, GT, ASM..), хотя и не знаю у кого это может вызвать проблемы. Да, совсем забыл! Если сделаете удоб- ный и быстрый дисковый интерфейс - присы- лайте!
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября