Sophie

Sophie

distrib > Fedora > 16 > x86_64 > by-pkgid > ede7a87b37818518798575974c5532a5 > files > 35

lv2-c++-tools-devel-1.0.3-5.fc15.i686.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>LV2::Synth&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt; Class Template Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.3 -->
<div id="top">
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
      <li><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
      <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
      <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
    </ul>
  </div>
  <div id="nav-path" class="navpath">
    <ul>
      <li class="navelem"><b>LV2</b>      </li>
      <li class="navelem"><a class="el" href="classLV2_1_1Synth.html">Synth</a>      </li>
    </ul>
  </div>
</div>
<div class="header">
  <div class="summary">
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="#pro-methods">Protected Member Functions</a>  </div>
  <div class="headertitle">
<h1>LV2::Synth&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt; Class Template Reference</h1>  </div>
</div>
<div class="contents">
<!-- doxytag: class="LV2::Synth" --><!-- doxytag: inherits="Plugin&lt; D, URIMap&lt; true &gt;, EventRef&lt; true &gt;, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;" -->
<p><code>#include &lt;<a class="el" href="lv2synth_8hpp_source.html">lv2synth.hpp</a>&gt;</code></p>
<div class="dynheader">
Inheritance diagram for LV2::Synth&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;:</div>
<div class="dyncontent">
 <div class="center">
  <img src="classLV2_1_1Synth.png" usemap="#LV2::Synth&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;_map" alt=""/>
  <map id="LV2::Synth&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;_map" name="LV2::Synth&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;_map">
<area href="classLV2_1_1Plugin.html" alt="LV2::Plugin&lt; D, URIMap&lt; true &gt;, EventRef&lt; true &gt;, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;" shape="rect" coords="0,0,545,24"/>
</map>
 </div></div>

<p><a href="classLV2_1_1Synth-members.html">List of all members.</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classLV2_1_1Synth.html#a2cdcf36b91af3426c1c544e6e64611ec">Synth</a> (uint32_t ports, uint32_t midi_input)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classLV2_1_1Synth.html#a57f2d380d709aba8c7965b8582f8b69e">~Synth</a> ()</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">unsigned&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classLV2_1_1Synth.html#acc127e1ca341662f6fbd11ae351a43c6">find_free_voice</a> (unsigned char key, unsigned char velocity)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classLV2_1_1Synth.html#a63ef924a2e072892313a7e914e92566e">handle_midi</a> (uint32_t size, unsigned char *data)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classLV2_1_1Synth.html#aeb78b3c4b9a9e0bdae7159b26965ea78">pre_process</a> (uint32_t from, uint32_t to)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classLV2_1_1Synth.html#ad0a6997f0bacfbce50d17c68cdad0649">post_process</a> (uint32_t from, uint32_t to)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classLV2_1_1Synth.html#a66ef00d4e248449d8986cbca2b215569">run</a> (uint32_t sample_count)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classLV2_1_1Synth.html#a1760af1ba457f99fa77b854f10bc8593">add_audio_outputs</a> (uint32_t p1=-1, uint32_t p2=-1, uint32_t p3=-1, uint32_t p4=-1, uint32_t p5=-1, uint32_t p6=-1)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classLV2_1_1Synth.html#ac9b9f6b58af9d91fbd9a9750d2b2e626">add_voices</a> (V *v01=0, V *v02=0, V *v03=0, V *v04=0, V *v05=0, V *v06=0, V *v07=0, V *v08=0, V *v09=0, V *v10=0, V *v11=0, V *v12=0, V *v13=0, V *v14=0, V *v15=0, V *v16=0, V *v17=0, V *v18=0, V *v19=0, V *v20=0)</td></tr>
<tr><td colspan="2"><h2><a name="pro-methods"></a>
Protected Member Functions</h2></td></tr>
<tr><td class="memTemplParams" colspan="2">template&lt;typename T &gt; </td></tr>
<tr><td class="memTemplItemLeft" align="right" valign="top">T *&amp;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classLV2_1_1Synth.html#ab6d745c5d3643b85f062a210bbb4a357">p</a> (uint32_t port)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">float *&amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classLV2_1_1Synth.html#a2097aeeb76e8c1527c4670d4552c3e00">p</a> (uint32_t port)</td></tr>
</table>
<hr/><a name="_details"></a><h2>Detailed Description</h2>
<div class="textblock"><h3>template&lt;class V, class D, class Ext1 = End, class Ext2 = End, class Ext3 = End, class Ext4 = End, class Ext5 = End, class Ext6 = End, class Ext7 = End&gt;<br/>
 class LV2::Synth&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;</h3>

