Sophie

Sophie

distrib > Mageia > 7 > armv7hl > media > core-release > by-pkgid > 5fcfcb7517038d1f44ab4e478e6e61fa > files > 2424

csound-doc-6.10.0-1.mga7.noarch.rpm

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!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/html; charset=UTF-8" />
    <title>lua_opdef</title>
    <link rel="stylesheet" type="text/css" href="csound.css" />
    <link rel="stylesheet" type="text/css" href="syntax-highlighting.css" />
    <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot" />
    <link rel="home" href="index.html" title="The Canonical Csound Reference Manual" />
    <link rel="up" href="OpcodesTop.html" title="Orchestra Opcodes and Operators" />
    <link rel="prev" href="lua_exec.html" title="lua_exec" />
    <link rel="next" href="lua_opcall.html" title="lua_opcall" />
  </head>
  <body>
    <div class="navheader">
      <table width="100%" summary="Navigation header">
        <tr>
          <th colspan="3" align="center">
            lua_opdef
        </th>
        </tr>
        <tr>
          <td width="20%" align="left"><a accesskey="p" href="lua_exec.html">Prev</a> </td>
          <th width="60%" align="center">Orchestra Opcodes and Operators</th>
          <td width="20%" align="right"> <a accesskey="n" href="lua_opcall.html">Next</a></td>
        </tr>
      </table>
      <hr />
    </div>
    <div class="refentry">
      <a id="lua_opdef"></a>
      <div class="titlepage"></div>
      <a id="Indexlua_opdef" class="indexterm"></a>
      <div class="refnamediv">
        <h2>
          <span class="refentrytitle">
            lua_opdef
        </span>
        </h2>
        <p>
            lua_opdef
         — 
             Define an opcode in Lua at i-rate. The opcode can take any 
             number of output and/or input arguments of any type. 
        </p>
      </div>
      <div class="refsect1">
        <a id="idm281472916967752"></a>
        <h2>
            Description
        </h2>
        <p>
            Define an opcode in Lua at i-rate. The opcode can take any 
            number of output and/or input arguments of any type. 
            The code is executed at initialization time, typically from the 
            orchestra header. Global and local variables, functions, 
            tables, and classes may be declared and defined. Objects defined 
            at global Lua scope remain in scope throughout the performance, 
            and are visible to any other Lua code in the same Csound thread.
        </p>
        <div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
          <table border="0" summary="Note">
            <tr>
              <td rowspan="2" align="center" valign="top" width="25">
                <img alt="[Note]" src="images/note.png" />
              </td>
              <th align="left">Note</th>
            </tr>
            <tr>
              <td align="left" valign="top">
                <p>
               By default, all objects defined in Lua are defined at global 
               scope. In order to ensure that objects are confined to their 
               own block of code, that is to ensure that the object is visible 
               only in lexical scope, the object must be declared as local. 
               This is the feature of Lua that beginners tend to find the most 
               troublesome.
            </p>
                <p>
               Another thing to look out for is that Lua arrays use 1-based 
               indexing, not the 0-based indexing used in C and many other 
               programming languages.
            </p>
              </td>
            </tr>
          </table>
        </div>
      </div>
      <div class="refsect1">
        <a id="idm281472916964728"></a>
        <h2>
            Syntax
        </h2>
        <pre class="synopsis"><span class="command"><strong>lua_opdef</strong></span> Sname, Sluacode</pre>
      </div>
      <div class="refsect1">
        <a id="idm281472916962696"></a>
        <h2>
            Initialization
        </h2>
        <p>
            <span class="emphasis"><em>Sname</em></span> -- The name of the opcode.
        </p>
        <p>
            <span class="emphasis"><em>Sluacode</em></span> -- A block of Lua code, of any 
            length. Multi-line blocks may be enclosed in double braces
            (i.e. <code class="literal">{{ }}</code>). This code is 
            evaluated once at initialization time.  
        </p>
        <p>
            The Lua code must define all functions that will be called from Csound,
            using the following naming convention, where opcodename
            stands for the actual opcode name:
        </p>
        <div class="itemizedlist">
          <ul class="itemizedlist" style="list-style-type: disc; ">
            <li class="listitem">
                <code class="literal">opcodename_init</code> for the i-rate opcode subroutine.
            </li>
            <li class="listitem">
                <code class="literal">opcodename_kontrol</code> for the k-rate opcode subroutine.
            </li>
            <li class="listitem">
                <code class="literal">opcodename_audio</code> for the a-rate opcode subroutine.
            </li>
            <li class="listitem">
                <code class="literal">opcodename_noteoff</code> for the note-off subroutine.
            </li>
          </ul>
        </div>
        <p>
            Each of these Lua functions will receive three lightuserdata
            (i.e. pointer) arguments: the CSOUND object, the opcode instance,
            and a pointer to the opcode arguments, which the Lua code must be type cast
            to a LuaJIT FFI ctype structure containing the opcode output arguments,
            input arguments, and state variables. Using LuaJIT FFI, the elements of
            this structure will be accessible as though they were Lua types.
        </p>
        <p>
            Each of these Lua functions must return 0 for success
            or 1 for failure.
        </p>
        <p>
            The Lua functions may do absolutely anything, although of
            course if real-time performance is expected, care must be
            taken to disable Lua garbage collection and observe other
            recommendations for real-time code.
        </p>
      </div>
      <div class="refsect1">
        <a id="idm281472916904248"></a>
        <h2>
            Example
        </h2>
        <p>
            Here is an example of a Lua opcode, implementing a Moog 
            ladder filter. For purposes of comparison, a user-defined 
            opcode and the native Csound opcode that compute the same 
            sound using the same algorithm also are shown, and timed. 
            The example uses the file <a class="ulink" href="examples/luamoog.csd" target="_top">
            <em class="citetitle">luamoog.csd</em></a>.
            </p>
        <div class="example">
          <a id="idm281472916900600"></a>
          <p class="title">
            <strong>Example 509. 
                    Example of a Lua opcode.
                </strong>
          </p>
          <div class="example-contents">
            <div class="refsect1">
              <a id="idm281472744145096"></a>
              <pre class="programlisting">
