From: Robert M. <rob...@us...> - 2007-11-10 09:42:26
|
On 06/09/2007, Veli-Pekka T=E4til=E4 <vt...@ma...> wrote: > How good is the Win32::GUI timer for semi realtime applications? Pretty much useless. The underlying mechanism (using the WM_TIMER message) has no guarantees on accuracy, and if the application is processing many messages delivery of WM_TIMER messages takes the lowest priority and will likely happen late. > I've > codedd a drum machine, minus some final tweaks and testing, in Perl > using Win32::GUI as the GUI lib and Win32::MIDI for MIDI. I generate my > own note off events (note on velocity 0) so that Win32::MIDI does not > have to sleep. As I want the ability to operate the GUI while the thing > plays back stuff, I use Win32::GUI::Timer as the heart beat for my step > sequencer. I need the ability to time pretty exactly 32th notes from 50 > to 250 bpm (150 to 30 ms), I expect you'll need a different mechanism. Win32 provides special multimedia timer APIs for this purpose (look up timeSetEvent and the related time* functions in MSDN). > since I want to be able to quantize the > user's input to the closest 16th note (step). I'd also need a pretty > exact sleep for generating lag for swing, at max one 32th note and > possibly much smaller values, too. I'm using Win32::Sleep for the swing, > at the moment. Win32::Sleep won't accurately time less that about 50ms (IIRC), especially on older machines. > Timing seems surprisingly stable and even though I use large amounts of > objects (each step is one) and hash lookups Perl's CPU usage shows 0, > even when playing simultaneously 12 parts at 250 bpm. However, at some > pretty normal tempo ranges like 130 to 140 BPM, changing the tempo does > seem to have very little effect. However, if I export the data as MIDi > at 960 PPQ, I use the MIDI Perl modules for that, the tempo does change. Right - WM_TIMER messages get delivered when they can - at some point they stop getting delivered any faster ... Regards, Rob. |