[ASM] Проигрыватели 1/2/3-битного звука для РК86 + кодер

Советский компьютер Радио-86РК (1986) и его клоны

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

[ASM] Проигрыватели 1/2/3-битного звука для РК86 + кодер

Post by Shaos »

Написал я тут мимоходом проигрыватель двухбитного звука с ROM-диска (мой формат до 1 МБ) - старший бит берётся с INTE, а младший - выход мафона C0 клавиатурной ВВ55 (ну или два младших бита порта C клавиатурной ВВ55 можно задействовать - звук будет чуть почище - плеер умеет и так, и эдак):

Code: Select all

\ ***************************************
\ *  TWOBITS PLAYER FOR RK-86 BY SHAOS  *
\ *    THIS CODE IS PUBLIC DOMAIN !!!   *
\ *-------------------------------------*
\ * CREATED JAN 2014 | UPDATED SEP 2024 *
\ ***************************************
\ 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 (#FF MAX)
TWOBITS: MVI_A, #80
STA #E008
XRA_A
STA #A002
MOV_A,E
STA #A001
MVI_A, #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
NOP ; DI ; 4 -> 18**
JMP GO2 ; 10 -> 28
SET1:
NOP ; 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
NOP ; DI ; 4 -> 105**
JMP GO3 ; 10 -> 115
SET2:
NOP ; 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
XRA_A
STA #A002
MOV_A,E
STA #A001
MVI_A, #80
STA #A002
LXI_H, 0
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
NOP ; DI ; 4 -> 197*
JMP GO0 ; 10 -> 207
SET3:
NOP ; EI ; 4 -> 197**
JMP GO0 ; 10 -> 207
Пока в слегка модифицированном эмуляторе Emu80 запускаюсь (там 2-битный звук и квазидиск добавлен) - играет :o

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

P.P.S. В сентябре 2024 года слегка поправил исходник, чтобы работало с ромдиском по схеме vinxru и закомментил EI/DI (точнее заменил на NOP-ы) - пусть играет только через C1-C0 (эдакий двухбитный ковокс получается). Эти rom-ы надо кидать в онлайн эмулятор от vital72 где включён в настройках 2-битный covox (PC1..0) и запускать на исполнение командами R,FF и G
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: [ASM] Проигрыватель 2-битного звука для РК-86

Post by Shaos »

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

Code: Select all

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: Select all

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
это уже порядка 10 минут музыки в 1 мегабайте :o
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: [ASM] Проигрыватель 2-битного звука для РК-86

Post by Lavr »

Shaos wrote:Chiptunes сжимаются не в пример лучше
А что такое "Chiptunes" или "чиптюновая музыка"?
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: [ASM] Проигрыватель 2-битного звука для РК-86

Post by Shaos »

Lavr wrote:
Shaos wrote:Chiptunes сжимаются не в пример лучше
А что такое "Chiptunes" или "чиптюновая музыка"?
Поищи на ютюбе :)
Это всё то, что генерится старыми-добрыми музыкальными чипами с древних компов и консолей (тот же AY, SID и др.)
P.S. Нынче популярно играть чиптюновую музыку вживую на геймбоях через LSDJ ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Но если это просто цифровая музыка, то чем она отличается
от "обычной современной музыки", раз уж у тебя так
наглядно получаются различия в сжатии?
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Lavr wrote:Но если это просто цифровая музыка, то чем она отличается
от "обычной современной музыки", раз уж у тебя так
наглядно получаются различия в сжатии?
в чиптюнсах очень много прямоугольных импульсов, которые очень хорошо сжимаются RLE алгоритмом - один и тот же уровень сигнала (а у нас их четыре в случае 2 битов) сохраняется в течении энного количества временных интервалов

P.S. вообще можно пойти ещё дальше и кодировать не каждый отдельный импульс, а частоту - но тогда придётся входной сигнал в спектр фурье раскладывать и т.д.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos wrote:в чиптюнсах очень много прямоугольных импульсов, которые очень хорошо сжимаются RLE алгоритмом - один и тот же уровень сигнала (а у нас их четыре в случае 2 битов) сохраняется в течении энного количества временных интервалов
А то, что ты в сравнении назвал "обычной современной музыкой" - это просто оцифрованный обычный звук?
В смысле - набор амплитуд отсчетов?
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Lavr wrote:
Shaos wrote:в чиптюнсах очень много прямоугольных импульсов, которые очень хорошо сжимаются RLE алгоритмом - один и тот же уровень сигнала (а у нас их четыре в случае 2 битов) сохраняется в течении энного количества временных интервалов
А то, что ты в сравнении назвал "обычной современной музыкой" - это просто оцифрованный обычный звук?
В смысле - набор амплитуд отсчетов?
В современной музыке много шумовых эффектов - они фигово сжимаются

