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