<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Timer Precision</title>
		<link>http://www.allegro.cc/forums/view/586268</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 05 Jul 2006 17:04:24 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ok I already asked how to use timers for my needs and such and it does work, but it&#39;s not precise.  The reason it needs to be exactly precise is I&#39;m creating a metronome where you can change the beats per minute to anything.  This is the main code I am using:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">void</span> calculateMetronome<span class="k2">(</span><span class="k2">)</span> <span class="c">//This is called in the main loop</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td> bps <span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span>tempo <span class="k3">*</span> <span class="n">1000</span><span class="k2">)</span> <span class="k3">/</span> <span class="n">60000</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td> <a href="http://www.delorie.com/djgpp/doc/libc/libc_613.html" target="_blank">pause</a> <span class="k3">=</span> <span class="k2">(</span><span class="n">1000</span> <span class="k3">/</span> bps<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">5</td><td><span class="k2">}</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td><span class="k1">void</span> handleMetronome<span class="k2">(</span><span class="k2">)</span> <span class="c">//This is called after calculate metronome</span></td></tr><tr><td class="number">8</td><td><span class="k2">{</span></td></tr><tr><td class="number">9</td><td> mettimer<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td> <span class="k1">if</span><span class="k2">(</span>mettimer <span class="k3">&gt;</span><span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_613.html" target="_blank">pause</a><span class="k2">)</span></td></tr><tr><td class="number">11</td><td> <span class="k2">{</span></td></tr><tr><td class="number">12</td><td>  <a href="http://www.allegro.cc/manual/play_sample" target="_blank"><span class="a">play_sample</span></a><span class="k2">(</span>click, <span class="n">255</span>, <span class="n">128</span>, <span class="n">1000</span>, FALSE<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>  mettimer <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td> <span class="k2">}</span></td></tr><tr><td class="number">15</td><td><span class="k2">}</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td><span class="c">//This is the main loop</span></td></tr><tr><td class="number">18</td><td><span class="k1">void</span> mainLoop<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">19</td><td><span class="k2">{</span></td></tr><tr><td class="number">20</td><td> <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">21</td><td> <span class="k2">{</span></td></tr><tr><td class="number">22</td><td>  <span class="k1">int</span> mx <span class="k3">=</span> <a href="http://www.allegro.cc/manual/mouse_x" target="_blank"><span class="a">mouse_x</span></a><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>  <span class="k1">int</span> my <span class="k3">=</span> <a href="http://www.allegro.cc/manual/mouse_y" target="_blank"><span class="a">mouse_y</span></a><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>  </td></tr><tr><td class="number">25</td><td>  calculateMetronome<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>  </td></tr><tr><td class="number">27</td><td>  <span class="k1">while</span><span class="k2">(</span>timer <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">28</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">29</td><td>   <span class="k3">-</span><span class="k3">-</span>timer<span class="k2">;</span></td></tr><tr><td class="number">30</td><td>   handleMetronome<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">32</td><td>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_b" target="_blank"><span class="a">mouse_b</span></a> <span class="k3">&amp;</span> <span class="n">1</span><span class="k2">)</span> </td></tr><tr><td class="number">33</td><td>    handleMouse<span class="k2">(</span>mx, my<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td> <span class="k2">}</span></td></tr><tr><td class="number">35</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

That is my code right now.  It works awesome, it&#39;s just the fact that the beats aren&#39;t accurate and there isn&#39;t really a difference unless you change the beats by a large margin(maybe around 30).  I was wondering if there was a much more accurate way to do this?  Or is my method just not accurate itself and is there a better way?  Thank you.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paladin)</author>
		<pubDate>Tue, 04 Jul 2006 21:07:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
Allegro&#39;s timers aren&#39;t too precise..</p><p>Here&#39;s the timing code I use:</p><p>.hpp file
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#include &lt;allegro.h&gt;</span>

