nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 12 Dec 2017 06:18



Reply to topic  [ 11 posts ] 
[ASM] Проигрыватель 2-битного звука для РК-86 
Author Message
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15908
Location: Colorado
Reply with quote
Написал я тут мимоходом проигрыватель двухбитного звука с ROM-диска (мой формат до 1 МБ) - старший бит берётся с INTE, а младший - выход мафона C0 клавиатурной ВВ55 (ну или два младших бита порта C клавиатурной ВВ55 можно задействовать - звук будет чуть почище - плеер умеет и так, и эдак):
Code:
\ ***************************************
\ *  TWOBITS PLAYER FOR RK-86 BY SHAOS  *
\ ***************************************

\ 80.62 TICKS PER SAMPLE FOR 22050 HZ
\ OR 241.87 PER 3 SAMPLES (WITHOUT DMA):
\ 80.62 X 1 ~ 81
\ 80.62 X 2 ~ 161
\ 80.62 X 3 ~ 242

ORG 0

\ DB 0,4,0,255

MVI_E, #00
LXI_H, #0100
CALL TWOBITS
MVI_A, #FF
STA #A002
HLT

\ TWOBITS FORMAT:
\ ONE BYTE PLAYS 3 DIFFERENT 2-BIT SAMPLES
\ OR MAXIMUM 50 IDENTICAL 2-BIT SAMPLES
\ 00000000 - END OF STREAM
\ 0NNNNNBB - OUTPUT BB NNNNN+3 TIMES
\ 10NNNNBB - OUTPUT BB NNNN+35 TIMES
\ 11DDCCBB - OUTPUT BB THEN CC THEN DD

