Bespoke Synth Reference
overview video
Here is a video detailing basic usage of Bespoke, including a bunch of less-obvious shortcuts and workflow features.
There are some things in this video that are slightly out of date (I should make a new video!), but there is still plenty of useful information in there.
basics
Navigation * space bar + move mouse to pan, or right-click drag in empty space * space bar + mousewheel/trackpad-scroll to zoom, or scroll in empty space * if you get lost, press ~ to bring up the console, type "home", and press enter to reset to the initial position and zoom * if you have enabled the minimap in the settings, you can click on the minimap to directly go to a location -at the bottom of the minimap you can click on 9 bookmark buttons -hold shift while clicking will store your current location into that bookmark button -use shift+[num] to go to the specified bookmark Creating Modules * drag items out of the top bar menus OR * right-click and select from the popup menu OR * right-click and start typing the name of the module you want, then drag it out of the popup menu OR * hold the first letter of a module and drag them out of the popup menu OR * drag a cable into space and spawn a connecting module from the popup * to delete a module, lasso select + backspace OR use the triangle menu and choose "delete module" * to duplicate a module, hold alt/option and drag from the title bar Patching * drag the circle from the bottom of a module to the target OR click the circle then click the target to patch * drag a cable and press backspace to unpatch * hold shift while grabbing a patch cable circle to split * hold shift while releasing a patch cable on a target to insert * while holding shift, drag a module by the title bar and touch its circle to another module, or the mouse pointer to another module's circle, to quick patch UI Controls * click or drag a slider to adjust its value * hold shift to fine-tune * while hovered: -use mousewheel/trackpad-scroll to adjust (shift to fine-tune) -type a value into a slider (such as 1.5) and press enter -type an expression into a slider (such as 1/16 or +=10) and press enter -press up or down to increase the value by 1 (hold shift for .01) -press [ or ] to halve or double the value -press \ to reset to the initial value * hold alt/option and drag to adjust slew amount (smoothing) * right click a slider to add an LFO -click and drag a green modulated slider vertically to adjust the modulation min, and horizontally to adjust the modulation max * hold ctrl/command and click the lower or upper half of a slider to adjust that slider's minimum or maximum value, to give it increased or reduced range (warning! increasing range can lead to unpredictable behavior in some cases) * press tab to cycle through controls on a module * press ctrl/command+arrows to navigate around controls on a module Saving * "write audio" button: write the last 30 minutes of audio to the /data/recordings folder, perfect for making sure you don't miss any cool moments * "save state" button: save the current layout to a file. shortcut: ctrl-s * "load state" button: load previously saved layouts. shortcut: ctrl-l Key Commands * ctrl/command-'s': save * ctrl/command-'l': load * shift-'p': pause audio processing. this will stop all audio output. press shift-'p' again to resume * F2: toggle displaying all ADSR controls as sliders * F3: pins or unpin a module so that it stays where it is regardless of the viewports position. only works when not group selecting modules.
instruments
circlesequencer![](screenshots/circlesequencer.png)
length*: number of steps in this ring
note*: pitch to use for this ring
offset*: timing offset for this ring
dotsequencer
![](screenshots/dotsequencer.png)
clear: clear the contents of the dot grid
cols: number of columns
dotgrid: the dot grid
double: double the length of this sequence
interval: rate to play notes at
notemode: which set of pitches should the rows represent?
octave: octave of the bottom pitch of this sequence
row offset: amount to offset the mapping of row to pitch
rows: number of rows
drumsequencer
![](screenshots/drumsequencer.png)
<: shift whole pattern one step earlier
>: shift whole pattern one step later
clear: clear sequence
column: current column, to use for visualizing the step on a midi controller
grid: patch a grid in here from a "midicontroller" module
measures: length of the sequence in measures
metastep: patch a grid in here from a "midicontroller" module to control the "meta step". I forget what this does. oops.
offset*: shift row forward/backward in time. try making your snares a little early, your hats a little late, etc.
offsets: show "offsets" sliders
r amt: the chance that each step will change when being randomized. low values will only change a small amount of the sequence, high values will replace more of the sequence.
r den: density of the randomizer output. the higher this is, the busier the random output will be.
r lock*: lock this row so it doesn't get randomized
random*: randomize this row
randomize: randomize the sequence
repeat: repeat input notes at this rate
rowpitch*: output pitch for this row
step: length of each step
vel: velocity to use when setting a step
velocity: patch a grid in here from a "midicontroller" module to control the velocity
velocitytype: velocity to use when setting a step
yoff: vertical offset for grid controller's view of the pattern
accepts: pulses notes
euclideansequencer
![](screenshots/euclideansequencer.png)
clear: clear all steps, onsets, rotation and offset in all rings
note: randomize notes in all rings
note chance: what is the chance a note gets changed
note*: pitch to use for this ring
o *: in what range is offset created
oct*: in what octave range are notes created
offset: randomize offset in all rings
offset chance: what is the chance that an offset gets changed
offset*: timing offset for this ring
ons *: in what range are onsets created
onset chance: what is the chance that an onset gets changed
onsets: randomize onsets in all rings
onsets*: number of onsets in this ring
random: randomize all steps, onsets and rotation in all rings
random*: randomize steps, onsets and rotation in this ring
rot chance: what is the chance that rotation gets changed
rot hi: in what range is rotation created
rot lo: in what range is rotation created
rotation: randomize rotation in all rings
rotation*: rotation of this ring
step chance: what is the chance a step gets changed
steps: randomize steps in all rings
steps*: number of steps in this ring
stp*: in what range are steps created
fouronthefloor
![](screenshots/fouronthefloor.png)
two: sends note only every two beats
gridkeyboard
![](screenshots/gridkeyboard.png)
arrangement: what style of layout should we use?
ch.latch: latch chord button presses
grid: patch a grid in here from a "midicontroller" module
latch: latch key presses, so you press once to play a note, and press again to release a note
layout: keyboard style
octave: base octave
p.root: for chorder, make root note always play
keyboarddisplay
![](screenshots/keyboarddisplay.png)
accepts: notes
m185sequencer
![](screenshots/m185sequencer.png)
gate*: behavior for each row: "repeat" plays every step, "once" plays just the first step, "hold" holds across all steps, "rest" plays no steps
interval: interval per step
pitch*: pitch to use for this row
pulses*: number of steps this row should last
reset step: resets counter to first step
accepts: pulses
midicontroller
![](screenshots/midicontroller.png)
x : delete this connection
14bit: is this a 14-bit midi control, with this control as the LSB and the control 32 less than this as the MSB?
add: add a mapping manually
bind (hold shift): when this is enabled, you can map a midi input to a UI control by hovering over a UI control, holding shift, and then using desired midi input
blink: when the targeted control is enabled, send alternating on/off messages, to blink the associated LED
channel: which channel to pay attention to
control: pitch or control to refer to
controller: midi device to use
controltype: how this control should modify the target. -slider: set the value interpolated between "midi off" and "midi on" to the slider's value -set: set the specified value directly when this button is pressed -release: set the specified value directly when this button is released -toggle: toggle the control's value to on/off when this button is pressed -direct: set the control to the literal midi input value
copy: duplicate this connection
feedback: which cc or note should we send the feedback to?
increment: when "controltype" is "set" or "release", the targeted control is incremented by this amount (and the "value" field is ignored). when "controltype" is "slider", the targeted control is changed by this amount in the direction the control was changed (this setting is useful for "infinite encoders")
layout: which layout file should we use for this controller? these can be created in your Documents/BespokeSynth/controllers folder.
mappingdisplay: which mapping view to see
messagetype: type of midi message
midi off: the lower end of the midi range. send this value when the targeted control is off. if "scale" is enabled, this also controls the lower end of the slider range, and you can set midi off to be higher than midi on to reverse a slider's direction.
midi on: the upper end of the midi range. send this value when the targeted control is on. if "scale" is enabled, this also controls the upper end of the slider range, and you can set midi off to be higher than midi on to reverse a slider's direction.
monome: which monome should we use?
osc input port: port to use for osccontroller input
page: select which page of midi controls to use. each page acts like an independent midi controller, so you can use pages to allow one midi controller to switch between controlling many things
pageless: should this connection work across all pages of the midicontroller?
path: path to the control that should be affected. you can also enter "hover" here, to affect whichever control the mouse is hovering over.
scale: should the output of this midi slider be scaled between "midi off" and "midi on"?
twoway: should we send feedback to the controller? (to control the LEDs associated with the button/knob)
value: the value to set
notecanvas
![](screenshots/notecanvas.png)
canvas: canvas of notes. canvas controls: -shift-click to add a note -hold shift and drag a note to duplicate -hold alt to drag a note without snapping -hold ctrl while dragging to snap to an interval -hold shift and scroll to zoom -hold alt and grab empty space to move slide the canvas view -hold ctrl and grab empty space to zoom the canvas view
clear: delete all elements
delete: delete highlighted elements
drag mode: direction that elements can be dragged
free rec: enable record mode, and extend canvas if we reach the end
interval: interval to quantize to
load midi: import canvas contents from a midi file
loadtrack: which track number to import when using "load midi"
measures: loop length
play: play notes on canvas
quantize: quantize selected notes to interval
rec: record input notes to canvas
save midi: export canvas contents to a midi file
scrollh: horizontal scrollbar
scrollv: vertical scrollbar
show chord intervals: show brackets to indicate chord relationships
timeline: control loop points
view rows: number of visible rows
accepts: notes
notechain
![](screenshots/notechain.png)
duration: duration of note, in measures
next: interval until sending pulse
pitch: pitch to play
trigger: play note for this chain node
velocity: velocity for note
accepts: pulses
notecounter
![](screenshots/notecounter.png)
*: generate a new random seed
<: go to previous seed
>: go to next seed
beat length: length over which the random sequence should deterministically repeat
div: measure division, when using "div" as the interval
interval: rate to advance
length: length of the sequence
random: output random pitches within the range, rather than sequential
seed: number that determines the random sequence
start: pitch at the start of the sequence
sync: if the output pitch should be synchronized to the global transport
accepts: pulses
notecreator
![](screenshots/notecreator.png)
duration: note length when "trigger" button is used
on: turn on to start note, turn off to end note
pitch: output note pitch
trigger: press to trigger note for specified duration
velocity: note velocity
accepts: pulses
notelooper
![](screenshots/notelooper.png)
canvas: canvas of recorded notes
clear: clear pattern
del/mute: if "write" is enabled, erase notes as the playhead passes over them. otherwise, just mute them.
load*: restore pattern
num bars: set loop length in measures
store*: save pattern
write: should input should be recorded?
accepts: notes
notesequencer
![](screenshots/notesequencer.png)
<: shift the sequence to the left
>: shift the sequence to the right
clear: clear all steps
grid: patch a grid in here from a "midicontroller" module
interval: note length
len: randomize the length of each step's note.
len*: length for this column
length: length that the sequence below should play. the overall grid length can be changed by adjusting "gridsteps" in the triangle menu.
loop reset: when sequence loops, reset to here instead. send a "downbeat"-style message from a pulser to restart the sequence from the first step.
notemode: which set of pitches should the rows represent?
octave: octave of the bottom pitch of this sequence
pitch: randomize pitches in the sequence. hold shift to constrain the randomization to only pick roots and fifths.
rand len chance: when clicking the random length button, what is the chance that a step gets changed?
rand len range: when clicking the random length button, how much will the length change?
rand pitch chance: when clicking the random pitch button, what is the chance that a step gets changed?
rand pitch variety: how many different random pitches should we generate?
rand vel chance: when clicking the random velocity button, what is the chance that a step gets changed?
rand vel density: when clicking the random velocity button, what are the chances that a step should have a note?
random: randomize pitch, length, and velocity of all steps.
tone*: pitch for this column
vel: randomize the velocity of each step's note.
vel*: velocity for this column
x offset: x offset of attached grid controller
y offset: y offset of attached grid controller
accepts: pulses notes
notesinger
![](screenshots/notesinger.png)
oct: octave to adjust output pitch by
accepts: audio
playsequencer
![](screenshots/playsequencer.png)
grid: patch a grid in here from a "midicontroller" module
interval: the step size
link columns: if the mute/delete control should be shared across the entire column
load*: load the sequence stored in this slot
measures: the loop length
mute/delete*: if write is disabled, mute this row. if write is enabled, clear the steps as the playhead passes them
note repeat: if held notes should repeat every step
store*: store the current sequence to this slot
write: if the current input should be written to the sequence. this will also delete steps if mute/delete is enabled for this row
accepts: notes
polyrhythms
![](screenshots/polyrhythms.png)
length*: number of steps for this line
note*: pitch to use for this line
randomnote
![](screenshots/randomnote.png)
interval: the note length
offset: the amount of time to offset playback within the interval
pitch: the pitch to use
probability: the chance that a note will play each interval
skip: after a note plays, don't play a note the next n-1 times that it would have played
velocity: the velocity to use
slidersequencer
![](screenshots/slidersequencer.png)
division: rate to progress
note*: pitch for this element
playing*: is this element playing?
time*: time to trigger this element
vel*: velocity of this element
note effects
arpeggiator![](screenshots/arpeggiator.png)
interval: arpeggiation rate
octaves: how many octaves to step through
step: direction and distance to step through arpeggiation. a value of zero is "pingpong".
accepts: notes
capo
![](screenshots/capo.png)
capo: number of semitones to shift
diatonic: should we keep transposed notes in the scale?
retrigger: immediately replay current notes when changing the capo amount
accepts: notes
chorddisplayer
![](screenshots/chorddisplayer.png)
accepts: notes
chorder
![](screenshots/chorder.png)
chord: chord presets
diatonic: should the grid be chromatic, or locked to the scale only?
inversion: inversion presets
accepts: notes
chordholder
![](screenshots/chordholder.png)
pulse to play: when enabled, input notes aren't played immediately, but instead wait for an input pulse before playing
stop: stop notes from playing
accepts: pulses notes
gridnotedisplayer
![](screenshots/gridnotedisplayer.png)
accepts: notes
midicc
![](screenshots/midicc.png)
control: CC control number
value: outputs a CC value when this changes
accepts: notes
midioutput
![](screenshots/midioutput.png)
controller: where to send midi to
accepts: notes
modulationvizualizer
![](screenshots/modulationvizualizer.png)
accepts: notes
modwheel
![](screenshots/modwheel.png)
modwheel: expression level
accepts: notes
modwheeltopressure
![](screenshots/modwheeltopressure.png)
accepts: notes
modwheeltovibrato
![](screenshots/modwheeltovibrato.png)
vibinterval: rate of vibrato
vibrato: amount of pitch bend
accepts: notes
mpesmoother
![](screenshots/mpesmoother.png)
modwheel: amount to smooth incoming modwheel
pitch: amount to smooth incoming pitchbend
pressure: amount to smooth incoming pressure
accepts: notes
mpetweaker
![](screenshots/mpetweaker.png)
modwheel mult: amount to multiply incoming modwheel
modwheel offset: amount to offset incoming modwheel
pitchbend mult: amount to multiply incoming pitchbend
pitchbend offset: amount to offset incoming pitchbend
pressure mult: amount to multiply incoming pressure
pressure offset: amount to offset incoming pressure
accepts: notes
notechance
![](screenshots/notechance.png)
*: generate a new random seed
<: go to previous seed
>: go to next seed
beat length: restart the deterministic random sequence at this interval
chance: probability that a note is allowed
deterministic: allow for randomness to be repeated over an interval
seed: number that determines the random sequence
accepts: notes
notedelayer
![](screenshots/notedelayer.png)
delay: amount of time to delay, in measures
accepts: notes
notedisplayer
![](screenshots/notedisplayer.png)
accepts: notes
noteduration
![](screenshots/noteduration.png)
duration: length of the note in measures
accepts: notes
noteecho
![](screenshots/noteecho.png)
delay *: amount of time to delay this output, in measures
accepts: notes
noteexpression
![](screenshots/noteexpression.png)
expression*: expression to evaluate for this cable. example expression to route notes with pitch greater than 80 and velocity less than 60: "p > 80 && v < 60"
accepts: notes
notefilter
![](screenshots/notefilter.png)
accepts: notes
noteflusher
![](screenshots/noteflusher.png)
flush: click to flush notes
accepts: notes
notegate
![](screenshots/notegate.png)
open: if notes are allowed to pass
accepts: notes
notehocket
![](screenshots/notehocket.png)
*: generate a new random seed
<: go to previous seed
>: go to next seed
beat length: restart the deterministic random sequence at this interval
seed: number that determines the random sequence
weight *: chance that note goes to this destination
accepts: notes
notehumanizer
![](screenshots/notehumanizer.png)
time: amount of timing randomness, in milliseconds.
velocity: amount of velocity randomness
accepts: notes
notelatch
![](screenshots/notelatch.png)
accepts: notes
noteoctaver
![](screenshots/noteoctaver.png)
octave: number of octaves to raise or lower
retrigger: immediately replay current notes when changing the transpose amount
accepts: notes
notepanalternator
![](screenshots/notepanalternator.png)
one: pan position, .5 is centered
two: pan position, .5 is centered
accepts: notes
notepanner
![](screenshots/notepanner.png)
pan: pan position, .5 is centered
accepts: notes
notepanrandom
![](screenshots/notepanrandom.png)
center: center pan position
spread: amount of randomness
accepts: notes
noterangefilter
![](screenshots/noterangefilter.png)
max: maximum pitch allowed
min: minimum pitch allowed
wrap: instead of rejecting notes outside of this range, should we wrap them to the range instead?
accepts: notes
noteratchet
![](screenshots/noteratchet.png)
duration: total length of time repeats should last
skip first: don't replay input note. this allows you to more easily separate the initial note from the ratcheted notes.
subdivision: length of each repeat
accepts: notes
noterouter
![](screenshots/noterouter.png)
route: the noterouter's destination module
accepts: notes
notesorter
![](screenshots/notesorter.png)
pitch *: pitch to use for this outlet
accepts: notes
notestepper
![](screenshots/notestepper.png)
length: length of the sequence
reset: reset to the start
accepts: notes
notestream
![](screenshots/notestream.png)
reset: reset the pitch range
accepts: notes
notestrummer
![](screenshots/notestrummer.png)
strum: move the slider past each note to strum it
accepts: notes
notetable
![](screenshots/notetable.png)
clear: clear grid
grid: patch a grid in here from a "midicontroller" module
length: the number of pitches
notemode: which set of pitches should the rows represent?
octave: octave of the bottom pitch of this sequence
rand pitch chance: when clicking the random pitch button, what is the chance that a step gets changed?
rand pitch range: when clicking the random pitch button, how far will the pitch change?
random pitch: randomize pitches in the sequence. hold shift to constrain the randomization to only pick roots and fifths.
tone*: pitch for this column
x offset: x offset of attached grid controller
y offset: y offset of attached grid controller
accepts: notes
notewrap
![](screenshots/notewrap.png)
min: bottom of pitch range
range: number of semitones before wrapping back down to min pitch
accepts: notes
pitchbender
![](screenshots/pitchbender.png)
bend: bend amount, in semitones
accepts: notes
pitchdive
![](screenshots/pitchdive.png)
start: semitone offset to start from
time: time in milliseconds to ramp from pitch offset into input pitch
accepts: notes
pitchpanner
![](screenshots/pitchpanner.png)
left: pitch that represents full left pan
right: pitch that represents full right pan
accepts: notes
pitchremap
![](screenshots/pitchremap.png)
from*: pitch to change
to*: desired pitch
accepts: notes
pitchsetter
![](screenshots/pitchsetter.png)
pitch: the pitch to use
accepts: notes
portamento
![](screenshots/portamento.png)
glide: time to glide, in milliseconds
mode: always: always glide to new notes retrigger held: bend to notes if the prior note is held, and retrigger bend held: bend to notes if the prior note is held, without retriggering
accepts: notes
pressure
![](screenshots/pressure.png)
pressure: pressure amount
accepts: notes
pressuretomodwheel
![](screenshots/pressuretomodwheel.png)
accepts: notes
pressuretovibrato
![](screenshots/pressuretovibrato.png)
vibinterval: vibrato speed
vibrato: amount of vibrato
accepts: notes
previousnote
![](screenshots/previousnote.png)
accepts: notes
quantizer
![](screenshots/quantizer.png)
quantize: the quantization interval
repeat: when holding a note, should we repeat it every interval?
accepts: pulses notes
rhythmsequencer
![](screenshots/rhythmsequencer.png)
action *: action for this step. on = play note, hold = sustain note, off = no note
degree *: scale degree offset for this step
interval: rate to play notes at
len act: length of the action column
len deg: length of the scale degree offset column
len oct: length of the octave offset column
len vel: length of the velocity column
length: length of the sequence
link lengths: should there be one global length, or a length for each column?
octave *: octave offset for this step
vel *: velocity for this step
accepts: pulses notes
scaledegree
![](screenshots/scaledegree.png)
degree: amount to transpose
diatonic: should we keep transposed notes in the scale?
retrigger: immediately replay current notes when changing the transpose amount
accepts: notes
scaledetect
![](screenshots/scaledetect.png)
matches: matching scales for this root
reset: reset the input collection of notes
accepts: notes
sustainpedal
![](screenshots/sustainpedal.png)
sustain: should we hold the input notes?
accepts: notes
transposefrom
![](screenshots/transposefrom.png)
retrigger: immediately replay current notes when changing the transpose root or the scale
root: root to transpose from
accepts: notes
unstablemodwheel
![](screenshots/unstablemodwheel.png)
amount: amount of mutation
noise: fast-later mutation rate
warble: slow-layer mutation rate
accepts: notes
unstablepitch
![](screenshots/unstablepitch.png)
amount: amount of mutation
noise: fast-later mutation rate
warble: slow-layer mutation rate
accepts: notes
unstablepressure
![](screenshots/unstablepressure.png)
amount: amount of mutation
noise: fast-later mutation rate
warble: slow-layer mutation rate
accepts: notes
velocitycurve
![](screenshots/velocitycurve.png)
accepts: notes
velocityscaler
![](screenshots/velocityscaler.png)
scale: amount to multiply velocity by
accepts: notes
velocitysetter
![](screenshots/velocitysetter.png)
rand: randomness to reduce output velocity by
vel: velocity to use
accepts: notes
velocitystepsequencer
![](screenshots/velocitystepsequencer.png)
downbeat: should we reset the sequence every downbeat?
interval: speed to advance sequence
len: length of sequence
vel*: velocity for this step
accepts: notes
velocitytochance
![](screenshots/velocitytochance.png)
*: generate a new random seed
<: go to previous seed
>: go to next seed
beat length: restart the deterministic random sequence at this interval
full velocity: set velocity to full for notes that pass through
seed: number that determines the random sequence
accepts: notes
vibrato
![](screenshots/vibrato.png)
vibinterval: speed of pitch bend oscillation
vibrato: amount of pitch bend to add
accepts: notes
voicesetter
![](screenshots/voicesetter.png)
voice index: current set voice channel index
accepts: notes
volcabeatscontrol
![](screenshots/volcabeatscontrol.png)
accepts: notes
whitekeys
![](screenshots/whitekeys.png)
accepts: notes
synths
beats![](screenshots/beats.png)
bars*: how many measures long are the samples in this slot?
delete *: remove the current sample from the list
double*: enable this to play at double speed
filter*: layer filter. negative values bring in a low pass, positive values bring in a high pass.
pan*: layer panorama
selector*: which sample should we play in this slot? drag samples onto here to add them to this slot.
volume*: layer volume
drumplayer
![](screenshots/drumplayer.png)
aud: scroll to audition samples in the current pad's head category, or a directory last dropped onto a pad
edit: show pads for editing
envelope *: should we apply a volume envelope to the sample?
envelopedisplay *A: envelope attack
envelopedisplay *D: envelope decay
envelopedisplay *R: envelope release
envelopedisplay *S: envelope sustain
full vel: always play drum hits at full velocity
grab *: grab this sample
grid: patch a grid in here from a "midicontroller" module
hitcategory*: folder to choose from, when clicking the "random" button. these folders are found in the data/drums/hits/ directory
linkid *: if linkid is not -1, silence any other sample with a matching linkid (useful for linking open and closed hats)
mono: force output to mono
next *: choose the next sample from the selected hitcategory
pan *: stereo pan position of sample
prev *: choose the previous sample from the selected hitcategory
quantize: quantize input to this interval
random *: choose a random sample from the selected hitcategory
repeat: if quantizing, should held notes repeat at that interval?
shuffle: random is samples, speeds, and pans
single out *: should the sample have its own individual output?
single voice: only play a single drum hit at once, choking all others out (as if they all shared the same linkid)
speed: global sample speed multiplier
speed *: speed of sample
speed rnd: global sample speed randomization amount
start *: start offset percentage of sample
test *: play this sample
view ms *: envelope view length in milliseconds
vol: the output volume
vol *: volume of sample
widen *: stereo delay of sample to create width
accepts: notes
drumsynth
![](screenshots/drumsynth.png)
cutoffmax*: filter start cutoff frequency
cutoffmin*: filter end cutoff frequency
edit: display parameters for each hit
freqmax*: oscillator start frequency
freqmin*: oscillator end frequency
noise*: noise volume
oversampling: oversampling amount. increases sound quality, but also increases cpu usage.
q*: filter resonance
type*: oscillator type
vol: the output volume
vol*: oscillator volume
accepts: notes
fmsynth
![](screenshots/fmsynth.png)
harmratio: harmonic ratio of first-order modulator to input pitch
harmratio2: harmonic ratio of second-order modulator to input pitch
mod: amount to modulate first-order modulator
mod2: amount to modulate second-order modulator
phase0: phase offset for base oscillator
phase1: phase offset for first-order modulator
phase2: phase offset for second-order modulator
tweak: multiplier to harmonic ratio for first-order modulator
tweak2: multiplier to harmonic ratio for second-order modulator
vol: the output volume
accepts: notes
karplusstrong
![](screenshots/karplusstrong.png)
feedback: amount of feedback for resonance
filter: amount to filter resonance
invert: should the feedback invert?
lite cpu: only recalculate some parameters once per buffer, to reduce CPU load. can make pitch bends and rapid modulation sound worse in some scenarios.
pitchtone: adjust how pitch influences filter amount. a value of zero gives even filtering across the entire pitch range, higher values filter high pitches less, low values filter low pitches less.
source type: audio to use for excitation
vel2env: how much velocity should affect excitation attack time
vel2vol: how much velocity should affect voice volume
vol: output volume
x att: fade in time for excitation audio
x dec: fade out time for excitation audio
x freq: frequency of excitation audio
accepts: notes audio
metronome
![](screenshots/metronome.png)
vol: metronome volume
oscillator
![](screenshots/oscillator.png)
adsr len: view length of ADSR controls
detune: when unison is 1, detunes oscillator by this amount. when unison is 2, one oscillator is tuned normally and the other is detuned by this amount. when unison is >2, oscillators are randomly detuned within this range.
envA: volume envelope attack
envD: volume envelope decay
envR: volume envelope release
envS: volume envelope sustain
envfilterA: filter envelope attack
envfilterD: filter envelope decay
envfilterR: filter envelope release
envfilterS: filter envelope sustain
fmax: frequency cutoff of lowpass filter at the max of the envelope. set this slider to the max to disable the filter
fmin: frequency cutoff of lowpass filter at the min of the envelope
lite cpu: only recalculate some parameters once per buffer, to reduce CPU load. can make pitch bends and rapid modulation sound worse in some scenarios.
mult: multiply frequency of incoming pitch
osc: oscillator type
phase: phase offset of oscillator, and phase offset between unison voices. useful to patch into with a very fast modulator, to achieve phase modulation.
pw: pulse width (or shape for non-square waves)
q: resonance of lowpass filter
shuffle: stretches and squeezes every other cycle of the waveform
soften: soften edges of square and saw waveforms
syncf: frequency to reset the phase, when "syncmode" is set to "freq"
syncmode: turns on sync mode, to reset the phase at a specified frequency
syncratio: ratio of oscillator frequency to reset the phase, when "syncmode" is set to "ratio"
unison: how many oscillators to play for one note
vel2env: how much should the input velocity affect the speed of the volume and filter envelopes?
vel2vol: how much should the input velocity affect the output volume?
vol: this oscillator's volume
width: controls how voices are panned with unison is greater than 1
accepts: notes
samplecanvas
![](screenshots/samplecanvas.png)
canvas: canvas of samples. drag and drop samples onto here. canvas controls: -hold shift and drag a sample to duplicate -hold alt to drag a sample without snapping -hold ctrl while dragging to snap to an interval -hold shift and scroll to zoom -hold alt and grab empty space to move slide the canvas view -hold ctrl and grab empty space to zoom the canvas view
clear: delete all elements
delete: delete highlighted elements
drag mode: direction that elements can be dragged
interval: grid subdivision interval
measures: length of canvas in measures
scrollh: horizontal scrollbar
scrollv: vertical scrollbar
timeline: control loop points
view rows: number of visible rows
sampleplayer
![](screenshots/sampleplayer.png)
16: auto-slice 16 slices
32: auto-slice 32 slices
4: auto-slice 4 slices
8: auto-slice 8 slices
append to rec: when recording, append to the previous recording, rather than clearing the sample first
attack: speed at which gate blends open
click sets cue: when true, clicking on the waveform will set the start position of the current cue
cue len: length in seconds of the current cue. a value of zero will play to the end of the sample.
cue speed: playback speed of the current cue
cue start: start point in seconds of the current cue
cue stop: stop playing this cue if a note-off is received
cuepoint: sets the current cue to edit
grabhovered: grab a sample of this cue to drop onto another module
load: show a file chooser to load a sample
loop: wrap playhead to beginning when it reaches end
pause: pause playing and leave playhead where it is
play: start playing from the current playhead
play cue: play the current cue
playhovered: play this cue
record: record audio input into our sample buffer. clears the current sample.
record as clips: when recording, only record when there is enough input to open the gate, and mark up each recorded segment with cue points
release: speed at which gate blends closed
save: save this sample to a file
searchresult*: click to download this youtube search result. downloading long videos may take a while.
select played: when true, any cue point played via incoming notes will become the current cue
show grid: show a quarter note grid (when zoomed in far enough)
speed: current playback speed
stop: stop playing and reset playhead
threshold: volume threshold to open up the gate for recording
trim: discard all audio outside the current zoom range
volume: output gain
youtube: download the audio of the youtube URL currently on your clipboard
yt:: search youtube for this string
accepts: pulses notes audio
sampler
![](screenshots/sampler.png)
env: volume envelope
envA: volume envelope attack
envD: volume envelope decay
envR: volume envelope release
envS: volume envelope sustain
passthrough: should input audio pass through as we're recording?
pitch: should we attempt pitch-correct the audio?
rec: enable to clear the current recording, and record new audio once the input threshold is reached
thresh: when recording is enabled, exceed this threshold with input audio to begin recording
vol: output volume
accepts: notes audio
seaofgrain
![](screenshots/seaofgrain.png)
display length: amount of sample to view
gain *: volume of this voice
keyboard base pitch: midi pitch that represents the start of the sample
keyboard num pitches: amount of pitches to assign across the sample
len ms *: length of each grain in milliseconds
load: load a sample file
octaves *: should we add octaves and fifths?
offset: where to start view of the sample
overlap *: number of overlapping grains
pan *: stereo panorama of grain placement
pos *: position of this voice within the sample
pos r *: randomization of grain start point
record: record input as the granular buffer, to use seaofgrain a live granular delay
spacing r*: randomization of time between grains
speed *: speed of grain playback
speed r *: randomization of grain speed
volume: output volume
width *: stereo width of grain placement
accepts: notes audio
signalgenerator
![](screenshots/signalgenerator.png)
detune: amount to detune from specified frequency
freq: signal frequency
freq mode: what mode should we use for input notes? "instant" changes to the input note's frequency instantly, "ramp" ramps to the frequency over time, and "slider" allows you to use a slider to interpolate between the last two input notes
mult: multiplier for frequency
osc: oscillator type
phase: phase offset
pw: pulse width (or shape for non-square waves)
ramp: amount of time to ramp to input frequency
shuffle: stretches and squeezes every other cycle of the waveform
slider: slider to interpolate between last two input pitches
soften: soften edges of square and saw waveforms
syncf: frequency to reset the phase, when "syncmode" is set to "freq"
syncmode: turns on sync mode, to reset the phase at a specified frequency
syncratio: ratio of oscillator frequency to reset the phase, when "syncmode" is set to "ratio"
vol: output volume
accepts: pulses notes
audio effects
audiometer![](screenshots/audiometer.png)
level: the input audio level. hook this up to an LED-display midi control to see the value displayed on your controller.
accepts: audio
audiorouter
![](screenshots/audiorouter.png)
route: audio destination
accepts: audio
audiosplitter
![](screenshots/audiosplitter.png)
accepts: audio
buffershuffler
![](screenshots/buffershuffler.png)
fourtet: use a textural trick I saw four tet illustrate in a video once: slice the audio into chunks, and for each chunk it at double speed followed by playing it in reverse at double speed. this slider adjusts the mix between the original audio and this "fourtetified" audio.
fourtetslices: chunk size to use for "fourtet" effect
freeze input: retain the current buffer, without writing in new input
grid: patch a grid in here from a "midicontroller" module
interval: slice size
num bars: number of bars to capture
playback style: how to play clicked slices. or, with input notes, velocity range determines playback style.
accepts: notes audio
dcoffset
![](screenshots/dcoffset.png)
offset: amount of offset to add
accepts: audio
effectchain
![](screenshots/effectchain.png)
<: move this effect to earlier in the chain
>: move this effect to later in the chain
effect: select which effect to add
exit effect: on push2, back effect control out to the main effectchain controls
mix*: wet/dry slider for this effect
spawn: spawn the currently highlighted effect
volume: output gain
x: delete this effect
accepts: audio
eq
![](screenshots/eq.png)
enabled*: enable this band?
f*: frequency cutoff for this band
g*: gain for this band
q*: resonance for this band
type*: what type of filter should this band use
accepts: audio
feedback
![](screenshots/feedback.png)
limit: clip the feedback audio to this range, to avoid issues with feedback blowing out too intensely.
accepts: audio
fftvocoder
![](screenshots/fftvocoder.png)
carrier: carrier signal gain
cut: how many bass partials to remove
dry/wet: how much original input vs vocoded signal to output
fric thresh: fricative detection sensitivity, to switch between using the carrier signal and white noise for vocoding
input: input signal gain
phase off: how much we should offset the phase of the carrier signal's partials
volume: output gain
whisper: how much the carrier signal partial's phases should be randomized, which affects how whispery the output sound is
accepts: audio
freqdelay
![](screenshots/freqdelay.png)
dry/wet: how much of the effect to apply
accepts: notes audio
gain
![](screenshots/gain.png)
gain: amount to adjust signal. a value of 1 will cause no change to the signal.
accepts: audio
input
![](screenshots/input.png)
ch: which channel (or channels, if you want stereo) to use
accepts: audio
inverter
![](screenshots/inverter.png)
accepts: audio
lissajous
![](screenshots/lissajous.png)
scale: visual scale of lissajous image
accepts: audio
looper
![](screenshots/looper.png)
m : take the contents of this looper and merge it into another. click this button on the merge source, then on the merge target.
.5x: make loop play at half speed
2x: make loop play at double speed
apply: shift the contents of the looper so the current offset is the start of the buffer
auto: should pitch shift auto-adjust as the transport tempo adjusts?
b: bake current volume into waveform
capture: when the next loop begins, record input for the duration of the loop
clear: clear the loop audio
commit: commit the current looperrecorder buffer to this loop
copy: take the contents of this looper and copy it onto another. click this button on the copy source, then on the copy target.
decay: amount to lower volume each loop
extend: make loop twice as long
fourtet: use a textural trick I saw four tet illustrate in a video once: slice the audio into chunks, and for each chunk it at double speed followed by playing it in reverse at double speed. this slider adjusts the mix between the original audio and this "fourtetified" audio.
fourtetslices: chunk size to use for "fourtet" effect
mute: silence this looper
num bars: loop length in measures
offset: amount to offset looper's playhead from transport position
passthrough: should we pass incoming audio through to the output? turn off to mute incoming audio.
pitch: amount to pitch shift looper output
resample for tempo: this button appears when the current global tempo no longer matches the tempo that the buffer was recorded at. click this to resample the buffer to match the new tempo.
save: save this loop to a wav file
scr: allow loop to be scratched by adjusting "scrspd"
scrspd: playback speed, used with "scr" is enabled. modulate quickly for a vinyl-like scratching effect.
swap: swap the contents of this looper and with another. click this button on two loopers to swap them.
undo: undo last loop commit
volume: output volume
write: write input audio to loop buffer
accepts: notes audio
looperrecorder
![](screenshots/looperrecorder.png)
.5tempo: halve global transport tempo, while keeping connected loopers sounding the same
1: capture the last measure to the currently-targeted looper
2: capture the last 2 measures to the currently-targeted looper
2xtempo: double global transport tempo, while keeping connected loopers sounding the same
4: capture the last 4 measures to the currently-targeted looper
8: capture the last 8 measures to the currently-targeted looper
auto-advance: automatically advance to the next looper when committing
cancel free rec: if "free rec" is enabled, cancel recording without setting the loop length
clear: clear the recorded buffer
free rec: enable to start recording a loop with no predetermined length. disable to end recording, adjust global transport to match the loop length, and switch the recorder's mode to "loop"
length: length in measures to use when connected loopers use the "commit" button
mode: recorder mode: use "record" to record input and allow it to be committed to buffers when you're ready to loop, use "overdub" to record input and play the loop at our specified length, and use "loop" to play the current loop without adding input
orig speed: reset looper to tempo that loops were recorded at
resample: resample all connected loopers to new tempo
resample & set key: snap tempo to nearest value that matches a key (based upon the current key and the tempo change), resample all connected loopers to that new tempo, and change global scale to the new key
snap to pitch: snap tempo to nearest value that matches a key
target: looper to commit audio to when using the on-buffer capture buttons to the left
write*: writes to this looper, with a loop length matching the nearest power of 2 (1, 2, 4, 8, etc) of how long this checkbox was enabled
accepts: audio
looperrewriter
![](screenshots/looperrewriter.png)
go: rewrite the connected looper, and if that looper is connected to a send, set that send to output only to the right outlet
new loop: start recording a dynamic loop length. press "go" when you want to rewrite it to the looper. this will also change bespoke's global tempo to match this new loop, so it's quite powerful and scary! click it again to cancel.
accepts: audio
multitapdelay
![](screenshots/multitapdelay.png)
delay *: tap delay time, in milliseconds
display length: length of buffer display, in seconds
dry: how much dry signal to allow through
feedback *: how much delayed audio from this tap should feed back in to the input
gain *: tap delay amount
pan *: stereo pan for this tap
accepts: notes audio
output
![](screenshots/output.png)
ch: channel (or channels, if you want stereo) to send audio to
accepts: audio
panner
![](screenshots/panner.png)
pan: amount to send signal to the left and right channels. a value of 0 is centered.
widen: delay a channel by this many samples. results in a pan-like effect where the sound seems to come from from a direction.
accepts: audio
ringmodulator
![](screenshots/ringmodulator.png)
dry/wet: how much of the original audio to use vs modulated audio
freq: frequency to use. can also be set by patching a note input into this module.
glide: how long an input note should take to glide to the desired frequency
volume: volume output
accepts: notes audio
samplergrid
![](screenshots/samplergrid.png)
clear: when enabled, clears any pressed grid squares
duplicate: what enabled, duplicates last pressed sample onto any pressed grid squares
edit: enable controls to adjust recorded sample for last pressed grid square
end: sample end
grid: patch a grid in here from a "midicontroller" module
passthrough: should the incoming audio pass through to the output?
start: sample start
vol: the output volume
accepts: notes audio
send
![](screenshots/send.png)
amount: amount to send out the right-side cable
crossfade: when true, output of the left-side cable is reduced as "amount" increases
accepts: audio
signalclamp
![](screenshots/signalclamp.png)
max: maximum output value
min: minimum output value
accepts: audio
spectrum
![](screenshots/spectrum.png)
accepts: audio
splitter
![](screenshots/splitter.png)
accepts: audio
stutter
![](screenshots/stutter.png)
16th: 16th note stutter
32nd: 32nd note stutter
64th: 64th note stutter
8th: 8th note stutter
dotted eighth: stutter on a dotted eighth interval
double speed: stutter at double speed, high pitched
free: stutter with the settings specified by the following sliders
free length: length in seconds for "free" stutter mode
free speed: rate for "free" stutter mode
grid: patch a grid in here from a "midicontroller" module
half note: half note stutter
half speed: stutter at half speed, low pitched
quarter: quarter note stutter
ramp in: stutter with speed climbing up from zero to one
ramp out: stutter with speed quickly falling to zero
reverse: reversed half note stutter
triplets: stutter on a triplet interval
tumble down: decelerating stutter
tumble up: accelerating stutter
accepts: notes audio
vocoder
![](screenshots/vocoder.png)
bands: how many frequency bands to use
carrier: carrier signal gain
f base: frequency for lowest band
f range: frequency range to highest band
input: input signal gain
max band: volume limit for each frequency band
mix: how much original input vs vocoded signal to output
q: resonance of the bands
ring: how long it should take the bands to "cool down"
spacing: how frequency bands should be spaced
volume: output gain
accepts: audio
vocodercarrier
![](screenshots/vocodercarrier.png)
accepts: audio
waveformviewer
![](screenshots/waveformviewer.png)
draw gain: adjust waveform display scale
freq: frequency to sync display to. gets automatically set if you patch a note input into this module
length: number of samples to capture
accepts: notes audio
waveshaper
![](screenshots/waveshaper.png)
a: variable to use in expressions
b: variable to use in expressions
c: variable to use in expressions
d: variable to use in expressions
e: variable to use in expressions
rescale: rescales input before feeding it into expression
y=: waveshaping expression. try something like "x+sin(x*pi*a)". available variables: a,b,c,d,e = the sliders below. t = time. x1,x2,y1,y2 = biquad state storage.
accepts: audio
modulators
accum![](screenshots/accum.png)
value: output value
velocity: amount to accumulate
add
![](screenshots/add.png)
value 1: value to sum
value 2: value to sum
addcentered
![](screenshots/addcentered.png)
range 2: modulation amount
value 1: center value
value 2: modulation value
audiotocv
![](screenshots/audiotocv.png)
gain: multiply incoming audio
max: maximum output value
min: minimum output value
accepts: audio
controlrecorder
![](screenshots/controlrecorder.png)
clear: clear the recording
length: the interval to quantize to
quantize: should we quantize playback to a specified rhythmic interval?
record: should we be recording input? playback starts after the recording is complete
speed: speed up or slow down playback
controlsequencer
![](screenshots/controlsequencer.png)
interval: rate to advance
length: length of the sequence
random: randomize sequence values
record: record targeted value to steps
step *: value for this step
accepts: pulses notes
curve
![](screenshots/curve.png)
input: input value (intended as a modulation target)
curvelooper
![](screenshots/curvelooper.png)
length: length of the loop
randomize: create a random curve
dataprovider
![](screenshots/dataprovider.png)
interval: the interval to measure
realtime: if enabled this module will work on the audio thread which is more accurate but also more resource intense
set: click here to send the value (or, send a pulse to this module for the same result)
type: the type of value to provide
accepts: pulses
envelope
![](screenshots/envelope.png)
adsr: envelope view
adsrA: envelope attack
adsrD: envelope decay
adsrR: envelope release
adsrS: envelope sustain
advanced: switch to advanced envelope editor (allows for a more complicated envelope than just an ADSR). double-click on an advanced envelope line to add stages, right click on points to remove them, drag on lines to bend them.
has sustain: should this envelope have a sustain stage?
high: output high value
length: length of envelope display
low: output low value
max sustain: what's the maximum length of the sustain, in milliseconds? a value of -1 indicates no maximum
sustain stage: which step of the envelope should have the sustain?
use velocity: should envelope output be scaled by input velocity?
accepts: pulses notes
expression
![](screenshots/expression.png)
a: variable to use in expressions
b: variable to use in expressions
c: variable to use in expressions
d: variable to use in expressions
e: variable to use in expressions
input: input to use as x variable
y=: expression to modify input. try something like "x+sin(x*pi*a)". available variables: a,b,c,d,e = the sliders below. t = time.
fubble
![](screenshots/fubble.png)
clear: clear the drawing
length: the interval to quantize to
mutate amount: amount to affect drawing by perlin noise field
mutate noise: rate to move through perlin noise field
mutate warp: scale of perlin noise field
quantize: should we quantize playback to a specified rhythmic interval?
reseed: jump to a different location in the perlin noise field
speed: speed up or slow down playback
gravity
![](screenshots/gravity.png)
drag: the resistance force to apply opposite the velocity
gravity: the gravitational force to apply downwards
kick: click to apply kick force (or, pulse this module for the same result)
kick amt: the amount of upward force to apply when kicking
accepts: pulses
gridsliders
![](screenshots/gridsliders.png)
direction: should the grid display the sliders vertically, or horizontally?
grid: patch a grid in here from a "midicontroller" module
leveltocv
![](screenshots/leveltocv.png)
attack: rise to the input level at this rate
gain: multiply the input audio by this value
max: output when level is one
min: output when level is zero
release: decay from the input level at this rate
accepts: audio
lfo
![](screenshots/lfo.png)
bias: bias the waveform towards the low or high point
enable: turn on/off modulation
free rate: rate of oscillator running in non-clock-synced time
high: output value at waveform's high point
interval: length of oscillation period
length: proportion of time that should be spent on the waveform cycle
lite cpu: only recalculate some parameters once per buffer, to reduce CPU load. can sound worse in some scenarios, especially with rapid modulation.
low: output value at waveform's low point
offset: phase offset, to make oscillation earlier/later
osc: type of oscillation waveform
pin: make LFO window remain visible
shuffle: adjust the waveoform to have a fast and slow cycle
soften: smooth out the hard edges of square and saw waveforms
spread: spread the waveform out to be closer to the low and high points
macroslider
![](screenshots/macroslider.png)
end*: the output value at the top of the input's range
input: the input value. intended to be a modulation patch target.
start*: the output value at the bottom of the input's range
modwheeltocv
![](screenshots/modwheeltocv.png)
max: output for modwheel value 127
min: output for modwheel value 0
accepts: notes
mult
![](screenshots/mult.png)
notetofreq
![](screenshots/notetofreq.png)
accepts: notes
notetoms
![](screenshots/notetoms.png)
accepts: notes
pitchtocv
![](screenshots/pitchtocv.png)
max: output for pitch 127
min: output for pitch 0
accepts: notes
pitchtospeed
![](screenshots/pitchtospeed.png)
ref freq: the output is the input frequency divided by this number
accepts: notes
pitchtovalue
![](screenshots/pitchtovalue.png)
accepts: notes
pressuretocv
![](screenshots/pressuretocv.png)
max: output for pressure 127
min: output for pressure 0
accepts: notes
ramper
![](screenshots/ramper.png)
length: length of time to blend over
start: begin blending (or, send a pulse to this module for the same result)
target: the value to arrive at when the ramp is over
accepts: pulses
smoother
![](screenshots/smoother.png)
input: set a value to smooth, patch a modulator into here
smooth: amount of smoothing to apply
subtract
![](screenshots/subtract.png)
valuesetter
![](screenshots/valuesetter.png)
set: click here to send the value (or, send a pulse to this module for the same result)
slider: value to set
value: value to set
accepts: pulses
velocitytocv
![](screenshots/velocitytocv.png)
0 at note off: output zero when note is released
max: output for velocity 127
min: output for velocity 0
accepts: notes
vinylcontrol
![](screenshots/vinylcontrol.png)
control: enable/disable transport control. when you enable it, it will use the current speed as the reference speed (so, the output will output a value of 1 until you change the vinyl's speed)
accepts: audio
pulse
audiotopulse![](screenshots/audiotopulse.png)
release: the cooldown time for the audio signal before a pulse can be triggered again
threshold: send a pulse when the signal hits this threshold
accepts: audio
boundstopulse
![](screenshots/boundstopulse.png)
input: the slider to check bounds on
notetopulse
![](screenshots/notetopulse.png)
accepts: notes
pulsebutton
![](screenshots/pulsebutton.png)
pulse: trigger a pulse
pulsechance
![](screenshots/pulsechance.png)
*: generate a new random seed
<: go to previous seed
>: go to next seed
chance: chance that pulses are allowed through
deterministic: allow for randomness to be repeated over an interval
seed: number that determines the random sequence. send reset pulses to restart the deterministic random sequence.
accepts: pulses
pulsedelayer
![](screenshots/pulsedelayer.png)
delay: time to delay, in fractions of a measure
accepts: pulses
pulsedisplayer
![](screenshots/pulsedisplayer.png)
accepts: pulses
pulseflag
![](screenshots/pulseflag.png)
flag: property to add
replace: if disabled, the above flag is appended to the pulse's flags. if enabled, the pulse's flags are replaced by the above flag.
accepts: pulses
pulsegate
![](screenshots/pulsegate.png)
allow: can pulses pass through?
accepts: pulses
pulsehocket
![](screenshots/pulsehocket.png)
*: generate a new random seed
<: go to previous seed
>: go to next seed
seed: number that determines the random sequence. send reset pulses to restart the deterministic random sequence.
weight *: chance that pulse goes to this destination
accepts: pulses
pulselimit
![](screenshots/pulselimit.png)
limit: limit number of pulses to pass through
reset: reset the counter of seen pulses
accepts: pulses
pulser
![](screenshots/pulser.png)
div: measure division, when using "div" as the interval
interval: rate to send pulses
offset: pulse time offset, in fractions of the interval
random: tell pulsed modules to randomize their position
reset: length of sequence before sending reset pulse
restart: restart timer on "free" counter
t: pulse interval in milliseconds
timemode: when to send downbeat pulses, or set to "free" for pulses not locked to the transport
pulserouter
![](screenshots/pulserouter.png)
route: the pulserouter's destination module
accepts: pulses
pulsesequence
![](screenshots/pulsesequence.png)
- : advance the sequence backwards
+: advance the sequence forward
<: shift sequence to the left
>: shift sequence to the right
interval: length of each step within the sequence
length: length of the sequence
pulse: when enabled will send out pulses as per sequence when advancing with the buttons
accepts: pulses
pulsetrain
![](screenshots/pulsetrain.png)
interval: length of each step within the sequence
length: length of the sequence
accepts: pulses
effect chain
basiceq![](screenshots/basiceq.png)
even: reset EQ
accepts: audio
biquad
![](screenshots/biquad.png)
F: frequency cutoff
G: gain
Q: resonance
type: filter type
accepts: audio
bitcrush
![](screenshots/bitcrush.png)
crush: sample resolution reduction
downsamp: sample rate reduction
accepts: audio
butterworth
![](screenshots/butterworth.png)
F: frequency cutoff
Q: resonance
accepts: audio
compressor
![](screenshots/compressor.png)
attack: speed to apply gain reduction
drive: rescale input to affect how much compression affects it
lookahead: how much time to "look ahead" to adjust the compression envelope. this necessarily introduces a delay into your output, which could be compensated for by running sequencers slightly early.
mix: amount of compression. lower this value for a "parallel compression" effect. you should use this mix slider instead of the effectchain's mix slider, to compensate for lookahead.
output: makeup gain, to increase volume
ratio: how much gain reduction to apply when the single passes the threshold
release: speed to remove gain reduction
threshold: threshold where gain should start to be reduced
accepts: audio
dcremover
![](screenshots/dcremover.png)
accepts: audio
delay
![](screenshots/delay.png)
amount: amount of delay that returns
delay: delay in milliseconds
dry: should the dry signal pass through, or just the delayed signal?
feedback: should the output audio feed back into the delay?
input: should we accept input into the delay?
interval: sets delay length to a musical duration
invert: should the delayed audio have its signal inverted? this can give a different sound, and also cancel out DC offset to prevent it from accumulating with feedback.
short: shortcut to shrink the range of the delay slider, to allow for audible-rate delays and comb filter sounds
accepts: audio
distortion
![](screenshots/distortion.png)
center input: remove dc offset from input signal to distort in a more controlled way
clip: cutoff point of distortion, lower values result in more extreme distortion
fuzz: push input signal off-center to distort asymmetrically
preamp: signal gain before feeding into distortion
type: style of distortion to apply
accepts: audio
freeverb
![](screenshots/freeverb.png)
damp: high frequency attenuation; a value of zero means all frequencies decay at the same rate, while higher settings will result in a faster decay of the high frequency range
dry: amount of untouched signal
room size: controls the length of the reverb, a higher value means longer reverb
wet: amount of reverb signal
width: stereo width of reverb
accepts: audio
gainstage
![](screenshots/gainstage.png)
gain: volume multiplier
accepts: audio
gate
![](screenshots/gate.png)
attack: speed at which gate blends open
release: speed at which gate blends closed
threshold: volume threshold to open up the gate
accepts: audio
granulator
![](screenshots/granulator.png)
autocapture: freeze input at this interval
dry: amount of dry signal to allow through
frz: freeze the current recorded buffer
g oct: should we add octaves and fifths?
len ms: length of each grain in milliseconds
overlap: number of overlapping grains
pos: playback position within the buffer
pos r: randomization of grain start point
spa r: randomization of time between grains
spd r: randomization of grain speed
speed: speed of grain playback
width: stereo width of grain placement
accepts: audio
muter
![](screenshots/muter.png)
ms: ramp time to mute/unmute signal
pass: when true, the signal is allowed through
accepts: audio
noisify
![](screenshots/noisify.png)
amount: amount of noise to apply
width: how frequently a new noise sample should be chosen
accepts: audio
pitchshift
![](screenshots/pitchshift.png)
ratio: amount to pitchshift by (a value of 1 indicates no shift)
ratioselector: shortcuts to useful pitch ratios
accepts: audio
pumper
![](screenshots/pumper.png)
amount: amount to lower volume
attack: how sharply the volume drops
curve: how the volume returns
interval: the rate to pump
length: length of pump
accepts: audio
tremolo
![](screenshots/tremolo.png)
amount: amount to lower volume
duty: pulse width of LFO
interval: speed of LFO
offset: offsets LFO phase
osc: LFO oscillator type
accepts: audio
other
abletonlink![](screenshots/abletonlink.png)
offset ms: offset in milliseconds to tweak synchronization
reset next downbeat: resets measure count on the next downbeat, to help synchronize to desired phase in session
clockin
![](screenshots/clockin.png)
device: device to receive from
rounding: precision to round incoming tempo data
smoothing: how much to smooth incoming tempo
start offset ms: offset in milliseconds to tweak synchronization between bespoke and gear
clockout
![](screenshots/clockout.png)
device: device to target
multiplier: tempo multiplier for how the gear should respond to the signals
send start: send a signal to reset the gear to the start of its sequence
comment
![](screenshots/comment.png)
comment: type text here
eventcanvas
![](screenshots/eventcanvas.png)
canvas: canvas of events. canvas controls: -shift-click to add an event -hold shift and drag an event to duplicate -hold alt to drag an event without snapping -hold ctrl while dragging to snap to an interval -hold shift and scroll to zoom -hold alt and grab empty space to move slide the canvas view -hold ctrl and grab empty space to zoom the canvas view
clear: delete all elements
delete: delete highlighted elements
drag mode: direction that elements can be dragged
interval: grid for snapping events to
measures: length of loop
quantize: quantizes events to grid
record: record connected values as they change
scrollh: horizontal scrollbar
timeline: control loop points
view rows: number of visible rows
globalcontrols
![](screenshots/globalcontrols.png)
background b: amount of blue in background color
background g: amount of green in background color
background r: amount of red in background color
cable alpha: opacity of the cables
corner radius: how round bespoke's rectangles are
lissajous b: amount of blue in background lissajous curve
lissajous g: amount of green in background lissajous curve
lissajous r: amount of red in background lissajous curve
scroll x: emulate horizontal mouse scrolling
scroll y: emulate vertical mouse scrolling
x pos: horizontal panning position
y pos: vertical panning position
zoom: zoom level
grid
![](screenshots/grid.png)
grid: patch a grid in here, from a "midicontroller" module
momentary: should clicks be treated as momentary inputs?
accepts: notes
groupcontrol
![](screenshots/groupcontrol.png)
group enabled: controls the connected checkboxes
label
![](screenshots/label.png)
color: The color of the label
font: The font of the label
label: The label that will be displayed
showcontrols: Hide and show the controls to modify the label
size: The font size of the label
loopergranulator
![](screenshots/loopergranulator.png)
freeze: stop advancing looper time
len ms: length of each grain in milliseconds
loop pos: playback position within loop
octaves: should we add octaves and fifths?
on: use granular synthesis for looper playback
overlap: number of overlapping grains
pos rand: randomization of grain start point
spacing rand: randomization of time between grains
speed: speed of grain playback
speed rand: randomization of grain speed
width: stereo width of grain placement
multitrackrecorder
![](screenshots/multitrackrecorder.png)
add track: add an additional track
bounce: write the tracks to your recordings directory
clear: clear the audio in the tracks
record: record input to the tracks
notetoggle
![](screenshots/notetoggle.png)
accepts: notes
oscoutput
![](screenshots/oscoutput.png)
label*: label to send slider value. the message will be sent in the format /bespoke/[label] [value]
note out address: label to send input notes. the message will be sent in the format /bespoke/[label] [pitch] [velocity]
osc out address: destination to send OSC messages to
osc out port: port to send OSC messages to
slider*: sends a value to the address. try patching a modulator into this, such as a leveltocv module to send audio levels.
accepts: notes
prefab
![](screenshots/prefab.png)
disband: free all modules from this prefab
load: load a .pfb
save: save as a .pfb file
push2control
![](screenshots/push2control.png)
radiosequencer
![](screenshots/radiosequencer.png)
grid: patch a grid in here from a "midicontroller" module
interval: rate to advance
length: length of sequence
accepts: pulses notes
samplebrowser
![](screenshots/samplebrowser.png)
< : previous page
> : next page
savestateloader
![](screenshots/savestateloader.png)
load *: loads specified savestate file. shift-click to choose a new file.
scale
![](screenshots/scale.png)
PPO: pitches per octave
intonation: which method to use to tune the scale
load KBM: load KBM file to determine keyboard mapping
load SCL: load SCL file to determine scale
note: the pitch that maps to the frequency defined in "tuning"
root: root note of the scale
scale: which set of notes to use
tuning: what frequency does the pitch defined in "note" represent?
script
![](screenshots/script.png)
?: show scripting reference
a: variable for the script to use, can be modulation by other sources. access via me.get("a")
b: variable for the script to use, can be modulation by other sources. access via me.get("b")
c: variable for the script to use, can be modulation by other sources. access via me.get("c")
code: write code here. press ctrl-R to execute the code, or ctrl-shift-R to just execute the current block.
d: variable for the script to use, can be modulation by other sources. access via me.get("d")
load: load selected script
loadscript: choose a script from here, then press "load"
run: click here to execute the code, or press ctrl-R
save as: save the current script
stop: cancel any events scheduled by this script
style: choose a text theme, from script_styles.json
accepts: pulses notes
scriptstatus
![](screenshots/scriptstatus.png)
reset all: resets scope variables
selector
![](screenshots/selector.png)
selector: which value should be set to 1
accepts: notes
snapshots
![](screenshots/snapshots.png)
add: snapshot the currently connected controls to the next available snapshot slot
blend: length of time in milliseconds over which to blend snapshot values
delete: when clicking/selecting a snapshot, delete that slot (alternately: hold the alt/option key)
random: randomize connected controls
snapshot: jump to a snapshot
snapshot label: assign a label to this snapshot
store: when clicking/selecting a snapshot, store into that slot (alternately: hold the shift key)
accepts: notes
songbuilder
![](screenshots/songbuilder.png)
activate first scene on stop: when stopping, activate the first scene. it is recommended that you use the first scene as an "off" scene, and have it disable all song elements.
add target: add a targeted control for scenes to affect
bars*: length in bars that this scene should play for
change quantize: when a change should happen after pressing the play button on a scene. "switch" changes immediately, and "jump" changes immediately and also resets the global transport.
checkbox*: value to use for target in this scene
color*: color to theme this target
context*: options for this scene
contextmenu*: options for this step
dropdown*: value to use for target in this scene
go*: play this scene
loop: enable a loop within the sequence
loop end: loop step index that the loop ends
loop start: loop step index to start the loop on
move left: move this target left in the scene
move right: move this target right in the scene
name*: name of this scene
pause: hold the sequence on the current scene
play: play the sequence
play from*: play sequence from this step
scene*: name of scene for this step
stop: stop the sequence
type: change the control display type for this target
use sequencer: show scene sequencer
value*: value to use for target in this scene
accepts: pulses notes
timelinecontrol
![](screenshots/timelinecontrol.png)
dock: should we dock this module to the UI layer?
length: length of timeline display, in measures
loop: should we have a looping section?
loop end: measure end of loop
loop start: measure start of loop
measure: current position. click to jump around.
reset: reset to beginning
timerdisplay
![](screenshots/timerdisplay.png)
reset: reset timer to zero
transport
![](screenshots/transport.png)
+ : increase tempo by one
- : decrease tempo by one
< : nudge current time backward
> : nudge current time forward
play/pause: stop all audio processing (shift-p)
reset: reset timeline to zero
swing: where the halfway point of musical time within the swing interval should fall. a value of .5 represents no swing.
swing interval: interval over which to apply swing
tempo: global tempo, in beats per minute
timesigbottom: time signature bottom value
timesigtop: time signature top value
valuestream
![](screenshots/valuestream.png)
speed: how quickly display should scroll