Skip to content
Patrick Dowling edited this page Jan 2, 2016 · 21 revisions

Ornament & Crime: Extended Firmware

preliminary infos for preview1 branch

Extends the O&C firmware with some alternate modes:

For hardware and other info, start here

Startup

At startup, the module boots into the last saved mode, unless one of the encoders is held down:

  • Left encoder: Boot into calibration (unchanged from original)
  • Right encoder: Enter the app selection menu

App Selection

The app selection menu can be reached either when the module is powered, or by holding the right encoder for >2s during normal use.

  • Right encoder selects an app
  • Press right encoder to switch
  • Long press right encoder (>2s) to save module state and make the selected app the default at next boot. This saves the settings of all apps.

The settings are saved in the Teensy EEPROM storage and uses a basic form of wear-levelling.

ASR

Should work the same as the original firmware. Some code was moved around and/or bludgeoned to work with the app switching.

Harrington 1200

This is a relatively straight-forward implementation of the neo-Riemannian transformations for generating chord progressions.

The mode of the root chord is set in the menu (mode) to either major or minor, and the trigger inputs are used to apply the P, L or R transformations. TR1 resets back to the root.

If multiple triggers are received, the reset always has priority, then all triggered transforms are applied. The order in which they are applied can be set in the menu.

The transformations themselves are quite simple, and "reversable" i.e. applying them twice returns the original triad. The following basic tranformations are used here:

  • P (Parallel): Moves the third up or down a semitone, so P(Cmaj) = Cmin, P(Cmin) = Cmaj.
  • L (Leittonwechsel): Converts a major triad to a minor by shifting the root down a semitone and making the third the root, or from minor to major by moving the fifth up a semitone to become the root.
  • R (Relativ): Converts a major triad to it's relative minor, or a minor triad to it's relative major.

Internally, the triad is stored in a neutral form (basically just offsets) so the chord voicing is preserved and it can be shifted easily to the quantized root note, and inversions created on-the-fly. For an alternate implementation, see the documentation of the Tonnetz Sequent.

Thanks to Tim Churches (aka bennelong.bicyclist) for the screensaver visualisation! Much better than my columns of numbers ;)

Settings

Setting Meaning
transpose Shift root/triad in semitones
mode Mode of root triad, either maj or min
inversion Chord inversion (can be offset by CV)
trigger prio Order in which transforms are applied if multiple triggers clocked simultaneously (not all combos currently implemented)
output Output mode, with the default being chord, or use tune to output the quantized root on all four DAC channels

Controls

Control Function
Left encoder (turn) Select parameter
Left encoder (press) Toggle display of note # or names (note: the names are simplest possible mapping, so no enharmonic substitutions)
Left encoder (long) Reset to defaults
Right encoder (turn) Change parameter value
Right encoder (press) Select next parameter
Up Chord inversion +1
Down Chord inversion -1

IO

IO Function
TR1 Reset to root triad
TR2 P transform
TR3 L transform
TR4 R transform
CV1 Root note
CV4 Chord inversion
A Quantized root
B, C, D Transformed & inverted triad

Automatonnetz

This mode uses the transformations implemented in Harrington 1200, with the sequence of transformations determined not through triggers, but by navigating a 5x5 grid of cells. On each clock input the dx and dy (hence "vector" sequencer) values are added to the current position to determine the next cell. The position simply wraps around when an edge is hit, so "backwards" motion is also possible. The position and movement can also be fractional, allowing for clock divisions and all kinds of patterns.

Each cell can contain a transformation (or reset) as well as other parameters. In this mode, there are three additional transforms available, which can be represented as a combination of the basic three transforms:

  • S (Slide): LPR, example S(Cmaj) = C#min
  • H (hexatonic): LPL, example H(Cmaj) = A-min
  • N (Nebenverwandt): RLP, example N(CMaj) = Fmin

The implementation computes these in a single transform step however, not iteratively.

Controls

