Цифровой плейер под 16кГц.
(Original was sent to Disabler/DPL &
Vitamin/CAIG. Disabler уже поддержал идею)
У меня возникла дикая идея плейера под
SD или ковокс-4 канала+громкость с часто-
той около 16кгц (для SD около 15). Главная
мысль: использование стека как источника
адресов подпрограмм.
В ET использовалось масштабирование ка-
налов отдельно от вывода в порты.Это хоро-
шая идея, т.к. за счет более редкого обра-
щения к #7ffd и более редкого переприсваи-
вания регистров получается более высокая
скорость. Воспользуемся этой идеей.
Пусть прога, занимающаяся масштабирова-
нием канала (скалер) берёт 4 отсчёта кана-
ла и пихает их по неким адресам... А прога
кидания в порты берет отсчёты в другом по-
рядке из этих адресов, пересчитывает гром-
кость по табличке и швыряет в порт...Пусть
в главном цикле у нас будет кидаться 64
отсчёта (почему, см.ниже)
То есть:
переключаем странички,переприсваиваем счё-
тчики,SP=табличка...
scaler (отсчёты 0-3 канала A)
outer (отсчёт 0)
scaler (4-7 A)
outer (1)
...
scaler (60-63 A)
outer (15)
переключаем странички,переприсваиваем счё-
тчики,SP=табличка...
потом:
scaler (16-19 B)
outer (16)
scaler (20-23 B)
outer (17)
...
scaler (12-15 B)
outer (31)
переключаем странички,переприсваиваем счё-
тчики,SP=табличка...
потом:
scaler (32-19 C)
outer (32)
scaler (20-23 C)
outer (33)
...
scaler (12-15 B)
outer (47)
переключаем странички,переприсваиваем счё-
тчики,SP=табличка...
потом:
scaler (16-19 B)
outer (48)
scaler (20-23 B)
outer (49)
...
scaler (12-15 B)
outer (63)
Под фразой "переключаем странички,пере-
присваиваем счетчики, SP=табличка..." под-
разумевается следующее:
LD A,H
CP 'endSampleA
JR NZ,NOEND_A
LD HL,startSampleA
[LD A,pageStartSampleA]
[LD (...),A] ;это если плейер позволяет
;сэмплам пересекать странички
;тогда программа и в других местах
;усложняется,подробнее - спрашивай
NOEND_A
LD (CHAN_A+1),HL
CHAN_B
LD HL,...
LD SP,... ;это меняет процедура обработки
;условного прерывания (так как DI)
Простейшие варианты scaler'a и outer'a
такие (мне кажется)
scaler:
LDI
INC D
[INC HL]
[DEC HL]
LDI
INC D
[INC HL]
[DEC HL]
LDI
INC D
[INC HL]
[DEC HL]
LDI
INC D
[INC HL]
[DEC HL]
RET
инкременты в квадратных скобках необязате-
льны.Поскольку у нас 4 таких "необязатель-
ных" инкремента, то в разных комбинациях
(кроме запрещенных) они дадут 26 scaler'ов
(если с запрещенными, то все 32). Весь на-
бор таких scaler'ов займет 1к.
outer (COVOX):
EXX
LD E,... ;CHANNEL A
LD A,(DE)
LD L,... ;CHANNEL B
ADD A,(HL)
ADD A,(IX+...) ;CHANNEL C
ADD A,(IY+...) ;CHANNEL D
EXX
OUT (COVOX),A
[LD A,PAGE]
[LD BC,32765]
[OUT (C),A]
[...]
RET
фрагмент в квадратных скобках опять-таки
необязательный - он есть только в каждом
16-м outer'e.
outer'ы располагаются в памяти так:
|-----> L
|
v
H
outer0 outer8 ...
outer1 outer9 ...
outer2 outer10 ...
... ...
outer7 outer15
Это займет 2к.
Сам понимаешь,LDI:INC D требует жертв :)))
В каждом 2-м outer'e есть коррекция DE:
LD DE,...
Теперь о таблицах:
Если нот у нас 48(4 octaves), то
48*64 (в каждой табличке 32 адреса)*4 (для
каждого канала своя табличка)=12к
Если громкостей у нас 16:
16*256=4k
итого: 1+2+12+4=19k
(warning! это должно быть в нижней памяти!
32k-19k=13k free)
Теперь к вопросу о том,почему 64 отсчё-
та.При периодичности инкрементов в 64 шту-
ки (при использовании таблиц неизбежна пе-
риодичность) 4 октавы мало фальшивят. Это
определяется опытным путем (я когда-то оп-
ределил). Чем меньше период, тем больше
фальшь и меньше скорость!!!
Глисс использовать нельзя :(
Точнее можно,но грубо:как коррекцию адреса
после каждых 64 отсчётов.
Зато быстро :)
Примечание:для ковокса можно сэкономить
3k и добавить скорости,если брать сразу по
8 отсчётов.В середине каждого scaler'a си-
дит OUT (COVOX),A.
Тогда scaler'ы займут (125 штук)=4к.
Зато таблица вызовов займет 48*32(в ка-
ждой табличке 16 адресов)*4=6k
Итого: 4+2+6+4=16k
Жду встречных идей и предложений!
Вопросы тоже принимаются ;)
P.S.: Всем специалистам по этому вопросу -
обращайтесь! В данной статье пока есть бе-
лые пятна, а сам плейер ещё не написан!
Сайт управляется системой
uCoz