<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Audio waveform with unexpected frequency behavior</title>
		<link>http://www.allegro.cc/forums/view/617880</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 10 Jul 2019 20:05:17 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello. I&#39;ve been playing around with audio recently, specifically trying to code a simple synthesizer. It works fine when only unchanging (static) frequencies are used (see ex_synth), but as soon as I try to interpolate a frequency when generating the waveform, things go ... wonky.</p><p>Here&#39;s the clearest explanation of the problem that I know how to give: the program generates a waveform. The waveform should ramp smoothly from a lower frequency to a higher frequency, without detour. But instead, the waveform ramps too high (for reasons I can&#39;t even begin to guess at) before finally coming down to the target.</p><p>The code is a complete program that demonstrates the problem.</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span>
<span class="number">   2</span><span class="c">// This program generates a 5-second audio waveform that is supposed to ramp up</span>
<span class="number">   3</span><span class="c">// smoothly from 220 hertz to 620 hertz in 4 seconds, with 1 remaining second at</span>
<span class="number">   4</span><span class="c">// 620 hertz.</span>
<span class="number">   5</span><span class="c">//</span>
<span class="number">   6</span><span class="c">// The expected result is that the audio sound ramps up smoothly from one</span>
<span class="number">   7</span><span class="c">// frequency to another. Directly. Don't pass GO, don't collect $200.</span>
<span class="number">   8</span><span class="c">//</span>
<span class="number">   9</span><span class="c">// The actual result is that the frequency ramps up higher than it should, then</span>
<span class="number">  10</span><span class="c">// comes back down to the target frequency. How odd!</span>
<span class="number">  11</span><span class="c">//</span>
<span class="number">  12</span><span class="c">// The described problem is denied by the printouts generated when the program</span>
<span class="number">  13</span><span class="c">// is run, which indicate that the frequency *should be* ramping as expected</span>
<span class="number">  14</span><span class="c">// without frequency artifacts. But of course, the actual generated sound</span>
<span class="number">  15</span><span class="c">// contradicts this. Take note of the 'Freq' column; it proves that the</span>
<span class="number">  16</span><span class="c">// interpolation function works as expected. I'm pretty sure the problem isn't</span>
<span class="number">  17</span><span class="c">// there -- the interpolation function is used in many other places in the real</span>
<span class="number">  18</span><span class="c">// codebase without any issues. The algorithm was extracted off a math site.</span>
<span class="number">  19</span><span class="c">//</span>
<span class="number">  20</span><span class="c">// Note: in other tests the waveform was written to a file and inspected in an</span>
<span class="number">  21</span><span class="c">// audio editor. The saved waveform exhibits the same problem.</span>
<span class="number">  22</span>
<span class="number">  23</span><span class="p">#include &lt;cstdint&gt;</span>
<span class="number">  24</span><span class="p">#include &lt;cstddef&gt;</span>
<span class="number">  25</span><span class="p">#include &lt;cstdlib&gt;</span>
<span class="number">  26</span><span class="p">#include &lt;cassert&gt;</span>
<span class="number">  27</span><span class="p">#include &lt;cstdio&gt;</span>
<span class="number">  28</span><span class="p">#include &lt;cmath&gt;</span>
<span class="number">  29</span>
<span class="number">  30</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  31</span><span class="p">#include &lt;allegro5/allegro_audio.h&gt;</span>
<span class="number">  32</span>
<span class="number">  33</span><span class="c">// Interpolates from one frequency to another within a duration.</span>
<span class="number">  34</span><span class="k1">float</span> interpolate<span class="k2">(</span><span class="k1">float</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>, <span class="k1">float</span> base, <span class="k1">float</span> change, <span class="k1">float</span> duration<span class="k2">)</span>
<span class="number">  35</span><span class="k2">{</span>
<span class="number">  36</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>duration <span class="k3">&gt;</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  37</span>  <span class="k1">auto</span> pi <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/ALLEGRO_PI"><span class="a">ALLEGRO_PI</span></a><span class="k2">;</span>
<span class="number">  38</span>
<span class="number">  39</span>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span> <span class="k1">return</span> base<span class="k2">;</span>
<span class="number">  40</span>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&gt;</span><span class="k3">=</span> duration<span class="k2">)</span> <span class="k1">return</span> base <span class="k3">+</span> change<span class="k2">;</span>
<span class="number">  41</span>
<span class="number">  42</span>  <span class="c">// This is a simple sinusoidal in/out interpolation. This math has been</span>
<span class="number">  43</span>  <span class="c">// well-tested in the real codebase for other purposes, there are no known</span>
<span class="number">  44</span>  <span class="c">// problems with it.</span>
<span class="number">  45</span>  <span class="k1">return</span> <span class="k3">-</span>change <span class="k3">/</span> <span class="n">2</span>.<span class="n">0f</span> <span class="k3">*</span> <span class="k2">(</span>std::cos<span class="k2">(</span>pi <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">/</span> duration<span class="k2">)</span> <span class="k3">-</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k3">+</span> base<span class="k2">;</span>
<span class="number">  46</span><span class="k2">}</span>
<span class="number">  47</span>
<span class="number">  48</span><span class="c">// Generates the waveform.</span>
<span class="number">  49</span><span class="k1">void</span> waveform<span class="k2">(</span>
<span class="number">  50</span>  <span class="k1">float</span><span class="k3">*</span> buffer, <span class="k1">int32_t</span> samples, <span class="k1">float</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>, <span class="k1">uint64_t</span> count, <span class="k1">float</span> vfreq<span class="k2">)</span>
<span class="number">  51</span><span class="k2">{</span>
<span class="number">  52</span>  <span class="k1">auto</span> pi <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/ALLEGRO_PI"><span class="a">ALLEGRO_PI</span></a><span class="k2">;</span>
<span class="number">  53</span>  <span class="k1">auto</span> pi2 <span class="k3">=</span> pi <span class="k3">*</span> <span class="n">2</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  54</span>  <span class="k1">auto</span> dt <span class="k3">=</span> <span class="n">1</span>.<span class="n">0f</span> <span class="k3">/</span> vfreq<span class="k2">;</span>
<span class="number">  55</span>
<span class="number">  56</span>  <span class="k1">for</span><span class="k2">(</span><span class="k1">int32_t</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> samples<span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  57</span>    <span class="k1">float</span> pt <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>i<span class="k2">;</span>
<span class="number">  58</span>    <span class="k1">float</span> ti <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">+</span> pt <span class="k3">*</span> dt<span class="k2">;</span>
<span class="number">  59</span>
<span class="number">  60</span>    <span class="c">// Interpolate smoothly from 220 to 620 in 4 seconds.</span>
<span class="number">  61</span>    <span class="k1">float</span> wave <span class="k3">=</span> interpolate<span class="k2">(</span>ti, <span class="n">220</span>.<span class="n">0f</span>, <span class="n">400</span>.<span class="n">0f</span>, <span class="n">4</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k3">*</span> pi2<span class="k2">;</span>
<span class="number">  62</span>
<span class="number">  63</span>    <span class="c">// Print variables every 1/32 second.</span>
<span class="number">  64</span>    <span class="k1">if</span><span class="k2">(</span><span class="k2">(</span>count <span class="k3">+</span> i<span class="k2">)</span> % <span class="k2">(</span><span class="n">44100</span> <span class="k3">/</span> <span class="n">32</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  65</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Time %f : Hertz %f : Freq %f : Arg %lf\n"</span>,
<span class="number">  66</span>        ti, wave, wave <span class="k3">/</span> pi2, wave <span class="k3">*</span> ti<span class="k2">)</span><span class="k2">;</span>
<span class="number">  67</span>    <span class="k2">}</span>
<span class="number">  68</span>
<span class="number">  69</span>    <span class="k1">float</span> va <span class="k3">=</span> std::sin<span class="k2">(</span>wave <span class="k3">*</span> ti<span class="k2">)</span><span class="k2">;</span>
<span class="number">  70</span>    buffer<span class="k2">[</span>i<span class="k2">]</span> <span class="k3">=</span> va<span class="k2">;</span>
<span class="number">  71</span>  <span class="k2">}</span>
<span class="number">  72</span><span class="k2">}</span>
<span class="number">  73</span>
<span class="number">  74</span><span class="k1">int32_t</span> main<span class="k2">(</span><span class="k1">int32_t</span>, <span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span><span class="k3">*</span><span class="k2">)</span>
<span class="number">  75</span><span class="k2">{</span>
<span class="number">  76</span>  <span class="c">// Declare variables in advance because using 'goto' for cleanup.</span>
<span class="number">  77</span>  <span class="k1">bool</span> success <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  78</span>
<span class="number">  79</span>  <span class="c">// Keep track of what items need cleaning up.</span>
<span class="number">  80</span>  <span class="k1">bool</span> have_alleg <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  81</span>  <span class="k1">bool</span> have_audio <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  82</span>  <span class="k1">bool</span> have_voice <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  83</span>  <span class="k1">bool</span> have_mixer <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  84</span>  <span class="k1">bool</span> have_stream <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  85</span>
<span class="number">  86</span>  <span class="k1">bool</span> mixer_attached <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  87</span>  <span class="k1">bool</span> stream_attached <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  88</span>
<span class="number">  89</span>  <span class="c">// Set when time to exit.</span>
<span class="number">  90</span>  <span class="k1">bool</span> done <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  91</span>
<span class="number">  92</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_VOICE"><span class="a">ALLEGRO_VOICE</span></a><span class="k3">*</span> voice <span class="k3">=</span> nullptr<span class="k2">;</span>
<span class="number">  93</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_MIXER"><span class="a">ALLEGRO_MIXER</span></a><span class="k3">*</span> mixer <span class="k3">=</span> nullptr<span class="k2">;</span>
<span class="number">  94</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_AUDIO_STREAM"><span class="a">ALLEGRO_AUDIO_STREAM</span></a><span class="k3">*</span> stream <span class="k3">=</span> nullptr<span class="k2">;</span>
<span class="number">  95</span>
<span class="number">  96</span>  <span class="c">// Voice/mixer/stream frequency. Same variable, 2 representations.</span>
<span class="number">  97</span>  <span class="k1">auto</span> vfreq <span class="k3">=</span> <span class="n">44100</span><span class="k2">;</span>
<span class="number">  98</span>  <span class="k1">auto</span> ffreq <span class="k3">=</span> <span class="n">44100</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  99</span>
<span class="number"> 100</span>  <span class="k1">auto</span> idepth <span class="k3">=</span> ALLEGRO_AUDIO_DEPTH_INT16<span class="k2">;</span>
<span class="number"> 101</span>  <span class="k1">auto</span> fdepth <span class="k3">=</span> ALLEGRO_AUDIO_DEPTH_FLOAT32<span class="k2">;</span>
<span class="number"> 102</span>  <span class="k1">auto</span> vchan <span class="k3">=</span> ALLEGRO_CHANNEL_CONF_2<span class="k2">;</span>
<span class="number"> 103</span>  <span class="k1">auto</span> schan <span class="k3">=</span> ALLEGRO_CHANNEL_CONF_1<span class="k2">;</span>
<span class="number"> 104</span>  <span class="k1">auto</span> fragments <span class="k3">=</span> <span class="n">8</span><span class="k2">;</span> <span class="c">// Number of sample buffers.</span>
<span class="number"> 105</span>
<span class="number"> 106</span>  <span class="c">// Samples per buffer. Same variable, 2 representations.</span>
<span class="number"> 107</span>  <span class="k1">auto</span> samples <span class="k3">=</span> <span class="n">1024</span><span class="k2">;</span>
<span class="number"> 108</span>  <span class="k1">auto</span> fsamps <span class="k3">=</span> <span class="n">1024</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 109</span>
<span class="number"> 110</span>  <span class="k1">float</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 111</span>  <span class="k1">float</span> dt <span class="k3">=</span> <span class="n">1</span>.<span class="n">0f</span> <span class="k3">/</span> ffreq<span class="k2">;</span>
<span class="number"> 112</span>
<span class="number"> 113</span>  <span class="c">// Will store current sample value (1024 per second).</span>
<span class="number"> 114</span>  <span class="k1">uint64_t</span> count <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 115</span>
<span class="number"> 116</span>  <span class="c">// Initializations.</span>
<span class="number"> 117</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_install_system"><span class="a">al_install_system</span></a><span class="k2">(</span>ALLEGRO_VERSION_INT, <a href="http://www.delorie.com/djgpp/doc/libc/libc_52.html" target="_blank">atexit</a><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 118</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not init Allegro.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 119</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 120</span>  <span class="k2">}</span> <span class="k1">else</span> have_alleg <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 121</span>
<span class="number"> 122</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_install_audio"><span class="a">al_install_audio</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 123</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not install audio.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 124</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 125</span>  <span class="k2">}</span> <span class="k1">else</span> have_audio <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 126</span>
<span class="number"> 127</span>  voice <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_voice"><span class="a">al_create_voice</span></a><span class="k2">(</span>vfreq, idepth, vchan<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 128</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>voice<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 129</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not create hardware voice.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 130</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 131</span>  <span class="k2">}</span> <span class="k1">else</span> have_voice <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 132</span>
<span class="number"> 133</span>  mixer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_mixer"><span class="a">al_create_mixer</span></a><span class="k2">(</span>vfreq, fdepth, vchan<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 134</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>mixer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 135</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not create mixer.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 136</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 137</span>  <span class="k2">}</span> <span class="k1">else</span> have_mixer <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 138</span>
<span class="number"> 139</span>  mixer_attached <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_attach_mixer_to_voice"><span class="a">al_attach_mixer_to_voice</span></a><span class="k2">(</span>mixer, voice<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 140</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>mixer_attached<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 141</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not attach mixer to voice.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 142</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 143</span>  <span class="k2">}</span>
<span class="number"> 144</span>
<span class="number"> 145</span>  stream <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_audio_stream"><span class="a">al_create_audio_stream</span></a><span class="k2">(</span>fragments, samples, vfreq, fdepth, schan<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 146</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>stream<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 147</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not create audio stream.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 148</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 149</span>  <span class="k2">}</span> <span class="k1">else</span> have_stream <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 150</span>
<span class="number"> 151</span>  stream_attached <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_attach_audio_stream_to_mixer"><span class="a">al_attach_audio_stream_to_mixer</span></a><span class="k2">(</span>stream, mixer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 152</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>stream_attached<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 153</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not attach audio stream to mixer.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 154</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 155</span>  <span class="k2">}</span>
<span class="number"> 156</span>
<span class="number"> 157</span>  <span class="c">// Main loop.</span>
<span class="number"> 158</span>  <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>done<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 159</span>    <span class="k1">void</span><span class="k3">*</span> buffer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_audio_stream_fragment"><span class="a">al_get_audio_stream_fragment</span></a><span class="k2">(</span>stream<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 160</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>buffer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 161</span>      <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">0</span>.<span class="n">001f</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// Don't be a timeslice hog.</span>
<span class="number"> 162</span>      <span class="k1">continue</span><span class="k2">;</span>
<span class="number"> 163</span>    <span class="k2">}</span>
<span class="number"> 164</span>
<span class="number"> 165</span>    <span class="c">// Generate waveform.</span>
<span class="number"> 166</span>    waveform<span class="k2">(</span><span class="k2">(</span><span class="k1">float</span><span class="k3">*</span><span class="k2">)</span>buffer, samples, <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>, count, ffreq<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 167</span>
<span class="number"> 168</span>    <span class="c">// Advance time and sample count.</span>
<span class="number"> 169</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">+</span><span class="k3">=</span> <span class="k2">(</span>dt <span class="k3">*</span> fsamps<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 170</span>    count <span class="k3">+</span><span class="k3">=</span> samples<span class="k2">;</span>
<span class="number"> 171</span>
<span class="number"> 172</span>    <a href="http://www.allegro.cc/manual/al_set_audio_stream_fragment"><span class="a">al_set_audio_stream_fragment</span></a><span class="k2">(</span>stream, buffer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 173</span>    <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">5</span>.<span class="n">0f</span><span class="k2">)</span> done <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span> <span class="c">// Quit after 5 seconds.</span>
<span class="number"> 174</span>  <span class="k2">}</span>
<span class="number"> 175</span>
<span class="number"> 176</span>  <a href="http://www.allegro.cc/manual/al_drain_audio_stream"><span class="a">al_drain_audio_stream</span></a><span class="k2">(</span>stream<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 177</span>
<span class="number"> 178</span>  success <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 179</span>  cleanup:
<span class="number"> 180</span>
<span class="number"> 181</span>  <span class="c">// Cleanup.</span>
<span class="number"> 182</span>  <span class="k1">if</span><span class="k2">(</span>have_stream<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 183</span>    <a href="http://www.allegro.cc/manual/al_detach_audio_stream"><span class="a">al_detach_audio_stream</span></a><span class="k2">(</span>stream<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 184</span>    <a href="http://www.allegro.cc/manual/al_destroy_audio_stream"><span class="a">al_destroy_audio_stream</span></a><span class="k2">(</span>stream<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 185</span>  <span class="k2">}</span>
<span class="number"> 186</span>
<span class="number"> 187</span>  <span class="k1">if</span><span class="k2">(</span>have_mixer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 188</span>    <a href="http://www.allegro.cc/manual/al_detach_mixer"><span class="a">al_detach_mixer</span></a><span class="k2">(</span>mixer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 189</span>    <a href="http://www.allegro.cc/manual/al_destroy_mixer"><span class="a">al_destroy_mixer</span></a><span class="k2">(</span>mixer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 190</span>  <span class="k2">}</span>
<span class="number"> 191</span>
<span class="number"> 192</span>  <span class="k1">if</span><span class="k2">(</span>have_voice<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 193</span>    <a href="http://www.allegro.cc/manual/al_detach_voice"><span class="a">al_detach_voice</span></a><span class="k2">(</span>voice<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 194</span>    <a href="http://www.allegro.cc/manual/al_destroy_voice"><span class="a">al_destroy_voice</span></a><span class="k2">(</span>voice<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 195</span>  <span class="k2">}</span>
<span class="number"> 196</span>
<span class="number"> 197</span>  <span class="k1">if</span><span class="k2">(</span>have_audio<span class="k2">)</span> <a href="http://www.allegro.cc/manual/al_uninstall_audio"><span class="a">al_uninstall_audio</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 198</span>  <span class="k1">if</span><span class="k2">(</span>have_alleg<span class="k2">)</span> <a href="http://www.allegro.cc/manual/al_uninstall_system"><span class="a">al_uninstall_system</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 199</span>
<span class="number"> 200</span>  <span class="k1">if</span><span class="k2">(</span>success<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 201</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Everything worked.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 202</span>    <span class="k1">return</span> EXIT_SUCCESS<span class="k2">;</span>
<span class="number"> 203</span>  <span class="k2">}</span>
<span class="number"> 204</span>
<span class="number"> 205</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Something went wrong.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 206</span>  <span class="k1">return</span> EXIT_FAILURE<span class="k2">;</span>
<span class="number"> 207</span><span class="k2">}</span>
</div></div><p>

I&#39;ve been banging my head on this for three days now ... <img src="http://www.allegro.cc/forums/smileys/angry.gif" alt="&gt;:(" /> <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" /> What could possibly be the problem?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Bluebird)</author>
		<pubDate>Sat, 06 Jul 2019 07:08:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think it has to be something lying inside the types conversions. Have you enabled all the possible warnings to search and see ?</p><p>I would try to launch it in valgrind, to check for overflows.</p><p>Edit: I would also not use &#39;auto&#39; and clearly choose a defined type instead.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Sat, 06 Jul 2019 11:56:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Possibly you could try testing the code by replacing the interpolate function with a linear one. This should show if the input values you have at that point in your code are correct. Also, in your interpolate function try having a single point of return (i.e. first two return command could only set the temporary &#39;time&#39; value for the final return to calculate the output). <br />Not really much help but who knows maybe it gives you some ideas as to what to try next.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (MikiZX)</author>
		<pubDate>Sat, 06 Jul 2019 13:05:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You&#39;re interpolating from cos(0) to cos(PI). This means your wave is scaled by from 1 to 0 to -1 as it progresses. Try linear interpolation first, then mess with it.</p><p>I&#39;m going to try your code and see if I can get it to work.</p><p>Replacing your interpolate function with a strict linear interpolation made the code work.</p><div class="source-code snippet"><div class="inner"><pre>    <span class="c">// Interpolate smoothly from 220 to 620 in 4 seconds.</span>
    <span class="k1">float</span> wave <span class="k3">=</span> <span class="k2">(</span><span class="n">220</span>.<span class="n">0f</span> <span class="k3">+</span> <span class="n">100</span><span class="k3">*</span>ti<span class="k2">)</span> <span class="k3">*</span> pi2<span class="k2">;</span>
</pre></div></div><p>

Ooh, try this :
</p><div class="source-code snippet"><div class="inner"><pre>    <span class="k1">float</span> wave <span class="k3">=</span> <span class="k2">(</span><span class="n">440</span>.<span class="n">0f</span> <span class="k3">+</span> <span class="n">220</span>.<span class="n">0f</span><span class="k3">*</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span>pi2<span class="k3">*</span><span class="k2">(</span>count <span class="k3">+</span> i<span class="k2">)</span><span class="k3">/</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>samples<span class="k2">)</span><span class="k2">)</span><span class="k3">/</span><span class="n">4</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k3">*</span> pi2<span class="k2">;</span>
</pre></div></div><p>

I call it the SoundBlaster</p><p><span class="media-player audio"><a href="https://d1cxvcw9gjxu2x.cloudfront.net/attachments/612090"><img src="http://www.allegro.cc/images/audio-tn.png" style="border: 0;" alt="media player" /></a></span><br />https://d1cxvcw9gjxu2x.cloudfront.net/attachments/612091
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sun, 07 Jul 2019 00:26:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ouch, my ears! <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>I&#39;ve updated the program to address the remarks so far.</p><p>Regarding the use of <span class="source-code"><span class="k1">auto</span></span> and type conversions; trust me, if it was something simple like that I would have found it already. But anyway, all autos are replaced with concrete types. Also note, this program compiles without warnings using the usual flags: `-Wall -Weffc++ -Wextra -Wpedantic -Wconversion`.</p><p>I&#39;ve added two new functions, linear interpolation and a function for discrete steps. The discrete step function produces the expected results as long as the step count is relatively low. Try making the step count 500 or higher; you&#39;ll start to notice the frequencies going too high.</p><p>I&#39;ve added a command-line switch so you can test the different functions easily.</p><p>Edgar Reynaldo, I added your linear interpolate function, it&#39;s different from mine in that it doesn&#39;t have a specific target value, it just keeps increasing. Notice the problem shows up as soon as a target value is added to the code (command-line opt &quot;edgar2&quot;).</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span>
<span class="number">   2</span><span class="c">// This program generates a 5-second audio waveform that is supposed to ramp up</span>
<span class="number">   3</span><span class="c">// smoothly from 220 hertz to 620 hertz in 4 seconds, with 1 remaining second at</span>
<span class="number">   4</span><span class="c">// 620 hertz.</span>
<span class="number">   5</span><span class="c">//</span>
<span class="number">   6</span><span class="c">// The expected result is that the audio sound ramps up smoothly from one</span>
<span class="number">   7</span><span class="c">// frequency to another. Directly. Don't pass GO, don't collect $200.</span>
<span class="number">   8</span><span class="c">//</span>
<span class="number">   9</span><span class="c">// The actual result is that the frequency ramps up higher than it should, then</span>
<span class="number">  10</span><span class="c">// comes back down to the target frequency. How odd!</span>
<span class="number">  11</span><span class="c">//</span>
<span class="number">  12</span><span class="c">// The described problem is denied by the printouts generated when the program</span>
<span class="number">  13</span><span class="c">// is run, which indicate that the frequency *should be* ramping as expected</span>
<span class="number">  14</span><span class="c">// without frequency artifacts. But of course, the actual generated sound</span>
<span class="number">  15</span><span class="c">// contradicts this. Take note of the 'Freq' column; it proves that the</span>
<span class="number">  16</span><span class="c">// interpolation function works as expected. I'm pretty sure the problem isn't</span>
<span class="number">  17</span><span class="c">// there -- the interpolation function is used in many other places in the real</span>
<span class="number">  18</span><span class="c">// codebase without any issues. The algorithm was extracted off a math site.</span>
<span class="number">  19</span><span class="c">//</span>
<span class="number">  20</span><span class="c">// Note: in other tests the waveform was written to a file and inspected in an</span>
<span class="number">  21</span><span class="c">// audio editor. The saved waveform exhibits the same problem.</span>
<span class="number">  22</span>
<span class="number">  23</span><span class="p">#include &lt;cstdint&gt;</span>
<span class="number">  24</span><span class="p">#include &lt;cstddef&gt;</span>
<span class="number">  25</span><span class="p">#include &lt;cstdlib&gt;</span>
<span class="number">  26</span><span class="p">#include &lt;cassert&gt;</span>
<span class="number">  27</span><span class="p">#include &lt;cstdio&gt;</span>
<span class="number">  28</span><span class="p">#include &lt;cstring&gt;</span>
<span class="number">  29</span><span class="p">#include &lt;cmath&gt;</span>
<span class="number">  30</span>
<span class="number">  31</span><span class="p">#include &lt;string&gt;</span>
<span class="number">  32</span><span class="p">#include &lt;exception&gt;</span>
<span class="number">  33</span><span class="p">#include &lt;stdexcept&gt;</span>
<span class="number">  34</span>
<span class="number">  35</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  36</span><span class="p">#include &lt;allegro5/allegro_audio.h&gt;</span>
<span class="number">  37</span>
<span class="number">  38</span><span class="k1">float</span> g_step_count <span class="k3">=</span> <span class="n">20</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  39</span>
<span class="number">  40</span><span class="c">// Interpolates from one frequency to another within a duration.</span>
<span class="number">  41</span><span class="k1">float</span> interpolate_sinusoidal_inout<span class="k2">(</span>
<span class="number">  42</span>  <span class="k1">float</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>, <span class="k1">float</span> base, <span class="k1">float</span> change, <span class="k1">float</span> duration<span class="k2">)</span>
<span class="number">  43</span><span class="k2">{</span>
<span class="number">  44</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>duration <span class="k3">&gt;</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  45</span>  <span class="k1">float</span> pi <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/ALLEGRO_PI"><span class="a">ALLEGRO_PI</span></a><span class="k2">;</span>
<span class="number">  46</span>
<span class="number">  47</span>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  48</span>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&gt;</span><span class="k3">=</span> duration<span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">=</span> duration<span class="k2">;</span>
<span class="number">  49</span>
<span class="number">  50</span>  <span class="c">// This is a simple sinusoidal in/out interpolation. This math has been</span>
<span class="number">  51</span>  <span class="c">// well-tested in the real codebase for other purposes, there are no known</span>
<span class="number">  52</span>  <span class="c">// problems with it.</span>
<span class="number">  53</span>  <span class="k1">return</span> <span class="k3">-</span>change <span class="k3">/</span> <span class="n">2</span>.<span class="n">0f</span> <span class="k3">*</span> <span class="k2">(</span>std::cos<span class="k2">(</span>pi <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">/</span> duration<span class="k2">)</span> <span class="k3">-</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k3">+</span> base<span class="k2">;</span>
<span class="number">  54</span><span class="k2">}</span>
<span class="number">  55</span>
<span class="number">  56</span><span class="k1">float</span> interpolate_linear_tween<span class="k2">(</span>
<span class="number">  57</span>  <span class="k1">float</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>, <span class="k1">float</span> base, <span class="k1">float</span> change, <span class="k1">float</span> duration<span class="k2">)</span>
<span class="number">  58</span><span class="k2">{</span>
<span class="number">  59</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>duration <span class="k3">&gt;</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  60</span>
<span class="number">  61</span>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  62</span>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&gt;</span><span class="k3">=</span> duration<span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">=</span> duration<span class="k2">;</span>
<span class="number">  63</span>
<span class="number">  64</span>  <span class="c">// Linear interpolation without smoothing.</span>
<span class="number">  65</span>  <span class="k1">return</span> change <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">/</span> duration <span class="k3">+</span> base<span class="k2">;</span>
<span class="number">  66</span><span class="k2">}</span>
<span class="number">  67</span>
<span class="number">  68</span><span class="c">// Change frequency in discrete steps without smoothing.</span>
<span class="number">  69</span><span class="c">// Unlike the other two interpolation functions, this produces expected results</span>
<span class="number">  70</span><span class="c">// *most* of the time. Try playing with the step count parameter. Large values</span>
<span class="number">  71</span><span class="c">// start to cause wrong frequencies to be emitted (disregarding the static).</span>
<span class="number">  72</span><span class="k1">float</span> interpolate_discrete_step<span class="k2">(</span>
<span class="number">  73</span>  <span class="k1">float</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>, <span class="k1">float</span> base, <span class="k1">float</span> change, <span class="k1">float</span> duration<span class="k2">)</span>
<span class="number">  74</span><span class="k2">{</span>
<span class="number">  75</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>duration <span class="k3">&gt;</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  76</span>
<span class="number">  77</span>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  78</span>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&gt;</span><span class="k3">=</span> duration<span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">=</span> duration<span class="k2">;</span>
<span class="number">  79</span>
<span class="number">  80</span>  <span class="k1">float</span> steps <span class="k3">=</span> g_step_count<span class="k2">;</span> <span class="c">// From command-line.</span>
<span class="number">  81</span>
<span class="number">  82</span>  <span class="k1">float</span> delta <span class="k3">=</span> change <span class="k3">/</span> steps<span class="k2">;</span>
<span class="number">  83</span>  <span class="k1">float</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_103.html" target="_blank">clock</a> <span class="k3">=</span> duration <span class="k3">/</span> steps<span class="k2">;</span>
<span class="number">  84</span>  <span class="k1">float</span> count <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  85</span>
<span class="number">  86</span>  <span class="k1">while</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&gt;</span><span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_103.html" target="_blank">clock</a> <span class="k3">*</span> count<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  87</span>    count <span class="k3">=</span> count <span class="k3">+</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  88</span>  <span class="k2">}</span>
<span class="number">  89</span>
<span class="number">  90</span>  <span class="k1">return</span> base <span class="k3">+</span> delta <span class="k3">*</span> count <span class="k3">-</span> delta<span class="k2">;</span>
<span class="number">  91</span><span class="k2">}</span>
<span class="number">  92</span>
<span class="number">  93</span><span class="c">// Generates the waveform.</span>
<span class="number">  94</span><span class="k1">void</span> waveform<span class="k2">(</span>
<span class="number">  95</span>    <span class="k1">float</span><span class="k3">*</span> buffer,   <span class="c">// Raw sample buffer.</span>
<span class="number">  96</span>    <span class="k1">int32_t</span> samples, <span class="c">// Length of buffer.</span>
<span class="number">  97</span>    <span class="k1">float</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>,      <span class="c">// Starting time value for this buffer.</span>
<span class="number">  98</span>    <span class="k1">uint64_t</span> count,  <span class="c">// Starting sample count for this buffer.</span>
<span class="number">  99</span>    <span class="k1">float</span> ffreq,     <span class="c">// Voice/mixer/stream frequency (float).</span>
<span class="number"> 100</span>    <span class="k1">int32_t</span> vfreq,   <span class="c">// Voice/mixer/stream frequency (int).</span>
<span class="number"> 101</span>    <span class="k1">int32_t</span> which    <span class="c">// Choice of interpolation function.</span>
<span class="number"> 102</span>  <span class="k2">)</span>
<span class="number"> 103</span><span class="k2">{</span>
<span class="number"> 104</span>  <span class="k1">float</span> pi <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/ALLEGRO_PI"><span class="a">ALLEGRO_PI</span></a><span class="k2">;</span>
<span class="number"> 105</span>  <span class="k1">float</span> pi2 <span class="k3">=</span> pi <span class="k3">*</span> <span class="n">2</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 106</span>  <span class="k1">float</span> dt <span class="k3">=</span> <span class="n">1</span>.<span class="n">0f</span> <span class="k3">/</span> ffreq<span class="k2">;</span>
<span class="number"> 107</span>
<span class="number"> 108</span>  <span class="k1">for</span><span class="k2">(</span><span class="k1">int32_t</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> samples<span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 109</span>    <span class="k1">float</span> pt <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>i<span class="k2">;</span>
<span class="number"> 110</span>    <span class="k1">float</span> ti <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">+</span> pt <span class="k3">*</span> dt<span class="k2">;</span>
<span class="number"> 111</span>
<span class="number"> 112</span>    <span class="k1">float</span> wave<span class="k2">;</span>
<span class="number"> 113</span>    try_again:
<span class="number"> 114</span>
<span class="number"> 115</span>    <span class="k1">if</span><span class="k2">(</span>which <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 116</span>      <span class="c">// Interpolate smoothly from 220 to 620 in 4 seconds.</span>
<span class="number"> 117</span>      wave <span class="k3">=</span> interpolate_sinusoidal_inout<span class="k2">(</span>ti, <span class="n">220</span>.<span class="n">0f</span>, <span class="n">400</span>.<span class="n">0f</span>, <span class="n">4</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k3">*</span> pi2<span class="k2">;</span>
<span class="number"> 118</span>    <span class="k2">}</span>
<span class="number"> 119</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>which <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 120</span>      <span class="c">// Direct linear interpolation.</span>
<span class="number"> 121</span>      wave <span class="k3">=</span> interpolate_linear_tween<span class="k2">(</span>ti, <span class="n">220</span>.<span class="n">0f</span>, <span class="n">400</span>.<span class="n">0f</span>, <span class="n">4</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k3">*</span> pi2<span class="k2">;</span>
<span class="number"> 122</span>    <span class="k2">}</span>
<span class="number"> 123</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>which <span class="k3">=</span><span class="k3">=</span> <span class="n">2</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 124</span>      <span class="c">// Discrete steps in frequency, no smooth changes.</span>
<span class="number"> 125</span>      <span class="c">// Note: high step counts create static.</span>
<span class="number"> 126</span>      wave <span class="k3">=</span> interpolate_discrete_step<span class="k2">(</span>ti, <span class="n">220</span>.<span class="n">0f</span>, <span class="n">400</span>.<span class="n">0f</span>, <span class="n">4</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k3">*</span> pi2<span class="k2">;</span>
<span class="number"> 127</span>    <span class="k2">}</span>
<span class="number"> 128</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>which <span class="k3">=</span><span class="k3">=</span> <span class="n">3</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 129</span>      <span class="c">// Edgar Reynaldo.</span>
<span class="number"> 130</span>      wave <span class="k3">=</span> <span class="k2">(</span><span class="n">220</span>.<span class="n">0f</span> <span class="k3">+</span> <span class="n">100</span> <span class="k3">*</span> ti<span class="k2">)</span> <span class="k3">*</span> pi2<span class="k2">;</span>
<span class="number"> 131</span>    <span class="k2">}</span>
<span class="number"> 132</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>which <span class="k3">=</span><span class="k3">=</span> <span class="n">5</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 133</span>      <span class="c">// Edgar Reynaldo (with explicit stop point).</span>
<span class="number"> 134</span>      <span class="k1">float</span> mu <span class="k3">=</span> ti<span class="k2">;</span>
<span class="number"> 135</span>      <span class="k1">if</span><span class="k2">(</span>mu <span class="k3">&gt;</span> <span class="n">4</span>.<span class="n">0f</span><span class="k2">)</span> mu <span class="k3">=</span> <span class="n">4</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 136</span>      wave <span class="k3">=</span> <span class="k2">(</span><span class="n">220</span>.<span class="n">0f</span> <span class="k3">+</span> <span class="n">100</span> <span class="k3">*</span> mu<span class="k2">)</span> <span class="k3">*</span> pi2<span class="k2">;</span>
<span class="number"> 137</span>    <span class="k2">}</span>
<span class="number"> 138</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>which <span class="k3">=</span><span class="k3">=</span> <span class="n">4</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 139</span>      <span class="c">// Sound Blaster.</span>
<span class="number"> 140</span>      wave <span class="k3">=</span> <span class="k2">(</span><span class="n">440</span>.<span class="n">0f</span> <span class="k3">+</span> <span class="n">220</span>.<span class="n">0f</span> <span class="k3">*</span> <span class="k2">(</span>std::sin<span class="k2">(</span>pi2 <span class="k3">*</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><span class="k2">(</span>count <span class="k3">+</span> i<span class="k2">)</span> <span class="k3">/</span>
<span class="number"> 141</span>        <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>samples<span class="k2">)</span><span class="k2">)</span> <span class="k3">/</span> <span class="n">4</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k3">*</span> pi2<span class="k2">;</span>
<span class="number"> 142</span>    <span class="k2">}</span>
<span class="number"> 143</span>    <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 144</span>      which <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 145</span>      <span class="k1">goto</span> try_again<span class="k2">;</span>
<span class="number"> 146</span>    <span class="k2">}</span>
<span class="number"> 147</span>
<span class="number"> 148</span>    <span class="c">// Print variables every 1/32 second.</span>
<span class="number"> 149</span>    <span class="k1">if</span><span class="k2">(</span><span class="k2">(</span>count <span class="k3">+</span> i<span class="k2">)</span> % <span class="k2">(</span>vfreq <span class="k3">/</span> <span class="n">32</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 150</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Time %f : Hertz %f : Freq %f : Arg %lf\n"</span>,
<span class="number"> 151</span>        ti, wave, wave <span class="k3">/</span> pi2, wave <span class="k3">*</span> ti<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 152</span>    <span class="k2">}</span>
<span class="number"> 153</span>
<span class="number"> 154</span>    <span class="k1">float</span> va <span class="k3">=</span> std::sin<span class="k2">(</span>wave <span class="k3">*</span> ti<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 155</span>    buffer<span class="k2">[</span>i<span class="k2">]</span> <span class="k3">=</span> va<span class="k2">;</span>
<span class="number"> 156</span>  <span class="k2">}</span>
<span class="number"> 157</span><span class="k2">}</span>
<span class="number"> 158</span>
<span class="number"> 159</span><span class="k1">int32_t</span> main<span class="k2">(</span><span class="k1">int32_t</span> argc, <span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span><span class="k3">*</span> argv<span class="k2">)</span>
<span class="number"> 160</span><span class="k2">{</span>
<span class="number"> 161</span>  <span class="c">// Declare variables in advance because using 'goto' for cleanup.</span>
<span class="number"> 162</span>  <span class="k1">bool</span> success <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 163</span>
<span class="number"> 164</span>  <span class="c">// Keep track of what items need cleaning up.</span>
<span class="number"> 165</span>  <span class="k1">bool</span> have_alleg <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 166</span>  <span class="k1">bool</span> have_audio <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 167</span>  <span class="k1">bool</span> have_voice <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 168</span>  <span class="k1">bool</span> have_mixer <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 169</span>  <span class="k1">bool</span> have_stream <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 170</span>
<span class="number"> 171</span>  <span class="k1">bool</span> mixer_attached <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 172</span>  <span class="k1">bool</span> stream_attached <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 173</span>
<span class="number"> 174</span>  <span class="c">// Set when time to exit.</span>
<span class="number"> 175</span>  <span class="k1">bool</span> done <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 176</span>
<span class="number"> 177</span>  <span class="c">// Which interpolation function to use.</span>
<span class="number"> 178</span>  <span class="k1">int32_t</span> which <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 179</span>
<span class="number"> 180</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_VOICE"><span class="a">ALLEGRO_VOICE</span></a><span class="k3">*</span> voice <span class="k3">=</span> nullptr<span class="k2">;</span>
<span class="number"> 181</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_MIXER"><span class="a">ALLEGRO_MIXER</span></a><span class="k3">*</span> mixer <span class="k3">=</span> nullptr<span class="k2">;</span>
<span class="number"> 182</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_AUDIO_STREAM"><span class="a">ALLEGRO_AUDIO_STREAM</span></a><span class="k3">*</span> stream <span class="k3">=</span> nullptr<span class="k2">;</span>
<span class="number"> 183</span>
<span class="number"> 184</span>  <span class="c">// Voice/mixer/stream frequency. Same variable, 2 representations.</span>
<span class="number"> 185</span>  <span class="k1">int32_t</span> vfreq <span class="k3">=</span> <span class="n">44100</span><span class="k2">;</span>
<span class="number"> 186</span>  <span class="k1">float</span> ffreq <span class="k3">=</span> <span class="n">44100</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 187</span>
<span class="number"> 188</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_AUDIO_DEPTH"><span class="a">ALLEGRO_AUDIO_DEPTH</span></a> idepth <span class="k3">=</span> ALLEGRO_AUDIO_DEPTH_INT16<span class="k2">;</span>
<span class="number"> 189</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_AUDIO_DEPTH"><span class="a">ALLEGRO_AUDIO_DEPTH</span></a> fdepth <span class="k3">=</span> ALLEGRO_AUDIO_DEPTH_FLOAT32<span class="k2">;</span>
<span class="number"> 190</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_CHANNEL_CONF"><span class="a">ALLEGRO_CHANNEL_CONF</span></a> vchan <span class="k3">=</span> ALLEGRO_CHANNEL_CONF_2<span class="k2">;</span>
<span class="number"> 191</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_CHANNEL_CONF"><span class="a">ALLEGRO_CHANNEL_CONF</span></a> schan <span class="k3">=</span> ALLEGRO_CHANNEL_CONF_1<span class="k2">;</span>
<span class="number"> 192</span>  <span class="k1">int32_t</span> fragments <span class="k3">=</span> <span class="n">8</span><span class="k2">;</span> <span class="c">// Number of sample buffers.</span>
<span class="number"> 193</span>
<span class="number"> 194</span>  <span class="c">// Samples per buffer. Same variable, 2 representations.</span>
<span class="number"> 195</span>  <span class="k1">int32_t</span> samples <span class="k3">=</span> <span class="n">1024</span><span class="k2">;</span>
<span class="number"> 196</span>  <span class="k1">float</span> fsamps <span class="k3">=</span> <span class="n">1024</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 197</span>
<span class="number"> 198</span>  <span class="k1">float</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 199</span>  <span class="k1">float</span> dt <span class="k3">=</span> <span class="n">1</span>.<span class="n">0f</span> <span class="k3">/</span> ffreq<span class="k2">;</span>
<span class="number"> 200</span>
<span class="number"> 201</span>  <span class="c">// Will store current sample value (1024 per second).</span>
<span class="number"> 202</span>  <span class="k1">uint64_t</span> count <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 203</span>
<span class="number"> 204</span>  <span class="c">// Parse command-line options.</span>
<span class="number"> 205</span>  <span class="k1">if</span><span class="k2">(</span>argc <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">2</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 206</span>    <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span>argv<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, <span class="s">"sine"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> which <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 207</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span>argv<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, <span class="s">"linear"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> which <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 208</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span>argv<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, <span class="s">"step"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 209</span>      which <span class="k3">=</span> <span class="n">2</span><span class="k2">;</span>
<span class="number"> 210</span>
<span class="number"> 211</span>      <span class="c">// Parse step count parameter.</span>
<span class="number"> 212</span>      <span class="k1">if</span><span class="k2">(</span>argc <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">3</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 213</span>        std::string arg <span class="k2">{</span>argv<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 214</span>        <span class="k1">try</span> <span class="k2">{</span>
<span class="number"> 215</span>          std::size_t pos <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 216</span>          g_step_count <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>std::stoi<span class="k2">(</span>arg, <span class="k3">&amp;</span>pos<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 217</span>
<span class="number"> 218</span>          <span class="c">// Screen out bad parameters.</span>
<span class="number"> 219</span>          <span class="k1">if</span><span class="k2">(</span>pos <span class="k3">!</span><span class="k3">=</span> arg.size<span class="k2">(</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> g_step_count <span class="k3">&lt;</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 220</span>            <span class="k1">throw</span> std::exception <span class="k2">{</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 221</span>          <span class="k2">}</span>
<span class="number"> 222</span>        <span class="k2">}</span> <span class="k1">catch</span><span class="k2">(</span>...<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 223</span>          <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not parse step count.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 224</span>          <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 225</span>        <span class="k2">}</span>
<span class="number"> 226</span>      <span class="k2">}</span>
<span class="number"> 227</span>    <span class="k2">}</span>
<span class="number"> 228</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span>argv<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, <span class="s">"edgar"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> which <span class="k3">=</span> <span class="n">3</span><span class="k2">;</span>
<span class="number"> 229</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span>argv<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, <span class="s">"edgar2"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> which <span class="k3">=</span> <span class="n">5</span><span class="k2">;</span>
<span class="number"> 230</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span>argv<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, <span class="s">"blaster"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> which <span class="k3">=</span> <span class="n">4</span><span class="k2">;</span>
<span class="number"> 231</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span>argv<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, <span class="s">"help"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 232</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Options: "</span>
<span class="number"> 233</span>        <span class="s">"sine | linear | step [count] | edgar | edgar2 | blaster | help.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 234</span>      success <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 235</span>      <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 236</span>    <span class="k2">}</span>
<span class="number"> 237</span>    <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 238</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Unrecognized option.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 239</span>      <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 240</span>    <span class="k2">}</span>
<span class="number"> 241</span>  <span class="k2">}</span>
<span class="number"> 242</span>
<span class="number"> 243</span>  <span class="c">// Initializations.</span>
<span class="number"> 244</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_install_system"><span class="a">al_install_system</span></a><span class="k2">(</span>ALLEGRO_VERSION_INT, <a href="http://www.delorie.com/djgpp/doc/libc/libc_52.html" target="_blank">atexit</a><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 245</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not init Allegro.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 246</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 247</span>  <span class="k2">}</span> <span class="k1">else</span> have_alleg <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 248</span>
<span class="number"> 249</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_install_audio"><span class="a">al_install_audio</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 250</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not install audio.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 251</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 252</span>  <span class="k2">}</span> <span class="k1">else</span> have_audio <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 253</span>
<span class="number"> 254</span>  voice <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_voice"><span class="a">al_create_voice</span></a><span class="k2">(</span>vfreq, idepth, vchan<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 255</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>voice<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 256</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not create hardware voice.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 257</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 258</span>  <span class="k2">}</span> <span class="k1">else</span> have_voice <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 259</span>
<span class="number"> 260</span>  mixer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_mixer"><span class="a">al_create_mixer</span></a><span class="k2">(</span>vfreq, fdepth, vchan<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 261</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>mixer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 262</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not create mixer.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 263</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 264</span>  <span class="k2">}</span> <span class="k1">else</span> have_mixer <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 265</span>
<span class="number"> 266</span>  mixer_attached <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_attach_mixer_to_voice"><span class="a">al_attach_mixer_to_voice</span></a><span class="k2">(</span>mixer, voice<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 267</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>mixer_attached<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 268</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not attach mixer to voice.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 269</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 270</span>  <span class="k2">}</span>
<span class="number"> 271</span>
<span class="number"> 272</span>  stream <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_audio_stream"><span class="a">al_create_audio_stream</span></a><span class="k2">(</span>fragments, samples, vfreq, fdepth, schan<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 273</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>stream<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 274</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not create audio stream.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 275</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 276</span>  <span class="k2">}</span> <span class="k1">else</span> have_stream <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 277</span>
<span class="number"> 278</span>  stream_attached <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_attach_audio_stream_to_mixer"><span class="a">al_attach_audio_stream_to_mixer</span></a><span class="k2">(</span>stream, mixer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 279</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>stream_attached<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 280</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not attach audio stream to mixer.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 281</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 282</span>  <span class="k2">}</span>
<span class="number"> 283</span>
<span class="number"> 284</span>  <span class="c">// Main loop.</span>
<span class="number"> 285</span>  <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>done<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 286</span>    <span class="k1">void</span><span class="k3">*</span> buffer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_audio_stream_fragment"><span class="a">al_get_audio_stream_fragment</span></a><span class="k2">(</span>stream<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 287</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>buffer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 288</span>      <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">0</span>.<span class="n">001f</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// Don't be a timeslice hog.</span>
<span class="number"> 289</span>      <span class="k1">continue</span><span class="k2">;</span>
<span class="number"> 290</span>    <span class="k2">}</span>
<span class="number"> 291</span>
<span class="number"> 292</span>    <span class="c">// Generate waveform.</span>
<span class="number"> 293</span>    waveform<span class="k2">(</span><span class="k2">(</span><span class="k1">float</span><span class="k3">*</span><span class="k2">)</span>buffer, samples, <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>, count, ffreq, vfreq, which<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 294</span>
<span class="number"> 295</span>    <span class="c">// Advance time and sample count.</span>
<span class="number"> 296</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">+</span><span class="k3">=</span> <span class="k2">(</span>dt <span class="k3">*</span> fsamps<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 297</span>    count <span class="k3">+</span><span class="k3">=</span> samples<span class="k2">;</span>
<span class="number"> 298</span>
<span class="number"> 299</span>    <a href="http://www.allegro.cc/manual/al_set_audio_stream_fragment"><span class="a">al_set_audio_stream_fragment</span></a><span class="k2">(</span>stream, buffer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 300</span>    <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">5</span>.<span class="n">0f</span><span class="k2">)</span> done <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span> <span class="c">// Quit after 5 seconds.</span>
<span class="number"> 301</span>  <span class="k2">}</span>
<span class="number"> 302</span>
<span class="number"> 303</span>  <a href="http://www.allegro.cc/manual/al_drain_audio_stream"><span class="a">al_drain_audio_stream</span></a><span class="k2">(</span>stream<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 304</span>
<span class="number"> 305</span>  success <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 306</span>  cleanup:
<span class="number"> 307</span>
<span class="number"> 308</span>  <span class="c">// Cleanup.</span>
<span class="number"> 309</span>  <span class="k1">if</span><span class="k2">(</span>have_stream<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 310</span>    <a href="http://www.allegro.cc/manual/al_detach_audio_stream"><span class="a">al_detach_audio_stream</span></a><span class="k2">(</span>stream<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 311</span>    <a href="http://www.allegro.cc/manual/al_destroy_audio_stream"><span class="a">al_destroy_audio_stream</span></a><span class="k2">(</span>stream<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 312</span>  <span class="k2">}</span>
<span class="number"> 313</span>
<span class="number"> 314</span>  <span class="k1">if</span><span class="k2">(</span>have_mixer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 315</span>    <a href="http://www.allegro.cc/manual/al_detach_mixer"><span class="a">al_detach_mixer</span></a><span class="k2">(</span>mixer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 316</span>    <a href="http://www.allegro.cc/manual/al_destroy_mixer"><span class="a">al_destroy_mixer</span></a><span class="k2">(</span>mixer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 317</span>  <span class="k2">}</span>
<span class="number"> 318</span>
<span class="number"> 319</span>  <span class="k1">if</span><span class="k2">(</span>have_voice<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 320</span>    <a href="http://www.allegro.cc/manual/al_detach_voice"><span class="a">al_detach_voice</span></a><span class="k2">(</span>voice<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 321</span>    <a href="http://www.allegro.cc/manual/al_destroy_voice"><span class="a">al_destroy_voice</span></a><span class="k2">(</span>voice<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 322</span>  <span class="k2">}</span>
<span class="number"> 323</span>
<span class="number"> 324</span>  <span class="k1">if</span><span class="k2">(</span>have_audio<span class="k2">)</span> <a href="http://www.allegro.cc/manual/al_uninstall_audio"><span class="a">al_uninstall_audio</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 325</span>  <span class="k1">if</span><span class="k2">(</span>have_alleg<span class="k2">)</span> <a href="http://www.allegro.cc/manual/al_uninstall_system"><span class="a">al_uninstall_system</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 326</span>
<span class="number"> 327</span>  <span class="k1">if</span><span class="k2">(</span>success<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 328</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Everything worked.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 329</span>    <span class="k1">return</span> EXIT_SUCCESS<span class="k2">;</span>
<span class="number"> 330</span>  <span class="k2">}</span>
<span class="number"> 331</span>
<span class="number"> 332</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Something went wrong.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 333</span>  <span class="k1">return</span> EXIT_FAILURE<span class="k2">;</span>
<span class="number"> 334</span><span class="k2">}</span>
</div></div><p>

The whole thing is very strange, I&#39;m positive the problem can&#39;t be the interpolation function(s). <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" /></p><p>Edit: try <span class="source-code">$program step <span class="n">10000</span></span>. The results are nearly the same as <span class="source-code">linear</span> (i.e., wrong), ignoring the static effects.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Bluebird)</author>
		<pubDate>Sun, 07 Jul 2019 05:11:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve tried the source as well. After changing it a little I managed to get it to work ok (?).</p><p>The problem seems to be with this line:<br />float va = std::sin(wave * ti);</p><p>In the below source, you will see that there is a new global variable called &#39;sine&#39; which progresses with each generated sample and according to the frequency calculated in the interpolate function. </p><p>I&#39;m not sure how to post the source code so sorry for this:</p><p>Marked with &#39;// THIS IS NEW&#39; are the changes I did:</p><p>#include &lt;cstdint&gt;<br />#include &lt;cstddef&gt;<br />#include &lt;cstdlib&gt;<br />#include &lt;cassert&gt;<br />#include &lt;cstdio&gt;<br />#include &lt;cmath&gt;</p><p>#include &lt;allegro5/allegro.h&gt;<br />#include &lt;allegro5/allegro_audio.h&gt;</p><p>float sine;    // THIS IS NEW</p><p>// Interpolates from one frequency to another within a duration.<br />float interpolate(float time, float base, float change, float duration)<br />{<br />	  assert(duration &gt; 0.0);<br />	  auto pi = (float)ALLEGRO_PI;<br />	<br />		  if (time &lt;= 0.0) return base;<br />	  if (time &gt;= duration) return base + change;<br />	<br />	  return -change / 2.0f * (std::cos(pi * time / duration) - 1.0f) + base;<br />	}</p><p>// Generates the waveform.<br />void waveform(<br />	float* buffer, int32_t  samples, float time, uint64_t  count, float vfreq)<br />{<br />	auto pi = (float)ALLEGRO_PI;<br />	auto pi2 = pi * 2.0f;<br />	auto dt = 1.0f / vfreq;</p><p>	for (int32_t i = 0; i &lt; samples; ++i) {<br />		float pt = (float)i;<br />		float ti = time + pt * dt;</p><p>		// Interpolate smoothly from 220 to 620 in 4 seconds.<br />		float frequency = interpolate(ti, 220.0f, 400.0f, 4.0f) *pi2;</p><p>		sine += frequency/44100.0f;  // THIS IS NEW<br />			float va = std::sin(sine);</p><p>			buffer[i] = va;</p><p>		}<br />	}</p><p>int32_t main(int32_t, const char**)<br />{</p><p>	sine = 0.0f;      // THIS IS NEW</p><p>	// Declare variables in advance because using &#39;goto&#39; for cleanup.<br />	  bool success = false;<br />	<br />	  ...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (MikiZX)</author>
		<pubDate>Sun, 07 Jul 2019 22:53:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>IT WORKS!</p><p>Thanks MikiZX, I can definitely say that your solution would never have occurred to me.</p><p>One thing about it that concerned me though, was that your sine variable would saturate eventually if the playback went on long enough. I fixed this with this code:</p><p><span class="source-code"><span class="k1">while</span><span class="k2">(</span>g_sine <span class="k3">&gt;</span> pi2<span class="k2">)</span> g_sine <span class="k3">-</span><span class="k3">=</span> pi2<span class="k2">;</span></span></p><p>Here&#39;s the whole program, working correctly now. If anyone can think of a use for it, have at it!</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span><span class="c">// =============================================================================</span>
<span class="number">   2</span><span class="c">// This program generates a 5-second audio waveform that ramps smoothly up or</span>
<span class="number">   3</span><span class="c">// down for some number of seconds, and then holds at a single frequency for 1</span>
<span class="number">   4</span><span class="c">// second longer.</span>
<span class="number">   5</span><span class="c">//</span>
<span class="number">   6</span><span class="c">// The expected result is that the audio sound ramps up smoothly from one</span>
<span class="number">   7</span><span class="c">// frequency to another. Directly. Don't pass GO, don't collect $200.</span>
<span class="number">   8</span><span class="c">//</span>
<span class="number">   9</span><span class="c">// Author: Bluebird</span>
<span class="number">  10</span><span class="c">// License: MIT</span>
<span class="number">  11</span><span class="c">// =============================================================================</span>
<span class="number">  12</span>
<span class="number">  13</span><span class="p">#include &lt;cstdint&gt;</span>
<span class="number">  14</span><span class="p">#include &lt;cstddef&gt;</span>
<span class="number">  15</span><span class="p">#include &lt;cstdlib&gt;</span>
<span class="number">  16</span><span class="p">#include &lt;cassert&gt;</span>
<span class="number">  17</span><span class="p">#include &lt;cstdio&gt;</span>
<span class="number">  18</span><span class="p">#include &lt;cstring&gt;</span>
<span class="number">  19</span><span class="p">#include &lt;cmath&gt;</span>
<span class="number">  20</span>
<span class="number">  21</span><span class="p">#include &lt;string&gt;</span>
<span class="number">  22</span><span class="p">#include &lt;exception&gt;</span>
<span class="number">  23</span><span class="p">#include &lt;stdexcept&gt;</span>
<span class="number">  24</span><span class="p">#include &lt;algorithm&gt;</span>
<span class="number">  25</span>
<span class="number">  26</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  27</span><span class="p">#include &lt;allegro5/allegro_audio.h&gt;</span>
<span class="number">  28</span>
<span class="number">  29</span><span class="k1">float</span> g_step_count <span class="k3">=</span> <span class="n">20</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  30</span><span class="k1">float</span> g_sine <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span> <span class="c">// Used like an "accumulator" in the interpolation code.</span>
<span class="number">  31</span><span class="k1">float</span> g_start_frequency <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  32</span><span class="k1">float</span> g_frequency_change <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  33</span><span class="k1">float</span> g_interp_time <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  34</span>
<span class="number">  35</span><span class="c">// Interpolates from one frequency to another within a duration.</span>
<span class="number">  36</span><span class="k1">float</span> interpolate_sinusoidal_inout<span class="k2">(</span>
<span class="number">  37</span>  <span class="k1">float</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>, <span class="k1">float</span> base, <span class="k1">float</span> change, <span class="k1">float</span> duration<span class="k2">)</span>
<span class="number">  38</span><span class="k2">{</span>
<span class="number">  39</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>duration <span class="k3">&gt;</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  40</span>  <span class="k1">float</span> pi <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/ALLEGRO_PI"><span class="a">ALLEGRO_PI</span></a><span class="k2">;</span>
<span class="number">  41</span>
<span class="number">  42</span>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  43</span>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&gt;</span><span class="k3">=</span> duration<span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">=</span> duration<span class="k2">;</span>
<span class="number">  44</span>
<span class="number">  45</span>  <span class="c">// This is a simple sinusoidal in/out interpolation.</span>
<span class="number">  46</span>  <span class="k1">return</span> <span class="k3">-</span>change <span class="k3">/</span> <span class="n">2</span>.<span class="n">0f</span> <span class="k3">*</span> <span class="k2">(</span>std::cos<span class="k2">(</span>pi <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">/</span> duration<span class="k2">)</span> <span class="k3">-</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k3">+</span> base<span class="k2">;</span>
<span class="number">  47</span><span class="k2">}</span>
<span class="number">  48</span>
<span class="number">  49</span><span class="k1">float</span> interpolate_linear_tween<span class="k2">(</span>
<span class="number">  50</span>  <span class="k1">float</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>, <span class="k1">float</span> base, <span class="k1">float</span> change, <span class="k1">float</span> duration<span class="k2">)</span>
<span class="number">  51</span><span class="k2">{</span>
<span class="number">  52</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>duration <span class="k3">&gt;</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  53</span>
<span class="number">  54</span>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  55</span>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&gt;</span><span class="k3">=</span> duration<span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">=</span> duration<span class="k2">;</span>
<span class="number">  56</span>
<span class="number">  57</span>  <span class="c">// Linear interpolation without smoothing.</span>
<span class="number">  58</span>  <span class="k1">return</span> change <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">/</span> duration <span class="k3">+</span> base<span class="k2">;</span>
<span class="number">  59</span><span class="k2">}</span>
<span class="number">  60</span>
<span class="number">  61</span><span class="c">// Change frequency in discrete steps without smoothing.</span>
<span class="number">  62</span><span class="k1">float</span> interpolate_discrete_step<span class="k2">(</span>
<span class="number">  63</span>  <span class="k1">float</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>, <span class="k1">float</span> base, <span class="k1">float</span> change, <span class="k1">float</span> duration<span class="k2">)</span>
<span class="number">  64</span><span class="k2">{</span>
<span class="number">  65</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>duration <span class="k3">&gt;</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  66</span>
<span class="number">  67</span>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  68</span>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&gt;</span><span class="k3">=</span> duration<span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">=</span> duration<span class="k2">;</span>
<span class="number">  69</span>
<span class="number">  70</span>  <span class="k1">float</span> steps <span class="k3">=</span> g_step_count<span class="k2">;</span> <span class="c">// From command-line.</span>
<span class="number">  71</span>
<span class="number">  72</span>  <span class="k1">float</span> delta <span class="k3">=</span> change <span class="k3">/</span> steps<span class="k2">;</span>
<span class="number">  73</span>  <span class="k1">float</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_103.html" target="_blank">clock</a> <span class="k3">=</span> duration <span class="k3">/</span> steps<span class="k2">;</span>
<span class="number">  74</span>  <span class="k1">float</span> count <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  75</span>
<span class="number">  76</span>  <span class="k1">while</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&gt;</span><span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_103.html" target="_blank">clock</a> <span class="k3">*</span> count<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  77</span>    count <span class="k3">=</span> count <span class="k3">+</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  78</span>  <span class="k2">}</span>
<span class="number">  79</span>
<span class="number">  80</span>  <span class="k1">return</span> base <span class="k3">+</span> delta <span class="k3">*</span> count <span class="k3">-</span> delta<span class="k2">;</span>
<span class="number">  81</span><span class="k2">}</span>
<span class="number">  82</span>
<span class="number">  83</span><span class="c">// Generates the waveform.</span>
<span class="number">  84</span><span class="k1">void</span> waveform<span class="k2">(</span>
<span class="number">  85</span>    <span class="k1">float</span><span class="k3">*</span> buffer,   <span class="c">// Raw sample buffer.</span>
<span class="number">  86</span>    <span class="k1">int32_t</span> samples, <span class="c">// Length of buffer.</span>
<span class="number">  87</span>    <span class="k1">float</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>,      <span class="c">// Starting time value for this buffer.</span>
<span class="number">  88</span>    <span class="k1">uint64_t</span> count,  <span class="c">// Starting sample count for this buffer.</span>
<span class="number">  89</span>    <span class="k1">float</span> ffreq,     <span class="c">// Voice/mixer/stream frequency (float).</span>
<span class="number">  90</span>    <span class="k1">int32_t</span> vfreq,   <span class="c">// Voice/mixer/stream frequency (int).</span>
<span class="number">  91</span>    <span class="k1">int32_t</span> which    <span class="c">// Choice of interpolation function.</span>
<span class="number">  92</span>  <span class="k2">)</span>
<span class="number">  93</span><span class="k2">{</span>
<span class="number">  94</span>  <span class="k1">float</span> pi <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/ALLEGRO_PI"><span class="a">ALLEGRO_PI</span></a><span class="k2">;</span>
<span class="number">  95</span>  <span class="k1">float</span> pi2 <span class="k3">=</span> pi <span class="k3">*</span> <span class="n">2</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  96</span>  <span class="k1">float</span> dt <span class="k3">=</span> <span class="n">1</span>.<span class="n">0f</span> <span class="k3">/</span> ffreq<span class="k2">;</span>
<span class="number">  97</span>
<span class="number">  98</span>  <span class="k1">for</span><span class="k2">(</span><span class="k1">int32_t</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> samples<span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  99</span>    <span class="k1">float</span> pt <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>i<span class="k2">;</span>
<span class="number"> 100</span>    <span class="k1">float</span> ti <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">+</span> pt <span class="k3">*</span> dt<span class="k2">;</span>
<span class="number"> 101</span>
<span class="number"> 102</span>    <span class="k1">float</span> frequency<span class="k2">;</span>
<span class="number"> 103</span>    <span class="k1">float</span> start <span class="k3">=</span> g_start_frequency<span class="k2">;</span>
<span class="number"> 104</span>    <span class="k1">float</span> change <span class="k3">=</span> g_frequency_change<span class="k2">;</span>
<span class="number"> 105</span>    <span class="k1">float</span> tt <span class="k3">=</span> g_interp_time<span class="k2">;</span>
<span class="number"> 106</span>    try_again:
<span class="number"> 107</span>
<span class="number"> 108</span>    <span class="k1">if</span><span class="k2">(</span>which <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 109</span>      <span class="c">// Interpolate smoothly from 220 to 620 in 4 seconds.</span>
<span class="number"> 110</span>      frequency <span class="k3">=</span> interpolate_sinusoidal_inout<span class="k2">(</span>ti, start, change, tt<span class="k2">)</span> <span class="k3">*</span> pi2<span class="k2">;</span>
<span class="number"> 111</span>    <span class="k2">}</span>
<span class="number"> 112</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>which <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 113</span>      <span class="c">// Direct linear interpolation.</span>
<span class="number"> 114</span>      frequency <span class="k3">=</span> interpolate_linear_tween<span class="k2">(</span>ti, start, change, tt<span class="k2">)</span> <span class="k3">*</span> pi2<span class="k2">;</span>
<span class="number"> 115</span>    <span class="k2">}</span>
<span class="number"> 116</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>which <span class="k3">=</span><span class="k3">=</span> <span class="n">2</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 117</span>      <span class="c">// Discrete steps in frequency, no smooth changes.</span>
<span class="number"> 118</span>      <span class="c">// Note: high step counts may create static or stuttering.</span>
<span class="number"> 119</span>      frequency <span class="k3">=</span> interpolate_discrete_step<span class="k2">(</span>ti, start, change, tt<span class="k2">)</span> <span class="k3">*</span> pi2<span class="k2">;</span>
<span class="number"> 120</span>    <span class="k2">}</span>
<span class="number"> 121</span>    <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 122</span>      which <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 123</span>      <span class="k1">goto</span> try_again<span class="k2">;</span>
<span class="number"> 124</span>    <span class="k2">}</span>
<span class="number"> 125</span>
<span class="number"> 126</span>    <span class="c">// Generate the waveform, allowing for frequency interpolation.</span>
<span class="number"> 127</span>    g_sine <span class="k3">=</span> g_sine <span class="k3">+</span> frequency <span class="k3">/</span> ffreq<span class="k2">;</span>
<span class="number"> 128</span>    <span class="k1">while</span><span class="k2">(</span>g_sine <span class="k3">&gt;</span> pi2<span class="k2">)</span> g_sine <span class="k3">-</span><span class="k3">=</span> pi2<span class="k2">;</span> <span class="c">// Prevent saturation.</span>
<span class="number"> 129</span>    <span class="k1">float</span> va <span class="k3">=</span> std::sin<span class="k2">(</span>g_sine<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 130</span>
<span class="number"> 131</span>    <span class="c">// Print variables every 1/32 second.</span>
<span class="number"> 132</span>    <span class="k1">if</span><span class="k2">(</span><span class="k2">(</span>count <span class="k3">+</span> i<span class="k2">)</span> % <span class="k2">(</span>vfreq <span class="k3">/</span> <span class="n">32</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 133</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Time %f : Freq %f : Sine %f\n"</span>,
<span class="number"> 134</span>        ti, frequency <span class="k3">/</span> pi2, g_sine<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 135</span>    <span class="k2">}</span>
<span class="number"> 136</span>
<span class="number"> 137</span>    buffer<span class="k2">[</span>i<span class="k2">]</span> <span class="k3">=</span> va<span class="k2">;</span>
<span class="number"> 138</span>  <span class="k2">}</span>
<span class="number"> 139</span><span class="k2">}</span>
<span class="number"> 140</span>
<span class="number"> 141</span><span class="k1">int32_t</span> main<span class="k2">(</span><span class="k1">int32_t</span> argc, <span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span><span class="k3">*</span> argv<span class="k2">)</span>
<span class="number"> 142</span><span class="k2">{</span>
<span class="number"> 143</span>  <span class="c">// Declare variables in advance because using 'goto' for cleanup.</span>
<span class="number"> 144</span>  <span class="k1">bool</span> success <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 145</span>
<span class="number"> 146</span>  <span class="c">// Keep track of what items need cleaning up.</span>
<span class="number"> 147</span>  <span class="k1">bool</span> have_alleg <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 148</span>  <span class="k1">bool</span> have_audio <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 149</span>  <span class="k1">bool</span> have_voice <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 150</span>  <span class="k1">bool</span> have_mixer <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 151</span>  <span class="k1">bool</span> have_stream <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 152</span>
<span class="number"> 153</span>  <span class="k1">bool</span> mixer_attached <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 154</span>  <span class="k1">bool</span> stream_attached <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 155</span>
<span class="number"> 156</span>  <span class="c">// Set when time to exit.</span>
<span class="number"> 157</span>  <span class="k1">bool</span> done <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 158</span>
<span class="number"> 159</span>  <span class="c">// Which interpolation function to use.</span>
<span class="number"> 160</span>  <span class="k1">int32_t</span> which <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 161</span>
<span class="number"> 162</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_VOICE"><span class="a">ALLEGRO_VOICE</span></a><span class="k3">*</span> voice <span class="k3">=</span> nullptr<span class="k2">;</span>
<span class="number"> 163</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_MIXER"><span class="a">ALLEGRO_MIXER</span></a><span class="k3">*</span> mixer <span class="k3">=</span> nullptr<span class="k2">;</span>
<span class="number"> 164</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_AUDIO_STREAM"><span class="a">ALLEGRO_AUDIO_STREAM</span></a><span class="k3">*</span> stream <span class="k3">=</span> nullptr<span class="k2">;</span>
<span class="number"> 165</span>
<span class="number"> 166</span>  <span class="c">// Voice/mixer/stream frequency. Same variable, 2 representations.</span>
<span class="number"> 167</span>  <span class="k1">int32_t</span> vfreq <span class="k3">=</span> <span class="n">44100</span><span class="k2">;</span>
<span class="number"> 168</span>  <span class="k1">float</span> ffreq <span class="k3">=</span> <span class="n">44100</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 169</span>
<span class="number"> 170</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_AUDIO_DEPTH"><span class="a">ALLEGRO_AUDIO_DEPTH</span></a> idepth <span class="k3">=</span> ALLEGRO_AUDIO_DEPTH_INT16<span class="k2">;</span>
<span class="number"> 171</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_AUDIO_DEPTH"><span class="a">ALLEGRO_AUDIO_DEPTH</span></a> fdepth <span class="k3">=</span> ALLEGRO_AUDIO_DEPTH_FLOAT32<span class="k2">;</span>
<span class="number"> 172</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_CHANNEL_CONF"><span class="a">ALLEGRO_CHANNEL_CONF</span></a> vchan <span class="k3">=</span> ALLEGRO_CHANNEL_CONF_2<span class="k2">;</span>
<span class="number"> 173</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_CHANNEL_CONF"><span class="a">ALLEGRO_CHANNEL_CONF</span></a> schan <span class="k3">=</span> ALLEGRO_CHANNEL_CONF_1<span class="k2">;</span>
<span class="number"> 174</span>  <span class="k1">int32_t</span> fragments <span class="k3">=</span> <span class="n">8</span><span class="k2">;</span> <span class="c">// Number of sample buffers.</span>
<span class="number"> 175</span>
<span class="number"> 176</span>  <span class="c">// Samples per buffer. Same variable, 2 representations.</span>
<span class="number"> 177</span>  <span class="k1">int32_t</span> samples <span class="k3">=</span> <span class="n">1024</span><span class="k2">;</span>
<span class="number"> 178</span>  <span class="k1">float</span> fsamps <span class="k3">=</span> <span class="n">1024</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 179</span>
<span class="number"> 180</span>  <span class="k1">float</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 181</span>  <span class="k1">float</span> end_time <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 182</span>  <span class="k1">float</span> dt <span class="k3">=</span> <span class="n">1</span>.<span class="n">0f</span> <span class="k3">/</span> ffreq<span class="k2">;</span>
<span class="number"> 183</span>
<span class="number"> 184</span>  <span class="c">// Will store current sample value (1024 per second).</span>
<span class="number"> 185</span>  <span class="k1">uint64_t</span> count <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 186</span>
<span class="number"> 187</span>  <span class="k1">auto</span> parse_float <span class="k3">=</span> <span class="k2">[</span><span class="k2">]</span><span class="k2">(</span>
<span class="number"> 188</span>    <span class="k1">int32_t</span> argc, <span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span><span class="k3">*</span> argv, <span class="k1">int32_t</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a>, <span class="k1">float</span><span class="k3">*</span> out<span class="k2">)</span>
<span class="number"> 189</span>  <span class="k2">{</span>
<span class="number"> 190</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>out<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 191</span>    <span class="k1">bool</span> status <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 192</span>
<span class="number"> 193</span>    <span class="k1">if</span><span class="k2">(</span>argc <span class="k3">&gt;</span><span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">+</span> <span class="n">1</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 194</span>      std::string arg <span class="k2">{</span>argv<span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">]</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 195</span>      <span class="k1">try</span> <span class="k2">{</span>
<span class="number"> 196</span>        std::size_t pos <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 197</span>        <span class="k1">float</span> result <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>std::stof<span class="k2">(</span>arg, <span class="k3">&amp;</span>pos<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 198</span>
<span class="number"> 199</span>        <span class="c">// Screen out bad parameters.</span>
<span class="number"> 200</span>        <span class="k1">if</span><span class="k2">(</span>pos <span class="k3">!</span><span class="k3">=</span> arg.size<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 201</span>          <span class="k1">throw</span> std::exception <span class="k2">{</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 202</span>        <span class="k2">}</span>
<span class="number"> 203</span>
<span class="number"> 204</span>        status <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 205</span>        <span class="k2">(</span><span class="k3">*</span>out<span class="k2">)</span> <span class="k3">=</span> result<span class="k2">;</span>
<span class="number"> 206</span>      <span class="k2">}</span>
<span class="number"> 207</span>      <span class="k1">catch</span><span class="k2">(</span>...<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 208</span>        status <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 209</span>      <span class="k2">}</span>
<span class="number"> 210</span>    <span class="k2">}</span>
<span class="number"> 211</span>
<span class="number"> 212</span>    <span class="k1">return</span> status<span class="k2">;</span>
<span class="number"> 213</span>  <span class="k2">}</span><span class="k2">;</span>
<span class="number"> 214</span>
<span class="number"> 215</span>  <span class="c">// Parse command-line options.</span>
<span class="number"> 216</span>  <span class="k1">if</span><span class="k2">(</span>argc <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">2</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 217</span>    <span class="c">// The index in the command-line at which common options start.</span>
<span class="number"> 218</span>    <span class="k1">int32_t</span> common_index <span class="k3">=</span> <span class="n">2</span><span class="k2">;</span>
<span class="number"> 219</span>
<span class="number"> 220</span>    <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span>argv<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, <span class="s">"sine"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 221</span>      which <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 222</span>      <span class="k1">goto</span> do_common_opts<span class="k2">;</span>
<span class="number"> 223</span>    <span class="k2">}</span>
<span class="number"> 224</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span>argv<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, <span class="s">"linear"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 225</span>      which <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 226</span>      <span class="k1">goto</span> do_common_opts<span class="k2">;</span>
<span class="number"> 227</span>    <span class="k2">}</span>
<span class="number"> 228</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span>argv<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, <span class="s">"step"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 229</span>      which <span class="k3">=</span> <span class="n">2</span><span class="k2">;</span>
<span class="number"> 230</span>      <span class="k1">bool</span> result <span class="k3">=</span> parse_float<span class="k2">(</span>argc, argv, <span class="n">2</span>, <span class="k3">&amp;</span>g_step_count<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 231</span>      <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>result<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 232</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not parse step count.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 233</span>        <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 234</span>      <span class="k2">}</span>
<span class="number"> 235</span>      g_step_count <span class="k3">=</span> std::max<span class="k2">(</span>g_step_count, <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 236</span>      g_step_count <span class="k3">=</span> std::floor<span class="k2">(</span>g_step_count<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 237</span>
<span class="number"> 238</span>      common_index <span class="k3">=</span> <span class="n">3</span><span class="k2">;</span>
<span class="number"> 239</span>      <span class="k1">goto</span> do_common_opts<span class="k2">;</span>
<span class="number"> 240</span>    <span class="k2">}</span>
<span class="number"> 241</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span>argv<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, <span class="s">"help"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 242</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Options:\n"</span>
<span class="number"> 243</span>        <span class="s">"  sine [start_freq] [freq_change] [total_time]\n"</span>
<span class="number"> 244</span>        <span class="s">"  linear [start_freq] [freq_change] [total_time]\n"</span>
<span class="number"> 245</span>        <span class="s">"  step [count] [start_freq] [freq_change] [total_time]\n"</span>
<span class="number"> 246</span>        <span class="s">"  help\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 247</span>      success <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 248</span>      <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 249</span>    <span class="k2">}</span>
<span class="number"> 250</span>    <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 251</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Unrecognized option.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 252</span>      <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 253</span>    <span class="k2">}</span>
<span class="number"> 254</span>
<span class="number"> 255</span>    <span class="c">// Parse common command-line options.</span>
<span class="number"> 256</span>    <span class="k1">if</span><span class="k2">(</span><span class="k1">false</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 257</span>      do_common_opts:
<span class="number"> 258</span>      <span class="k1">bool</span> result<span class="k2">;</span>
<span class="number"> 259</span>
<span class="number"> 260</span>      result <span class="k3">=</span> parse_float<span class="k2">(</span>argc, argv, common_index <span class="k3">+</span> <span class="n">0</span>, <span class="k3">&amp;</span>g_start_frequency<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 261</span>      <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>result<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 262</span>        g_start_frequency <span class="k3">=</span> <span class="n">220</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 263</span>      <span class="k2">}</span>
<span class="number"> 264</span>
<span class="number"> 265</span>      result <span class="k3">=</span> parse_float<span class="k2">(</span>argc, argv, common_index <span class="k3">+</span> <span class="n">1</span>, <span class="k3">&amp;</span>g_frequency_change<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 266</span>      <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>result<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 267</span>        g_frequency_change <span class="k3">=</span> <span class="n">400</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 268</span>      <span class="k2">}</span>
<span class="number"> 269</span>
<span class="number"> 270</span>      result <span class="k3">=</span> parse_float<span class="k2">(</span>argc, argv, common_index <span class="k3">+</span> <span class="n">2</span>, <span class="k3">&amp;</span>end_time<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 271</span>      <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>result<span class="k2">)</span> end_time <span class="k3">=</span> <span class="n">5</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 272</span>      end_time <span class="k3">=</span> std::max<span class="k2">(</span>end_time, <span class="n">2</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 273</span>      g_interp_time <span class="k3">=</span> end_time <span class="k3">-</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 274</span>    <span class="k2">}</span>
<span class="number"> 275</span>  <span class="k2">}</span>
<span class="number"> 276</span>  <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 277</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"You must specify some option (pass \"help\").\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 278</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 279</span>  <span class="k2">}</span>
<span class="number"> 280</span>
<span class="number"> 281</span>  <span class="c">// Initializations.</span>
<span class="number"> 282</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_install_system"><span class="a">al_install_system</span></a><span class="k2">(</span>ALLEGRO_VERSION_INT, <a href="http://www.delorie.com/djgpp/doc/libc/libc_52.html" target="_blank">atexit</a><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 283</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not init Allegro.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 284</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 285</span>  <span class="k2">}</span> <span class="k1">else</span> have_alleg <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 286</span>
<span class="number"> 287</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_install_audio"><span class="a">al_install_audio</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 288</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not install audio.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 289</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 290</span>  <span class="k2">}</span> <span class="k1">else</span> have_audio <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 291</span>
<span class="number"> 292</span>  voice <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_voice"><span class="a">al_create_voice</span></a><span class="k2">(</span>vfreq, idepth, vchan<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 293</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>voice<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 294</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not create hardware voice.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 295</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 296</span>  <span class="k2">}</span> <span class="k1">else</span> have_voice <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 297</span>
<span class="number"> 298</span>  mixer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_mixer"><span class="a">al_create_mixer</span></a><span class="k2">(</span>vfreq, fdepth, vchan<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 299</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>mixer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 300</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not create mixer.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 301</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 302</span>  <span class="k2">}</span> <span class="k1">else</span> have_mixer <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 303</span>
<span class="number"> 304</span>  mixer_attached <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_attach_mixer_to_voice"><span class="a">al_attach_mixer_to_voice</span></a><span class="k2">(</span>mixer, voice<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 305</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>mixer_attached<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 306</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not attach mixer to voice.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 307</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 308</span>  <span class="k2">}</span>
<span class="number"> 309</span>
<span class="number"> 310</span>  stream <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_audio_stream"><span class="a">al_create_audio_stream</span></a><span class="k2">(</span>fragments, samples, vfreq, fdepth, schan<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 311</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>stream<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 312</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not create audio stream.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 313</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 314</span>  <span class="k2">}</span> <span class="k1">else</span> have_stream <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 315</span>
<span class="number"> 316</span>  stream_attached <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_attach_audio_stream_to_mixer"><span class="a">al_attach_audio_stream_to_mixer</span></a><span class="k2">(</span>stream, mixer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 317</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>stream_attached<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 318</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Could not attach audio stream to mixer.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 319</span>    <span class="k1">goto</span> cleanup<span class="k2">;</span>
<span class="number"> 320</span>  <span class="k2">}</span>
<span class="number"> 321</span>
<span class="number"> 322</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Total time: %f, starting frequency: %f, target frequency: %f.\n"</span>,
<span class="number"> 323</span>    end_time, g_start_frequency, g_start_frequency <span class="k3">+</span> g_frequency_change<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 324</span>
<span class="number"> 325</span>  <span class="c">// Main loop.</span>
<span class="number"> 326</span>  <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>done<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 327</span>    <span class="k1">void</span><span class="k3">*</span> buffer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_audio_stream_fragment"><span class="a">al_get_audio_stream_fragment</span></a><span class="k2">(</span>stream<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 328</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>buffer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 329</span>      <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">0</span>.<span class="n">001f</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// Don't be a timeslice hog.</span>
<span class="number"> 330</span>      <span class="k1">continue</span><span class="k2">;</span>
<span class="number"> 331</span>    <span class="k2">}</span>
<span class="number"> 332</span>
<span class="number"> 333</span>    <span class="c">// Generate waveform.</span>
<span class="number"> 334</span>    waveform<span class="k2">(</span><span class="k2">(</span><span class="k1">float</span><span class="k3">*</span><span class="k2">)</span>buffer, samples, <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>, count, ffreq, vfreq, which<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 335</span>
<span class="number"> 336</span>    <span class="c">// Advance time and sample count.</span>
<span class="number"> 337</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">+</span><span class="k3">=</span> <span class="k2">(</span>dt <span class="k3">*</span> fsamps<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 338</span>    count <span class="k3">+</span><span class="k3">=</span> samples<span class="k2">;</span>
<span class="number"> 339</span>
<span class="number"> 340</span>    <a href="http://www.allegro.cc/manual/al_set_audio_stream_fragment"><span class="a">al_set_audio_stream_fragment</span></a><span class="k2">(</span>stream, buffer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 341</span>    <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&gt;</span><span class="k3">=</span> end_time<span class="k2">)</span> done <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span> <span class="c">// Quit after some seconds.</span>
<span class="number"> 342</span>  <span class="k2">}</span>
<span class="number"> 343</span>
<span class="number"> 344</span>  <a href="http://www.allegro.cc/manual/al_drain_audio_stream"><span class="a">al_drain_audio_stream</span></a><span class="k2">(</span>stream<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 345</span>
<span class="number"> 346</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Total time: %f, starting frequency: %f, target frequency: %f.\n"</span>,
<span class="number"> 347</span>    end_time, g_start_frequency, g_start_frequency <span class="k3">+</span> g_frequency_change<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 348</span>
<span class="number"> 349</span>  success <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 350</span>  cleanup:
<span class="number"> 351</span>
<span class="number"> 352</span>  <span class="c">// Cleanup.</span>
<span class="number"> 353</span>  <span class="k1">if</span><span class="k2">(</span>have_stream<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 354</span>    <a href="http://www.allegro.cc/manual/al_detach_audio_stream"><span class="a">al_detach_audio_stream</span></a><span class="k2">(</span>stream<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 355</span>    <a href="http://www.allegro.cc/manual/al_destroy_audio_stream"><span class="a">al_destroy_audio_stream</span></a><span class="k2">(</span>stream<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 356</span>  <span class="k2">}</span>
<span class="number"> 357</span>
<span class="number"> 358</span>  <span class="k1">if</span><span class="k2">(</span>have_mixer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 359</span>    <a href="http://www.allegro.cc/manual/al_detach_mixer"><span class="a">al_detach_mixer</span></a><span class="k2">(</span>mixer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 360</span>    <a href="http://www.allegro.cc/manual/al_destroy_mixer"><span class="a">al_destroy_mixer</span></a><span class="k2">(</span>mixer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 361</span>  <span class="k2">}</span>
<span class="number"> 362</span>
<span class="number"> 363</span>  <span class="k1">if</span><span class="k2">(</span>have_voice<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 364</span>    <a href="http://www.allegro.cc/manual/al_detach_voice"><span class="a">al_detach_voice</span></a><span class="k2">(</span>voice<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 365</span>    <a href="http://www.allegro.cc/manual/al_destroy_voice"><span class="a">al_destroy_voice</span></a><span class="k2">(</span>voice<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 366</span>  <span class="k2">}</span>
<span class="number"> 367</span>
<span class="number"> 368</span>  <span class="k1">if</span><span class="k2">(</span>have_audio<span class="k2">)</span> <a href="http://www.allegro.cc/manual/al_uninstall_audio"><span class="a">al_uninstall_audio</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 369</span>  <span class="k1">if</span><span class="k2">(</span>have_alleg<span class="k2">)</span> <a href="http://www.allegro.cc/manual/al_uninstall_system"><span class="a">al_uninstall_system</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 370</span>
<span class="number"> 371</span>  <span class="k1">if</span><span class="k2">(</span>success<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 372</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Everything worked.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 373</span>    <span class="k1">return</span> EXIT_SUCCESS<span class="k2">;</span>
<span class="number"> 374</span>  <span class="k2">}</span>
<span class="number"> 375</span>
<span class="number"> 376</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Something went wrong.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 377</span>  <span class="k1">return</span> EXIT_FAILURE<span class="k2">;</span>
<span class="number"> 378</span><span class="k2">}</span>
</div></div><p>

One thing of note is that Edgar Reynaldo&#39;s SoundBlaster no longer sounds as it was originally intended to sound. I guess it depended on the wrong frequency behavior. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>Now if only I understood WHY it works ... I&#39;ve been coding for years and I&#39;m still not that good with math.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Bluebird)</author>
		<pubDate>Mon, 08 Jul 2019 05:53:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>One thing that&#39;s helping for sure: always make the maximum number of operations before dividing.</p><p>a = ( b + c ) / d will keep precision longer than a = b/d + c/d</p><p>The sine thing  look like a variable range problem. MikiZX added a global sine value which he initialize on main, and then iterate before using it along interpolation.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Mon, 08 Jul 2019 18:13:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hey, I thought you would be interested. I made a simple sound generator you might like.</p><p><a href="https://www.allegro.cc/files/attachment/612094">Get it here (SoundFoX1.zip)</a></p><p>Source code included (depends on Eagle and Allegro 5)</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span><span class="p">#include "Eagle/backends/Allegro5Backend.hpp"</span>
<span class="number">   2</span><span class="p">#include "Eagle.hpp"</span>
<span class="number">   3</span>
<span class="number">   4</span>
<span class="number">   5</span><span class="c">/// Data(t) = Amplitude(t)*waveform(t)</span>
<span class="number">   6</span>
<span class="number">   7</span>
<span class="number">   8</span><span class="k1">typedef</span> <span class="k1">float</span> <span class="k2">(</span><span class="k3">*</span>WAVEFORM<span class="k2">)</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">   9</span><span class="k1">typedef</span> <span class="k1">float</span> <span class="k2">(</span><span class="k3">*</span>VOLUMEFORM<span class="k2">)</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  10</span><span class="k1">typedef</span> <span class="k1">float</span> <span class="k2">(</span><span class="k3">*</span>FREQFORM<span class="k2">)</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  11</span><span class="k1">typedef</span> <span class="k1">float</span> <span class="k2">(</span><span class="k3">*</span>AUDIOFORM<span class="k2">)</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  12</span>
<span class="number">  13</span><span class="k1">float</span> SINWAVE <span class="k2">(</span><span class="k1">float</span> pct<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  14</span>   <span class="k1">return</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span>pct<span class="k3">*</span><span class="n">2</span><span class="k3">*</span>M_PI<span class="k2">)</span><span class="k2">;</span>
<span class="number">  15</span><span class="k2">}</span>
<span class="number">  16</span><span class="k1">float</span> TRIANGLEWAVE <span class="k2">(</span><span class="k1">float</span> pct<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  17</span>   <span class="c">/// maps percent [0.0f,1.0f] to /\/ triangle wave</span>
<span class="number">  18</span>   pct <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_332.html" target="_blank">fmod</a><span class="k2">(</span>pct , <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  19</span>   <span class="k1">if</span> <span class="k2">(</span>pct <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">25</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  20</span>      <span class="k1">return</span> <span class="n">0</span>.<span class="n">0f</span> <span class="k3">+</span> <span class="n">1</span><span class="k3">*</span>pct<span class="k3">*</span><span class="n">4</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  21</span>   <span class="k2">}</span>
<span class="number">  22</span>   <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>pct <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">75</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  23</span>      <span class="k1">return</span> <span class="n">1</span>.<span class="n">0f</span> <span class="k3">+</span> <span class="k2">(</span><span class="k3">-</span><span class="n">2</span>.<span class="n">0f</span><span class="k3">*</span><span class="k2">(</span>pct <span class="k3">-</span> <span class="n">0</span>.<span class="n">25f</span><span class="k2">)</span><span class="k3">*</span><span class="n">2</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  24</span>   <span class="k2">}</span>
<span class="number">  25</span>   <span class="k1">else</span> <span class="k2">{</span>
<span class="number">  26</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span>.<span class="n">0f</span> <span class="k3">+</span> <span class="n">1</span>.<span class="n">0f</span><span class="k3">*</span><span class="k2">(</span>pct <span class="k3">-</span> <span class="n">0</span>.<span class="n">75f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  27</span>   <span class="k2">}</span>
<span class="number">  28</span>   <span class="k1">return</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span><span class="c">/// Not reached</span>
<span class="number">  29</span><span class="k2">}</span>
<span class="number">  30</span><span class="k1">float</span> SQUAREWAVE <span class="k2">(</span><span class="k1">float</span> pct<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  31</span>   pct <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_332.html" target="_blank">fmod</a><span class="k2">(</span>pct , <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  32</span>   <span class="k1">return</span> <span class="k2">(</span>pct <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">5</span><span class="k2">)</span>?<span class="n">1</span>.<span class="n">0</span><span class="k2">:</span><span class="k3">-</span><span class="n">1</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number">  33</span><span class="k2">}</span>
<span class="number">  34</span>
<span class="number">  35</span>
<span class="number">  36</span><span class="k1">float</span> RAMP <span class="k2">(</span><span class="k1">float</span> pct<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  37</span>   pct <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_332.html" target="_blank">fmod</a><span class="k2">(</span>pct , <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  38</span>   <span class="k1">return</span> pct<span class="k3">*</span>pct<span class="k3">*</span>pct<span class="k2">;</span>
<span class="number">  39</span><span class="k2">}</span>
<span class="number">  40</span>
<span class="number">  41</span><span class="k1">float</span> RAMP2 <span class="k2">(</span><span class="k1">float</span> pct<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  42</span>   pct <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_332.html" target="_blank">fmod</a><span class="k2">(</span>pct , <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  43</span>   pct <span class="k3">=</span> <span class="n">1</span>.<span class="n">0</span> <span class="k3">+</span> <span class="n">99</span>.<span class="n">0f</span><span class="k3">*</span>pct<span class="k2">;</span>
<span class="number">  44</span>   <span class="k1">return</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_543.html" target="_blank">log10</a><span class="k2">(</span>pct<span class="k2">)</span><span class="k3">/</span><span class="n">2</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  45</span><span class="k2">}</span>
<span class="number">  46</span>
<span class="number">  47</span><span class="k1">float</span> DAMP <span class="k2">(</span><span class="k1">float</span> pct<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  48</span>   pct <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_332.html" target="_blank">fmod</a><span class="k2">(</span>pct , <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  49</span>   <span class="k1">return</span> <span class="k2">(</span><span class="n">1</span>.<span class="n">0f</span> <span class="k3">-</span> pct<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span><span class="n">1</span>.<span class="n">0f</span> <span class="k3">-</span> pct<span class="k2">)</span><span class="k2">;</span>
<span class="number">  50</span><span class="k2">}</span>
<span class="number">  51</span>
<span class="number">  52</span><span class="k1">float</span> HALFVOL<span class="k2">(</span><span class="k1">float</span> pct<span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> <span class="n">0</span>.<span class="n">5f</span><span class="k2">;</span><span class="k2">}</span>
<span class="number">  53</span>
<span class="number">  54</span><span class="k1">float</span> RAMPANDDAMP <span class="k2">(</span><span class="k1">float</span> pct<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  55</span>   pct <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_332.html" target="_blank">fmod</a><span class="k2">(</span>pct , <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  56</span>   <span class="k1">if</span> <span class="k2">(</span>pct <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">5f</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  57</span>      <span class="k1">return</span> RAMP<span class="k2">(</span>pct<span class="k3">*</span><span class="n">2</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  58</span>   <span class="k2">}</span>
<span class="number">  59</span>   <span class="k1">else</span> <span class="k2">{</span>
<span class="number">  60</span>      <span class="k1">return</span> DAMP<span class="k2">(</span>pct<span class="k3">*</span><span class="n">2</span>.<span class="n">0f</span> <span class="k3">-</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  61</span>   <span class="k2">}</span>
<span class="number">  62</span>   <span class="k1">return</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span><span class="c">/// Not reached</span>
<span class="number">  63</span><span class="k2">}</span>
<span class="number">  64</span>
<span class="number">  65</span>
<span class="number">  66</span>
<span class="number">  67</span><span class="k1">void</span> waveform<span class="k2">(</span><span class="k1">float</span><span class="k3">*</span> buffer, <span class="k1">int32_t</span> samples, <span class="k1">float</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> , <span class="k1">float</span> vfreq<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  68</span>  <span class="k1">for</span><span class="k2">(</span><span class="k1">int32_t</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> samples<span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  69</span>    <span class="k1">float</span> ti <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">+</span> i<span class="k3">/</span>vfreq<span class="k2">;</span><span class="c">//pt * samples/vfreq;</span>
<span class="number">  70</span>
<span class="number">  71</span><span class="c">//    buffer[i] = RAMP(fmod(ti,5.0f)/5.0)*TRIANGLEWAVE(440.0f*ti*2.0*M_PI);</span>
<span class="number">  72</span>    buffer<span class="k2">[</span>i<span class="k2">]</span> <span class="k3">=</span> SINWAVE<span class="k2">(</span><span class="k2">(</span><span class="n">220</span>.<span class="n">0f</span> <span class="k3">+</span> <span class="n">220</span>.<span class="n">0f</span><span class="k3">*</span>DAMP<span class="k2">(</span>ti<span class="k3">/</span><span class="n">7</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">)</span><span class="k3">*</span>ti<span class="k3">*</span><span class="n">2</span>.<span class="n">0f</span><span class="k3">*</span>M_PI<span class="k2">)</span><span class="k2">;</span>
<span class="number">  73</span>  <span class="k2">}</span>
<span class="number">  74</span><span class="k2">}</span>
<span class="number">  75</span>
<span class="number">  76</span>
<span class="number">  77</span><span class="k1">float</span> FREQ220<span class="k2">(</span><span class="k1">float</span> pct<span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> <span class="n">220</span>.<span class="n">0f</span> <span class="k3">+</span> <span class="n">110</span>.<span class="n">0f</span><span class="k3">*</span>RAMP<span class="k2">(</span>pct<span class="k2">)</span><span class="k2">;</span><span class="k2">}</span>
<span class="number">  78</span>
<span class="number">  79</span><span class="k1">template</span><span class="k3">&lt;</span><span class="k1">class</span> Type&gt;
<span class="number">  80</span><span class="k1">class</span> Interp <span class="k2">{</span>
<span class="number">  81</span><span class="k1">public</span> <span class="k2">:</span>
<span class="number">  82</span>   Type start<span class="k2">;</span>
<span class="number">  83</span>   Type finish<span class="k2">;</span>
<span class="number">  84</span>   
<span class="number">  85</span>   Interp<span class="k2">(</span>Type begin , Type end<span class="k2">)</span> <span class="k2">:</span>
<span class="number">  86</span>      start<span class="k2">(</span>begin<span class="k2">)</span>,
<span class="number">  87</span>      finish<span class="k2">(</span>end<span class="k2">)</span>
<span class="number">  88</span>   <span class="k2">{</span>
<span class="number">  89</span>      
<span class="number">  90</span>   <span class="k2">}</span>
<span class="number">  91</span><span class="c">//   void operator(float pct);</span>
<span class="number">  92</span>   Type <span class="k1">operator</span><span class="k2">(</span><span class="k2">)</span><span class="k2">(</span><span class="k1">float</span> pct<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  93</span>      pct <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_332.html" target="_blank">fmod</a><span class="k2">(</span>pct , <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  94</span>      <span class="k1">return</span> start <span class="k3">+</span> <span class="k2">(</span>finish-start<span class="k2">)</span><span class="k3">*</span>pct<span class="k2">;</span>
<span class="number">  95</span>   <span class="k2">}</span>
<span class="number">  96</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  97</span>             
<span class="number">  98</span><span class="k1">class</span> Audio <span class="k2">{</span>
<span class="number">  99</span>   <span class="k1">int</span> buffer_fragment_count<span class="k2">;</span><span class="c">///&lt; Fragment count</span>
<span class="number"> 100</span>   <span class="k1">int</span> samples_per_buffer<span class="k2">;</span><span class="c">///&lt; Sample count</span>
<span class="number"> 101</span>   <span class="k1">float</span> samples_per_second<span class="k2">;</span><span class="c">///&lt; Mixer frequency</span>
<span class="number"> 102</span>   <span class="k1">double</span> secs_per_sample<span class="k2">;</span><span class="c">///&lt; Duration per sample</span>
<span class="number"> 103</span>
<span class="number"> 104</span>   <span class="k1">double</span> sound_duration<span class="k2">;</span>
<span class="number"> 105</span>   
<span class="number"> 106</span>   VOLUMEFORM volform<span class="k2">;</span>
<span class="number"> 107</span>   WAVEFORM waveform<span class="k2">;</span>
<span class="number"> 108</span>   FREQFORM freqform<span class="k2">;</span>
<span class="number"> 109</span>
<span class="number"> 110</span>   <span class="k1">double</span> volume<span class="k2">;</span>
<span class="number"> 111</span>   <span class="k1">double</span> freq<span class="k2">;</span>
<span class="number"> 112</span>   
<span class="number"> 113</span><span class="k1">public</span> <span class="k2">:</span>
<span class="number"> 114</span>   Audio<span class="k2">(</span><span class="k2">)</span> <span class="k2">:</span>
<span class="number"> 115</span>         buffer_fragment_count<span class="k2">(</span><span class="n">8</span><span class="k2">)</span>,
<span class="number"> 116</span>         samples_per_buffer<span class="k2">(</span><span class="n">1024</span><span class="k2">)</span>,
<span class="number"> 117</span>         samples_per_second<span class="k2">(</span><span class="n">44100</span>.<span class="n">0f</span><span class="k2">)</span>,
<span class="number"> 118</span>         secs_per_sample<span class="k2">(</span><span class="n">1</span>.<span class="n">0</span><span class="k3">/</span>samples_per_second<span class="k2">)</span>,
<span class="number"> 119</span>         sound_duration<span class="k2">(</span><span class="n">5</span>.<span class="n">0</span><span class="k2">)</span>,
<span class="number"> 120</span>         volform<span class="k2">(</span>HALFVOL<span class="k2">)</span>,
<span class="number"> 121</span>         waveform<span class="k2">(</span>SINWAVE<span class="k2">)</span>,
<span class="number"> 122</span>         freqform<span class="k2">(</span>FREQ220<span class="k2">)</span>,
<span class="number"> 123</span>         volume<span class="k2">(</span><span class="n">0</span>.<span class="n">0</span><span class="k2">)</span>,
<span class="number"> 124</span>         freq<span class="k2">(</span><span class="n">220</span>.<span class="n">0</span><span class="k2">)</span>
<span class="number"> 125</span>   <span class="k2">{</span><span class="k2">}</span>
<span class="number"> 126</span>   
<span class="number"> 127</span>   
<span class="number"> 128</span><span class="c">//   void FillBuffer(float* buf , float audiotime);</span>
<span class="number"> 129</span>   <span class="k1">void</span> FillBuffer<span class="k2">(</span><span class="k1">float</span><span class="k3">*</span> buf , <span class="k1">float</span> audiotime<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 130</span>      <span class="k1">double</span> ti <span class="k3">=</span> audiotime<span class="k2">;</span>
<span class="number"> 131</span>      <span class="k1">for</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span> <span class="k2">;</span> i <span class="k3">&lt;</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span><span class="k2">)</span>samples_per_buffer <span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 132</span><span class="c">//         buf[i] = waveform(freqform(ti/sound_duration)*ti*2.0*M_PI/sound_duration);</span>
<span class="number"> 133</span><span class="c">//         buf[i] = waveform(220.0f*ti*2.0*M_PI);</span>
<span class="number"> 134</span><span class="c">//         buf[i] = waveform(Interp&lt;float&gt;(220.0f , 330.0f)(ti/sound_duration)*ti*2.0*M_PI);</span>
<span class="number"> 135</span><span class="c">///         buf[i] = Interp&lt;float&gt;(SINWAVE(220.0f*ti*2.0f*M_PI/3.0f) , SQUAREWAVE(220.0f*ti*2.0f*M_PI/3.0f))(ti/3.0f);</span>
<span class="number"> 136</span>         buf<span class="k2">[</span>i<span class="k2">]</span> <span class="k3">=</span> volume<span class="k3">*</span>waveform<span class="k2">(</span>freq<span class="k3">*</span><span class="n">2</span>.<span class="n">0</span><span class="k3">*</span>M_PI<span class="k3">*</span>ti<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 137</span>         ti <span class="k3">+</span><span class="k3">=</span> secs_per_sample<span class="k2">;</span>
<span class="number"> 138</span>      <span class="k2">}</span>
<span class="number"> 139</span>   <span class="k2">}</span>
<span class="number"> 140</span>   <span class="k1">void</span> SetVolume<span class="k2">(</span><span class="k1">double</span> pct<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 141</span>      <span class="k1">if</span> <span class="k2">(</span>pct <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>pct <span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">;</span><span class="k2">}</span>
<span class="number"> 142</span>      <span class="k1">if</span> <span class="k2">(</span>pct <span class="k3">&gt;</span> <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>pct <span class="k3">=</span> <span class="n">1</span>.<span class="n">0</span><span class="k2">;</span><span class="k2">}</span>
<span class="number"> 143</span>      volume <span class="k3">=</span> pct<span class="k2">;</span>
<span class="number"> 144</span>   <span class="k2">}</span>
<span class="number"> 145</span>   <span class="k1">void</span> SetFrequency<span class="k2">(</span><span class="k1">double</span> hz<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 146</span>      freq <span class="k3">=</span> hz<span class="k2">;</span>
<span class="number"> 147</span>   <span class="k2">}</span>
<span class="number"> 148</span>   <span class="k1">void</span> SetWaveForm<span class="k2">(</span>WAVEFORM wf<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 149</span>      waveform <span class="k3">=</span> wf<span class="k2">;</span>
<span class="number"> 150</span>   <span class="k2">}</span>
<span class="number"> 151</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 152</span>
<span class="number"> 153</span>
<span class="number"> 154</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number"> 155</span>
<span class="number"> 156</span>
<span class="number"> 157</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc , <span class="k1">char</span><span class="k3">*</span><span class="k3">*</span> argv<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 158</span>   
<span class="number"> 159</span>   <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>argc<span class="k2">;</span>
<span class="number"> 160</span>   <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>argv<span class="k2">;</span>
<span class="number"> 161</span>   
<span class="number"> 162</span>   
<span class="number"> 163</span>   SendOutputToFile<span class="k2">(</span><span class="s">"sfx.log.txt"</span> , <span class="s">""</span> , <span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 164</span>   EagleLogger::RemoveOutputStream<span class="k2">(</span>std::cout<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 165</span>   
<span class="number"> 166</span>   Allegro5System<span class="k3">*</span> a5sys <span class="k3">=</span> GetAllegro5System<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 167</span>   
<span class="number"> 168</span>   <span class="k1">if</span> <span class="k2">(</span>a5sys-&gt;Initialize<span class="k2">(</span>EAGLE_STANDARD_SETUP<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> EAGLE_STANDARD_SETUP<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 169</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 170</span>   <span class="k2">}</span>
<span class="number"> 171</span>   
<span class="number"> 172</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_VOICE"><span class="a">ALLEGRO_VOICE</span></a><span class="k3">*</span> voice <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_voice"><span class="a">al_create_voice</span></a><span class="k2">(</span><span class="n">44100</span> , ALLEGRO_AUDIO_DEPTH_INT16 , ALLEGRO_CHANNEL_CONF_2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 173</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_MIXER"><span class="a">ALLEGRO_MIXER</span></a><span class="k3">*</span> mixer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_mixer"><span class="a">al_create_mixer</span></a><span class="k2">(</span><span class="n">44100</span> , ALLEGRO_AUDIO_DEPTH_INT16 , ALLEGRO_CHANNEL_CONF_2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 174</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_AUDIO_STREAM"><span class="a">ALLEGRO_AUDIO_STREAM</span></a><span class="k3">*</span> stream <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_audio_stream"><span class="a">al_create_audio_stream</span></a><span class="k2">(</span><span class="n">8</span> , <span class="n">1024</span> , <span class="n">44100</span> , ALLEGRO_AUDIO_DEPTH_FLOAT32 , ALLEGRO_CHANNEL_CONF_1<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 175</span>   
<span class="number"> 176</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>voice <span class="k3">|</span><span class="k3">|</span> <span class="k3">!</span>mixer <span class="k3">|</span><span class="k3">|</span> <span class="k3">!</span>stream<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 177</span>      EagleLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Setup error"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 178</span>      <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>voice<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 179</span>         EagleWarn<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Failed to setup voice"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 180</span>         <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 181</span>      <span class="k2">}</span>
<span class="number"> 182</span>      <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>mixer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 183</span>         EagleWarn<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Failed to setup mixer"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 184</span>         <span class="k1">return</span> <span class="k3">-</span><span class="n">2</span><span class="k2">;</span>
<span class="number"> 185</span>      <span class="k2">}</span>
<span class="number"> 186</span>      <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>stream<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 187</span>         EagleWarn<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Failed to setup stream"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 188</span>         <span class="k1">return</span> <span class="k3">-</span><span class="n">3</span><span class="k2">;</span>
<span class="number"> 189</span>      <span class="k2">}</span>
<span class="number"> 190</span>      
<span class="number"> 191</span>   <span class="k2">}</span>
<span class="number"> 192</span>
<span class="number"> 193</span>   <span class="k1">bool</span> mixer_attached <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_attach_mixer_to_voice"><span class="a">al_attach_mixer_to_voice</span></a><span class="k2">(</span>mixer, voice<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 194</span>
<span class="number"> 195</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>mixer_attached<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 196</span>      EagleWarn<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Failed to attach mixer to voice"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 197</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">4</span><span class="k2">;</span>
<span class="number"> 198</span>   <span class="k2">}</span>
<span class="number"> 199</span>   
<span class="number"> 200</span>   <span class="k1">bool</span> stream_attached <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_attach_audio_stream_to_mixer"><span class="a">al_attach_audio_stream_to_mixer</span></a><span class="k2">(</span>stream, mixer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 201</span>
<span class="number"> 202</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>stream_attached<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 203</span>      EagleWarn<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Failed to attach stream to mixer"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 204</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">5</span><span class="k2">;</span>
<span class="number"> 205</span>   <span class="k2">}</span>
<span class="number"> 206</span>   
<span class="number"> 207</span>   <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_audio_stream_fragments"><span class="a">al_get_audio_stream_fragments</span></a><span class="k2">(</span>stream<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">8</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 208</span>      EagleLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Didn't get 8 fragments.\n"</span><span class="k2">;</span>
<span class="number"> 209</span>   <span class="k2">}</span>
<span class="number"> 210</span>   <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_audio_stream_channels"><span class="a">al_get_audio_stream_channels</span></a><span class="k2">(</span>stream<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> ALLEGRO_CHANNEL_CONF_1<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 211</span>      EagleLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Not a mono stream!\n"</span><span class="k2">;</span>
<span class="number"> 212</span>   <span class="k2">}</span>
<span class="number"> 213</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_get_audio_stream_attached"><span class="a">al_get_audio_stream_attached</span></a><span class="k2">(</span>stream<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 214</span>      EagleLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Stream not attached!\n"</span><span class="k2">;</span>
<span class="number"> 215</span>   <span class="k2">}</span>
<span class="number"> 216</span>   <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_audio_stream_frequency"><span class="a">al_get_audio_stream_frequency</span></a><span class="k2">(</span>stream<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">44100</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 217</span>      EagleLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Not mixing at 44100 HZ!\n"</span><span class="k2">;</span>
<span class="number"> 218</span>   <span class="k2">}</span>
<span class="number"> 219</span>   
<span class="number"> 220</span>   <span class="k1">int</span> sw <span class="k3">=</span> <span class="n">800</span><span class="k2">;</span>
<span class="number"> 221</span>   <span class="k1">int</span> sh <span class="k3">=</span> <span class="n">600</span><span class="k2">;</span>
<span class="number"> 222</span>   
<span class="number"> 223</span>   EagleGraphicsContext<span class="k3">*</span> win <span class="k3">=</span> a5sys-&gt;CreateGraphicsContext<span class="k2">(</span><span class="s">"Main window"</span> , sw , sh , EAGLE_OPENGL <span class="k3">|</span> EAGLE_WINDOWED<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 224</span>   
<span class="number"> 225</span>   WidgetHandler gui<span class="k2">(</span>win<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 226</span>   gui.SetWidgetArea<span class="k2">(</span>WIDGETAREA<span class="k2">(</span>Rectangle<span class="k2">(</span><span class="n">0</span> , <span class="n">0</span> , sw , sh<span class="k2">)</span> , <span class="k1">false</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 227</span>   gui.SetupBuffer<span class="k2">(</span>sw,sh , win<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 228</span>
<span class="number"> 229</span>   RelativeLayout rlayout<span class="k2">;</span>
<span class="number"> 230</span>   gui.SetRootLayout<span class="k2">(</span><span class="k3">&amp;</span>rlayout<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 231</span>
<span class="number"> 232</span>   Slider sl1,sl2,sl3<span class="k2">;</span>
<span class="number"> 233</span>   rlayout.AddWidget<span class="k2">(</span><span class="k3">&amp;</span>sl1 , LayoutRectangle<span class="k2">(</span><span class="n">0</span>.<span class="n">05</span> , <span class="n">0</span>.<span class="n">2</span> , <span class="n">0</span>.<span class="n">05</span> , <span class="n">0</span>.<span class="n">5</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 234</span>   rlayout.AddWidget<span class="k2">(</span><span class="k3">&amp;</span>sl2 , LayoutRectangle<span class="k2">(</span><span class="n">0</span>.<span class="n">35</span> , <span class="n">0</span>.<span class="n">2</span> , <span class="n">0</span>.<span class="n">05</span> , <span class="n">0</span>.<span class="n">5</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 235</span>   rlayout.AddWidget<span class="k2">(</span><span class="k3">&amp;</span>sl3 , LayoutRectangle<span class="k2">(</span><span class="n">0</span>.<span class="n">65</span> , <span class="n">0</span>.<span class="n">2</span> , <span class="n">0</span>.<span class="n">05</span> , <span class="n">0</span>.<span class="n">5</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 236</span>   
<span class="number"> 237</span>   EagleFont<span class="k3">*</span> f <span class="k3">=</span> win-&gt;DefaultFont<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 238</span>   
<span class="number"> 239</span>   BasicText lbl1,lbl2,lbl3<span class="k2">;</span>
<span class="number"> 240</span>   lbl1.SetText<span class="k2">(</span><span class="s">"VOL"</span> , f<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 241</span>   lbl2.SetText<span class="k2">(</span><span class="s">"HZ"</span> , f<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 242</span>   lbl3.SetText<span class="k2">(</span><span class="s">"WAVE"</span> , f<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 243</span>   
<span class="number"> 244</span>   rlayout.AddWidget<span class="k2">(</span><span class="k3">&amp;</span>lbl1 , LayoutRectangle<span class="k2">(</span><span class="n">0</span>.<span class="n">05</span> , <span class="n">0</span>.<span class="n">02</span> , <span class="n">0</span>.<span class="n">3</span> , <span class="n">0</span>.<span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 245</span>   rlayout.AddWidget<span class="k2">(</span><span class="k3">&amp;</span>lbl2 , LayoutRectangle<span class="k2">(</span><span class="n">0</span>.<span class="n">35</span> , <span class="n">0</span>.<span class="n">02</span> , <span class="n">0</span>.<span class="n">3</span> , <span class="n">0</span>.<span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 246</span>   rlayout.AddWidget<span class="k2">(</span><span class="k3">&amp;</span>lbl3 , LayoutRectangle<span class="k2">(</span><span class="n">0</span>.<span class="n">65</span> , <span class="n">0</span>.<span class="n">02</span> , <span class="n">0</span>.<span class="n">3</span> , <span class="n">0</span>.<span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 247</span>   
<span class="number"> 248</span>   BasicText t1,t2,t3<span class="k2">;</span>
<span class="number"> 249</span>   t1.SetText<span class="k2">(</span><span class="s">""</span> , f<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 250</span>   t2.SetText<span class="k2">(</span><span class="s">""</span> , f<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 251</span>   t3.SetText<span class="k2">(</span><span class="s">""</span> , f<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 252</span>
<span class="number"> 253</span>   rlayout.AddWidget<span class="k2">(</span><span class="k3">&amp;</span>t1 , LayoutRectangle<span class="k2">(</span><span class="n">0</span>.<span class="n">05</span> , <span class="n">0</span>.<span class="n">12</span> , <span class="n">0</span>.<span class="n">3</span> , <span class="n">0</span>.<span class="n">25</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 254</span>   rlayout.AddWidget<span class="k2">(</span><span class="k3">&amp;</span>t2 , LayoutRectangle<span class="k2">(</span><span class="n">0</span>.<span class="n">35</span> , <span class="n">0</span>.<span class="n">12</span> , <span class="n">0</span>.<span class="n">3</span> , <span class="n">0</span>.<span class="n">25</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 255</span>   rlayout.AddWidget<span class="k2">(</span><span class="k3">&amp;</span>t3 , LayoutRectangle<span class="k2">(</span><span class="n">0</span>.<span class="n">65</span> , <span class="n">0</span>.<span class="n">12</span> , <span class="n">0</span>.<span class="n">3</span> , <span class="n">0</span>.<span class="n">25</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 256</span>   
<span class="number"> 257</span>   
<span class="number"> 258</span>   
<span class="number"> 259</span>   Audio audio<span class="k2">;</span>
<span class="number"> 260</span>   
<span class="number"> 261</span>   <span class="k1">double</span> vol <span class="k3">=</span> <span class="n">0</span>.<span class="n">5</span><span class="k2">;</span>
<span class="number"> 262</span>   <span class="k1">double</span>  freq <span class="k3">=</span> <span class="n">220</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 263</span>   WAVEFORM wf <span class="k3">=</span> SINWAVE<span class="k2">;</span>
<span class="number"> 264</span>   
<span class="number"> 265</span>   audio.SetVolume<span class="k2">(</span>vol<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 266</span>   audio.SetFrequency<span class="k2">(</span>freq<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 267</span>   audio.SetWaveForm<span class="k2">(</span>wf<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 268</span>   
<span class="number"> 269</span>   sl1.SetPercent<span class="k2">(</span><span class="n">0</span>.<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 270</span>   sl2.SetPercent<span class="k2">(</span><span class="n">0</span>.<span class="n">25</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 271</span>   sl3.SetPercent<span class="k2">(</span><span class="n">0</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 272</span>   
<span class="number"> 273</span>   t1.SetText<span class="k2">(</span><span class="s">"0.5"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 274</span>   t2.SetText<span class="k2">(</span><span class="s">"220.0"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 275</span>   t3.SetText<span class="k2">(</span><span class="s">"SINWAVE"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 276</span>   
<span class="number"> 277</span>   <span class="k1">double</span> start <span class="k3">=</span> ProgramTime::Now<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 278</span>   <span class="k1">double</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">=</span> start<span class="k2">;</span>
<span class="number"> 279</span>   <span class="k1">double</span> audiotime <span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number"> 280</span>
<span class="number"> 281</span>   <span class="k1">bool</span> quit <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 282</span>   <span class="k1">bool</span> redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 283</span>
<span class="number"> 284</span>   EagleEventHandler<span class="k3">*</span> sysqueue <span class="k3">=</span> a5sys-&gt;GetSystemQueue<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 285</span>   
<span class="number"> 286</span>   sysqueue-&gt;ListenTo<span class="k2">(</span><span class="k3">&amp;</span>gui<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 287</span>   
<span class="number"> 288</span>   a5sys-&gt;GetSystemTimer<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>Start<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 289</span>   
<span class="number"> 290</span>   
<span class="number"> 291</span>   <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>quit<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 292</span>      <span class="k1">if</span> <span class="k2">(</span>redraw<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 293</span>         win-&gt;Clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 294</span>         gui.Display<span class="k2">(</span>win , <span class="n">0</span> , <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 295</span>         win-&gt;FlipDisplay<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 296</span>      <span class="k2">}</span>
<span class="number"> 297</span>      
<span class="number"> 298</span>      <span class="k1">do</span> <span class="k2">{</span>
<span class="number"> 299</span>         EagleEvent e <span class="k3">=</span> a5sys-&gt;WaitForSystemEventAndUpdateState<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 300</span>         <span class="k1">if</span> <span class="k2">(</span>e.type <span class="k3">=</span><span class="k3">=</span> EAGLE_EVENT_TIMER<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 301</span>            <span class="c">/// Check if the audio stream is empty</span>
<span class="number"> 302</span>            <span class="k1">void</span><span class="k3">*</span> buffer <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 303</span>            <span class="k1">while</span> <span class="k2">(</span><span class="k2">(</span>buffer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_audio_stream_fragment"><span class="a">al_get_audio_stream_fragment</span></a><span class="k2">(</span>stream<span class="k2">)</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 304</span>               EagleLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"FillingBuffer..."</span><span class="k2">;</span>
<span class="number"> 305</span>               audio.FillBuffer<span class="k2">(</span><span class="k2">(</span><span class="k1">float</span><span class="k3">*</span><span class="k2">)</span>buffer , audiotime<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 306</span>               audiotime <span class="k3">+</span><span class="k3">=</span> <span class="n">1024</span>.<span class="n">0</span><span class="k3">/</span><span class="n">44100</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number"> 307</span>               <a href="http://www.allegro.cc/manual/al_set_audio_stream_fragment"><span class="a">al_set_audio_stream_fragment</span></a><span class="k2">(</span>stream , buffer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 308</span>            <span class="k2">}</span>
<span class="number"> 309</span>            gui.Update<span class="k2">(</span>e.timer.eagle_timer_source-&gt;SPT<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 310</span>            redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 311</span>         <span class="k2">}</span>
<span class="number"> 312</span>         <span class="k1">if</span> <span class="k2">(</span>e.type <span class="k3">=</span><span class="k3">=</span> EAGLE_EVENT_DISPLAY_CLOSE<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 313</span>            quit <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 314</span>         <span class="k2">}</span>
<span class="number"> 315</span>         <span class="k1">if</span> <span class="k2">(</span>e.type <span class="k3">=</span><span class="k3">=</span> EAGLE_EVENT_KEY_DOWN <span class="k3">&amp;</span><span class="k3">&amp;</span> e.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> EAGLE_KEY_ESCAPE<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 316</span>            quit <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 317</span>         <span class="k2">}</span>
<span class="number"> 318</span>         <span class="k1">if</span> <span class="k2">(</span>e.type <span class="k3">=</span><span class="k3">=</span> EAGLE_EVENT_WIDGET<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 319</span>            WIDGET_EVENT_DATA d <span class="k3">=</span> e.widget<span class="k2">;</span>
<span class="number"> 320</span>            <span class="k1">if</span> <span class="k2">(</span>d.from <span class="k3">=</span><span class="k3">=</span> <span class="k3">&amp;</span>sl1 <span class="k3">|</span><span class="k3">|</span> d.from <span class="k3">=</span><span class="k3">=</span> <span class="k3">&amp;</span>sl2 <span class="k3">|</span><span class="k3">|</span> d.from <span class="k3">=</span><span class="k3">=</span> <span class="k3">&amp;</span>sl3<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 321</span>               <span class="k1">if</span> <span class="k2">(</span>d.topic <span class="k3">=</span><span class="k3">=</span> TOPIC_SLIDER<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 322</span>                  <span class="k1">if</span> <span class="k2">(</span>d.msgs <span class="k3">=</span><span class="k3">=</span> SLIDER_VALUE_CHANGED<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 323</span>                     <span class="k1">if</span> <span class="k2">(</span>d.from <span class="k3">=</span><span class="k3">=</span> <span class="k3">&amp;</span>sl1<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 324</span>                        vol <span class="k3">=</span> sl1.GetPercent<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 325</span>                        audio.SetVolume<span class="k2">(</span>vol<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 326</span>                        t1.SetText<span class="k2">(</span>StringPrintF<span class="k2">(</span><span class="s">"VOL %1.4lf"</span> , vol<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 327</span>                     <span class="k2">}</span>
<span class="number"> 328</span>                     <span class="k1">if</span> <span class="k2">(</span>d.from <span class="k3">=</span><span class="k3">=</span> <span class="k3">&amp;</span>sl2<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 329</span>                        freq <span class="k3">=</span> <span class="n">110</span>.<span class="n">0</span> <span class="k3">+</span> <span class="n">440</span>.<span class="n">0</span><span class="k3">*</span>sl2.GetPercent<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 330</span>                        audio.SetFrequency<span class="k2">(</span>freq<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 331</span>                        t2.SetText<span class="k2">(</span>StringPrintF<span class="k2">(</span><span class="s">"HZ %1.4lf"</span> , freq<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 332</span>                     <span class="k2">}</span>
<span class="number"> 333</span>                     <span class="k1">if</span> <span class="k2">(</span>d.from <span class="k3">=</span><span class="k3">=</span> <span class="k3">&amp;</span>sl3<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 334</span>                        <span class="k1">double</span> val <span class="k3">=</span> sl3.GetPercent<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 335</span>                        <span class="k1">if</span> <span class="k2">(</span>val <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">34</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 336</span>                           wf <span class="k3">=</span> SINWAVE<span class="k2">;</span>
<span class="number"> 337</span>                           t3.SetText<span class="k2">(</span><span class="s">"SINWAVE"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 338</span>                        <span class="k2">}</span>
<span class="number"> 339</span>                        <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>val <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">68</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 340</span>                           wf <span class="k3">=</span> TRIANGLEWAVE<span class="k2">;</span>
<span class="number"> 341</span>                           t3.SetText<span class="k2">(</span><span class="s">"TRIWAVE"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 342</span>                        <span class="k2">}</span>
<span class="number"> 343</span>                        <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 344</span>                           wf <span class="k3">=</span> SQUAREWAVE<span class="k2">;</span>
<span class="number"> 345</span>                           t3.SetText<span class="k2">(</span><span class="s">"SQRWAVE"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 346</span>                        <span class="k2">}</span>
<span class="number"> 347</span>                        audio.SetWaveForm<span class="k2">(</span>wf<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 348</span>                     <span class="k2">}</span>
<span class="number"> 349</span>                  <span class="k2">}</span>
<span class="number"> 350</span>               <span class="k2">}</span>
<span class="number"> 351</span>            <span class="k2">}</span>
<span class="number"> 352</span>         <span class="k2">}</span>
<span class="number"> 353</span>         <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 354</span>            gui.HandleEvent<span class="k2">(</span>e<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 355</span>         <span class="k2">}</span>
<span class="number"> 356</span>      <span class="k2">}</span> <span class="k1">while</span> <span class="k2">(</span>sysqueue-&gt;HasEvent<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 357</span>   <span class="k2">}</span>
<span class="number"> 358</span>
<span class="number"> 359</span>
<span class="number"> 360</span>
<span class="number"> 361</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 362</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 10 Jul 2019 20:05:17 +0000</pubDate>
	</item>
</rss>
