Вверх ↑
Этот топик читают: Гость
Ответов: 1429
Рейтинг: 50
#1: 2011-10-04 03:58:41 ЛС | профиль | цитата
Подскажите, как сделать из этого кода IC-таймер, который генерит одно событие в пол миллисекунды?
http://delphi-faq.zoxt.net/491_2_2.htm

Ато мои извращения типа:

code_25345.txt
не дали нормального результата.

(еще вот тут обсуждают какой-то таймер с колбеками из звуковой карты, токо я в коде нихрена не понимаю)
http://cbuilder.ru/index.php?topic=6538.0
карма: 0

0
файлы: 1code_25345.txt [435B] [66]
Ответов: 3889
Рейтинг: 362
#2: 2011-10-04 08:42:28 ЛС | профиль | цитата
login писал(а):
не дали нормального результата

А что дали? Что считать "нормальным результатом"?

login писал(а):
таймер с колбеками из звуковой карты

А что вы собрались обрабатывать так часто, тоже звук?

login писал(а):
одно событие в пол миллисекунды

ОС у нас не реального времени и не даст Вам такой точности, будет разброс, и довольно заметный. Даже если таймер точный, прерывания, всевозможные диспетчеры памяти, процессов и драйверов устройств никто не отменял. Даже процесс со сверхприоритетом, подвешивающий всю систему, не даст абсолютной точности. Кроме того, многие операции выполнять так часто просто нет смысла или невозможно (например, работать с интерфейсом пользователя), а для других от компьютера потребуется серьёзная производительность, чтобы уложиться в столь короткий промежуток.

login писал(а):
сделать из этого кода IC-таймер

На том же QueryPerformanceCounter у нас уже есть TimeCounter и использованный Вами Sleep. Приведённый Вами код по сути тот же Sleep.
карма: 1

0
Ответов: 8926
Рейтинг: 823
#3: 2011-10-04 09:36:14 ЛС | профиль | цитата
login, элементарно, Ватсон! На FTCG (или IC) делаете с компонентами BASS генератор, который выдаёт один щелчок через каждые 0,5 мсек (при 48000 -- каждый 24-ый), физический выход звука подключаете проволочкой к любому входному контакту LPT ограничив сигнал до 5 В стабилитроном (КС147, КС156), LPT опрашиваете потоком и на выходе через ChangeMon получаете искомое. То же можно проделать использовав вместо звуковой карты СОМ порт, заставив его непрерывно передавать "я", тогда на физическом выходе порта будет меандр с частотой установленной скорости СОМ Только нужно-ли это
карма: 19

0
Ответов: 1429
Рейтинг: 50
#4: 2011-10-04 19:24:40 ЛС | профиль | цитата
1nd1g0, я играю мидифайл со стандартной дискретностью 960 тиков на четверть, от 120 bpm. Это ровно 500 микросекунд.

1nd1g0 писал(а):
ОС у нас не реального времени и не даст Вам такой точности
все секвенсоры, под XP, играют с этой точностью. Я померял профессиональный софт, колеблется аккуратность +/- 1 миллисекунда за такт. Но никогда не 500 милисек!! Поэтому, я подумал, что они сделали примерно так же, со слипом, наверное у нас интерфейсные точки вмешиваются в процесс, может просто нужно соеденить два элемента в один.

Но тогда не ясно как они скорость, плавно, меняют, если надо 129 bpm, то моя схема не заработает, потому, что надо MMTimer меньше 1 мсек ставить.

И как Bass.dll тактирует своё миди на 960 тиков. Наверное пользуется таймером звук карты.

Леонид, не подойдет к моей задачке. Надо без железа.
карма: 0

0
Ответов: 8926
Рейтинг: 823
#5: 2011-10-04 20:45:47 ЛС | профиль | цитата
login, а Вы не путаете компьютерное время, отсчитываемое по тикам процессора, время в текущей дате, и стабильный поток звука с точно установленной частотой дискретизации на выходе звуковой карты?
карма: 19

0
Ответов: 1429
Рейтинг: 50
#6: 2011-10-04 21:13:17 ЛС | профиль | цитата
Леонид, вроде не путаю. Моя программа состоит из двух типов потоков. Звуковые и Midi. Щас я пишу Midi блок. А звуковые потоки я не буду делать сам, это не возможно, я воспользуюсь подсистемой bass.

Просто, насколько я понял, в bass нет потокового проигрывания миди, с заполнением буферов аналогично звуку. Басс может играть миди только из указанного файла.
карма: 0

0
Ответов: 8926
Рейтинг: 823
#7: 2011-10-04 21:47:26 ЛС | профиль | цитата
login, что BASS, что любые другие звуковые DLL для обеспечения непрерывности звука работают через буфер, скидывая данные, например на полсекунды звука рассчитанные за одну миллисекунду, туда, а звуковая карта уже из буфера воспроизводит, а зачем тогда супер-пупер таймер, надо просто считать вырабатываемые слова данных, отсчитал 24 штуки -- вот и 0,5 мсек прошло
карма: 19

0
Ответов: 1429
Рейтинг: 50
#8: 2011-10-04 22:00:51 ЛС | профиль | цитата
Леонид, всё не так с миди.

Потому, что басс ждет от меня сигналов нажатий клавиш на его внутренних VST инструментах. [offtop](у которых где-то есть буфер но доступа к нему нет, они работают постоянно, только молчат пока клавишу не нажмешь)[/offtop].

