Подскажите, как сделать из этого кода IC-таймер, который генерит одно событие в пол миллисекунды?
http://delphi-faq.zoxt.net/491_2_2.htm
Ато мои извращения типа:
code_25345.txt
не дали нормального результата.
(еще вот тут обсуждают какой-то таймер с колбеками из звуковой карты, токо я в коде нихрена не понимаю)
http://cbuilder.ru/index.php?topic=6538.0
Этот топик читают: Гость
Ответов: 1429
Рейтинг: 50
|
|||
карма: 0 |
| ||
файлы: 1 | code_25345.txt [435B] [66] |
Ответов: 3889
Рейтинг: 362
|
|||
login писал(а): не дали нормального результатаА что дали? Что считать "нормальным результатом"? login писал(а): таймер с колбеками из звуковой картыА что вы собрались обрабатывать так часто, тоже звук? login писал(а): одно событие в пол миллисекундыОС у нас не реального времени и не даст Вам такой точности, будет разброс, и довольно заметный. Даже если таймер точный, прерывания, всевозможные диспетчеры памяти, процессов и драйверов устройств никто не отменял. Даже процесс со сверхприоритетом, подвешивающий всю систему, не даст абсолютной точности. Кроме того, многие операции выполнять так часто просто нет смысла или невозможно (например, работать с интерфейсом пользователя), а для других от компьютера потребуется серьёзная производительность, чтобы уложиться в столь короткий промежуток. login писал(а): сделать из этого кода IC-таймерНа том же QueryPerformanceCounter у нас уже есть TimeCounter и использованный Вами Sleep. Приведённый Вами код по сути тот же Sleep. |
|||
карма: 1 |
|
Ответов: 8926
Рейтинг: 823
|
|||
login, элементарно, Ватсон! На FTCG (или IC) делаете с компонентами BASS генератор, который выдаёт один щелчок через каждые 0,5 мсек (при 48000 -- каждый 24-ый), физический выход звука подключаете проволочкой к любому входному контакту LPT ограничив сигнал до 5 В стабилитроном (КС147, КС156), LPT опрашиваете потоком и на выходе через ChangeMon получаете искомое. То же можно проделать использовав вместо звуковой карты СОМ порт, заставив его непрерывно передавать "я", тогда на физическом выходе порта будет меандр с частотой установленной скорости СОМ Только нужно-ли это
|
|||
карма: 19 |
|
Ответов: 1429
Рейтинг: 50
|
|||
1nd1g0, я играю мидифайл со стандартной дискретностью 960 тиков на четверть, от 120 bpm. Это ровно 500 микросекунд.
1nd1g0 писал(а): ОС у нас не реального времени и не даст Вам такой точностиНо тогда не ясно как они скорость, плавно, меняют, если надо 129 bpm, то моя схема не заработает, потому, что надо MMTimer меньше 1 мсек ставить. И как Bass.dll тактирует своё миди на 960 тиков. Наверное пользуется таймером звук карты. Леонид, не подойдет к моей задачке. Надо без железа. |
|||
карма: 0 |
|
Ответов: 8926
Рейтинг: 823
|
|||
login, а Вы не путаете компьютерное время, отсчитываемое по тикам процессора, время в текущей дате, и стабильный поток звука с точно установленной частотой дискретизации на выходе звуковой карты?
|
|||
карма: 19 |
|
Ответов: 1429
Рейтинг: 50
|
|||
Леонид, вроде не путаю. Моя программа состоит из двух типов потоков. Звуковые и Midi. Щас я пишу Midi блок. А звуковые потоки я не буду делать сам, это не возможно, я воспользуюсь подсистемой bass.
Просто, насколько я понял, в bass нет потокового проигрывания миди, с заполнением буферов аналогично звуку. Басс может играть миди только из указанного файла. |
|||
карма: 0 |
|
Ответов: 8926
Рейтинг: 823
|
|||
login, что BASS, что любые другие звуковые DLL для обеспечения непрерывности звука работают через буфер, скидывая данные, например на полсекунды звука рассчитанные за одну миллисекунду, туда, а звуковая карта уже из буфера воспроизводит, а зачем тогда супер-пупер таймер, надо просто считать вырабатываемые слова данных, отсчитал 24 штуки -- вот и 0,5 мсек прошло
|
|||
карма: 19 |
|
Ответов: 1429
Рейтинг: 50
|
|||
Леонид, всё не так с миди.
Потому, что басс ждет от меня сигналов нажатий клавиш на его внутренних VST инструментах. [offtop](у которых где-то есть буфер но доступа к нему нет, они работают постоянно, только молчат пока клавишу не нажмешь)[/offtop]. Аналогично, если басс не брать в рассчет, и играть на внешний миди-порт, на реальном музыкальном инструменте. То у миди порта нет буфера. Это порт реального времени. Поэтому буфер я сам должен сформировать, а значит и "события нажатий нот" сам должен "родить" таймером. (или какими-то колбеками генератора звуковой карты) [offtop](еще подчеркну, что миди порт, и аудио-данные, в звуковой карте, не связаны друг с другом. Миди отдельная система. Друой дело, что Миди как-то синхронизируют с аудио-потоком, это другой вопрос..)[/offtop] |
|||
карма: 0 |
|
Ответов: 3889
Рейтинг: 362
|
|||
login,
|
|||
карма: 1 |
|
Ответов: 1429
Рейтинг: 50
|
|||
1nd1g0, да, только ресурсы процессора на 100% заняты.
Наверное это из-за непрерывного цикла repeat, а можно сделать, чтобы как-то регулировать число проверок тиков процессора, чтобы подобрать оптимальное количество для 500 мкс. ? |
|||
карма: 0 |
|
Ответов: 3889
Рейтинг: 362
|
|||
login, code_25357.txt
|
|||
карма: 1 |
| ||
файлы: 1 | code_25357.txt [2.1KB] [80] |
Ответов: 1429
Рейтинг: 50
|
|||
1nd1g0, всеравно 100% проца
Точность хорошая, но надо как-то, чуток, уменьшить количество проверок. Добавить маленькие слипы в цикл. |
|||
карма: 0 |
|
Ответов: 3889
Рейтинг: 362
|
|||
login, на современных многоядерных ПК столько не занимает, конечно. Слипы вам испортят картину на порядок.
|
|||
карма: 1 |
|
Ответов: 1429
Рейтинг: 50
|
|||
1nd1g0, моя уродливая приблуда со слипом, которую я привел в начале, по сути работает, ей чуток не хватает точности, чтобы стабильно работать(занятость проца 0,1%). А твой вариант слишком точный, тут достаточно подобрать оптимальное количество проверок, чтобы получить что-то среднее между этими методами и оно будет работать.
------------ Дoбавленo в 23.05: У конкурентов миди занимает 0-0,1% проца. И точность плавает в пределах миллисекунды за такт.(такт=1,8 секунды) |
|||
карма: 0 |
|
Ответов: 8926
Рейтинг: 823
|
|||
login, да и по-любому считать тики до заданного количества -- нагрузка на процессор, слип не поможет: он тоже работает в цикле, здесь нужен аппаратный таймер, независимый от процесоора, где-нибудь в BIOS
Безic.jpg |
|||
карма: 19 |
| ||
файлы: 1 | Безic.jpg [43.1KB] [328] |