Есть задачи для программистов для НГС

NeoGS software and hardware

Postby lvd » 02 Oct 2018, 20:43

Grey wrote:По собственному опыту могу сказать что когда первый раз делал плеер под мс дос то взял 8/8 довольно много музонов прогнал пока не услышал на нескольких экзотических , что 8 бит для дробной мало, на низких частотах. Тога сразу передал на 8/16. 11 бит конечно не 16, но уже и не 8 - точность в 8 раз выше. Давай возьмем один бит из адреса сэмпла , если делать его выравнивание 128 байт один бит остается.


Ок, в рамках 5.11 на шаг семпла, младший бит это 1/2048-ая, или для шага 1.0 это 0.05%. Между нотами разница 6%. Аналогично можно оценить, что для разницы 1% надо, чтоб шаг был 0.25 где-то. Это вообще много или мало? Я не могу навскидку оценить.
Многого нет здесь: http://lvd.nedopc.com
Image
User avatar
lvd
 
Posts: 1637
Joined: 07 Apr 2007, 22:28
Group: Registered users

Postby lvd » 02 Oct 2018, 22:10

Grey wrote:Это только при стандартном темпе 125 длина одного кадра в секундах равна 5/(BPM*2). = 0,02 или 1/50. Но темп например часто задают 140.
А не надо даже и в 1/37500 - при стандартном темпе 125 я подсчитал, что обновление данных - 1 раз а 750 байт (как раз 1/50 секунды реально там с точностью до байта меняется при изменении теипа). При более быстром темпе период уменьшится но при максимальном темпе 255 он будет около 370 байт - пол фрэйма . А вот передать новые данные в память ДМА машины - 512 байт, да - нудно успеть за 1/37500, но я думаю что если сэмпл где то на 1 - 2 байта, - это будет не критично.

1. В прошивке GS прям есть табличка которая преобразует BPM в отсчёты на частоте 37500.
2. передать все 512 байт за 1/37500 не получится, на это нужно около 6600 тактов z80 (а 1/37500 -- это 640 тактов)
3. пока переписываются разные позиции в памяти машинки ДМА, она может работать и схватить неверные данные. Потому видимо нужны отдельные биты ENABLE каждому каналу отдельно в LE. Если бит установлен в 0, то канал, даже если машинка в середине работы с ним, сразу же выключается.
Или обмен должен быть типа такого:
1. поставили все каналы которые хотим обновить в стоп (бит в памяти 512 байт)
2. начали их менять. за время от начала 1 до начала 2 должно пройти времени не меньше чем время обхода всех каналов.
3. убрали стоп в тех же каналах.
Многого нет здесь: http://lvd.nedopc.com
Image
User avatar
lvd
 
Posts: 1637
Joined: 07 Apr 2007, 22:28
Group: Registered users

Postby lvd » 02 Oct 2018, 22:13

Grey wrote:почему? 2 байта адрес сэмпла с выравниванием до 128 ли 256, и 2 байта счетчик - который прибавляется к этому адресу как смещение, Моно же аппаратно сложить биты адреса со смещением а младшие биты адреса считать нулем ? Относительно этого смешения и конец и луп проверятся. и период к смещению прибавляется.

Ну вообще есть смысл, если смещение=счётчик лупа. Но если счётчик лупа отдельный, то в еще одном смещении нет смысла, его прекрасно заменит полный адрес. А потом из него вычтется период лупа (его хранить надо полюбому) и играться канал начнёт сначала. Тут возникает вопрос, какой должна быть макс. длина семпла?
Многого нет здесь: http://lvd.nedopc.com
Image
User avatar
lvd
 
Posts: 1637
Joined: 07 Apr 2007, 22:28
Group: Registered users

Postby lvd » 02 Oct 2018, 22:34

