Написал я тут мимоходом проигрыватель двухбитного звука с ROM-диска (мой формат до 1 МБ) - старший бит берётся с INTE, а младший - выход мафона C0 клавиатурной ВВ55 (ну или два младших бита порта C клавиатурной ВВ55 можно задействовать - звук будет чуть почище - плеер умеет и так, и эдак):
Code:
\ *************************************** \ * 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
\ 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
Пока в слегка модифицированном эмуляторе Emu80 запускаюсь (там 2-битный звук и квазидиск добавлен) - играет
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
Как можно видеть я тут выдумал некую технологию сжатия, которая сжимает чиптюновую музыку в 2-3 раза по сравнению с непожатыми четырьмя сэмплами на байт - битрейт получается чуть меньше 15-20 килобит/сек при частоте 22050 Гц...
А вот обычная современная музыка сжимается не сильно хорошо:
Поищи на ютюбе
Это всё то, что генерится старыми-добрыми музыкальными чипами с древних компов и консолей (тот же AY, SID и др.)
P.S. Нынче популярно играть чиптюновую музыку вживую на геймбоях через LSDJ
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
Но если это просто цифровая музыка, то чем она отличается
от "обычной современной музыки", раз уж у тебя так
наглядно получаются различия в сжатии?
_________________ iLavr
30 Jan 2014 09:35
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23357 Location: Silicon Valley
Lavr wrote:
Но если это просто цифровая музыка, то чем она отличается от "обычной современной музыки", раз уж у тебя так наглядно получаются различия в сжатии?
в чиптюнсах очень много прямоугольных импульсов, которые очень хорошо сжимаются RLE алгоритмом - один и тот же уровень сигнала (а у нас их четыре в случае 2 битов) сохраняется в течении энного количества временных интервалов
P.S. вообще можно пойти ещё дальше и кодировать не каждый отдельный импульс, а частоту - но тогда придётся входной сигнал в спектр фурье раскладывать и т.д.
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
Shaos wrote:
в чиптюнсах очень много прямоугольных импульсов, которые очень хорошо сжимаются RLE алгоритмом - один и тот же уровень сигнала (а у нас их четыре в случае 2 битов) сохраняется в течении энного количества временных интервалов
А то, что ты в сравнении назвал "обычной современной музыкой" - это просто оцифрованный обычный звук?
В смысле - набор амплитуд отсчетов?
_________________ iLavr
30 Jan 2014 10:05
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23357 Location: Silicon Valley
Lavr wrote:
Shaos wrote:
в чиптюнсах очень много прямоугольных импульсов, которые очень хорошо сжимаются RLE алгоритмом - один и тот же уровень сигнала (а у нас их четыре в случае 2 битов) сохраняется в течении энного количества временных интервалов
А то, что ты в сравнении назвал "обычной современной музыкой" - это просто оцифрованный обычный звук? В смысле - набор амплитуд отсчетов?
В современной музыке много шумовых эффектов - они фигово сжимаются
А так любой звук это набор амплитуд, оцифрованных с некоторой погрешностью
На входе у меня моно сигнал, сосотящий из 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-битовых отсчёта на байт...
Joined: 08 Jan 2003 23:22 Posts: 23357 Location: Silicon Valley
Аналогичным образом можно сжимать однобитный сигнал:
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 всё также будет обозначать конец стрима...
В неидеальных условиях (если не отключать ПДП на РК, чтобы на экране хоть что-то отображалось) будут искажения - т.к. биты выдаются не одномоментно и ПДП будет мешать...
P.S. Вообще 10 лет назад я подготовил 18 треков (отсортировано по времени создания):
Алгоритм у меня был следующий - я брал MP3 файл и загружал его в Audacity где сливал 2 канала стерео в один моно 44100 Гц и по максимуму усиливал без зашкаливания, чтобы динамический диапазон не растрачивался попусту - в таком виде я сохранял 8-bit signed RAW-файл с расширением .r8s который скармливался первой программке, которая усредняла отсчёты по два (чтобы получить 22050 Гц из 44100 Гц) и подменяла получившиеся уровни по следующей слегка логарифмической шкале:
и это всё сохранялось как unsigned 8-bit RAW-файл 22050 Гц с расширением .r8u (тут только 4 уровня сигнала было, но его всё ещё можно было проиграть в Audacity как показано на видео выше), ну и далее с помощью ещё одной программки происходило сжатие в .bin в описанном в начале топика формате TWOBITS:
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
Аналогичным образом можно сжимать однобитный сигнал:
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 всё также будет обозначать конец стрима...
Ну или 0000nnnn будет означать повторить последний уровень nnnn+3 раз (от 3 до 18)
Я тут аккуратно поработал с 3-х битным вариантом и получил более-менее приемлемый результат, который заведомо лучше 2-х битного (но подозреваю, что сжимается оно сильно хуже):
Сжимать его можно по алгоритму аналогичному TWOBITS:
Code:
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 раз...
Users browsing this forum: No registered users and 2 guests
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