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

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

Moderator: Shaos

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

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

Post by Shaos »

Shaos wrote:Алгоритм у меня был следующий - я брал 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
Shaos wrote:
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-х битного (но подозреваю, что сжимается оно сильно хуже)

...

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

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

Post by Shaos »

Shaos wrote:... а изначально эта AY музыка выглядела вот так (будучи смикшена в моно) - т.е. выше центральной линии и с забитой амплитудой:

Image
поэтому в Audacity пришлось специальным образом поработать с этим - нормализовать перед усилением и усилить с небольшим зашкалом...
Совсем забыл, что в январе я для сравнения пожал эту AY-песенку MMCM в 3 бита:


https://www.youtube.com/watch?v=h616rAIS0nw
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24078
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Повяилась возможность играть 2-битную музыку в онлайн-эмуляторе РК :)

https://86rk.ru/emulator/

Там надо в настройках включить "2-битный covox (PC1..0)" и подгружать rom-файл (Alt-R или Drag-n-Drop) далее выполняя

Code: Select all

R,FF
G
Прицепил 2 архива с rom-файлами в первое сообщение этого топика

P.S. Наткнулся тут на косячок своего конвертора 2014 года - если сжимать так:

./musconv Rolemusic_-_Savage_Steel_Fun_Club.r8u 256

т.е. оставляя место в начале 256 байт для плеера, то оно запинается в нескольких местах при проигрывании, однако если не делать отступ:

./musconv Rolemusic_-_Savage_Steel_Fun_Club.r8u

и далее переписывая плеер поверх начала песенки, то запинаний нет (но песенка получается со слегка отъеденным началом) - вобщем надо разбираться...

P.P.S. Причём интересно, что другие песенки замечательно конвертятся с отступом - видимо там какая-то особенность именно в данных приводит к косякам при сжатии...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24078
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Shaos wrote:Чуть иначе подготовил 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
...
а изначально эта AY музыка выглядела вот так (будучи смикшена в моно) - т.е. выше центральной линии и с забитой амплитудой:



поэтому в Audacity пришлось специальным образом поработать с этим - нормализовать перед усилением и усилить с небольшим зашкалом...
Всё-таки вариант от января 2014 года более "звучный":

Code: Select all

./musconv mmcm-when_you_were_a_hero.r8u 256
Offset:256
mmcm-when_you_were_a_hero.r8u:
Uncompressed size - 803234 bytes (145 seconds)
Compressed size - 339241 bytes (34% uncompressable) K=2.37
Bitrate - 18.2 kbit/sec
Time  32K - 25 seconds
Time 128K - 68 seconds
Прицепляю 2-битный ром-файл для прослушивания:
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24078
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Ещё один AY-шный музончик от MmcM, переконверченный мною в 2 бита ещё в январе 2014 года (но с обновлённым вчера проигрывателем):
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24078
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Ещё парочка AY-шных музончиков, сконверченных в 2-битные звуковые файлы в январе 2014 года (это не MmcM конечно, но пусть будет, раз уж есть):
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24078
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Парочка длинных no-copyright dub-step песенок, сконверченных в январе 2014 года:
Dub_Terminator-Native_people_dubstep_mix-2bit.7z
Dub_Terminator-Dope_magnets-2bit.7z
Плюс ещё прицепил качественного чиптюна из 2014 года в первом сообщении этого топика: viewtopic.php?f=93&t=10634
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
vital72
Senior
Posts: 181
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

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

Post by vital72 »

о, сколько всякого, утянул к себе на сервер
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
User avatar
Shaos
Admin
Posts: 24078
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Наверное пришло время позаниматься сжатием 3-битного звука:
Shaos wrote:Сжимать его можно по алгоритму аналогичному 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
Разные типы музыки, будучи преобразованными в 3 бита, имеют немножко разные гистограммы распределения повторяющихся амплитуд - например современная румынская попса имеет следующее распределение:

Code: Select all

