Just Type

From digital control through Polysynthetics with the monome teletype

monome's Teletype excites us. Writing simple scripts away from a computer; executing tiny morsels of musical composition. Just Type is a suggestion for how these ideas can be extended & deeply integrated with the elements of synthesis.

At it's most basic, JT is a set of invisible patch cords. Type a command to create a trigger on your desired channel, in parallel with IRL voltages in JF's TRIGGER ins. RUN mode & voltage can be set directly, not needing a dummy cable or negative-offset capable voltage source.

More than a cloaking device, Just Type extends the base functionality of JF into more complex territory. Use Teletype's `N` notation to easily transpose JF in 12-tone musical increments. Every output can be driven with a varying velocity, adding subtlety and movement to sequences. Even the INTONE relationship can be altered away from the default harmonic structure, instead taken in more experimental directions.

Beyond these general-purpose modifications, Just Type brings two entirely new modalities to JF. Synthesis allows independent polyphonic control over each channel, controlled directly, or dynamically allocated as a 6-voice polysynth. Geode instead pursues rhythmic manipulation of striated repetitions, creating polymetric bursts with dynamic decay.

Enough! Just. Type.

Install?

JT comes pre-installed since Just Friends v3 (late 2017). Get the update here if you have an early JF with the silver & green landscape backplate. You'll need teletype 2.0+ as well.

Connect your teletype & Just Friends with a 6-pin ribbon cable attached to the 2x3 pin headers on the rear of each module. These headers are marked with 'ii' on the rear of both modules. Orient the white stripe on the circuit boards to the red-stripe on the cable.

The basics: Remote control

These commands allow remote control over Just Friends. Imagine a set of invisible patch cables connected to the TRIGGERS and RUN jacks.

JF.TR channel state

Simulate a TRIGGER input.

channel: set the channel to be triggered.

1 is IDENTITY through 6 is 6N

is IDENTITY through is 6N

0 will trigger *all* channels

will trigger *all* channels

nb: The hardware normalization is ignored - only the named channel will trigger

state: set the trigger high or low. Any non-zero value is 'high'

Only sustain mode responds to (indeed requires) 'low' triggers to begin release

JF.RMODE mode

Set the RUN state of Just Friends when no physical jack is present.

mode: non-zero values will activate RUN mode. 0 deactivates (unless a physical jack is present on Just Friends)

JF.RUN state

Send a 'voltage' to the RUN input. Requires JF.RMODE 1 to have been executed, or a physical cable in JF's input. Thus Just Friend's RUN modes are accessible without needing a physical cable & control voltage to set the RUN parameter.

state: use JF.RUN V x to set to x volts. The expected range is V -5 to V 5

<example script: VOLLEY mode w sequenced trigger bursts & choke>

Extending functions

This collection of commands extend the base capabilities of Just Friends, without totally changing the mode of interaction. They let you interact with the module in subtly different ways, and consider alternative approaches to creating compositional structure.

JF.SHIFT pitch

Shifts the transposition of Just Friends, regardless of speed setting. Shifting by V 1 doubles the frequency in sound, or doubles the rate in shape.

pitch: amount to shift base pitch by. Use `N x` for semitones, or `V y` for octaves

JF.VTR chan velocity

Like `JF.TR` with added volume control. Velocity is scaled with volts, so try `V 5` for an output trigger of 5 volts. Channels remember their latest velocity setting and apply it regardless of TRIGGER origin (digital or physical).

chan: which channel to trigger. `0` sets all channels

velocity: amplitude of output in volts. eg `JF.VTR 1 V 4`

JF.TUNE chan numerator denominator

Adjust the tuning ratios used by the INTONE control. The default for this is just the first 6 elements of the harmonic series. Instead you can retune this to your needs or desires. Think a guitar with open-G tuning – lends itself to an entirely different style of play.

Tuning is defined as a pitch ratio: numerator / denominator. 1/1 is IDENTITY, whereas 4/1 would be 4N's default setting. Read a little about just intonation for some ideas how you might utilise this feature.

chan: select which channel's tuning to redefine

numerator: set the multiplier for the tuning ratio

denominator: set the divisor for the tuning ratio

If things get too weird, you can reset to default tuning with `JF.TUNE 0 0 0`.

If you want to retain your custom tuning more permanently (across power-cycles), send the special command `JF.TUNE -1 0 0` which will store the setup on chip. When you restart the module, it will automatically use these values.

<example script: ??>

Modal personality

Until now, we've only been speaking of modifying or extending the base Just Friends behaviours. Conversely, it is also possible to change some fundamentals of the JF system, leaning more heavily on the Teletype integration for configuration and control.

These alternate personalities are Synthesis, a polyphonic synthesizer; and Geode, a rhythm machine. JF.MODE 1 will take you to these modes respective of the sound/shape setting. Beware that whilst in JT's alternate modes, things will behave differently to normal & will remain there until power-cycling or exiting with JF.MODE 0 .

JF.MODE mode

Set the current choice of standard functionality, or Just Type alternate modes. You'll likely want to put JF.MODE x in your Teletype INIT scripts.

mode: non-zero activates JT alternate modes. 0 returns to standard functionality

Synthesis

Synthesis is as its name boringly suggests, a synthesizer. Further, it is a polyphonic synthesizer of six independent voices. Control is either explicitly per voice, or can be dynamically assigned in a traditional polysynth fashion.

The voices are centered around Just Friends' manifold generators, with pitch controlled digitally via Teletype rather than the panel controls. Each generator is shaped by RAMP & CURVE as per normal, then passed to a Vactrol Low-Pass Gate model to impart velocity. The Vactrol model implements rudimentary envelope shaping of the velocity, controlled by TIME, for envelope speed, and INTONE, for attack-release shaping. These envelopes are controlled by the transient / sustain / cycle mode, and may be excited either digitally or via the hardware TRIGGERS.

