File: Modal_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 (145 lines) | stat: -rw-r--r-- 15,827 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
141
142
143
144
145
<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>Modal.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_MODAL_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_MODAL_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Instrmnt.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &quot;Envelope.h&quot;</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include &quot;FileLoop.h&quot;</span>
<a name="l00007"></a>00007 <span class="preprocessor">#include &quot;SineWave.h&quot;</span>
<a name="l00008"></a>00008 <span class="preprocessor">#include &quot;BiQuad.h&quot;</span>
<a name="l00009"></a>00009 <span class="preprocessor">#include &quot;OnePole.h&quot;</span>
<a name="l00010"></a>00010 
<a name="l00011"></a>00011 <span class="keyword">namespace </span>stk {
<a name="l00012"></a>00012 
<a name="l00013"></a>00013 <span class="comment">/***************************************************/</span>
<a name="l00024"></a>00024 <span class="comment">/***************************************************/</span>
<a name="l00025"></a>00025 
<a name="l00026"></a><a class="code" href="classstk_1_1Modal.html">00026</a> <span class="keyword">class </span><a class="code" href="classstk_1_1Modal.html" title="STK resonance model abstract base class.">Modal</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Instrmnt.html" title="STK instrument abstract base class.">Instrmnt</a>
<a name="l00027"></a>00027 {
<a name="l00028"></a>00028 <span class="keyword">public</span>:
<a name="l00030"></a>00030 
<a name="l00033"></a>00033   <a class="code" href="classstk_1_1Modal.html#af6bfea135e80abb5537e62cf099c989a" title="Class constructor, taking the desired number of modes to create.">Modal</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> modes = 4 );
<a name="l00034"></a>00034 
<a name="l00036"></a>00036   <span class="keyword">virtual</span> <a class="code" href="classstk_1_1Modal.html#a7f45379ae10495b7a864cade0063705a" title="Class destructor.">~Modal</a>( <span class="keywordtype">void</span> );
<a name="l00037"></a>00037 
<a name="l00039"></a>00039   <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Modal.html#af064dc6ee4290fd51b4a6dc8a1f0909d" title="Reset and clear all internal state.">clear</a>( <span class="keywordtype">void</span> );
<a name="l00040"></a>00040 
<a name="l00042"></a>00042   <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Modal.html#a503092926e66667227bb46312a82a264" title="Set instrument parameters for a particular frequency.">setFrequency</a>( StkFloat frequency );
<a name="l00043"></a>00043 
<a name="l00045"></a>00045   <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Modal.html#a7e4f9a875e60485d07d50386ff63117f" title="Set the ratio and radius for a specified mode filter.">setRatioAndRadius</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> modeIndex, StkFloat ratio, StkFloat radius );
<a name="l00046"></a>00046 
<a name="l00048"></a><a class="code" href="classstk_1_1Modal.html#a6e8d79358a5024b2e9a6c6f7c69a43c1">00048</a>   <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Modal.html#a6e8d79358a5024b2e9a6c6f7c69a43c1" title="Set the master gain.">setMasterGain</a>( StkFloat aGain ) { masterGain_ = aGain; };
<a name="l00049"></a>00049 
<a name="l00051"></a><a class="code" href="classstk_1_1Modal.html#a70006135da2ecdc46eff4156504d94e1">00051</a>   <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Modal.html#a70006135da2ecdc46eff4156504d94e1" title="Set the direct gain.">setDirectGain</a>( StkFloat aGain ) { directGain_ = aGain; };
<a name="l00052"></a>00052 
<a name="l00054"></a>00054   <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Modal.html#a08bdfedf10d00dcf19e82809926eab2f" title="Set the gain for a specified mode filter.">setModeGain</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> modeIndex, StkFloat gain );
<a name="l00055"></a>00055 
<a name="l00057"></a>00057   <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Modal.html#ab3bac00a47fa6fef70cf3ea442e9b121" title="Initiate a strike with the given amplitude (0.0 - 1.0).">strike</a>( StkFloat amplitude );
<a name="l00058"></a>00058 
<a name="l00060"></a>00060   <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Modal.html#a1884c49b76ec8b902f22d50e26a7e365" title="Damp modes with a given decay factor (0.0 - 1.0).">damp</a>( StkFloat amplitude );
<a name="l00061"></a>00061 
<a name="l00063"></a>00063   <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Modal.html#a44ce41e8e24e591f382914d00a259c7f" title="Start a note with the given frequency and amplitude.">noteOn</a>( StkFloat frequency, StkFloat amplitude );
<a name="l00064"></a>00064 
<a name="l00066"></a>00066   <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Modal.html#a3483dafe33fa37e98781279810ea808f" title="Stop a note with the given amplitude (speed of decay).">noteOff</a>( StkFloat amplitude );
<a name="l00067"></a>00067 
<a name="l00069"></a>00069   <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Modal.html#a9fab49ec164852c381758f5d333f8891" title="Perform the control change specified by number and value (0.0 - 128.0).">controlChange</a>( <span class="keywordtype">int</span> number, StkFloat value ) = 0;
<a name="l00070"></a>00070 
<a name="l00072"></a>00072   StkFloat <a class="code" href="classstk_1_1Modal.html#ac1fd3f5dcb9b5cbb8bed0bff330c3890" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00073"></a>00073 
<a name="l00075"></a>00075 
<a name="l00082"></a>00082   <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_1Modal.html#ac1fd3f5dcb9b5cbb8bed0bff330c3890" 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="l00083"></a>00083 
<a name="l00084"></a>00084 <span class="keyword">protected</span>:
<a name="l00085"></a>00085 
<a name="l00086"></a>00086   <a class="code" href="classstk_1_1Envelope.html" title="STK linear line envelope class.">Envelope</a> envelope_; 
<a name="l00087"></a>00087   <a class="code" href="classstk_1_1FileWvIn.html" title="STK audio file input class.">FileWvIn</a> *wave_;
<a name="l00088"></a>00088   <a class="code" href="classstk_1_1BiQuad.html" title="STK biquad (two-pole, two-zero) filter class.">BiQuad</a> **filters_;
<a name="l00089"></a>00089   <a class="code" href="classstk_1_1OnePole.html" title="STK one-pole filter class.">OnePole</a>  onepole_;
<a name="l00090"></a>00090   <a class="code" href="classstk_1_1SineWave.html" title="STK sinusoid oscillator class.">SineWave</a> vibrato_;
<a name="l00091"></a>00091 
<a name="l00092"></a>00092   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nModes_;
<a name="l00093"></a>00093   std::vector&lt;StkFloat&gt; ratios_;
<a name="l00094"></a>00094   std::vector&lt;StkFloat&gt; radii_;
<a name="l00095"></a>00095 
<a name="l00096"></a>00096   StkFloat vibratoGain_;
<a name="l00097"></a>00097   StkFloat masterGain_;
<a name="l00098"></a>00098   StkFloat directGain_;
<a name="l00099"></a>00099   StkFloat stickHardness_;
<a name="l00100"></a>00100   StkFloat strikePosition_;
<a name="l00101"></a>00101   StkFloat baseFrequency_;
<a name="l00102"></a>00102 };
<a name="l00103"></a>00103 
<a name="l00104"></a><a class="code" href="classstk_1_1Modal.html#ac1fd3f5dcb9b5cbb8bed0bff330c3890">00104</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1Modal.html#ac1fd3f5dcb9b5cbb8bed0bff330c3890" title="Compute and return one output sample.">Modal :: tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> )
<a name="l00105"></a>00105 {
<a name="l00106"></a>00106   StkFloat temp = masterGain_ * onepole_.<a class="code" href="classstk_1_1OnePole.html#a3c83b6d43f76bec06f11caa9de76881e" title="Input one sample to the filter and return one output.">tick</a>( wave_-&gt;<a class="code" href="classstk_1_1FileWvIn.html#ada668a0bc0bf89e155ef341de00babc2" title="Compute a sample frame and return the specified channel value.">tick</a>() * envelope_.<a class="code" href="classstk_1_1Envelope.html#a8de91b9caf10a03f52bd2247648c4601" title="Compute and return one output sample.">tick</a>() );
<a name="l00107"></a>00107 
<a name="l00108"></a>00108   StkFloat temp2 = 0.0;
<a name="l00109"></a>00109   <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;nModes_; i++ )
<a name="l00110"></a>00110     temp2 += filters_[i]-&gt;<a class="code" href="classstk_1_1Modal.html#ac1fd3f5dcb9b5cbb8bed0bff330c3890" title="Compute and return one output sample.">tick</a>(temp);
<a name="l00111"></a>00111 
<a name="l00112"></a>00112   temp2  -= temp2 * directGain_;
<a name="l00113"></a>00113   temp2 += directGain_ * temp;
<a name="l00114"></a>00114 
<a name="l00115"></a>00115   <span class="keywordflow">if</span> ( vibratoGain_ != 0.0 ) {
<a name="l00116"></a>00116     <span class="comment">// Calculate AM and apply to master out</span>
<a name="l00117"></a>00117     temp = 1.0 + ( vibrato_.<a class="code" href="classstk_1_1SineWave.html#a31a55627bf8064919b5e063059260eda" title="Compute and return one output sample.">tick</a>() * vibratoGain_ );
<a name="l00118"></a>00118     temp2 = temp * temp2;
<a name="l00119"></a>00119   }
<a name="l00120"></a>00120     
<a name="l00121"></a>00121   lastFrame_[0] = temp2;
<a name="l00122"></a>00122   <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00123"></a>00123 }
<a name="l00124"></a>00124 
<a name="l00125"></a><a class="code" href="classstk_1_1Modal.html#ad2a28e7bd5fdae7d2a6d9fb79bbfb7b0">00125</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_1Modal.html#ac1fd3f5dcb9b5cbb8bed0bff330c3890" title="Compute and return one output sample.">Modal :: 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="l00126"></a>00126 {
<a name="l00127"></a>00127   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = lastFrame_.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00128"></a>00128 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00129"></a>00129 <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>() - nChannels ) {
<a name="l00130"></a>00130     oStream_ &lt;&lt; <span class="stringliteral">&quot;Modal::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00131"></a>00131     <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="l00132"></a>00132   }
<a name="l00133"></a>00133 <span class="preprocessor">#endif</span>
<a name="l00134"></a>00134 <span class="preprocessor"></span>
<a name="l00135"></a>00135   StkFloat *samples = &amp;frames[channel];
<a name="l00136"></a>00136   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j, hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels;
<a name="l00137"></a>00137   <span class="keywordflow">if</span> ( nChannels == 1 ) {
<a name="l00138"></a>00138     <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="l00139"></a>00139       *samples++ = <a class="code" href="classstk_1_1Modal.html#ac1fd3f5dcb9b5cbb8bed0bff330c3890" title="Compute and return one output sample.">tick</a>();
<a name="l00140"></a>00140   }
<a name="l00141"></a>00141   <span class="keywordflow">else</span> {
<a name="l00142"></a>00142     <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="l00143"></a>00143       *samples++ = <a class="code" href="classstk_1_1Modal.html#ac1fd3f5dcb9b5cbb8bed0bff330c3890" title="Compute and return one output sample.">tick</a>();
<a name="l00144"></a>00144       <span class="keywordflow">for</span> ( j=1; j&lt;nChannels; j++ )
<a name="l00145"></a>00145         *samples++ = lastFrame_[j];
<a name="l00146"></a>00146     }
<a name="l00147"></a>00147   }
<a name="l00148"></a>00148 
<a name="l00149"></a>00149   <span class="keywordflow">return</span> frames;
<a name="l00150"></a>00150 }
<a name="l00151"></a>00151 
<a name="l00152"></a>00152 } <span class="comment">// stk namespace</span>
<a name="l00153"></a>00153 
<a name="l00154"></a>00154 <span class="preprocessor">#endif</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>