[1]=385052 (13.58%)
[2]=178328 (12.58%)
[3]=100258 (10.61%)
[4]=58096 (8.20%)
[5]=38227 (6.74%)
[6]=26184 (5.54%)
[7]=18869 (4.66%)
[8]=13482 (3.80%)
[9]=9962 (3.16%)
[10]=7595 (2.68%)
[11]=6029 (2.34%)
[12]=4827 (2.04%)
[13]=3791 (1.74%)
[14]=3119 (1.54%)
[15]=2497 (1.32%)
[16]=2134 (1.20%)
[17]=1856 (1.11%)
[18]=1441 (0.91%)
[19]=1229 (0.82%)
[20]=1076 (0.76%)
[21]=947 (0.70%)
[22]=856 (0.66%)
[23]=690 (0.56%)
[24]=653 (0.55%)
[25]=599 (0.53%)
[26]=499 (0.46%)
[27]=501 (0.48%)
[28]=391 (0.39%)
[29]=332 (0.34%)
[30]=359 (0.38%)
[31]=319 (0.35%)
[32]=265 (0.30%)
[33]=268 (0.31%)
[34]=234 (0.28%)
[35]=213 (0.26%)
[36]=186 (0.24%)
[37]=195 (0.25%)
[38]=151 (0.20%)
[39]=162 (0.22%)
[40]=154 (0.22%)
[41]=142 (0.21%)
[42]=140 (0.21%)
[43]=137 (0.21%)
[44]=112 (0.17%)
[45]=127 (0.20%)
[46]=121 (0.20%)
[47]=106 (0.18%)
[48]=88 (0.15%)
[49]=98 (0.17%)
[50]=85 (0.15%)
...
песенка в стиле dubstep такое:

Code: Select all

[1]=912663 (15.89%)
[2]=435210 (15.16%)
[3]=220115 (11.50%)
[4]=125012 (8.71%)
[5]=75228 (6.55%)
[6]=48938 (5.11%)
[7]=34190 (4.17%)
[8]=24434 (3.40%)
[9]=17598 (2.76%)
[10]=13314 (2.32%)
[11]=9999 (1.92%)
[12]=8055 (1.68%)
[13]=6521 (1.48%)
[14]=5233 (1.28%)
[15]=4457 (1.16%)
[16]=3523 (0.98%)
[17]=2882 (0.85%)
[18]=2456 (0.77%)
[19]=2280 (0.75%)
[20]=1993 (0.69%)
[21]=1669 (0.61%)
[22]=1415 (0.54%)
[23]=1213 (0.49%)
[24]=1106 (0.46%)
[25]=902 (0.39%)
[26]=831 (0.38%)
[27]=695 (0.33%)
[28]=570 (0.28%)
[29]=535 (0.27%)
[30]=484 (0.25%)
[31]=435 (0.23%)
[32]=371 (0.21%)
[33]=341 (0.20%)
[34]=295 (0.17%)
[35]=283 (0.17%)
[36]=258 (0.16%)
[37]=248 (0.16%)
[38]=224 (0.15%)
[39]=188 (0.13%)
[40]=204 (0.14%)
[41]=200 (0.14%)
[42]=147 (0.11%)
[43]=146 (0.11%)
[44]=138 (0.11%)
[45]=124 (0.10%)
[46]=116 (0.09%)
[47]=110 (0.09%)
[48]=139 (0.12%)
[49]=96 (0.08%)
[50]=72 (0.06%)
...
а AY музончик от MmcM такое:

Code: Select all