<p>This is a base class template for LV2 synth plugins. Its parameters are a voice class, either a subclass of <a class="el" href="classLV2_1_1Voice.html">Voice</a> or something written from scratch, and the derived class itself. By using the derived class as a template parameter the base class can call member functions in the derived class without resorting to virtual function calls, which are hard to optimise.</p>
<p>You can use <a class="el" href="group__pluginmixins.html">mixins</a> with this class just like with the <a class="el" href="classLV2_1_1Plugin.html">Plugin</a> class, but don't use <a class="el" href="structLV2_1_1EventRef.html">EventRef</a> or <a class="el" href="structLV2_1_1URIMap.html">URIMap</a> - they are already added automatically.</p>
<p>Here is an example of a complete synth plugin. Granted, not a very exciting one, but it should be enough to explain how to do it:</p>
<div class="fragment"><pre class="fragment"><span class="preprocessor">#include &lt;cstdlib&gt;</span>
<span class="preprocessor">#include &lt;lv2synth.hpp&gt;</span>

<span class="keyword">enum</span> {
  MIDI_PORT,
  AUDIO_PORT,
  NUM_PORTS
};

<span class="keyword">struct </span>NoiseVoice : <span class="keyword">public</span> LV2::Voice {

  NoiseVoice() : m_gain(0), m_key(INVALID_KEY) { }
  
  <span class="keywordtype">void</span> on(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> k, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> velocity) { 
    m_gain = 1.0; 
    m_key = k;
  }

  <span class="keywordtype">void</span> off(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> velocity) { 
    m_gain = 0.0; 
    m_key = LV2::INVALID_KEY;
  }

  <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> get_key()<span class="keyword"> const </span>{ 
    <span class="keywordflow">return</span> m_key; 
  }

  <span class="keywordtype">void</span> render(uint32_t from, uint32_t to) {
    <span class="keywordflow">for</span> (uint32_t i = from; i &lt; to; ++i) {
      <a class="code" href="classLV2_1_1Synth.html#ab6d745c5d3643b85f062a210bbb4a357">p</a>(AUDIO_PORT)[i] += m_gain * 2 * (rand() / float(RAND_MAX) - 0.5);
      m_gain *= 0.9999;
    }
  }

  <span class="keywordtype">float</span> m_gain;
  <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> m_key;
};

  
<span class="keyword">struct </span>NoiseSynth : <span class="keyword">public</span> LV2::<a class="code" href="classLV2_1_1Synth.html#a2cdcf36b91af3426c1c544e6e64611ec">Synth</a>&lt;NoiseVoice, NoiseSynth&gt; {

  NoiseSynth(<span class="keywordtype">double</span>) 
    : LV2::<a class="code" href="classLV2_1_1Synth.html#a2cdcf36b91af3426c1c544e6e64611ec">Synth</a>&lt;NoiseVoice, NoiseSynth&gt;(NUM_PORTS, MIDI_PORT), m_filterstate(0) {
    <a class="code" href="classLV2_1_1Synth.html#ac9b9f6b58af9d91fbd9a9750d2b2e626">add_voices</a>(<span class="keyword">new</span> NoiseVoice, <span class="keyword">new</span> NoiseVoice, <span class="keyword">new</span> NoiseVoice);
    <a class="code" href="classLV2_1_1Synth.html#a1760af1ba457f99fa77b854f10bc8593">add_audio_outputs</a>(AUDIO_PORT);
  }

  <span class="keywordtype">void</span> <a class="code" href="classLV2_1_1Synth.html#ad0a6997f0bacfbce50d17c68cdad0649">post_process</a>(uint32_t from, uint32_t to) {
    <span class="keywordflow">for</span> (uint32_t i = from; i &lt; to; ++i) {
      <a class="code" href="classLV2_1_1Synth.html#ab6d745c5d3643b85f062a210bbb4a357">p</a>(AUDIO_PORT)[i] = m_filterstate * 0.9 + <a class="code" href="classLV2_1_1Synth.html#ab6d745c5d3643b85f062a210bbb4a357">p</a>(AUDIO_PORT)[i] * 0.1;
      m_filterstate = <a class="code" href="classLV2_1_1Synth.html#ab6d745c5d3643b85f062a210bbb4a357">p</a>(AUDIO_PORT)[i];
    }
  }

  <span class="keywordtype">float</span> m_filterstate;
};
</pre></div> </div><hr/><h2>Constructor &amp; Destructor Documentation</h2>
<a class="anchor" id="a2cdcf36b91af3426c1c544e6e64611ec"></a><!-- doxytag: member="LV2::Synth::Synth" ref="a2cdcf36b91af3426c1c544e6e64611ec" args="(uint32_t ports, uint32_t midi_input)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class V , class D , class Ext1  = End, class Ext2  = End, class Ext3  = End, class Ext4  = End, class Ext5  = End, class Ext6  = End, class Ext7  = End&gt; </div>
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classLV2_1_1Synth.html">LV2::Synth</a>&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::<a class="el" href="classLV2_1_1Synth.html">Synth</a> </td>
          <td>(</td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>ports</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>midi_input</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td><code> [inline]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<p>This constructor must be called in the initialiser list for your synth class. </p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">ports</td><td>The total number of ports in your plugin. </td></tr>
    <tr><td class="paramname">midi_input</td><td>The index of the main MIDI input port (the one that the synth should use for note input). </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a class="anchor" id="a57f2d380d709aba8c7965b8582f8b69e"></a><!-- doxytag: member="LV2::Synth::~Synth" ref="a57f2d380d709aba8c7965b8582f8b69e" args="()" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class V , class D , class Ext1  = End, class Ext2  = End, class Ext3  = End, class Ext4  = End, class Ext5  = End, class Ext6  = End, class Ext7  = End&gt; </div>
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classLV2_1_1Synth.html">LV2::Synth</a>&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::~<a class="el" href="classLV2_1_1Synth.html">Synth</a> </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td><code> [inline]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<p>This is needed to delete the voices. </p>

</div>
</div>
<hr/><h2>Member Function Documentation</h2>
<a class="anchor" id="a1760af1ba457f99fa77b854f10bc8593"></a><!-- doxytag: member="LV2::Synth::add_audio_outputs" ref="a1760af1ba457f99fa77b854f10bc8593" args="(uint32_t p1=&#45;1, uint32_t p2=&#45;1, uint32_t p3=&#45;1, uint32_t p4=&#45;1, uint32_t p5=&#45;1, uint32_t p6=&#45;1)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class V , class D , class Ext1  = End, class Ext2  = End, class Ext3  = End, class Ext4  = End, class Ext5  = End, class Ext6  = End, class Ext7  = End&gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classLV2_1_1Synth.html">LV2::Synth</a>&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::add_audio_outputs </td>
          <td>(</td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>p1</em> = <code>-1</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>p2</em> = <code>-1</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>p3</em> = <code>-1</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>p4</em> = <code>-1</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>p5</em> = <code>-1</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>p6</em> = <code>-1</code>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td><code> [inline]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<p>This should be called in the constructor of your derived class to tell the synth which ports the voices are using as audio output buffers, so the synth engine can fill them with zeros before rendering the voice audio.</p>
<p>If you for some reason don't want to zero your audio output buffers before the voices get mixed (you may for example want to fill them with something else in <a class="el" href="classLV2_1_1Synth.html#aeb78b3c4b9a9e0bdae7159b26965ea78">pre_process()</a>) you should not call this function - but then you MUST take care of initialising the buffers yourself in every cycle. </p>

</div>
</div>
<a class="anchor" id="ac9b9f6b58af9d91fbd9a9750d2b2e626"></a><!-- doxytag: member="LV2::Synth::add_voices" ref="ac9b9f6b58af9d91fbd9a9750d2b2e626" args="(V *v01=0, V *v02=0, V *v03=0, V *v04=0, V *v05=0, V *v06=0, V *v07=0, V *v08=0, V *v09=0, V *v10=0, V *v11=0, V *v12=0, V *v13=0, V *v14=0, V *v15=0, V *v16=0, V *v17=0, V *v18=0, V *v19=0, V *v20=0)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class V , class D , class Ext1  = End, class Ext2  = End, class Ext3  = End, class Ext4  = End, class Ext5  = End, class Ext6  = End, class Ext7  = End&gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classLV2_1_1Synth.html">LV2::Synth</a>&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::add_voices </td>
          <td>(</td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v01</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v02</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v03</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v04</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v05</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v06</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v07</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v08</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v09</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v10</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v11</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v12</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v13</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v14</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v15</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v16</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v17</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v18</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v19</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">V *&#160;</td>
          <td class="paramname"><em>v20</em> = <code>0</code>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td><code> [inline]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<p>This is typically called in the constructor of your derived class to add voices to the synth. The number of voices you add determine the polyphony. It can also be called while the plugin is running to change the polyphony on the fly, but it is NOT realtime safe and NOT threadsafe - you have to make sure that the <a class="el" href="classLV2_1_1Synth.html#a66ef00d4e248449d8986cbca2b215569">run()</a> callback isn't executing simultaneously with this function.</p>
<p><a class="el" href="classLV2_1_1Synth.html">LV2::Synth</a> will assume ownership of the voices and delete them in its destructor. </p>

</div>
</div>
<a class="anchor" id="acc127e1ca341662f6fbd11ae351a43c6"></a><!-- doxytag: member="LV2::Synth::find_free_voice" ref="acc127e1ca341662f6fbd11ae351a43c6" args="(unsigned char key, unsigned char velocity)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class V , class D , class Ext1  = End, class Ext2  = End, class Ext3  = End, class Ext4  = End, class Ext5  = End, class Ext6  = End, class Ext7  = End&gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">unsigned <a class="el" href="classLV2_1_1Synth.html">LV2::Synth</a>&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::find_free_voice </td>
          <td>(</td>
          <td class="paramtype">unsigned char&#160;</td>
          <td class="paramname"><em>key</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">unsigned char&#160;</td>
          <td class="paramname"><em>velocity</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td><code> [inline]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<p>This function implements the voice stealing algorithm. The <code>key</code> and <code>velocity</code> arguments are the parameters for the MIDI Note On event that needs a voice. This default implementation just returns the first free voice, and if there is none it steals voice 0.</p>
<p>This is not a virtual function, but if you override it in a subclass this class will still use that implementation thanks to the second template class parameter. This means that you can override this function if you want to implement your own voice stealing algorithm. </p>

<p>Referenced by <a class="el" href="classLV2_1_1Synth.html#a63ef924a2e072892313a7e914e92566e">LV2::Synth&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::handle_midi()</a>.</p>

</div>
</div>
<a class="anchor" id="a63ef924a2e072892313a7e914e92566e"></a><!-- doxytag: member="LV2::Synth::handle_midi" ref="a63ef924a2e072892313a7e914e92566e" args="(uint32_t size, unsigned char *data)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class V , class D , class Ext1  = End, class Ext2  = End, class Ext3  = End, class Ext4  = End, class Ext5  = End, class Ext6  = End, class Ext7  = End&gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classLV2_1_1Synth.html">LV2::Synth</a>&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::handle_midi </td>
          <td>(</td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>size</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">unsigned char *&#160;</td>
          <td class="paramname"><em>data</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td><code> [inline]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<p>This function is called for every MIDI event in the input. It will respond to note on and note off events by calling on() and off() in the voices.</p>
<p>This is not a virtual function, but if you override it in a subclass this class will still use that implementation thanks to the second template class parameter. This means that you can override this function if you want to respond to other MIDI events - just be sure to either call this function for note on and note off events or turn on and off the voices yourself. </p>

<p>References <a class="el" href="classLV2_1_1Synth.html#acc127e1ca341662f6fbd11ae351a43c6">LV2::Synth&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::find_free_voice()</a>.</p>

<p>Referenced by <a class="el" href="classLV2_1_1Synth.html#a66ef00d4e248449d8986cbca2b215569">LV2::Synth&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::run()</a>.</p>

</div>
</div>
<a class="anchor" id="ab6d745c5d3643b85f062a210bbb4a357"></a><!-- doxytag: member="LV2::Synth::p" ref="ab6d745c5d3643b85f062a210bbb4a357" args="(uint32_t port)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class V , class D , class Ext1  = End, class Ext2  = End, class Ext3  = End, class Ext4  = End, class Ext5  = End, class Ext6  = End, class Ext7  = End&gt; </div>
<div class="memtemplate">
template&lt;typename T &gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">T*&amp; <a class="el" href="classLV2_1_1Synth.html">LV2::Synth</a>&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::p </td>
          <td>(</td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>port</em></td><td>)</td>
          <td><code> [inline, protected]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<p>Use this function to access data buffers for ports. They will be casted to pointers to the template parameter <code>T</code>. </p>

<p>Reimplemented from <a class="el" href="classLV2_1_1Plugin.html#abce9c4c57e31f91ea9e1a94d7e80630d">LV2::Plugin&lt; D, URIMap&lt; true &gt;, EventRef&lt; true &gt;, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;</a>.</p>

<p>Referenced by <a class="el" href="classLV2_1_1Synth.html#a66ef00d4e248449d8986cbca2b215569">LV2::Synth&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::run()</a>.</p>

</div>
</div>
<a class="anchor" id="a2097aeeb76e8c1527c4670d4552c3e00"></a><!-- doxytag: member="LV2::Synth::p" ref="a2097aeeb76e8c1527c4670d4552c3e00" args="(uint32_t port)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class V , class D , class Ext1  = End, class Ext2  = End, class Ext3  = End, class Ext4  = End, class Ext5  = End, class Ext6  = End, class Ext7  = End&gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">float*&amp; <a class="el" href="classLV2_1_1Synth.html">LV2::Synth</a>&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::p </td>
          <td>(</td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>port</em></td><td>)</td>
          <td><code> [inline, protected]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<p>Use this function to access data buffers for control or audio ports. </p>

<p>Reimplemented from <a class="el" href="classLV2_1_1Plugin.html#abce9c4c57e31f91ea9e1a94d7e80630d">LV2::Plugin&lt; D, URIMap&lt; true &gt;, EventRef&lt; true &gt;, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;</a>.</p>

</div>
</div>
<a class="anchor" id="ad0a6997f0bacfbce50d17c68cdad0649"></a><!-- doxytag: member="LV2::Synth::post_process" ref="ad0a6997f0bacfbce50d17c68cdad0649" args="(uint32_t from, uint32_t to)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class V , class D , class Ext1  = End, class Ext2  = End, class Ext3  = End, class Ext4  = End, class Ext5  = End, class Ext6  = End, class Ext7  = End&gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classLV2_1_1Synth.html">LV2::Synth</a>&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::post_process </td>
          <td>(</td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>from</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>to</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td><code> [inline]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<p>This function is called after the synth renders a chunk of audio from the voices, from sample <code>from</code> to sample <code>to</code> in the output buffers. It can be used to apply global effects to the mixed audio. This default implementation does nothing.</p>
<p>This is not a virtual function, but if you override it in a subclass this class will still use that implementation thanks to the second template class parameter. This means that you can override this function if you want to implement your own post-processing. </p>

<p>Referenced by <a class="el" href="classLV2_1_1Synth.html#a66ef00d4e248449d8986cbca2b215569">LV2::Synth&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::run()</a>.</p>

</div>
</div>
<a class="anchor" id="aeb78b3c4b9a9e0bdae7159b26965ea78"></a><!-- doxytag: member="LV2::Synth::pre_process" ref="aeb78b3c4b9a9e0bdae7159b26965ea78" args="(uint32_t from, uint32_t to)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class V , class D , class Ext1  = End, class Ext2  = End, class Ext3  = End, class Ext4  = End, class Ext5  = End, class Ext6  = End, class Ext7  = End&gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classLV2_1_1Synth.html">LV2::Synth</a>&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::pre_process </td>
          <td>(</td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>from</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>to</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td><code> [inline]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<p>This function is called before the synth renders a chunk of audio from the voices, from sample <code>from</code> to sample <code>to</code> in the output buffers. It can be used to compute parameters for the voices or adding initial ambient noise to the output buffers or something else. This default implementation does nothing.</p>
<p>This is not a virtual function, but if you override it in a subclass this class will still use that implementation thanks to the second template class parameter. This means that you can override this function if you want to implement your own pre-processing. </p>

<p>Referenced by <a class="el" href="classLV2_1_1Synth.html#a66ef00d4e248449d8986cbca2b215569">LV2::Synth&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::run()</a>.</p>

</div>
</div>
<a class="anchor" id="a66ef00d4e248449d8986cbca2b215569"></a><!-- doxytag: member="LV2::Synth::run" ref="a66ef00d4e248449d8986cbca2b215569" args="(uint32_t sample_count)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;class V , class D , class Ext1  = End, class Ext2  = End, class Ext3  = End, class Ext4  = End, class Ext5  = End, class Ext6  = End, class Ext7  = End&gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classLV2_1_1Synth.html">LV2::Synth</a>&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::run </td>
          <td>(</td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>sample_count</em></td><td>)</td>
          <td><code> [inline]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<p>This is the main run function. It handles incoming MIDI events and mixes the voices to the output buffers with pre and post-processing applied. Don't override it unless you really know what you're doing. </p>

<p>Reimplemented from <a class="el" href="classLV2_1_1Plugin.html#a12113149fac2613b80d0e3f5116a7407">LV2::Plugin&lt; D, URIMap&lt; true &gt;, EventRef&lt; true &gt;, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;</a>.</p>

<p>References <a class="el" href="classLV2_1_1Synth.html#a63ef924a2e072892313a7e914e92566e">LV2::Synth&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::handle_midi()</a>, <a class="el" href="classLV2_1_1Synth.html#ab6d745c5d3643b85f062a210bbb4a357">LV2::Synth&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::p()</a>, <a class="el" href="classLV2_1_1Synth.html#ad0a6997f0bacfbce50d17c68cdad0649">LV2::Synth&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::post_process()</a>, and <a class="el" href="classLV2_1_1Synth.html#aeb78b3c4b9a9e0bdae7159b26965ea78">LV2::Synth&lt; V, D, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7 &gt;::pre_process()</a>.</p>

</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>libraries/lv2plugin/<a class="el" href="lv2synth_8hpp_source.html">lv2synth.hpp</a></li>
</ul>
</div>
<hr class="footer"/><address class="footer"><small>Generated on Tue Feb 8 2011 by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.3 </small></address>
</body>
</html>