Эмуляция звука

emulators

Postby FalseMaster » 14 Jan 2015, 15:32

Народ, может кто-нибудь помочь с эмуляцией звука, для начала, бипера (кода не надо, чисто на словах)? А то вот пишу эмуль и капитально засел на звуке, будь он неладен. Если ответ положительный, распишу свои непонятки подробно, ну а коли нет, так не буду и распинаться зря. Если чё, сорцы "Unreal Speccy" курил, но нефкурил – там какой-то лютый матан.
FalseMaster
 
Posts: 8
Joined: 14 Jan 2015, 04:51
Group: Registered users

Postby deathsoft » 14 Jan 2015, 18:12

Вывод звука в буфер осуществляется на частоте проца, а дальше делается апсемплинг до частоты НОК(проц(3500000), звуковуха(44100)) и даунсэмплинг до частоты звуковухи (децимация), лишние сэмплы которые отбрасываются можно сразу никуда не записывать, а вообще все это описано в википедии в статьях про оверсэмплинг и децимацию.
User avatar
deathsoft
 
Posts: 4664
Joined: 07 Apr 2007, 00:58
Group: Registered users

Postby FalseMaster » 14 Jan 2015, 20:00

Нет, так не пойдёт. Будь у меня был такой уровень познаний в области работы со звуком, я б не обратился за помощью. Давайте пойдём другим путём: я опишу, как у меня сейчас всё это дело происходит, а вы ткнёте меня носом, что я не сделал и/или сделал неправильно. Итак. В цикле эмуляции инструкций Z80 есть счётчик, увеличивающийся каждые 4 такта на единицу. В процедуре, реализующей вывод в порт, по XOR (подсмотрел в сорцах US) проверяется смена D4 в FE и в случае, если бит поменялся, в буфер добавляется сэмпл длиной в разность текущего и предыдущего значения счётчика, делённую на 32. По приходу INT буфер проигрывается. А теперь, собственно, о проблеме. Низкие частоты воспроизводятся нормально, а вот на средних и высоких (начиная с BEEP x,13) звук становится прерывистым (чем выше, тем хуже), и это понятно – за период INT буфер не успевает заполниться в достаточной мере. Казалось бы, вывод очевиден – по условию/таблице/формуле увеличивать кол-во высокочастотных семплов. Эксперимент показал, что это не выход, т.к. имеется ещё худшая проблема, а именно, несколько соседних нот получаются неразличимыми по высоте, а если же ещё и растягивать (т.е. делить менее чем на 32) до различимого состояния, то тогда недопустимо увеличивается длительность звучания. В общем, тупик. Если не трудно, объясните на пальцах, как быть и что делать.
FalseMaster
 
Posts: 8
Joined: 14 Jan 2015, 04:51
Group: Registered users

Postby deathsoft » 14 Jan 2015, 21:36

http://ru.wikipedia.org/wiki/Передискретизация с места "Комбинация интерполяции и децимации". Как это объяснить проще - я не знаю.
Last edited by deathsoft on 16 Jan 2015, 17:05, edited 1 time in total.
User avatar
deathsoft
 
Posts: 4664
Joined: 07 Apr 2007, 00:58
Group: Registered users

Postby FalseMaster » 16 Jan 2015, 02:17

Изложенное по ссылке мне ни о чём не говорит. Я не въезжаю, каким боком это привязать к своей программе. На момент изменения D4 в FE у меня имеется только одно значение – длина сэмпла в единицах счётчика (4 такта), умножение которого на сферическое M с последующим делением на не менее сферическое N не даёт ровным счётом ничего. Зато имеется серьёзное подозрение, что неверен сам принцип, высосанный из пальца. Может тогда начать с этого. Какими величинами и в какой момент я должен оперировать при преобразовании?

И ещё: как подписаться на тему?
FalseMaster
 
Posts: 8
Joined: 14 Jan 2015, 04:51
Group: Registered users

Postby Screw » 16 Jan 2015, 17:08

Какими величинами и в какой момент я должен оперировать при преобразовании?