Попытаюсь расписать необходимые данные для канала:
BASE ADDR (14bit) -- начало семпла по 256 байтам
SIZE (16bit) -- размер семпла в байтах
ADD (16bit) -- та самая величина шага в семле, 5+11
VOLS (2x7bit) -- две громкости со знаком
CTR (16bit integer + 11bit fraction) -- счётчик, который показывает смещение в семпле, заодно и дробную часть сохраняет
LOOPSTART (16bit) -- начало лупа
ENA (1bit)
LOOP (1bit)
DLOOP (1bit) -- луп должен бегать туда-сюда а не начинать с LOOPSTART, LOOPSTART становится другой границей лупа
==106 bits 14 bytes
36 каналов получается.


Где я ошибся? Что лишнее?
Многого нет здесь: http://lvd.nedopc.com
Image
User avatar
lvd
 
Posts: 1637
Joined: 07 Apr 2007, 22:28
Group: Registered users

Postby Grey » 03 Oct 2018, 01:13

Не хотел расстраивать, написал уже загрузку модуля в NGS, делаю пересчет частот и прихожу к выводу ...
дело в том что у MOD принята частота оцифровки сэмпла 8363 и если исходить из неё то схемы 4+12 или 5+11 для счетчика было бы достаточно.
Но у S3M и IT очень много композиций где взяты сэмплы с частотой 22000 или 44100, и даже есть накрученные до 65000 - (для корректировки частоты, вряд ли с такой оцифровывали). И вот для них на максимальной ноте целая часть часто доходит до 75-81H, а в одном модуле- до A2h в общем 8 +16 бит по хорошему надо. Или придется вводить ограничения на совместимость, чего не хотелось бы. Правда там где A2h на 8-ой октаве, в патернах используется 3- октава в после деления и при проигрывании используется 0Ah , но если ввести 8-октаву - она тоже звучит без искажений. Минимум 6+12 нужно

А вообще процесс идет - альфа версия на 8 программных каналов к концу недели должна получиться.
Last edited by Grey on 03 Oct 2018, 02:03, edited 2 times in total.
Grey
 
Posts: 82
Joined: 01 Mar 2011, 21:07
Group: Registered users

Postby Grey » 03 Oct 2018, 01:52

Теперь по предложенной карте ДМА машинки. Если просто прибавить 2 байта для - ADD 8+16 и для CTR 16+16 получится 16-ть байт на канал - 32 канала, но зато полноценных с двумя громкостями и я так понял что громкость со знаком - для сураунда - в один канал прибавлять, в другой вычитать?) и с высокой точностью и диапазоном масштабирования сэмплов. И программировать и расчитывать легко.
Если начать кроить и экономить для увеличения каналов, то
минимум надо 6+12 бит для масштаба. Бит LOOP убираем, можно определять по LOOPSTART >= SIZE
ENA это для чего ? если END, то останавливать ДМА лучше по SIZE = 0. для сураунда взять 1 бит ,а громкости оставить по 6 бит

BASE ADDR (14bit)
SIZE (16bit)
ADD (18bit)6+12
VOLS (2x6bit=12)
CTR (16+18=34bit)
LOOPSTART (16bit)
DLOOP (1bit)
SUROUND(1bit)
112bit ровно 14 байт, и теже 36 каналов. - 504 байта и 64 бита свободных
Grey
 
Posts: 82
Joined: 01 Mar 2011, 21:07
Group: Registered users

Postby Grey » 04 Oct 2018, 03:01

Ты же можешь биты пермешивать при записи в порт по разным ячейкам памяти ? для удобства программировани записи в порты можно равномерно раскидать биты, учитавая что внутренний CTR для записи недоступен - и можно биты записи в порт громкости рапихивать по свободным битам в памяти.
CTR нужно просто обнулять при любой записи в BASE ADDR - что означает запуск/перезапуск ДМА
например BASE ADDR в порты пишутся 16 бит и просто ненужные откидываются. ADD пишется 24 бит VOLS - пишется 8 бит - суроунд в один из бит можно воткунть.
CTR - целых 4 байт, вполне позволят удобнее адреса портов записи рапределить.