А так любой звук это набор амплитуд, оцифрованных с некоторой погрешностью ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos wrote:А так любой звук это набор амплитуд, оцифрованных с некоторой погрешностью ;)
Да может статься, что и набор одинаковых амплитуд, но с разной длительностью,
поэтому и уточняю - что ты там в сравнении сжимал...
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Lavr wrote:
Shaos wrote:А так любой звук это набор амплитуд, оцифрованных с некоторой погрешностью ;)
Да может статься, что и набор одинаковых амплитуд, но с разной длительностью,
поэтому и уточняю - что ты там в сравнении сжимал...
На входе у меня моно сигнал, сосотящий из 22050-герцовых отсчётов (т.е. длительность каждого отсчёта равна 1/22050=45.35 мкс), оцифрованных в 2 бита (4 уровня) - я иду от начала до конца и выявляю повторяющиеся элементы, кодируя вот таким макаром:

Code: Select all

\ 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-битовых отсчёта на байт...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Аналогичным образом можно сжимать однобитный сигнал:

Code: Select all

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 всё также будет обозначать конец стрима...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: [ASM] Проигрыватель 2-битного звука для РК-86

Post by Shaos »

Если через 10 лет кому-то вдруг стало интересно, как в идеальных условиях может звучать 2-битная музыка 22050 Гц, то вот вам живой пример :lol:


https://youtu.be/S9ven10lhnA

В неидеальных условиях (если не отключать ПДП на РК, чтобы на экране хоть что-то отображалось) будут искажения - т.к. биты выдаются не одномоментно и ПДП будет мешать...

P.S. Вообще 10 лет назад я подготовил 18 треков (отсортировано по времени создания):

Code: Select all

-rw-r--r-- 1 shaos shaos 4468031 2014-01-14 20:32:23.000000000 -0800 Rolemusic_-_03_-_Crush_At_Maracas_Bar.r8u
-rw-r--r-- 1 shaos shaos 1695744 2014-01-14 20:43:10.000000000 -0800 Noisewaves_-_09_-_Last_Xmas.r8u
-rw-r--r-- 1 shaos shaos 7363008 2014-01-14 20:54:14.000000000 -0800 Dub_Terminator_-_03_-_Dope_magnets.r8u
-rw-r--r-- 1 shaos shaos 7062336 2014-01-14 21:08:25.000000000 -0800 Dub_Terminator_-_02_-_Native_people_dubstep_mix.r8u
-rw-r--r-- 1 shaos shaos 4267584 2014-01-14 21:17:07.000000000 -0800 EvilWezil_-_03_-_Carol_of_the_Bells.r8u
-rw-r--r-- 1 shaos shaos 2854656 2014-01-14 21:27:23.000000000 -0800 RoccoW_-_Create_A_Song_in_A_Day_Challenge_1.r8u
-rw-r--r-- 1 shaos shaos 5417280 2014-01-14 21:32:15.000000000 -0800 Rolemusic_-_Savage_Steel_Fun_Club.r8u
-rw-r--r-- 1 shaos shaos 5633280 2014-01-15 00:15:31.000000000 -0800 01 - It's A Rainy Day.r8u
-rw-r--r-- 1 shaos shaos 4291200 2014-01-15 00:21:46.000000000 -0800 01 - Gentleman.r8u
-rw-r--r-- 1 shaos shaos 5367168 2014-01-15 00:27:25.000000000 -0800 02 - Scary Monsters And Nice Sprites.r8u
-rw-r--r-- 1 shaos shaos 4217472 2014-01-15 00:31:30.000000000 -0800 01 - Cinema (feat. Gary Go) (Skrillex Radio Edit).r8u
-rw-r--r-- 1 shaos shaos 4841280 2014-01-15 00:39:24.000000000 -0800 01 - Gangnam Style.r8u
-rw-r--r-- 1 shaos shaos 3798144 2014-01-17 02:32:50.000000000 -0800 kakos_nonos-gummy_stub.r8u
-rw-r--r-- 1 shaos shaos 3212936 2014-01-17 02:43:53.000000000 -0800 mmcm-when_you_were_a_hero.r8u
-rw-r--r-- 1 shaos shaos 4052168 2014-01-17 02:51:52.000000000 -0800 mmcm-summer_night.r8u
-rw-r--r-- 1 shaos shaos 1977416 2014-01-17 03:19:04.000000000 -0800 hacker_vbi_rva-together.r8u
-rw-r--r-- 1 shaos shaos 4713984 2014-01-18 00:44:41.000000000 -0800 01 - The Fox (What Does The Fox Say_).r8u
-rw-r--r-- 1 shaos shaos 5742720 2014-01-18 02:11:59.000000000 -0800 02 - What If.r8u
из которых сделал 15 сжатых блобов (надо досжимать остатки):

