У меня такое ощущение, что ваша битовая буферизация неверна. Когда вы перемещаете свой клип, его вообще не нужно перерисовывать. Вы можете попробовать с этой структурой компонента клипа:
TMidiClip = Class(TControl)
Private
FBuffer: TBitmap;
FGridPos: TPoint;
FHasToRepaint: Boolean;
Public
Procedure Paint; Override; // you only draw the bitmap on the control canvas
Procedure Refresh; // you recompute the FBuffer.canvas
End;
Когда вы изменяете некоторые свойства, такие как «длина галочки клипа», вы устанавливаете для «FHasToRepaint» значение true, но не при изменении «FGridPos» (позиция в сетке). Так что большую часть времени в вашем событии Paint у вас есть только копия вашего FBuffer.
На самом деле, это очень зависит от дизайна вашей сетки и ее дочерних элементов (клипов).
Я могу ошибаться, но кажется, что ваш дизайн недостаточно разложен в элементах управления: основная сетка должна быть TControl, клип должен быть TControl, даже события в клипе должны быть некоторыми TControls ... Вы можете определить только таким образом, сильно оптимизированная система буферизации растровых изображений (или «двойная буферизация»).
О таймере: вы должны использовать музыкальные часы, которые обрабатывают на аудиосэмпл , иначе у вас не будет достаточно хорошего разрешения. Такие часы могут быть реализованы с помощью «драйвера аудио Windows» (mmsystem.pas) или драйвера «Asio» (у вас есть интерфейс в BASS, например, проект Delphi Asio Vst).