И ещё хотелось бы 1 порт (или 2 правый левый ) глобальной громкости. Она один раз умножается при записи в порт громкости каждого канала и в памяти канала хранится уже громкость канала умноженная на гобальную(ну естественно поделенная на 64).
Это тоже очень поможет и разгрузит - иначе программно умножать придетсян е только один раз для канала но и при каждом эффекте плавного изменения громкости или баланса в каждом канале.
Например в патерене в строке команды плавно поменяли глобальную громоксть. И нужно громкости всех каналов пересчитывать. В следующей строке опять поменяли глобальную громкость - и опять все каналы заного перемножать. Может z80 и успеет, но нагрузка будет сильно прыгающая.
Grey
 
Posts: 82
Joined: 01 Mar 2011, 21:07
Group: Registered users

Postby Grey » 05 Oct 2018, 19:18

По-моему эмулятор глючит. Играет только 4 канала, а 4 молчат.
OUT (GSCFG0),a заполнен по инструкции правильно - 8 каналов включен панинг выключен.
В памяти в буферах данные есть. читаю так
LD D,#060
Faza equ $-1
LD A,(DE)
INC D
LD A,(DE)
INC D
LD A,(DE)
INC D
LD A,(DE)
INC D
LD A,(DE)
INC D
LD A,(DE)
INC D
LD A,(DE)
INC D
LD A,(DE)
INC E

4 играют, вторые 4 молчат
Grey
 
Posts: 82
Joined: 01 Mar 2011, 21:07
Group: Registered users

Postby Grey » 06 Oct 2018, 04:37

То на что ты указал. кое что просчитываю и понимаю что опа.. 24000000/37500 = 640 тактов - ldi = 16 тактов 640/16 = 40 байт и пролетели аудио тик.
Но нам для запуска не нужно передавать все 504 байта. Я вижу несколько решений. Но самое простое 0-е

0. Сделать запуск ДМА вообще 4 байтами - адрес и период (6+12 - 2 бита перенести в байт адреса) . При старте Лооп сбрасывается в 0, длинна в 65535 . И уже 10 каналов за 1/37500 успеем запустить. (Период тоже сбрасывается в 0 так как пока его не записали может прийти тик и первый байт возьмется с неправильным периодом, или лучше сделть буфер на 4 байта - как все 4 байта записались - запускаем канал, а то щелчки могут быть) Ну может 9, так как надо стэка немного сохранить успеть или хотя бы ex af,af и exx переключить.Редко одновременно столько нот начинает играть даже при 32 каналах. Ну в пиковой нагрузке для 32 каналов отстанем на 3 тика - не так смертельно. а дальше не спеша дописываем дллинну, лооп, если надо то громкость - в громкости несколько управляющих бит
Надо предусмотреть изменение периода без перезапуска канала. т.е. если пошла запись в адрес, то в буфере ждет все 4 байта. Если просто запись в период - то сразу в ДМА его.
1. буфер на первые 6*36 216 байт.
2. Что бы дма само из оперативной памяти считывало подготовленную карту 256 байт памяти именно первых инициализационных байт. но тут тоже не знаю. Память на какой частоте работает? если 14000000, то 373 байта за тик успеет считать. Если память 16 битная то 746 байт. И что с процеесором можно сделать на время чтения ? Остановить можно на весь период ?
Grey
 
Posts: 82
Joined: 01 Mar 2011, 21:07
Group: Registered users

Postby deathsoft » 06 Oct 2018, 21:57

Grey, напиши небольшой тест для 8 канального звука, я добавлю 8 каналов в унриал (эмуль не глючит, там просто это не реализовано). А спрашивать на ГЯФе про эмуль просто бессмыслено, там одни хомяки - "дай, да подай", тема там про унриал давно дохлая (это я тебе как автор ngs эмуляции в унриале говорю).

Вот можешь протестировать эту версию (добавил 8 каналов по доке от ngs, не тестировал т.к. не на чем) https://dlcorp.nedopc.com/viewtopic.php?p=38826#p38826
User avatar
deathsoft
 
Posts: 357
Joined: 07 Apr 2007, 01:58
Group: Registered users

PreviousNext

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

Who is online

Users browsing this forum: No registered users and 1 guest

cron