NeoGS for 32-channel XM, IT, S3M

NeoGS software and hardware

Postby lvd » 19 Apr 2010, 19:05

TS-Labs wrote:Могу согласиться с тем сомнительным аргументом, что ГС можно юзать как сопроцессор

Как показала дема на ЦЦ, НГС уже вполне можно юзать, как нехилый сопроцессор. В отличие от олдгс.
TS-Labs wrote:на совместимость (на уровне интерфейса ГС) это не повлияет

Интерфейс ГС это не только загрузка модов и команды играть-неиграть, это ещё загрузка Z80 кода и его выполнение. Именно из-за этого была выбрана с самого начала аппаратная совместимость и Z80 в НГС.

TS-Labs wrote:и если писать для АВР

А если писать для АРМа? ;-)


TS-Labs wrote:Я не очень знаю возможности ФПГА

TS-Labs wrote:Прошивку для ФПГА я тоже собираюсь писать сам.

Ниосилил. Ты знаешь verilog/VHLD? Умеешь сделать на fpga хотя бы мигание светодиодиком?

TS-Labs wrote:- собственный доступ к памяти с целью чтения 44100 раз в секунду байта (или 2 байт - 16битные инструменты)

такое уже почти сделано, точнее сделаны механизмы DMA, к которым можно прикрутить выбиратор по конкретным адресам.
TS-Labs wrote:- увеличивать значение адреса на дробную величину (1 байт до запятой и 2 после) - обычный 24 битный сумматор (2 байта для "суб-адреса")

Это не проблема, но может не хватить фпга на хранение 32 таких счётчиков. Но возможны варианты, конечно, с извратами :)
TS-Labs wrote:- интерполяция (алгоритм прост как двери, но требуется апаратное умножение)

Можно формулу с указанием битности аргументов?
TS-Labs wrote:- прочитанную выборку умножать на коэф. громкости для левого, а потом для правого канала - требуется апаратное умножение, значения суммировать отдельно

Аналогично.
TS-Labs wrote:следить, чтоб они не перевалили за 16 бит

Ниосилил, как можно это уследить. Можно оценить статически, по кол-ву каналов. Но тогда зачем вообще следить?

Да, по поводу 16битных семплов. Они потребуют 24битного (или вообще 32битного) умножителя, это имхо чересчур. Особенно с учётом того, что аппаратных умножителей нет, и потому обычный умножитель или сожрёт дохера ресурсов, или будет работать несколько тактов (=сколько бит на вход, столько и тактов).
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7256
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby TS-Labs » 19 Apr 2010, 20:13

lvd wrote:Ниосилил. Ты знаешь verilog/VHLD? Умеешь сделать на fpga хотя бы мигание светодиодиком?

Светодиодиком могу :)

lvd wrote:А если писать для АРМа? ;-)

Не уверен, что имеет смысл аж на АРМе. АВР-8 - дешево и сердито. До АРМ-а я пока не добирался, щас планирую повозиться с 32-разрядным АВР-ом.

lvd wrote:то не проблема, но может не хватить фпга на хранение 32 таких счётчиков. Но возможны варианты, конечно, с извратами

Вот как раз мне и интересно: сколько логики можно впихнуть в 30к альтеру. Не имею опыта, потому не могу прикинуть.

lvd wrote:Можно формулу с указанием битности аргументов?