\ PLAY TWOBITS COMPRESSED SOUND
\ HL - ADDRESS ON ROM-DISK (#7FFF MAX)
\ E - PAGE ON ROM-DISK (#1F MAX)
TWOBITS: MVI_A, #80
STA #E008
MVI_A, #90
STA #A003
MOV_A,E
STA #A002
ORI #80
STA #A002
MVI_C, 2
SHLD #A001
GO0: \ 207 TICKS FROM PREVIOUS CYCLE (-36)
INX_H ; 5 -> 212 (-31)
LDA #A000 ; 13 -> 225 (-18)
MOV_B,A ; 5 -> 230 (-13)
STA #8002 ; 13 -> 243/0* (START HERE)
ANA_C ; 4 -> 4
JNZ SET1 ; 10 -> 14
DI ; 4 -> 18**
JMP GO2 ; 10 -> 28
SET1:
EI ; 4 -> 18**
JMP GO2 ; 10 -> 28
\ COUNTER (4...50) OR STOP (0)
COUNT1: MOV_A,B ; 47+5 -> 52
ORA_A ; 4 -> 56
RZ ; 5(11) -> 61
COUNT2: MOV_A,B ; 61+5 -> 66
CMP_A ; 4 -> 70
RAR ; 4 -> 74
CMP_A ; 4 -> 78
RAR ; 4 -> 82
INR_A ; 5 -> 87
MVI_B, #FF ; 7 -> 94
MVI_B, 4 ; 7 -> 101
CLOOP: \ 15*4=60 -> 161
DCR_B ; 5
JNZ CLOOP ; 10
COUNTER: \ 161 (-81) *
NOP ; 4 -> 165 (-77)
DCR_A ; 5 -> 170 (-72)
JNZ COUNTER_ ; 10 -> 180 (-62)
SHLD #A001 ; 16 -> 196 (-46)
JMP GO0 ; 10 -> 206 (-36)
COUNTER_: \ 180
MVI_B, 3 ; 7 -> 187
JMP CLOOP ; 10 -> 197 (+15*3=242)
GO2:
MOV_A,B ; 5 -> 33
RLC ; 4 -> 37
JNC COUNT1 ; 10 -> 47
RLC ; 4 -> 51
JNC COUNT2 ; 10 -> 61
MOV_A,B ; 5 -> 66
RRC ; 4 -> 70
RRC ; 4 -> 74
STA #8002 ; 13 -> 87* (+6)
ANA_C ; 4 -> 91
JNZ SET2 ; 10 -> 101
DI ; 4 -> 105**
JMP GO3 ; 10 -> 115
SET2:
EI ; 4 -> 105**
MOV_A,H ; 5 -> 110
MOV_A,H ; 5 -> 115
GO3:
ORA_H ; 4 -> 119
JP NONEXTPG ; 10 -> 129
\ NEXT PAGE
INR_E ; 5 -> 5
MOV_A,E ; 5 -> 10
CPI #20 ; 7 -> 17
RZ ; 5(11) -> 23
STA #A002 ; 13 -> 36
ORI #80 ; 7 -> 43
STA #A002 ; 13 -> 56
LXI_H, 0 ; 10 -> 66
NONEXTPG:
SHLD #A001 ; 16 -> 145
MOV_A,B ; 5 -> 150
RRC ; 4 -> 154
RRC ; 4 -> 158
RRC ; 4 -> 162
RRC ; 4 -> 166
STA #8002 ; 13 -> 179* (+18)
ANA_C ; 4 -> 183
JNZ SET3 ; 10 -> 193
DI ; 4 -> 197*
JMP GO0 ; 10 -> 207
SET3:
EI ; 4 -> 197**
JMP GO0 ; 10 -> 207

Пока в слегка модифицированном эмуляторе Emu80 запускаюсь - играет :o

P.S. Как можно видеть я тут выдумал некую технологию сжатия, которая сжимает чиптюновую музыку в 2-3 раза по сравнению с непожатыми четырьмя сэмплами на байт - битрейт получается чуть меньше 15-20 килобит/сек при частоте 22050 Гц...

_________________
:eugeek: https://twitter.com/Shaos1973


30 Jan 2014 03:20
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15908
Location: Colorado
Reply with quote
Shaos wrote:
Как можно видеть я тут выдумал некую технологию сжатия, которая сжимает чиптюновую музыку в 2-3 раза по сравнению с непожатыми четырьмя сэмплами на байт - битрейт получается чуть меньше 15-20 килобит/сек при частоте 22050 Гц...


А вот обычная современная музыка сжимается не сильно хорошо:

Code:
01 - Gangnam Style.r8u3:
Uncompressed size - 1187823 bytes (215 seconds)
Compressed size - 823892 bytes (50% uncompressable) K=1.44
Bitrate - 29.9 kbit/sec


Но в 1-мегабайтный ROM-диск влезет ;)

P.S. Chiptunes сжимаются не в пример лучше:
Code:
Rolemusic_-_03_-_Crush_At_Maracas_Bar.r8u:
Uncompressed size - 1117007 bytes (202 seconds)
Compressed size - 354963 bytes (24% uncompressable) K=3.15
Bitrate - 13.7 kbit/sec

_________________
:eugeek: https://twitter.com/Shaos1973


30 Jan 2014 03:47
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 11:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Chiptunes сжимаются не в пример лучше

А что такое "Chiptunes" или "чиптюновая музыка"?

_________________
iLavr


30 Jan 2014 11:49
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15908
Location: Colorado
Reply with quote
Lavr wrote:
Shaos wrote:
Chiptunes сжимаются не в пример лучше

А что такое "Chiptunes" или "чиптюновая музыка"?


Поищи на ютюбе :)
Это всё то, что генерится старыми-добрыми музыкальными чипами с древних компов и консолей (тот же AY, SID и др.)
P.S. Нынче популярно играть чиптюновую музыку вживую на геймбоях через LSDJ ;)

_________________
:eugeek: https://twitter.com/Shaos1973


30 Jan 2014 12:04
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 11:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Но если это просто цифровая музыка, то чем она отличается
от "обычной современной музыки", раз уж у тебя так
наглядно получаются различия в сжатии?

_________________
iLavr


30 Jan 2014 12:35
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15908
Location: Colorado
Reply with quote
Post 
Lavr wrote:
Но если это просто цифровая музыка, то чем она отличается
от "обычной современной музыки", раз уж у тебя так
наглядно получаются различия в сжатии?


в чиптюнсах очень много прямоугольных импульсов, которые очень хорошо сжимаются RLE алгоритмом - один и тот же уровень сигнала (а у нас их четыре в случае 2 битов) сохраняется в течении энного количества временных интервалов

P.S. вообще можно пойти ещё дальше и кодировать не каждый отдельный импульс, а частоту - но тогда придётся входной сигнал в спектр фурье раскладывать и т.д.

_________________
:eugeek: https://twitter.com/Shaos1973


