<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="http://jakearaujo-simon.com/feed.xml" rel="self" type="application/atom+xml" /><link href="http://jakearaujo-simon.com/" rel="alternate" type="text/html" /><updated>2026-04-13T13:33:56+00:00</updated><id>http://jakearaujo-simon.com/feed.xml</id><title type="html">something</title><subtitle></subtitle><entry><title type="html">basic elixir network with C port interface</title><link href="http://jakearaujo-simon.com/jekyll/update/2019/09/09/basic_elixir_network_with_C_port_interface.html" rel="alternate" type="text/html" title="basic elixir network with C port interface" /><published>2019-09-09T18:31:13+00:00</published><updated>2019-09-09T18:31:13+00:00</updated><id>http://jakearaujo-simon.com/jekyll/update/2019/09/09/basic_elixir_network_with_C_port_interface</id><content type="html" xml:base="http://jakearaujo-simon.com/jekyll/update/2019/09/09/basic_elixir_network_with_C_port_interface.html"><![CDATA[<p>Here I present a prototypical concurrent client-server network in Erlang/Elixir that interfaces with a C program via ports. Basic componentry needed to achieve message-passing between client and server (and their respective C program fragments) is shown. Some remarks are made on properties of BEAM (Erlang Abstract Machine)-based languages that make them uniquely well-suited to massively scalable concurrent network architectures.</p>

<p><em>Under Construction!</em></p>

<figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="k">defmodule</span> <span class="no">Server</span> <span class="k">do</span>
  <span class="nv">@server_name</span> <span class="ss">:"server@12.34.56.78"</span>
  <span class="k">def</span> <span class="n">start</span> <span class="k">do</span>
    <span class="no">Node</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="nv">@server_name</span><span class="p">)</span>
    <span class="no">Node</span><span class="o">.</span><span class="n">set_cookie</span> <span class="ss">:asdf</span>
    <span class="ss">:global</span><span class="o">.</span><span class="n">register_name</span><span class="p">(</span><span class="no">Node</span><span class="o">.</span><span class="n">self</span><span class="p">(),</span> <span class="n">self</span><span class="p">())</span>
    <span class="no">IO</span><span class="o">.</span><span class="n">puts</span> <span class="s2">"Server is at "</span> <span class="o">&lt;&gt;</span> <span class="n">inspect</span> <span class="ss">:global</span><span class="o">.</span><span class="n">whereis_name</span><span class="p">(</span><span class="no">Node</span><span class="o">.</span><span class="n">self</span><span class="p">())</span>
    <span class="no">IO</span><span class="o">.</span><span class="n">puts</span> <span class="no">Node</span><span class="o">.</span><span class="n">self</span>
    <span class="k">receive</span> <span class="k">do</span>
      <span class="p">{</span><span class="n">first_client_name</span><span class="p">,</span> <span class="ss">:get_started</span><span class="p">}</span> <span class="o">-&gt;</span> <span class="n">go</span><span class="p">([</span><span class="n">first_client_name</span><span class="p">])</span>
    <span class="k">end</span>
  <span class="k">end</span>

  <span class="k">defp</span> <span class="n">go</span><span class="p">(</span><span class="n">client_names</span><span class="p">)</span> <span class="k">do</span>
    <span class="no">IO</span><span class="o">.</span><span class="n">puts</span> <span class="s2">"It's go time!"</span>
    <span class="n">execute_loop</span><span class="p">(</span><span class="n">client_names</span><span class="p">,</span> <span class="n">port_open</span><span class="p">())</span>
  <span class="k">end</span>
  
  <span class="k">defp</span> <span class="n">port_open</span> <span class="k">do</span>
    <span class="no">Port</span><span class="o">.</span><span class="n">open</span><span class="p">({</span><span class="ss">:spawn</span><span class="p">,</span> <span class="s2">"./simulation"</span><span class="p">},</span> <span class="p">[</span><span class="ss">:binary</span><span class="p">])</span>
  <span class="k">end</span>
  
  <span class="k">defp</span> <span class="n">execute_loop</span><span class="p">(</span><span class="n">client_names</span><span class="p">,</span> <span class="n">sim_port</span><span class="p">)</span> <span class="k">do</span>
    <span class="k">receive</span> <span class="k">do</span>
      <span class="p">{</span><span class="n">port</span><span class="p">,</span> <span class="p">{</span><span class="ss">:data</span><span class="p">,</span> <span class="s2">"Done</span><span class="se">\n</span><span class="s2">"</span><span class="p">}}</span> <span class="o">-&gt;</span>
	<span class="n">send</span><span class="p">(</span><span class="n">port</span><span class="p">,</span> <span class="p">{</span><span class="n">self</span><span class="p">(),</span> <span class="ss">:close</span><span class="p">})</span>
      <span class="p">{</span><span class="n">port</span><span class="p">,</span> <span class="p">{</span><span class="ss">:data</span><span class="p">,</span> <span class="s2">"Starting up</span><span class="se">\n</span><span class="s2">"</span><span class="p">}}</span> <span class="o">-&gt;</span>
	<span class="no">IO</span><span class="o">.</span><span class="n">puts</span> <span class="s2">"Starting up"</span>
	<span class="n">execute_loop</span><span class="p">(</span><span class="n">client_names</span><span class="p">,</span> <span class="n">sim_port</span><span class="p">)</span>
      <span class="p">{</span><span class="n">port</span><span class="p">,</span> <span class="p">{</span><span class="ss">:data</span><span class="p">,</span> <span class="n">data</span><span class="p">}}</span> <span class="o">-&gt;</span>
      	<span class="c1">#IO.puts "data from port"</span>
	<span class="no">Enum</span><span class="o">.</span><span class="n">map</span><span class="p">(</span><span class="n">client_names</span><span class="p">,</span> <span class="k">fn</span> <span class="n">name</span> <span class="o">-&gt;</span>
	<span class="c1">#  IO.puts "sending to #{name}"</span>
	  <span class="n">pid</span> <span class="o">=</span> <span class="ss">:global</span><span class="o">.</span><span class="n">whereis_name</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
	  <span class="k">if</span> <span class="n">pid</span> <span class="o">!=</span> <span class="ss">:undefined</span> <span class="k">do</span>
	    <span class="n">send</span><span class="p">(</span><span class="n">pid</span><span class="p">,</span> <span class="p">{</span><span class="n">pid</span><span class="p">,</span> <span class="p">{</span><span class="ss">:input</span><span class="p">,</span> <span class="n">data</span><span class="p">}})</span>
	  <span class="k">end</span>
	<span class="k">end</span><span class="p">)</span>
	<span class="n">execute_loop</span><span class="p">(</span><span class="n">client_names</span><span class="p">,</span> <span class="n">sim_port</span><span class="p">)</span>
      <span class="p">{</span><span class="n">pid</span><span class="p">,</span> <span class="p">{</span><span class="ss">:input</span><span class="p">,</span> <span class="n">input</span><span class="p">}}</span> <span class="o">-&gt;</span>
      	<span class="c1">#IO.puts "received"</span>
	<span class="n">send</span><span class="p">(</span><span class="n">sim_port</span><span class="p">,</span> <span class="p">{</span><span class="n">self</span><span class="p">(),</span> <span class="p">{</span><span class="ss">:command</span><span class="p">,</span> <span class="n">input</span><span class="p">}})</span>
        <span class="n">execute_loop</span><span class="p">(</span><span class="n">client_names</span><span class="p">,</span> <span class="n">sim_port</span><span class="p">)</span>
      <span class="p">{</span><span class="n">client_name</span><span class="p">,</span> <span class="ss">:get_started</span><span class="p">}</span> <span class="o">-&gt;</span>
	<span class="n">execute_loop</span><span class="p">(</span><span class="n">client_names</span> <span class="o">++</span> <span class="p">[</span><span class="n">client_name</span><span class="p">],</span> <span class="n">sim_port</span><span class="p">)</span>
      <span class="c1">#_ -&gt;</span>
      <span class="c1">#	:erlang.hibernate(Server, Server.execute_loop, [client_names, sim_port])</span>
    <span class="k">end</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="no">Server</span><span class="o">.</span><span class="n">start</span><span class="p">()</span></code></pre></figure>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[Here I present a prototypical concurrent client-server network in Erlang/Elixir that interfaces with a C program via ports. Basic componentry needed to achieve message-passing between client and server (and their respective C program fragments) is shown. Some remarks are made on properties of BEAM (Erlang Abstract Machine)-based languages that make them uniquely well-suited to massively scalable concurrent network architectures.]]></summary></entry><entry><title type="html">parallel diffusion with OpenMP</title><link href="http://jakearaujo-simon.com/jekyll/update/2019/09/09/parallel_diffusion_with_OpenMP.html" rel="alternate" type="text/html" title="parallel diffusion with OpenMP" /><published>2019-09-09T18:31:13+00:00</published><updated>2019-09-09T18:31:13+00:00</updated><id>http://jakearaujo-simon.com/jekyll/update/2019/09/09/parallel_diffusion_with_OpenMP</id><content type="html" xml:base="http://jakearaujo-simon.com/jekyll/update/2019/09/09/parallel_diffusion_with_OpenMP.html"><![CDATA[<p>A sketch of a scheme for High Performance Computing (HPC) of a simple diffusion problem, using shared-memory parallelism<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup> library, OpenMP. The solution involves concurrent computation, nested parallelism, numerical simulation of a basic wave equation, and asynchronous I/O.</p>