<span class="nt">&lt;CsoundSynthesizer&gt;</span>
<span class="nt">&lt;CsInstruments&gt;</span>
<span class="vg">sr</span> <span class="o">=</span>    <span class="mi">48000</span>
<span class="vg">ksmps</span> <span class="o">=</span>   <span class="mi">100</span>
<span class="vg">nchnls</span> <span class="o">=</span>    <span class="mi">1</span>

    gi<span class="n">began</span>     <span class="nb">rtclock</span>

    <span class="nb">lua_opdef</span>   <span class="s">"moogladder"</span><span class="p">,</span> <span class="s">{{</span>
<span class="kd">local</span> <span class="n">ffi</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="s2">"ffi"</span><span class="p">)</span>
<span class="kd">local</span> <span class="n">math</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="s2">"math"</span><span class="p">)</span>
<span class="kd">local</span> <span class="n">string</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="s2">"string"</span><span class="p">)</span>
<span class="kd">local</span> <span class="n">csoundApi</span> <span class="o">=</span> <span class="n">ffi</span><span class="p">.</span><span class="n">load</span><span class="p">(</span><span class="s1">'csound64.dll.5.2'</span><span class="p">)</span>
<span class="n">ffi</span><span class="p">.</span><span class="n">cdef</span><span class="p">[[</span>
    <span class="n">int</span> <span class="n">csoundGetKsmps</span><span class="p">(</span><span class="n">void</span> <span class="o">*</span><span class="p">);</span>
    <span class="n">double</span> <span class="n">csoundGetSr</span><span class="p">(</span><span class="n">void</span> <span class="o">*</span><span class="p">);</span>
    <span class="n">struct</span> <span class="n">moogladder_t</span> <span class="p">{</span>
      <span class="n">double</span> <span class="o">*</span><span class="n">out</span><span class="p">;</span>
      <span class="n">double</span> <span class="o">*</span><span class="n">inp</span><span class="p">;</span>
      <span class="n">double</span> <span class="o">*</span><span class="n">freq</span><span class="p">;</span>
      <span class="n">double</span> <span class="o">*</span><span class="n">res</span><span class="p">;</span>
      <span class="n">double</span> <span class="o">*</span><span class="n">istor</span><span class="p">;</span>
      <span class="n">double</span> <span class="n">sr</span><span class="p">;</span>
      <span class="n">double</span> <span class="n">ksmps</span><span class="p">;</span>
      <span class="n">double</span> <span class="n">thermal</span><span class="p">;</span>
      <span class="n">double</span> <span class="n">f</span><span class="p">;</span>
      <span class="n">double</span> <span class="n">fc</span><span class="p">;</span>
      <span class="n">double</span> <span class="n">fc2</span><span class="p">;</span>
      <span class="n">double</span> <span class="n">fc3</span><span class="p">;</span>
      <span class="n">double</span> <span class="n">fcr</span><span class="p">;</span>
      <span class="n">double</span> <span class="n">acr</span><span class="p">;</span>
      <span class="n">double</span> <span class="n">tune</span><span class="p">;</span>
      <span class="n">double</span> <span class="n">res4</span><span class="p">;</span>
      <span class="n">double</span> <span class="n">input</span><span class="p">;</span>
      <span class="n">double</span> <span class="n">i</span><span class="p">;</span>
      <span class="n">double</span> <span class="n">j</span><span class="p">;</span>
      <span class="n">double</span> <span class="n">k</span><span class="p">;</span>
      <span class="n">double</span> <span class="n">kk</span><span class="p">;</span>
      <span class="n">double</span> <span class="n">stg</span><span class="p">[</span><span class="mi">6</span><span class="p">];</span>
      <span class="n">double</span> <span class="n">delay</span><span class="p">[</span><span class="mi">6</span><span class="p">];</span>
      <span class="n">double</span> <span class="n">tanhstg</span><span class="p">[</span><span class="mi">6</span><span class="p">];</span>
    <span class="p">};</span>
<span class="p">]]</span>

<span class="kd">local</span> <span class="n">moogladder_ct</span> <span class="o">=</span> <span class="n">ffi</span><span class="p">.</span><span class="n">typeof</span><span class="p">(</span><span class="s1">'struct moogladder_t *'</span><span class="p">)</span>

