1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> <img src="ccrma.gif"> <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> <a class="qindex" href="information.html">Information</a> <a class="qindex" href="classes.html">Classes</a> <a class="qindex" href="download.html">Download</a> <a class="qindex" href="usage.html">Usage</a> <a class="qindex" href="maillist.html">Mail List</a> <a class="qindex" href="system.html">Requirements</a> <a class="qindex" href="links.html">Links</a> <a class="qindex" href="faq.html">FAQ</a> <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>SineWave.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_SINEWAVE_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_SINEWAVE_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> TABLE_SIZE = 2048;
<a name="l00005"></a>00005
<a name="l00006"></a>00006 <span class="preprocessor">#include "Generator.h"</span>
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="keyword">namespace </span>stk {
<a name="l00009"></a>00009
<a name="l00010"></a>00010 <span class="comment">/***************************************************/</span>
<a name="l00023"></a>00023 <span class="comment">/***************************************************/</span>
<a name="l00024"></a>00024
<a name="l00025"></a><a class="code" href="classstk_1_1SineWave.html">00025</a> <span class="keyword">class </span><a class="code" href="classstk_1_1SineWave.html" title="STK sinusoid oscillator class.">SineWave</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Generator.html" title="STK abstract unit generator parent class.">Generator</a>
<a name="l00026"></a>00026 {
<a name="l00027"></a>00027 <span class="keyword">public</span>:
<a name="l00029"></a>00029 <a class="code" href="classstk_1_1SineWave.html#ad25afe03871430c533986b0852e04c62" title="Default constructor.">SineWave</a>( <span class="keywordtype">void</span> );
<a name="l00030"></a>00030
<a name="l00032"></a>00032 <a class="code" href="classstk_1_1SineWave.html#ae192f1813531f4b2ba933bcc5b288bfb" title="Class destructor.">~SineWave</a>( <span class="keywordtype">void</span> );
<a name="l00033"></a>00033
<a name="l00035"></a>00035 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1SineWave.html#a667b211ead65a23aa8ab89e4a9c9ae6c" title="Clear output and reset time pointer to zero.">reset</a>( <span class="keywordtype">void</span> );
<a name="l00036"></a>00036
<a name="l00038"></a>00038
<a name="l00041"></a><a class="code" href="classstk_1_1SineWave.html#ae69b232dd3a33963d25cf6215692d9d5">00041</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1SineWave.html#ae69b232dd3a33963d25cf6215692d9d5" title="Set the data read rate in samples. The rate can be negative.">setRate</a>( StkFloat rate ) { rate_ = rate; };
<a name="l00042"></a>00042
<a name="l00044"></a>00044
<a name="l00050"></a>00050 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1SineWave.html#a1047a43714bc2e40c7e31e8f7e34adbc" title="Set the data interpolation rate based on a looping frequency.">setFrequency</a>( StkFloat frequency );
<a name="l00051"></a>00051
<a name="l00053"></a>00053 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1SineWave.html#adc8f03d5d81cfc24c20794033aad876f" title="Increment the read pointer by time in samples, modulo the table size.">addTime</a>( StkFloat time );
<a name="l00054"></a>00054
<a name="l00056"></a>00056
<a name="l00061"></a>00061 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1SineWave.html#a62d69af61e6905ddda203756cd6e3516" title="Increment the read pointer by a normalized phase value.">addPhase</a>( StkFloat phase );
<a name="l00062"></a>00062
<a name="l00064"></a>00064
<a name="l00068"></a>00068 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1SineWave.html#a87bd4c92259b9b389f568f8d7cd7524f" title="Add a normalized phase offset to the read pointer.">addPhaseOffset</a>( StkFloat phaseOffset );
<a name="l00069"></a>00069
<a name="l00071"></a><a class="code" href="classstk_1_1SineWave.html#ab788e787e5bb54445dd0769283567224">00071</a> StkFloat <a class="code" href="classstk_1_1SineWave.html#ab788e787e5bb54445dd0769283567224" title="Return the last computed output value.">lastOut</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lastFrame_[0]; };
<a name="l00072"></a>00072
<a name="l00074"></a>00074 StkFloat <a class="code" href="classstk_1_1SineWave.html#a31a55627bf8064919b5e063059260eda" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">void</span> );
<a name="l00075"></a>00075
<a name="l00077"></a>00077
<a name="l00084"></a>00084 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>& <a class="code" href="classstk_1_1SineWave.html#a31a55627bf8064919b5e063059260eda" title="Compute and return one output sample.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>& frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00085"></a>00085
<a name="l00086"></a>00086 <span class="keyword">protected</span>:
<a name="l00087"></a>00087
<a name="l00088"></a>00088 <span class="keywordtype">void</span> sampleRateChanged( StkFloat newRate, StkFloat oldRate );
<a name="l00089"></a>00089
<a name="l00090"></a>00090 <span class="keyword">static</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a> table_;
<a name="l00091"></a>00091 StkFloat time_;
<a name="l00092"></a>00092 StkFloat rate_;
<a name="l00093"></a>00093 StkFloat phaseOffset_;
<a name="l00094"></a>00094 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iIndex_;
<a name="l00095"></a>00095 StkFloat alpha_;
<a name="l00096"></a>00096
<a name="l00097"></a>00097 };
<a name="l00098"></a>00098
<a name="l00099"></a><a class="code" href="classstk_1_1SineWave.html#a31a55627bf8064919b5e063059260eda">00099</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1SineWave.html#a31a55627bf8064919b5e063059260eda" title="Compute and return one output sample.">SineWave :: tick</a>( <span class="keywordtype">void</span> )
<a name="l00100"></a>00100 {
<a name="l00101"></a>00101 <span class="comment">// Check limits of time address ... if necessary, recalculate modulo</span>
<a name="l00102"></a>00102 <span class="comment">// TABLE_SIZE.</span>
<a name="l00103"></a>00103 <span class="keywordflow">while</span> ( time_ < 0.0 )
<a name="l00104"></a>00104 time_ += TABLE_SIZE;
<a name="l00105"></a>00105 <span class="keywordflow">while</span> ( time_ >= TABLE_SIZE )
<a name="l00106"></a>00106 time_ -= TABLE_SIZE;
<a name="l00107"></a>00107
<a name="l00108"></a>00108 iIndex_ = (<span class="keywordtype">unsigned</span> int) time_;
<a name="l00109"></a>00109 alpha_ = time_ - iIndex_;
<a name="l00110"></a>00110 StkFloat tmp = table_[ iIndex_ ];
<a name="l00111"></a>00111 tmp += ( alpha_ * ( table_[ iIndex_ + 1 ] - tmp ) );
<a name="l00112"></a>00112
<a name="l00113"></a>00113 <span class="comment">// Increment time, which can be negative.</span>
<a name="l00114"></a>00114 time_ += rate_;
<a name="l00115"></a>00115
<a name="l00116"></a>00116 lastFrame_[0] = tmp;
<a name="l00117"></a>00117 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00118"></a>00118 }
<a name="l00119"></a>00119
<a name="l00120"></a><a class="code" href="classstk_1_1SineWave.html#af205d7029046af8a392341cabd58f9de">00120</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>& <a class="code" href="classstk_1_1SineWave.html#a31a55627bf8064919b5e063059260eda" title="Compute and return one output sample.">SineWave :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>& frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00121"></a>00121 {
<a name="l00122"></a>00122 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00123"></a>00123 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel >= frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00124"></a>00124 oStream_ << <span class="stringliteral">"SineWave::tick(): channel and StkFrames arguments are incompatible!"</span>;
<a name="l00125"></a>00125 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00126"></a>00126 }
<a name="l00127"></a>00127 <span class="preprocessor">#endif</span>
<a name="l00128"></a>00128 <span class="preprocessor"></span>
<a name="l00129"></a>00129 StkFloat *samples = &frames[channel];
<a name="l00130"></a>00130 StkFloat tmp = 0.0;
<a name="l00131"></a>00131
<a name="l00132"></a>00132 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00133"></a>00133 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i<frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop ) {
<a name="l00134"></a>00134
<a name="l00135"></a>00135 <span class="comment">// Check limits of time address ... if necessary, recalculate modulo</span>
<a name="l00136"></a>00136 <span class="comment">// TABLE_SIZE.</span>
<a name="l00137"></a>00137 <span class="keywordflow">while</span> ( time_ < 0.0 )
<a name="l00138"></a>00138 time_ += TABLE_SIZE;
<a name="l00139"></a>00139 <span class="keywordflow">while</span> ( time_ >= TABLE_SIZE )
<a name="l00140"></a>00140 time_ -= TABLE_SIZE;
<a name="l00141"></a>00141
<a name="l00142"></a>00142 iIndex_ = (<span class="keywordtype">unsigned</span> int) time_;
<a name="l00143"></a>00143 alpha_ = time_ - iIndex_;
<a name="l00144"></a>00144 tmp = table_[ iIndex_ ];
<a name="l00145"></a>00145 tmp += ( alpha_ * ( table_[ iIndex_ + 1 ] - tmp ) );
<a name="l00146"></a>00146 *samples = tmp;
<a name="l00147"></a>00147
<a name="l00148"></a>00148 <span class="comment">// Increment time, which can be negative.</span>
<a name="l00149"></a>00149 time_ += rate_;
<a name="l00150"></a>00150 }
<a name="l00151"></a>00151
<a name="l00152"></a>00152 lastFrame_[0] = tmp;
<a name="l00153"></a>00153 <span class="keywordflow">return</span> frames;
<a name="l00154"></a>00154 }
<a name="l00155"></a>00155
<a name="l00156"></a>00156 } <span class="comment">// stk namespace</span>
<a name="l00157"></a>00157
<a name="l00158"></a>00158 <span class="preprocessor">#endif</span>
<a name="l00159"></a>00159 <span class="preprocessor"></span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>©1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>
|