<p>The scheme has three subprocesses: (1) a primary bulk diffusion simulation running in a long loop; (2) an auxiliary interface to handle I/O between bulk simulation and the external environment, and; (3) a set of interprocess coordination mechanisms between bulk and interface processes, which exhibit locking behavior that gaurantees ordered and load-balanced execution of the total process.</p>

<p>In main, we spawn a parallel section, fixing the number of threads, and use an OpenMP sections pragma to control the process execution paths of two threads seperately.</p>

<p><em>Method and structure declarations may be ommitted from exposition.</em></p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
  <span class="c1">// enter parallel region, split on two threads</span>
  <span class="cp">#pragma omp parallel num_threads(2)
</span>  <span class="c1">// note the brackets; good OpenMP practice entails Resource Acquisition is Initialization (RAII) style coding</span>
  <span class="p">{</span>
    <span class="c1">// each section will be executed by only one of the two active threads</span>
    <span class="cp">#pragma omp sections
</span>    <span class="p">{</span>
      <span class="c1">// call the interface and bulk simulation routines one each from the seperate sections.</span>
      <span class="c1">// the integers passed (4 and 38 here) will fix the number of additional threads subsequently spawned using nested parallelism</span>
      <span class="cp">#pragma omp section
</span>      <span class="p">{</span>
        <span class="n">interface</span><span class="p">(</span><span class="mi">4</span><span class="p">);</span>
      <span class="p">}</span> 
      <span class="cp">#pragma omp section
</span>      <span class="p">{</span>
	<span class="n">bulk_sim</span><span class="p">(</span><span class="mi">38</span><span class="p">);</span>
      <span class="p">}</span>
    <span class="p">}</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span></code></pre></figure>

<p>Each routine called in a seperate section will spawn its own parallel region, using nested parallelism. It’s important to know how many cores (or threads, in the case of hyperthreading) are available to provision; if you exceed the provisions, code runtime execution may show massive slowdown, even to speeds and efficiencies far below that of the sequential, non-parallelized version.</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="kt">void</span> <span class="nf">bulk_sim</span><span class="p">(</span><span class="kt">int</span> <span class="n">num_threads</span><span class="p">){</span>
  <span class="cp">#pragma omp parallel default(shared) num_threads(num_threads)
</span>  <span class="p">{</span>
    <span class="c1">// num_cycles is typically a very large number, controlling the number of iterations of your parallel diffusion routine.</span>
    <span class="c1">// this is replacing a while loop, which OpenMP doesn't natively support</span>
    <span class="c1">// (there is in fact a nice post on parallel-for in OpenMP, but I couldn't get the technique shown there working.</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">f</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">f</span> <span class="o">&lt;</span> <span class="n">num_cycles</span><span class="p">;</span> <span class="n">f</span><span class="o">++</span><span class="p">){</span>
      <span class="c1">// primary diffusion code</span>
      <span class="c1">// this is a standard five-point stencil finite difference Laplacian</span>
      <span class="cp">#pragma omp for collapse(2)
</span>      <span class="p">{</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">side_length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
          <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">side_length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">){</span>
            <span class="kt">double</span> <span class="n">laplace</span> <span class="o">=</span> <span class="p">((</span><span class="n">mesh</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span> <span class="o">+</span> <span class="p">(</span><span class="n">mesh</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span> <span class="o">+</span> <span class="p">(</span><span class="n">mesh</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span> <span class="o">+</span> <span class="p">(</span><span class="n">mesh</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span> <span class="o">-</span> <span class="mf">4.0</span> <span class="o">*</span> <span class="n">mesh</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">][</span><span class="mi">0</span><span class="p">]);</span>
            <span class="kt">double</span> <span class="n">height</span> <span class="o">=</span> <span class="p">((</span><span class="mf">2.0</span> <span class="o">*</span> <span class="n">mesh</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span> <span class="o">-</span> <span class="n">mesh</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="p">(</span><span class="n">pow</span><span class="p">((</span><span class="n">waveSpeed</span><span class="p">),</span> <span class="mf">2.0</span><span class="p">)</span> <span class="o">*</span> <span class="n">laplace</span> <span class="o">*</span> <span class="n">dampening</span><span class="p">));</span>
            <span class="n">tempMesh</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">height</span><span class="p">;</span>
          <span class="p">}</span>
        <span class="p">}</span>
      <span class="p">}</span>
      <span class="c1">// update mesh separately</span>
      <span class="cp">#pragma omp for collapse(2)
</span>      <span class="p">{</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">side_length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">){</span>
          <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">side_length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">){</span>
            <span class="n">mesh</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">k</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">tempMesh</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">k</span><span class="p">][</span><span class="mi">0</span><span class="p">];</span>
            <span class="n">mesh</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">k</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">mesh</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">k</span><span class="p">][</span><span class="mi">1</span><span class="p">];</span>
            <span class="n">mesh</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">k</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">mesh</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">k</span><span class="p">][</span><span class="mi">0</span><span class="p">];</span>
          <span class="p">}</span>
        <span class="p">}</span>
      <span class="p">}</span>
      <span class="k">if</span><span class="p">(){</span>
        <span class="cp">#pragma omp for
</span>        <span class="p">{</span>
          <span class="cp">#pragma omp task depend(out: bulk_product)
</span>          <span class="p">{}</span>
        <span class="p">}</span>
      <span class="p">}</span>
      <span class="c1">// put jobs that spawn tasks nearer to the top of the stack in which jobs are issued</span>
      <span class="c1">// so that idle threads begin executing tasks while subsequent tasks spawn and threads are freed/assigned. </span>
      <span class="cp">#pragma omp single
</span>      <span class="p">{</span>
        <span class="c1">// use a depend clause to instantiate dependency between inputs and outputs of tasks concurrently computed by different threads</span>
        <span class="cp">#pragma omp task depend(in: bulk_product)
</span>        <span class="p">{}</span>
      <span class="p">}</span>
      <span class="cp">#pragma omp single nowait
</span>      <span class="p">{}</span>
      <span class="cp">#pragma omp single nowait
</span>      <span class="p">{}</span>
      <span class="cm">/* more single nowait jobs here
         large tasks begun early will be finishing */</span>
      <span class="cp">#pragma omp single
</span>      <span class="p">{}</span> <span class="c1">//the goal being no threads idle at terminus of control flow</span>
    <span class="p">}</span> 
  <span class="p">}</span>
<span class="p">}</span></code></pre></figure>

<p>At the beginning of each cycle, large jobs issue which occupy all threads; in the middle,  threads finish small task chunks at a variety of times; and around the end, numerous small, large, and medium sized jobs are executed. Only at the very end are single-threaded jobs without nowait clauses issued, which instate barriers at which the entire thread team must wait.</p>

<p>By spawning large tasks towards the front of each simulation cycle, we mitigate slowdown due to blocking of thread execution by OpenMP barriers, minimizing the probability that many threads are idle long.</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="kt">void</span> <span class="nf">interface</span><span class="p">(</span><span class="kt">int</span> <span class="n">num_threads</span><span class="p">){</span>
<span class="p">{</span> 
  <span class="k">if</span><span class="p">(</span><span class="n">message_received</span><span class="p">){</span>   
    <span class="c1">//(sequentially) lock resources that will mutate depending on information contained in the input message  			 </span>
    <span class="n">omp_set_lock</span><span class="p">(</span><span class="o">&amp;</span><span class="n">input_lock</span><span class="p">);</span>
    <span class="k">if</span><span class="p">(){</span>  
    <span class="p">}</span>      
    <span class="c1">// unlock the resource(s)</span>
    <span class="n">omp_unset_lock</span><span class="p">(</span><span class="o">&amp;</span><span class="n">input_lock</span><span class="p">);</span>
  <span class="p">}</span>
    <span class="c1">// same for output</span>
  <span class="k">if</span><span class="p">(</span><span class="n">message_ready</span><span class="p">){</span>
    <span class="n">omp_set_lock</span><span class="p">(</span><span class="n">output_lock</span><span class="p">);</span>
    <span class="k">if</span><span class="p">(){</span>
    <span class="p">}</span>
    <span class="n">omp_unset_lock</span><span class="p">(</span><span class="o">&amp;</span><span class="n">output_lock</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">}</span></code></pre></figure>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>Shared-memory parallelism is a model of computation (MOC) where data flows to and from processes that execute instructions in parallel via variables held in shared memory, i.e., which are (un)bound in an ambient namespace (context) of an exterior environment that they mutually inhabit. In the technical literature, this is contrasted to “distributed memory parallelism”, a nominally seperate paradigm where data flows between processes via messages emitted and received at their ports. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[A sketch of a scheme for High Performance Computing (HPC) of a simple diffusion problem, using shared-memory parallelism1 library, OpenMP. The solution involves concurrent computation, nested parallelism, numerical simulation of a basic wave equation, and asynchronous I/O. The scheme has three subprocesses: (1) a primary bulk diffusion simulation running in a long loop; (2) an auxiliary interface to handle I/O between bulk simulation and the external environment, and; (3) a set of interprocess coordination mechanisms between bulk and interface processes, which exhibit locking behavior that gaurantees ordered and load-balanced execution of the total process. In main, we spawn a parallel section, fixing the number of threads, and use an OpenMP sections pragma to control the process execution paths of two threads seperately. Shared-memory parallelism is a model of computation (MOC) where data flows to and from processes that execute instructions in parallel via variables held in shared memory, i.e., which are (un)bound in an ambient namespace (context) of an exterior environment that they mutually inhabit. In the technical literature, this is contrasted to “distributed memory parallelism”, a nominally seperate paradigm where data flows between processes via messages emitted and received at their ports. &#8617;]]></summary></entry><entry><title type="html">on Live Sound</title><link href="http://jakearaujo-simon.com/2019/01/08/On_Live_Sound.html" rel="alternate" type="text/html" title="on Live Sound" /><published>2019-01-08T00:00:00+00:00</published><updated>2019-01-08T00:00:00+00:00</updated><id>http://jakearaujo-simon.com/2019/01/08/On_Live_Sound</id><content type="html" xml:base="http://jakearaujo-simon.com/2019/01/08/On_Live_Sound.html"><![CDATA[<center> <h1> On Live Sound </h1> </center>

<p>In the last century, a transformation which was applied during the industrial revolution to
physical objects, rendering them manufacturable copies, each merely an instance of some
mold, has been applied anew to ephemera, things previously appreciable only as felt
experiences, reducing<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>, for example, the performance of a live orchestra to an infinitely
replicable static binary file.</p>

<p>This transformation, like the one before it, appears as the latest iteration in a series of
transformations, when viewed through the moral-genealogical lens of a narrative that models
the evolution of a culture via the tension between an imagistic, <em>Apollonian</em> force and its sonic,
<em>Dionysian</em> counterpart. Though this may sound fanciful, the dualism between stasis and
dynamics, image and sound, which the entanglement of these two, inextricably linked forces
represents, presents a powerful tool for modeling the zeitgeist of a society, and diagnosing a
disharmony in its composition.</p>

<p>When applied to the last few decades, this interpretive lens magnifies a particular,
emblematic dissonance between the contemporary cyber and physical worlds; that while the
physical world still seems to evolve synchronously, as a single, symphonic gesture, a
confluence of local and global orchestration that everywhere satisfies some deep coherence
condition, and preserves a property of ‘liveness’, the cyber world feels fragmented, a junkyard of
inanimate objects, embedded in disparate environments which do not easily interface or
compose, where processes run asynchronously at different rates, unable to communicate and
interoperate except via brittle, bespoke bridges that fall into disrepair, having no common,
underlying substrate to connect them.</p>

<p>If the industrial revolution divested physical objects of their material provenance, of the
natural link between their constituent materials and the environments from whence those
materials came, and in so doing, dissolved the bond between craftsmen and their handiwork,
then the information revolution has done the same to ephemera, to transient experiences,
divesting them of the very meaning of occurring at particular places and times, annihilating their
spatiotemporal provenance, retaining only the thinnest and lowest-cost of ad-hoc, asynchronous
connectives between isolated, fragmented encodings of experience. The consequence of this
has been the dissolution not only of bonds between creators of ephemera, musicians, and their
music, but also between ephemera and its beholders, audiences.</p>

<p>Whereas in the physical world, sound is live, synchronous, and reactive, in the cyber
world, even virtual environments endowed everywhere with the highest verisimilitude, what is
called sound is not really sound at all, or is <em>dead sound</em>.</p>

<p>Consider that in the implementation of a typical virtual space, such as a game world,
sounds are files, often preloaded, embedded in a logic that determines when, under what
conditions, and with what spectral transformations they are to be triggered for transmission over
a network, and then actuated. The logic that determines this behavior of sound files associates,
to each conjunction of a point in virtual space and moment in virtual time when and where a
listener is present, a file that is either loaded or produced, in real-time or not, using a closed-
form, analytic solution. Such a solution is fixed by geometric invariants and simulated material
properties of the scene, and in environments where it is demanded that what a listener hears
correspond faithfully to what they see, the set of available solutions also constrains the scene
itself, since for the vast majority of possible scenes, closed-form analytic solutions for sound
wave propagation within them are not yet known.</p>

<p>While the advantage of such an approach is its economy of computation, whereby the
evolution of a sonic landscape is computed only when and where it is needed in order to
corroborate a visual scene, there is a deep, philosophical disadvantage; the ad hoc algebraicmanipulations which orchestrate the encoding and emission of sounds cause them to be
actuated, if at all, only upon egress from the virtual world proper, via individual end-user-
interfaces at the boundary of the system, which might transduce them into air. The sound files
never exist in, or affect the virtual world.</p>

<p>The dissonance that exists today between contemporary cyber and physical worlds may not be simply the result of error, which arising due to poor approximation of real-world
phenomena by yet incomplete models will, as our science improves, eventually vanish, so we
inevitably attain a kind of isomorphism between sound in virtual and physical space. Rather,
our current approach to the realization of sound in virtual environments may be unable to
preserve the properties of sound, which give it its intrinsic semantics. For as long as the
imagistic semantics of the virtual world determines its sonic ones, but not vise-versa, it may
attain coherence as a kind of game, composed of ad-hoc relations, but it will never attain the
immanence of the physical world, orchestrated, as it perhaps wholly is, by compositions of live
sound.</p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>This reduction has neither been full, nor faithful. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name></name></author><summary type="html"><![CDATA[On Live Sound]]></summary></entry><entry><title type="html">elementary sinusoidal modeling</title><link href="http://jakearaujo-simon.com/jekyll/update/2018/10/02/elementary_sinusoidal_modeling.html" rel="alternate" type="text/html" title="elementary sinusoidal modeling" /><published>2018-10-02T18:31:13+00:00</published><updated>2018-10-02T18:31:13+00:00</updated><id>http://jakearaujo-simon.com/jekyll/update/2018/10/02/elementary_sinusoidal_modeling</id><content type="html" xml:base="http://jakearaujo-simon.com/jekyll/update/2018/10/02/elementary_sinusoidal_modeling.html"><![CDATA[<p>Elementary sinusoidal modeling with Short-Time Fourier Transform (STFT)-based spectral peak matching and cubic phase interpolation.</p>

<p>C++ library under construction. Code based on the Parshl program <sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>.</p>

<p><br /> <br />
Example of an artistic<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup> output: <a href="https://soundcloud.com/jake-araujo-simon/iris">https://soundcloud.com/jake-araujo-simon/iris</a></p>

<p><br /> <br /></p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p><a href="https://www.dsprelated.com/freebooks/sasp/PARSHL_Program.html">https://www.dsprelated.com/freebooks/sasp/PARSHL_Program.html</a> <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p>The source signal for this was generated using other, perhaps forthcoming software. The signal was modeled in real-time using the C++ ESM library. The model then drove output which was captured using a phone, and then polished using the spectral editing software Spear. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[Elementary sinusoidal modeling with Short-Time Fourier Transform (STFT)-based spectral peak matching and cubic phase interpolation.]]></summary></entry></feed>