Quote:
Немного запара у меня со временем. Но тут звучал вопрос о звуке в эмуляторе. Тут я не гуру, напишу как сделал в онлайновом. Правда, уверен, это далеко не лучший способ.
И так, в процессе выполнения инструкций, процессор имеет счетчик тиков. Мы высчитывем пропорцию тики/миллисекунды для нужного битрейта. Т.е, например мы генерим 50000 тиков 50 раз в секунду (цифры, п. Для 44100 герцового звука будем иметь пропорцию, типа 50000*50/44100 = 56 (грубое округление, чтобы было понятно). Приблизительно 56 тиков на один звуковой сигнал. После каждого изменения бита спикера, я откладываю в массив время в тиках, когда это случилось. И по прошествию 1/50 секунды, на основе этих данных я формирую новый байтовый массив из двух разных значений, (0, 255) (можно поэксперементировать с другими, чтобы звучание лучше было). Где каждый байт это один такт финального звука. Грубо говоря, если мы на 112 тике поменяли значение порта с нолика на 1, а на 224 обратно, то массив будет такой:
Первый массив: (112,224)
Второй массив: (0,0,255,255,0,0,0,0....)
Вот этот второй массив и нужно выводить на звуковуху. Каким образом - это уже подскажут мануалы Делфи. Важно учесть два момента:
Момент превый, сохраняйте оффсеты. За 1/50 секундны вряд ли у вас получится посчитать звук для всех 50000 тиков. Например, выйдейт 49970. Т.е. 30 тиков -смещение для следующего цикла обработки. Если это не учесть будет треск.
Второй момент, возможны проблемы синхронизации. Например, пердыдущий массив еще не доигрался, а новый уже добавился. В таком случае, проверяйте сколько недоигранных сэмплов осталось и либо выкидывайте ноты либо пересчитывайте проборцию, нота/тик
Quote:
Zelya, спасибо за информацию... хотя я это уже всё понял!...
Вот только реализация пусть пока еще подождет!
Освежу мозги после предыдущей попытки!..
..или после летней жары
Я было Марату отписал такое...
Quote:
....
Вымучился с примером который genTone основательно!
Результатов «Ноль»! Как я ТЕБЯ понимаю!...
Решил, что пошел «не тем» путем...
буду попробовать такой путь: процедура звука, по мере проигрывания одного буфера,
сама запрашивает подготовленный буфер, когда нужно!
Запрашивает ИМЕННО процедура звука!... Вспомнил, что я когда-то от кого-то такое слышал!...
А не так как мы думаем: «подготовил буфер, и отправил на вывод звука».
Причем, буфер должен подготавливаться во время выполнения (эмуляции команд Кр-580)
т. е. в procedure i8080_do_opcodes(nb_cycles : integer); «по крупинкам»
подготавливается буфер который в любой момент (любым размером) может «затребовать»
процедура вывода звука. Всё это нужно учесть. Вот пока пришёл к таким выводам!
Пишу это тебе за тем... что верю, что у тебя ума побольше
и возможно реализуешь это быстрее чем Я !
Будут результаты пожалуйста напиши!
...
Доброго времени суток !!!!
Спасибо за подсказки ......
объединив всю имеющую информация, сбабахал , более или менее нормальный звук ....
дописал возможность сохранять SAV