[1]=329861 (10.27%)
[2]=86625 (5.39%)
[3]=44027 (4.11%)
[4]=29856 (3.72%)
[5]=22762 (3.54%)
[6]=19809 (3.70%)
[7]=16969 (3.70%)
[8]=14220 (3.54%)
[9]=13024 (3.65%)
[10]=13988 (4.35%)
[11]=11986 (4.10%)
[12]=12600 (4.71%)
[13]=8752 (3.54%)
[14]=6499 (2.83%)
[15]=5734 (2.68%)
[16]=7225 (3.60%)
[17]=4960 (2.62%)
[18]=4135 (2.32%)
[19]=3158 (1.87%)
[20]=3105 (1.93%)
[21]=3029 (1.98%)
[22]=1932 (1.32%)
[23]=1172 (0.84%)
[24]=2560 (1.91%)
[25]=2293 (1.78%)
[26]=796 (0.64%)
[27]=995 (0.84%)
[28]=941 (0.82%)
[29]=501 (0.45%)
[30]=416 (0.39%)
[31]=456 (0.44%)
[32]=776 (0.77%)
[33]=916 (0.94%)
[34]=312 (0.33%)
[35]=215 (0.23%)
[36]=326 (0.37%)
[37]=368 (0.42%)
[38]=183 (0.22%)
[39]=140 (0.17%)
[40]=165 (0.21%)
[41]=132 (0.17%)
[42]=123 (0.16%)
[43]=113 (0.15%)
[44]=101 (0.14%)
[45]=87 (0.12%)
[46]=64 (0.09%)
[47]=64 (0.09%)
[48]=81 (0.12%)
[49]=351 (0.54%)
[50]=171 (0.27%)
...
в-принципе, наверное можно единообразно их кодировать, просто представляя повторения вплоть до 25 короткими командами, а всё что больше кодировать в несколько байт: 25+N, 25+25+N и т.д.
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24078
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Пробую разные песенки - интересно, что некоторые неплохо звучат в 2 битах, а некоторые и в 3 имеют зашкал, шипение и свисты - скоро выкачу 3-битный декодер для РК с примерами :rotate:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24078
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
Ну или так:

Code: Select all

00000000 - конец стрима
00nnnnnb - повторить b nnnnn+7 раз (т.е. от 8 до 38)
01nnnmmm - повторить 0 nnn+4 раз (4...11) и далее 1 mmm+4 раз (4...11)
1gfedcba - вывести подряд биты a,b,c,d,e,f,g
(надо экспериментально подобрать константу для 01nnnmmm)

P.S. Не - надо первоначальный вариант делать т.к. намного быстрее вывести младший бит в любом случае (сразу при вычитке байта с квазидиска), а потом уже потихоньку разбираться какая это была команда...

P.P.S. Ну или добавить 2 команды вместо одной 01... - например 010nnnnb (повторить b nnnn+39 раз т.е. от 39 до 54) и 011nnmmb (повторить b nn+N раз и потом повторить ~b mm+N раз, где N=4 или какое-то другое экспериментально выбранное число)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24078
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Понабирал статистику для 1-битного сжатия 22050 Гц - вот песенка What If:

Code: Select all