Code: Select all

-rw-r--r-- 1 shaos shaos  339242 2014-01-29 23:21:05.000000000 -0800 mmcm-when_you_were_a_hero.bin
-rw-r--r-- 1 shaos shaos  443983 2014-01-29 23:21:30.000000000 -0800 Rolemusic_-_Savage_Steel_Fun_Club.bin
-rw-r--r-- 1 shaos shaos  785409 2014-01-29 23:27:41.000000000 -0800 01 - Gentleman.bin
-rw-r--r-- 1 shaos shaos  355220 2014-01-29 23:31:59.000000000 -0800 Rolemusic_-_03_-_Crush_At_Maracas_Bar.bin
-rw-r--r-- 1 shaos shaos  824149 2014-01-29 23:40:49.000000000 -0800 01 - Gangnam Style.bin
-rw-r--r-- 1 shaos shaos  483943 2014-01-29 23:47:10.000000000 -0800 mmcm-summer_night.bin
-rw-r--r-- 1 shaos shaos  188315 2014-01-29 23:57:26.000000000 -0800 hacker_vbi_rva-together.bin
-rw-r--r-- 1 shaos shaos  137275 2014-01-29 23:59:34.000000000 -0800 kakos_nonos-gummy_stub.bin
-rw-r--r-- 1 shaos shaos  267861 2014-01-30 00:09:06.000000000 -0800 RoccoW_-_Create_A_Song_in_A_Day_Challenge_1.bin
-rw-r--r-- 1 shaos shaos  230324 2014-01-30 00:16:49.000000000 -0800 RoccoW_-_Create_A_Song_in_A_Day_Challenge_3.bin
-rw-r--r-- 1 shaos shaos  239276 2014-01-30 00:17:15.000000000 -0800 Noisewaves_-_09_-_Last_Xmas.bin
-rw-r--r-- 1 shaos shaos  967334 2014-01-30 16:29:59.000000000 -0800 01 - The Fox (What Does The Fox Say_).bin
-rw-r--r-- 1 shaos shaos 1038762 2014-01-30 16:35:16.000000000 -0800 Dub_Terminator_-_03_-_Dope_magnets.bin
-rw-r--r-- 1 shaos shaos 1542514 2014-01-30 16:49:05.000000000 -0800 Dub_Terminator_-_02_-_Native_people_dubstep_mix.bin
-rw-r--r-- 1 shaos shaos  707019 2014-01-30 16:54:58.000000000 -0800 EvilWezil_-_03_-_Carol_of_the_Bells.bin
и как можно видеть в 1 мег не влезает только Dub_Terminator_-_02_-_Native_people_dubstep_mix, который 5 мин 20 сек длиной (и плохо сжимается)...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: [ASM] Проигрыватель 2-битного звука для РК-86

Post by Shaos »

Алгоритм у меня был следующий - я брал MP3 файл и загружал его в Audacity где сливал 2 канала стерео в один моно 44100 Гц и по максимуму усиливал без зашкаливания, чтобы динамический диапазон не растрачивался попусту - в таком виде я сохранял 8-bit signed RAW-файл с расширением .r8s который скармливался первой программке, которая усредняла отсчёты по два (чтобы получить 22050 Гц из 44100 Гц) и подменяла получившиеся уровни по следующей слегка логарифмической шкале:

Code: Select all

   if(k<-32) k=0x20;     // -128..-33  ---> 0x20
   else if(k<0) k=0x60;  //  -32..-1   ---> 0x60
   else if(k<32) k=0xA0; //    0..+31  ---> 0xA0
   else k=0xE0;          //  +32..+127 ---> 0xE0
и это всё сохранялось как unsigned 8-bit RAW-файл 22050 Гц с расширением .r8u (тут только 4 уровня сигнала было, но его всё ещё можно было проиграть в Audacity как показано на видео выше), ну и далее с помощью ещё одной программки происходило сжатие в .bin в описанном в начале топика формате TWOBITS:

Code: Select all

\ 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
P.S. Дожимаю недожатое:

Code: Select all