Control Function
Left encoder (turn) Select cell
Left encoder (press) Toggle between editing grid or cell settings
Left encoder (long) Clear/reset grid (depends on clr setting)
Right encoder (turn) Change parameter value
Right encoder (press) Select next parameter
Up Reset grid
Down Clock grid

Grid settings

Setting Meaning
dx Amount of movement along x-axis (horizontal) per clock
dy Amount of movement along y-axis (vertical) per clock
mode Mode of root triad, either maj or min
octave Move outputs up/down in octave steps
outA Switch output mode of channel A: root outputs root note, trig outputs a trigger when the triad is transformed, arp arpeggiates the triad, strm arpeggiates once when the triad is transformed
clr Sets how the grid is cleared on long-press of left encoder. zero clears the grid, rT fills with random transforms, rTev sets each cell's event to randT

Per-cell settings

Setting Meaning
tra Determines the transform that is applied when this cell is active; special values are @ (reset) and * (no transform)
off Offset in semitones applied while this cell is active
inv Inversion of the transformed triad
evt Event that is applied when the cell is left (i.e. on the next clock after the cell's transform is applied). Valid values are none (nothing happens) and rndT (transform is set to a random value)

Jack assignment

IO Function
TR1 Clock
TR2 Arpeggio clock (if mode is arp or strm)
TR3
TR4 If high, inhibits arpeggio clock
CV1 quantized as root note of triad (before transform)
CV2
CV3
CV4 Modulate triad inversion
A Depending on mode: quantized root, arppegio, trigger out
B, C, D Triad after transformation

VierfStSpQuaMo

Initially, this was more of a test of the app "framework" using the same quantization as the original ASR firmware, but on four channels. It has now been extended to integrate the quantizer from Mutable Instruments Braids which allows for more flexible scales (48 are included).

The output accuracy should be excellent, however some more work may be necessary to calibrate the input side to get better accuracy. The input side uses the Teensy internal ADCs.

Channel IO
1 TR1 + CV1 -> A
2 TR2 + CV2 -> B
3 TR3 + CV3 -> C
4 TR4 + CV4 -> D

Controls

Control Function
Left encoder (turn) Select channel, or scale in edit mode
Left encoder (press) Toggle between channel select and scale edit
Left encoder (long) Set selected scale and current root to all channels
Right encoder (turn) Change parameter value
Right encoder (press) Select next parameter
Up Octave +1 for current channel
Down Octave -1 for current channel

Available settings (per-channel)

Setting Meaning
scale Current scale
root Root note for scale
update cont samples and quantizes the input CV continuously, trig only when a trigger is received
transpose Offset output note in scale (after quantization)
octave Shift output
source Select CV input used; if not current channel, CV is added to transpose
fine Fine tune the DAC output value

Thanks...

  • mxmxmx for creating the module :)
  • Tim Churches (aka bennelong.bicyclist) suggested the Tonnetz stuff in the first place and naming the Harrington 1200.
  • Automatonnetz sequencer heavily inspired by fcd72: https://dmachinery.wordpress.com/2013/01/05/the-vector-sequencer/
  • Stephen from Noise Engineering for helpful notes and info
  • Olivier Gillet for the quantizer code in Braids

B1 Known Issues/work-in-progress

  • Note names and input/output voltage may not match in Harrington 1200/Automatonnetz modes
  • Root quantization and output not verified yet
  • No chromatic scale in quantizer mode (see roadmap)

Roadmap

  • More flexible quantizer implementation in 4x mode
  • SCALA-style scale definitions => using Braids' quantizer
  • Check hysteresis/ADC jitter since I've been able to find settings where it's "stuck" between two steps in cont mode
  • bit-mask or other way to choose which notes in scale are active
  • (meaningful) linking of channels and/or offsets?
  • Extend tonnetz to support other chord modes (augmented, diminished) and maybe more transforms?
  • CV control of dx/dy and other parameters
  • Note grid sequencer (TBD)