<span class="kr">function</span> <span class="nf">moogladder_init</span><span class="p">(</span><span class="n">csound</span><span class="p">,</span> <span class="n">opcode</span><span class="p">,</span> <span class="n">carguments</span><span class="p">)</span>
    <span class="kd">local</span> <span class="n">p</span> <span class="o">=</span> <span class="n">ffi</span><span class="p">.</span><span class="n">cast</span><span class="p">(</span><span class="n">moogladder_ct</span><span class="p">,</span> <span class="n">carguments</span><span class="p">)</span>
    <span class="n">p</span><span class="p">.</span><span class="n">sr</span> <span class="o">=</span> <span class="n">csoundApi</span><span class="p">.</span><span class="n">csoundGetSr</span><span class="p">(</span><span class="n">csound</span><span class="p">)</span>
    <span class="n">p</span><span class="p">.</span><span class="n">ksmps</span> <span class="o">=</span> <span class="n">csoundApi</span><span class="p">.</span><span class="n">csoundGetKsmps</span><span class="p">(</span><span class="n">csound</span><span class="p">)</span>
    <span class="kr">if</span> <span class="n">p</span><span class="p">.</span><span class="n">istor</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span> <span class="kr">then</span>
        <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">5</span> <span class="kr">do</span>
            <span class="n">p</span><span class="p">.</span><span class="n">delay</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mf">0.0</span>
        <span class="kr">end</span>
        <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">3</span> <span class="kr">do</span>
            <span class="n">p</span><span class="p">.</span><span class="n">tanhstg</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mf">0.0</span>
        <span class="kr">end</span>
    <span class="kr">end</span>
    <span class="kr">return</span> <span class="mi">0</span>
<span class="kr">end</span>

