<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>USE HEARING PROTECTION</title>
    <link>https://neilbaldwin.codeberg.page/</link>
    <description>Recent content on USE HEARING PROTECTION</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <managingEditor>neil.baldwin@mac.com (Neil Baldwin)</managingEditor>
    <webMaster>neil.baldwin@mac.com (Neil Baldwin)</webMaster>
    <copyright>(C) Neil Baldwin</copyright>
    <lastBuildDate>Fri, 07 Mar 2025 17:57:31 +0000</lastBuildDate>
    <atom:link href="https://neilbaldwin.codeberg.page/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>2020-R</title>
      <link>https://neilbaldwin.codeberg.page/projects/2020-r/</link>
      <pubDate>Sun, 23 Mar 2025 13:27:29 +0000</pubDate><author>neil.baldwin@mac.com (Neil Baldwin)</author>
      <guid>https://neilbaldwin.codeberg.page/projects/2020-r/</guid>
      <description>A randomisation editor in Touch OSC for dubrussell&amp;rsquo;s &amp;ldquo;2020&amp;rdquo; beat-machine app.</description>
      <content:encoded><![CDATA[
<div class="callout tip">
    <div class="callout-header">
        
            <svg class="tip" viewBox="0 0 16 16">
                <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z">
                </path>
            </svg>
        
        What is 2020?
    </div>

    <p class="callout-body">
        <figure><img src="/projects/2020-r/images/dubrussell2020.png" width="70%">
</figure>
<p>2020 is a semi-modular beat-making app created by Yotaro Shuto (dubrussell). In his own words:</p>
<p><em>&ldquo;2020 is a SEMI MODULAR BEAT-MACHINE. It doesn&rsquo;t offer a traditional timeline view but instead lets you manipulate, randomize, wire, process, and perform beats in real-time, all in a single window. With 2020, you can explore millions of beat patterns on the fly.&rdquo;</em></p>

    </p>

</div>

<h2 id="rationale">Rationale</h2>
<p>While 2020 is <em>packed</em> full of real-time randomisation, there is no function to generate random presets in the Samplers, Synths and FX. Why would you want to do that? As DUB-Russell says, <em>&ldquo;Don&rsquo;t think, RANDOMISE!&rdquo;</em> (he said &ldquo;BEAT&rdquo; but&hellip;you know&hellip;)</p>
<h2 id="updates">Updates</h2>
<p><mark>31-08-2024</mark> Major update: now added PRESETS and MIXER tabs so you can recall presets and change mixer settings as part of performance</p>
<p><mark>20-08-2024</mark> WARNING: changed behaviour for RESET. Now RESET is a button that resets any selected parameters (it&rsquo;s no longer a selection button)
19-08-2024 Added support for SLICER (on the TONE group tab). See below for information.
18-08-2024 Added support for the TONE group: LOOPER1, LOOPER2 and LOOPER3</p>
<h2 id="how-does-it-work">How does it work?</h2>
<p>First off, if for some reason you&rsquo;ve reached here and you don&rsquo;t have it,  you need <a href="https://2020.dubrussell.com/">2020 Beat Machine</a></p>
<p>Then you need <a href="https://hexler.net/touchosc">TouchOSC MK2 by Hexler</a></p>
<p>TouchOSC MK2 added super-powerful LUA scripting which is what 2020-R uses to interact with the 2020 app.</p>
<p>I&rsquo;m not going to teach you how to install and use Touch OSC. The guides and tutorials on the Hexler website are good.</p>
<h2 id="interface">Interface</h2>
<p>
<figure><img src="images/2020-R%20UI.png">
</figure>

</p>
<p>Each of 2020&rsquo;s &ldquo;Groups&rdquo; is organised into tabs and the tabs are named the same way e.g. <code>GRP1</code>, <code>GRP2</code> etc. Within each tab there are the same sub-groups (samplers, instruments etc.) as you find in the 2020 app.</p>
<p>Within each sub-group there are two sections. On the right-hand side are the Send Controls. Here you can select if you want to send random absolute values (VALUE) or send randomised Probability and Range for the 2020 parameters that support that function. You can also elect to reset parameters back to their default values by selecting the RESET button.</p>
<p>The remainder of each group section is the Parameter Selection buttons. These are the ones that match the colour of the tab&hellip;and a <em>similar</em> colour to the corresponding Group in 2020) and are loosely organised into parameter types e.g. you&rsquo;ll find all Envelopes grouped in a &ldquo;ENVS&rdquo; group, all LFOs groups in a &ldquo;LFO&rdquo; group etc.</p>
<h3 id="how-to-use-2020-r">How to use 2020-R</h3>
<p>You first need to select the parameters you wish to randomise. You can select as many as you like.</p>

<div class="callout tip">
    <div class="callout-header">
        
            <svg class="tip" viewBox="0 0 16 16">
                <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z">
                </path>
            </svg>
        
        Hidden Toggle Button
    </div>

    <p class="callout-body">
        There&rsquo;s a &ldquo;hidden&rdquo; button on each sub-group. You can click/tap on the sub-group name e.g. &ldquo;GRP 1-2 Sampler&rdquo; and it will toggle all of that groups button on/off.
    </p>

</div>

<p>Then on the right-hand side, select whether you want to send random absolute values (VALUES) or Probability and Range values (RANGE). Or both!</p>
<p>Then press/click on the RANDOM button to send random values to 2020.</p>
<p>You can also reset the selected parameters back to their default values by clicking/pressing on the RESET button. Note this behaviour has changed since the 20-08-24 update.</p>
<p>That&rsquo;s it!</p>
<h4 id="fx-tab">FX Tab</h4>
<p>The FX tab is slightly different in that ALL of the FX parameters are grouped together. However there is an additional &lsquo;hidden&rsquo; helper button in each FX type. Press/click on the strip below the grouped parameters to toggle the selection on/off.</p>
<h4 id="tone-slicer">(TONE) SLICER</h4>
<p>Controls to randomise parameter for the SLICER group can be found on the TONE tab.</p>
<p>Most of the control work in exactly the same way as other groups apart from the controls in the SEQ section. Here you&rsquo;ll find switches for STEPS, RES and a radial dial labelled DENSITY</p>
<p>STEPS will randomise the vertical value of the current steps in the sequence. The DESNITY radial control controls how densely the seqence will be randomised.</p>
<p>RES (resolution) randomises the number of divisions per step.</p>
<h3 id="usage">Usage</h3>
<p>Feel free to use and modify it however you feel/need. You can dig into the script files in the TouchOSC editor but I&rsquo;ve also included the LUA source code as separate files in case you find those useful. The same code is attached to buttons/documents in the TouchOSC project.</p>
<p>If you find it useful and want to support my work and future updates then you can show your appreciation here:</p>

<h2>Support My Work 🙏</h2>

<p>If you like my work and use it or learn from it, please consider supporting me or just a donation to say thanks:</p>

<a href="https://www.buymeacoffee.com/neilbaldwi3" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/arial-yellow.png" class='center bmc' alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>





]]></content:encoded>
    </item>
    <item>
      <title>MMMSEGUI</title>
      <link>https://neilbaldwin.codeberg.page/projects/mmmsegui/</link>
      <pubDate>Sun, 23 Mar 2025 13:38:56 +0000</pubDate><author>neil.baldwin@mac.com (Neil Baldwin)</author>
      <guid>https://neilbaldwin.codeberg.page/projects/mmmsegui/</guid>
      <description>MMMSEGUI is a multi-segment graph editor written in JS/JSUI/MGraphics for Cycling 74&amp;rsquo;s Max platform.</description>
      <content:encoded><![CDATA[
<h2>Support My Work 🙏</h2>

<p>If you like my work and use it or learn from it, please consider supporting me or just a donation to say thanks:</p>

<a href="https://www.buymeacoffee.com/neilbaldwi3" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/arial-yellow.png" class='center bmc' alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>





<h2 id="rationale">Rationale</h2>
<p>The main objectives for MMMSEGUI were:</p>
<ul>
<li>have the ability to output directly into a list message for use with the <code>curve~</code> Max object</li>
<li>make it very simple and fast to use while minimising modifier key requirement</li>
<li>have the ability to add and delete nodes quickly and intuitively</li>
<li>have the ability to easily alter curve shapes and move graph segments around</li>
<li>have it easy to add to other projects and save the settings with your patchers</li>
<li>have it be very customisable</li>
</ul>
<p>In addition to this, recent updates include:</p>
<ul>
<li>automatic resizing of the graph when resizing the JSUI window</li>
<li>commands to clear the graph and also to create a graph through a message list</li>
<li>poll the graph to sample single values at a given point in the time (X) axis</li>
<li>the ability to set the X, Y and control point of a single node via messages</li>
</ul>
<p>For any previous users please read the following section regarding the November 2023 update.</p>
<h2 id="how-can-i-get-mmmsegui">How Can I Get MMMSEGUI?</h2>
<p>MMMSEGUI is freely available on my Github repository:</p>
<p><a href="https://github.com/neilbaldwin/mmmsegui">MMMSEGUI Repository</a></p>
<h2 id="important---major-update-and-refactoring-november-2023">Important - Major Update and Refactoring November 2023</h2>
<p>A soft apology to any existing users, especially if you&rsquo;ve incorporated MMMSEGUI into any of your own projects and patchers. This update has <strong>MAJOR</strong> changes:</p>

<div class="callout warning">
    <div class="callout-header">
        
            <svg class="warning" viewBox="0 0 16 16">
                <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
            </svg>
        
        Possible breaking changes
    </div>

    <p class="callout-body">
        <ul>
<li>Any parameters you were setting with messages previously will likely break as I&rsquo;ve renamed several functions and standardised things a bit.</li>
<li>When you load a patcher that used the old version of MMMSEGUI, using the new JS file will likely not apply customisations properly. You may need to &ldquo;relink&rdquo; the JSUI object to the new <code>mmmsegui.js</code> file. You&rsquo;ll also need to immediately save your patcher and reload it to make sure your patcher is saving parameters with the correct internal parameter names.</li>
</ul>

    </p>

</div>

<p>It was difficult to incorporate many of the changes without some collateral damage. I hope it&rsquo;s not too painful for you and have faith that the ground-up refactoring has improved the overall structure so this situation won&rsquo;t happen in future. Shouldn&rsquo;t happen. Never say never in development!</p>
<p><mark>18/11/2023 Update Overview</mark></p>
<p>The entire documentation has been updated but here are the highlights:</p>
<ul>
<li>setting up and instantiating is now WAY simpler. Sensible default values are generated rather than making the user define them.</li>
<li>changed mouse behaviour adding and removing nodes: now just double-click instead of SHIFT + click</li>
<li>the curve shape of a segment can be reset (to linear) by holding SHIFT and double-clicking the segment</li>
<li>MMMSEGUI will now resize itself if you resize the JSUI window</li>
<li>the <code>@parameter</code> method of setting customisation has been removed in favour of dedicated messages</li>
<li>there is now a much simpler <code>fillcolor</code>, <code>strokeColor</code>, and <code>bgColor</code> to set the graph colors along with a set of new messages for customising other features (see below)</li>
<li>there is <code>clear</code> command to reset the graph (customisations are persistent)</li>
<li>added a <code>graph</code> command to define a graph numerically for making templates and presets etc.</li>
<li>similarly there is a <code>graphfromcurve</code> command that lets you define a graph numerically using MMMSEGUI output format (input format for Max <code>[curve~]</code>)</li>
<li>you can now move a graph segment in both the X and Y axis (hold SHIFT and drag the curve segment), previously you could only move a segment in the  Y axis.</li>
<li>two new commands to sample the graph Y value at a point in time, <code>getvalue</code> uses a normalised value as the X position where <code>getvalueattime</code> lets you specify a time in ms.</li>
<li>some new commands to modify position and control point parameters for individual nodes</li>
</ul>
<h2 id="updates">Updates</h2>
<p><mark>13/02/2024</mark></p>
<p>Added &ldquo;Phasor Mode&rdquo; - a special mode with restrictions to use the the <code>phasor~</code> object.</p>
<h2 id="content-and-installation">Content and Installation</h2>
<ul>
<li><code>mmmsegui.js</code> is the main JSUI file you need to use MMMSEGUI.</li>
<li><code>mmmsegui.maxpat</code> is the demo patcher to demonstrate all MMMSEGUI&rsquo;s features - play around with stuff</li>
<li><code>readme.md</code> this file.</li>
<li><code>mmmseg_audio_demo_1.maxpat</code> demo of MMMSEGUI using a very basic step sequencer that drive a monophonic synth voice. Two step sequencers control pitch and LPF cutoff. Three MMMSEGUI envelopes control pitch, low-pass filter and overdrive modulation.</li>
<li><code>mmmseg_audio_demo_2.maxpat</code> a simple 4-step sequencer steps through four MMSEGUIs, each of which modulate the pitch of a <code>[rect~]</code> oscillator. You can change the metro tempo and also whether the MMSEGUIs loop (the <code>curve~</code> objects are re-triggered when they reach their end point).</li>
</ul>
<h2 id="adding-mmmsegui-to-your-patcher">Adding MMMSEGUI To Your Patcher</h2>
<p>Put the <code>mmmsegui.js</code> file in your Max search path(s) then add a JSUI object to your patcher specifying the MMMSEGUI filename:</p>






<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">1</span><span>[JSUI <span style="color:#f38ba8">@</span>filename mmmsegui.js]</span></span></code></pre></div>
<p>The default MMMSEGUI only contains two nodes, the end and start nodes. These cannot be deleted and only their Y position (and curve shape) can be changed. To add more nodes (or delete them) you need to use the mouse (and keyboard).</p>
<h2 id="adding-deleting-and-moving-nodes--and-curves">Adding, Deleting and Moving Nodes.  And Curves.</h2>
<table>
  <thead>
      <tr>
          <th>Function</th>
          <th>Mouse Control</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Add a new node</td>
          <td>Double-click on a curve segment. The new node will be placed where you click.</td>
      </tr>
      <tr>
          <td>Delete a node</td>
          <td>Double-click an existing node.</td>
      </tr>
      <tr>
          <td>Move a node</td>
          <td>Click and drag a node with the mouse.</td>
      </tr>
      <tr>
          <td>Change curve shape</td>
          <td>Click and drag a curve segment with the mouse.</td>
      </tr>
      <tr>
          <td>Move a curve segment</td>
          <td>Hold <code>SHIFT</code> then click and drag a curve segment with the mouse.</td>
      </tr>
      <tr>
          <td>Reset curve shape for a segment</td>
          <td>Hold <code>SHIFT</code> then double-click a curve segment.</td>
      </tr>
  </tbody>
</table>
<figure><img src="/projects/mmmsegui/images/mmmsegui.gif" width="70%">
</figure>


<div class="callout note">
    <div class="callout-header">
        
            <svg class="note" viewbox="0 0 16 16">
                <path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z">
                </path>
            </svg>
        
        Constraints on Moving and Deleting Nodes
    </div>

    <p class="callout-body">
        <p>You cannot delete the first and last nodes. They have a square shape to distinguish them from regular nodes (circular).</p>
<p>Movement will be constrained in the Y axis by whichever of the two defining nodes is the highest/lowest. Movement will be constrained in the X axis by the X position of the previous and next node in the graph.</p>

    </p>

</div>

<h2 id="customisation-messages">Customisation Messages</h2>
<p>Customisation is done via Max message objects. For data type see the <strong>Notes</strong> column. Some error/range checking/clamping is done but I&rsquo;m sure you can break it if you try.</p>
<table>
  <thead>
      <tr>
          <th>Message</th>
          <th>Description</th>
          <th>Notes</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>fillcolor</code></td>
          <td>Sets the fill color for the graph.</td>
          <td>RGBA (floats)</td>
      </tr>
      <tr>
          <td><code>strokeColor</code></td>
          <td>Sets the stroke color for the graph.</td>
          <td>RGBA (floats)</td>
      </tr>
      <tr>
          <td><code>bgColor</code></td>
          <td>Sets the background color underneath the graph.</td>
          <td>RGBA (floats)</td>
      </tr>
      <tr>
          <td><code>nodesize</code></td>
          <td>Sets the radius of the nodes in pixels.</td>
          <td>Value clamped 2.5 to 8</td>
      </tr>
      <tr>
          <td><code>linewidth</code></td>
          <td>Sets the line width (graph and node stroke)</td>
          <td>Value clamped 1.0 to 4.0</td>
      </tr>
      <tr>
          <td><code>padding</code></td>
          <td>Sets a padding amount inside the JSUI window in pixels.</td>
          <td>Clamped 0 to 32</td>
      </tr>
      <tr>
          <td><code>timescale</code></td>
          <td>Sets the scale of the X axis output in MS</td>
          <td>Default 1000ms</td>
      </tr>
      <tr>
          <td><code>autooutput</code></td>
          <td>Determines if graph values are constantly output or only when banged.</td>
          <td>0/1, default: 1</td>
      </tr>
      <tr>
          <td><code>nodehighlighting</code></td>
          <td>Highlight node when mouse over.</td>
          <td>0/1, default : 1</td>
      </tr>
      <tr>
          <td><code>curvehighlighting</code></td>
          <td>Highlight curve when mouse over.</td>
          <td>0/1, default : 1</td>
      </tr>
      <tr>
          <td><code>autohidenodes</code></td>
          <td>Automatically hide nodes when mouse not in JSUI window</td>
          <td>0/1, default : 1</td>
      </tr>
      <tr>
          <td><code>nodesvisible</code></td>
          <td>Override to make nodes always visible (or not!)</td>
          <td>0/1, default : 0</td>
      </tr>
      <tr>
          <td><code>mousespeed</code></td>
          <td>Mouse movement scaling when dragging nodes and curves</td>
          <td>Default 1.0</td>
      </tr>
      <tr>
          <td><code>curveOnly</code></td>
          <td>Only draws the curve stroke, unfilled</td>
          <td>Default 0</td>
      </tr>
      <tr>
          <td><code>phasorMode</code></td>
          <td>Special mode for use with <code>phasor~</code> - see below</td>
          <td>Default 0</td>
      </tr>
  </tbody>
</table>
<h3 id="color-messages">Color Messages</h3>
<p>For the color messages that have the RGBA data type there are 4 values, so your message will look like: <code>[fillcolor $1 $2 $3 $4]</code> where $1 is the red value, $2 is the green value, $3 is the blue value and $4 is the alpha value. This is standard RGBA format in Max and is the output from <code>[colorpicker @compatibility 0]</code> or <code>[swatch]</code> etc.</p>
<h3 id="auto-output">Auto Output</h3>
<p>Auto Output is on by default (turn it off with <code>[autooutput 0]</code>)which means anything you do that changes the nodes, curves or timescale will cause MMMSEGUI to output the current graph as a <code>curve~</code> formatted list. If you set Auto Output to off, nothing will be output from MMMSEGUI until you send a <code>bang</code> message to its inlet. The only exception to this is the <code>getvalue</code> and <code>getvalueattime</code> commands (see <a href="#command-messages">Command Messages</a>), for obvious reasons. Sending messages to MMMSEGUI that only change the graphical <em>look</em> of the graph will not cause output of node list.</p>
<h2 id="phasor-mode">Phasor Mode</h2>
<p>&ldquo;Phasor Mode&rdquo; is a feature requested by a few members of the Max Discord channel for use with the <code>phasor~</code>
object. In Phasor Mode there are a few changes and restrictions to the way MMMSEGUI works:</p>

<div class="callout tip">
    <div class="callout-header">
        
            <svg class="tip" viewBox="0 0 16 16">
                <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z">
                </path>
            </svg>
        
        Phasor Mode Differences
    </div>

    <p class="callout-body">
        <ul>
<li>The graph Y position starts at 0.0 (bottom) and ends at 1.0 (top)</li>
<li>The first and last node Y positions are fixed (0.0 and 1.0 respectively) and cannot be moved</li>
<li>Each node Y position is restricted by the preceding and following nodes: a node cannot be moved higher than the next node or lower than the previous one</li>
</ul>

    </p>

</div>

<h3 id="selecting-phasor-mode">Selecting Phasor Mode</h3>
<p>The message <code>setphasormode</code> is used to turn Phasor Mode on/off. 0 turns it off (default) and 1 turns it on.</p>
<p>However you must also then use the <code>clear</code> message to reset the graph which means if you intend to use Phasor Mode on a MMMSEGUI object, select Phasor Mode first, then clear the graph before setting nodes etc.</p>
<p>Clearing the graph is necessary so that the graph starts with nodes that respect the restrictions of Phasor Mode. I thought about just adding some validation code so that you could switch between Phasor Mode on/off but that would also modify your graph. Clearing the graph is simpler and easier.</p>
<h2 id="command-messages">Command Messages</h2>
<p>In addition to customisation there are some messages that control MMMSEGUI:</p>
<table>
  <thead>
      <tr>
          <th>Message</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>clear</code></td>
          <td>Resets the graph to default two-node shape. Customisations will remain intact.</td>
      </tr>
      <tr>
          <td><code>graph</code></td>
          <td>You send send a list of values to MMMSEGUI to create a graph numerically.</td>
      </tr>
      <tr>
          <td><code>graphfromcurve</code></td>
          <td>Similar to <code>graph</code> but you can paste the output from MMMSEGUI to define the graph</td>
      </tr>
      <tr>
          <td><code>getvalue n</code></td>
          <td>Get the Y value at the specified position <code>n</code> (normalised X position)</td>
      </tr>
      <tr>
          <td><code>getvalueattime n</code></td>
          <td>Get the Y value at the specified time <code>n</code> (ms)</td>
      </tr>
      <tr>
          <td><code>setxat n x</code></td>
          <td>Set the X position <code>x</code> for the node <code>n</code></td>
      </tr>
      <tr>
          <td><code>setyat n y</code></td>
          <td>Set the Y position <code>y</code> for the node <code>n</code></td>
      </tr>
      <tr>
          <td><code>setcat n c</code></td>
          <td>Set the control point <code>c</code> for the node <code>n</code></td>
      </tr>
      <tr>
          <td><code>setnode n x y c</code></td>
          <td>Set the position and control point for node <code>n</code></td>
      </tr>
  </tbody>
</table>
<h3 id="set-value-commands">Set Value Commands</h3>
<p>A new set of commands to enable you to set the position and curve shape of individual nodes in your graph. This has some  interesting uses especially using an external signal to modulate node coordinates.</p>
<p><code>setxat n x</code>, <code>setyat n, y</code> and <code>setcat n c</code> are used to set the X, Y and control point of node <code>n</code></p>
<p><code>setnode n x y c</code> allows you to set all the properties of a node in a single command.</p>
<p>Node number <code>n</code> needs to be a valid node in the current graph but MMMSEGUI will just reject the command silently if the node number is invalid.</p>
<p>The X position is constrained by the X position of the previous and next node in the graph.</p>
<p>You cannot change the X position of the first and last node. The first node is node 0.</p>
<p>Setting the curve point, <code>c</code>, affects the shape of the curve <em>to the right</em> of the specified node <code>n</code>.</p>
<h3 id="get-value-commands">Get Value Commands</h3>
<p>Another two new commands, <code>getvalue</code> and <code>getvalueattime</code> allow you to sample the graph with a position/time input and get the normalised Y value at that point.</p>
<p>The value is output from <code>[outlet 2]</code>, 0.0 to 1.0 with 0.0 being at the bottom and 1.0 at the top.</p>
<p><code>getvalue</code> input is clamped to 0.0 - 1.0 whereas <code>getvalueattime</code> will post an error to the Max Console if the ms time is outside of the range of the current <code>timeScale</code> setting for the graph.</p>
<h3 id="graph-commands">Graph Commands</h3>
<p>There are two further new commands that let you send a list message to MMMSEGUI to define a graph numerically. This is handy if you want to make your own presets or templates for example. The two command messages are <code>[graph]</code> and <code>[graphfromcurve]</code></p>
<p>When you send either the <code>graph</code> or <code>graphfromcurve</code> message, the graph will be immediately updated and the values mirrored at  outlet 1.</p>

<div class="callout warning">
    <div class="callout-header">
        
            <svg class="warning" viewBox="0 0 16 16">
                <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
            </svg>
        
        Graph Command Constraints
    </div>

    <p class="callout-body">
        <p>Internally you cannot have a graph smaller than two nodes. If you send a <code>graph</code> or <code>graphfromcurve</code> command with too few arguments you will get an error message in Max Console and the command will just fail to complete.</p>
<p>Also, the first and last node in the graph need to be at X 0.0 and 1.0 respectively. If they aren&rsquo;t, those nodes will have their X position adjusted and you&rsquo;ll get a warning in Max Console. The new graph will import OK though just with those X positions modified as explained.</p>

    </p>

</div>

<h4 id="graph">[graph]</h4>
<p>The first command, <code>graph</code>, lets you create a new graph with normalised values:</p>






<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">1</span><span>[graph x1 y1 c1 x2 y2 c2 x3 y3 c3] etc.</span></span></code></pre></div>
<ul>
<li><code>xn</code> is the normalised position of the node along the X axis, 0.0 to 1.0, left-to-right</li>
<li><code>yn</code> is the normalised magnitude in the Y axis, 0.0 to 1.0, top-to-bottom</li>
<li><code>cn</code> is the  normalised curve value, 0.0 to 1.0, 0.5 is the middle (linear curve)</li>
</ul>
<p>This data form parallels the MMMSEGUI internal data form. It&rsquo;s a more simple structure than <code>graphfromcurve</code> as it&rsquo;s easier to visualise and because the X values are normalised you can define a graph independent of it&rsquo;s <code>timeScale</code> setting.</p>
<h4 id="graphfromcurve">[graphfromcurve]</h4>
<p>You can also send MMMSEGUI a <code>[graphfromcurve]</code> message to define a graph numerically but this time the data format is exactly that of MMMSEGUI output (the same format as input message to Max&rsquo;s <code>[curve~]</code> object).</p>






<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">1</span><span>[graphfromcurve y1 d1 c1 y2 d2 c2 y3 d3 c3] etc.</span></span></code></pre></div>
<p>The parameters are slightly different from the <code>graph</code> command in order to be compatible with <code>[curve~]</code></p>
<ul>
<li><code>yn</code> is the Y axis position of the node but is inverted, 1.0 is the top, 0.0 is the bottom</li>
<li><code>dn</code> is the delta time in ms from the previous node</li>
<li><code>cn</code> is the  <code>curve~</code> curve shape value, -0.999 to 0.999</li>
</ul>

<div class="callout tip">
    <div class="callout-header">
        
            <svg class="tip" viewBox="0 0 16 16">
                <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z">
                </path>
            </svg>
        
        Curve Control Point Range
    </div>

    <p class="callout-body">
        The value for the curve control point (c1, c2 etc.) is in the range -0.999 to 0.999 as this is the scaling that is applied to this value when it&rsquo;s output from MMMSEGUI. For some reason sending curve values above/below that upsets <code>[curve~]</code>.
    </p>

</div>

<p>The advantage of <code>graphfromcurve</code> over <code>graph</code> is that you can hook up the output of MMMSEGUI to the right-hand inlet of a <code>message</code> object and then use that output directly to form a <code>graphfromcurve</code> message.</p>
<p>The disadvantages of <code>graphfromcurve</code> compared to <code>graph</code> for manually typing in a graph definition are:</p>
<ul>
<li>it&rsquo;s tricky to visualise and calculate the delta times</li>
<li>MMMSEGUI has to calculate the timescale (X axis) from the delta times of the X position of the nodes and then it automatically sets the <code>timeScale</code> parameter from this</li>
</ul>
<h2 id="saving">Saving</h2>
<p>MMMSEGUI has an internal save structure that will save all of it&rsquo;s parameters when you save your patcher and restore itself when you reload your patcher. On one hand this is convenient and simple but <strong>MMMSEGUI is always saving</strong> - any changes you make to MMMSEGUI while playing with your patcher will be saved when you save.</p>

<div class="callout note">
    <div class="callout-header">
        
            <svg class="note" viewbox="0 0 16 16">
                <path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z">
                </path>
            </svg>
        
        Enabling and Disabling Saving
    </div>

    <p class="callout-body">
        I have an idea for a parameter that enables/disables saving. If you feel that would be beneficial put something in Github Issues.
    </p>

</div>

<h2 id="inlets-and-outlets">Inlets and Outlets</h2>
<ul>
<li>
<p><code>[inlet 1]</code> handles all the command and parameter messages</p>
</li>
<li>
<p><code>[outlet 1]</code> outputs a list of nodes and delta times from the current graph shape</p>
</li>
<li>
<p><code>[outlet 2]</code> is used to retrieve a single Y value at a point in time</p>
</li>
</ul>
<p>See <a href="#command-messages">Command Messages</a> for details on the various commands.</p>
<h2 id="using-the-output-from-mmmsegui">Using the Output from MMMSEGUI</h2>
<p>As already mentioned, the output is deliberately formatted as a list that will be immediately accepted by a <code>[curve~]</code> object.</p>
<p>The output format is a <em>trio</em> of parameters per curve:</p>






<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">1</span><span>[magnitude deltaTime curveFactor]</span></span></code></pre></div>
<ul>
<li>
<p><em>magnitude</em> is the Y axis value</p>
</li>
<li>
<p><em>deltaTime</em> is the time in milliseconds from when the <code>[curve~]</code> previous node (or when the <code>curve~</code> was triggered) and is calculated from the <code>timescale</code> setting</p>
</li>
<li>
<p><em>curveFactor</em> is the control-point value that describes the curve shape. The value range is -0.999 to 0.999 - for some reason if you go to -1.0 or 1.0 things start to go a bit weird with the <code>[curve~]</code> object. That&rsquo;s a Max issue, not MMMSEGUI!</p>
</li>
</ul>

<div class="callout tip">
    <div class="callout-header">
        
            <svg class="tip" viewBox="0 0 16 16">
                <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z">
                </path>
            </svg>
        
        MMMSEGUI Curve Shape
    </div>

    <p class="callout-body">
        The shape of the curves in MMMSEGUI is a compromise to some extent. The bezier curve function in JSUI is a quadratic curve and as such has two control points to describe the curve shape. However the <code>curve~</code> object only has one control point. Consequently the curve shapes in MMMSEGUI are more synchronous with the expected behaviour of the <code>curve~</code> output rather than take advantage of the flexibility of the JSUI curve function.
    </p>

</div>

<p>Each <em>trio</em> of parameters makes a stage of a multi-stage curve in a <code>[curve~]</code> object.</p>
<h3 id="using-the-output-from-the-curve-object">Using the Output From the [curve~] Object</h3>
<p>The output from a connected <code>[curve~]</code> object will be a float value in the range 0.0 to 1.0 so you will need a <code>[scale~]</code> object or other  ways to transform this normalised value into something useful. I&rsquo;ll leave that for you to work out.</p>
<p>I may look at other output features such as exponential scaling for future updates.</p>
<h2 id="rolling-your-own-output">Rolling Your Own Output</h2>
<p>If you want to create your own output format, look towards the bottom of the <code>mmmsegui.js</code> file for the function called <code>this.outputList</code>. This is the internal function that is called by MMMSEGUI whenever it needs to output the node values.</p>






<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c"> 1</span><span><span style="color:#cba6f7">this</span>.outputList <span style="color:#89dceb;font-weight:bold">=</span> <span style="color:#f38ba8">function</span>() {
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c"> 2</span><span>  <span style="color:#f38ba8">var</span> out <span style="color:#89dceb;font-weight:bold">=</span> [];
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c"> 3</span><span>  <span style="color:#6c7086;font-style:italic">// Add first node to output list using a time delta of zero
</span></span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c"> 4</span><span><span style="color:#6c7086;font-style:italic"></span>  out.push(<span style="color:#fab387">1</span><span style="color:#89dceb;font-weight:bold">-</span><span style="color:#cba6f7">this</span>.nodeList[<span style="color:#fab387">0</span>].y, <span style="color:#fab387">0.0</span>, <span style="color:#fab387">0.0</span>);
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c"> 5</span><span>  <span style="color:#cba6f7">for</span> (n <span style="color:#89dceb;font-weight:bold">=</span> <span style="color:#fab387">1</span>; n <span style="color:#89dceb;font-weight:bold">&lt;=</span> <span style="color:#cba6f7">this</span>.nodeCount<span style="color:#89dceb;font-weight:bold">-</span><span style="color:#fab387">1</span>; n<span style="color:#89dceb;font-weight:bold">++</span>) {
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c"> 6</span><span>    <span style="color:#6c7086;font-style:italic">// Add next node Y value
</span></span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c"> 7</span><span><span style="color:#6c7086;font-style:italic"></span>    out.push(<span style="color:#fab387">1</span><span style="color:#89dceb;font-weight:bold">-</span><span style="color:#cba6f7">this</span>.nodeList[n].y);
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c"> 8</span><span>    <span style="color:#6c7086;font-style:italic">// Add node delta time
</span></span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c"> 9</span><span><span style="color:#6c7086;font-style:italic"></span>    out.push((<span style="color:#cba6f7">this</span>.nodeList[n].x <span style="color:#89dceb;font-weight:bold">-</span> <span style="color:#cba6f7">this</span>.nodeList[n<span style="color:#89dceb;font-weight:bold">-</span><span style="color:#fab387">1</span>].x) <span style="color:#89dceb;font-weight:bold">*</span> <span style="color:#cba6f7">this</span>.timeScale)
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">10</span><span>    <span style="color:#6c7086;font-style:italic">// Add node curve factor
</span></span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">11</span><span><span style="color:#6c7086;font-style:italic"></span>    out.push((<span style="color:#cba6f7">this</span>.nodeList[n<span style="color:#89dceb;font-weight:bold">-</span><span style="color:#fab387">1</span>].cp <span style="color:#89dceb;font-weight:bold">*</span> <span style="color:#fab387">1.998</span>) <span style="color:#89dceb;font-weight:bold">-</span> <span style="color:#fab387">0.999</span>);
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">12</span><span>  }
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">13</span><span>  <span style="color:#6c7086;font-style:italic">// Send output list to first outlet
</span></span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">14</span><span><span style="color:#6c7086;font-style:italic"></span>  <span style="color:#cba6f7">this</span>.outputFlag <span style="color:#89dceb;font-weight:bold">=</span> <span style="color:#fab387">false</span>;
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">15</span><span><span style="color:#cba6f7">return</span> out;
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">16</span><span>}</span></span></code></pre></div>
<p>Here I&rsquo;m creating an empty array, <code>out</code> and then iterating through the nodes pushing the Y value, then the calculated delta time and then the curve factor. The variable <code>this.outputFlag</code> is used to only trigger output when there has been a change in the graph that requires outputting. The final line returns the output array for sending to the JSUI outlet.</p>
<h2 id="parameter-style-customisation">@parameter Style Customisation</h2>
<p>I made the decision to remove this in the November 2023 update. Several reasons, the main one being that you can&rsquo;t tweak the parameters as <code>jsarguments</code> without causing MMMSEGUI to recompile which was <em>deeply</em> annoying. Poor design decision on my part: I hold my hands up.</p>
<p>However, if the removal of these is the worse news ever for you, here&rsquo;s how you can implement them yourself.</p>
<p>The basic code for interpreting the <code>@parameters</code> follow this form. Put this in the <code>mmmsegui.js</code> code just after the instantiation line:</p>






<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c"> 1</span><span>jsarguments.filter(<span style="color:#f38ba8">function</span>(arg) {
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c"> 2</span><span>  <span style="color:#cba6f7">if</span> (arg[<span style="color:#fab387">0</span>] <span style="color:#89dceb;font-weight:bold">==</span> <span style="color:#a6e3a1">&#34;@&#34;</span>) {
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c"> 3</span><span>    <span style="color:#f38ba8">var</span> val <span style="color:#89dceb;font-weight:bold">=</span> jsarguments[jsarguments.indexOf(arg)<span style="color:#89dceb;font-weight:bold">+</span><span style="color:#fab387">1</span>]
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c"> 4</span><span>    <span style="color:#cba6f7">switch</span> (arg) {
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c"> 5</span><span>      <span style="color:#cba6f7">case</span> <span style="color:#a6e3a1">&#34;@nodesize&#34;</span><span style="color:#89dceb;font-weight:bold">:</span>
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c"> 6</span><span>        mmmsegui.setNodeSize(val)
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c"> 7</span><span>        <span style="color:#cba6f7">break</span>;
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c"> 8</span><span>      <span style="color:#cba6f7">case</span> <span style="color:#a6e3a1">&#34;@timescale&#34;</span><span style="color:#89dceb;font-weight:bold">:</span>
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c"> 9</span><span>        mmmsegui.setTimeScale(val)
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">10</span><span>        <span style="color:#cba6f7">break</span>;
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">11</span><span>      <span style="color:#cba6f7">default</span><span style="color:#89dceb;font-weight:bold">:</span>
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">12</span><span>        <span style="color:#cba6f7">break</span>;
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">13</span><span>    }
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">14</span><span>  }
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">15</span><span>});</span></span></code></pre></div>
<p>So you can add as many or as few as you like by adding more <code>case</code> clauses to the JS <code>switch</code> statement. You can see there are two MMMSEGUI function calls, <code>mmmsegui.setNodeSize(val)</code> and <code>mmmsegui.setTimeScale(val)</code>. These function names are the internal functions that handle those parameters. <code>val</code> is the value you place after each of the <code>@parameters</code></p>
<p>As an example, let&rsquo;s say you wanted to add a parameter called <code>@padding</code> to set the padding inside the JSUI window. Add another <code>switch</code> clause before where the <code>default</code> one is in the code:</p>






<div class="highlight"><pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">1</span><span><span style="color:#cba6f7">case</span> <span style="color:#a6e3a1">&#34;@padding&#34;</span><span style="color:#89dceb;font-weight:bold">:</span>
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">2</span><span>	mmmsegui.setPadding(val)
</span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f849c">3</span><span>	<span style="color:#cba6f7">break</span>;</span></span></code></pre></div>
<p>The <code>@parameter</code> names don&rsquo;t have to match the function names, you can call them whatever you like.</p>
<p>The list of functions you can use is here (though could be subject to change but I&rsquo;ll endeavour to update this section if any future updates affect them). I won&rsquo;t describe them as their function should be fairly obvious from their name.</p>
<p>The obvious omissions here are the functions to set fill, stroke and background colors. This is a bit more fiddly to implement as @paramters because you need four float values (RGBA) and the example code above will only copy with one parameter. If you need that and want help with it just get in touch.</p>
<p><strong>Node and Line</strong>
<code>setNodeSize()</code>, <code>setLineWidth()</code>, <code>setPadding()</code></p>
<p><strong>Input and Output</strong>
<code>setTimeScale()</code>, <code>setAutoOutput()</code>,<code>setMouseSpeed()</code></p>
<p><strong>Mouse-over Highlighting</strong>
<code>setNodeHighlighting()</code>, <code>setCurveHighlighting()</code></p>
<p><strong>Node Visibility</strong>
<code>setAutoHideNodes()</code>,<code>setNodesVisible()</code></p>
]]></content:encoded>
    </item>
    <item>
      <title>VOLDRED</title>
      <link>https://neilbaldwin.codeberg.page/projects/voldred/</link>
      <pubDate>Sun, 23 Mar 2025 13:38:56 +0000</pubDate><author>neil.baldwin@mac.com (Neil Baldwin)</author>
      <guid>https://neilbaldwin.codeberg.page/projects/voldred/</guid>
      <description>VOLDRED is a Touch OSC editor for Korg&amp;rsquo;s Volca Drum</description>
      <content:encoded><![CDATA[<h2 id="voldred--volca-drum-editor">VOLDRED : Volca Drum Editor</h2>
<p>VOLDRED is a Touch OSC editor for the Korg Volca Drum. It adds power, speed and convenience to your editing experience and has a ton of tricks up its sleeve to transform the sound designing process on the Volca Drum.</p>
<p><img src="images/VOLDRED.png" alt=""></p>
<h2 id="support-my-work">Support My Work</h2>
<p>A huge amount of work went into Voldred and I resisted the option to force other users to pay for access. However, if you like my work and use it or even learn from it, please consider supporting me or just making a small donation to say thanks. I have quite a few new features and improvements in the pipeline for Voldred and knowing it&rsquo;s appreciated is the best inspiration for working on it further.</p>
<p><a href="https://www.buymeacoffee.com/neilbaldwi3" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 40px !important;" ></a></p>
<p>&#x1f64f;</p>
<h2 id="why-do-i-need-voldred">Why Do I Need VOLDRED?</h2>
<p>Let&rsquo;s face it, sound editing on the Volca Drum is <em>fiddly</em>. No offence, Korg. Too much menu diving, too much cycling between Parts. Too much damn scrolling through the oscillator/modulation/envelope combinations to dial in the configuration you want. And trying to do all of this via the tiny knobs and tiny screen. <em>Fiddly</em>.</p>
<p>VOLDRED pours petrol on that, sets it on fire then walks away in slow-motion.</p>
<ul>
<li>Intuitive touch-screen interface that lets you see and edit ALL Part parameters on a single screen</li>
<li>Loading and saving of up to 16 &ldquo;kits&rdquo; that can be instantly recalled via a single click/touch and also recalled via MIDI messages. These are stored inside VOLDRED</li>
<li>Copying parameters between Parts</li>
<li>Sysex exporting and importing of Kits</li>
<li>Edit Layers independently or linked, with the added feature that you can edit both layers simultaneously and the parameters of each layer retain their numerical relationship to each other (more on this later)</li>
<li>Full randomisation. Similar to randomisation on the hardware but adds further randomisation to the FX parameters (Pan, Bit Crush, Fold etc.) and also the Waveguide parameters. Plus any parameter can easily be &ldquo;locked&rdquo; to prevent it being randomised</li>
<li>Layers/FX/Waveguide can be instantly initialised with a single touch</li>
<li>Fast switching between Parts for editing the entire kit</li>
<li>Pads for MIDI triggering the six tracks (Parts)</li>
<li>Mini-keyboard for playing the Volca Drum melodically or for using keyboard input to set the pitch of the oscillators</li>
<li>Super-flexible mappable Macro knobs - control almost every parameter with one knob!</li>
<li>Customisable colour-scheme!</li>
</ul>
<p><a href="https://www.youtube.com/watch?v=bLU6VD3ehyk">YouTube Video - opens in same window</a></p>
<h2 id="how-can-i-get-voldred">How Can I Get VOLDRED?</h2>
<p>VOLDRED is freely available on my Github repository:</p>
<p><a href="https://github.com/neilbaldwin/VOLDRED">VOLDRED Repository</a></p>
<h2 id="requirements">Requirements</h2>
<p>You&rsquo;ll need a Volca Drum. Buy one or borrow one: it&rsquo;s easily one of the best of the Volca range.</p>
<p>You&rsquo;ll also need Touch OSC, and a device to run it on. And some sort of MIDI device. And a MIDI cable. You know the score.</p>

<div class="callout note">
    <div class="callout-header">
        
            <svg class="note" viewbox="0 0 16 16">
                <path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z">
                </path>
            </svg>
        
        
    </div>

    <p class="callout-body">
        You have to pay for Touch OSC on mobile devices but <strong>you can download it for a free, unrestricted trial</strong> on desktop computers. The mobile version is about $15.
    </p>

</div>

<p>If you don&rsquo;t already own <a href="https://hexler.net/touchosc">Touch OSC</a> I can&rsquo;t express strongly enough how good it is. Plus, the developers, Hexler, are hardworking independent artists in their own right and these kind of people benefit from our support where we can. I am in no way affiliated to them or paid by them: they just make really good stuff for audio and visual artists.</p>
<h2 id="ui-walkthrough">UI Walkthrough</h2>
<h3 id="part-selector">Part Selector</h3>
<p><img src="images/Part%20Selection.png" alt=""></p>
<p>Across the top of the UI is the <em>Part Selector</em>.  Here you can quickly switch between Parts for editing by just tapping on a tab. This is also where you can access various settings and functions such as  <a href="#loading-and-saving-kits">Loading and Saving Kits</a> via the <a href="#settings-tab">Settings Tab</a></p>
<p>Below the Part Selector is a heading strip showing you the different sections of each Layer etc. It doesn&rsquo;t do anything clever apart from give you a visual indicator of the various parameter groups.</p>

<div class="callout tip">
    <div class="callout-header">
        
            <svg class="tip" viewBox="0 0 16 16">
                <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z">
                </path>
            </svg>
        
        
    </div>

    <p class="callout-body">
        Switching Parts in VOLDRED does not change the selected Part on the VD.
    </p>

</div>

<h3 id="layer-controls">Layer Controls</h3>
<p>Below the Part Selector are two identical groups of controls that contain the parameters for Layer 1 and Layer 2 of the currently selected Part.</p>
<p><img src="images/Layer.png" alt=""></p>
<p>Here you can see <em>Oscillator Level</em>, <em>Oscillator Shape</em>, <em>Oscillator Pitch</em> etc. for Layer 1. The controls for Layer 2 are identical.</p>
<p>The cluster of buttons below the Oscillator Level radial control various options and modes for linked editing and randomisation.  See <a href="#layers-linked-editing">Layers: Linked Editing</a> and <a href="#randomisation-and-initialisation">Randomisation and Initialisation</a> for more details.</p>
<p>The button in the top-left corner is to open the Controller Window. See <a href="#controller-window">Controller Window</a> for details.</p>
<h3 id="part-fx-and-waveguide">Part FX and Waveguide</h3>
<p>To the right side are the parameters for Part FX (Pan, Bit Crush, Drive, Waveguide Send etc.) and also the parameters for the Waveguide.</p>
<p align="center">
  <img src="images/FX and Waveguide.png" width="160"/>
</p>

<div class="callout tip">
    <div class="callout-header">
        
            <svg class="tip" viewBox="0 0 16 16">
                <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z">
                </path>
            </svg>
        
        Parts, FX and Waveguide
    </div>

    <p class="callout-body">
        On the Volca Drum, both Layers share the same FX settings which is why there is only one FX section per Part. Similarly, all six Parts share the same Waveguide parameters, though each Part has its own <em>Waveguide Send</em> amount.
    </p>

</div>

<h3 id="settings-tab">Settings Tab</h3>
<p>The last tab in the Part Selector takes you to the Settings page:</p>
<p><img src="images/Settings%20Tab.png" alt=""></p>
<p>Here you can load/save kits, copy parameters between Parts, change the UI colours and set various other parameters.</p>
<h4 id="loading-and-saving">Loading and Saving</h4>
<p><img src="images/Load%20and%20Save.png" alt=""></p>
<p>The top section is where you can load and save kits to one of 16 slots, which are saved when you save VOLDRED&rsquo;s Touch OSC project file. For more details see &ldquo;Loading And Saving Kits&rdquo;</p>
<p>It&rsquo;s also possible to recall kits via MIDI control. See <a href="#loading-kits-via-midi">Loading Kits Via MIDI</a> for an explanation.</p>
<h4 id="copy-parts">Copy Parts</h4>
<p>Immediately below the Load/Save section is the controls to copy parameter settings between Parts of the current kit.</p>
<p><img src="images/Copy%20Parts.png" alt=""></p>
<p>For more details see <a href="#copying-parts">Copying Parts</a></p>
<h4 id="sysex-backup--restore">Sysex Backup &amp; Restore</h4>
<p>Below Copy Parts are the two controls for exporting and importing your Kit data as a MIDI sysex file.</p>
<p><img src="images/Sysex.png" alt=""></p>
<p>For more details see <a href="#sysex-backup-and-restore">Sysex Backup and Restore</a></p>
<h4 id="ui-colour-settings-and-editor-options">UI Colour Settings and Editor Options</h4>
<p>At the bottom left is where you can change the hue, saturation, lightness of the UI colour scheme. You can also change the alpha of the UI background colour. There are also several editing options you can set here. More details under <a href="#changing-the-ui-colours">Changing the UI Colours</a> and <a href="#editor-options">Editor Options</a></p>
<p align="center">
  <img src="images/UI Colors and Options.png"/>
</p>
<h2 id="setting-up-and-getting-started">Setting Up and Getting Started</h2>
<p>Load VOLDRED into Touch OSC and in the Connections window make sure you have a MIDI output configured to send MIDI to your Volca Drum. VOLDRED sends all of the parameter changes via MIDI messages (from the Lua scripting). It does not use OSC.</p>

<div class="callout important">
    <div class="callout-header">
        
            <svg class="important" viewBox="0 0 16 16">
                <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
            </svg>
        
        Touch OSC MIDI
    </div>

    <p class="callout-body">
        By default, VOLDRED sends MIDI to your Volca on MIDI Connection #1 (Touch OSC setup). By default it uses MIDI Connection #2 (Touch OSC setup) to send and receive sysex Kit data.
    </p>

</div>


<div class="callout important">
    <div class="callout-header">
        
            <svg class="important" viewBox="0 0 16 16">
                <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
            </svg>
        
        Volca MIDI Mode
    </div>

    <p class="callout-body">
        Your Volca Drum must be in the default MIDI mode where the Parts are split across MIDI channels 1-6. VOLDRED won&rsquo;t work if your Volca Drum is in the single-channel mode.
    </p>

</div>


<div class="callout example">
    <div class="callout-header">
        
            <svg class="example" viewBox="0 0 16 16">
                <path d="M0 3.75C0 2.784.784 2 1.75 2h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 14H1.75A1.75 1.75 0 0 1 0 12.25Zm1.75-.25a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25ZM3.5 6.25a.75.75 0 0 1 .75-.75h7a.75.75 0 0 1 0 1.5h-7a.75.75 0 0 1-.75-.75Zm.75 2.25h4a.75.75 0 0 1 0 1.5h-4a.75.75 0 0 1 0-1.5Z"></path>
            </svg>
        
        Setup
    </div>

    <p class="callout-body">
        <p>First make sure everything is working:</p>
<ul>
<li>Toggle the editor mode in Touch OSC so that you&rsquo;re in controller mode.</li>
<li>Tap key 1 on your Volca Drum so you can hear the sound.</li>
<li>Switch to Part 1 in VOLDRED. Use the <em>Oscillator Level</em> radial to turn up the volume of Part 1.</li>
<li>Then trying moving the <em>Oscillator Pitch</em> slider up and down. You should hear the pitch change as you&rsquo;re tapping the Part 1 key on the VD.</li>
<li>If you can&rsquo;t hear the pitch change it&rsquo;s most likely an issue with your MIDI Connection in Touch OSC. Double-check your MIDI settings and if you still can&rsquo;t get it to work then drop me a line - see the &lsquo;Roundup&rsquo; section at the bottom of this document for contact link.</li>
</ul>
    </p>

</div>

<h2 id="editing-layer-parameters">Editing Layer Parameters</h2>
<p><img src="images/Layer.png" alt=""></p>
<p>The parameters in Layer 1 and Layer 2 should be pretty obvious as they correspond to the same settings/controls on the Volca Drum hardware.</p>

<div class="callout tip">
    <div class="callout-header">
        
            <svg class="tip" viewBox="0 0 16 16">
                <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z">
                </path>
            </svg>
        
        Control Value Display
    </div>

    <p class="callout-body">
        When you touch or move a control, it&rsquo;s name will be temporarily replaced with the current value of that control. If you have Pitch Quantization enabled (QPI) then the PITCH slider will display the current MIDI note instead of a numerical value.
    </p>

</div>


<div class="callout tip">
    <div class="callout-header">
        
            <svg class="tip" viewBox="0 0 16 16">
                <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z">
                </path>
            </svg>
        
        Radio Buttons
    </div>

    <p class="callout-body">
        Instead of having to use the Select knob on the Volca to scroll through all the combinations of <em>Oscillator Shape</em>, <em>Modulation Type</em> and <em>Envelope Shape</em>, you can just use the individual radio buttons to change those parameters directly!
    </p>

</div>

<p>The cluster of buttons below Oscillator Level won&rsquo;t be so obvious. They control the editing mode and also options for randomisation and initialisation of parameters.</p>
<h3 id="layers-linked-editing">Layers: Linked Editing</h3>
<p>The default editing mode lets you edit each Layer independently. However the Layers can be <em>linked</em> while editing meaning when you change parameters on one Layer, the parameter(s) on the other Layer will also be affected.</p>
<p>To enable linked editing tap on the <code>LINK</code> icon to the right of the Layer name. It will turn red when active.</p>
<p align="center">
  <img src="images/Link.png" height="150"/>
</p>
<p>Depending on the state of each <code>LINK</code> button, linked editing behaves in two slightly different ways:</p>

<div class="callout important">
    <div class="callout-header">
        
            <svg class="important" viewBox="0 0 16 16">
                <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
            </svg>
        
        Absolute and Relative Layer Editing
    </div>

    <p class="callout-body">
        <p>There are two different modes of the linked Layer editing, <strong>Absolute</strong> and <strong>Relative</strong></p>
<p><strong>Absolute Layer Editing</strong></p>
<p><em>When both of the two Layer Link buttons are active you are editing in Absolute Mode</em>.</p>
<p>Any changes you make to the Layer that has LINK enabled will be <em>mirrored</em> to the other Layer. This works similar to when you have &ldquo;LAYER 1+2&rdquo; selected on the VD. Moving a control on either Layer will set the parameter on the other Layer to the same value.</p>
<p><strong>Relative Layer Editing</strong></p>
<p><em>When only one of the Layer Link buttons is active you are editing in Relative Mode.</em></p>
<p>Any changes you make to the Layer that has LINK enabled will affect the other layer but instead of setting the parameter of both Layers to the same value, in this mode the relative numerical relationship between the two layers&rsquo; parameters is maintained for as long as you&rsquo;re touching the control. See below for an example.</p>
<p>Also when only one Layer Link button is active, the Layer that doesn&rsquo;t have <code>LINK</code> enabled will not affect then other Layer when you change its parameters.</p>
<p>Absolute Layer Editing* should be fairly familiar as it behaves in the same way as editing the two Layers simultaneously on the VD (Layer 1+2 mode). However <em>Relative Layer Editing</em> might not be so obvious.</p>

    </p>

</div>


<div class="callout tip">
    <div class="callout-header">
        
            <svg class="tip" viewBox="0 0 16 16">
                <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z">
                </path>
            </svg>
        
        Relative Layer Editing
    </div>

    <p class="callout-body">
        <p>Let&rsquo;s say  Layer 1 Level is set to 100 and Layer 2 Level is set to 50. If you enable the <code>LINK</code> button on Layer 1 (and LINK on Layer 2 is disabled) then you&rsquo;ll be editing in <em>Relative Mode</em>.</p>
<p>Now move Layer 1 Level control to 75. You&rsquo;ll see that instead of Layer 2 Level also being set to  75, instead it has moved to 25: maintaining the original relationship between the level of each Layer.</p>
<p>While still touching Layer 1 Level control, move it further so that Layer 2 Level goes all the way to 0. Then move Layer 1 Level back up again and you&rsquo;ll see that even though Layer 2 went to 0, it still maintains its original relationship to Layer 1 <em>at the time you touched the control</em>.</p>

    </p>

</div>

<h2 id="randomisation-and-initialisation">Randomisation and Initialisation</h2>
<p>The two buttons under the <em>Oscillator Level</em> control, <code>RAND</code> and <code>INIT</code> are used to randomise and initialise parameters respectively. Exactly how and what the <code>RAND</code> and <code>INIT</code> buttons affect depends on the three toggle buttons above them: <code>LY</code>, <code>FX</code> and <code>WG</code></p>
<p align="center">
  <img src="images/Link.png" height="150"/>
</p>

<div class="callout tip">
    <div class="callout-header">
        
            <svg class="tip" viewBox="0 0 16 16">
                <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z">
                </path>
            </svg>
        
        Randomisation and Initialisation Modes
    </div>

    <p class="callout-body">
        <p><code>LY</code> : If <code>LY</code> is enabled, when you press <code>RAND</code> or <code>INIT</code>, all the Layer parameters of the current Part will be affected.</p>
<p><code>FX</code> : If <code>FX</code> is enabled, when you press <code>RAND</code> or <code>INIT</code>, the controls in the FX section will be affected. Note: this includes the Waveguide Send control.</p>
<p><code>WG</code> : If <code>WG</code> is enabled, when you press <code>RAND</code> or <code>INIT</code> the controls in the Waveguide will be affected. Note: this does not include the Waveguide Send control.</p>
<p>It should be obvious but you can enable/disable any combination of these three buttons to target exactly the result you want.</p>

    </p>

</div>

<h3 id="linked-randomisation-and-initialisation">Linked Randomisation and Initialisation</h3>
<p>Similar to how the <em>Layer Link</em> button behaves when manually editing the controls, <em>Layer Link</em> also affects randomisation and initialisation. For example if you have LINK enabled on Layer 1 and you press the Layer 1 <code>RAND</code> button, the parameters in Layer 2 will also be randomised.</p>

<div class="callout note">
    <div class="callout-header">
        
            <svg class="note" viewbox="0 0 16 16">
                <path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z">
                </path>
            </svg>
        
        
    </div>

    <p class="callout-body">
        There isn&rsquo;t an <em>Absolute</em> or <em>Relative</em> mode when using <code>RAND</code> or <code>INIT</code>. If a Layer Link button is active, it will affect the other Layer by either randomising or initialising its parameters too.
    </p>

</div>

<h3 id="locking-parameters-from-rand-and-init">Locking Parameters from RAND and INIT</h3>
<p>There is a <em>hidden</em> feature (read: not so obvious from the UI) that enables you to lock out any number of individual parameters from being affected by <code>RAND</code> or <code>INIT</code>. Simply tap on the parameter name. If it&rsquo;s locked it will have a box around the text.</p>
<p>Here, <em>Modulation Type</em> is unlocked while <em>Amount</em> and <em>Rate</em> are locked.</p>
<p align="center">
  <img src="images/Locked.png" height="150"/>
</p>
<h3 id="pitch-and-q">PITCH and Q</h3>
<p>You&rsquo;ll notice above the slider that controls Oscillator Pitch, there is a toggle button labelled <code>Q</code></p>
<p align="center">
  <img src="images/Pitch Q.png" height="150"/>
</p>
<p>This is to enable or disable the Volca&rsquo;s pitch quantisation (QPI). When disabled the oscillator pitch isn&rsquo;t quantised. When enabled the pitch is quantised to semi-tone intervals.</p>
<p>In Korg&rsquo;s wisdom they gave us just one Pitch Q control per Part so if you enable/disable it in one Layer, it&rsquo;s also enabled/disabled in the other Layer as a visual reminder that Pitch Q affects both Layers.</p>

<div class="callout tip">
    <div class="callout-header">
        
            <svg class="tip" viewBox="0 0 16 16">
                <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z">
                </path>
            </svg>
        
        Dynamic Value Display
    </div>

    <p class="callout-body">
        When you touch or move a control, it&rsquo;s name will be temporarily replaced with the current value of that control. If you have Pitch Quantization enabled (QPI) then the PITCH slider will display the current MIDI note instead of a numerical value.
    </p>

</div>

<h3 id="reloading-part">Reloading Part</h3>
<p align="center">
  <img src="images/Reload Part.png" height="150"/>
</p>
<p>Tapping the circle-arrow button at the top-left just underneath the Part selector will reload the currently selected Part from the currently loaded Kit.</p>

<div class="callout tip">
    <div class="callout-header">
        
            <svg class="tip" viewBox="0 0 16 16">
                <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z">
                </path>
            </svg>
        
        
    </div>

    <p class="callout-body">
        <p>Reloading the current Part will only reload Layer 1, Layer 2 and the FX parameters. Waveguide parameters will not be reloaded.</p>
<p>See <a href="#loading-and-saving-kits">Loading and Saving Kits</a> for explanation of how to load and save kits in VOLDRED.</p>

    </p>

</div>

<h2 id="part-fx-and-waveguide-1">Part FX and Waveguide</h2>
<p align="center">
  <img src="images/FX and Waveguide.png" width="160"/>
</p>
<h3 id="fx">FX</h3>
<p>Both Layers in a Part share the parameters in the FX section. These are <code>PAN</code>, <code>BIT</code> (crush), <code>FOLD</code>, <code>DRIVE</code>, <code>DRY</code> (gain) and <code>SEND</code> (Send is the send amount to the Waveguide). I don&rsquo;t think there&rsquo;s anything more to say about FX.</p>
<h3 id="waveguide">Waveguide</h3>
<p>Similar to Volca Drum FX parameters, there is only one Waveguide section which is shared by all Parts, though each Part does have its own independent Send that controls how much of the output of each Part is sent to the Waveguide processor.</p>
<p>The Waveguide is shown on each Part&rsquo;s display but if you change any of the Waveguide parameters on a Part page it applies to all Parts. I&rsquo;m sure you know this as a Volca Drum user but it&rsquo;s worth reinforcing here as each Part might seem to have its own set of Waveguide parameters: they don&rsquo;t but I display the Waveguide in each Part for editing convenience.</p>
<h2 id="alternative-radial-control">Alternative Radial Control</h2>
<p>As much as I &#x1f60d; Touch OSC, I&rsquo;ve never been a fan of the fact that the only way to move the Radial control is to rotate your touch around it. Often I find that awkward and wish there was an option to enable you to just touch and move your finger vertically (or horizontally) to change the value.</p>
<p>Until that time, VOLDRED has an option in <a href="#editor-options">Editor Settings</a> - <code>Extendad Radial control?</code></p>
<p>What this does is add an invisible overlay over the Radial controls to enable you to control the Radials by moving your finger vertically on them. Look at this image of the Oscillator Level control. I&rsquo;ve made the overlays visible so I can explain the details:</p>
<p align="center">
  <img src="images/Radial Overlays.png" width="300"/>
</p>
<p>When the Radial overlay are enabled, you touch the control and move your finger up or down: up increases the Radial value and down decreases it. You can see that the overlay is split into two halves. The right side is for fast/large parameter changes while the left side gives you finer, more precise control.</p>
<p>This is the same for all of the smaller Radial controls too (FX, Waveguide) and also applies to the Macro Radials though on the Macro Radials there is only one overlay. I did this as I feel the Macro controls are more aligned with performance rather than preceise editing: there&rsquo;s already plenty other ways to edit the Part parameters if you want precision.</p>
<h2 id="controller-window">Controller Window</h2>
<p>VOLDRED includes a <em>secret</em> Controller Window that combines Drum Pads, Mini Keyboard and Macro Knobs in the same floating window. To open and close it, tap on the small square icon in the top-left of Layer 1.</p>
<p align="center">
  <img src="images/Open Controller.png" width="300"/>
</p>
<p>The window is a multi-function window so its appearance will depend on the last time you used it. It will either be in Drum Pad, Mini Keyboard or Macro mode.</p>
<h3 id="drum-pads-triggers">Drum Pads (Triggers)</h3>
<p><img src="images/Drum%20Pads.png" alt=""></p>
<p>In this mode, tapping on each of the pads, <code>P-1</code> to <code>P-6</code> will trigger the sound on those Parts (tracks) on the Volca Drum.</p>
<p>Velocity is mapped to the position you tap on the pad: maximum velocity is in the middle and it reduces the closer to the edge of the pad you tap.</p>
<h4 id="drum-pad-icon">Drum Pad Icon</h4>
<p>To switch to Mini Keyboard tap the keyboard icon at the top-right.</p>
<h4 id="macro-icon">Macro Icon</h4>
<p>The circle icon takes you to the Macros but we&rsquo;ll look at the keyboard first.</p>
<h3 id="mini-keyboard-pitch">Mini Keyboard (Pitch)</h3>
<p><img src="images/Mini%20Keyboard.png" alt=""></p>

<div class="callout important">
    <div class="callout-header">
        
            <svg class="important" viewBox="0 0 16 16">
                <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
            </svg>
        
        Volca and MIDI Notes
    </div>

    <p class="callout-body">
        The Volca Drum does not respond to MIDI note numbers in Key-On messages. The Pitch Input keyboard works by directly setting the Oscillator Pitch parameter so just be aware that it will modify the currently selected Part.
    </p>

</div>

<p>OK so this one will take a little more explaining than the Drum Pad/Triggers mode. It was also one of my favourite VOLDRED features to realise!</p>
<p>I&rsquo;ll go over the controls first and then explain a bit more about what&rsquo;s actually going on:</p>
<h4 id="keyboard">Keyboard</h4>
<p>The <em>keyboard</em> is just over 1 octave of touch pads (16 in total) starting at C and ending an octave-and-a-bit above at D#/Eb. The nearer to the bottom edge you tap, the higher the velocity.</p>

<div class="callout tip">
    <div class="callout-header">
        
            <svg class="tip" viewBox="0 0 16 16">
                <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z">
                </path>
            </svg>
        
        Keyboard Quantise
    </div>

    <p class="callout-body">
        Remember that the Volca Drum has two pitch modes: unquantised and quantised. To get proper musical semi-tone intervals on the keyboard you need to be in quantised mode by enabling the Q button above the Pitch slider. You can use the keyboard in either mode though, of course.
    </p>

</div>

<h4 id="trg---trigger"><code>TRG</code> - Trigger</h4>
<p>This toggle-button controls whether the current Part is triggered as you tap the keys on the keyboard. Handy if you&rsquo;re modifying a Part with the sequencer running, for example, so that you can use the keyboard to change the pitch without repeatedly triggering the sound.</p>
<h4 id="oct---octave"><code>OCT</code> - Octave</h4>
<p>You can change the current octave of the keyboard. The current octave is displayed on the two &ldquo;C&rdquo; keys.</p>
<h4 id="lyr---layer"><code>LYR</code> - Layer</h4>
<p>This radio-button toggles the target Layer between Layer 1 and Layer 2.  You might only want to affect the pitch of a single Layer so this is how you do it.</p>

<div class="callout tip">
    <div class="callout-header">
        
            <svg class="tip" viewBox="0 0 16 16">
                <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z">
                </path>
            </svg>
        
        Keyboard and LINK
    </div>

    <p class="callout-body">
        The keyboard also respects the <code>LINK</code> buttons in the Layers. If you have <code>LINK</code> on for Layer 1 and use the keyboard to send pitch information to Layer 1, the pitch of Layer 2 will also be affected <em>relative</em> to its original relationship to Layer 1. If <code>LINK</code> is on for both Layers, the same pitch will be sent to both Layers. Exactly the same way as editing parameters or using <code>RAND</code> and <code>INIT</code> functions. Super handy if you&rsquo;re trying to set specific intervals between the two Layers.
    </p>

</div>

<h4 id="how-does-it-work">How Does It Work?</h4>
<p>As per the comment above, the Volca Drum <em>does not respond to MIDI note numbers</em> so you have no <em>normal</em> way of triggering the sounds in a <em>pitched</em> or <em>melodic</em> way. The way the mini keyboard works in VOLDRED is by sending MIDI CC values for the Oscillator Pitch and then (optionally) triggering the currently selected Part to mimic MIDI Key-On message. It isn&rsquo;t perfect. The main quirk is there is some unfathomable lag or slew when you change the Oscillator Pitch parameter so it always sounds like it has some degree of pitch gliding. The other unavoidable <em>problem</em> is that in order to work it has to modify the current Part.</p>

<div class="callout tip">
    <div class="callout-header">
        
            <svg class="tip" viewBox="0 0 16 16">
                <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z">
                </path>
            </svg>
        
        Synchornised Editing Example
    </div>

    <p class="callout-body">
        <p>Let&rsquo;s say you wanted a melodic Part with the pitch of the two oscillators set a fifth (7 semitones) apart.</p>
<p>Start off by initialising the two Layers of the current Part. You can either tap the <code>INIT</code> button in both parts or just use Layer 1 and enable its LINK button. For the sake of this example, enable <code>LY</code>, <code>FX</code> and <code>WG</code> before pressing <code>INIT</code> so that we have a simple, clean sound to demonstrate.</p>
<p>Now make sure <code>LINK</code> is not enabled on either Layer and open the mini keyboard window. You&rsquo;ll also want to enable <code>Pitch Q</code>.</p>
<p>Set the <code>LYR</code> number to <code>1</code> and tap the first C key. Layer 1 pitch will now be set to C. Set <code>LYR</code> to <code>2</code> now and then tap the G key. Layer 2 will now be set to G.</p>
<p>Enable the <code>LINK</code> button on Layer 1 and set the <code>LYR</code> number back to <code>1</code>.</p>
<p>Now when you play the keyboard you&rsquo;ll hear that the two Layers are always seven semitones apart.</p>

    </p>

</div>

<h3 id="macro-controls">Macro Controls</h3>
<p><img src="images/Macros.png" alt=""></p>
<p>This one will also take a bit of explaining. Settle in.</p>

<div class="callout important">
    <div class="callout-header">
        
            <svg class="important" viewBox="0 0 16 16">
                <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
            </svg>
        
        Macro Control Scope
    </div>

    <p class="callout-body">
        There are six Macro Controls, each of which can be mapped to multiple controls. Even though there are six, the same number as there are Parts, the Macro Controls are not tied to a specific Part. For example, any Macro Control can be mapped to any number of parameters over one or more Parts and even the Waveguide.
    </p>

</div>

<h4 id="macro-control">Macro Control</h4>
<p>First thing, get to know the controls of a Macro Control. Each of the 6 Macro Controls are identical.</p>
<p align="center">
  <img src="images/Macro Knob.png" height="200"/>
</p>
<h5 id="macro-dial">Macro Dial</h5>
<p>The dial in the center is what controls the output of the Macro Control. Once parameters are assigned to it, rotating the control will send values to the mapped parameters.</p>
<h5 id="mapping-button-">Mapping Button <code>+</code></h5>
<p>Tap this button to enable mapping for this Macro. When in mapping mode the Macro name (M1 in this case) will flash as a <em>warning</em> that you are in Mapping Mode. More on this below.</p>
<h5 id="clear-button-x">Clear Button <code>X</code></h5>
<p>This simply clears any mapping from the Macro.</p>
<h5 id="mapped-controls-indicator">Mapped Controls Indicator</h5>
<p>The circular indicator at the top-left indicates if any parameters are currently mapped to this Macro. If it&rsquo;s off then this Macro has no mapped parameters. This is mainly so when looking to map parameters you can see at a glance any Macro Controls that are currently unused.</p>
<h5 id="dial-mode">Dial Mode</h5>
<p>The diamond-shaped button at the top-right controls what happens when you move (and then release) the Macro Dial. When this button is unlit, once you release your finger/mouse on the Macro Dial, the value of the dial stays where you left it. If this button is lit, when you lift off your finger the Macro Dial will snap back to zero.</p>
<h4 id="mapping-parameters-to-macro-controls">Mapping Parameters to Macro Controls</h4>
<p>Here&rsquo;s where it gets a little weird. Weird is good.</p>

<div class="callout note">
    <div class="callout-header">
        
            <svg class="note" viewbox="0 0 16 16">
                <path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z">
                </path>
            </svg>
        
        Parameter Mapping
    </div>

    <p class="callout-body">
        <p>Let&rsquo;s start off simple. We&rsquo;ll map the Oscillator Level (Part 1, Layer 1) to Macro Control M1. Have Part 1 selected and open the Controller Window and switch to Macros.</p>
<ul>
<li>First click/press the <code>X</code> on Macro M1 to clear any previous mapping. If the Dial Mode button is on (the diamond button at the top-right), turn it off for the time being</li>
<li>Then click/press the <code>+</code> button on Macro Control M1 to enable mapping. <code>M1</code> will start flashing to tell you that you are in mapping mode.</li>
<li>Now we will define the <em>range</em> of how the Macro Dial affects the Oscillator Level by moving the Level control between two points. Click somewhere near the bottom and move the control to somewhere near the top of it&rsquo;s range. M1 will momentarily flash to tell you that the mapping has been registered</li>
<li>Now try moving the Macro Dial and you will see Oscillator Level move through the range you just defined. The range you defined is scaled over the full range of the Macro Dial</li>
<li>This also works in both directions. For simplicity, tap the <code>+</code> button to stop mapping and then the <code>X</code> button to clear the mapping you just made</li>
<li>Now move the Oscillator Level to maximum. Re-engage mapping on M1 and this time tap-and-drag the Oscillator Level from maximum to it&rsquo;s minimum. Again M1 will flash to let you know the mapping was successful</li>
<li>Now when you move the Macro Dial you&rsquo;ll see that Oscillator Level moves in the opposite direction to the Macro Dial</li>
<li>Tap the Dial Mode (diamond) button to turn it on. You&rsquo;ll see that the Macro Dial snaps back to zero. Move the Macro Dial and let it go to see the behaviour in this mode.</li>
<li>Now while mapping is still enabled (M1 flashing?) add another parameter or two by tapping-and-dragging in the same way. Move the Macro Dial and see that all mapped parameters are now controlled by M1</li>
</ul>
    </p>

</div>

<h3 id="wait-theres-more">Wait, There&rsquo;s More!</h3>
<p>I know what you&rsquo;re thinking: sure, that little keyboard thing is handy but it often gets in the way of the Layer controls. Well&hellip;you can move it! I know: I&rsquo;m good.</p>
<p>If you tap-and-hold anywhere in the big empty part at the top, between the two icons, you can drag the window around and place it somewhere out of the way when you&rsquo;re editing parameters but still want to be able to trigger the Parts or play the Volca via the mini-keyboard.</p>
<p align="center">
  <img src="images/Controller Window Move.gif"/>
</p>

<div class="callout tip">
    <div class="callout-header">
        
            <svg class="tip" viewBox="0 0 16 16">
                <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z">
                </path>
            </svg>
        
        A Clever Hack!
    </div>

    <p class="callout-body">
        <p>Without going into too much explanation, you can&rsquo;t <em>really</em> do this in Touch OSC. You can only really move objects around when you&rsquo;re in Edit mode. But that&rsquo;s no use in this case as when you&rsquo;re in Edit mode you can&rsquo;t <em>use</em> the keyboard.</p>
<p>So the window-dragging is a big hack I came up with. A clever hack but a hack all the same.</p>
<p>Because of this there is an annoying <em>quirk</em> where you&rsquo;re able to drag your touch/mouse pointer outside of the window when dragging and it will stop moving the window and touch/press the control that&rsquo;s directly under where your finger/mouse left the window. I haven&rsquo;t figured out a way to fix it so my advice to you is thus: don&rsquo;t try to drag the window around really quickly and be deliberate about where you tap-and-drag to reduce the risk of the &ldquo;pop out&rdquo; bug.</p>

    </p>

</div>


<div class="callout note">
    <div class="callout-header">
        
            <svg class="note" viewbox="0 0 16 16">
                <path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z">
                </path>
            </svg>
        
        
    </div>

    <p class="callout-body">
        If the keyboard window is open and you switch to the SETTING tab, the window will be hidden temporarily until you switch back to one of the six Part tabs.
    </p>

</div>

<h2 id="loading-and-saving-kits">Loading and Saving Kits</h2>
<p>A few things to get out of the way first:</p>
<ul>
<li>Touch OSC projects cannot save any sort of data to the host filesystem. Loading and saving inside of VOLDRED uses a clever hack (here we go again!) to store hidden data within the Touch OSC (.tosc) file itself. When you save the Touch OSC file the &lsquo;saved&rsquo; data is saved with it and can be recalled when you next open the <code>.tosc</code> file.</li>
<li>Volca Drum doesn&rsquo;t have MIDI out or any way of externally <em>reading</em> the parameters. The kit numbers within VOLDRED bear no relationship to the kit numbers in the Volca Drum.</li>
<li>Consequently when you load (send) a kit from VOLDRED to the Volca Drum, the currently selected kit on the Volca Drum is temporarily modified - as if you&rsquo;d instantly tweaked all the controls.</li>
</ul>
<p>In short, VOLDRED kits exist in their own bubble inside of the Touch OSC file. Of course, you can <em>load</em> a kit in VOLDRED (sent to the VD) and then use the VD Save Kit to save the current settings to one of the 16 kits on the VD. If you don&rsquo;t save the kit on the VD, then you power it off or change kits on the VD, whatever you sent from VOLDRED will be lost (though still inside VOLDRED of course). I&rsquo;m probably making this seem more complicated than it is.</p>
<p>The other thing to bear in mind is loading and saving PRGs on the VD. When you change PRGs the kit with the same number as the PRG is loaded. This works slightly differently from loading a kit (on the VD) as you can load any of the 16 kits and keep the same PRG sequence. You&rsquo;ll know this if you&rsquo;re a seasoned VD user but it&rsquo;s worth mentioning here as it has implications on VOLDRED&rsquo;s loading of kits: if you send a kit from VOLDRED and then change PRGs, the VD&rsquo;s kit will change also.</p>
<h3 id="how-to-load-and-save-in-voldred">How To Load and Save in VOLDRED</h3>
<p>With all that out of the way you&rsquo;ll be reassured to know that actually loading and saving inside VOLDRED is fast, convenient and intuitive. To access loading and saving go to the SETTINGS tab.</p>
<p><img src="images/Load%20and%20Save.png" alt=""></p>
<h4 id="slots">Slots</h4>
<p>The 16 numbered boxes across the display are your kit <em>slots</em>. To <em>load</em> one just tap it. It will load pretty instantly and you&rsquo;ll get a message in the status box (the text box above) telling you it loaded.</p>
<p>If you look directly underneath each slot there is a small rectangular indicator. If this is on/filled it means a kit is saved in that slot. If it&rsquo;s off/unfilled that means the slot is empty. If you try to load an empty slot you&rsquo;ll get an error message telling you that nothing was loaded.</p>
<h4 id="saving">Saving</h4>
<p>To <em>save</em> the current kit to a slot, first tap on the <code>SAVE</code> button. It will turn red indicating that it&rsquo;s waiting for you to select a slot. Tap a slot to save. If you change your mind, tap the <code>SAVE</code> button again to cancel the save operation.</p>
<h4 id="clear">Clear</h4>
<p>The <code>CLEAR</code> button will clear the currently selected slot. There&rsquo;s no undo but if you&rsquo;ve just selected a slot to clear it, that slot will still be <em>loaded</em>. So, if you accidentally clear a slot, just save it again. If you try to tap <code>CLEAR</code> while <code>SAVE</code> is active you&rsquo;ll get an error message telling you to cancel <code>SAVE</code> before you can <code>CLEAR</code> the slot.</p>
<h4 id="switching-kits-via-midi">Switching Kits Via MIDI</h4>
<p>It&rsquo;s also possible to recall Kits using MIDI control. Sending a Program Change message on Channel 1 to VOLDRED (inside Touch OSC) with the program change number 1 to 16 will recall the corresponding Kit. If the slot you try to recall is empty it will just fail silently and leave the current kit intact.</p>
<h2 id="copying-parts">Copying Parts</h2>
<p><img src="images/Copy%20Parts.png" alt=""></p>
<p>This should be fairly self-explanatory. You select the source Part on the left (P1-P6) and the destination Part on the right then tap <code>COPY</code> to copy the parameters from one Part to the other.</p>
<p>The <code>L1</code>, <code>L2</code> and <code>FX</code> buttons next to the COPY button are toggles to let you filter what parameter groups are copied:</p>
<ul>
<li><code>L1</code> means everything from Layer 1 is copied when <code>COPY</code> is pressed</li>
<li><code>L2</code> means everything from Layer 2 is copied when <code>COPY</code> is pressed</li>
<li><code>FX</code> means the FX parameters are copied when <code>COPY</code> is pressed</li>
</ul>
<p>There&rsquo;s no option for copying Waveguide parameters as they&rsquo;re common to all Parts.</p>
<p>It should be obvious but you can select any combination of <code>L1</code>, <code>L2</code> and <code>FX</code> to copy exactly the parameters you want.</p>
<h2 id="sysex-backup-and-restore">Sysex Backup and Restore</h2>
<p><img src="images/Sysex.png" alt=""></p>
<p>As well as storing the 16 kits inside of the the .TOSC file when you save it, I recently added the ability to export and import Kit data from VOLDRED!</p>

<div class="callout warning">
    <div class="callout-header">
        
            <svg class="warning" viewBox="0 0 16 16">
                <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
            </svg>
        
        Careful now!
    </div>

    <p class="callout-body">
        The sysex features are a relatively new addition to VOLDRED and have only received minimal testing and usage. Nothing should really <em>break</em> but&hellip;you know&hellip;
    </p>

</div>

<h3 id="sysex-setup">Sysex Setup</h3>

<div class="callout tip">
    <div class="callout-header">
        
            <svg class="tip" viewBox="0 0 16 16">
                <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z">
                </path>
            </svg>
        
        Volca, Touch OSC and MIDI Channel Reminder
    </div>

    <p class="callout-body">
        <p>VOLDRED always attempts to communicate with your <strong>Volca Drum</strong> via MIDI on the <strong>first MIDI connection</strong> (in Touch OSC setup).</p>
<p>VOLDRED always attempts to <strong>send and receive sysex data</strong> via MIDI on the <strong>second MIDI connection</strong> (in Touch OSC setup).</p>
<p>This is my own setup to illustrate:</p>
<p><img src="images/Touch%20OSC%20MIDI.png" alt=""></p>
<p>Here you can see that MIDI connection 1 is set to send and receive on my Zoom L6 interface (which is what I have the Volca MIDI connected to). MIDI connection 2 is set to &ldquo;IAC Driver Bus&rdquo; which is an internal MIDI connection on OSX.</p>
<p>I then have a free sysex tool (OSX) called &ldquo;Sysex Librarian&rdquo; (there are Windows/Linux equivalents I&rsquo;m sure):</p>
<p><img src="images/Sysex%20Librarian.png" alt=""></p>

    </p>

</div>

<h3 id="sysex-how-to-use">Sysex: How To Use</h3>
<p>As mentioned above, you&rsquo;ll need some sort of sysex librarian/tool software/app to receive and send the sysex data. I use &ldquo;Sysex Librarian&rdquo; on OSX (free) so find one for your own platform/setup. Once you&rsquo;ve setup the MIDI connections in Touch OSC as detailed above, actually using the send and receive controls is very straightforward. I&rsquo;ll describe the process in relation to Sysex Librarian but I&rsquo;m sure other software have a similar method.</p>
<h4 id="sysex-sending">Sysex Sending</h4>
<p>On Sysex Librarian you have to click on &ldquo;Record One&rdquo; to engage receiving. Once it&rsquo;s waiting for sysex data, go to VOLDRED and tap on the <code>SEND</code> button:</p>
<p><img src="images/Sysex.png" alt=""></p>
<p>Your Kit data will be sent to Sysex Librarian and the file will appear in the app&rsquo;s library as an unnamed file. From there you can either leave it in the internal library or export it as a .syx or .mid file. This is useful is you want to send or share your Kit sysex or move it to another device etc.</p>
<h4 id="sysex-receiving">Sysex Receiving</h4>
<p>To import a sysex Kit you first need to engage the <code>RECEIVE</code> button. When VOLDRED is waiting for sysex data the receive button will be coloured red.</p>
<p><img src="images/Sysex%20Receive.png" alt=""></p>
<p>Go to Sysex Librarian, select a previously exported Kit file and click on the Play button (or double-click the file in the library list). The sysex data will be received by VOLDRED and then decoded into the 16 kit slots.</p>

<div class="callout note">
    <div class="callout-header">
        
            <svg class="note" viewbox="0 0 16 16">
                <path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z">
                </path>
            </svg>
        
        
    </div>

    <p class="callout-body">
        After importing via sysex, no Kit is &rsquo;loaded&rsquo; to the editor or sent to your Volca so you need to click on one of the Kit Slot to actually load a Kit and send it to your Volca.
    </p>

</div>


<div class="callout important">
    <div class="callout-header">
        
            <svg class="important" viewBox="0 0 16 16">
                <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
            </svg>
        
        App-to-app Sysex on Same Device
    </div>

    <p class="callout-body">
        <p>At the date of writing this I haven&rsquo;t found a way to send and receive sysex data from VOLDRED on iPad to another app running on the iPad. I&rsquo;ve tried a few but none seem to work.</p>
<p>However there is a way to do it via Network MIDI if you have an iPad and a MacOS computer.</p>
<p>First setup a MIDI Network session via &ldquo;Audio MIDI Setup&rdquo;</p>
<p><img src="images/MIDI%20Setup%20Network.png" alt=""></p>
<p>Then create a new session and when your iPad appears select it and click on &ldquo;Connect&rdquo;</p>
<p><img src="images/MIDI%20New%20Network%20Session.png" alt=""></p>
<p>Then in your sysex librarian (Sysex Librarian here), simply change the MIDI device to the network session you just created:</p>
<p><img src="images/Sysex%20Librarian%20Network.png" alt=""></p>
<p>You should now be able to send and receive sysex from VOLDRED as though the devices were physically connected.</p>

    </p>

</div>

<h2 id="changing-the-ui-colours">Changing the UI Colours</h2>
<p align="center">
  <img src="images/UI Colours.png" height="320"/>
</p>
<p>On the <code>SETTINGS</code> tab you can completely alter the entire colour scheme for VOLDRED.</p>
<p>There are four sliders: H (hue), S (saturation), L (lightness) and A (background alpha). Slide these around until you get your perfect colour scheme!</p>
<h3 id="setting-individual-colors-for-parts">Setting Individual Colors for Parts</h3>
<p>The column of toggle-buttons to the right select which colors you&rsquo;ll be modifiying when you move the HSL sliders. By default they are all on, meaning whatever color you set will be applied to all Parts, Waveguide, Controller etc.</p>
<p>If you want to set an individual color for a Part, for example, uncheck all of the toggle-buttons and only turn on the Part you want to change the color of. Now when you move the HSL sliders only that Part will have its color changed.</p>
<p><code>P1</code> - <code>P6</code> should be very obvious. <code>UI</code> applies to the Settings tab, the Waveguide and the Controller overlay though there is also an option in Options to have the color of the Waveguide and Controller overlay follow the currently selected Part tab.</p>
<p align="center">
  <img src="images/Colour 1.png" width="400"/>
</p>
<p align="center">
  <img src="images/Colour 2.png" width="400"/>
</p>
<p align="center">
  <img src="images/Colour 3.png" width="400"/>
</p>
<h2 id="editor-options">Editor Options</h2>
<p><img src="images/Options.png" alt=""></p>
<p>These may be changed or expanded in the future but for now these are the Editor Options:</p>
<p><code>Load Kit 01 at Launch</code>
A convenience option to have VOLDRED send the kit in slot 01 to your Volca Drum when you run VOLDRED.</p>
<p><code>Pads/Keys Fixed MIDI Velocity</code>
By default, the position you tap on the pads and keys in the keyboard window determines the MIDI velocity of the triggered sound. If you&rsquo;d rather this didn&rsquo;t happen you can have the velocity fixed.</p>
<p><code>Radial/Fader Relative Response</code>
This option switches between the two response modes of the Touch OSC controls. The default is absolute which will set the current value of the control to wherever you touch it. In relative mode you can click/touch anywhere on the control and the value won&rsquo;t change until you drag your finger/mouse. Just an editing preference really.</p>
<p><code>Extended Radial Control</code>
This option turns on the invisible overlays for all of the Radial-style controls so that you can use your finger to swip up or down to change the value rather than having to rotate your finger around the Radial. The overlay is split into two halves: the right side gives you faster/coarser control while the left side allows you finer and more precise control.</p>
<p>This also applies to the Macro Radial controls though there is only a single overlay for these as the Macro window is more of a performance feature rather than something you&rsquo;d use for finer editing.</p>
<p><code>Mute MIDI When Mapping</code>
When you&rsquo;re setting the control range for macro mapping, by default the control you&rsquo;re adding to the macro map will send out MIDI data to your Volca just as if you were using the control normally. Sometimes this is handy but sometimes you might want to <em>silently</em> set the macro range. Turn this on and when you&rsquo;re setting the range, the control you&rsquo;re mapping won&rsquo;t send out MIDI data. Note this is only while mapping is active. MIDI function will be resumed if either the Macro window is closed or none of the six macro controls are in mapping mode.</p>
<p><code>WG/Controller Color Follow Parts</code>
Adding the option to set individual colors for the Parts threw up a couple of consistency issues. This is because the Waveguide is common to all parts, as is the Controller Overlay (Keys/Pads/Macros). This option is to decide what to do with those elements.</p>
<p>When this option is off, the Waveguide and Controller use the same colors as the Settings tab (UI in the color options). When this setting is on, the Waveguide and Controller will change color depending on the color of the currently selected Part tab.</p>
<h2 id="roundup">Roundup</h2>
<p>I guess the important thing to remember is to save the VOLDRED .tosc file - if you don&rsquo;t do that then all your editing and saved kits will be lost. It&rsquo;s far from ideal but there&rsquo;s no way to get around that limitation, mostly due to the lack of MIDI Out on the Volca Drum (and thus the ability to read/dump the kits from it).</p>
<p>The other big restriction is the inability for Touch OSC to access the host&rsquo;s filesystem. I&rsquo;ve tried (and I think it&rsquo;s pretty successful!) to compensate for this viw the sysex exporting and importing of Kit data. How useful that will be to you will very much depend on your own system and setup, especially the lack of a in-the-box solution for iPad. And though I can make it work for me using Sysex Librarian and wireless networked MIDI to my Macbook, I don&rsquo;t own a Windows or Linux machine that I can test on. Worst case: keep saving the .TOSC file and save multiple versions for different kits.</p>
<p>I genuinely hope you find it useful and creatively inspiring. Once you get the hang of using it there&rsquo;s a lot of fun things you can do.</p>
<h2 id="technical-stuff">Technical Stuff</h2>
<p>Due to the nature of Touch OSC files and the Lua scripting you can freely poke around inside the project and see how I did stuff. Most of the scripting is done in the root of the project file.</p>
<p>If you&rsquo;ve any questions or issues or suggestions, drop me a line at <a href="mailto:info@marmotaudio.co.uk">info@marmotaudio.co.uk</a></p>
<p>Neil</p>
<h2 id="support-my-work-just-in-case-you-missed-it-at-the-top">Support My Work (just in case you missed it at the top)</h2>
<p>If you like my work and use it or learn from it, please consider supporting me or just a donation to say thanks:</p>
<p><a href="https://www.buymeacoffee.com/neilbaldwi3" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 40px !important;" ></a></p>
<p>&#x1f64f;</p>
]]></content:encoded>
    </item>
    <item>
      <title>August Update</title>
      <link>https://neilbaldwin.codeberg.page/august_update/</link>
      <pubDate>Wed, 03 Sep 2025 19:57:45 +0100</pubDate><author>neil.baldwin@mac.com (Neil Baldwin)</author>
      <guid>https://neilbaldwin.codeberg.page/august_update/</guid>
      <description>&lt;h1 id=&#34;huh-where-did-the-last-5-months-go&#34;&gt;Huh, where did the last 5 months go!?&lt;/h1&gt;
