ACCORD R.U.L.E
(Reactive Universal Logic Engine)
(Prototype 3)
This module is in the prototyping and development phase as of summer 2026. As new features are added they will be added here!
![]() |
|
||||||||||||||||||||||||||
What is it??
The R.U.L.E. (formerly What's Next) is a universal CV/Gate/Trigger I/O module
that obeys rules
that you enter into memory to offer ultimate control around your rack. No matter
how big or small a function is assigned the response is predictable and
accurate. Along with syntax error-less dropdowns to easily create rules, there
is an arsenal of generators included.
For example, if your algorithm is set to simply add the CV input at Jack A with the input at Jack B, with the result at jack C, the inputs and outputs are automatically configured and a 1.00 volt input on A and B with result in 2.00 volts at jack C. Or, perhaps you only want this voltage to update when Jack D has a high on it. A conditional statement in front of the A+B statement will only allow updates to Jack C when Jack D is set to high.
You can probably think of all of the benefits of this right away considering doing this with standard modules would be cumbersome and use up VCA or logic modules that could be used for a different function. To make things even more interesting, there's also Sequencers, LFO's, Delays, and Envelope generators built in that can be triggered whenever you want, play at any speed, and provide an accurate reproduction of previous sessions every time thanks to flash memory.
One of the first questions I was asked when considering this module a few months ago was "what if you select a different User Program (preset) and outputs become patched to outputs of other modules?". My response was that after a Program (scene?) change, the outputs are all held in a high impedance state while a test for loading on the jacks determines if any are going to collide. This is done with very fast low voltage pulses that couldn't possibly damage another module's output. The LED will flash, in what ever color, and won't be an output until the jack is cleared.
Below I am adding features as they are included. Below that is the development dates and progress. Please not that this may not be updated until late December as I will be overseas and may not be able to access the website from there due to the political climate
Formula Blocks:
At the moment there are 4 blocks, each of which can contain an algorithm (set of
statements) and can hold up to 32 lines. These blocks are always active once the
"Run" button is pressed. So any changes on any inputs will follow your rules.
There are a number of simple presets to choose from to quickly load a block for
a specific function. If you name a block according to it's function, then it
will be identifiable to load into a different block or user program. Each block
can be named which is shown in the header of the editors always, along with
jacks used by this block.
Different types of signals are color coded: red for CV, green for gate/logic,
blue for a jack assigned to output a trigger, and orange for everything Midi.
Conditionals are white.
Run and Stop buttons
To freeze the states, hit the "Stop" button. This will not release the outputs
unless the stop button is held. Outputs are also released when a "user program"
is first loaded. Anything running will be stopped appropriately, a sequence will
stop, an envelope will complete, an LFO will stop, Midi will complete. Pressing
Run while Block editing will show line numbers and Stop will open for a line
insert.
Gates invoke logic operators:
If a Gate (i.e. GT.A) is set in a statement then the choices following it with
be logic like or V, and Λ, xor(+), drop
↓, or rise ↑ so you don't need to go
through a lot of operators in the drop down. A gate GT.x statement makes the associated jack an input, but
doesn't limit it to being logic. This means a CV.x can still be used anywhere if
it's a combination signal that is desired.
The output that is (eventually) where the result will go, unless it is just to
start an internal envelope etc, can also have both CV and gate/trigger at the
same time, so one won't block out the other. A use case would be a gate that
brings an output to only +3 volts because a CV assigned to the same jack is
sitting at -2V effectively allowing through-zero modules to function while
others don't on the same output.
Trigger (exclusively
drop ↓, or rise
↑ ) is only handled in a conditional
statement, i.e. IF TR.C↑.
To turn an output into a
proper trigger pulse, OUTx=TRIG↑ statement is used to set it.
Data type profiling:
If a VARn (in-block local variable) or BUSn is used as a rule line's destination,
i.e. BUS2=CV.F÷CV.B, then the variable will
become that data type. The declared variable won't be able to be used with
opposite types, i.e. OUTD=GT.AΛBUS2
with only GT.x showing (or HI or LO for directly setting OUTD in
this case). Initially, an undeclared variable brought to an output will color as
CV type (red)
This reduces confusion and clutter in the dropdowns, along with color defining
jack letters as you scroll through them, making overall use much easier!
An input jack can be defined differently in the rules, i.e.
VAR1=CV.A-2.000 then elsewhere IF GT.A=HIGH, then further IF TR.A↓.
It's possible to use the same input for 3 different things. This could be useful
in a rare case that a gate is also a 1V/oct CV from a special module or
combination above .6 volt (from 1v to 4v): IF TR.A↑;
OUTB=CV.A-1.000 ; OUTC=HIGH ; ENDIF
It could also be used in multiple patches.
Conditional Statements:
As expected conditional statements can be placed before any other statements so
that only when the condition is met the rest of the block will execute. For.
example.
IF CV.A>1.000V --> statement(s ) following --> ELSE CV.A>CV.B
--> statement(s) following. This example tests for both CV.A being greater than
one volt and also CV.A being higher the CV.B. If the former is true, the first
statement(s) will execute, whereas if only the latter is true, the second
statement(s) will execute.
If two (or more) conditions must be true to cause events to execute: IF CV.A>1.000V
followed by AND CV.A<2.000V can be written before events.
Multiple level nesting is possible if needed. ENDIF statement only required if
there is a new condition in the same block that is unique. Each block assumes an
ENDIF before executing the following block.
Embedded events placed between like statements can be used,
but can become complex.
i.e. IF CV.A>0.000V OUTB=1.000V AND CV.A<2.000V OUTC=1.000V.
If CV.A is 3 volts, OUTB=1 volt, but OUTC is unchanged.
"AND", "OR", "XOR", or "NOT" can be inserted between conditionals to logically handle the the two. There can be more than one AND/OR/XOR/NOT, but due to the inconvenience of situating brackets "( )" any logical will be interpreted as in series. i.e. c1 AND c2 OR c3 will be seen as (c1 AND c2) or c3, not as c1 AND (c2 OR c3). This can be fixed by simply ordering the last part first: c2 OR c3 AND c1.
Complex Algorithms:
For really lengthy or complicated Blocks, VAR's can be used to swap data
around without affecting any outputs. i.e. VAR1=CV.A x LFO2 OUTC=VAR1÷4
For global variables to use the data in other blocks, BUS's can be used.
Built in Generators:
The LFO, Envelope, Random, Quantizers, and Sequencers can be used to eliminate
adding a lot or lines to do specific things. The most obvious is the Quantizers,
which can be custom set to output certain voltages over a range. The Sequencers
are super useful for sequential actions inside or as outputs as they can send
signals to the Blocks, panel, or Midi in predictable steps of any size, rate,
and cycle counts. For example setting 4 outputs to specific voltages on an event
is only 6 lines in a Block, but calling a step in a sequencer could do the same
with 3 lines. Translating one voltage into another with a curve could be done
with math, but also using a held LFO by indexing a phase like a plotter is much
faster and can be dynamic without the heavy math. At audio frequencies a fun DSP
could be created this way.
Numeric Interpretations:
For a numeric declaration, 3 types can be used: 0.000v (-5.000 to +5.000 or
-9.999 to + 9.999), a voltage accurate numeric value; 000 (-999 to 999), a whole number
declaration interpreted as volts or percentage in special cases, and N000 (N000
to N127) as a (Midi, CV) Note declaration. (For example N036 seen as C3 note, or
CV voltage 1.000 volts - if global CV offset is -2.000 volts).
Certain numbers are considered as more decimal places, i.e. 0.083 (one semitone)
will be seen mathematically as 0.08333 to maintain accuracy. Powers are to
several decimal places.
Whole numbers are useful for over 9.999 for math like dividing by 200 etc.
Delays:
Delay statements, i.e. DELAY=1000MS, doesn't prevent other Blocks from
executing, rather just delays the execution of "this" block and the
statements following. This could be useful if you wanted a clock-stop to roll a
filter a certain way, or levels to drop off etc. using a multed input from the
system clock to a Jack. An example might be CV.B=ENV1OUT
IF TG.A = ↑
DELAY=800MS ENV1=RUN. A constant clock keeps resetting
delay until there is no clock then the internal ENV1 is triggered. Another use
might be just to sequence a series of events, although one of the Sequencers
could if the event's are evenly spaced. If not, then delays! I.e. CV.A=CV.C
IF GT.B=HI DELAY=200MS CV.A=CV.C+1.000V
DELAY=300MS CV.A=CV.C This would add an
octave shifting warble to a VCO on CV.A whenever GT.B is high.
TIME:
Similar to delay but defines update rate of an output in milliseconds to lighten
processor load. This can be useful with audio signals whose result doesn't need
to be updated at audio rate. The assigned time starts counting down only when
the output is written to. i.e. OUTF=TIME:5.000 (5 mS) OUTF=LFO4+3, OUTF will
present a steppy LFO pattern.
BUSx Variable stacks:
Normally BUSx is a persistant variable that holds it's value (unlike VARx) from
block to block, cycle to cycle. Stacking on a BUS is now possible allowing a
single BUSx variable to hold multiple values. The values are recalled using
voltage proximity. For example, if the values 1, 2, 3, 4, and 5 are pushed into
a BUSx (using BUSx <- [value/input etc.]), then the variable is queried (using
special bidirectional arrow symbol) with a voltage, say 2.4 volts, the
returned value would be 2.0 volts as it is closest. This can be used as a simple
quantizer at the simplest, but become a powerful fractal generator or even a
sequencer. The size of the stack can be defined by pushing a whole number to it
rather than a CV decimal. For example:
BUS2 <- 16
(16 max before wrapping) BUS2<-1.000
BUS2<-2.000 BUS2<-3.000 BUS2<-4.000
BUS2<-CV.C+4.000 Outputting a value: OUTA=BUS2<->CV.B
To output all values CV.B needs a ramp 0-5 volts. To output random but octave
quantized values, apply noise to CV.B or use RNDx instead of CV.B.
METHODS AND LEARNING
(NEW!)
How to use the R.U.L.E.
| July 22 2025 | Panel design decided upon. 12 HP with 20 jacks and a color display. The 12 I/O jacks have RGB LED's to indicate status, signal direction, and type of signal. Colors have yet to be decided upon. |
| July 26 2025 | Successful math algorithms developed in computer to demonstrate entire concept including method of entity selection (vars, I/O, operands etc) |
| July 31 2025 | Concept schematics developed for basic functioning, parts count etc |
| Aug 07 2025 | Finer schematics with proper values drawn up to begin PCB's |
| Aug 09 2025 | Prototype PCB's designed and etched / populated over a few days. The final design of course will be somewhat different as a few parts had to be substituted for what could be available at the time. The final design will perform much faster and more smoothly than this design (happily!) |
| Sept 19 2025 | LCD drivers created (scratch not from libraries) and simple tests. Initial fonts have been developed with non-monospaced characters so they can be large yet fit the width! The decision to zoom on editing a math expression with auto-pan etc. hasn't been made, but the huge font makes it very easy to read. The Normal font (Tahoma) is wide and bold so also easy to read. |
| Oct 10 2025 | Frequency 2 CV implementation. Works! |
| Oct 20 2025 | Decided on Menu layout, Quick Boxes. Changed Block Layout. QB Button GFX attempt 1. |
| Nov 7 2025 | Implemented 5th (& final hopefully!) Block Scan method |
| Nov 12 2025 | Implemented new conditionals method. Works 100% |
| Nov 20 2025 | Fixed colors (more or less) and standardized. |
| Nov 23 2025 | Added "Menu Zoom" for all entries & adjustments. Blocks included. |
| Dec 1 2025 | Changed Flash memory organization, forward compatible. |
| Dec 4 2025 | Envelope graphing started. May revise. |
| Dec 18 2025 | Last updates before break. |
| Feb 20 2026 | Devised HTML interface to create rules and upload |
| April 30 2026 | Changed smaller Color LCD with higher resolution larger LCD |
| June 29 2026 | Updated new selection QB's to be easily visible on screen |
| July 3 2026 | Added BUSx array stacks to push data onto (sizable), recall with proximity of voltage (user V quant. etc) |
| July 13 2026 | Completed new buttons & fonts for larger display |
| July 16 2026 | Rewrite of conditional engine successful! Nesting up to 8 should work (tested 3) |
Contact: freshnel@freshnelly.com
| This is the introduction to the Accord What's Next that shows the basic theory and the prototype operational in early test state. This is before the name was changed to R.U.L.E. and while both names are catchy, I kept calling it the What's App module. It's not that so name had to be changed! | |
| This is a basic Tutorial on putting new Rules into a block using the new (June) prototype. This is a very beginner level dive into making the RULE do what you want quickly! | |
| This video covers the HTML interface to set up Rules
Blocks without using the panel. The Blocks from the present User Program are
loaded for viewing and editing in a similar way you would do it on the
module itself.
The new Rules are sent back once complete. |

Web Design by Yours Truly! I know it
looks like something out of the 90's when a 1 Mb webpage was unacceptably large.
We strive to separate ourselves from energy consuming bandwidth-heavy script,
AI, and
other wasteful environmental unfriendliness
toward this beautiful blue pearl in space we all call home. I urge you to do the
same please. It feels good!
Last Update July 17th 2026