<span class="kr">function</span> <span class="nf">moogladder_kontrol</span><span class="p">(</span><span class="n">csound</span><span class="p">,</span> <span class="n">opcode</span><span class="p">,</span> <span class="n">carguments</span><span class="p">)</span>
    <span class="kd">local</span> <span class="n">p</span> <span class="o">=</span> <span class="n">ffi</span><span class="p">.</span><span class="n">cast</span><span class="p">(</span><span class="n">moogladder_ct</span><span class="p">,</span> <span class="n">carguments</span><span class="p">)</span>
    <span class="c1">-- transistor thermal voltage</span>
    <span class="n">p</span><span class="p">.</span><span class="n">thermal</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">/</span> <span class="mf">40000.0</span>
    <span class="kr">if</span> <span class="n">p</span><span class="p">.</span><span class="n">res</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;</span> <span class="mf">0.0</span> <span class="kr">then</span>
        <span class="n">p</span><span class="p">.</span><span class="n">res</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mf">0.0</span>
    <span class="kr">end</span>
    <span class="c1">-- sr is half the actual filter sampling rate</span>
    <span class="n">p</span><span class="p">.</span><span class="n">fc</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">freq</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">/</span> <span class="n">p</span><span class="p">.</span><span class="n">sr</span>
    <span class="n">p</span><span class="p">.</span><span class="n">f</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">fc</span> <span class="o">/</span> <span class="mf">2.0</span>
    <span class="n">p</span><span class="p">.</span><span class="n">fc2</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">fc</span> <span class="o">*</span> <span class="n">p</span><span class="p">.</span><span class="n">fc</span>
    <span class="n">p</span><span class="p">.</span><span class="n">fc3</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">fc2</span> <span class="o">*</span> <span class="n">p</span><span class="p">.</span><span class="n">fc</span>
    <span class="c1">-- frequency &amp; amplitude correction</span>
    <span class="n">p</span><span class="p">.</span><span class="n">fcr</span> <span class="o">=</span> <span class="mf">1.873</span> <span class="o">*</span> <span class="n">p</span><span class="p">.</span><span class="n">fc3</span> <span class="o">+</span> <span class="mf">0.4955</span> <span class="o">*</span> <span class="n">p</span><span class="p">.</span><span class="n">fc2</span> <span class="o">-</span> <span class="mf">0.6490</span> <span class="o">*</span> <span class="n">p</span><span class="p">.</span><span class="n">fc</span> <span class="o">+</span> <span class="mf">0.9988</span>
    <span class="n">p</span><span class="p">.</span><span class="n">acr</span> <span class="o">=</span> <span class="o">-</span><span class="mf">3.9364</span> <span class="o">*</span> <span class="n">p</span><span class="p">.</span><span class="n">fc2</span> <span class="o">+</span> <span class="mf">1.8409</span> <span class="o">*</span> <span class="n">p</span><span class="p">.</span><span class="n">fc</span> <span class="o">+</span> <span class="mf">0.9968</span>
    <span class="c1">-- filter tuning</span>
    <span class="n">p</span><span class="p">.</span><span class="n">tune</span> <span class="o">=</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="nb">math.exp</span><span class="p">(</span><span class="o">-</span><span class="p">(</span><span class="mf">2.0</span> <span class="o">*</span> <span class="nb">math.pi</span> <span class="o">*</span> <span class="n">p</span><span class="p">.</span><span class="n">f</span> <span class="o">*</span> <span class="n">p</span><span class="p">.</span><span class="n">fcr</span><span class="p">)))</span> <span class="o">/</span> <span class="n">p</span><span class="p">.</span><span class="n">thermal</span>
    <span class="n">p</span><span class="p">.</span><span class="n">res4</span> <span class="o">=</span> <span class="mf">4.0</span> <span class="o">*</span> <span class="n">p</span><span class="p">.</span><span class="n">res</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">p</span><span class="p">.</span><span class="n">acr</span>
    <span class="c1">-- Nested 'for' loops crash, not sure why.</span>
    <span class="c1">-- Local loop variables also are problematic.</span>
    <span class="c1">-- Lower-level loop constructs don't crash.</span>
    <span class="n">p</span><span class="p">.</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="kr">while</span> <span class="n">p</span><span class="p">.</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">p</span><span class="p">.</span><span class="n">ksmps</span> <span class="kr">do</span>
        <span class="n">p</span><span class="p">.</span><span class="n">j</span> <span class="o">=</span> <span class="mi">0</span>
        <span class="kr">while</span> <span class="n">p</span><span class="p">.</span><span class="n">j</span> <span class="o">&lt;</span> <span class="mi">2</span> <span class="kr">do</span>
            <span class="n">p</span><span class="p">.</span><span class="n">k</span> <span class="o">=</span> <span class="mi">0</span>
            <span class="kr">while</span> <span class="n">p</span><span class="p">.</span><span class="n">k</span> <span class="o">&lt;</span> <span class="mi">4</span> <span class="kr">do</span>
                <span class="kr">if</span> <span class="n">p</span><span class="p">.</span><span class="n">k</span> <span class="o">==</span> <span class="mi">0</span> <span class="kr">then</span>
                    <span class="n">p</span><span class="p">.</span><span class="n">input</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">inp</span><span class="p">[</span><span class="n">p</span><span class="p">.</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="n">p</span><span class="p">.</span><span class="n">res4</span> <span class="o">*</span> <span class="n">p</span><span class="p">.</span><span class="n">delay</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span>
                    <span class="n">p</span><span class="p">.</span><span class="n">stg</span><span class="p">[</span><span class="n">p</span><span class="p">.</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">delay</span><span class="p">[</span><span class="n">p</span><span class="p">.</span><span class="n">k</span><span class="p">]</span> <span class="o">+</span> <span class="n">p</span><span class="p">.</span><span class="n">tune</span> <span class="o">*</span> <span class="p">(</span><span class="nb">math.tanh</span><span class="p">(</span><span class="n">p</span><span class="p">.</span><span class="n">input</span> <span class="o">*</span> <span class="n">p</span><span class="p">.</span><span class="n">thermal</span><span class="p">)</span> <span class="o">-</span> <span class="n">p</span><span class="p">.</span><span class="n">tanhstg</span><span class="p">[</span><span class="n">p</span><span class="p">.</span><span class="n">k</span><span class="p">])</span>
                <span class="kr">else</span>
                    <span class="n">p</span><span class="p">.</span><span class="n">input</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">stg</span><span class="p">[</span><span class="n">p</span><span class="p">.</span><span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
                    <span class="n">p</span><span class="p">.</span><span class="n">tanhstg</span><span class="p">[</span><span class="n">p</span><span class="p">.</span><span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nb">math.tanh</span><span class="p">(</span><span class="n">p</span><span class="p">.</span><span class="n">input</span> <span class="o">*</span> <span class="n">p</span><span class="p">.</span><span class="n">thermal</span><span class="p">)</span>
                    <span class="kr">if</span> <span class="n">p</span><span class="p">.</span><span class="n">k</span> <span class="o">&lt;</span> <span class="mi">3</span> <span class="kr">then</span>
                        <span class="n">p</span><span class="p">.</span><span class="n">kk</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">tanhstg</span><span class="p">[</span><span class="n">p</span><span class="p">.</span><span class="n">k</span><span class="p">]</span>
                    <span class="kr">else</span>
                        <span class="n">p</span><span class="p">.</span><span class="n">kk</span> <span class="o">=</span> <span class="nb">math.tanh</span><span class="p">(</span><span class="n">p</span><span class="p">.</span><span class="n">delay</span><span class="p">[</span><span class="n">p</span><span class="p">.</span><span class="n">k</span><span class="p">]</span> <span class="o">*</span> <span class="n">p</span><span class="p">.</span><span class="n">thermal</span><span class="p">)</span>
                    <span class="kr">end</span>
                    <span class="n">p</span><span class="p">.</span><span class="n">stg</span><span class="p">[</span><span class="n">p</span><span class="p">.</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">delay</span><span class="p">[</span><span class="n">p</span><span class="p">.</span><span class="n">k</span><span class="p">]</span> <span class="o">+</span> <span class="n">p</span><span class="p">.</span><span class="n">tune</span> <span class="o">*</span> <span class="p">(</span><span class="n">p</span><span class="p">.</span><span class="n">tanhstg</span><span class="p">[</span><span class="n">p</span><span class="p">.</span><span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">p</span><span class="p">.</span><span class="n">kk</span><span class="p">)</span>
                <span class="kr">end</span>
                <span class="n">p</span><span class="p">.</span><span class="n">delay</span><span class="p">[</span><span class="n">p</span><span class="p">.</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">stg</span><span class="p">[</span><span class="n">p</span><span class="p">.</span><span class="n">k</span><span class="p">]</span>
                <span class="n">p</span><span class="p">.</span><span class="n">k</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">k</span> <span class="o">+</span> <span class="mi">1</span>
            <span class="kr">end</span>
            <span class="c1">-- 1/2-sample delay for phase compensation</span>
            <span class="n">p</span><span class="p">.</span><span class="n">delay</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">p</span><span class="p">.</span><span class="n">stg</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">+</span> <span class="n">p</span><span class="p">.</span><span class="n">delay</span><span class="p">[</span><span class="mi">4</span><span class="p">])</span> <span class="o">*</span> <span class="mf">0.5</span>
            <span class="n">p</span><span class="p">.</span><span class="n">delay</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">stg</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
            <span class="n">p</span><span class="p">.</span><span class="n">j</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">j</span> <span class="o">+</span> <span class="mi">1</span>
        <span class="kr">end</span>
        <span class="n">p</span><span class="p">.</span><span class="n">out</span><span class="p">[</span><span class="n">p</span><span class="p">.</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">delay</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span>
        <span class="n">p</span><span class="p">.</span><span class="n">i</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span>
    <span class="kr">end</span>
    <span class="kr">return</span> <span class="mi">0</span>
<span class="kr">end</span>
<span class="s">}}</span>

<span class="cm">/*
Moogladder - An improved implementation of the Moog ladder filter

DESCRIPTION
This is an new digital implementation of the Moog ladder filter based on the work of Antti Huovilainen,
described in the paper \"Non-Linear Digital Implementation of the Moog Ladder Filter\" (Proceedings of DaFX04, Univ of Napoli).
This implementation is probably a more accurate digital representation of the original analogue filter.
This is version 2 (revised 14/DEC/04), with improved amplitude/resonance scaling and frequency correction using a couple of polynomials,as suggested by Antti.

SYNTAX
ar  Moogladder  asig, kcf, kres

PERFORMANCE
asig - input signal
kcf - cutoff frequency (Hz)
kres - resonance (0 - 1).

CREDITS
Victor Lazzarini
*/</span>

                    <span class="kd">opcode</span>  <span class="nf">moogladderu</span><span class="p">,</span> <span class="kt">a</span><span class="p">,</span> <span class="kt">akk</span>
a<span class="n">sig</span><span class="p">,</span> k<span class="n">cf</span><span class="p">,</span> k<span class="n">res</span>     <span class="nb">xin</span>
                    <span class="nb">setksmps</span>    <span class="mi">1</span>
i<span class="n">pi</span>                 <span class="o">=</span>           <span class="mi">4</span> <span class="o">*</span> <span class="nb">taninv</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="cm">/* filter delays */</span>
a<span class="n">z1</span>                 <span class="nb">init</span>        <span class="mi">0</span>
a<span class="n">z2</span>                 <span class="nb">init</span>        <span class="mi">0</span>
a<span class="n">z3</span>                 <span class="nb">init</span>        <span class="mi">0</span>
a<span class="n">z4</span>                 <span class="nb">init</span>        <span class="mi">0</span>
a<span class="n">z5</span>                 <span class="nb">init</span>        <span class="mi">0</span>
a<span class="n">y4</span>                 <span class="nb">init</span>        <span class="mi">0</span>
a<span class="n">mf</span>                 <span class="nb">init</span>        <span class="mi">0</span>
                    <span class="k">if</span>          k<span class="n">res</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">then</span>
k<span class="n">res</span>                <span class="o">=</span>           <span class="mi">1</span>
                    <span class="k">elseif</span>      k<span class="n">res</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="k">then</span>
k<span class="n">res</span>                <span class="o">=</span>           <span class="mi">0</span>
                    <span class="k">endif</span>
<span class="cm">/* twice the \'thermal voltage of a transistor\' */</span>
i<span class="n">2v</span>                 <span class="o">=</span>           <span class="mi">40000</span>
<span class="cm">/* sr is half the actual filter sampling rate  */</span>
k<span class="n">fc</span>                 <span class="o">=</span>           k<span class="n">cf</span><span class="o">/</span><span class="vg">sr</span>
k<span class="n">f</span>                  <span class="o">=</span>           k<span class="n">cf</span><span class="o">/</span><span class="p">(</span><span class="vg">sr</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span>
<span class="cm">/* frequency &amp; amplitude correction  */</span>
k<span class="n">fcr</span>                <span class="o">=</span>           <span class="mf">1.8730</span> <span class="o">*</span> <span class="p">(</span>k<span class="n">fc</span><span class="o">^</span><span class="mi">3</span><span class="p">)</span> <span class="o">+</span> <span class="mf">0.4955</span> <span class="o">*</span> <span class="p">(</span>k<span class="n">fc</span><span class="o">^</span><span class="mi">2</span><span class="p">)</span> <span class="o">-</span> <span class="mf">0.6490</span> <span class="o">*</span> k<span class="n">fc</span> <span class="o">+</span> <span class="mf">0.9988</span>
k<span class="n">acr</span>                <span class="o">=</span>           <span class="o">-</span><span class="mf">3.9364</span> <span class="o">*</span> <span class="p">(</span>k<span class="n">fc</span><span class="o">^</span><span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="mf">1.8409</span> <span class="o">*</span> k<span class="n">fc</span> <span class="o">+</span> <span class="mf">0.9968</span><span class="c1">;</span>
<span class="cm">/* filter tuning  */</span>
k<span class="n">2vg</span>                <span class="o">=</span>           i<span class="n">2v</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="nb">exp</span><span class="p">(</span><span class="o">-</span><span class="mi">2</span> <span class="o">*</span> i<span class="n">pi</span> <span class="o">*</span> k<span class="n">fcr</span> <span class="o">*</span> k<span class="n">f</span><span class="p">))</span>
<span class="cm">/* cascade of 4 1st order sections         */</span>
a<span class="n">y1</span>                 <span class="o">=</span>           a<span class="n">z1</span> <span class="o">+</span> k<span class="n">2vg</span> <span class="o">*</span> <span class="p">(</span><span class="nb">tanh</span><span class="p">((</span>a<span class="n">sig</span> <span class="o">-</span> <span class="mi">4</span> <span class="o">*</span> k<span class="n">res</span> <span class="o">*</span> a<span class="n">mf</span> <span class="o">*</span> k<span class="n">acr</span><span class="p">)</span> <span class="o">/</span> i<span class="n">2v</span><span class="p">)</span> <span class="o">-</span> <span class="nb">tanh</span><span class="p">(</span>a<span class="n">z1</span> <span class="o">/</span> i<span class="n">2v</span><span class="p">))</span>
a<span class="n">z1</span>                 <span class="o">=</span>           a<span class="n">y1</span>
a<span class="n">y2</span>                 <span class="o">=</span>           a<span class="n">z2</span> <span class="o">+</span> k<span class="n">2vg</span> <span class="o">*</span> <span class="p">(</span><span class="nb">tanh</span><span class="p">(</span>a<span class="n">y1</span> <span class="o">/</span> i<span class="n">2v</span><span class="p">)</span> <span class="o">-</span> <span class="nb">tanh</span><span class="p">(</span>a<span class="n">z2</span> <span class="o">/</span> i<span class="n">2v</span> <span class="p">))</span>
a<span class="n">z2</span>                 <span class="o">=</span>           a<span class="n">y2</span>
a<span class="n">y3</span>                 <span class="o">=</span>           a<span class="n">z3</span> <span class="o">+</span> k<span class="n">2vg</span> <span class="o">*</span> <span class="p">(</span><span class="nb">tanh</span><span class="p">(</span>a<span class="n">y2</span> <span class="o">/</span> i<span class="n">2v</span><span class="p">)</span> <span class="o">-</span> <span class="nb">tanh</span><span class="p">(</span>a<span class="n">z3</span> <span class="o">/</span> i<span class="n">2v</span><span class="p">))</span>
a<span class="n">z3</span>                 <span class="o">=</span>           a<span class="n">y3</span>
a<span class="n">y4</span>                 <span class="o">=</span>           a<span class="n">z4</span> <span class="o">+</span> k<span class="n">2vg</span> <span class="o">*</span> <span class="p">(</span><span class="nb">tanh</span><span class="p">(</span>a<span class="n">y3</span> <span class="o">/</span> i<span class="n">2v</span><span class="p">)</span> <span class="o">-</span> <span class="nb">tanh</span><span class="p">(</span>a<span class="n">z4</span> <span class="o">/</span> i<span class="n">2v</span><span class="p">))</span>
a<span class="n">z4</span>                 <span class="o">=</span>           a<span class="n">y4</span>
<span class="cm">/* 1/2-sample delay for phase compensation  */</span>
a<span class="n">mf</span>                 <span class="o">=</span>           <span class="p">(</span>a<span class="n">y4</span> <span class="o">+</span> a<span class="n">z5</span><span class="p">)</span> <span class="o">*</span><span class="mf">0.5</span>
a<span class="n">z5</span>                 <span class="o">=</span>           a<span class="n">y4</span>
<span class="cm">/* oversampling  */</span>
a<span class="n">y1</span>                 <span class="o">=</span>           a<span class="n">z1</span> <span class="o">+</span> k<span class="n">2vg</span> <span class="o">*</span> <span class="p">(</span><span class="nb">tanh</span><span class="p">((</span>a<span class="n">sig</span> <span class="o">-</span> <span class="mi">4</span> <span class="o">*</span> k<span class="n">res</span> <span class="o">*</span> a<span class="n">mf</span> <span class="o">*</span> k<span class="n">acr</span><span class="p">)</span> <span class="o">/</span> i<span class="n">2v</span><span class="p">)</span> <span class="o">-</span> <span class="nb">tanh</span><span class="p">(</span>a<span class="n">z1</span> <span class="o">/</span> i<span class="n">2v</span><span class="p">))</span>
a<span class="n">z1</span>                 <span class="o">=</span>           a<span class="n">y1</span>
a<span class="n">y2</span>                 <span class="o">=</span>           a<span class="n">z2</span> <span class="o">+</span> k<span class="n">2vg</span> <span class="o">*</span> <span class="p">(</span><span class="nb">tanh</span><span class="p">(</span>a<span class="n">y1</span> <span class="o">/</span> i<span class="n">2v</span><span class="p">)</span> <span class="o">-</span> <span class="nb">tanh</span><span class="p">(</span>a<span class="n">z2</span> <span class="o">/</span> i<span class="n">2v</span> <span class="p">))</span>
a<span class="n">z2</span>                 <span class="o">=</span>           a<span class="n">y2</span>
a<span class="n">y3</span>                 <span class="o">=</span>           a<span class="n">z3</span> <span class="o">+</span> k<span class="n">2vg</span> <span class="o">*</span> <span class="p">(</span><span class="nb">tanh</span><span class="p">(</span>a<span class="n">y2</span> <span class="o">/</span> i<span class="n">2v</span><span class="p">)</span> <span class="o">-</span> <span class="nb">tanh</span><span class="p">(</span>a<span class="n">z3</span> <span class="o">/</span> i<span class="n">2v</span><span class="p">))</span>
a<span class="n">z3</span>                 <span class="o">=</span>           a<span class="n">y3</span>
a<span class="n">y4</span>                 <span class="o">=</span>           a<span class="n">z4</span> <span class="o">+</span> k<span class="n">2vg</span> <span class="o">*</span> <span class="p">(</span><span class="nb">tanh</span><span class="p">(</span>a<span class="n">y3</span> <span class="o">/</span> i<span class="n">2v</span><span class="p">)</span> <span class="o">-</span> <span class="nb">tanh</span><span class="p">(</span>a<span class="n">z4</span> <span class="o">/</span> i<span class="n">2v</span><span class="p">))</span>
a<span class="n">z4</span>                 <span class="o">=</span>           a<span class="n">y4</span>
a<span class="n">mf</span>                 <span class="o">=</span>           <span class="p">(</span>a<span class="n">y4</span> <span class="o">+</span> a<span class="n">z5</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.5</span>
a<span class="n">z5</span>                 <span class="o">=</span>           a<span class="n">y4</span>
                    <span class="nb">xout</span>        a<span class="n">mf</span>
                    <span class="kd">endop</span>

<span class="kd">instr</span> <span class="nf">1</span>
                <span class="nb">prints</span>      <span class="s">"No filter.</span><span class="se">\n</span><span class="s">"</span>
	k<span class="n">fe</span>         <span class="nb">expseg</span>      <span class="mi">500</span><span class="p">,</span> <span class="nb">p3</span><span class="o">*</span><span class="mf">0.9</span><span class="p">,</span> <span class="mi">1800</span><span class="p">,</span> <span class="nb">p3</span><span class="o">*</span><span class="mf">0.1</span><span class="p">,</span> <span class="mi">3000</span>
    k<span class="n">env</span>        <span class="nb">linen</span>       <span class="mi">10000</span><span class="p">,</span> <span class="mf">0.05</span><span class="p">,</span> <span class="nb">p3</span><span class="p">,</span> <span class="mf">0.05</span>
    a<span class="n">sig</span>        <span class="nb">buzz</span>        k<span class="n">env</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="vg">sr</span><span class="o">/</span><span class="p">(</span><span class="mi">200</span><span class="p">),</span> <span class="mi">1</span>
    <span class="c1">; afil      moogladder  asig, kfe, 1</span>
                <span class="nb">out</span>         a<span class="n">sig</span>
<span class="kd">endin</span>

<span class="kd">instr</span> <span class="nf">2</span>
                <span class="nb">prints</span>      <span class="s">"Native moogladder.</span><span class="se">\n</span><span class="s">"</span>
	k<span class="n">fe</span>         <span class="nb">expseg</span>      <span class="mi">500</span><span class="p">,</span> <span class="nb">p3</span><span class="o">*</span><span class="mf">0.9</span><span class="p">,</span> <span class="mi">1800</span><span class="p">,</span> <span class="nb">p3</span><span class="o">*</span><span class="mf">0.1</span><span class="p">,</span> <span class="mi">3000</span>
    k<span class="n">env</span>        <span class="nb">linen</span>       <span class="mi">10000</span><span class="p">,</span> <span class="mf">0.05</span><span class="p">,</span> <span class="nb">p3</span><span class="p">,</span> <span class="mf">0.05</span>
    a<span class="n">sig</span>        <span class="nb">buzz</span>        k<span class="n">env</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="vg">sr</span><span class="o">/</span><span class="p">(</span><span class="mi">200</span><span class="p">),</span> <span class="mi">1</span>
    a<span class="n">fil</span>        <span class="nb">moogladder</span>  a<span class="n">sig</span><span class="p">,</span> k<span class="n">fe</span><span class="p">,</span> <span class="mi">1</span>
                <span class="nb">out</span>         a<span class="n">fil</span>
<span class="kd">endin</span>

<span class="kd">instr</span> <span class="nf">3</span>
                <span class="nb">prints</span>      <span class="s">"UDO moogladder.</span><span class="se">\n</span><span class="s">"</span>
	k<span class="n">fe</span>         <span class="nb">expseg</span>      <span class="mi">500</span><span class="p">,</span> <span class="nb">p3</span><span class="o">*</span><span class="mf">0.9</span><span class="p">,</span> <span class="mi">1800</span><span class="p">,</span> <span class="nb">p3</span><span class="o">*</span><span class="mf">0.1</span><span class="p">,</span> <span class="mi">3000</span>
    k<span class="n">env</span>        <span class="nb">linen</span>       <span class="mi">10000</span><span class="p">,</span> <span class="mf">0.05</span><span class="p">,</span> <span class="nb">p3</span><span class="p">,</span> <span class="mf">0.05</span>
    a<span class="n">sig</span>        <span class="nb">buzz</span>        k<span class="n">env</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="vg">sr</span><span class="o">/</span><span class="p">(</span><span class="mi">200</span><span class="p">),</span> <span class="mi">1</span>
    a<span class="n">fil</span>        <span class="nf">moogladderu</span> a<span class="n">sig</span><span class="p">,</span> k<span class="n">fe</span><span class="p">,</span> <span class="mi">1</span>
                <span class="nb">out</span>         a<span class="n">fil</span>
<span class="kd">endin</span>

<span class="kd">instr</span> <span class="nf">4</span>
                <span class="nb">prints</span>      <span class="s">"Lua moogladder.</span><span class="se">\n</span><span class="s">"</span>
    k<span class="n">res</span>        <span class="nb">init</span>        <span class="mi">1</span>
    i<span class="n">stor</span>       <span class="nb">init</span>        <span class="mi">0</span>
	k<span class="n">fe</span>         <span class="nb">expseg</span>      <span class="mi">500</span><span class="p">,</span> <span class="nb">p3</span><span class="o">*</span><span class="mf">0.9</span><span class="p">,</span> <span class="mi">1800</span><span class="p">,</span> <span class="nb">p3</span><span class="o">*</span><span class="mf">0.1</span><span class="p">,</span> <span class="mi">3000</span>
    k<span class="n">env</span>        <span class="nb">linen</span>       <span class="mi">10000</span><span class="p">,</span> <span class="mf">0.05</span><span class="p">,</span> <span class="nb">p3</span><span class="p">,</span> <span class="mf">0.05</span>
    a<span class="n">sig</span>        <span class="nb">buzz</span>        k<span class="n">env</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="vg">sr</span><span class="o">/</span><span class="p">(</span><span class="mi">200</span><span class="p">),</span> <span class="mi">1</span>
    a<span class="n">fil</span>        <span class="nb">init</span>        <span class="mi">0</span>
                <span class="nb">lua_ikopcall</span>    <span class="s">"moogladder"</span><span class="p">,</span> a<span class="n">fil</span><span class="p">,</span> a<span class="n">sig</span><span class="p">,</span> k<span class="n">fe</span><span class="p">,</span> k<span class="n">res</span><span class="p">,</span> i<span class="n">stor</span>
                <span class="nb">out</span>         a<span class="n">fil</span>
<span class="kd">endin</span>

<span class="kd">instr</span> <span class="nf">5</span>
    gi<span class="n">ended</span>     <span class="nb">rtclock</span>
    i<span class="n">elapsed</span>    <span class="o">=</span>           gi<span class="n">ended</span> <span class="o">-</span> gi<span class="n">began</span>
                <span class="nb">print</span>       i<span class="n">elapsed</span>
    gi<span class="n">began</span>     <span class="nb">rtclock</span>
<span class="kd">endin</span>

<span class="nt">&lt;/CsInstruments&gt;</span>

<span class="nt">&lt;CsScore&gt;</span>
<span class="nb">f</span> <span class="mi">1</span>     <span class="mi">0</span> <span class="mi">65536</span> <span class="mi">10</span> <span class="mi">1</span>
<span class="nb">i</span> <span class="mf">5.1</span>   <span class="mi">0</span>   <span class="mi">1</span>
<span class="nb">i</span> <span class="mi">4</span>     <span class="mi">1</span>   <span class="mi">20</span>
<span class="nb">i</span> <span class="mf">5.2</span>   <span class="mi">21</span>  <span class="mi">1</span>
<span class="nb">i</span> <span class="mi">4</span>     <span class="mi">22</span>  <span class="mi">20</span>
<span class="nb">i</span> <span class="mf">5.3</span>   <span class="mi">42</span>  <span class="mi">1</span>
<span class="nb">i</span> <span class="mi">2</span>     <span class="mi">43</span>  <span class="mi">20</span>
<span class="nb">i</span> <span class="mf">5.4</span>   <span class="mi">63</span>  <span class="mi">1</span>
<span class="nb">i</span> <span class="mi">2</span>     <span class="mi">64</span>  <span class="mi">20</span>
<span class="nb">i</span> <span class="mf">5.5</span>   <span class="mi">84</span>  <span class="mi">1</span>
<span class="nb">i</span> <span class="mi">3</span>     <span class="mi">85</span>  <span class="mi">20</span>
<span class="nb">i</span> <span class="mf">5.6</span>   <span class="mi">105</span> <span class="mi">1</span>
<span class="nb">i</span> <span class="mi">3</span>     <span class="mi">106</span> <span class="mi">20</span>
<span class="nb">i</span> <span class="mf">5.7</span>   <span class="mi">126</span> <span class="mi">1</span>
<span class="nb">i</span> <span class="mi">1</span>     <span class="mi">127</span> <span class="mi">20</span>
<span class="nb">i</span> <span class="mf">5.8</span>   <span class="mi">147</span> <span class="mi">1</span>
<span class="nb">i</span> <span class="mi">1</span>     <span class="mi">148</span> <span class="mi">20</span>
<span class="nb">i</span> <span class="mf">5.9</span>   <span class="mi">168</span> <span class="mi">1</span>
<span class="nb">i</span> <span class="mi">4</span>     <span class="mi">169</span> <span class="mi">20</span>
<span class="nb">i</span> <span class="mi">4</span>     <span class="mi">170</span> <span class="mi">20</span>
<span class="nb">i</span> <span class="mi">4</span>     <span class="mi">171</span> <span class="mi">20</span>
<span class="nb">e</span>
<span class="nt">&lt;/CsScore&gt;</span>

<span class="nt">&lt;/CsoundSynthesizer&gt;</span>
</pre>
            </div>
          </div>
        </div>
        <p><br class="example-break" />
        </p>
      </div>
      <div class="refsect1">
        <a id="idm281472916898888"></a>
        <h2>
            See Also
        </h2>
        <p>
            <a class="link" href="lua_exec.html" title="lua_exec"><em class="citetitle">lua_exec</em></a>, 
            <a class="link" href="lua_opcall.html" title="lua_opcall"><em class="citetitle">lua_opcall</em></a>. 
        </p>
      </div>
      <div class="refsect1">
        <a id="idm281472916895832"></a>
        <h2>
            Credits
        </h2>
        <p>
            By: Michael Gogins 2011
        </p>
        <p>
            New in Csound version 5.13.2
        </p>
      </div>
    </div>
    <div class="navfooter">
      <hr />
      <table width="100%" summary="Navigation footer">
        <tr>
          <td width="40%" align="left"><a accesskey="p" href="lua_exec.html">Prev</a> </td>
          <td width="20%" align="center">
            <a accesskey="u" href="OpcodesTop.html">Up</a>
          </td>
          <td width="40%" align="right"> <a accesskey="n" href="lua_opcall.html">Next</a></td>
        </tr>
        <tr>
          <td width="40%" align="left" valign="top">
            lua_exec
         </td>
          <td width="20%" align="center">
            <a accesskey="h" href="index.html">Home</a>
          </td>
          <td width="40%" align="right" valign="top"> 
            lua_opcall
        </td>
        </tr>
      </table>
    </div>
  </body>
</html>