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
- Inputs:
1,2,3,4 - Outputs:
1,2,3,4 - Parameters:
FadeTimeGate_1_1Gate_1_2Gate_1_3Gate_1_4Gate_2_1Gate_2_2Gate_2_3Gate_2_4Gate_3_1Gate_3_2Gate_3_3Gate_3_4Gate_4_1Gate_4_2Gate_4_3Gate_4_4
88Matrix
8x8 Matrix
- Inputs:
1,2,3,4,5,6,7,8 - Outputs:
1,2,3,4,5,6,7,8 - Parameters:
FadeTimeGate_1_1Gate_1_2Gate_1_3Gate_1_4Gate_1_5Gate_1_6Gate_1_7Gate_1_8Gate_2_1Gate_2_2Gate_2_3Gate_2_4Gate_2_5Gate_2_6Gate_2_7Gate_2_8Gate_3_1Gate_3_2Gate_3_3Gate_3_4Gate_3_5Gate_3_6Gate_3_7Gate_3_8Gate_4_1Gate_4_2Gate_4_3Gate_4_4Gate_4_5Gate_4_6Gate_4_7Gate_4_8Gate_5_1Gate_5_2Gate_5_3Gate_5_4Gate_5_5Gate_5_6Gate_5_7Gate_5_8Gate_6_1Gate_6_2Gate_6_3Gate_6_4Gate_6_5Gate_6_6Gate_6_7Gate_6_8Gate_7_1Gate_7_2Gate_7_3Gate_7_4Gate_7_5Gate_7_6Gate_7_7Gate_7_8Gate_8_1Gate_8_2Gate_8_3Gate_8_4Gate_8_5Gate_8_6Gate_8_7Gate_8_8
ADSREnv
ADSR Envelope.
- Inputs:
Gate - Outputs:
Out - Parameters:
AttackDecaySustainReleaseGate
Amp
Simple amplifier with level parameter and exponential or linear gain modulation.
- Inputs:
Exp,Lin,In - Outputs:
Out - Parameters:
Level
Amp2
Amplifier with two inputs, level parameter and variable exponential or linear gain modulation.
- Inputs:
GainModulation,In1,In2 - Outputs:
Out - Parameters:
GainGainModulationIn1In2OutMode
BPFilter
Bandpass SVF filter.
- Inputs:
In,FM,ResonanceModulation - Outputs:
Out - Parameters:
AudioLevelFrequencyResonanceFMResonanceModulation
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
Delay
Delay line.
- Inputs:
In,DelayTimeModulation - Outputs:
Out - Parameters:
DelayTimeDelayTimeModulation
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,PWM - Outputs:
Sine,Triangle,Saw,Pulse - Parameters:
RangeTuneFMPulseWidthPWM
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
PShift
Pitch shifter.
- Inputs:
Left,Right,PitchRatioModulation,PitchDispersionModulation,TimeDispersionModulation - Outputs:
Left,Right - Parameters:
PitchRatioPitchDispersionTimeDispersionPitchRatioModulationPitchDispersionModulationTimeDispersionModulation
PulseOsc
Pulse/square oscillator with pulse width control.
- Inputs:
FM,PWM - Outputs:
Out - Parameters:
RangeTuneFMPulseWidthPWM
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 - Outputs:
Out - Parameters:
RangeTuneFM
SineLFO
Sine LFO.
- Inputs:
Reset - Outputs:
Out - Parameters:
FrequencyReset
SineOsc
Sine oscillator.
- Inputs:
FM - Outputs:
Out - Parameters:
RangeTuneFM
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 - Outputs:
Out - Parameters:
RangeTuneFM
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: decsribe workaround)
Status
- Beta-stage. Engine commands are fixed. A few modules are not tested. Expect changes to module parameter/input/output ranges.