так во времени же это не совпадает, и так плавную коррекцию проще делать, даже для непостоянной и непредсказуемой длины кадра
во всяком случае, на практике длина очереди в сэмплах иногда бывает даже нечётная, а не то что кратная "круглым" числам
Вид для печати
Посмотрел, какие режимы синхронизации в ZXMAK2 самые 'плавные'.
Режим синхронизации по звуку и по таймеру выглядят похоже.
Режим синхронизации по видео - дергается больше. Примерно так же неприятно, как и Spectaculator, хотя визуально немного иначе.
В твоем эмуляторе 1.0 (который в первом посту) дергается примерно так же, как и в Spectaculator'е. Т.е. самым заметным образом.
что значит "точную"? эмуляция любая будет с задержкой даже для осей реального времени
но хотя бы накопления ошибки избежать можно, а человеческому уху без разницы периодически плюс-минус десяток сэмплов
естьтакая партиятакой тест!
https://zx-pk.ru/threads/27710-zx-ulax.html
f2, f3 - переключение скорости на ходу
Десяток? Что ты с ними делаешь? Выкидываешь?
Это очень много и на слух слышно.
- - - Добавлено - - -
На моем компьютере (Win8.1) примерно раз в несколько секунд слышен щелчок. Видимо, как раз твое несхождение аудиобуфера корректируется.
в Win7 прекрасно приходят нотификации проигрываемой позиции. В ZXMAK2 они используются для подкидывания новой порции данных в циркулярный буфер. Правда верить им нельзя, видимо на нижнем уровне у системы есть своя буферизация, поэтому нотификации могут приходить по две штуки сразу не равномерно во времени.
Зачем отслеживать текущую позицию до байта не совсем понятно, т.к. произвести синхронизацию потоков с достатой скоростью (1/44100 = 0.0000226 сек) не получится.
- - - Добавлено - - -
многие хорошие жк дисплеи могут работать с развёрткой 75 Гц. В этом режиме 50 Гц скролы гораздо лучше работают, чем с 60 Гц или 85 Гц. У меня например работает 75 Гц. Правда режим 75 Гц виден только если выключить галку "не показывать режимы, которые не поддерживаются дисплеем".
С частотой дисплея есть ещё такой прикол, что в системе может быть несколько дисплеев, с разной частотой развёртки. Например одна область рабочего стола обновляется с частотой 100 Гц, вторая с частотой 75 Гц, а третья с частотой 60 Гц. И окошко можно прямо во время работы перемещать по пространству рабочего стола.
Т.е. часть окна эмулятора может обновляться с частотой 60 Гц, а другая часть с частотой 75 Гц, при этом много подводных камней возникает. Если интересно, можете глянуть как эти вещи ZXMAK2 обрабатывает. Смотреть с включенным логом, там будут сообщения появляться о переключении на другой дисплей/частоту развёртки во время перемещения окна по пространству рабочего стола :)
85 Гц - это очень неудачная частота для 50 Гц развёртки
проблема там в том, что видеокарта и звуковая карта тактируются от разных кварцев, которые не синхронизированы между собой и у них плавают частота и фаза от температуры, у каждого по своему (да и температура у видеокарты и звуковухи разная). Поэтому ошибка со временем всегда будет набегать.
Тут уж надо выбирать что пропускать при критическом набегании ошибки - либо звуковой, либо видеокадр. Поэтому в ZXMAK2 сделан выбор источника синхронизации. При синхре от звука пропускаются видеокадры, а звук поддерживается стабильным. При синхре от видео наоборот. При синхре от времени выпадает и то и другое, в зависимости от того где частота больше уходит от системного таймера.
- - - Добавлено - - -
кратность не имеет смысла. Железо проигрывает циркулярный буфер, писать в него можно порции любого размера (в пределах размера буфера разумеется). Главное помнить, что при наложении записи на текущую позицию воспроизведения, будут возникать артефакты воспроизведения. Поэтому некоторый участок, где сейчас примерно идёт воспроизведение лучше не трогать.
Не видимо, а точно есть. У системы буфер размером в 10мс (при частоте семплов 48кГц - 480 семплов, соответственно).
Его размер и загрубляет возможность точной синхронизации.
- - - Добавлено - - -
В системе до Win7 на аудиокарточке Audigy, которая поддерживала информацию о позиции с точностью до семпла, у меня идеально получалось синхронизироваться.
- - - Добавлено - - -
Лучше расскажи словами, интересно)
- - - Добавлено - - -
Все так, именно в этом ключевая проблема.
- - - Добавлено - - -
Неудачная, но весьма показательная. Сразу видно, какой эмулятор дружественнее скроллам)
не выкидываю! а меняю между сэмплами промежутки, получая в разных фреймах разное количество сэмплов
меньше 2% и ничего ты не услышишь - волна-то та же, звук не потерялся, просто сжат немного или растянут
нет, проверено, причина - в кривых дровах (известная проблема винды 7+, даже на системных звуках щелчки бывают)
ну, либо антивирь в песочнице запускает, но это вряд ли (тогда постоянно бы трещало, скорей всего)
- - - Добавлено - - -
нет проблемы, набегать ничего не будет, разве что винда затупит очень надолго, но тогда уже и видео тормозит
еще раз - ПРОПУСКАТЬ ничего НЕ НАДО, вместо этого динамически слегка меняем частоту оцифровки (не воспроизведения!)
здесь противоречия никакого, на железо отправляем данные из программной очереди по готовности железа
в конец очереди добавляем порции покадрово, корректируя по текущему размеру очереди
если размер очереди стал маловат - растягиваем волну, великоват - ужимаем
главное - подобрать удачно эти границы
Почему же тогда все остальные эмули у меня играют хорошо?
- - - Добавлено - - -
2% - это гигантская погрешность. По музыкальным меркам - это четверть тона.
Хотел бы и на некоторые другие твои тезисы возразить, но чувствую, что завязну в болоте несостыковок понимания проблем эмуляторописания)
мало пробовал "остальных" или не прислушивался; я вот слышал даже в системных звуках; RVM проверь, говорят, что он трещит точно так же
мб дело в том, что SDL вызывает кривую функцию, так как на проблемном компе у меня треск был даже при проигрывании тишины из очень длинного буфера
помогло там переключение частоты динамиков на 44100гц (это при том, что в эмуляторе 48000гц)) - сразу перестало трещать везде
во-1, "меньше 2%" (и на практике, опять же, много меньше 1/10)
во-2, нихрена ты не услышишь и не поймёшь за "гигантский" промежуток в пару-другую фреймов, на которых будет коррекция
а ты рискни, не сдерживай себя :D
это не может быть показателем, т.к. тут дело в физических свойствах волн.
Сигнал с дискретностью 50 Гц физически невозможно перевести в 85 Гц дискретность без побочных эффектов.
Артефакты можно уменьшить за счёт фильтров, но это уже будет не совсем то. Чтобы понять разницу можно вспомнить как выглядит прямая линия и линия под углом на пиксельном дисплее. Прямая линия всегда будет выглядеть идеально, а вот линия под углом будет с алиасами. Алиасы можно убрать с помощью фильтра и изображение будет выглядеть лучше, но результат будет отличаться от прямой линии.
Не знаю, есть ли эмуляторы которые делают полноценную передискретизацию видеопотока вверх до нужной частоты с восстановлением сигнала по sinx/x (для каждого пикселя по отдельности). Это можно сделать на шейдерах.
Но в любом случае результат будет отличаться от оригинала с 50 Гц разверткой.
- - - Добавлено - - -
проблема есть. Видеокарта и звуковая карта тактируются от разных кварцевых генераторов, никак не синхронизированных.
Ошибка эта будет обусловлена начальным несоответствием и нестабильностью частот от температуры и времени.
Причём ошибка эта во времени может гулять, как в одну сторону так и в другую, в зависимости от температуры и фазы Луны :)
По этой-же причине подстроиться под неё невозможно, потому что эта ошибка постоянно меняется во времени.
- - - Добавлено - - -
эффект от подобной подстройки может быть даже хуже, чем пропуск при накоплении ошибки.
Во первых будет проблема с динамической подстройкой, её не так просто расчитать из-за отсутствия точных и стабильных временных меток.
Во вторых небольшое изменение частоты дискретизации исходного сигнала приведёт к плаванию тональности звука. Это уже будет совсем не то пальто :)
Эта проблема без артефактов технически не решаема. Не потому что никто не придумал как. А потому, что это невозможно вследствие волновых свойств. Единственный способ её избежать - тактировать звуковую карту и видеокарту от одного опорного генератора.
Проблема решаема, и, как я уже говорил неоднократно, прекрасно решалась мною на практике в EmuStudio, когда был доступ к позиции буфера воспроизведения с точностью до семпла. Но с переходом на Win7 - это все накрылось, а до новой точной синхронизации через WASAPI Exclusive еще у меня руки не дошли, однако тесты, проверяющие, поддерживает ли она точный указатель буфера воспроизведения, я делал. Все работает хорошо.
- - - Добавлено - - -
Однако, в твоем эмуляторе в двух режимах из трех артефакты 50Гц/85Гц практически сведены на нет.
А во всех остальных протестированных мною эмулях - дерганье очень заметное.
Сомневаюсь, что стоит пропускать пиксельную матрицу через фильтры. Мне кажется, получим какое-нибудь мыло.
нет, подстройка частоты сэмплирования источника ведёт к плавающему частотному искажению звука.
Это не решение. Это попытка спрятать проблему путём добавления новых артефактов.
у меня просто заполнение кадров поддерживается по возможности равномерным, а не случайно куда кадр попадёт.
не совсем так. Суть в том, чтобы восстановить форму изменения сигнала каждого пиксела по sinx/x интерполяции, а затем по полученной форме пересчитать новые точки дискретизации для другой частоты.
ВЧ составляющие спектра пикселя после такой передискретизации конечно точно восстановить не получится. Но надо попробовать, по идее должно неплохо смотреться. Проблема только в большом количестве вычислений. По сути апсемплинг 76800 сигналов в реалтайме (320x240 пикселей), так что без шейдеров тут пожалуй не обойтись :)
Монитор (телевизор) тоже тактируется от своего отдельного генератора, частота которого не совпадает с клоком источника видеосигнала.
В этом можно быть уверенным на 147%, однако Вас почему-то не смущает его ресинхронизация с источником каждую строку.
Кстати, эффект называется "джиттер"
Вот Вы очень удачный пример привели про прямую линию с углом расположения кратным 90 градусов и с углом не кратным этому значению.
На матрице 8х8 выглядеть будет ужасно, а на экране 4к уже вроде как бы и ничего... ;)
В итоге: Земля - блин, книга судеб давно написана, можно идти стреляться.
:v2_dizzy_angel:
монитор синхронизируется от входного видеосигнала.
Джиттер это из другой темы, это по сути нестабильность частоты относительно эталонного сигнала, т.е. когда длительность периода немного гуляет относительно эталона, но в среднем за длительное время число периодов получается правильное.
чтобы получить тот-же эффект, прийдётся использовать дисплей с развёрткой 25000 кадров в секунду, вместо 60-100.
При 25000 кадрах в секунду, изображение тоже будет очень близким к родному 50-герцовому :)
А вот вы попробуйте растянуть картинку 8x8 на дисплей 9x9 пикселов, да так, чтобы смотрелась она также как на дисплее 8x8 ;)
Это и будет тот самый случай передискретизации из 50 Гц в 60/75/85
Ага, уже лучше.
Посмотрел ДШ на несколько звуковых кодеков, у всех есть вход синхронизации 48kHz (какая знакомая частота! к чему бы?...) фиксированное значение.
Вывод: все остальные частоты дискретизации - в чистом виде ресемплинг.
...и совсем нет буферизации...
то есть "циркулярный буфер" есть понятие эмпирическое, существующее в воспалённом мозгу аудиодрайвера.
Относительно себя (того, что должно быть), но не суть, аудиофилы на него очень сильно обижены.
На 100Гц всё шоколадно, на 75 тоже хорошо - кадр1 -> кадр1+кадр2 -> кадр2.
60Гц - очень поганая частота в наших широтах...
*9 и /8
Линии будут - закачаешься... :)
В нашем случае кратность таки побольше (3-4-6-8 раз), да и видеокарточки позволяют использовать свои ресурсы почти как заблагорассудится.
А если учесть, что ресемплинг и сглаживание их основное предназначение...
то есть для тебя неприемлем спектрум-128 :v2_dizzy_aaaaa: потому что даже (960+10)/960 = 1.0104 < 1.0134 = 3.5469/3.5 :v2_dizzy_fear:
что, по твоим словам, является "ГИГАНТСКОЙ погрешностью", притом постоянной, но почему-то никого особенно не волнует
при том, что типичная (и далеко не каждый кадр) корректировка только "1-2 сэмпла", и большие выбросы можно сглаживать
да и пускай гуляет на временных отрезках порядка фрейма, человек не сможет это заметить, у него у самого сильней гуляют характеристики
см. выше: значит, спек-128 - "не то пальто" :v2_dizzy_biggrin2: хотя вряд ли и его на слух получится отличить, не говоря уже о намного менее заметной корректировке
- - - Добавлено - - -
и да, динамичный звук некорректно сравнивать с растянутой статичной картинкой, в промелькнувшем кадре хрен вы подсчитаете, сколько точек
изменение на доли герца прекрасно фиксируются на слух, например по биениям с эталонным сигналом. На этом принципе работает настройка с помощью камертона.
Короче тот способ, что Вы предлагаете - это есть по сути нелинейное искажение сигнала. Причём постоянно меняющееся. Что есть очень плохо.
- - - Добавлено - - -
мне Ваш вывод не понятен :) Звуковая карта живёт своей жизнью, видеокарта своей. У обоих свои источники синхронизации и они друг о друге ничего не знают. Как будет происходить синхронизация видео и звука - это проблема софта.
и правильно делают. Джиттер при тактировании ЦАП-а приводит к росту нелинейных искажений. Но это совсем другая история :)
это кажется что хорошо.
Да, 100 Гц кратная частота, поэтому проблем с алиасами не будет, но визуально 100 Гц развёртка воспринимается всётаки несколько иначе, чем 50 Гц. На 100 Гц ЭЛТ дисплее 50 Гц обновление выглядит немного дёрганным :)
Чтобы устранить этот эффект, нужен полноценный апсэмплинг пикселов. Для 100 Гц промежуточные кадры должны заполняться усреднённым значением между двумя кадрами.
На 75 Гц тоже есть проблемы с отображением - выражается в неправильном восприятии цвета в мультиколорных демах.
А 60 и 85 Гц - это вообще не кратные частоты, поэтому с ними получается постоянно меняющаяся ошибка.
- - - Добавлено - - -
эмулятор находит основной дисплей, на котором в данный момент отображается, вычитывает его частоту обновления и расчитывает отношение частот с 50 Гц. На основе отношения ведёт учёт 50 Гц кадров в координатах реальной частоты развёртки. Номера кадров при этом получаются дробными, а реальное переключение происходит только при переходе на следующее целое значение. Т.е. по сути как бы накладывается одна координатная сетка на другую и таким образом находятся точки во второй координатоной сетке относительно первой.
- - - Добавлено - - -
при динамической подстройке на отрезках порядка фрейма стабилизировать частоту не выйдет, не получится измерить реальную частоту обновления с достаточной точностью за один кадр. Поэтому скорость воспроизведения звука будет заметно гулять. Я помню, кажется Titus выкладывал эмулятор с такой подстройкой, в нём реально на слух было слышно изменение тональности звука.
- - - Добавлено - - -
тут вроде уже смешались кони люди... :D
Мы про какой вопрос говорим? Про вывод 50 Гц видео на 60/75/85/100 Гц дисплее? или про синхронизацию звуковой и видео карт?
В указанной вами цитате речь шла про звук с динамически изменяющейся частотой дискретизации. Другими словами скорость магнитофонной ленты со звуком подстраивается под частоту кадров кинопроектора. За счёт меняющейся скорости воспроизведения тональность звуков меняется. И это легко заметить. Я считаю это намного хуже, чем единичный щелчёк или пропуск видеокадра (в зависимости от чего синхронизироваться) раз в час или реже.
В большинстве случаев синхронизации от звуковой карты более чем достаточно, при этом также минимальные требования к производительности. Звук при этом звучит без пропусков и щелчков. А редкий пропуск видеокадра абсолютно не заметен. К тому-же под Win драйвер nVidia сам грешит таким, особенно когда параллельно какая-то графика в Chrome работает.
что значит "достаточной"? насколько "заметно"? гуманитарщина... :v2_dry:
"таких" много, подобрать параметры можно разные
лично я - про эффекты передискретизации вообще
где, какой? я в добавке ничего не цитировал и говорил о динамической природе звука как такового
любой звук корректней сравнивать с гигаскрином и анимацией, а не со статическими картинками
никак нет - под среднюю (за обозримый период) реальную скорость обработки звука системой
Это голословное заявление :v2_dizzy_stop: и притом в противоречии с практикой - повторю, на разницу в звучании спектрумов 48 и 128 до сих пор особо никто не жаловался, а вот щелчки немедленно замечают, как видим выше. А почему? Полагаю, потому что человеческий организм - измерительный инструмент аналоговый, неточный, да еще с плавно изменяющейся чувствительностью. Ему резкий перепад сигнала проще заметить.
...и потому нас должно интересовать большинство из меньшинства случаев, когда синхронизации недостаточно :D
еще как заметен на бегущих строках и гигаскринах, и даже "редкий"
Не на слух они фиксируются, а вычленяются с помощью камертона или другого эталонного источника.
Никто не будет сравнивать звук с эмулятора с каким-то эталоном, чтобы зафиксировать отклонение.
Я, как человек, пишущий музыку, и имеющий все-таки какой-то музыкальный слух, скажу, что звук был идеальный.
Выйдет и получится. Не будет она гулять на слух вообще.
Я выкладывал всякие релизы для тестов, чтобы понять, какие у народа звуковухи. Оказалось, что таких, как у меня, дающих информацию о позиции воспроизведения с точностью до семпла, практически нет. Поэтому все гуляло.
Попробуем на пальцах.
Только что, путём несложного анализа схемотехники было доказано, что частота дискретизации не зависит от тактовой звукового чипа. И от косорукости программиста тоже (хотя именно в этом я могу и ошибаться, внутреннее построение чипсета мне неизвестно).
Ибо синхронизация внешняя, аппаратная, от южного моста чипсета.
Тон, да, зависит, но сэмплрейт никак (в пределах такта клока 1/24,56М).
И что-то мне подсказывает, что точно также я найду синхронизацию видеокарты.
Либо ОТ видеокарты.
Как минимум IRQ там точно присутствует.
Вычислить, например, из пяти реальных кадров четыре кадра (первый и шестой остаются исходными) со сдвигом (50 -> 60Гц) не такая уж тривиальная задача.
ЯТД :)
С соответствующей задержкой, разумеется.
при чём тут спектрум 48 и 128? И у того и у другого тактовая частота стабильная и не меняется.
А тут речь идёт о том чтобы сделать частотную модуляцию тактовой частоты, т.е. частота будет постоянно меняться в зависимости от текущей ошибки между опорными генераторами звуковой и видео карт. А также от ошибки измерения этой ошибки :)
- - - Добавлено - - -
при чём тут IRQ?! Видели в спектруме есть такой элемент - кварцевый осциллятор, который даёт опорную частоту, от которой вырабатываются остальные частоты? Вот такой-же осциллятор стоит на звуковой карте и на видео-карте. Частоты и фазы этих осцилляторов плавают от начального несоответствия и от температуры. Из-за этого несоответствия получается небольшая ошибка. Она очень маленькая, но со временем накапливается.
Если привести обе частоты к 50 Гц, то эта ошибка составит менее 0.001 Гц, может даже меньше. Но она есть и со временем накапливается.
Поколению мало эмуляторов. &(Нехай делать ?). Напиши лучше Качественный C/C++(+LLVM Z80) компилятор для Z80 - ПОЛЬЗы БуДЕТ БоЛЬШЕ !
В 99% компьютеров, нет звуковой карты, есть микросхема умеющая DAC, просто микросхема которая преобразовывает цифровое значение в регистре в напряжение на выходе. Все остальное программно, макс с использованием DMA контролеров в процессоре или южном мосту, зависит от поколения и производителя.
- - - Добавлено - - -
Типичный представитель, 10 летней давности, не особо отличается от того что сейчас
https://www.rockbox.org/wiki/pub/Mai...8731_8731L.pdf
- - - Добавлено - - -
У современных будет не 2 канала а 8 + еще какие то доп фильтры итд
На плате стоит синтезатор частот, который из кварца на 26мгц делает всю сетку частот
Отдельные звуковые это большая редкость и в 90% случаев, это китайская USB Audio 7.1 Super stereo HI FI 3D, за 1$, а там еще USB свои нюансы добавляет
из него или из BCLK (это не суть важно) кодек вырабатывает частоту сэмплирования, которая обязательно нужна для DAC и эта частота должна быть достаточно чистой, чтобы минимизировать нелинейные искажения.
Зачем лезть во внутренности кодеков? Любой из них использует DAC, которому нужна опорная частота. И эта частота вырабатывается из опорной частоты, формируемой кварцем. Если это материнка, то для формирования частоты может использоваться её синтезаторы. А могут и не использоваться, т.е. будет свой кварц для звукового модуля. Если это отдельная плата, у неё свой опорник, в особенности если она высококачественная.
Как бы там ни было, звуковая карта и видеокарта будут тактироваться от отдельных опорников. Независимо от того встроенная это звуковая карта или нет. У меня на пример звуковая встроенная и тактируется от отдельного опорника, поэтому есть ошибка между видео развёрткой и частотой сэмплирования звуковухи.
Более того, могу сказать что моя звуковуха видимо тактируется от отдельного опорника, т.к. если привести частоту сэмплирования к 50 Гц, то при измерении относительно таймера материнки получается частота 49.999. А вот если привести частоту видеоразвёртки к 50 Гц, то при измерении относительно того-же таймера материнки получается 50.015 Гц (погрешность большая из-за низкой частоты развёртки, но среднее значение стабильно колеблется на уровне 50.015...50.020 Гц). Сама частота видеоразвёртки измеренная относительно таймера материнки также колеблется на уровне 75.020 Гц. Частота таймера материнки 2'742'919 Гц.
Еще раз нет и нет.
Там опорная частота интерфейса данных кодека, она под мегагерц в старых компах.
И частота дискретизации по факту это чисто программное явление, на какую частоту настроили DMA (у которого базовая частотам может быть 66мгц, если это какой то BX440 или 200мгц в каком то атлоне на ам3 сокете) а DMA еще будет соперничать за шину, что бы послать байтики
А может быть вообще программно, пересылает данные в порт AC97 по IRQ.
В целом AC97 по определению имеет очень косвенное отношение к качественному звуку.
- - - Добавлено - - -
Звук и в видео разбегаются из за самой природы, многозадачной ос, она не может выдержать точно кванты, задача может спать в тот момент, когда тебе нужно отреагировать, вот и все, рилтайм приоритеты и прочие вещи не помогут, там как могла быть обработка прерывания от DMA который питал AC97 или работал с SATA винтом.