Module Description


Here is an example of schema and generated table for MIDI Gateway module:

There are two ways to modify a component parameter. They are:

  • Direct control using a component address
  • Indirect control through a unit

Component Address

Every component has its unique address in order to exchange its parameter via data bus. A component address is a 4 byte integer like IP address. Thus, you have two ways of address management — static and dynamic.


*** TODO: rename unit to union

Analog 3 will have many parameters that may cause difficulty in control them. Unit helps simplifying synth manipulation.

A unit is a virtual component that consists of zero or more components or units. It has its own control parameter. A unit is a component on data bus. Thus it has a component address. Updating the unit parameter causes changes in its sub-components at once.

An example usage of units is building polyphonic perspective. When you build a four-voice polyphonic synthesizer, you make a unit for each synth parameter (such as VCF cutoff frequency) and recruits corresponding physical components of the four voices. Its representation looks following:

Another example is bundling multiple parameters to simplify manipulation.

Module Management Message


Module Management Messages are sent via extended data frame.

Module management messages have two categories that are broadcast and direct. Each category has different set of commands.


The first 11 MSB of the address must be recessive (1) followed by 1-bit message category indicator whose values are broadcast (recessive:1) and direct (dominant:0). The next one bit is continuous frame flag. The rest 16-bit is component identifier.

Sending a remote frame to a module management message ID requests broadcasting some data of the specified component.


Broadcast Message

Direct Message


A modifier frame includes only a value as a number in data field.

Performance Signal


Performance signals are basically conversions of MIDI messages. The MIDI Gateway module picks up channel voice messages of a certain MIDI channel, interprets them as single or multi voice performance signals. MIDI also has messages for multi voices such as expression control. These messages go into a special voice called “omnivoice”.

Each voice has its CAN ID. Every module listens to a particular voice and omnivoice.


Performance signal uses <number_of_voices> + 1 for the omunivoice CAN identifiers. All identifiers should fit the standard data frame ID, i.e., 11bit. The identifier for the omnivoice must be the largest among all voice identifiers.

Performance Signal Frame Structure

Performance signals are sent using standard data frames. The frame data does not include indicator of Analaog3 signal type. Signal receivers know the signal type by frame identifier numbers.

If the message byte has four zero MSB’s, the rest four LSB’s are equivalent to four MSB’s of a MIDI channel voice message. In other words, you can easily convert a MIDI channel voice message to an A3 performance signal message by shifting 4 bit rightward:

The values are one or multi-byte big endian (network order) unsigned integer.


Bus Data

Use Cases

The purposes of Analog 3 data bus are:

  1. To share performance control data (performance signal)
    I start with translating MIDI to “Analog 3 Voice Driving Protocol”.
  2. To exchange module control signals, such as LFO and envelopes (modifier)
    This takes the same role with control voltage. The design should be flexible for types of signal.
  3. To control and manage modules (module management message)
    • change a parameter (values, wires)
    • read a parameter
    • list parameters
    • manage IDs
  4. To synchronize modules (trigger)

CAN ID Addressing

Analog3 mainly uses two types of CAN frames — standard data frame and extended data frame that are described as follows.

A single component has one or more IDs for:

  • The module ID in extended address space
  • Zero or more output ID in standard address space

An output port falls into one of following ranks according to its signal priority, listed with priority in descending order

  • trigger
  • modifier
  • performance signal

CAN IDs are dynamically assigned with respect to modules’ ranks.

We use extended address space for component IDs, but their 11-bit MSBs must be all 1. On the other hand, any signal frame ID must avoid address 0x7ff. Thus, any output signal is guaranteed to win any module management messages.




  • A hardware module must be independent — it should be able to run without external controller.

Organizer provides images of synthesizer modules as software objects.

One of the important goals of Analog3 is to build a “synthesizer” image using software, configure the Hardware Modules and Hardware Control Surface as a reflection of the software synth image.  Once the configuration is done, the “synthesizer” should be able to run (be performed) without software control.

analog3 architecture


  • Voice management
  • Midi decoder
  • Auto tune