File: SineWave_8h_source.html

package info (click to toggle)
stk 4.4.4-5
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 24,856 kB
  • sloc: cpp: 33,976; tcl: 2,375; sh: 2,319; ansic: 163; perl: 114; makefile: 37
file content (140 lines) | stat: -rw-r--r-- 12,654 bytes parent folder | download | duplicates (2)
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"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <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 &quot;Generator.h&quot;</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>&amp; <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>&amp; 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_ &lt; 0.0 )
<a name="l00104"></a>00104     time_ += TABLE_SIZE;
<a name="l00105"></a>00105   <span class="keywordflow">while</span> ( time_ &gt;= 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>&amp; <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>&amp; 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 &gt;= 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_ &lt;&lt; <span class="stringliteral">&quot;SineWave::tick(): channel and StkFrames arguments are incompatible!&quot;</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 = &amp;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&lt;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_ &lt; 0.0 )
<a name="l00138"></a>00138       time_ += TABLE_SIZE;
<a name="l00139"></a>00139     <span class="keywordflow">while</span> ( time_ &gt;= 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>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>

</BODY>
</HTML>