42 и 100500. Еще можно 666. Всегда так делаю.

А если серьезно - тебе всю инфу дали. Бери и изучай. И код смотри эмулятора. Совсем народ обленился :(
Нас никому не сбить с пути, нам похеру куда идти!
Screw
 
Posts: 79
Joined: 01 Sep 2008, 11:25
Group: Registered users

Postby FalseMaster » 18 Jan 2015, 02:16

Screw
У тебя много лишних слов во фразе "я не знаю". Но не стоит этого стесняться. Алсо необязательно бросаться на других в приступе сублимации потаённого желания обругать самого себя за незнание, ога.

Вопрос был про ВЕЛИЧИНЫ, а не ЗНАЧЕНИЯ (бородатомемные). Разницу чувствуешь?

В эмуле я разобраться не смог… и, по-видимому, не я один. Ну ты понел.
FalseMaster
 
Posts: 8
Joined: 14 Jan 2015, 04:51
Group: Registered users

Postby Screw » 18 Jan 2015, 21:31

О! Раздача диагнозов в чятике! Image Успокойся, никто на тебя не бросается. Но и уважения подход "расскажите и обьясните мне всё" вызывать не может. Покопай сам, задай конкретные вопросы.

В эмуль я, кстати, добавлял эмуляцию аппаратного скроллинга в АТМ2+, вместо нытья в интернетах.
Нас никому не сбить с пути, нам похеру куда идти!
Screw
 
Posts: 79
Joined: 01 Sep 2008, 11:25
Group: Registered users

Postby FalseMaster » 19 Jan 2015, 23:18

Мне от чьего-либо (не)уважения ни жарко ни холодно. И я не просил объяснять ВСЁ, только общий принцип (без формул и кода) в таком же стиле, как я во 2-ом посте. В сорцах US чёрт ногу сломит – такое впечатление, что его писала дюжина обкуренных индусов в свежепокрашенном помещении. Вопрос был конкретней некуда, цитирую: "Какими величинами и в какой момент я должен оперировать при преобразовании?". У меня величина только одна – длина сэмпла. Какие нужны ещё и нужны ли?

>> В эмуль я, кстати, добавлял эмуляцию аппаратного скроллинга в АТМ2+

Рад за твоё ЧСВ. По звуку есть что сказать?
FalseMaster
 
Posts: 8
Joined: 14 Jan 2015, 04:51
Group: Registered users

Postby fk0 » 20 Jan 2015, 04:09

Тебе что-то объяснять бесполезно. Ты не обладаешь ни необходимыми знаниями, чтоб понимать на соответствующем уровне понятий, ни умом вообще, чтоб хотя бы пойти почитать википедию, если в чём-то не разбираешься. Потому, что достаточно вбить в google "zero stuffing", например. Только всё это тоже мёртвому припарки. Для аналогового звука вообще более эффективны другие методы передискретизации (и есть полно библиотек для). Конкретно для 1-битного выхода может быть эффективна передискретизация методом 1) upsampling'а в N раз, 2) фильтрации и 3) downsampling'а в M раз. Потому, что в п. 1 имеем единичный сэмпл через кажые N-шт. нулевых (строго единицы и нули -- это принципиально -- с нулями понятно, а для единиц получается не нужны умножения, только суммы), далее в п.2 из расчёта огромной длины КИХ-фильтра исключаются все нулевые сэмплы (на том и профит в скорости) и собственно пункт 3 заключается в расчёте фильтра только для каждого M-ного входного значения (и в том тоже профит, т.к. фильтр не рекурсивный, то остальные 0..M-1 можно не считать). И никакой длины периода здесь нет, и не увидишь. А если ты не понимаешь, что такое Pulse Code Modulation, то я ничем помочь уже не могу.
* Origin: зип файл! (2:5030/1559)
User avatar
fk0
 
Posts: 1533
Joined: 07 Apr 2007, 01:08
Group: Registered users

Next

Return to Эмуляторы

Who is online

Users browsing this forum: No registered users and 1 guest

cron