ONEBIT STAT:
[1]=116894 (2.04%)
[2]=88834 (3.09%)
[3]=60692 (3.17%)
[4]=44493 (3.10%)
[5]=29798 (2.59%)
[6]=21371 (2.23%)
[7]=17700 (2.16%)
[8]=15879 (2.21%)
[9]=14122 (2.21%)
[10]=11584 (2.02%)
[11]=9327 (1.79%)
[12]=7835 (1.64%)
[13]=6565 (1.49%)
[14]=5947 (1.45%)
[15]=5877 (1.54%)
[16]=5268 (1.47%)
[17]=4411 (1.31%)
[18]=3847 (1.21%)
[19]=3454 (1.14%)
[20]=3305 (1.15%)
[21]=3166 (1.16%)
[22]=2839 (1.09%)
[23]=2598 (1.04%)
[24]=2272 (0.95%)
[25]=2050 (0.89%)
[26]=2055 (0.93%)
[27]=2090 (0.98%)
[28]=1844 (0.90%)
[29]=1874 (0.95%)
[30]=1790 (0.94%)
[31]=1741 (0.94%)
[32]=1620 (0.90%)
[33]=1339 (0.77%)
[34]=1217 (0.72%)
[35]=1258 (0.77%)
[36]=1227 (0.77%)
[37]=1056 (0.68%)
[38]=1113 (0.74%)
[39]=982 (0.67%)
[40]=1002 (0.70%)
[41]=956 (0.68%)
[42]=853 (0.62%)
[43]=803 (0.60%)
[44]=741 (0.57%)
[45]=676 (0.53%)
[46]=681 (0.55%)
[47]=628 (0.51%)
[48]=714 (0.60%)
[49]=627 (0.53%)
[50]=611 (0.53%)
[51]=535 (0.48%)
[52]=492 (0.45%)
[53]=533 (0.49%)
[54]=550 (0.52%)
[55]=440 (0.42%)
[56]=400 (0.39%)
[57]=386 (0.38%)
[58]=375 (0.38%)
[59]=371 (0.38%)
[60]=380 (0.40%)
[61]=405 (0.43%)
[62]=353 (0.38%)
[63]=350 (0.38%)
[64]=394 (0.44%)
[65]=377 (0.43%)
[66]=324 (0.37%)
[67]=280 (0.33%)
[68]=263 (0.31%)
[69]=250 (0.30%)
[70]=271 (0.33%)
[71]=291 (0.36%)
[72]=308 (0.39%)
[73]=292 (0.37%)
[74]=268 (0.35%)
[75]=253 (0.33%)
[76]=236 (0.31%)
[77]=249 (0.33%)
[78]=250 (0.34%)
[79]=199 (0.27%)
[80]=222 (0.31%)
[81]=253 (0.36%)
[82]=234 (0.33%)
[83]=210 (0.30%)
[84]=209 (0.31%)
[85]=190 (0.28%)
[86]=207 (0.31%)
[87]=192 (0.29%)
[88]=192 (0.29%)
[89]=157 (0.24%)
[90]=142 (0.22%)
[91]=119 (0.19%)
[92]=148 (0.24%)
[93]=148 (0.24%)
[94]=144 (0.24%)
[95]=149 (0.25%)
[96]=121 (0.20%)
[97]=134 (0.23%)
[98]=182 (0.31%)
[99]=175 (0.30%)
[100]=129 (0.22%)
[101]=125 (0.22%)
[102]=128 (0.23%)
[103]=140 (0.25%)
[104]=116 (0.21%)
[105]=135 (0.25%)
[106]=129 (0.24%)
[107]=158 (0.29%)
[108]=137 (0.26%)
[109]=143 (0.27%)
[110]=132 (0.25%)
[111]=117 (0.23%)
[112]=128 (0.25%)
[113]=108 (0.21%)
[114]=104 (0.21%)
[115]=124 (0.25%)
[116]=122 (0.25%)
[117]=126 (0.26%)
[118]=114 (0.23%)
[119]=109 (0.23%)
[120]=135 (0.28%)
[121]=112 (0.24%)
[122]=105 (0.22%)
[123]=117 (0.25%)
[124]=102 (0.22%)
[125]=122 (0.27%)
[126]=99 (0.22%)
[127]=106 (0.23%)
[128]=102 (0.23%)
[129]=123 (0.28%)
[130]=123 (0.28%)
[131]=156 (0.36%)
[132]=111 (0.26%)
[133]=93 (0.22%)
[134]=78 (0.18%)
[135]=58 (0.14%)
[136]=61 (0.14%)
[137]=58 (0.14%)
[138]=63 (0.15%)
[139]=79 (0.19%)
[140]=57 (0.14%)
[141]=68 (0.17%)
[142]=65 (0.16%)
[143]=59 (0.15%)
[144]=71 (0.18%)
[145]=78 (0.20%)
[146]=80 (0.20%)
[147]=77 (0.20%)
[148]=74 (0.19%)
[149]=68 (0.18%)
[150]=73 (0.19%)
[151]=52 (0.14%)
[152]=54 (0.14%)
[153]=56 (0.15%)
[154]=68 (0.18%)
[155]=65 (0.18%)
[156]=62 (0.17%)
[157]=68 (0.19%)
[158]=49 (0.13%)
[159]=56 (0.16%)
[160]=44 (0.12%)
[161]=53 (0.15%)
[162]=42 (0.12%)
[163]=50 (0.14%)
[164]=55 (0.16%)
[165]=42 (0.12%)
[166]=47 (0.14%)
[167]=52 (0.15%)
[168]=36 (0.11%)
[169]=30 (0.09%)
[170]=32 (0.09%)
[171]=20 (0.06%)
[172]=31 (0.09%)
[173]=34 (0.10%)
[174]=33 (0.10%)
[175]=38 (0.12%)
[176]=23 (0.07%)
[177]=27 (0.08%)
[178]=19 (0.06%)
[179]=16 (0.05%)
[180]=16 (0.05%)
[181]=25 (0.08%)
[182]=17 (0.05%)
[183]=13 (0.04%)
[184]=16 (0.05%)
[185]=21 (0.07%)
[186]=21 (0.07%)
[187]=15 (0.05%)
[188]=10 (0.03%)
[189]=10 (0.03%)
[190]=13 (0.04%)
[191]=13 (0.04%)
[192]=12 (0.04%)
[193]=12 (0.04%)
[194]=17 (0.06%)
[195]=18 (0.06%)
[196]=15 (0.05%)
[197]=7 (0.02%)
[198]=19 (0.07%)
[199]=19 (0.07%)
[200]=14 (0.05%)
...
Это по длительностям неизменных состояний 0 или 1

