How to Use the Arpeggiator within your Sample Libraries
As of version 1.26.0, DecentSampler has a built-in arpeggiator. Unlike the note sequencer, which replays a fixed pattern you authored ahead of time, the arpeggiator reacts live to whatever notes are currently held: hold a chord and it generates a stream of notes from that chord — in the order and octave range you choose — for as long as you hold it. This guide walks through arming it, exposing its parameters as knobs, and modulating it with an LFO.
The <arpeggiator> element
Add a single <arpeggiator> element as a direct child of your <DecentSampler> root, alongside <groups>, <midi>, etc.:
<DecentSampler>
<groups>...</groups>
<arpeggiator enabled="true"
arpOrder="up"
arpOctaveRange="2"
arpOctaveMode="replayPerOctave"
arpStepCount="16"
arpGateLength="0.75"
arpFollowGlobalTempo="true"
arpSyncDivision="noteOneSixteenth"
arpRateMultiplier="1.0"/>
</DecentSampler>
With just this, the arpeggiator is already fully functional — hold a chord and it will play. The full attribute reference, including a worked example for every arpOrder value, is in the <arpeggiator> element.
Binding knobs to the arpeggiator
Every <arpeggiator> attribute can be controlled from a UI knob using the arpeggiator binding type at level="instrument". Which translation you use depends on the kind of parameter:
Discrete parameters (
ARP_ENABLED,ARP_ORDER,ARP_OCTAVE_MODE) are a fixed list of named states, so they’re best driven by avalueType="multi_state"knob — each state fires atranslation="fixed_value"binding that sends the exact attribute value as a string.Numeric parameters (
ARP_OCTAVE_RANGE,ARP_STEP_COUNT,ARP_GATE_LENGTH,ARP_RATE_MULTIPLIER,ARP_OVERRIDE_BPM) are continuous or integer ranges, driven the same way as any other numeric binding (translation="linear", withvalueType="integer"for the whole-number ones).
An on/off toggle
<labeled-knob x="12" y="40" width="90" height="110" label="Arp" valueType="multi_state" value="1">
<state name="Off">
<binding type="arpeggiator" level="instrument" parameter="ARP_ENABLED" translation="fixed_value" translationValue="false"/>
</state>
<state name="On">
<binding type="arpeggiator" level="instrument" parameter="ARP_ENABLED" translation="fixed_value" translationValue="true"/>
</state>
</labeled-knob>
A discrete order selector
Turning this knob cycles through named states, each firing a fixed_value binding with the matching arpOrder string:
<labeled-knob x="112" y="40" width="120" height="110" label="Order" valueType="multi_state" value="0">
<state name="Up">
<binding type="arpeggiator" level="instrument" parameter="ARP_ORDER" translation="fixed_value" translationValue="up"/>
</state>
<state name="Down">
<binding type="arpeggiator" level="instrument" parameter="ARP_ORDER" translation="fixed_value" translationValue="down"/>
</state>
<state name="Up-Down">
<binding type="arpeggiator" level="instrument" parameter="ARP_ORDER" translation="fixed_value" translationValue="up_down"/>
</state>
<state name="Up-Down Incl">
<binding type="arpeggiator" level="instrument" parameter="ARP_ORDER" translation="fixed_value" translationValue="up_down_inclusive"/>
</state>
<state name="Down-Up">
<binding type="arpeggiator" level="instrument" parameter="ARP_ORDER" translation="fixed_value" translationValue="down_up"/>
</state>
<state name="Down-Up Incl">
<binding type="arpeggiator" level="instrument" parameter="ARP_ORDER" translation="fixed_value" translationValue="down_up_inclusive"/>
</state>
<state name="As Played">
<binding type="arpeggiator" level="instrument" parameter="ARP_ORDER" translation="fixed_value" translationValue="as_played"/>
</state>
<state name="Random">
<binding type="arpeggiator" level="instrument" parameter="ARP_ORDER" translation="fixed_value" translationValue="random"/>
</state>
<state name="Random No Repeat">
<binding type="arpeggiator" level="instrument" parameter="ARP_ORDER" translation="fixed_value" translationValue="random_no_repeat"/>
</state>
</labeled-knob>
Numeric knobs
Octave range and step count are whole numbers, so use valueType="integer". Gate length and rate multiplier are continuous:
<labeled-knob x="242" y="40" width="90" height="110" label="Octave Range"
valueType="integer" minValue="1" maxValue="4" value="2" defaultValue="2">
<binding type="arpeggiator" level="instrument" parameter="ARP_OCTAVE_RANGE" translation="linear"/>
</labeled-knob>
<labeled-knob x="472" y="40" width="90" height="110" label="Gate Length"
valueType="float" minValue="0.05" maxValue="1.5" value="0.6" defaultValue="0.6">
<binding type="arpeggiator" level="instrument" parameter="ARP_GATE_LENGTH" translation="linear"/>
</labeled-knob>
Modulating the arpeggiator with an LFO
Because a knob and a modulator reach the arpeggiator through the exact same <binding type="arpeggiator"> mechanism, you can also target it from an <lfo> (or any other modulator) — for example, to breathe the gate length in and out over time:
<modulators>
<lfo shape="sine" rate="0.2" scope="global">
<binding type="arpeggiator" level="instrument" parameter="ARP_GATE_LENGTH"
modBehavior="add" translation="linear"
translationOutputMin="-0.2" translationOutputMax="0.2"/>
</lfo>
</modulators>
A quick note on rate modulation specifically: nudging ARP_RATE_MULTIPLIER from a knob or MIDI CC (a mod wheel ramping the arp faster during a performance, say) is common and works well. Continuously modulating it from a fast LFO is a much less common technique — most arpeggiators treat rate as a synced, discrete setting rather than a modulation target, because warping the clock mid-stream can make individual steps land unevenly. It’s supported (nothing about the binding is special-cased), but treat it as an experimental, “clock wobble”-style effect rather than a typical use case.
Conclusion
In this guide, we went over how to arm the arpeggiator, how to expose its parameters as knobs — both discrete (multi-state) and numeric — and how to modulate it with an LFO using the same binding mechanism. For the complete attribute reference and a worked example of every order mode, see the <arpeggiator> element.