&lt;p&gt;The inexorable march of time. Plus I&amp;rsquo;m so, so easily distracted by an interesting new project. And I&amp;rsquo;m just fucking terrible at finishing anything.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h1 id="huh-where-did-the-last-5-months-go">Huh, where did the last 5 months go!?</h1>
<p>The inexorable march of time. Plus I&rsquo;m so, so easily distracted by an interesting new project. And I&rsquo;m just fucking terrible at finishing anything.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Welcome to USE HEARING PROTECTION</title>
      <link>https://neilbaldwin.codeberg.page/welcome/</link>
      <pubDate>Mon, 24 Mar 2025 20:31:55 +0000</pubDate><author>neil.baldwin@mac.com (Neil Baldwin)</author>
      <guid>https://neilbaldwin.codeberg.page/welcome/</guid>
      <description>&lt;h1 id=&#34;is-this-marmot-audio&#34;&gt;Is this Marmot Audio?&lt;/h1&gt;
&lt;p&gt;Good question! In spirit: yes.&lt;/p&gt;
&lt;p&gt;Just before closing down my old website I posted this which explains things a little more:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The time has come to close the shutters on Marmot Audio. I&amp;rsquo;ve been neglecting it for some time now. Apologies to any potential customers who might have emailed me in the last few months and received no reply: that was uncharacteristically rude of me and I hope you found help elsewhere with your projects.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h1 id="is-this-marmot-audio">Is this Marmot Audio?</h1>
<p>Good question! In spirit: yes.</p>
<p>Just before closing down my old website I posted this which explains things a little more:</p>
<blockquote>
<p>The time has come to close the shutters on Marmot Audio. I&rsquo;ve been neglecting it for some time now. Apologies to any potential customers who might have emailed me in the last few months and received no reply: that was uncharacteristically rude of me and I hope you found help elsewhere with your projects.</p>
<p>There&rsquo;s no drama. I took a full-time job at a brewery last year and since then I&rsquo;m running the place. As such it&rsquo;s demanding much more of my time and more of my physical and mental energy. Something had to give.</p>
<p>I&rsquo;d like to express gratitude and humility to everyone who trusted (and often confounded) me with their projects. I got to work on some amazing audio gear and made many friends along the way.</p>
<p>I&rsquo;m sure some of you have stumbled across my recent adventures in Max and OSC. I&rsquo;m still pretty active in those areas (handy to be able to do your projects on a laptop!). I&rsquo;m going to consolidate (and archive) a bunch of stuff and you&rsquo;ll be able to find it all on a new website which is hosted on my Github repository.</p></blockquote>
<p>Which brings us right here!</p>
<h3 id="so-what-is-use-hearing-protection-then">So what is USE HEARING PROTECTION then?</h3>
<p>Truthfully it&rsquo;s my attempt to try to consolidate all the little bits of me, current and archived projects, into one place on the internet. If that sounds awfully vain, believe me that it&rsquo;s selfishness masquerading as altruism.</p>
<h3 id="no-i-mean-why-use-hearing-protection">No, I mean <em>why</em> USE HEARING PROTECTION?</h3>
<p>Well, from a safety and the long-term health of your hearing point-of-view, it&rsquo;s just some good advice.</p>
<p>There&rsquo;s a much longer story about growing up in Manchester in the 80s and how that is a deep part of my creative psyche. The short answer is it&rsquo;s inspired by Peter Saville&rsquo;s iconic FAC 1 gig posters from his when he was the designer for Factory Records. Here&rsquo;s the design used on the 2019 box-set &ldquo;Use Hearing Protection: Factory Records 1978-79&rdquo;:</p>
<figure class="center"><a href="https://pitchfork.com/reviews/albums/various-artists-use-hearing-protection-factory-records-1978-79/" target="blank"><img src="/welcome/uep_boxset.png"
    alt="Use Hearing Protection: Factory Records 1978-79" width="75%"></a><figcaption>
      <p>Use Hearing Protection: Factory Records 1978-79</p>
    </figcaption>