Internally each voice contains a linked sinewave oscillator providing frequency modulation over the function generator. FM amount or index, is controlled with the FM knob & CV input. The knob functions as normal with INTONE modulation CCW, and even modulation CW. CV input is a traditional CV-offset where positive voltage increases, and negative decreases modulation. The frequency relationship between the modulation & carrier oscillators is set via the RUN jack, though is matched at 1:1 with no cable attached. Positive voltages move toward 2:1 at 5V, while negative sweeps down to 1:2 at -5V giving many grumbles.

The JF.VOX and JF.NOTE commands are designed to create complete notes in the General MIDI sense. They simultaneously set the pitch of a voice & begin / end an envelope cycle. Physical TRIGGERS on the other hand, will only trigger the envelope, using whatever pitch & velocity are currently set for that voice, encouraging combinations of digital & voltage control.

JF.VOX chan pitch velocity

Create a note at the specified channel, of the defined pitch & velocity. All channels can be set simultaneously with a chan value of 0 .

chan: choose which channel's voice to assign. 0 sets all.

sets all. pitch: set the pitch relative to C3 (eg. N 3 for Eb3, or V 1 for C4)

for Eb3, or for C4) velocity: set the volume as in JF.VTR (eg. V 5 for 5V peak-to-peak)

JF.NOTE pitch velocity

Polyphonically allocated note sequencing. Works as JF.VOX with chan selected automatically. Free voices will be taken first. If all voices are busy, will steal from the voice which has been active the longest.

pitch: set the pitch relative to C3

velocity: set the volume as in JF.VTR

JF.GOD state

Redefines C3 to align with the 'God' note. See: https://attunedvibrations.com/432hz/ or http://www.roelhollander.eu/en/tuning-frequency/goebbels-and-440/.

state: 0 is A=440Hz, 1 is A=432Hz

Geode

In shape, Just Type inherits it's functionality from the standard form. Atop sits a rythmic engine for polymetric & -phasic patterns. Fundamentally this is a 'clocked' mode, whether internal or via Teletype; while the TIME & INTONE controls maintain their standard free-running influence.

Notes in the context of Geode are a combination of a standard trigger along with a repeat count & subdivision. The former sets the number of envelope events to create, while the latter chooses the rhythmic relation of those repeats to the master timebase. transient / sustain / cycle chooses how the repeats amplitude is modified over time. sustain decays to zero-level over the duration of the repeats. cycle adds a rhythmic undulation to the envelope level, controlled via the RUN jack. Experiment!

Once these rhythmic streams are moving, their pattern can be locked to a quantize amount. Using odd-subdivisions with even quantize or vice-versa will enable patterns to break out of the evenly spaced repeat model.

JF.TICK clock/bpm

Sets the underlying timebase of the Geode. To set a tempo directly, a single message of the desired bpm can be sent. This must be in the range of 49-255 bpm.

Alternatively this message can be sent repetitively providing a live tap-tempo from Teletype. A value between 1 and 48 defines how many ticks equal one measure. If sending a tick once per beat, use JF.TICK 4 meaning four notes per measure.

clock/bpm: 0 resets the timebase to the start of measure.

1 to 48 shall be sent repetitively. The value representing ticks per measure.

49 to 255 sets beats-per-minute and resets the timebase to start of measure.

JF.VOX chan division repeats

Create a stream of rhythmic envelopes on the named channel. The stream will continue for the count of repeats at a rhythm defined by division. Indefinite repeats are possible where repeats is set to -1 .

division divides the global measure (set by JF.TICK ) into the number of segments named. 4 would create quarter notes, while 15 would create 15 equally spaced notes per bar (weird!).

repeats is the number of times to retrigger upon completion. Note this means 0 will still create the initial trigger but not repeat, while 1 will make 2 events total (the initial trigger, and 1 repeat).

chan: select the channel to assign this rhythmic stream. 0 sets all

sets all division: set the rhythmic division of a measure

repeats: set the number of repeats in the stream. -1 repeats indefinitely

JF.NOTE division repeats

Works as JF.VOX with dynamic allocation of channel. Assigns the rhythmic stream to the oldest unused channel, or if all are busy, the longest running channel.

division: set the rhythmic division of a measure

repeats: set the number of repeats in the stream. -1 repeats indefinitely

JF.QT division

When non-zero, all events are queued & delayed until the next quantize event occurs. Using values that don't align with the division of rhythmic streams will cause irregular patterns to unfold. Set to 0 to deactivate quantization.

division: delay all events until the next division of the master timebase

0 deactivates quantization

1 to 32 sets the subdivision & activates quantization

Glossary

JF.TR chan state: Set TRIGGER chan to state.

JF.RMODE mode: Activate RUN is mode is non-zero.

JF.RUN state: Set RUN value to state. (Requires JF.RMODE 1)

JF.SHIFT pitch: Add pitch to the current TIME setting.

JF.VTR chan velocity: Set TRIGGER chan to velocity. Velocity=0 is 'off'.

JF.TUNE chan num denom: Redefine INTONE relationship of chan to num / denom.

JF.MODE mode: If mode is non-zero, enter synthesis or geode.

JF.VOX chan pitch velocity: Set chan to pitch with velocity. (Requires JF.MODE 1).

JF.NOTE pitch velocity: Assign a note of pitch with velocity. (Requires JF.MODE 1).

JF.GOD state: Shift pitch base to A=432Hz.

JF.TICK clock/bpm: Set geode tempo to bpm, or accept clock for geode.

JF.QT division: Quantize all TR, VTR, VOX and NOTE commands to 1-bar / division.