А вот статистика пар (когда идёт сначала много единиц, а потом много нулей, и наоборот - в количестве до 13):

Code: Select all

PAIRSTAT:
[1]  24393  39670  24014  19754  14447  10054 *7410 *5732 *5245 *4661 *3850 *3592 *3027
[2]  0      14541  20545  16715  10914 *6685  *4865 *4302 *3847 *3399 *2858 *2374 *1742
[3]  0      0      8304   11957 *6943  *4325  *3712 *3311 *2894 *2478 *1902 *1376 *1233
[4]  0      0      0     *3774  *4360  *3341  *2800 *2438 *2192 *1598 *1191 *980  *930
[5]  0      0      0      0     *1446  *2089  *1869 *1639 *1465 *1110 *867  *790  *682
[6]  0      0      0      0      0     *898   *1642 *1375 *1098 *851  *720  *616  *548
[7]  0      0      0      0      0      0     *650  *1249 *1105 *828  *753  *631  *476
[8]  0      0      0      0      0      0      0    *604  *1237 *995  *771  *597  *488
[9]  0      0      0      0      0      0      0     0    *599  *919  *621  *485  *445
[10] 0      0      0      0      0      0      0     0     0    *333  *563  *441  *350
[11] 0      0      0      0      0      0      0     0     0     0    *213  *384  *291
[12] 0      0      0      0      0      0      0     0     0     0     0    *154  *231
[13] 0      0      0      0      0      0      0     0     0     0     0     0    *76

1) [1,7] 7410 <
2) [3,5] 6943 <
3) [2,6] 6685 <
4) [1,8] 5732 <
5) [1,9] 5245 <
6) [2,7] 4865 <
7) [1,10] 4661 <
8) [4,5] 4360 <
9) [3,6] 4325 <
10) [2,8] 4302 <
11) [1,11] 3850 <
12) [2,9] 3847 <
13) [4,4] 3774 <
14) [3,7] 3712 <
15) [1,12] 3592 <
16) [2,10] 3399 <
17) [4,6] 3341
18) [3,8] 3311
19) [1,13] 3027
20) [3,9] 2894
Это я хочу наиболее частые пары (общая сумма длительностей которых больше 7 сэмплов) одним байтом кодировать - будет полбайта на длительность:

Команда 01xnnnnb где x будет означать при 1 большее вперёд, меньшее назад, а при 0 меньшее вперёд, большее назад, и nnnn кодировать например так (пометил сверху значками < те пары, что выбрал):

Code: Select all

0000 - 1,7
0001 - 1,8
0010 - 1,9
0011 - 1,10
0100 - 1,11
0101 - 1,12
0110 - 2,6
0111 - 2,7
1000 - 2,8
1001 - 2,9
1010 - 2,10
1011 - 3,5
1100 - 3,6
1101 - 3,7
1110 - 4,4
1111 - 4,5
т.е. например кодирование "0000 - 1,7" будет иметь 4 варианта использования:
  • 01000001 будет означать 1 раз "1" и затем 7 раз "0"
  • 01000000 будет означать 1 раз "0" и затем 7 раз "1"
  • 01100000 будет означать 7 раз "0" и затем 1 раз "1"
  • 01100001 будет означать 7 раз "1" и затем 1 раз "0"