</figure>

<p>And here&rsquo;s a photo of one of the original FAC 1 posters:</p>
<figure class="center"><a href="https://www.mdmarchive.co.uk/artefact/17033/The-Durutti-Column-Jilted-John-Joy-Division-Manicured-Noise-Tiller-Boys-Factory-Club-%28see-also-Russell-Club%29-Peter-Saville-Poster-1978" target="blank"><img src="/welcome/fac_1.png"
    alt="Factory gig poster, 1978" width="75%"></a><figcaption>
      <p>Factory gig poster, 1978</p>
    </figcaption>
</figure>

<h3 id="now-what">Now what?</h3>
<p>Expect sporadic updates and long periods of neglect. Like most of my other projects. I make no apologies.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Projects</title>
      <link>https://neilbaldwin.codeberg.page/archive/</link>
      <pubDate>Sun, 09 Mar 2025 16:47:27 +0000</pubDate><author>neil.baldwin@mac.com (Neil Baldwin)</author>
      <guid>https://neilbaldwin.codeberg.page/archive/</guid>
      <description>&lt;h1 id=&#34;nes-audio&#34;&gt;NES Audio&lt;/h1&gt;
&lt;p&gt;Archive of all of my old NES audio tools.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://neilbaldwin.codeberg.page/nes-audio/index.html&#34;&gt;NES AUDIO&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h1 id="nes-audio">NES Audio</h1>
<p>Archive of all of my old NES audio tools.</p>
<p><a href="/nes-audio/index.html">NES AUDIO</a></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
