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"> <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>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 "Instrmnt.h"</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include "DelayL.h"</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include "ReedTable.h"</span>
<a name="l00007"></a>00007 <span class="preprocessor">#include "OneZero.h"</span>
<a name="l00008"></a>00008 <span class="preprocessor">#include "Envelope.h"</span>
<a name="l00009"></a>00009 <span class="preprocessor">#include "Noise.h"</span>
<a name="l00010"></a>00010 <span class="preprocessor">#include "SineWave.h"</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 &quot;blowing&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>& <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>& 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>& <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>& 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 > 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_ << <span class="stringliteral">"Saxofony::tick(): channel and StkFrames arguments are incompatible!"</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 = &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<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<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<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>©1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>
|