From: Richard C. <spa...@ec...> - 2007-08-28 16:11:42
|
On Tue, 28 Aug 2007 10:09:51 -0400, Abrolag = <ab...@us...> wrote: > Interesting you come up wit 25mS. I seem to remember (dimly) reading > that auditory response time was approximately 20mS Response time is something else, and much slower. Here's a script I mad= e = to test response time. It plays a drum after a random delay, and you = respond by playing any note, and after ten times it displays your averag= e. #!/usr/bin/perl use Time::HiRes qw( gettimeofday ); sub militime { ($seconds, $microseconds) =3D gettimeofday; return $seconds + $microseconds / 1000000; }; open MIDI, "+</dev/dmmidi"; select MIDI; $| =3D 1; select STDOUT; for ($i =3D 0; $i < 10; $i++) { while ('...') { vec($vector, fileno(MIDI), 1) =3D 1; if (select $vector, undef, undef, 2) { sysread MIDI, $data, 4096; } else { last; }; }; $wait =3D rand(7); select undef, undef, undef, $wait; print MIDI "\x99\x28\x64\x99\x28\x00"; $start =3D militime(); sysread MIDI, $data, 4096; $stop =3D militime(); $latency =3D int(1000 * ($stop - $start) + 0.5); print "Your reaction time: $latency miliseconds\n"; $total +=3D $latency; }; $total =3D int($total / 10 + 0.5); print "Average reaction time: $total miliseconds\n"; close MIDI; Using that script, I get results like this: Your reaction time: 233 miliseconds Your reaction time: 219 miliseconds Your reaction time: 164 miliseconds Your reaction time: 190 miliseconds Your reaction time: 210 miliseconds Your reaction time: 254 miliseconds Your reaction time: 214 miliseconds Your reaction time: 228 miliseconds Your reaction time: 212 miliseconds Your reaction time: 206 miliseconds Average reaction time: 213 miliseconds The best I've managed to do so far is 135 ms. As for my other script, I've become much better at timing with a small = amount of practice, and I've learned not to be 20 ms late every time. I= = also changed the script to create a graph, which looks like this: -120 -110 -100 -90 -80 -70 -60 -50 -40 -30 =3D -20 =3D=3D=3D=3D=3D=3D=3D=3D -10 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 0 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 10 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 30 =3D=3D=3D=3D=3D 40 50 60 70 80 90 100 110 120 The '0' field contains values from -5 to +5, and the '-10' field contain= s = values from -5 to -15, etc. ...or something like that, since obviously = -5 = isn't counted in both of them, but I hate Perl's broken int() function s= o = I'm not going to think about it. Anyway, synchronizing to a sound is a lot easier than reacting to a soun= d, = as most of those are within 25 ms, but my reaction time seems to be ten = = times worse. Here's the script that makes the graph: #!/usr/bin/perl use Time::HiRes qw( gettimeofday ); sub militime { ($seconds, $microseconds) =3D gettimeofday; return $seconds + $microseconds / 1000000; }; open MIDI, "+</dev/dmmidi"; select MIDI; $| =3D 1; select STDOUT; $next =3D int(militime() + 1.25); $wait =3D $next - militime(); select undef, undef, undef, $wait; while ('latencies are everywhere') { print MIDI "\x99\x25\x64\x99\x25\x00"; $next +=3D 0.250; SELECT: vec($vector, fileno(MIDI), 1) =3D 1; $wait =3D $next - militime(); next unless select $vector, undef, undef, $wait; $time =3D militime(); sysread MIDI, $data, 4096, length($data); for ($i =3D 0; $i < length($data) - 2; $i++) { next unless substr($data, $i, 1) eq "\x90"; next unless substr($data, $i + 2, 1) ne "\x00"; if (abs($next - $time) <=3D 0.125) { $latency =3D $next - $time; } else { $latency =3D $next - $time - 0.250; }; $msecs =3D int(1000 * $latency + 0.5 * ($latency <=3D> 0)); $bucket =3D int(100 * $latency + 0.5 * ($latency <=3D> 0)); $bucket =3D +12 if $bucket > +12; $bucket =3D -12 if $bucket < -12; exit if ++$buckets[$bucket+12] > 60; print "\e[d\e[2J"; for ($i =3D 0; $i <=3D 24; $i++) { $v =3D 10 * ($i - 12); $v =3D substr(' ' . $v, -4); print "$v " . '=3D' x $buckets[$i] . "\n"; }; if (abs($msecs) <=3D 16) { print "\e[1;33mLatency: $msecs miliseconds\e[0m\n"; } else { print "Latency: $msecs miliseconds\n"; }; }; $data =3D substr($data, -2) if length($data) > 2; goto SELECT; }; close MIDI; I've noticed my scripts don't work while other MIDI applications are = running. I suppose my scripts also won't work if anyone's keyboard does= = "running status." |