File: Saxofony_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 (136 lines) | stat: -rw-r--r-- 15,096 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
<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>Saxofony.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_SAXOFONY_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_SAXOFONY_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;DelayL.h&quot;</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include &quot;ReedTable.h&quot;</span>
<a name="l00007"></a>00007 <span class="preprocessor">#include &quot;OneZero.h&quot;</span>
<a name="l00008"></a>00008 <span class="preprocessor">#include &quot;Envelope.h&quot;</span>
<a name="l00009"></a>00009 <span class="preprocessor">#include &quot;Noise.h&quot;</span>
<a name="l00010"></a>00010 <span class="preprocessor">#include &quot;SineWave.h&quot;</span>
<a name="l00011"></a>00011 
<a name="l00012"></a>00012 <span class="keyword">namespace </span>stk {
<a name="l00013"></a>00013 
<a name="l00014"></a>00014 <span class="comment">/***************************************************/</span>
<a name="l00049"></a>00049 <span class="comment">/***************************************************/</span>
<a name="l00050"></a>00050 
<a name="l00051"></a><a class="code" href="classstk_1_1Saxofony.html">00051</a> <span class="keyword">class </span><a class="code" href="classstk_1_1Saxofony.html" title="STK faux conical bore reed instrument class.">Saxofony</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Instrmnt.html" title="STK instrument abstract base class.">Instrmnt</a>
<a name="l00052"></a>00052 {
<a name="l00053"></a>00053  <span class="keyword">public</span>:
<a name="l00055"></a>00055 
<a name="l00058"></a>00058   <a class="code" href="classstk_1_1Saxofony.html#a15984d74213308e0d81d1ee32d99ee76" title="Class constructor, taking the lowest desired playing frequency.">Saxofony</a>( StkFloat lowestFrequency );
<a name="l00059"></a>00059 
<a name="l00061"></a>00061   <a class="code" href="classstk_1_1Saxofony.html#a1ff6a35de027e292c8a693aac314720d" title="Class destructor.">~Saxofony</a>( <span class="keywordtype">void</span> );
<a name="l00062"></a>00062 
<a name="l00064"></a>00064   <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Saxofony.html#ac74981cfa3b36ec1288eccab6aa80210" title="Reset and clear all internal state.">clear</a>( <span class="keywordtype">void</span> );
<a name="l00065"></a>00065 
<a name="l00067"></a>00067   <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Saxofony.html#a5844455497f50e4b64beb23f275ac8d1" title="Set instrument parameters for a particular frequency.">setFrequency</a>( StkFloat frequency );
<a name="l00068"></a>00068 
<a name="l00070"></a>00070   <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Saxofony.html#aeccfcfe10cef314cedf727ed5ba9d3d5" title="Set the &amp;quot;blowing&amp;quot; position between the air column terminations (0.0 - 1...">setBlowPosition</a>( StkFloat aPosition );
<a name="l00071"></a>00071 
<a name="l00073"></a>00073   <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Saxofony.html#a6e46b18ad2f992dfc3d948f966ec1bf2" title="Apply breath pressure to instrument with given amplitude and rate of increase.">startBlowing</a>( StkFloat amplitude, StkFloat rate );
<a name="l00074"></a>00074 
<a name="l00076"></a>00076   <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Saxofony.html#ae792c62c3bcf2fe756387c1f5cd61794" title="Decrease breath pressure with given rate of decrease.">stopBlowing</a>( StkFloat rate );
<a name="l00077"></a>00077 
<a name="l00079"></a>00079   <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Saxofony.html#a924eed4733c9ecfd0e4de44f69011ea5" title="Start a note with the given frequency and amplitude.">noteOn</a>( StkFloat frequency, StkFloat amplitude );
<a name="l00080"></a>00080 
<a name="l00082"></a>00082   <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Saxofony.html#aa930437a8044fc01dc906d79a482894c" title="Stop a note with the given amplitude (speed of decay).">noteOff</a>( StkFloat amplitude );
<a name="l00083"></a>00083 
<a name="l00085"></a>00085   <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Saxofony.html#a38efe138bea7af7aeab3652bf0a305ff" title="Perform the control change specified by number and value (0.0 - 128.0).">controlChange</a>( <span class="keywordtype">int</span> number, StkFloat value );
<a name="l00086"></a>00086 
<a name="l00088"></a>00088   StkFloat <a class="code" href="classstk_1_1Saxofony.html#a955d2ea0b3236039851d19b681ca2b0f" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00089"></a>00089 
<a name="l00091"></a>00091 
<a name="l00098"></a>00098   <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_1Saxofony.html#a955d2ea0b3236039851d19b681ca2b0f" 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="l00099"></a>00099 
<a name="l00100"></a>00100  <span class="keyword">protected</span>:
<a name="l00101"></a>00101 
<a name="l00102"></a>00102   <a class="code" href="classstk_1_1DelayL.html" title="STK linear interpolating delay line class.">DelayL</a>    delays_[2];
<a name="l00103"></a>00103   <a class="code" href="classstk_1_1ReedTable.html" title="STK reed table class.">ReedTable</a> reedTable_;
<a name="l00104"></a>00104   <a class="code" href="classstk_1_1OneZero.html" title="STK one-zero filter class.">OneZero</a>   filter_;
<a name="l00105"></a>00105   <a class="code" href="classstk_1_1Envelope.html" title="STK linear line envelope class.">Envelope</a>  envelope_;
<a name="l00106"></a>00106   <a class="code" href="classstk_1_1Noise.html" title="STK noise generator.">Noise</a>     noise_;
<a name="l00107"></a>00107   <a class="code" href="classstk_1_1SineWave.html" title="STK sinusoid oscillator class.">SineWave</a> vibrato_;
<a name="l00108"></a>00108 
<a name="l00109"></a>00109   StkFloat outputGain_;
<a name="l00110"></a>00110   StkFloat noiseGain_;
<a name="l00111"></a>00111   StkFloat vibratoGain_;
<a name="l00112"></a>00112   StkFloat position_;
<a name="l00113"></a>00113 
<a name="l00114"></a>00114 };
<a name="l00115"></a>00115 
<a name="l00116"></a><a class="code" href="classstk_1_1Saxofony.html#a955d2ea0b3236039851d19b681ca2b0f">00116</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1Saxofony.html#a955d2ea0b3236039851d19b681ca2b0f" title="Compute and return one output sample.">Saxofony :: tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> )
<a name="l00117"></a>00117 {
<a name="l00118"></a>00118   StkFloat pressureDiff;
<a name="l00119"></a>00119   StkFloat breathPressure;
<a name="l00120"></a>00120   StkFloat temp;
<a name="l00121"></a>00121 
<a name="l00122"></a>00122   <span class="comment">// Calculate the breath pressure (envelope + noise + vibrato)</span>
<a name="l00123"></a>00123   breathPressure = envelope_.<a class="code" href="classstk_1_1Envelope.html#a8de91b9caf10a03f52bd2247648c4601" title="Compute and return one output sample.">tick</a>(); 
<a name="l00124"></a>00124   breathPressure += breathPressure * noiseGain_ * noise_.<a class="code" href="classstk_1_1Noise.html#a8ac40f69475eb744e803d557e8438a6d" title="Compute and return one output sample.">tick</a>();
<a name="l00125"></a>00125   breathPressure += breathPressure * vibratoGain_ * vibrato_.<a class="code" href="classstk_1_1SineWave.html#a31a55627bf8064919b5e063059260eda" title="Compute and return one output sample.">tick</a>();
<a name="l00126"></a>00126 
<a name="l00127"></a>00127   temp = -0.95 * filter_.<a class="code" href="classstk_1_1OneZero.html#a9f52fa395257b15cb7351c6ccb2199da" title="Input one sample to the filter and return one output.">tick</a>( delays_[0].<a class="code" href="classstk_1_1Instrmnt.html#aaa6bd5e4a5be7f9b0be967daf012872e" title="Return the specified channel value of the last computed frame.">lastOut</a>() );
<a name="l00128"></a>00128   lastFrame_[0] = temp - delays_[1].<a class="code" href="classstk_1_1DelayL.html#a16810ca38fab79276bb8ec51447623a9" title="Return the last computed output value.">lastOut</a>();
<a name="l00129"></a>00129   pressureDiff = breathPressure - lastFrame_[0];
<a name="l00130"></a>00130   delays_[1].<a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">tick</a>( temp );
<a name="l00131"></a>00131   delays_[0].<a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">tick</a>( breathPressure - (pressureDiff * reedTable_.<a class="code" href="classstk_1_1ReedTable.html#a3c1607ed5712e2ab010d8c5e55e431f2" title="Take one sample input and map to one sample of output.">tick</a>(pressureDiff)) - temp );
<a name="l00132"></a>00132 
<a name="l00133"></a>00133   lastFrame_[0] *= outputGain_;
<a name="l00134"></a>00134   <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00135"></a>00135 }
<a name="l00136"></a>00136 
<a name="l00137"></a><a class="code" href="classstk_1_1Saxofony.html#a98c686337ea0c2be7683ddc569bb0a1d">00137</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_1Saxofony.html#a955d2ea0b3236039851d19b681ca2b0f" title="Compute and return one output sample.">Saxofony :: 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="l00138"></a>00138 {
<a name="l00139"></a>00139   <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="l00140"></a>00140 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00141"></a>00141 <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="l00142"></a>00142     oStream_ &lt;&lt; <span class="stringliteral">&quot;Saxofony::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00143"></a>00143     <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="l00144"></a>00144   }
<a name="l00145"></a>00145 <span class="preprocessor">#endif</span>
<a name="l00146"></a>00146 <span class="preprocessor"></span>
<a name="l00147"></a>00147   StkFloat *samples = &amp;frames[channel];
<a name="l00148"></a>00148   <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="l00149"></a>00149   <span class="keywordflow">if</span> ( nChannels == 1 ) {
<a name="l00150"></a>00150     <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="l00151"></a>00151       *samples++ = <a class="code" href="classstk_1_1Saxofony.html#a955d2ea0b3236039851d19b681ca2b0f" title="Compute and return one output sample.">tick</a>();
<a name="l00152"></a>00152   }
<a name="l00153"></a>00153   <span class="keywordflow">else</span> {
<a name="l00154"></a>00154     <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="l00155"></a>00155       *samples++ = <a class="code" href="classstk_1_1Saxofony.html#a955d2ea0b3236039851d19b681ca2b0f" title="Compute and return one output sample.">tick</a>();
<a name="l00156"></a>00156       <span class="keywordflow">for</span> ( j=1; j&lt;nChannels; j++ )
<a name="l00157"></a>00157         *samples++ = lastFrame_[j];
<a name="l00158"></a>00158     }
<a name="l00159"></a>00159   }
<a name="l00160"></a>00160 
<a name="l00161"></a>00161   <span class="keywordflow">return</span> frames;
<a name="l00162"></a>00162 }
<a name="l00163"></a>00163 
<a name="l00164"></a>00164 } <span class="comment">// stk namespace</span>
<a name="l00165"></a>00165 
<a name="l00166"></a>00166 <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>