А остальные команды будут как описано выше:
1gfedcba - вывести подряд биты a,b,c,d,e,f,g
00nnnnnb - повторить b nnnnn+7 раз (т.е. от 8 до 38)
0000000x - конец стрима (это как бы предыдущая команда при nnnnn=0)

P.S. Это должно быть компактнее, чем просто повторения до 70 кодировать одним байтом:

Code: Select all

...
[39]=982 (0.67%)
[40]=1002 (0.70%)
[41]=956 (0.68%)
[42]=853 (0.62%)
[43]=803 (0.60%)
[44]=741 (0.57%)
[45]=676 (0.53%)
[46]=681 (0.55%)
[47]=628 (0.51%)
[48]=714 (0.60%)
[49]=627 (0.53%)
[50]=611 (0.53%)
[51]=535 (0.48%)
[52]=492 (0.45%)
[53]=533 (0.49%)
[54]=550 (0.52%)
[55]=440 (0.42%)
[56]=400 (0.39%)
[57]=386 (0.38%)
[58]=375 (0.38%)
[59]=371 (0.38%)
[60]=380 (0.40%)
[61]=405 (0.43%)
[62]=353 (0.38%)
[63]=350 (0.38%)
[64]=394 (0.44%)
[65]=377 (0.43%)
[66]=324 (0.37%)
[67]=280 (0.33%)
[68]=263 (0.31%)
[69]=250 (0.30%)
[70]=271 (0.33%)
...
Как минимум чисто статистически на примере этой конкретной песенки:
Screenshot from 2024-09-17 18-49-42.png
т.е. теперь длительности от 39 до 70 будут представляться 2 байтами, а не одним, что выльется в дополнительные 17003 байтов, а кодирование пар займёт 76702 байта вместо ориентировочных 152 тысяч (когда каждая половинка пары будет кодироваться отдельным байтом либо будет частью 7-битной посылки), т.е. мы так экономим почти 60 килобайт...

P.P.S. Покрытие парных длительностей получается следующее (с учётом перестановки местами):

Code: Select all

   x=  1  2  3  4  5  6  7  8  9 10 11 12 13
[1,x]                    *  *  *  *  *  *
[2,x]                 *  *  *  *  *
[3,x]              *  *  *
[4,x]           *  *
[5,x]        *  *
[6,x]     *  *
[7,x]  *  *  *
[8,x]  *  *
[9,x]  *  *
[10,x] *  *
[11,x] *
[12,x] *
[13,x] 
Тут получается вариант [4,4] при перестановке также выдаёт [4,4] т.е. можно эту вторую комбинацию отдать под что-то другое - например 0111110b будет маркером конца стрима (с выводом последнего отсчёта b), а 0000000x отдать полностью под кодирование длительностей (т.е. вместо nnnnn+7 сделать nnnnn+8 покрывая длительности от 8 до 39)?

P.P.P.S. Либо отдать второй код [4,4] под одну из следующих по частоте комбинаций, например [13,1] - при этом правда потеряется симметричность покрытия, но зато покроется больше вариантов ... ну или [5,5] для симметричности...

P.P.P.P.S. А может быть вообще сделать адаптивное кодирование? У разных звуковых файлов разное распределение пар и во многих случаях ещё есть непокрытые пары, которых больше, чем повторений на 38 или 37 отсчётов например - т.е. получается выгоднее отдать конец диапазона повторений в команде 00nnnnnb тоже под пары - а вот насколько отдать это надо смотреть для каждого конкретного файла...
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24078
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Планирую написать конвертер, который будет выдавать сразу 3 формата - 1-битный, 2-битный и 3-битный.
На входе пока сделаю поддержку монофонических 8-битных RAW-форматов (со знаком .r8s и без знака .r8u).
Типа ./rkmus123 xxx.r8s выдаст 3 файла для проверки в Audacity - xxx.r8u1, xxx.r8u2, xxx.r8u3 (8-битные RAW-файлы cоответственно с 2 уровнями, 4 уровнями и 9 уровнями громкости) и 3 ROM-образа: xxx-1bit.rom, xxx-2bit.rom и xxx-3bit.rom (со встроенными проигрывателями через N-битный COVOX).

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