<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Electronic Ruminations (Posts about logue sdk)</title><link>https://leandrob13.github.io/Electronic-Ruminations/</link><description></description><atom:link href="https://leandrob13.github.io/Electronic-Ruminations/categories/logue-sdk.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2024 &lt;a href="https://github.com/leandrob13"&gt;Leandro B&lt;/a&gt; 
&lt;a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"/&gt;
&lt;/a&gt;
</copyright><lastBuildDate>Sat, 20 Jul 2024 21:19:01 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>NTS-1 Harmonik Oscillator</title><link>https://leandrob13.github.io/Electronic-Ruminations/posts/nts-1-harmonik-oscillator/</link><dc:creator>Leandro B</dc:creator><description>&lt;p&gt;Since I already explored subharmonic sound generation related to the &lt;a href="https://en.wikipedia.org/wiki/Undertone_series"&gt;undertone series&lt;/a&gt; and in the process programmed the &lt;a href="https://leandrob13.github.io/Electronic-Ruminations/posts/subharmonikorg-subharmonic-oscillators-for-the-korg-nts-1"&gt;Subharmonikorg&lt;/a&gt;, a subharmonic oscillator for the nts-1, 
it was time to look into the &lt;a href="https://en.wikipedia.org/wiki/Harmonic_series_(music)"&gt;overtone series&lt;/a&gt;. Also known as the harmonic series, the overtone series is generated by multiplying the fundamental frequency by a series of integer numbers in order to create harmonic relationships from the root note.
Looking into the eurorack synth world, I came across the &lt;a href="http://www.verboselectronics.com/modules/harmonic-oscillator"&gt;Verbos Electronics Harmonic Oscillator&lt;/a&gt; which has an architecture of one main oscillator and seven harmonic oscillators. 
Each harmonic oscillator multiplies the main frequency by its ordered number and has faders that allow the user to set the amplitude of the waves that are going to be added to the fundamental.
The Verbos has more features but I decided to adopt the basic architecture limited to only four harmonics and include a wavefolder.&lt;/p&gt;
&lt;p&gt;I made a post discussing &lt;a href="https://leandrob13.github.io/Electronic-Ruminations/posts/music-synthesis-wave-creation-with-python/"&gt;the principles of creating complex wave forms from adding harmonic sine waves to the fundamental frequency wave&lt;/a&gt;. It is explained step by step in a python jupyter notebook.
Based on those principles, we will be able to compose several harmonic related sine waves and combine them to get interesting timbres.&lt;/p&gt;
&lt;h3&gt;The Harmonik Oscillator&lt;/h3&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p align="center"&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/wFS2HdzoKqY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;p&gt;As mentioned before, the Harmonik oscillator will have one main and four harmonic sine wave oscillators. All of them with level controls for mixing the desired amplitudes in the final wave output. 
Lets start with the definition of the &lt;code&gt;Oscillator&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;typedef&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;enum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;harmonic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;odd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;even&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;octaves&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Spread&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;typedef&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Oscillator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;phases&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;gains&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;drive&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Spread&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;spread&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Oscillator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;Oscillator&lt;/code&gt; struct contains all the data related to the oscillator as a whole. Phase and gain information for the main and harmonic sine waves get processed with each cycle. The indexes of the arrays correspond to each harmonic order with zero being the fundamental, and the rest being the harmonic relationships.&lt;/p&gt;
&lt;p&gt;The harmonic relationships with the main frequency can be set in four different &lt;code&gt;Spread&lt;/code&gt; types: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Harmonic: each sine wave's frequency gets multiplied by its corresponding harmonic integer.&lt;/li&gt;
&lt;li&gt;Odd: each sine wave gets spread apart in odd partials (main frequency multiplied by 3, 5, 7, 9).&lt;/li&gt;
&lt;li&gt;Even: each sine wave gets spread apart in even partials (main frequency multiplied by 2, 4, 6, 8).&lt;/li&gt;
&lt;li&gt;Octaves: each sine wave gets spread by the geometric progression, producing octaves.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The way we achieve this is with the simple function shown below: &lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;partial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spread&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;harmonic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;odd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;even&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;octaves&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In order to complete the additive synthesis combo, I decided to look into implementing a wavefolder. 
After many attempts without satisfying results, I searched for a solution and found an implementation done in C but for VCV rack, you can check it out in &lt;a href="https://github.com/squinkylabs/SquinkyVCV/blob/3a5fbaae4956737c77d0494b69149747c25726af/dsp/utils/AudioMath.h#L162"&gt;squinkylabs github repo&lt;/a&gt;. It doesn't fold the waves the exact way as you would see in VCV rack, but it folds them alright.
Even though I am coding for the nts-1, I didn't change a thing from the original implementation:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;fold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-1.f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;phase&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bias&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.f&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;isEven&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;phase&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isEven&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;fold&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;phase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;fold&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;phase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The Harmonik code can be found &lt;a href="https://github.com/leandrob13/logue-hub/tree/master/harmonik"&gt;here&lt;/a&gt; and the nts-1 oscillator can be downloaded from &lt;a href="https://github.com/leandrob13/logue-hub/releases/tag/harmonik-v1-1-0"&gt;here&lt;/a&gt;. 
A summary of features and parameters is described below:&lt;/p&gt;
&lt;h4&gt;Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Six sine wave oscillators with amplitude control.&lt;/li&gt;
&lt;li&gt;A wave folder that folds each sine wave before summing the result to the final signal.&lt;/li&gt;
&lt;li&gt;Spread control for the partials so that we have harmonic, odd or even partial overtones.&lt;/li&gt;
&lt;li&gt;Offset control for asymmetric wavefolding.&lt;/li&gt;
&lt;li&gt;The wave folder can be modulated with the Shape LFO.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Parameters&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: center;"&gt;Parameter&lt;/th&gt;
&lt;th style="text-align: center;"&gt;Range&lt;/th&gt;
&lt;th style="text-align: center;"&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;SHAPE&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0 to 100&lt;/td&gt;
&lt;td style="text-align: center;"&gt;Wave folder control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;ALT&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0 to 100&lt;/td&gt;
&lt;td style="text-align: center;"&gt;Offset of signals for asymmetric wavefolding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;P1&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0 to 100&lt;/td&gt;
&lt;td style="text-align: center;"&gt;The first partial frequency amplitude&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;P2&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0 to 100&lt;/td&gt;
&lt;td style="text-align: center;"&gt;The second partial frequency amplitude&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;P3&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0 to 100&lt;/td&gt;
&lt;td style="text-align: center;"&gt;The third partial frequency amplitude&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;P4&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0 to 100&lt;/td&gt;
&lt;td style="text-align: center;"&gt;The fourth partial frequency amplitude&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;P5&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0 to 100&lt;/td&gt;
&lt;td style="text-align: center;"&gt;The fifth partial frequency amplitude&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;SPRD&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0 to 3&lt;/td&gt;
&lt;td style="text-align: center;"&gt;The spread controller 0: harmonic, 1: odd, 2: even, 3: octaves&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description><category>korg</category><category>logue sdk</category><category>nts-1</category><category>synths</category><guid>https://leandrob13.github.io/Electronic-Ruminations/posts/nts-1-harmonik-oscillator/</guid><pubDate>Sat, 07 Aug 2021 16:39:31 GMT</pubDate></item><item><title>Subharmonikorg: Subharmonic Oscillators for the Korg NTS-1</title><link>https://leandrob13.github.io/Electronic-Ruminations/posts/subharmonikorg-subharmonic-oscillators-for-the-korg-nts-1/</link><dc:creator>Leandro B</dc:creator><description>&lt;p&gt;&lt;img alt="" src="https://leandrob13.github.io/Electronic-Ruminations/images/nts-1.png#centerme"&gt;&lt;/p&gt;
&lt;p&gt;I have been using the &lt;a href="https://www.korg.com/us/products/dj/nts_1/"&gt;Korg NTS-1&lt;/a&gt; for about 5 months, but it was just 
recently that I was able to spend some time trying to understand how to program it. Korg published its &lt;a href="https://korginc.github.io/logue-sdk/"&gt;logue-sdk&lt;/a&gt;
which is written in C/C++ and it provides useful templates and make files in order tu build custom oscillators, delays 
and modulation effects for your logue based synths. I have only tried programming the NTS-1 since I believe one of the
main purposes of this little synth is to experiment and understand the logue-sdk and how to digitally process the 
signals, which is another way of saying that if you mess up and brick your synth it will only cost you $99 to replace
it instead of bricking the Minilogue XD which retails at $549. &lt;/p&gt;
&lt;p&gt;For a complete review of the NTS-1, I recommend my favorite synth reviewer Loopop. Watch the video below:&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/Vhonu-rM0B0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h3&gt;The Subharmonikorg&lt;/h3&gt;
&lt;p&gt;With the introductions out of the way, lets talk about the Subharmonikorg. I was inspired to program this oscillator
after I saw what Moog did with its analog synth, &lt;a href="https://www.youtube.com/watch?v=ns0Zu5HjShY"&gt;The Subharmonicon&lt;/a&gt; which
is sort of a mix of two previous instruments: the &lt;a href="http://www.analogue.org/network/traut_e.htm"&gt;Tratonium&lt;/a&gt; and the
&lt;a href="https://en.wikipedia.org/wiki/Rhythmicon"&gt;Rythmicon&lt;/a&gt;. I wanted to emulate the subharmonic sound generation and found
out that the subharmonics are derived from the &lt;a href="https://en.wikipedia.org/wiki/Undertone_series"&gt;Undertone Series&lt;/a&gt; which is 
basically a mathematics formula that is used to calculate the subharmonics of a given note based on its frequency. So if 
it is mathematically derived then it could be programmed.&lt;/p&gt;
&lt;p&gt;The formula is easy: just divide the note frequency by an integer and you will get the undertone frequency related
to the original note. This can be illustrated in the code hosted in the &lt;a href="https://github.com/leandrob13/logue-hub/blob/master/src/nts-1/osc/subh/subh.cpp#L72"&gt;Logue-Hub Repository&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;w1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;osc_w0f_for_note&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pitch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;oscillator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;semitone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pitch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xFF&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;sw1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;w1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;oscillator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;undertone1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;sw2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;w1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;oscillator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;undertone2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Where the function &lt;code&gt;osc_w0f_for_note&lt;/code&gt; returns the frequency value that corresponds to the pitch (note value) passed to the
&lt;code&gt;OSC_CYCLE&lt;/code&gt; function exposed in the &lt;code&gt;logue-sdk&lt;/code&gt; API. Then w1 is divided by the undertones values taken from the editing
params of the NTS-1, which are integer numbers greater than zero. I limited the max possible value of subharmonics to the 
7th undertone.&lt;/p&gt;
&lt;h4&gt;Features&lt;/h4&gt;
&lt;p&gt;The features for version 1.1-0 are as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One main harmonic oscillator with semitone calibration up to one octave higher and one octave lower.&lt;/li&gt;
&lt;li&gt;Two subharmonic oscillators that divide the main oscillator tone up to the 7th undertone.&lt;/li&gt;
&lt;li&gt;Choose different undertones for each suboscillator.&lt;/li&gt;
&lt;li&gt;Mix between the main oscillator and the suboscillators with the &lt;code&gt;shape&lt;/code&gt; and &lt;code&gt;alt&lt;/code&gt; knobs respectively.&lt;/li&gt;
&lt;li&gt;Choose between square, saw and sine waveforms.&lt;/li&gt;
&lt;li&gt;Modulate the main oscillator mix with the LFO.&lt;/li&gt;
&lt;li&gt;Subharmonic oscillators arpeggiator with clock adjustment.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The arpeggiator is a separate implementation from the native NTS-1 arpeggiator. In the current version 1.1-0, there are 
only two patterns available which only affect the suboscillators: &lt;code&gt;down&lt;/code&gt; and &lt;code&gt;up-down&lt;/code&gt;. This means that if you hold a 
note, the main oscillator will stay on it while both suboscillators will cycle from the 2nd through the 7th subharmonic. 
Having separate arpeggiators allows you to play with interesting rhythm patterns. &lt;/p&gt;
&lt;h4&gt;Parameters&lt;/h4&gt;
&lt;p&gt;The parameters you can edit are listed below.&lt;/p&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: center;"&gt;Parameter&lt;/th&gt;
&lt;th style="text-align: center;"&gt;Range&lt;/th&gt;
&lt;th style="text-align: center;"&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;SHAPE&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0 to 100&lt;/td&gt;
&lt;td style="text-align: center;"&gt;level mix of main oscillator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;ALT&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0 to 100&lt;/td&gt;
&lt;td style="text-align: center;"&gt;level mix of suboscillators&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;semitone&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1 to 13&lt;/td&gt;
&lt;td style="text-align: center;"&gt;semitone tuning of main oscillator (1 as root note, 13 higher octave)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;undertone 1&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1 to 7&lt;/td&gt;
&lt;td style="text-align: center;"&gt;undertone value of first suboscillator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;undertone 2&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1 to 7&lt;/td&gt;
&lt;td style="text-align: center;"&gt;undertone value of second suboscillator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;oscT&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1 to  3&lt;/td&gt;
&lt;td style="text-align: center;"&gt;The oscillator type 1: saw, 2: square, 3: sine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;Arp Type&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1 to  3&lt;/td&gt;
&lt;td style="text-align: center;"&gt;The arpeggiator type 1: off, 2: down, 3: up-down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;Arp Clock&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0 to  100&lt;/td&gt;
&lt;td style="text-align: center;"&gt;The arpeggiator clock percentage of max frequency.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h3&gt;The Showcase&lt;/h3&gt;
&lt;p&gt;I did some noise experiment where I played with the NTS-1 Subharmonikorg and Moog's &lt;a href="https://www.moogmusic.com/products/werkstatt-01-cv-expander"&gt;Werkstatt-01&lt;/a&gt;.
The Subharmonikorg is playing its arpeggio while I hit some lead notes with the Werkstatt. I tried to keep the mood creepy.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Here is the video of the weird experiment:&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/ZgSYehljJU8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt; &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For the whole 7 minutes noise, listen to it in bandcamp &lt;a href="https://leandrob.bandcamp.com/track/tormentor"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get the latest version of the Subharmonikorg in github &lt;a href="https://github.com/leandrob13/logue-hub/tree/master/oscillators/nts-1"&gt;here&lt;/a&gt;. &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are some other oscillator ideas I have and some new features I want to test out for the NTS-1 for this oscillator. 
Hopefully I will also try this out with my newest adquisition, the Minilogue XD.&lt;/p&gt;</description><category>korg</category><category>logue sdk</category><category>nts-1</category><category>synths</category><guid>https://leandrob13.github.io/Electronic-Ruminations/posts/subharmonikorg-subharmonic-oscillators-for-the-korg-nts-1/</guid><pubDate>Sun, 04 Apr 2021 23:21:00 GMT</pubDate></item></channel></rss>