__________________________________________
(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..),
хотя и не знаю у кого это может вызвать
проблемы.
Да, совсем забыл! Если сделаете удоб-
ный и быстрый дисковый интерфейс - присы-
лайте!
Other articles: