<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>step calculation for sampled sin sample</title>
		<link>http://www.allegro.cc/forums/view/615800</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 09 Oct 2015 19:57:55 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Calling for a math guru,<br />would be nice if someone could explain this</p><p>I need to find the stepsize to get a nice sin wave<br />and maybe other waves in the future. but I&#39;m confused</p><p>Anyone ?</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="k1">void</span> CustomProgram::Tone<span class="k2">(</span><span class="k1">int</span> a_nFrequency, <span class="k1">int</span> a_nDuration<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>    <span class="k1">unsigned</span> <span class="k1">int</span> samples <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">(</span>a_nDuration<span class="k2">)</span><span class="k3">/</span><span class="n">1000</span>.<span class="n">0</span> <span class="k3">*</span> a_nFrequency<span class="k2">)</span><span class="k3">*</span><span class="n">100</span><span class="k2">;</span>
<span class="number">  4</span>    <span class="k1">unsigned</span> <span class="k1">long</span> sample_size<span class="k3">=</span>al_get_channel_count<span class="k2">(</span>ALLEGRO_CHANNEL_CONF_1<span class="k2">)</span> <span class="k3">*</span>al_get_audio_depth_size<span class="k2">(</span>ALLEGRO_AUDIO_DEPTH_INT16<span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>    <span class="k1">unsigned</span> <span class="k1">long</span> bytes <span class="k3">=</span> samples <span class="k3">*</span> sample_size<span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>    <span class="k1">void</span> <span class="k3">*</span>buff <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  8</span>    buff <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_malloc"><span class="a">al_malloc</span></a><span class="k2">(</span>bytes<span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span>    <a href="http://www.allegro.cc/manual/al_destroy_sample"><span class="a">al_destroy_sample</span></a><span class="k2">(</span>m_pSample<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>    m_pSample <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_sample"><span class="a">al_create_sample</span></a> <span class="k2">(</span>buff,samples, a_nFrequency,ALLEGRO_AUDIO_DEPTH_INT16,ALLEGRO_CHANNEL_CONF_1,<span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>
<span class="number"> 13</span>
<span class="number"> 14</span>    <span class="k1">if</span> <span class="k2">(</span>m_pSample<span class="k3">!</span><span class="k3">=</span>NULL<span class="k2">)</span>
<span class="number"> 15</span>    <span class="k2">{</span>
<span class="number"> 16</span>        <span class="k1">int16_t</span> <span class="k3">*</span> ptr <span class="k3">=</span> <span class="k2">(</span><span class="k1">int16_t</span> <span class="k3">*</span><span class="k2">)</span> <a href="http://www.allegro.cc/manual/al_get_sample_data"><span class="a">al_get_sample_data</span></a><span class="k2">(</span>m_pSample<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>        <span class="k1">double</span> step <span class="k3">=</span> <span class="k1">double</span><span class="k2">(</span><span class="n">2</span> <span class="k3">*</span> PI <span class="k3">*</span> a_nDuration <span class="k3">*</span> a_nFrequency<span class="k2">)</span> <span class="k3">/</span> samples<span class="k2">;</span>    <span class="c">// &lt;----- This one here !</span>
<span class="number"> 18</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>samples<span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 19</span>        <span class="k2">{</span>
<span class="number"> 20</span>             ptr<span class="k2">[</span>i<span class="k2">]</span><span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span>i<span class="k3">*</span>step<span class="k2">)</span> <span class="k3">*</span> <span class="n">30000</span><span class="k2">;</span>
<span class="number"> 21</span>        <span class="k2">}</span>
<span class="number"> 22</span>        <a href="http://www.allegro.cc/manual/al_play_sample"><span class="a">al_play_sample</span></a> <span class="k2">(</span>m_pSample,<span class="n">1</span>.<span class="n">0</span>,<span class="n">0</span>,<span class="n">1</span>.<span class="n">0</span>,ALLEGRO_PLAYMODE_ONCE,NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>    <span class="k2">}</span>
<span class="number"> 24</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ariesnl)</author>
		<pubDate>Thu, 08 Oct 2015 19:25:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You need to have a_nFrequency steps per second for a_nDuration seconds.  The desired frequency of sine wave needs to be divided by a_nFrequency steps per second to get the increment to pass to the float that is input to the sin() function.</p><p>Let&#39;s say that a_nFrequency is 28,000 hertz, duration is 10 seconds, and you want a sin wave to produce concert A (440 hertz).</p><p>So you&#39;d need 28,000 * 10 sample elements to put the sin values into, and the increment per sample element would be 440.0/28000.0 .</p><p>As Elias pointed out below, I forgot about the 2.0 * M_PI to get one complete cycle from sin().
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Thu, 08 Oct 2015 20:02:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well, just look at a sine wave:
</p><div class="source-code snippet"><div class="inner"><pre>y <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span>x<span class="k2">)</span>
</pre></div></div><p>
If x runs from 0 to 2 * pi, you get one complete wave. Now multiply by 2 * pi:
</p><div class="source-code snippet"><div class="inner"><pre>y <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span>x <span class="k3">*</span> <span class="n">2</span> <span class="k3">*</span> pi<span class="k2">)</span>
</pre></div></div><p>
Now the full wave goes from 0 to 1. Now assume x is our time in seconds, and you want a 440 Hz tone:
</p><div class="source-code snippet"><div class="inner"><pre>y <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span>x <span class="k3">*</span> <span class="n">2</span> <span class="k3">*</span> pi <span class="k3">*</span> <span class="n">440</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
Now each seconds there is 440 complete sine waves.</p><p>Now, instead of having the time in seconds, x is a sample position, 48000 samples make up one second:
</p><div class="source-code snippet"><div class="inner"><pre>y <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span>x <span class="k3">*</span> <span class="n">2</span> <span class="k3">*</span> pi <span class="k3">*</span> <span class="n">440</span> <span class="k3">/</span> <span class="n">48000</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

