<?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 Opcodes</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="PartOpcodesOverview.html" title="Part II. Opcodes Overview" /> <link rel="prev" href="JackoOpcodes.html" title="Jacko Opcodes" /> <link rel="next" href="py.html" title="Python Opcodes" /> </head> <body> <div class="navheader"> <table width="100%" summary="Navigation header"> <tr> <th colspan="3" align="center"> Lua Opcodes </th> </tr> <tr> <td width="20%" align="left"><a accesskey="p" href="JackoOpcodes.html">Prev</a> </td> <th width="60%" align="center">Part II. Opcodes Overview</th> <td width="20%" align="right"> <a accesskey="n" href="py.html">Next</a></td> </tr> </table> <hr /> </div> <div class="chapter"> <div class="titlepage"> <div> <div> <h2 class="title"><a id="lua"></a> Lua Opcodes </h2> </div> </div> </div> <p> The purposes of the Lua opcodes are: </p> <div class="orderedlist"> <ol class="orderedlist" type="1"> <li class="listitem"> Make it possible to write Csound code in a user-friendly, high-level language with full lexical scoping, structures and classes, and support for functional programming, using LuaJIT (the Lua programming language, implemented with a just-in-time compiler and foreign function interface). </li> <li class="listitem"> Require the installation of no third party software packages, or at least a minimum installation; also, require no build system or external compilation. </li> <li class="listitem"> Run <span class="emphasis"><em>really fast</em></span>; typically, almost as fast as compiled C code, and several times faster than user-defined opcodes. </li> </ol> </div> <p> Using the Lua opcode family, you can interact with the Lua interpreter and just-in-time compiler (luajit) embedded in Csound as follows: </p> <div class="orderedlist"> <ol class="orderedlist" type="1"> <li class="listitem"> Execute any arbitrary block of Lua code (the <a class="link" href="lua_exec.html" title="lua_exec"><em class="citetitle">lua_exec</em></a> opcode), </li> <li class="listitem"> Define an opcode in Lua taking any number or type of parameters, and returning any number or type of parameters (the <a class="link" href="lua_opdef.html" title="lua_opdef"><em class="citetitle">lua_opdef</em> </a> opcode), </li> <li class="listitem"> Call a Lua opcode at i-rate (the <a class="link" href="lua_opcall.html" title="lua_opcall"> <em class="citetitle">lua_iopcall</em></a> opcode), </li> <li class="listitem"> Call a Lua opcode at i-rate and k-rate (the <a class="link" href="lua_opcall.html" title="lua_opcall"> <em class="citetitle">lua_ikopcall</em></a> opcods), or </li> <li class="listitem"> Call a Lua opcode at i-rate and a-rate (the <a class="link" href="lua_opcall.html" title="lua_opcall"> <em class="citetitle">lua_iaopcall</em></a> opcode). </li> </ol> </div> <p> Lua is Portuguese for "moon." And Lua (<a class="ulink" href="http://www.lua.org" target="_top"><em class="citetitle">http://www.lua.org</em></a>) is a lightweight, efficient dynamic programming language, designed for embedding in C/C++ and extending with C/C++. Lua has a stack-based calling mechanism and provides a toolkit of features (tables, metatables, anonymous functions, and closures) with which many styles of object-oriented and functional programming may be implemented. Lua's syntax is only slightly harder than Python's. </p> <p> Lua is already one of the fastest dynamic languages; yet LuaJIT by Mike Pall (<a class="ulink" href="http://luajit.org" target="_top"><em class="citetitle">http://luajit.org</em></a>) goes much further, giving Lua a just-in-time optimizing trace compiler for Intel architectures. LuaJIT includes an efficient foreign function interface (FFI) with the ability to define C arrays, structures, and other types in Lua. The speed of LuaJIT/FFI ranges from several times as fast as Lua, to faster (in some contexts) than optimized C. </p> <div class="refsect1"> <a id="idm281472954564264"></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="idm281472954560712"></a> <p class="title"> <strong>Example 12. Example of a Lua opcode. </strong> </p> <div class="example-contents"> <div class="refsect1"> <a id="idm281472791840008"></a> <pre class="programlisting"> <span class="nt"><CsoundSynthesizer></span> <span class="nt"><CsInstruments></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"><</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 & 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"><</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"><</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"><</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"><</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">></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"><</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 & 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"></CsInstruments></span> <span class="nt"><CsScore></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"></CsScore></span> <span class="nt"></CsoundSynthesizer></span> </pre> </div> </div> </div> <p><br class="example-break" /> </p> </div> <h2><a id="idm281472954558920"></a> Credits </h2> <p> Copyright (c) 2011 by Michael Gogins. All rights reserved. </p> </div> <div class="navfooter"> <hr /> <table width="100%" summary="Navigation footer"> <tr> <td width="40%" align="left"><a accesskey="p" href="JackoOpcodes.html">Prev</a> </td> <td width="20%" align="center"> <a accesskey="u" href="PartOpcodesOverview.html">Up</a> </td> <td width="40%" align="right"> <a accesskey="n" href="py.html">Next</a></td> </tr> <tr> <td width="40%" align="left" valign="top">Jacko Opcodes </td> <td width="20%" align="center"> <a accesskey="h" href="index.html">Home</a> </td> <td width="40%" align="right" valign="top"> Python Opcodes</td> </tr> </table> </div> </body> </html>