30 Jan 2014 12:55
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 11:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Shaos wrote:
в чиптюнсах очень много прямоугольных импульсов, которые очень хорошо сжимаются RLE алгоритмом - один и тот же уровень сигнала (а у нас их четыре в случае 2 битов) сохраняется в течении энного количества временных интервалов

А то, что ты в сравнении назвал "обычной современной музыкой" - это просто оцифрованный обычный звук?
В смысле - набор амплитуд отсчетов?

_________________
iLavr


30 Jan 2014 13:05
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15908
Location: Colorado
Reply with quote
Post 
Lavr wrote:
Shaos wrote:
в чиптюнсах очень много прямоугольных импульсов, которые очень хорошо сжимаются RLE алгоритмом - один и тот же уровень сигнала (а у нас их четыре в случае 2 битов) сохраняется в течении энного количества временных интервалов

А то, что ты в сравнении назвал "обычной современной музыкой" - это просто оцифрованный обычный звук?
В смысле - набор амплитуд отсчетов?


В современной музыке много шумовых эффектов - они фигово сжимаются

А так любой звук это набор амплитуд, оцифрованных с некоторой погрешностью ;)

_________________
:eugeek: https://twitter.com/Shaos1973


30 Jan 2014 13:08
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 11:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Shaos wrote:
А так любой звук это набор амплитуд, оцифрованных с некоторой погрешностью ;)

Да может статься, что и набор одинаковых амплитуд, но с разной длительностью,
поэтому и уточняю - что ты там в сравнении сжимал...

_________________
iLavr


30 Jan 2014 13:21
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15908
Location: Colorado
Reply with quote
Post 
Lavr wrote:
Shaos wrote:
А так любой звук это набор амплитуд, оцифрованных с некоторой погрешностью ;)

Да может статься, что и набор одинаковых амплитуд, но с разной длительностью,
поэтому и уточняю - что ты там в сравнении сжимал...


На входе у меня моно сигнал, сосотящий из 22050-герцовых отсчётов (т.е. длительность каждого отсчёта равна 1/22050=45.35 мкс), оцифрованных в 2 бита (4 уровня) - я иду от начала до конца и выявляю повторяющиеся элементы, кодируя вот таким макаром:
Code:
\ TWOBITS FORMAT:
\ ONE BYTE PLAYS 3 DIFFERENT 2-BIT SAMPLES
\ OR MAXIMUM 50 IDENTICAL 2-BIT SAMPLES
\ 00000000 - END OF STREAM
\ 0NNNNNBB - OUTPUT BB NNNNN+3 TIMES
\ 10NNNNBB - OUTPUT BB NNNN+35 TIMES
\ 11DDCCBB - OUTPUT BB THEN CC THEN DD

Кодируя неповторяющиеся элементы по три в байт, у которого два старших бита 11, а повторяющиеся указав кол-во повторений (от 4 до 50 - минус 3 в 6 бит, у которых старшие два бита никогда не равны 11) и непосредственно сам уровень сигнала (ещё 2 бита) - эдакий отвосьмибиченный RLE :)

И это даёт сжатие на реальных аудио-файлах в 1.5-4 раза (но чаще в пределах 2-3) по сравнению с обычной упаковкой "в лоб" - четыре 2-битовых отсчёта на байт...

_________________
:eugeek: https://twitter.com/Shaos1973


30 Jan 2014 13:25
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15908
Location: Colorado
Reply with quote
Post 
Аналогичным образом можно сжимать однобитный сигнал:
Code:
00000000 - конец стрима
0nnnnnnb - повторить b nnnnnn+7 раз (т.е. от 7 до 70)
1gfedcba - вывести подряд биты a,b,c,d,e,f,g

Если уходить на большее кол-во битов, то надо сразу идти на 4, т.к. 3 бита звучат не намного лучше 2-х - я просимулировал в Audacity. Плюс к этому из 16 возможных уровней при 4-х битах можно задействовать только 15 (0001...1111), чтобы иметь уровень нуля посередине (1000), а минимальное значение (0000) можно использовать как команду размножения: 0000bbbb nnnnnnnn - что будет значить повторить bbbb nnnnnnnn раз (от 1 до 256), а 00000000 всё также будет обозначать конец стрима...

_________________
:eugeek: https://twitter.com/Shaos1973


30 Jan 2014 23:03
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 11 posts ] 

Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.