User Function Modules

User Function modules are SoftStep modules you program yourself to provide whatever functionality you like. You program them with the User Function Programmer, which is a pop up window available from the main menu.

There are 8 different User Function modules with differing input and output configurations. The most basic difference is that some of the modules are clocked, some are constantly running, and some are set up to display light indicators (LEDs), for creating sequencing functions. The clocked modules are more efficient of CPU cycles unless set to Turbo mode by setting the Clock input to 126, in which case they effectively become the same as the constantly running modules.

UF modules are named somewhat ambiguously because they have no particular function by themselves - their functionality is entirely up to you, and how you choose to define them. The default function for UF modules is to add all the inputs and send them to the output. This gives you an instant check on whether a modules is working and what inputs it is getting.

Connection inputs are the same in all the UF modules: If there is a clock, it will be yellow; all the value inputs are green and they are, top to bottom (or left to right), designated as In1, In2, In3 and In4. Inputs not used are set by the module to 0 unless otherwise noted.

Some modules have graphical indicator lights ("LEDs") that may be turned on or off under program control. In place of (or in addition to) LEDs, some modules have optional On/Off buttons that may be used as additional inputs.. You can turn the buttons on or off under program control, or the normal way, by clicking on them.

To program the modules, you simply enter your function into the UF Programmer, test it, and put it into one of the 128 function slots. Select the particular function slot at the module with its blue drop-down menu (or in the case of the UFX module, by giving it a value in its Function Number input). The function's descriptive name can be viewed as a tool tip, by holding the mouse pointer over a module's name label.

The "programming language" is simple calculator script, as used by almost all scientific calculators including the Windows pop up calculator. There are 4 In variables that represent the module inputs, and there is an Out() function that sends the results to the output. So, for example, to program the default function that adds the inputs and sends them to the output, the function would be: Out( In1 + In2 + In3 + In4).


Basic UC1 & UF2

The UC1 (User with Clock and 1 Input) and UF2 (User with Fixed inputs, 2 inputs) are the simplest and most efficient modules when you only need one or two inputs. The modules do not reconfigure themselves (as most of the other modules do), and they have no LED indicators. They just gather the inputs and run the function.

The most important part of all UF modules is the Eval Function Number, usually referred to as the Fn#. On all UF modules except UFX, this is the blue drop down menu, which has the numbers 0 to 127. This is the User Function that defines what the module will do.

The clock input of the UC1, like all UF Clock inputs, runs in Turbo mode (it executes its function every MIDI Tick, which is on 64th triplets) when set to a value of 126. Also, there is an InC variable available in the UF programmer that gives the value of the On part of the clock tick. Off, of course, is always 0. This, for example, would let you use the Clock to designate both a Clock tick (the 0 to non zero transition) plus a velocity (the actual value of the non zero part).

UFC modules with Clock inputs also will run 1 cycle whenever the ToolBar Run/Stop button is clicked on, to allow easy initialization of the module even when no clock input is normally present. See the example program,ufgraphics.ssp for examples of this. You can defeat this feature with the Option menu selection, "Reset Modules," or with the UF-Prog function, "AutoStart()."

In place of LEDs, UC1 & UF2 modules have optional little gray On/Off buttons to the right of the input connection buttons that may be used as additional inputs: In2-4 for the UFC, and In3-4 for the UFO. The buttons have a value of 1 when pushed in, and 0 when out. These buttons do not display when the module is first created; they must be turned on with the nLED() function. You can turn the buttons on or off the normal way, by clicking on them, or by using the LED() function.

The gray labels on these and other UF modules that have them may be used to display numeric values or text with the UF Programmer functions NumLable() & TxtLabel().

4-Input UFX

The UFX (User Function eXtended) module has all the options. It is clocked, all 4 inputs are available, its function can be changed on the fly by a change at the Fn# input, and it has LEDS you can control however you want.

The number of LEDs available in this module range from 0 to 16. Set the number of LEDs with the nLED() function. For example the function to give it 12 LEDs would be: NLEDS(12). In this module, the LEDS will change size to fit in the area to the right of the connection input buttons.

The Fn# input is the Function number. Strictly speaking, UF modules evaluate pre compiled Expressions, which are composed of Numbers, Variables, Functions and other Expressions. But we simply refer to the compiled expressions the modules run as Functions. This is all explained in the Programming section of the manual.

The Fn# input makes this module different from the other UF modules in how it changes its function. Here, the function number is set by the Fn# input, which is like any SoftStep module input, and may be controlled by the output of any SoftStep module. The consequence of this is that unlike the other modules which use a drop down menu to change Function numbers, this module does not respond to the GoTo() function.

Variable Input UCV & UFV

The UCV (User Clocked Variable-input) and UFV (User Function Variable-input) modules are similar to the Basic UF modules, except they have a variable number of inputs, settable from 0 to 4 on the UCV, and 1 to 4 on the UFV. Set the number of inputs with the nLED() function (since the modules have no LEDs, there is no confusion). The function to set just 1 input would be: NLED(1). The modules will change their height to accommodate the number of inputs.

Deleted inputs are not set to 0 as are unused inputs on the fixed-input modules. They are not seen and not available to be changed, but the connections remain, whether it is 0, some other number, or a connection to another module's output. Changing SnapShots will not change the input configuration, but it is remembered when the SoftStep file is saved, and restored when it is loaded again.