$ ./musconv 02\ -\ What\ If.r8u
02 - What If.r8u:
Uncompressed size - 1435680 bytes (260 seconds)
Compressed size - 955197 bytes (44% uncompressable) K=1.50
Bitrate - 28.7 kbit/sec
Time  32K - 16 seconds
Time 128K - 45 seconds
Time 512K - 170 seconds

$ ./musconv 02\ -\ Scary\ Monsters\ And\ Nice\ Sprites.r8u
02 - Scary Monsters And Nice Sprites.r8u:
Uncompressed size - 1341792 bytes (243 seconds)
Compressed size - 883283 bytes (39% uncompressable) K=1.52
Bitrate - 28.4 kbit/sec
Time  32K - 13 seconds
Time 128K - 43 seconds
Time 512K - 156 seconds

$ ./musconv 01\ -\ Cinema\ \(feat.\ Gary\ Go\)\ \(Skrillex\ Radio\ Edit\).r8u
01 - Cinema (feat. Gary Go) (Skrillex Radio Edit).r8u:
Uncompressed size - 1054368 bytes (191 seconds)
Compressed size - 777758 bytes (44% uncompressable) K=1.36
Bitrate - 31.8 kbit/sec
Time  32K - 10 seconds
Time 128K - 39 seconds
Time 512K - 142 seconds

$ ./musconv 01\ -\ It\'s\ A\ Rainy\ Day.r8u
01 - It's A Rainy Day.r8u:
Uncompressed size - 1408320 bytes (255 seconds)
Compressed size - 648033 bytes (33% uncompressable) K=2.17
Bitrate - 19.8 kbit/sec
Time  32K - 16 seconds
Time 128K - 61 seconds
Time 512K - 236 seconds
(чото килобитность похоже неправильно считается для вывода - надо будет поглядеть исходник повнимательнее)

Code: Select all

-rw-r--r-- 1 shaos shaos 955198 Jan  9 00:43 '02 - What If.bin'
-rw-r--r-- 1 shaos shaos 883284 Jan  9 00:45 '02 - Scary Monsters And Nice Sprites.bin'
-rw-r--r-- 1 shaos shaos 777759 Jan  9 00:51 '01 - Cinema (feat. Gary Go) (Skrillex Radio Edit).bin'
-rw-r--r-- 1 shaos shaos 648034 Jan  9 00:56 '01 - It's A Rainy Day.bin'
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: [ASM] Проигрыватель 2-битного звука для РК-86

Post by Shaos »

Чуть иначе подготовил AY-музычку и пережал в TWOBITS:

Code: Select all

./musconv mmcm-when_you_were_a_hero_2024.r8u 256
Offset:256
mmcm-when_you_were_a_hero_2024.r8u:
Uncompressed size - 803232 bytes (145 seconds)
Compressed size - 284583 bytes (36% uncompressable) K=2.82
Bitrate - 15.3 kbit/sec
Time  32K - 32 seconds
Time 128K - 85 seconds

https://www.youtube.com/watch?v=_x31iRncCSQ


а изначально эта AY музыка выглядела вот так (будучи смикшена в моно) - т.е. выше центральной линии и с забитой амплитудой:
Screenshot from 2024-01-09 02-09-29.png
поэтому в Audacity пришлось специальным образом поработать с этим - нормализовать перед усилением и усилить с небольшим зашкалом...
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re:

Post by Shaos »

Shaos wrote:Аналогичным образом можно сжимать однобитный сигнал:

Code: Select all

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 всё также будет обозначать конец стрима...
Ну или 0000nnnn будет означать повторить последний уровень nnnn+3 раз (от 3 до 18)

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


https://www.youtube.com/watch?v=Yw50rVFiMRs

Сжимать его можно по алгоритму аналогичному TWOBITS:

Code: Select all

00000xxx - конец потока
0nnnnBBB - повторить BBB nnnn+2 раз (3,4,5,6,7,8,9,10,11,12,13,14,15,16,17)
10nnnBBB - повторить BBB nnn+18 раз (18,19,20,21,22,23,24,25) 
11CCCBBB - вывести BBB потом CCC
Я тут поначалу хотел второе число с шагом 2 сделать (типа 18,20,22 и т.д.), но потом посмотрел на гистограммы распределения номеров повторений и понял, что наиболее используемые повторения всегда кучкуются в меньших номерах, соответственно лучше покрыть без дырок столько номеров начиная с самых меньших, сколько возможно, а остальные представлять несколькими повторениями. Можно прикинуть какие закономерности там ещё есть кроме повторения - может удастся что-то "поумнее" сделать - типа минус 1 и продолжить N раз или плюс 1 и продолжить N раз...
Я тут за главного - если что шлите мыло на me собака shaos точка net