Bespoke is a software modular synthesizer. It contains a bunch of modules, which you can connect together to create sounds.
Bespoke is like a DAW* in some ways, but with less of a focus on a global timeline. Instead, it has a design more optimized for jamming and exploration.
Bespoke is a project I started in 2011 as a way for me to learn more about creating music. Instead of putting in the time to learn the intricacies of an existing DAW, I took on a foolhardy exercise to try to build my own. The software is custom built by me and for me, hence the name „Bespoke“.
Bespoke’s core design is to break everything into separate modules that can be patched together in a custom layout, much like a hardware modular. Bespoke is designed to be highly customizable, with the idea that any of the custom layouts that you create will be „bespoke“ to you as well.
In a way, Bespoke is like if I smashed Ableton to bits with a baseball bat, and asked you to put it back together.
Features:
live-patchable environment, so you can build while the music is playing
VST, VST3, LV2 hosting
Python livecoding
MIDI & OSC controller mapping
Works on Windows, Mac, and Linux
Quick Reference:
bespoke 1.3.0
hello everyone! yesterday was the december solstice, so let’s start our new solar year with a new version of bespoke: 1.3.0!
big thanks to everyone in the bespoke community for pull requests and issue reports, and an extra special big thanks to @NoxyNixie for joining as a project maintainer, to solve the problem of me falling behind on merging everyone’s excellent PRs. there’s a bunch of new stuff in this release, and if you’ve been keeping up with bespoke’s nightly builds, you’re already familiar with all of these new features. but if you haven’t here’s some of the highlights!
new modules: dotsequencer, rhythmsequencer, euclideansequencer, controlrecorder, pulserouter, audiosplitter, pitchtovalue, voicesetter, savestateloader, dataprovider, pulselimit, label
added the ability to save module presets (look in the triangle menu!), and spawn those presets directly from the quickspawn menu
more flexible pulse functionality: pulse cables can now be directly wired into buttons, checkboxes, dropdown lists, and radio buttons
added a new „list“ view mode to the snapshots module to make it more convenient, and made snapshots able to store the state of grids and canvases
added 14-bit MIDI CC support
added new „ratio“ sync mode to oscillator and signalgenerator
improved workflow for editing velocity on sequencers, by hovering and using the up and down arrow keyboard keys
made „bypass“ functionality consistent across all audio modules
added the ability to use your computer keyboard as a midicontroller source
lots of bug fixes
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
[1.3.0] – 2024-12-22Added
Added a callback for sysex messages in scripts
Added level meters to gain and audiometer modules
Added settings for minimap margin and corner
Added a new dropdown mode for setting step velocity in the drumsequencer module
Added a new „list“ mode to the snapshots module, and make that the default mode
Added the ability to set a separate samples path
Added Akai LPD8 midi mapping
Added the audiosplitter module
Added an option to turn off auto correlation on the background Lissajous
Added the pulselimit module
Added the ability to pin modules with F3 so they stay in view
Added a „home“ button to move the viewport home in case you get lost
Added various controller layouts
Added the dataprovider module
Added support for command line options
Added the savestateloader module, for loading into another savestate file
Added controller layouts for the M-Audio Oxygen Pro 49
Added environment variable for setting bespoke data dir
Added support for template projects (.bskt)
Added 14-bit midi CC support, and added integration for custom „bespoke turn“ controller
Added the euclideansequencer module
Added a new loop capture method to looperrecorder, so you can start recording/stop recording and it rounds to the nearest number of bars
Added voiceId to the notedisplayer
Added „pan“ to modulationvisualizer and made the module resizable
Added get_name python method to get the name of modules
Added automatic octave rescaling to the keyboarddisplay module
Added hover based keyboard capture to the keyboarddisplay module
Added octave labels to the keyboarddisplay module
Added the ability to jump octaves via keyboard keybinds to the keyboarddisplay module
Added an option in the settings to hide labels to the keyboarddisplay module
Added another option that enforces a fixed number of octaves regardless of the keyboard size to the keyboarddisplay module
Added the controlrecorder module
Added major thirds layout to the launchpadkeyboard module
Added mouse click based velocity support to the keyboarddisplay module
Added the ability for the user to configure their target refresh rate
Added the pulserouter module
Added the voicesetter module
Added controller layout for music thing modular m0 controller
Added the label module
Added a new set_target script method with an additional cableSourceIndex parameter
Added a checkbox to toggle the resetting of the transport on songbuilder scene change
Added the ability to disable spacemouse control from the command line
Added a mode to oscillator and signalgenerator sync to allow the frequency to be a ratio
Added a system for saving module presets, and spawning them from quickspawn
Added the pitchtovalue module
Added the dotsequencer module, a polyphonic note sequencer
Added the rhythmsequencer note effect
Added controller definition for Code 25 USB MIDI
Added previewing to samplebrowser
Added sync pulse support to m185sequencer
Changed
Made it so you can target dropdown lists with pulse cables
Updated ExprTk to 0.0.3
Changed the behavior, with regards to velocity, of the notesequencer and dotsequencer to be in line with the drumsequencer
Made it so you can target RadioButtons with pulse cables
Made hovering over a placed step and pressing up or down, cycle between normal, accent, and ghost notes in the drumsequencer module
Tweaked appearance of drumsequencer grid and change default step velocity to 80%
Changed AllowLookahead default to on in the notelooper module
Added a stop button when the sample is playing in the samplebrowser module
Allowed displaying the full note range in the keyboarddisplay module
Don’t smooth delay time when there’s a modulator controlling delay, to allow for interesting LFO-driven delay effects
Made the pulsetrain’s first pulse in sync with the transport instead of whenever the activating pulse comes in
Made pulsetrain resizable
Increased the limit of the pulsetrain to 128
Added the advancement buttons back to the pulsesequencer
Increased the maximum length from 32 to 128 in the pulsesequencer
Made the pulsesequencer resizable
Made it so the pitchsetter does not flush the notes when the pitch slider was changed but tries to preserve polyphony as much as possible instead
Increase midi pages to 32 from 10
Allow a single notetable module to span the entire note range
Make the key that opens the console also close the console
Made the circlesequencer support up to 32nd notes
Show the sample filename in the seaofgrain module
Allow for snapping to the center of the module while holding shift as well as control as opposed to only the top left corner
Minor rendering optimization when the modules lissajous, spectrum and waveformviewer are disabled/bypassed
Changed the following modules to use a bypass mechanism when disabled: gain, audiometer, fftvocoder, dcoffset, feedback, inverter, lissajous, looper, looperrecorder, multitapdelay, pulsechance, pulsedelayer, pulseflag, samplecapturer, samplergrid, seaofgrains, send, spectrum, signalclamp, vocoder, waveformviewer and waveshaper
Made spectrum and waveformviewer function when not connected
Made it possible to use a PC keyboard as a midicontroller input
Made it possible to lock keyboard focus to the keyboarddisplay module (and other future keyboard takeover modules)
Updated quickspawn search sorting to prefer things that start with what’s been typed so far
Made it possible for pulse cables to directly connect to buttons and checkboxes
Made the pulser „free“ mode timer restartable
Made pulsesequence step default to aligning to global transport, like other similar devices
Adjusted transparency of midi slider interaction popup
Made spawned presets use the filename as their default name
Made it possible for rotary encoders to use „set“ mode to increment and decrement in the midicontroller module
Changed beats module to only use a single column
Made it possible to set the target using scripts for the modules: audiotocv, envelope, leveltocv, and vinylcontrol
Made it possible for snapshots to target grids and canvases
Added the ability to manually lay out the module grid view using push2, so you can curate the modules you want quick access to
Added a second grid view to notesequencer and notetable modules
Don’t include input audio when in „input*“ mode in karplusstrong, so you only hear the feedback
Fixed
Fixed rhythmsequencer crash when trying to set length above 8
Prevent quickspawn menu from popping up if you move the mouse between pressing shift twice
Fix parsing of Python script files in CR+LF format
Fixed several bugs in the rendering of child modules in the minimap
Fixed a bug where the minimap could be obscured by the titlebar menu
Fixed an issues related to saving a seaofgrain at one sample rate and loading it at another sample rate
Fixed a bug where singleton modules could be added to prefab’s which caused all kinds of visual duplication and incorrect behavior
Fixed a bug where the scale values in the midicontroller weren’t being saved
Fixed an issue where long sample names prevented you from clicking the play button in the samplebrowser module
Fixed capo not working properly when adjusting held notes while in diatonic mode
Fixed LFO’s not properly being recorded and set when using the snapshots module
Several fixes to the biquad filter to better handle NaN values
Fixed a bug where the LFO would output NaN values when the length was set to zero
Fixed a bug when loading old savestates when oversampling was set to anything larger than 1
Fixed a crash in keyboarddisplay module when notes greater than 127 in value where drawn
Fixed the octave note text being off by 2 octaves in the keyboarddisplay module
Fixed a bug where the lowest octave displayed in the keyboarddisplay module wasn’t the lowest possible
Fixed a bug where the keyboarddisplay module was using float instead of double for time calculations
Fixed an issue where some old savestates couldn’t be loaded due to an issue in the past where the saving of the names of submodules of the effectchain module weren’t saving their name
Enhanced midicontroller deviceOutName creation to handle midi device names having “ In “ and “ Out “
Don’t display the help text when a savestate is loaded through the command line arguments
Fixed a bug where all canvas like modules wouldn’t save and load note modulations
Don’t render the finished step in the pulsetrain module
Fixed a crash in the pulsesequencer when going beyond the maximum length
Fixed a bug where the shift buttons on the pulsesequencer weren’t shifting
Fixed a bug in the drumsequencer when the numrows triangle menu option was set lower than a previously saved snapshot causing „disabled“ rows to still send notes
Fixed the default for modwheel
Increased internal work buffer size so we don’t read and write beyond this when using oversampling and large buffer sizes
Hidden the drumplayer controls better when not in edit mode and having single outputs
Fixed a crash in the songbuilder module when a new connection cable was canceled
Changed the order of input handling in module containers so that the menu UI is handled first
Resolved an issue in the oscillator module that would cause the module to continuously propagate NaN values
Forced a poll to properly rebuild the buffers when the multitrackrecorder is cleared
Correctly set the number of channels within seaofgrain so that mono input is processed correctly
Made the minimap less blurry with certain aspect ratios
Rewrote pitchtovalue through valuesetter in order to set verbatim values for drop-down lists
Fixed a crash on switch from „Jump“ to „Switch“ mode in the songbuilder module
Fixed an issue where some offscreen sliders wouldn’t compute their modulation
Fixed circlesequencer playnote issues when using offsets
Simplify bespoke turn string communication, and fix issue where value string wasn’t updating frequently enough
Fixed a crash when the interval in the curvelooper is forcibly set to 0
Set curvelooper size on load
Random note buttons would set all notes to 3 when the random octave range is 0-0. Now notes map to drum notes 0-3 again if octave range is 0-0
Fixed an issue where holding space when bespoke isn’t focused would cause mouse movements to pan the canvas
Fixed an issue where mouse wrap wouldn’t pan on the 0 side if the window is fully maximized
Don’t use file path hash for plugins lookup
When the valuesetter is disabled also don’t allow sending updates when the button is pressed
Fixed a minor bug related to visualization of cables after a gain module
Fixed a bug that inhibited removing the voicelimit in the oscillator, fmsynth and karplusstrong modules
Fixed a bug in the ringmodulator module where it would not compute the sliders for every sample correctly
Fixed a bug with the visualization of the output cable on a looper
Refresh the parameter dropdown list on ParamInfo change so that plugins with less than 30 params and changing params work correctly
Fixed a crash when setting the values of dropdown menus out of bounds on the label module
Fixed pitchtovalue not accepting notes
Made dotsequencer contents savable in snapshots
Propagate keypress in eq module so that cables can be deleted with the key commands
Fixed an issue where notecanvas did not import correctly for most tempos
Fixed a vstplugin assert when adjusting preset dropdown from push2
Fixed an issue with snapshot cable sources overlapping each other when multiple modules are connected
Made monome grid refresh lights when reconnected
Fixed a crash caused by a snapshot module being in a weird state
Use temp file to make sure save files don’t get corrupted if a crash ever happens mid-save
Fixed an issue where a step is skipped after reset when the first step has no pulses in the m185sequencer module
Fixed an issue where cables within prefabs can’t be grabbed when push2control is being used
Removed
Removed the enable/bypass checkbox on the splitter
Removed hidden main patchcablesource from the modules: audiotocv, envelope, leveltocv, and vinylcontrol