Page 1 of 3

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

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

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

PostPosted: 14 Jan 2015, 18:12
by deathsoft
Вывод звука в буфер осуществляется на частоте проца, а дальше делается апсемплинг до частоты НОК(проц(3500000), звуковуха(44100)) и даунсэмплинг до частоты звуковухи (децимация), лишние сэмплы которые отбрасываются можно сразу никуда не записывать, а вообще все это описано в википедии в статьях про оверсэмплинг и децимацию.

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

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

PostPosted: 14 Jan 2015, 21:36
by deathsoft
http://ru.wikipedia.org/wiki/Передискретизация с места "Комбинация интерполяции и децимации". Как это объяснить проще - я не знаю.

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

И ещё: как подписаться на тему?

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

PostPosted: 16 Jan 2015, 17:08
by Screw
Какими величинами и в какой момент я должен оперировать при преобразовании?


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

А если серьезно - тебе всю инфу дали. Бери и изучай. И код смотри эмулятора. Совсем народ обленился :(

PostPosted: 18 Jan 2015, 02:16
by FalseMaster
Screw
У тебя много лишних слов во фразе "я не знаю". Но не стоит этого стесняться. Алсо необязательно бросаться на других в приступе сублимации потаённого желания обругать самого себя за незнание, ога.

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

В эмуле я разобраться не смог… и, по-видимому, не я один. Ну ты понел.

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

PostPosted: 18 Jan 2015, 21:31
by Screw
О! Раздача диагнозов в чятике! Image Успокойся, никто на тебя не бросается. Но и уважения подход "расскажите и обьясните мне всё" вызывать не может. Покопай сам, задай конкретные вопросы.

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

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

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

Рад за твоё ЧСВ. По звуку есть что сказать?

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

PostPosted: 20 Jan 2015, 04:09
by fk0
Тебе что-то объяснять бесполезно. Ты не обладаешь ни необходимыми знаниями, чтоб понимать на соответствующем уровне понятий, ни умом вообще, чтоб хотя бы пойти почитать википедию, если в чём-то не разбираешься. Потому, что достаточно вбить в google "zero stuffing", например. Только всё это тоже мёртвому припарки. Для аналогового звука вообще более эффективны другие методы передискретизации (и есть полно библиотек для). Конкретно для 1-битного выхода может быть эффективна передискретизация методом 1) upsampling'а в N раз, 2) фильтрации и 3) downsampling'а в M раз. Потому, что в п. 1 имеем единичный сэмпл через кажые N-шт. нулевых (строго единицы и нули -- это принципиально -- с нулями понятно, а для единиц получается не нужны умножения, только суммы), далее в п.2 из расчёта огромной длины КИХ-фильтра исключаются все нулевые сэмплы (на том и профит в скорости) и собственно пункт 3 заключается в расчёте фильтра только для каждого M-ного входного значения (и в том тоже профит, т.к. фильтр не рекурсивный, то остальные 0..M-1 можно не считать). И никакой длины периода здесь нет, и не увидишь. А если ты не понимаешь, что такое Pulse Code Modulation, то я ничем помочь уже не могу.