Extended Variable Input UCXV & UFXV

The UCXV and UFXV modules are extended versions of the Variable Input UCV & UFV modules. They have up to 16 inputs, which are available at the UF Programmer as In1 to In16. Set the number of inputs with the nLED() function. The LEDs on this module are fixed, and spaced the same as the input buttons, so nLED() will set both the number of LEDS and the number of inputs. The UF Programmer ClkLED() function can be used to control both the regultar LEDs of the UCXV, and the LED opposite the Clock input:

Output Only

The UFO (User Function Output-only) module has no connection inputs; it can be set (with the nLED() function) to have a little manual On/Off button that reads as 0 or 1 in IN1 (default is no button); and it can also have a single LED (the default). Finally, you can configure a read out label that displays numbers that are outside the 0-127 MIDI range. This module may be used to supply multiple outputs for a "parent" function.

You turn the LED on with the function LED(1), and turn it off with LED(0). The on/off button is treated as a 2nd LED, so nLED(2) will display it (and hide the LED - use nLED(3) to display both). You can change the button On/Off status the normal way, by clicking on it, and you can also use the LED(2) function to turn it on, and LED(0) to turn it off.

To configure the gray readout label, use nLED(4). As with all UF modules that have gray labels, you can use the UF Programmer functions NumLable() & TxtLabel() to display numbers or text of your choice.


The ULR (User LED Row) module has no inputs, and can be set (with the nLED() function) to have from 0 to 32 LEDs. Like the UFO, this module may be use to supply multiple outputs for a "parent" function, although the UFO is usually a better choice when multiple LEDs are not needed as it uses fewer computer resources..

Like all UF modules with a variable number of LEDs or Inputs, the number of LEDs setting is not part of the SnapShot system, so changing SnapShots will not change the LED configuration (although it will change the blue drop-down menu function number setting). The LED configuration is remembered when the SoftStep file is saved, and restored when it is loaded again.

Bit Matrix

The ULM (User LED Matrix) module is a 2-input module with the ability to set up to 1024 LEDs in a matrix of up to 32x32, and to "draw" the LEDS with the mouse as well as to use the mouse to read the LED's On/Off status. This makes it handy for running Cellular Automata algorithms, and as a rhythm programmer.

To change the LED matrix, use the nLED() function as usual, but use it twice - once with a positive number to set the number of columns, and once with a negative number to set the number of rows. So to set the 8x24 matrix shown above, use: NLED(-8), NLED( 24).

Matrix LEDs are also sensitive to mouse clicks, so they act like pushbuttons. Click on one to change its On/Off state. Hold the left button down to draw multiple On LEDs; hold the left button down to erase them.

When LEDs are showing, a Lock button will appear under the output box. When this button is On, the mouse cursor will not change the state of the LEDs, but it will read them. The InC variable, which is otherwise unused, returns the state of the LED under the cursor: 1 for On and 0 for Off. Additionally, In3 and In4 will report the Row and Column number of the LED the mouse cursor is over.

Unlike LEDS in the other modules, which are indicator lights only, the On/Off state of the Matrix LEDs is remembered when the SoftStep file is saved, and restored when it is loaded again.

There are special functions available to work with the LED Matrix, such as Cellular Automaton and John Conway's Life algorithm. See the UF Programmer section for details.

UF Slider Control

The Slider control has no direct module inputs or outputs; it is only accessable by moving the sliders with the mouse, or with the UF Slider functions. Unlike other SoftStep controls, the UF Slider is not limited to the 0-127 MIDI range. You can also set the number of sliders (6-64), colors of groups of sliders, and the mouse sensitivity.

The light blue "F" Fill button pops up the standard Fill dialog. Because the Slider values are floating point, not the 0-127 integers found in other sequencers, the Fill utility works a little differently. When Fill pops up, the Slider values, regardless of their ranges, are converted to an integer in the 0-127 range; then when the Fill is closed they are converted back to floating point values.

The blue solid button on the top of the module pops up a dialog box where you can customize the Slider control:

Select the sliders to change by clicking in the buttons in the bottom part of the display. Changes will only affect sliders represented by the buttons that are clicked in. You can select (click in) all buttons at once, or deselect all at once by clicking the All On/Off button to the right of the color buttons.

The Color button on the top left of the dialog sets the color of all sliders that have their selection buttons clicked in. Also, right clicking on the color buttons selects or deselects buttons of that color.

The Set Doc button puts any text you have in the textbox to its right into the selected sliders, so when the mouse cursor is over the slider, the text will appear on the top line of the Sliders module.

Set Range and Set Ofst sets range and offset for the selected sliders. Slider values are stored internally in three parts: the slider position which is a decimal fraction between 0 and 1 (0= slider all the way down, 1= all the way up), plus a Range multiplier, and an Offset that is added. Slider output = (Position X Range) + Offset. You can set Offset to virtually anything you want, positive or negative; set Range to any positive number > 0.1.

The Sensitivity slider sets how rapidly the slider value changes when you drag the mouse over it. Lower values give slower motion and more accuracy, hight values give faster motion and less accuracy.

The Sliders slider sets how many sliders will display, from 6 to 64. When you change the number of sliders, the associated selection buttons will become visible or invisible as appropiate.

SoftStep is Copyright © 1999-2004 by John Dunn and Algorithmic Arts. All Rights Reserved.