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

NeoGS software and hardware

Postby Grey » 27 Sep 2018, 13:02

Блин, обсчитываю периоды нот и прихожу к выводу что 4 бита целой, и 12 бит дробной части - мало.
5 и 11 можно попробовать как будет звучать, но по хорошему, что бы вес диапазон учесть - надо 3 байта - 8 бит целая 16 дробная
37500/8363=4,48403 - это для C4 - До первой октавы а для С7 - до 4 октавы = 17.9361 ( 17 только в 5 бит помещается ).

В общем пока программно пробую - буду все равно 3/8 делать, а там посмотрим, будем на лету корректировать прошивку
Grey
 
Posts: 89
Joined: 01 Mar 2011, 21:07
Group: Registered users

Postby Grey » 27 Sep 2018, 14:13

напиши вкратце про DMA - как пользоваться. Не нашел доки.
Grey
 
Posts: 89
Joined: 01 Mar 2011, 21:07
Group: Registered users

Postby lvd » 27 Sep 2018, 21:41

Тезисно отвечу:
1. Если успевается подчитать байты всех каналов и вмикшировать их в выходное слово за период (1/37500 с), то и буфер выходного канала не нужен вовсе! Рестартить ДМА по идее нужно 50 раз в секунду (или сколкьо там БПМ), а само по себе ДМА либо остановится (семпл без лупа) или залупится (с лупом), до момента пока проц в тех же 50 разах в секунду не решит луп остановить или вообще переключить канал на другой семпл с другим рейтом и т.д.

2. Если рассчитывать что ДМА будет дмачить только кусочками по 128-256 байт, то тогда и буфер выходного канала нужен и стейт ДМА передавать процессором(!) по границе этих кусков. Имхо жуткий оверхед.
3. Начало семплов конечно можно выравнять по 256б, но проблема в том, что хранить всё равно 22 бита адреса надо (4 мегабайта), т.е. вроде как экономии в буфере с заданиями никакой.

[по поводу счёта дробных шагов всё понятно]

В конце выборку должна быть возможность прочитать , на каком адресе остановилась выборка.

Нужно ли это если ДМА фигачит семпл целиком? Помоему нет.

ДМА при запись первого канала должен делать сложение не с буфером а с 32768.

Ну да, с нулём (c средним уровнем)

Круто, если луп будет двух видов, с начала или вперед назад

Важная для меня инфа (в моде на амиге такого нету)

то в один складывать а в другой вычитать

аналогично

Будет писать в память ДМА машины через два порта.

Я тут думаю вот что:
1. если буфер с командами ДМА еще и читать процессором, это совсем грустно получится (получается как бы 4-портовая память, 2 писателя и и 2 читателя). Притом это осложняется тем, что запись процессора можно и забуферировать/отложить на пару тактов (сама машинка дампит резалты далеко не каждый такт), а вот с чтением неудобно -- в NGS останавливать процессор никак нельзя, ни вейтом, ни клоком (можно БАСКРом, но он не останавливает уже идущий цикл чтения/записи).

Потому есть такая идея: замапить буфер с заданиями на память. Запись в этот кусочек одновременно идёт и в буфер -- и так будет быстрее для Z80 чем через любые порты. А чтение -- обычное чтение из ОЗУ ранее записанного. Статусы можно сунуть в отдельные порты (опять же если они нужны -- см выше я спрашивал, действительно ли они нужны).

Ну да - будет ступенька, но она и в оригинале и в МОД и в s3m и в it есть, и автор пишет слыша её и делая где нужно ресамплинг. В impulstracker-r конечно можно включить линейную интерполяцию, но там и 16 бит сэмплы есть. А стоит ли это делать в 8 битном компьютере? - не уверен, хотя было бы красиво.

Вот и я о чём -- в амиге ступеньки так и оставались, а в штатной прошивке GS вроде как на низких частотах семплирования делается линейная интерполяция (я не уверен на 100%). И если вдруг это можно сделать простыми средствами то наверное и нужно? Если делать линейную интерполяцию всегда безусловно (используя дробные значения текущей позиции в семпле) -- сильно ли это засрёт семплы с высокими частотами дискретизации?
Многого нет здесь: http://lvd.nedopc.com
Image
User avatar
lvd
 
Posts: 1678
Joined: 07 Apr 2007, 22:28
Group: Registered users

Postby lvd » 27 Sep 2018, 21:45

Grey wrote:Блин, обсчитываю периоды нот и прихожу к выводу что 4 бита целой, и 12 бит дробной части - мало.
5 и 11 можно попробовать как будет звучать, но по хорошему, что бы вес диапазон учесть - надо 3 байта - 8 бит целая 16 дробная
37500/8363=4,48403 - это для C4 - До первой октавы а для С7 - до 4 октавы = 17.9361 ( 17 только в 5 бит помещается ).


Если требование на 5 целых бит вполне понятно, то вот как ты получаешь оценку на колво дробных бит -- не очень. По идее нужно взять какойнить семпл, сыграть его на высокой ноте и оценить ошибку попадания в тон исходя из наличия всего 12 или 11 дробных бит.
Многого нет здесь: http://lvd.nedopc.com
Image
User avatar
lvd
 
Posts: 1678
Joined: 07 Apr 2007, 22:28
Group: Registered users

Postby lvd » 27 Sep 2018, 21:46

Grey wrote:напиши вкратце про DMA - как пользоваться. Не нашел доки.

