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
|
<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>Brass.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_BRASS_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_BRASS_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 "DelayA.h"</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include "BiQuad.h"</span>
<a name="l00007"></a>00007 <span class="preprocessor">#include "PoleZero.h"</span>
<a name="l00008"></a>00008 <span class="preprocessor">#include "ADSR.h"</span>
<a name="l00009"></a>00009 <span class="preprocessor">#include "SineWave.h"</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="l00033"></a>00033 <span class="comment">/***************************************************/</span>
<a name="l00034"></a>00034
<a name="l00035"></a><a class="code" href="classstk_1_1Brass.html">00035</a> <span class="keyword">class </span><a class="code" href="classstk_1_1Brass.html" title="STK simple brass instrument class.">Brass</a>: <span class="keyword">public</span> <a class="code" href="classstk_1_1Instrmnt.html" title="STK instrument abstract base class.">Instrmnt</a>
<a name="l00036"></a>00036 {
<a name="l00037"></a>00037 <span class="keyword">public</span>:
<a name="l00039"></a>00039
<a name="l00042"></a>00042 <a class="code" href="classstk_1_1Brass.html#a5bf59263a54250be84c027198c7d2d1d" title="Class constructor, taking the lowest desired playing frequency.">Brass</a>( StkFloat lowestFrequency = 8.0 );
<a name="l00043"></a>00043
<a name="l00045"></a>00045 <a class="code" href="classstk_1_1Brass.html#a474528a75bd4fb88cdb9c783d73df8f6" title="Class destructor.">~Brass</a>( );
<a name="l00046"></a>00046
<a name="l00048"></a>00048 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Brass.html#a64e48334efdc8f2508c29c5ea4281f2d" title="Reset and clear all internal state.">clear</a>( );
<a name="l00049"></a>00049
<a name="l00051"></a>00051 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Brass.html#a5e99e7fee1b92138566a46c828df93e8" title="Set instrument parameters for a particular frequency.">setFrequency</a>( StkFloat frequency );
<a name="l00052"></a>00052
<a name="l00054"></a>00054 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Brass.html#a2e1a150328504050499c5cb9fa0e536f" title="Set the lips frequency.">setLip</a>( StkFloat frequency );
<a name="l00055"></a>00055
<a name="l00057"></a>00057 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Brass.html#a02533e02818e2848fb6480106a54ce94" title="Apply breath pressure to instrument with given amplitude and rate of increase.">startBlowing</a>( StkFloat amplitude, StkFloat rate );
<a name="l00058"></a>00058
<a name="l00060"></a>00060 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Brass.html#a8bf1624aca6283fafb830a3f22546199" title="Decrease breath pressure with given rate of decrease.">stopBlowing</a>( StkFloat rate );
<a name="l00061"></a>00061
<a name="l00063"></a>00063 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Brass.html#ae74eba698f27abd43e66e825f5ce72da" 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_1Brass.html#a32e2a6d2c9285bb5cf033d8a6b90e3c9" 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="keywordtype">void</span> <a class="code" href="classstk_1_1Brass.html#a4d75ac361d11fcc870a330d393dbad80" 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="l00070"></a>00070
<a name="l00072"></a>00072 StkFloat <a class="code" href="classstk_1_1Brass.html#a4af1b7c4c1b374b65e04ccaa90886321" 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>& <a class="code" href="classstk_1_1Brass.html#a4af1b7c4c1b374b65e04ccaa90886321" 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="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_1DelayA.html" title="STK allpass interpolating delay line class.">DelayA</a> delayLine_;
<a name="l00087"></a>00087 <a class="code" href="classstk_1_1BiQuad.html" title="STK biquad (two-pole, two-zero) filter class.">BiQuad</a> lipFilter_;
<a name="l00088"></a>00088 <a class="code" href="classstk_1_1PoleZero.html" title="STK one-pole, one-zero filter class.">PoleZero</a> dcBlock_;
<a name="l00089"></a>00089 <a class="code" href="classstk_1_1ADSR.html" title="STK ADSR envelope class.">ADSR</a> adsr_;
<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 StkFloat lipTarget_;
<a name="l00093"></a>00093 StkFloat slideTarget_;
<a name="l00094"></a>00094 StkFloat vibratoGain_;
<a name="l00095"></a>00095 StkFloat maxPressure_;
<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_1Brass.html#a4af1b7c4c1b374b65e04ccaa90886321">00099</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1Brass.html#a4af1b7c4c1b374b65e04ccaa90886321" title="Compute and return one output sample.">Brass :: tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> )
<a name="l00100"></a>00100 {
<a name="l00101"></a>00101 StkFloat breathPressure = maxPressure_ * adsr_.<a class="code" href="classstk_1_1ADSR.html#af2c0869f86210a55f4f668172373c975" title="Compute and return one output sample.">tick</a>();
<a name="l00102"></a>00102 breathPressure += vibratoGain_ * vibrato_.<a class="code" href="classstk_1_1SineWave.html#a31a55627bf8064919b5e063059260eda" title="Compute and return one output sample.">tick</a>();
<a name="l00103"></a>00103
<a name="l00104"></a>00104 StkFloat mouthPressure = 0.3 * breathPressure;
<a name="l00105"></a>00105 StkFloat borePressure = 0.85 * delayLine_.<a class="code" href="classstk_1_1DelayA.html#a4372d0e178af1cb6ca465affddfb1566" title="Return the last computed output value.">lastOut</a>();
<a name="l00106"></a>00106 StkFloat deltaPressure = mouthPressure - borePressure; <span class="comment">// Differential pressure.</span>
<a name="l00107"></a>00107 deltaPressure = lipFilter_.<a class="code" href="classstk_1_1BiQuad.html#a648086962c3cddcaa09c46a002c3e635" title="Input one sample to the filter and return a reference to one output.">tick</a>( deltaPressure ); <span class="comment">// Force - > position.</span>
<a name="l00108"></a>00108 deltaPressure *= deltaPressure; <span class="comment">// Basic position to area mapping.</span>
<a name="l00109"></a>00109 <span class="keywordflow">if</span> ( deltaPressure > 1.0 ) deltaPressure = 1.0; <span class="comment">// Non-linear saturation.</span>
<a name="l00110"></a>00110
<a name="l00111"></a>00111 <span class="comment">// The following input scattering assumes the mouthPressure = area.</span>
<a name="l00112"></a>00112 lastFrame_[0] = deltaPressure * mouthPressure + ( 1.0 - deltaPressure) * borePressure;
<a name="l00113"></a>00113 lastFrame_[0] = delayLine_.<a class="code" href="classstk_1_1DelayA.html#ae602abe91560fb5f141db52333359b74" title="Input one sample to the filter and return one output.">tick</a>( dcBlock_.<a class="code" href="classstk_1_1PoleZero.html#a1a29ac6f3a2b75e71693c73554599228" title="Input one sample to the filter and return one output.">tick</a>( lastFrame_[0] ) );
<a name="l00114"></a>00114
<a name="l00115"></a>00115 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00116"></a>00116 }
<a name="l00117"></a>00117
<a name="l00118"></a><a class="code" href="classstk_1_1Brass.html#a10334fc5573b68f2b5c2819bdba786b8">00118</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_1Brass.html#a4af1b7c4c1b374b65e04ccaa90886321" title="Compute and return one output sample.">Brass :: 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="l00119"></a>00119 {
<a name="l00120"></a>00120 <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="l00121"></a>00121 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00122"></a>00122 <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="l00123"></a>00123 oStream_ << <span class="stringliteral">"Brass::tick(): channel and StkFrames arguments are incompatible!"</span>;
<a name="l00124"></a>00124 <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="l00125"></a>00125 }
<a name="l00126"></a>00126 <span class="preprocessor">#endif</span>
<a name="l00127"></a>00127 <span class="preprocessor"></span>
<a name="l00128"></a>00128 StkFloat *samples = &frames[channel];
<a name="l00129"></a>00129 <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="l00130"></a>00130 <span class="keywordflow">if</span> ( nChannels == 1 ) {
<a name="l00131"></a>00131 <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="l00132"></a>00132 *samples++ = <a class="code" href="classstk_1_1Brass.html#a4af1b7c4c1b374b65e04ccaa90886321" title="Compute and return one output sample.">tick</a>();
<a name="l00133"></a>00133 }
<a name="l00134"></a>00134 <span class="keywordflow">else</span> {
<a name="l00135"></a>00135 <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="l00136"></a>00136 *samples++ = <a class="code" href="classstk_1_1Brass.html#a4af1b7c4c1b374b65e04ccaa90886321" title="Compute and return one output sample.">tick</a>();
<a name="l00137"></a>00137 <span class="keywordflow">for</span> ( j=1; j<nChannels; j++ )
<a name="l00138"></a>00138 *samples++ = lastFrame_[j];
<a name="l00139"></a>00139 }
<a name="l00140"></a>00140 }
<a name="l00141"></a>00141
<a name="l00142"></a>00142 <span class="keywordflow">return</span> frames;
<a name="l00143"></a>00143 }
<a name="l00144"></a>00144
<a name="l00145"></a>00145 } <span class="comment">// stk namespace</span>
<a name="l00146"></a>00146
<a name="l00147"></a>00147 <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>
|