R
General purpose audio patching engine
Features
- Arbitrarily create and connect audio generators and processors (modules).
- Control module parameters from Lua scripting layer.
Commands
new ss <modulename> <moduletype>- creates a uniquely named module of given type (refer to section "Modules" for available types).- Examples:
new Osc MultiOsc,new Out SoundOut
- Examples:
connect ss <modulename/output> <modulename/input>- connects a module output to a module input.- Examples:
connect Osc/Pulse Out/Left,connect Osc/Pulse Out/Right
- Examples:
disconnect ss <modulename/output> <modulename/input>- disconnects a module output from a module input.- Example:
disconnect Osc/Out Out/Left
- Example:
set sf <modulename.parameter> <value>- sets a module parameter to the given value.- Examples:
set Osc.Tune -13,set Osc.PulseWidth 0.5
- Examples:
delete s <modulename>- removes a module.- Example:
delete Osc
- Example:
Bulk Commands
bulkset s <bundle>- sets multiple module parameters to values given a bundle ofmodulename.parametervaluepairs serialized as a string.- Example:
bulkset "Osc.Tune -1 Osc.PulseWidth 0.7"has the same effect as sendingset Osc.Tune -1andset Osc.PulseWidth 0.7. All value changes of a bundle are performed at the same time. TODO: floating point precision?
- Example:
Macro Commands
newmacro ss <macroname> <modulename.parameters...>- creates a uniquely named macro for simultaneous control of a list of space delimited module parameters. All included parameters should adhere to the same spec.- Example: given
SineOscandPulseOscmodules namedOsc1andOsc2the commandnewmacro Tune "Osc1.Tune Osc2.Tune"defines a new macro controllingTuneparameter for both modules.
- Example: given
macroset sf <macroname> <value>- sets value for module parameters included in a macro. Controlling multiple parameters with a macro is more efficient than using multiplesetcommands. It is also faster than usingbulkset. All value changes of parameters in a macro are performed at the same time.- Example: given
Tunemacro above commandmacroset Tune 30has the same effect as commandsset Osc1.Tune 30andset Osc2.Tune 30.
- Example: given
deletemacro s <macroname>- removes a macro.- Example:
deletemacro Tune.
- Example:
Debug Commands
trace i <boolean>- determines whether to post debug output in SCLang Post Window (1= yes,0= no)
Modules
44Matrix
4x4 matrix signal router
- Inputs:
1...4: Signal inputs
- Outputs:
1...4: Signal outputs
- Parameters:
FadeTime: Fade time in milliseconds (range: 0-100000 ms) applied when an input is switched on to or off from an output. Default is 5 ms.Gate_1_1...Gate_4_4: Toggles that determine whether inputs (first number) are switched on to outputs (second number).
88Matrix
8x8 matrix signal router
- Inputs:
1...8: Signal inputs
- Outputs:
1...8: Signal outputs
- Parameters:
FadeTime: Fade time in milliseconds (range: 0-100000 ms) applied when an input is switched on to or off from an output. Default is 5 ms.Gate_1_1...Gate_8_8: Toggles that determine whether inputs (first number) are switched on to outputs (second number).
ADSREnv
ADSR Envelope.
- Inputs:
Gate: Gate control input. A signal > 0 triggers envelope
- Outputs:
Out: Envelope signal: 0 ... 0.8.
- Parameters:
Attack: Attack time. Range 0.1 - 2000 ms. Default is 5.Decay: Decay time. Range 0.1 - 8000 ms. Default is 200.Sustain: Sustain level 0 - 1.0. Default is 0.5.Release: Release time. Range 0.1 - 8000 ms. Default is 200.Gate: Scriptable gate. When parameter goes from 0 to a positive value a gate is triggered.
Amp
Simple amplifier with level parameter and exponential or linear gain modulation.
- Inputs:
Exp: Gain modulation control input (logarithmic)Lin: Gain modulation control input (linear)In: Input signal to attenuate
- Outputs:
Out: Attenuated output signal
- Parameters:
Level: Amplifier level 0 - 1.0.
Amp2
Amplifier with two inputs, level parameter and variable exponential or linear gain modulation.
- Inputs:
GainModulation: Control input for gain modulationIn1: Audio input 1In2: Audio input 2
- Outputs:
Out: Attenuated signal
- Parameters:
Gain: Initial gain 0 - 1.0.GainModulation: Gain modulation amount 0 - 1.0.In1: Audio input 1 level 0 - 1.0.In2: Audio input 2 level 0 - 1.0.Out: Audio output level 0 - 1.0.Mode: 0 or 1 representing linear or exponential gain modulation.
BPFilter
Bandpass SVF filter.
- Inputs:
In: Audio inputFM: Control input for frequency modulationResonanceModulation: Control input for resonance modulation
- Outputs:
Out: Filtered audio output
- Parameters:
AudioLevel: Audio level 0 ... 1.0. Default is 1.Frequency: Cutoff frequency 0.1 ... 20000 Hz. Default is 440 Hz.Resonance: Resonance 0 ... 1.0. Default is 0.FM: Frequency modulation amount -1.0 ... 1.0.ResonanceModulation: Resonance modulation amount -1.0 ... 1.0.
BRFilter
Bandreject (Notch) SVF filter.
- Inputs:
In,FM,ResonanceModulation - Outputs:
Out - Parameters:
AudioLevelFrequencyResonanceFMResonanceModulation
DbMixer
Mixer suited for audio signals.
- Inputs:
In1,In2,In3,In4 - Outputs:
Out - Parameters:
In1In2In3In4Out
Decimator
Sample rate and bit depth reducer.
- Inputs:
In,Rate,Depth,Smooth - Outputs:
Out - Parameters:
RateDepthSmoothRateModulationDepthModulationSmoothModulation
Delay
Delay line.
- Inputs:
In,DelayTimeModulation - Outputs:
Out - Parameters:
DelayTimeDelayTimeModulation
EQBPFilter
Non-resonant, variable width bandpass filter.
- Inputs:
Frequency,Bandwidth,FM,BandwidthModulation - Outputs:
Out - Parameters:
RateDepthSmoothRateModulationDepthModulationSmoothModulation
FMVoice
FM voice (TODO: untested)
- Inputs:
Modulation - Outputs:
Out - Parameters:
FreqTimbreOsc1GainOsc1PartialOsc1FixedOsc1FixedfreqOsc1IndexOsc1OutlevelOsc1_To_Osc1FreqOsc1_To_Osc2FreqOsc1_To_Osc3FreqOsc2GainOsc2PartialOsc2FixedOsc2FixedfreqOsc2IndexOsc2OutlevelOsc2_To_Osc1FreqOsc2_To_Osc2FreqOsc2_To_Osc3FreqOsc3GainOsc3PartialOsc3FixedOsc3FixedfreqOsc3IndexOsc3OutlevelOsc3_To_Osc3FreqOsc3_To_Osc2FreqOsc3_To_Osc1FreqMod_To_Osc1GainMod_To_Osc2GainMod_To_Osc3GainMod_To_Osc1FreqMod_To_Osc2FreqMod_To_Osc3Freq
FShift
Frequency shifter.
- Inputs:
Left,Right,FM - Outputs:
Left,Right - Parameters:
FrequencyFM
FreqGate
CV/Gate thing.
- Inputs: None
- Outputs:
Frequency,Gate,Trig - Parameters:
FrequencyGate
HPFilter
Highpass SVF filter.
- Inputs:
In,FM,ResonanceModulation - Outputs:
Out - Parameters:
AudioLevelFrequencyResonanceFMResonanceModulation
LPFilter
Lowpass SVF filter.
- Inputs:
In,FM,ResonanceModulation - Outputs:
Out - Parameters:
AudioLevelFrequencyResonanceFMResonanceModulation
LPLadder
Lowpass ladder filter.
- Inputs:
In,FM,ResonanceModulation - Outputs:
Out - Parameters:
FrequencyResonanceFMResonanceModulation
LinMixer
Mixer suited for control signals
- Inputs:
In1,In2,In3,In4 - Outputs:
Out - Parameters:
In1In2In3In4Out
MGain
Audio fader with db gain control and mute.
- Inputs:
In - Outputs:
Out - Parameters:
GainMute
MMFilter
Multimode filter.
- Inputs:
In,FM,ResonanceModulation - Outputs:
Notch,Highpass,Bandpass,Lowpass - Parameters:
AudioLevelFrequencyResonanceFMResonanceModulation
MultiLFO
LFO featuring multiple waveforms.
- Inputs:
Reset - Outputs:
InvSaw,Saw,Sine,Triangle,Pulse - Parameters:
FrequencyReset
MultiOsc
Oscillator featuring multiple waveforms.
- Inputs:
FM,LinFM,PWM - Outputs:
Sine,Triangle,Saw,Pulse - Parameters:
RangeTuneFMLinFMPulseWidthPWM
Noise
White noise generator.
- Inputs: None
- Outputs:
Out - Parameters: None
OGain
8-in/8-out audio fader with db gain control and mute.
- Inputs:
In1,In2,In3,In4,In5,In6,In7,In8 - Outputs:
Out1,Out2,Out3,Out4,Out5,Out6,Out7,Out8 - Parameters:
GainMute
Pan
Stereo panner with monophonic input.
- Inputs:
In,PositionModulation - Outputs:
Left,Right - Parameters:
PositionPositionModulation
PShift
Pitch shifter.
- Inputs:
Left,Right,PitchRatioModulation,PitchDispersionModulation,TimeDispersionModulation - Outputs:
Left,Right - Parameters:
PitchRatioPitchDispersionTimeDispersionPitchRatioModulationPitchDispersionModulationTimeDispersionModulation
PulseOsc
Pulse/square oscillator with pulse width control.
- Inputs:
FM,LinFM,PWM - Outputs:
Out - Parameters:
RangeTuneFMLinFMPulseWidthPWM
QGain
4-in/4-out audio fader with db gain control and mute.
- Inputs:
In1,In2,In3,In4 - Outputs:
Out1,Out2,Out3,Out4 - Parameters:
GainMute
RingMod
Ring modulator.
- Inputs:
In,Carrier - Outputs:
Out - Parameters: None
SGain
2-in/2-out audio fader with db gain control and mute.
- Inputs:
Left,Right - Outputs:
Left,Right - Parameters:
GainMute
SampHold
Sample and hold module.
- Inputs:
In,Trig - Outputs:
Out - Parameters: None
SawOsc
Sawtooth oscillator.
- Inputs:
FM,LinFM - Outputs:
Out - Parameters:
RangeTuneFMLinFM
SineLFO
Sine LFO.
- Inputs:
Reset - Outputs:
Out - Parameters:
FrequencyReset
SineOsc
Sine oscillator.
- Inputs:
FM,LinFM,PM - Outputs:
Out - Parameters:
RangeTuneFMLinFMPM
Slew
Slew rate limiter.
- Inputs:
In - Outputs:
Out - Parameters:
Time(seconds)
SoundIn
- Inputs: None
- Outputs:
Left,Right - Parameters: None
SoundOut
- Inputs:
Left,Right - Outputs: None
- Parameters: None
TestGen
- Inputs: None
- Outputs:
Out - Parameters:
FrequencyAmplitudeWave
TriOsc
Triangle oscillator (non-bandlimited).
- Inputs:
FM,LinFM - Outputs:
Out - Parameters:
RangeTuneFMLinFM
XFader
Crossfader
- Inputs:
InALeft,InARight,InBLeft,InBRight - Outputs:
Left,Right - Parameters:
FadeTrimATrimBMaster
Example Usage
-- Spawn three modules
engine.new("LFO", "MultiLFO")
engine.new("Osc", "PulseOsc")
engine.new("SoundOut", "SoundOut")
-- Modulate OSC pulse width by LFO sine wave
engine.connect("LFO/Sine", "Osc/PWM")
-- Hook up oscillator to audio outputs
engine.connect("Osc/Out", "SoundOut/Left")
engine.connect("Osc/Out", "SoundOut/Right")
-- Set module parameter values
engine.set("Osc.PulseWidth", 0.25)
engine.set("LFO.Frequency", 0.5)
engine.set("Osc.PWM", 0.2)See tutorial scripts in scripts/r_tutorial, hacks in scripts/r_hacks and jah scripts moln, rymd, bob and shifty for more elaborate examples.
The R Lua Module
The R Lua module contains:
- Default specs for all included modules.
- A number of convenience functions for working with the R engine (polyphonic set ups and more).
- Other utility functions.
Require the R module:
local R = require 'jah/r'Module Specs
R.specs contains default specs for all modules, ie.:
R.specs.MultiOsc.Tune -- returns ControlSpec.new(-600, 600, "linear", 0, 0, "cents")These can be copied and overriden, if needed:
local my_testgen_spec = R.specs.TestGen.Frequency:copy() -- returns ControlSpec.WIDEFREQ
my_testgen_spec.minval = 80
my_testgen_spec.maxval = 8000Engine Functions
R.engine.poly_new("Osc", "MultiOsc", 3) -- creates MultiOsc modules Osc1, Osc2 and Osc3
R.engine.poly_new("Filter", "MMFilter", 3) -- creates MMFilter modules Filter1, Filter2 and Filter3
R.engine.poly_connect("Osc/Saw", "Filter/In", 3) -- connects Osc1/Saw to Filter1/In, Osc2/Saw to Filter2/In and Osc3/Saw to Filter3/InUtility Functions
R.util.split_ref("Osc.Frequency") -- returns {"Osc", "Frequency"}
R.util.poly_expand("Osc", 3) -- returns "Osc1 Osc2 Osc3"Considerations
- Modules can be connected to feedback but a delay of one processing buffer (64 samples) is introduced. There is no single-sample feedback.
- Shooting a lot of commands to too fast R may cause commands to be delayed. Setting parameter values using
macrosetinstead ofsetmight help.
Extending R
Modules are written by way of subclassing the RModule class. A subclass supplies a unique module type name (by overriding *shortName), an array of specs for each module parameter (*params) and a SynthDef Ugen Graph function (*ugenGraphFunc) whose function arguments prefixed with param_, in_ and out_ are treated as parameter controls and input and output busses. The R engine will introspect the ugenGraphFunc and together with the parameter specs provide scaffolding necessary to supply parameter values and interconnect modules.
Note: If a dictionary is supplied for a parameter in the *params array, its Spec key value will be used as spec and its LagTime value will be used as fixed lag rate for the parameter.
Annotated example:
RTestModule : RModule { // subclassing RModule makes this a module
*shortName { ^'Test' } // module type used in engine new command
*params { // description of the module parameters
^[
'Frequency' -> \widefreq.asSpec, // first parameter
'FrequencyModulation' -> (
Spec: \unipolar.asSpec, // second parameter
LagTime: 0.05 // 50 ms lag
)
]
}
*ugenGraphFunc { // regular SynthDef ugenGraphFunc function describing DSP
^{
|
in_FM, // will reference a bus to be used for audio input
out_Out, // will reference a bus to be used for audio output
param_Frequency, // refer to first parameter's value...
param_FrequencyModulation // ... and second parameter's value
|
var sig_FM = In.ar(in_FM);
var sig = SinOsc.ar(param_Frequency + (1000 * sig_FM * param_FrequencyModulation)); // linear FM
Out.ar(out_Out, sig);
}
}
}Updating the R Lua module
To be usable with functions in the R Lua module R.engine table module parameter metadata has to be included in the R.specs table. R.specs can be generated from RModule metadata using the Engine_R.generateLuaSpecs method.
Module documentation stubs may be generated using the Engine_R.generateModulesDocSection method.
Gotchas
If one of the parameters of a module has a ControlSpec not compatible with Lag (ie. the standard db ControlSpec) lag time should not be used for any of the parameters. This is a known SuperCollider issue. (TODO: describe workaround)
Status
- Beta-stage. Engine commands are fixed. A few modules are not tested. Expect changes to module parameter/input/output ranges.