Формула такая, точнее алгоритм (работает щас в той шарманке, что я приаттачил, звучит - фыст):
В той реализации все 8-битное, беззнаковое. Есть некий байт, PSM (Previous SaMple). Изначально его записываем =128, типо тишина, чтоб не кликнуло на старте.
Имеем, ADDR - адрес выборки wave-формы, SADDR - субадрес (1 байт). Читаем байт из ADDR - B(ADDR). Формула:
DAC=PSM*(256-SADDR)+B(ADDR)*SADDR.
Далее, увеличиваем SADDR на некий шаг, если перевалило за нуль, то 1) B(ADDR)->PSM, 2) ADDR+1->ADDR.
По панорамированию:
L_DAC=SUM(DAC(i)*L_PAN(i); R_DAC=SUM(DAC(i)*R_PAN(i), где i[0..31]. Щитаем для 8-бит семплов:
если 8 бит умножить на 32 канала, будет 13 бит.
При инициализации модуля мы знаем, сколько в нем каналов. Расчитываем некий, коэффициент, на который домножаем все громкости, K_PAN.
Для 32 каналов - это допустим 1. Для 16-ти - 2. для 24-х - 1,5. Все. При этом гарантированно не превысим макс. значение для ЦАПа после суммирования всех каналов.
а для одного канала, PAN - коэф. панорамирования: L_PAN=(256-PAN)*K_PAN; R_PAN=PAN*K_PAN.

lvd wrote:Да, по поводу 16битных семплов. Они потребуют 24битного (или вообще 32битного) умножителя, это имхо чересчур. Особенно с учётом того, что аппаратных умножителей нет, и потому обычный умножитель или сожрёт дохера ресурсов, или будет работать несколько тактов (=сколько бит на вход, столько и тактов).

Прикинем: Nclk_chan=Fclk_fpga/Fdac/Nchan, хай будет: 48MHz/44100/32=34 такта на 1 канал за выборку. Не густо, но если поднатужиться, можно и впихнуть-с.
TS-Labs
 
Posts: 1150
Joined: 19 Apr 2010, 10:10
Location: Wildest West
Group: Registered users

Postby TS-Labs » 19 Apr 2010, 21:05

Да, еще забыл добавить: в тех модулях (которые, не МОД) юзаются двунаправленные петли, то есть семпл играет вперед-назад по кругу. Это в плане аппаратных требований.
Блин, ну почэму, если одна нищасная 30к ольтерра стоит сколько 2 кетайских мр3,4,5 плеера, то она еще и такая убогая, что в нее нельзя запихнуть 32 ЦАП-конвеера (если это действительно так)?
TS-Labs
 
Posts: 1150
Joined: 19 Apr 2010, 10:10
Location: Wildest West
Group: Registered users

Postby jdigreze » 20 Apr 2010, 04:16

у меня от прочтения возникло мнение, что катастрофически не хватает dsp.
Сколько меня не корми, волк всё равно в лес смотреть будет
jdigreze
 
Posts: 1478
Joined: 01 Aug 2008, 06:49
Location: Агбан
Group: Registered users

Postby lvd » 20 Apr 2010, 07:14

TS-Labs wrote:48MHz/44100/32

24MHz/37500Hz/32 = 20
44100 как самоцель не имеет смысла.
2 умножения 8х8 столбиком впихнутся, не более. Это если ресурсы не тиражировать.
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7256
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby lvd » 20 Apr 2010, 08:09

еще по формулам. После линейной интерполяции по идее уже не 8 бит, а 16 получается, но можно ТУТ забить, так как результат лежит между 2 последовательными байтами.
Далее масштабирование по громкости, и тут-то уж нельзя забивать на 16 бит, надо все 32 раз по 16 бит складывать, и далее получать 21 бит и старшие 16 пихать в ЦАП.
По поводу коэффициента, думаю, что самое логичное - делать этот коэффициент степенями двойки. То есть из суммы 17-32 каналов выбирать старшие 16 бит, 9-16 - старшие 16 без самого старшего и т.д.
Ещё - исходя из интерполяции, получается всего 256 значений частот семпла, от 18750Гц до 73Гц, не маловато ли?
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7256
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby TS-Labs » 20 Apr 2010, 09:02

lvd wrote:44100 как самоцель не имеет смысла.

Согласен, 37кГц достаточно.

lvd wrote:2 умножения 8х8 столбиком впихнутся, не более. Это если ресурсы не тиражировать.

А насколько их можно тиражировать? 4 умножателя столбом сделать можно? тогда, это уже 80 тактов.

lvd wrote: После линейной интерполяции по идее уже не 8 бит, а 16 получается, но можно ТУТ забить, так как результат лежит между 2 последовательными байтами.

Архиверно. Если сэмплы были 8-бит, то смысл после интерполяции хранить 16?

lvd wrote: и тут-то уж нельзя забивать на 16 бит

Если мы начали говорить про 37кГц, то давайте вспомним, что многие породистые компакты раньше выпускались в 12 битах (младший байт тупо шел с 4-мя младшими нулями, сдирал треки, видел вот этими глазами). То бишь, 12 бит - это "эверест" качества, тем более для трекерных музонов. Причем ДЛЯ РЕЗУЛЬТИРУЮЩЕГО ЗВУКА. То есть, выборку для 1 канала (после интерполяции и громкости) можно хранить в виде 8 бит и не париться.

lvd wrote:По поводу коэффициента, думаю, что самое логичное - делать этот коэффициент степенями двойки

Да. Но это когда количество каналов равно степени 2. А когда их 20?

lvd wrote:Ещё - исходя из интерполяции, получается всего 256 значений частот семпла, от 18750Гц до 73Гц, не маловато ли?

Лолшто.
TS-Labs
 
Posts: 1150
Joined: 19 Apr 2010, 10:10
Location: Wildest West
Group: Registered users

Postby TS-Labs » 20 Apr 2010, 09:14

Update.
Если даже у нас всего 4 канала, 8-бит на канал даст 10 бит на ЦАП-е (уточню, почему 10, а не 9: с коэффициентом панорамирования, все 4 канала "участвуют" с КАЖДОМ ухе, а не по 2 на ухо, как в быдлоподелках). Перед написанием балалайки я провел некоторые практические эксперименты, а именно. Из OpenMPT я сохранил музон в виде отрендеренного WАV, после чего сделал ему обнуление младших бит (своей прогой, не конвертерами). Я получил несколько файлов (которые могу принести в студию) с разрешением 8, 9, 10, 11 и 12 бит. В особенности меня интересовало насколько сильно зашумят 8 бит. Шумят, слышно вполне отчетливо, но для балалайки допустимо. Так вот, 10 от 12 бит для трекерной музыки я на слух уже не отличаю. Если есть среди здесь те, кто может отличить, я буду удивлен.
TS-Labs
 
Posts: 1150
Joined: 19 Apr 2010, 10:10
Location: Wildest West
Group: Registered users

Postby lvd » 20 Apr 2010, 09:55

TS-Labs wrote:А насколько их можно тиражировать? 4 умножателя столбом сделать можно? тогда, это уже 80 тактов.

в еп1к30 1728 ЛЕ и 6х512 байт памяти.
ЛЕ=триггер и 4входовая LUT
TS-Labs wrote:Если мы начали говорить про 37кГц, то давайте вспомним, что многие породистые компакты раньше выпускались в 12 битах (младший байт тупо шел с 4-мя младшими нулями, сдирал треки, видел вот этими глазами). То бишь, 12 бит - это "эверест" качества, тем более для трекерных музонов. Причем ДЛЯ РЕЗУЛЬТИРУЮЩЕГО ЗВУКА. То есть, выборку для 1 канала (после интерполяции и громкости) можно хранить в виде 8 бит и не париться.

Думаю, что фигня. Громкость 8битные семплы только уменьшает в размахе, и если громкость вместо 255 стоит на 16, то семпл вместо 8 бит становится 4. Потому ТУТ надо все биты сохранять.
TS-Labs wrote:Да. Но это когда количество каналов равно степени 2. А когда их 20?

Когда 20 - коэфф. такой же как и для 32.
TS-Labs wrote:Лолшто.

лолто. В твоей схеме только 1 байт определяет 'частоту дискретизации' для семпла. Если 255 - то почти 37500 Гц (макс. частота в семпле - 18750), и далее умножаем 18750 на (1..255)/256
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7256
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby TS-Labs » 20 Apr 2010, 10:34

lvd wrote:Громкость 8битные семплы только уменьшает в размахе, и если громкость вместо 255 стоит на 16, то семпл вместо 8 бит становится 4. Потому ТУТ надо все биты сохранять.

Да, но мы же не будем слушать 1 канал на максимальной громкости колонок. А так, в общем потоке 1/16 громкости и будет звучать как 1/16 громкости.

lvd wrote:Когда 20 - коэфф. такой же как и для 32.

и громкость=20/32=0,625 от максимальной. Ну, в принципе, можно подогнать через индивидуальные громкости.


lvd wrote: В твоей схеме только 1 байт определяет 'частоту дискретизации' для семпла. Если 255 - то почти 37500 Гц (макс. частота в семпле - 18750), и далее умножаем 18750 на (1..255)/256

Частоту дискретизации сэмпла у меня определяет 3 (ТРИ!) байта.
Для дробного шага увеличения адреса (блин, есть какой-то термин для этого?) используется 1 байт до запятой и 2 байта после (1 было бы мало, C-3 и C#3 бы не различались). То есть, есть инструмент, который на частоте дискретизации 8287 играет 440Гц (нота С-4 допустим). Мы его вычитываем на частоте 44100. Значит, за каждой выборкой, адрес у нас увеличивается на 8287/44100=0,1879 (00 30 1В в хексе). Если нота нужна С-7, то шаг выборки составит уже 8287/44100*8=1,5033 (01 80 D8).
TS-Labs
 
Posts: 1150
Joined: 19 Apr 2010, 10:10
Location: Wildest West
Group: Registered users

PreviousNext

Return to NeoGS - софт и железо

Who is online

Users browsing this forum: No registered users and 1 guest

cron