<span class="k1">void</span> start_timer<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>
<span class="k1">void</span> reset_timer<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>
<span class="k1">int</span> check_timer<span class="k2">(</span><span class="k1">int</span> frac_sec<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

.cpp file
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">2</td><td><span class="p">#include "timer.hpp"</span></td></tr><tr><td class="number">3</td><td><span class="p">#ifdef ALLEGRO_WINDOWS</span></td></tr><tr><td class="number">4</td><td><span class="p">#include &lt;winalleg.h&gt;</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td><span class="c">// High resolution timer code for Windows .Call start_timer first and then call </span></td></tr><tr><td class="number">7</td><td><span class="c">// check_timer with the required accuracy range.</span></td></tr><tr><td class="number">8</td><td><span class="c">// The timer is more accurate than the default Allegro timers..</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td><span class="k1">struct</span> timer   </td></tr><tr><td class="number">11</td><td><span class="k2">{</span></td></tr><tr><td class="number">12</td><td> LARGE_INTEGER tstart, tticks, tnow<span class="k2">;</span></td></tr><tr><td class="number">13</td><td> <span class="k1">int</span>             started<span class="k2">;</span></td></tr><tr><td class="number">14</td><td> <span class="k1">int</span>             high_freq<span class="k2">;</span></td></tr><tr><td class="number">15</td><td><span class="k2">}</span> timer<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td><span class="k1">void</span> start_timer<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span> </td></tr><tr><td class="number">20</td><td><span class="k2">{</span></td></tr><tr><td class="number">21</td><td>  timer.high_freq <span class="k3">=</span> QueryPerformanceFrequency<span class="k2">(</span><span class="k3">&amp;</span>timer.tticks<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>  </td></tr><tr><td class="number">23</td><td>  <span class="k1">if</span> <span class="k2">(</span>timer.high_freq<span class="k2">)</span>  </td></tr><tr><td class="number">24</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">25</td><td>    QueryPerformanceCounter<span class="k2">(</span><span class="k3">&amp;</span>timer.tstart<span class="k2">)</span><span class="k2">;</span>  </td></tr><tr><td class="number">26</td><td>  <span class="k2">}</span> </td></tr><tr><td class="number">27</td><td><span class="k2">}</span> </td></tr><tr><td class="number">28</td><td>&#160;</td></tr><tr><td class="number">29</td><td><span class="k1">void</span> reset_timer<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span> </td></tr><tr><td class="number">30</td><td><span class="k2">{</span></td></tr><tr><td class="number">31</td><td>  <span class="k1">if</span> <span class="k2">(</span>timer.high_freq<span class="k2">)</span></td></tr><tr><td class="number">32</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">33</td><td>    QueryPerformanceCounter<span class="k2">(</span><span class="k3">&amp;</span>timer.tnow<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>    timer.tstart <span class="k3">=</span> timer.tnow<span class="k2">;</span></td></tr><tr><td class="number">35</td><td>  <span class="k2">}</span> </td></tr><tr><td class="number">36</td><td><span class="k2">}</span> </td></tr><tr><td class="number">37</td><td>&#160;</td></tr><tr><td class="number">38</td><td><span class="k1">int</span> check_timer<span class="k2">(</span><span class="k1">int</span> frac_sec<span class="k2">)</span> </td></tr><tr><td class="number">39</td><td><span class="k2">{</span></td></tr><tr><td class="number">40</td><td>  <span class="k1">if</span> <span class="k2">(</span>timer.high_freq<span class="k2">)</span></td></tr><tr><td class="number">41</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">42</td><td>    QueryPerformanceCounter<span class="k2">(</span><span class="k3">&amp;</span>timer.tnow<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>    <span class="k1">return</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span> <span class="k2">(</span><span class="k2">(</span><span class="k2">(</span>timer.tnow.QuadPart <span class="k3">-</span> timer.tstart.QuadPart<span class="k2">)</span> <span class="k3">*</span> frac_sec<span class="k2">)</span> <span class="k3">/</span> timer.tticks.QuadPart<span class="k2">)</span><span class="k2">;</span>    </td></tr><tr><td class="number">44</td><td>  <span class="k2">}</span>   </td></tr><tr><td class="number">45</td><td>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td><span class="k2">}</span> </td></tr><tr><td class="number">47</td><td>&#160;</td></tr><tr><td class="number">48</td><td><span class="p">#endif  /* </span></td></tr><tr><td class="number">49</td><td> <span class="k3">*</span><span class="k3">/</span></td></tr><tr><td class="number">50</td><td>&#160;</td></tr><tr><td class="number">51</td><td><span class="p">#if defined(ALLEGRO_MACOSX) || defined(ALLEGRO_UNIX)</span></td></tr><tr><td class="number">52</td><td><span class="p">#include &lt;sys/time.h&gt;</span></td></tr><tr><td class="number">53</td><td>&#160;</td></tr><tr><td class="number">54</td><td><span class="c">// Timer code for OSX.Call start_timer first and then call </span></td></tr><tr><td class="number">55</td><td><span class="c">// check_timer with the required accuracy range.</span></td></tr><tr><td class="number">56</td><td>    </td></tr><tr><td class="number">57</td><td><span class="k1">static</span> <span class="k1">struct</span> timeval tstart<span class="k2">;</span></td></tr><tr><td class="number">58</td><td>&#160;</td></tr><tr><td class="number">59</td><td>&#160;</td></tr><tr><td class="number">60</td><td><span class="k1">void</span> start_timer<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span> </td></tr><tr><td class="number">61</td><td><span class="k2">{</span>  </td></tr><tr><td class="number">62</td><td>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_421.html" target="_blank">gettimeofday</a><span class="k2">(</span><span class="k3">&amp;</span>tstart, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">63</td><td><span class="k2">}</span> </td></tr><tr><td class="number">64</td><td>&#160;</td></tr><tr><td class="number">65</td><td><span class="k1">void</span> reset_timer<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span> </td></tr><tr><td class="number">66</td><td><span class="k2">{</span></td></tr><tr><td class="number">67</td><td>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_421.html" target="_blank">gettimeofday</a><span class="k2">(</span><span class="k3">&amp;</span>tstart, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">68</td><td><span class="k2">}</span> </td></tr><tr><td class="number">69</td><td>&#160;</td></tr><tr><td class="number">70</td><td><span class="k1">int</span> check_timer<span class="k2">(</span><span class="k1">int</span> frac_sec<span class="k2">)</span> </td></tr><tr><td class="number">71</td><td><span class="k2">{</span></td></tr><tr><td class="number">72</td><td>  <span class="k1">struct</span> timeval  now<span class="k2">;</span></td></tr><tr><td class="number">73</td><td>  <span class="k1">double</span>          hi, lo<span class="k2">;</span></td></tr><tr><td class="number">74</td><td>  </td></tr><tr><td class="number">75</td><td>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_421.html" target="_blank">gettimeofday</a><span class="k2">(</span><span class="k3">&amp;</span>now, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">76</td><td>  </td></tr><tr><td class="number">77</td><td>  hi <span class="k3">=</span> <span class="k2">(</span><span class="k1">double</span><span class="k2">)</span> <span class="k2">(</span>now.tv_sec <span class="k3">-</span> tstart.tv_sec<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">78</td><td>  lo <span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">double</span><span class="k2">)</span> <span class="k2">(</span>now.tv_usec <span class="k3">-</span> tstart.tv_usec<span class="k2">)</span><span class="k2">)</span> <span class="k3">/</span> <span class="n">1</span>.<span class="n">0e6</span><span class="k2">;</span></td></tr><tr><td class="number">79</td><td>  </td></tr><tr><td class="number">80</td><td>  <span class="k1">return</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span> <span class="k2">(</span><span class="k2">(</span>hi <span class="k3">+</span> lo<span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">double</span><span class="k2">)</span> frac_sec<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">81</td><td><span class="k2">}</span> </td></tr><tr><td class="number">82</td><td>&#160;</td></tr><tr><td class="number">83</td><td><span class="p">#endif  /* */</span></td></tr></tbody></table></div></div><p>