In your code, a_nFrequency is the 48000. So a_nDuration/samples is your tone&#39;s frequency. I&#39;m a bit unsure about those variable names, I&#39;d say you can simplify that function a lot and still have it do the same thing.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Thu, 08 Oct 2015 20:05:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thnx,<br />I think this is what it should look like.<br />I&#39;ll try to make some effects using harmonics , see what can be done with this.</p><p>Allegro 5 should definitely get some &quot;record sample&quot; or &quot;audio input&quot; functions </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="k1">void</span> CustomProgram::Tone<span class="k2">(</span><span class="k1">int</span> a_nFrequency, <span class="k1">int</span> a_nVolume, <span class="k1">int</span> a_nDuration<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>    <span class="k1">int</span> nSampleRate <span class="k3">=</span> <span class="n">48000</span><span class="k2">;</span>
<span class="number">  4</span>    <span class="k1">if</span> <span class="k2">(</span>a_nVolume <span class="k3">&gt;</span> <span class="n">255</span><span class="k2">)</span>
<span class="number">  5</span>    <span class="k2">{</span>
<span class="number">  6</span>        a_nVolume <span class="k3">=</span> <span class="n">255</span><span class="k2">;</span>
<span class="number">  7</span>    <span class="k2">}</span>
<span class="number">  8</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>a_nVolume<span class="k3">&lt;</span><span class="n">0</span><span class="k2">)</span>
<span class="number">  9</span>    <span class="k2">{</span>
<span class="number"> 10</span>        a_nVolume <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 11</span>    <span class="k2">}</span>
<span class="number"> 12</span>
<span class="number"> 13</span>    <span class="k1">int</span> nInternalVolume <span class="k3">=</span> <span class="k2">(</span><span class="n">30000</span> <span class="k3">*</span> a_nVolume<span class="k2">)</span><span class="k3">/</span><span class="n">255</span><span class="k2">;</span>
<span class="number"> 14</span>    <span class="k1">unsigned</span> <span class="k1">int</span> samples <span class="k3">=</span> <span class="k2">(</span>nSampleRate <span class="k3">*</span> a_nDuration<span class="k2">)</span> <span class="k3">/</span> <span class="n">1000</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number"> 15</span>    <span class="k1">unsigned</span> <span class="k1">long</span> sample_size<span class="k3">=</span>al_get_channel_count<span class="k2">(</span>ALLEGRO_CHANNEL_CONF_1<span class="k2">)</span> <span class="k3">*</span>al_get_audio_depth_size<span class="k2">(</span>ALLEGRO_AUDIO_DEPTH_INT16<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>    <span class="k1">unsigned</span> <span class="k1">long</span> bytes <span class="k3">=</span> samples <span class="k3">*</span> sample_size<span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span>    <span class="k1">void</span> <span class="k3">*</span>buff <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 19</span>    buff <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_malloc"><span class="a">al_malloc</span></a><span class="k2">(</span>bytes<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>
<span class="number"> 21</span>    <a href="http://www.allegro.cc/manual/al_destroy_sample"><span class="a">al_destroy_sample</span></a><span class="k2">(</span>m_pSample<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>    m_pSample <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_sample"><span class="a">al_create_sample</span></a> <span class="k2">(</span>buff,samples, nSampleRate ,ALLEGRO_AUDIO_DEPTH_INT16,ALLEGRO_CHANNEL_CONF_1,<span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>    <span class="k1">double</span> dFi <span class="k3">=</span> <span class="k1">double</span><span class="k2">(</span><span class="n">2</span> <span class="k3">*</span> PI <span class="k3">*</span> a_nFrequency<span class="k2">)</span> <span class="k3">/</span> nSampleRate<span class="k2">;</span>
<span class="number"> 24</span>
<span class="number"> 25</span>    <span class="k1">if</span> <span class="k2">(</span>m_pSample<span class="k3">!</span><span class="k3">=</span>NULL<span class="k2">)</span>
<span class="number"> 26</span>    <span class="k2">{</span>
<span class="number"> 27</span>        <span class="k1">int16_t</span> <span class="k3">*</span> ptr <span class="k3">=</span> <span class="k2">(</span><span class="k1">int16_t</span> <span class="k3">*</span><span class="k2">)</span> <a href="http://www.allegro.cc/manual/al_get_sample_data"><span class="a">al_get_sample_data</span></a><span class="k2">(</span>m_pSample<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</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>samples<span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 29</span>        <span class="k2">{</span>
<span class="number"> 30</span>             ptr<span class="k2">[</span>i<span class="k2">]</span><span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span>i <span class="k3">*</span> dFi<span class="k2">)</span> <span class="k3">*</span> nInternalVolume<span class="k2">;</span>
<span class="number"> 31</span>
<span class="number"> 32</span>        <span class="k2">}</span>
<span class="number"> 33</span>        <a href="http://www.allegro.cc/manual/al_play_sample"><span class="a">al_play_sample</span></a> <span class="k2">(</span>m_pSample,<span class="n">1</span>.<span class="n">0</span>,<span class="n">0</span>,<span class="n">1</span>.<span class="n">0</span>,ALLEGRO_PLAYMODE_ONCE,NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 34</span>    <span class="k2">}</span>
<span class="number"> 35</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ariesnl)</author>
		<pubDate>Fri, 09 Oct 2015 14:08:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Looks good to me now, assuming a_nDuration is in ms.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Fri, 09 Oct 2015 19:57:55 +0000</pubDate>
	</item>
</rss>