Пока в виде прошивки (более-менее работающей, в симуляторе) есть только ДМА на sd и mp3 -- совсем из другой оперы. Сейчас как раз я и думаю что всё надо переделать под ДМА для семплов по твоим идеям.
Многого нет здесь: http://lvd.nedopc.com
Image
User avatar
lvd
 
Posts: 1678
Joined: 07 Apr 2007, 22:28
Group: Registered users

Postby Grey » 27 Sep 2018, 22:54

lvd wrote:то вот как ты получаешь оценку на колво дробных бит -- не очень.
По собственному опыту могу сказать что когда первый раз делал плеер под мс дос то взял 8/8 довольно много музонов прогнал пока не услышал на нескольких экзотических , что 8 бит для дробной мало, на низких частотах. Тога сразу передал на 8/16. 11 бит конечно не 16, но уже и не 8 - точность в 8 раз выше. Давай возьмем один бит из адреса сэмпла , если делать его выравнивание 128 байт один бит остается.
Grey
 
Posts: 89
Joined: 01 Mar 2011, 21:07
Group: Registered users

Postby Grey » 27 Sep 2018, 23:34

lvd wrote:Если успевается подчитать байты всех каналов и вмикшировать их в выходное слово за период (1/37500 с), то и буфер выходного канала не нужен вовсе!

Это только при стандартном темпе 125 длина одного кадра в секундах равна 5/(BPM*2). = 0,02 или 1/50. Но темп например часто задают 140.
А не надо даже и в 1/37500 - при стандартном темпе 125 я подсчитал, что обновление данных - 1 раз а 750 байт (как раз 1/50 секунды реально там с точностью до байта меняется при изменении теипа). При более быстром темпе период уменьшится но при максимальном темпе 255 он будет около 370 байт - пол фрэйма . А вот передать новые данные в память ДМА машины - 512 байт, да - нудно успеть за 1/37500, но я думаю что если сэмпл где то на 1 - 2 байта, - это будет не критично.
Давай попробуем без буфера в 2*512, только с памятью под ДМА машинку. Но тогда надо как то отсчитать, сколько ДМА передал. Лучший вариант - 2 байта счетчик и сгенерировать по окончании прерывание. Ведь прерывания на 37500 уже не нужны будут. Вот пусть они в режиме дма машины переключаются в режим счетчика. Записываем 750 в счетчик, считаем следующую позицию и ждем прерывания, по нему перекидываем 512 байт в память ДМА машины, (а зачастую меньше так как каналов то одновременно звучит меньше) в этой же памяти можно и счетчик этот хранить.
Grey
 
Posts: 89
Joined: 01 Mar 2011, 21:07
Group: Registered users

Postby Grey » 27 Sep 2018, 23:38

lvd wrote: проблема в том, что хранить всё равно 22 бита адреса надо (4 мегабайта)

почему? 2 байта адрес сэмпла с выравниванием до 128 ли 256, и 2 байта счетчик - который прибавляется к этому адресу как смещение, Моно же аппаратно сложить биты адреса со смещением а младшие биты адреса считать нулем ? Относительно этого смешения и конец и луп проверятся. и период к смещению прибавляется.
Grey
 
Posts: 89
Joined: 01 Mar 2011, 21:07
Group: Registered users

Postby Grey » 28 Sep 2018, 00:59

lvd wrote:Потому есть такая идея: замапить буфер с заданиями на память. Запись в этот кусочек одновременно идёт и в буфер

Но ведь данные будут неизмененные? Читать то нужно текущее значение сэмлов. Но вообще я сказал, что если ДМА машина будет сама отслеживать луп и конец цикла, то читать не надо. Запустил ДМА и через счетчик получил прерывание, записал следующий набор. Один порт хорошо бы на чтение - с счетчиком, сколько отсчетов передалось, что бы не только ждать прерывания, но и анализировать сколько времени свободного и что можно ещё успеть просчитать.

Кстати- ДМА машина не должна останавливаться при прерывании - путь продолжает. Некоторые каналы неизменные остАнутся, да если не успел передать за 1/37500 всю карту , то щелчок получится. Лучше пусть продолажает, и несколько сэмплов на байт отстанут чем весь проигрыватель заткнется до перезапуска дма
Last edited by Grey on 28 Sep 2018, 01:13, edited 1 time in total.
Grey
 
Posts: 89
Joined: 01 Mar 2011, 21:07
Group: Registered users

Postby Grey » 28 Sep 2018, 01:08

lvd wrote:И если вдруг это можно сделать простыми средствами то наверное и нужно? Если делать линейную интерполяцию всегда безусловно

Идей хорошая, если успеет альтера, Но например в IT (не помню как в s3m) есть у модуля флаг, использовать интерполяцию или нет, так что лучше сделать управляемую битом. - глобально не поканально.
Дело в том что у Future Crew есть сэмплы, искусственно написанные побайтно длинной 16 байт или 10 байт - получается квадратная или пилообразная форма зацикленная , похожая на огибающую. - звучит как пронзительная соло гитара, и он потом ею спецкомандами уже вытворяет вибарто, затухания, подтяжки и тд. Так вот как такая квадратная форма будет звучать после интреполяции , я не знаю. и даже если порпобую в IT - результат может быть не аналогичный?
Grey
 
Posts: 89
Joined: 01 Mar 2011, 21:07
Group: Registered users

PreviousNext

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

Who is online

Users browsing this forum: No registered users and 1 guest

cron