Once you&#39;ve called start_timer, you can do say time = check_timer(100); Which will check with a precision of 100 ticks per second. You should be able to go up to at least (250) ticks per second precision. Just remember to call reset_timer before you do another check if you&#39;ve found a new tick.. I.e.:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">if</span> <span class="k2">(</span>check_timer<span class="k2">(</span><span class="n">100</span><span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="k2">{</span>
 <span class="c">// do stuff..</span>
 reset_timer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

Hope that helps. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Tue, 04 Jul 2006 21:17:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>How am I supposed to implement this with my code?  Do I call check_timer(); in the main while loop?  Or do I replace the if(timer &lt; 0) line in my main loop with a different variable?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paladin)</author>
		<pubDate>Tue, 04 Jul 2006 21:25:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Change:
</p><div class="source-code snippet"><div class="inner"><pre>  <span class="k1">while</span><span class="k2">(</span>timer <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span>
  <span class="k2">{</span>
   <span class="k3">-</span><span class="k3">-</span>timer<span class="k2">;</span>
   handleMetronome<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
  <span class="k2">}</span>
</pre></div></div><p>

to:
</p><div class="source-code snippet"><div class="inner"><pre>  timer <span class="k3">=</span> check_timer<span class="k2">(</span><span class="n">100</span><span class="k2">)</span><span class="k2">;</span>
  <span class="k1">while</span> <span class="k2">(</span>timer <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span>
  <span class="k2">{</span>
   reset_timer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
   handleMetronome<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
  <span class="k2">}</span>
</pre></div></div><p>
You would have to add a start_timer() call before the main loop and use a timer global variable in your program that other functions can use (like you have now with an allegro timer. (or you could pass it to your functions as a variable).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Tue, 04 Jul 2006 21:33:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ok, I have this timer code of yours put in at the top of my source and it works great, but the problem is that it plays the sound very fast.  What type of time measurement am I dealing with so I can change my algorithm to find the pause inbetween each sound?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paladin)</author>
		<pubDate>Tue, 04 Jul 2006 21:48:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
I&#39;m not sure what you mean.. I don&#39;t know music calculations. But the value you call check_timer() with is the accuracy. I.e. using check_timer(1); would mean that the value returned would be the number of seconds since the last reset_timer call.</p><p>10 would be 10&#39;ths of a second, etc.. So if check timer(100) returns 100 then 1 second has elaped.</p><p>Is that helpful?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Tue, 04 Jul 2006 21:52:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yeah that makes sense.  I&#39;m simply trying to get the pause inbetween each beat by finding the beats per second (from beats per minute). So I can change that value to whatever I want to make it more accurate?</p><p>EDIT: I am also noticing that I cannot do anything when the program starts.  I can&#39;t press any keys or click on anything with my mouse.  I think it&#39;s because of the sound playing, but I don&#39;t think it should be doing that.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paladin)</author>
		<pubDate>Tue, 04 Jul 2006 22:06:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
So I can change that value to whatever I want to make it more accurate?
</p></div></div><p>
Yes..</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I am also noticing that I cannot do anything when the program starts. I can&#39;t press any keys or click on anything with my mouse. I think it&#39;s because of the sound playing, but I don&#39;t think it should be doing that.
</p></div></div><p>
No idea with this problem. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Tue, 04 Jul 2006 22:12:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ok everything is fine except the metronome code now.  I&#39;m not sure if I&#39;m handling it correctly or not.</p><p>Main Loop:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>&#160;</td></tr><tr><td class="number">2</td><td><span class="k1">void</span> mainLoop<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">3</td><td><span class="k2">{</span></td></tr><tr><td class="number">4</td><td> <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">5</td><td> <span class="k2">{</span></td></tr><tr><td class="number">6</td><td>  <span class="k1">int</span> mx <span class="k3">=</span> <a href="http://www.allegro.cc/manual/mouse_x" target="_blank"><span class="a">mouse_x</span></a><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>  <span class="k1">int</span> my <span class="k3">=</span> <a href="http://www.allegro.cc/manual/mouse_y" target="_blank"><span class="a">mouse_y</span></a><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>  </td></tr><tr><td class="number">9</td><td>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_b" target="_blank"><span class="a">mouse_b</span></a> <span class="k3">&amp;</span> <span class="n">1</span><span class="k2">)</span> </td></tr><tr><td class="number">10</td><td>    handleMouse<span class="k2">(</span>mx, my<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>  calculateMetronome<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>  </td></tr><tr><td class="number">13</td><td>  <span class="k1">while</span><span class="k2">(</span>check_timer<span class="k2">(</span><span class="n">100</span><span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">14</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">15</td><td>   reset_timer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>   handleMetronome<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">18</td><td> <span class="k2">}</span></td></tr><tr><td class="number">19</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

Code to make sound occur every so often
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> handleMetronome<span class="k2">(</span><span class="k2">)</span>
<span class="k2">{</span>
 <span class="k1">if</span><span class="k2">(</span>check_timer<span class="k2">(</span><span class="n">100</span><span class="k2">)</span> <span class="k3">&gt;</span><span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_613.html" target="_blank">pause</a><span class="k2">)</span>
 <span class="k2">{</span>
  <a href="http://www.allegro.cc/manual/play_sample" target="_blank"><span class="a">play_sample</span></a><span class="k2">(</span>click, <span class="n">255</span>, <span class="n">128</span>, <span class="n">1000</span>, FALSE<span class="k2">)</span><span class="k2">;</span>
  reset_timer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
 <span class="k2">}</span>
<span class="k2">}</span>
</pre></div></div><p>

Can I use the check_timer twice like that or am I doing it incorrectly?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paladin)</author>
		<pubDate>Tue, 04 Jul 2006 22:22:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
Not sure about the sound issue.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Can I use the check_timer twice like that or am I doing it incorrectly?
</p></div></div><p>
No that&#39;s fine. However, wouldn&#39;t it be easier to do a fixed rate check, i.e. check_timer(200); And then have your metronome data take this into account with the song&#39;s tempo?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Tue, 04 Jul 2006 22:27:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Is this what you mean?
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> handleMetronome<span class="k2">(</span><span class="k2">)</span>
<span class="k2">{</span>
 mettimer <span class="k3">=</span> check_timer<span class="k2">(</span><span class="n">100</span><span class="k2">)</span><span class="k2">;</span>
 <span class="k1">if</span><span class="k2">(</span>mettimer <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">100</span><span class="k2">)</span>
 <span class="k2">{</span>
  <a href="http://www.allegro.cc/manual/play_sample" target="_blank"><span class="a">play_sample</span></a><span class="k2">(</span>click, <span class="n">255</span>, <span class="n">128</span>, <span class="n">1000</span>, FALSE<span class="k2">)</span><span class="k2">;</span>
  reset_timer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
 <span class="k2">}</span>
<span class="k2">}</span>
</pre></div></div><p>

This is the main loop at the moment:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">void</span> mainLoop<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td> <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">4</td><td> <span class="k2">{</span></td></tr><tr><td class="number">5</td><td>  <span class="k1">int</span> mx <span class="k3">=</span> <a href="http://www.allegro.cc/manual/mouse_x" target="_blank"><span class="a">mouse_x</span></a><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>  <span class="k1">int</span> my <span class="k3">=</span> <a href="http://www.allegro.cc/manual/mouse_y" target="_blank"><span class="a">mouse_y</span></a><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>  </td></tr><tr><td class="number">8</td><td>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_b" target="_blank"><span class="a">mouse_b</span></a> <span class="k3">&amp;</span> <span class="n">1</span><span class="k2">)</span> </td></tr><tr><td class="number">9</td><td>    handleMouse<span class="k2">(</span>mx, my<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>  calculateMetronome<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>  </td></tr><tr><td class="number">12</td><td>  <span class="k1">while</span><span class="k2">(</span>check_timer<span class="k2">(</span><span class="n">100</span><span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">13</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">14</td><td>   reset_timer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>   handleMetronome<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">17</td><td> <span class="k2">}</span></td></tr><tr><td class="number">18</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

It&#39;s still not working either way though.  Sorry to seem stupid.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paladin)</author>
		<pubDate>Tue, 04 Jul 2006 23:26:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>this is the way I&#39;ve done it for my sequencer, and the playback is pretty acurate.  To change the tempo, just call set_playback_tempo() and get_playback_tempo().  In my sequencer, however, nothing is being drawn to the screen during playback.  This is to ensure acurate timing.</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">volatile</span> <span class="k1">int</span> game_counter<span class="k2">;</span></td></tr><tr><td class="number">2</td><td><span class="k1">void</span> my_timer_handler<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> game_counter<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span> <span class="k2">}</span></td></tr><tr><td class="number">3</td><td><a href="http://www.allegro.cc/manual/END_OF_FUNCTION" target="_blank"><span class="a">END_OF_FUNCTION</span></a><span class="k2">(</span>my_timer_handler<span class="k2">)</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td><span class="k1">void</span> setup_sound<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">7</td><td><span class="k2">{</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td>   <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/install_int_ex" target="_blank"><span class="a">install_int_ex</span></a><span class="k2">(</span>my_timer_handler, BPS_TO_TIMER<span class="k2">(</span><span class="n">1000</span><span class="k2">)</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">10</td><td>   <span class="k2">{</span></td></tr><tr><td class="number">11</td><td>      <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"cannot setup playback timer"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">13</td><td>   <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>my_timer_handler<span class="k2">)</span><span class="k2">;</span>    <span class="c">//locks the function so not to cause problems while interrupting</span></td></tr><tr><td class="number">14</td><td>   <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>game_counter<span class="k2">)</span><span class="k2">;</span>      <span class="c">//locks the variable so not to cause problems while interrupting</span></td></tr><tr><td class="number">15</td><td>&#160;</td></tr><tr><td class="number">16</td><td><span class="k2">}</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td><span class="c">////////////</span></td></tr><tr><td class="number">20</td><td>&#160;</td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td><span class="k1">float</span> playback_cursor <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td><span class="k1">double</span> playback_speed <span class="k3">=</span> <span class="n">1</span>.<span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td><span class="k1">double</span> odd_multiplier <span class="k3">=</span> <span class="n">1</span>.<span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>&#160;</td></tr><tr><td class="number">26</td><td><span class="k1">void</span> set_playback_tempo<span class="k2">(</span><span class="k1">double</span> tempo, Duration duration<span class="k3">=</span>DURATION_quarter, <span class="k1">int</span> dots<span class="k3">=</span><span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">27</td><td><span class="k2">{</span></td></tr><tr><td class="number">28</td><td>     playback_speed <span class="k3">=</span> <span class="k2">(</span>tempo <span class="k3">/</span> <span class="n">120</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td><span class="k2">}</span></td></tr><tr><td class="number">30</td><td>&#160;</td></tr><tr><td class="number">31</td><td><span class="k1">double</span> get_playback_tempo<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">32</td><td><span class="k2">{</span></td></tr><tr><td class="number">33</td><td>     <span class="k1">return</span> <span class="k2">(</span>playback_speed <span class="k3">*</span> <span class="n">120</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td><span class="k2">}</span></td></tr><tr><td class="number">35</td><td>&#160;</td></tr><tr><td class="number">36</td><td>&#160;</td></tr><tr><td class="number">37</td><td><span class="c">////////////</span></td></tr><tr><td class="number">38</td><td>&#160;</td></tr><tr><td class="number">39</td><td>&#160;</td></tr><tr><td class="number">40</td><td><span class="k1">void</span> main_loop<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">41</td><td><span class="k2">{</span></td></tr><tr><td class="number">42</td><td>   <span class="k1">if</span> <span class="k2">(</span>game_counter <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">43</td><td>   <span class="k2">{</span></td></tr><tr><td class="number">44</td><td>      game_counter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td>      playback_cursor <span class="k3">+</span><span class="k3">=</span> <span class="k2">(</span>playback_speed <span class="k3">*</span> odd_multiplier<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">47</td><td>&#160;</td></tr><tr><td class="number">48</td><td>   <span class="k1">if</span> <span class="k2">(</span>playback_cursor <span class="k3">&gt;</span><span class="k3">=</span> <span class="k3">*</span><span class="k3">*</span>the_note<span class="s">'s_attack_time**) play_note();</span></td></tr><tr><td class="number">49</td><td><span class="s">}</span></td></tr></tbody></table></div></div><p>

the only strange thing is when I change MIDI drivers, I sometimes have to set the odd multiplier to 7.0 . <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Tue, 04 Jul 2006 23:37:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m trying to find a method more accurate than the allegro default timers actually.  None of my code is working.  &gt;&lt;
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paladin)</author>
		<pubDate>Wed, 05 Jul 2006 00:47:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Check <a href="http://www.allegro.cc/forums/thread/585140">this thread</a> for HighRes Timer.</p><p><a href="http://www.nilorea.net/gull/DOCS/html/common_8h-source.html#l00244">Here</a> is my own wrapper.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Wed, 05 Jul 2006 14:03:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
GullRaDriel: Did you read this thread? I already posted high res timer code.. <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Wed, 05 Jul 2006 14:51:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I already posted high res timer code..
</p></div></div><p>

I know, but there are C/C++, RDTSC, and lots of various way of using GTOD &amp; QPC.</p><p>I was not trying to say that your code is not right, I was trying to help.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
GullRaDriel: Did you read this thread?
</p></div></div><p>

I am at work, and I did not took the time to read the whole thread. </p><p>Last, be sure I would have put your code into the thread if only I was able to edit it.</p><p>My excuse, dear RP.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Wed, 05 Jul 2006 17:04:24 +0000</pubDate>
	</item>
</rss>
