-
Notifications
You must be signed in to change notification settings - Fork 6
Home
preliminary infos for preview1 branch
Extends the O&C firmware with some alternate modes:
- ASR is the original firmware
- Harrington 1200 Basic neo-Riemannian tonnetz transformations, triggered by the digital inputs
- Automatonnetz Combines tonnetz transforms with a "vector" sequencer
- VierfStSpQuaMo Quad quantizer
For hardware and other info, start here
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
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.
Should work the same as the original firmware. Some code was moved around and/or bludgeoned to work with the app switching.
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 ;)
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 |
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 | 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 |
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.
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 |
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
|
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) |
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 |
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 |
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 |
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 |
- 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
- 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)
- 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)