Аналогично, если басс не брать в рассчет, и играть на внешний миди-порт, на реальном музыкальном инструменте. То у миди порта нет буфера. Это порт реального времени. Поэтому буфер я сам должен сформировать, а значит и "события нажатий нот" сам должен "родить" таймером. (или какими-то колбеками генератора звуковой карты)

[offtop](еще подчеркну, что миди порт, и аудио-данные, в звуковой карте, не связаны друг с другом. Миди отдельная система. Друой дело, что Миди как-то синхронизируют с аудио-потоком, это другой вопрос..)[/offtop]
карма: 0

0
Ответов: 3889
Рейтинг: 362
#9: 2011-10-04 22:28:34 ЛС | профиль | цитата
login,

Add(MainForm,2953706,420,91)
{
Point(onClose)
}
Add(InlineCode,3036192,273,189)
{
@Hint=#9:CLOCKER -|16:Генератор тактов|
WorkPoints=#60:doClockMks=Генератор тактов с периодом Delay в микросекундах|34:doStop=Остановка генератора тактов|
EventPoints=#54:onClock=Событие происходит каждые Delay единиц времени|
DataPoints=#5:Delay|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses kol,Share,Windows,Debug;|0:|4:type|29: THiAsmClass = class(TDebug)|10: private|17: FStop:boolean;|9: public|20: Delay:THI_Event;|22: onClock:THI_Event;|0:|54: procedure doClockMks(var _Data:TData; Index:word);|50: procedure doStop(var _Data:TData; Index:word);|6: end;|0:|14:implementation|0:|33:procedure THiAsmClass.doClockMks;|20:var sp,ep,cnt:int64;|12:var dl:real;|5:begin|18: FStop := false;|34: QueryPerformanceFrequency(cnt);|26: cnt := cnt div 1000000;|28: dl := ToRealEvent(Delay);|27: while not FStop do begin|34: QueryPerformanceCounter(sp);|12: repeat|34: QueryPerformanceCounter(ep);|34: until (ep - sp)div cnt > dl;|33: _hi_OnEvent(onClock,_Data);|32:// _hi_OnEvent(onClock,dl);|7: end;|4:end;|0:|29:procedure THiAsmClass.doStop;|5:begin|16: FStop := true;|4:end;|0:|4:end.|
link(onClock,6640081:doStop,[(313,195)(313,97)])
link(Delay,5231732:Value,[])
AddHint(28,59,90,26,@Hint)
}
Add(Memory,5231732,273,140)
{
Default=Integer(1000000)
}
Add(Button,13603856,194,182)
{
Left=270
Top=145
Align=5
link(onClick,4052253:doEvent1,[])
}
Add(TimeCounter,6640081,322,84)
{
Precision=1
link(onStop,11501098:doEvent1,[])
}
Add(Hub,4052253,243,182)
{
link(onEvent1,14456206:doWork2,[(261,188)(261,89)])
link(onEvent2,3036192:doClockMks,[])
}
Add(Hub,11501098,378,91)
{
link(onEvent1,2953706:doCaption,[])
link(onEvent2,14456206:doWork1,[(405,104)(405,49)(294,49)])
}
Add(HubEx,14456206,290,83)
{
link(onEvent,6640081:doStart,[(318,89)(318,90)])
}


карма: 1

0
Ответов: 1429
Рейтинг: 50
#10: 2011-10-04 22:40:20 ЛС | профиль | цитата
1nd1g0, да, только ресурсы процессора на 100% заняты.

Наверное это из-за непрерывного цикла repeat, а можно сделать, чтобы как-то регулировать число проверок тиков процессора, чтобы подобрать оптимальное количество для 500 мкс. ?
карма: 0

0
Ответов: 3889
Рейтинг: 362
#11: 2011-10-04 22:49:35 ЛС | профиль | цитата
login, code_25357.txt
карма: 1

0
файлы: 1code_25357.txt [2.1KB] [80]
Ответов: 1429
Рейтинг: 50
#12: 2011-10-04 22:53:59 ЛС | профиль | цитата
1nd1g0, всеравно 100% проца
Точность хорошая, но надо как-то, чуток, уменьшить количество проверок. Добавить маленькие слипы в цикл.
карма: 0

0
Ответов: 3889
Рейтинг: 362
#13: 2011-10-04 22:58:38 ЛС | профиль | цитата
login, на современных многоядерных ПК столько не занимает, конечно. Слипы вам испортят картину на порядок.
карма: 1

0
Ответов: 1429
Рейтинг: 50
#14: 2011-10-04 23:05:07 ЛС | профиль | цитата
1nd1g0, моя уродливая приблуда со слипом, которую я привел в начале, по сути работает, ей чуток не хватает точности, чтобы стабильно работать(занятость проца 0,1%). А твой вариант слишком точный, тут достаточно подобрать оптимальное количество проверок, чтобы получить что-то среднее между этими методами и оно будет работать.
------------ Дoбавленo в 23.05:
У конкурентов миди занимает 0-0,1% проца. И точность плавает в пределах миллисекунды за такт.(такт=1,8 секунды)
карма: 0

0
Ответов: 8926
Рейтинг: 823
#15: 2011-10-04 23:19:46 ЛС | профиль | цитата
login, да и по-любому считать тики до заданного количества -- нагрузка на процессор, слип не поможет: он тоже работает в цикле, здесь нужен аппаратный таймер, независимый от процесоора, где-нибудь в BIOS
Безic.jpg
карма: 19

0
файлы: 1Безic.jpg [43.1KB] [328]
Сообщение
...
Прикрепленные файлы
(файлы не залиты)