Tidal Cycles is a domain-specific language (DSL) for live coding music, particularly focused on pattern-based music creation. It was created by Alex McLean and is built on top of Haskell . Tidal Cycles allows musicians and programmers to create complex rhythmic patterns and sequences using a simple and expressive syntax.
Getting Started
To get started with Tidal Cycles, you'll need to have Haskell and SuperCollider installed on your system. You can follow the installation instructions on the Tidal Cycles website . Their installer script simplifies the process and will go through each dependency to make sure it's present and up-to-date.
The macOS installation is pretty straightforward, but Linux and Windows users may need to follow additional steps to get everything set up correctly.
# Ensure Xcode is installed
/usr/bin/xcode-select --install
# Tidal Cycles installer script
curl https://raw.githubusercontent.com/tidalcycles/tidal-bootstrap/master/tidal-bootstrap.command -sSf | sh
Neovim Integration
Neovim is a great tool for editing code, but it can also be used for live-coding with Tidal Cycles. I'm using a plugin by thgrund
that forks another popular Tidal plugin. Both the fork and the original provide useful scripts for auto-starting SuperCollider and the Tidal REPL when opening a .tidal
file.
The feature that made Thomas Grund's fork most appealing is an additional syntax-highlighting event loop which will highlight a given sample as it's evaluation in the given loop— similar to how it works in the Pulsar IDE that Tidal recommends.

-- TidalCycles integration
{
"thgrund/tidal.nvim",
opts = {
--- Configure TidalLaunch command
boot = {
tidal = {
--- Command to launch ghci with tidal installation
cmd = "ghci",
args = {
"-v0",
},
--- Tidal boot file path
file = os.getenv("HOME") .. "/.config/tidal/BootTidal.hs",
enabled = true,
highlight = {
autostart = true,
styles = {
osc = {
ip = "127.0.0.1",
port = 3335,
},
-- [Tidal ID] -> hl style
--custom = {
-- ["1"] = { bg = "#cc241d", foreground = "#ffffff" },
-- ["2"] = { bg = "#d65d0e", foreground = "#ffffff" },
-- ["3"] = { bg = "#d78821", foreground = "#000000" },
-- ["4"] = { bg = "#b8bb26", foreground = "#000000" },
-- ["5"] = { bg = "#98971a", foreground = "#000000" },
-- ["6"] = { bg = "#689d6a", foreground = "#000000" },
-- ["7"] = { bg = "#458588", foreground = "#ffffff" },
-- ["8"] = { bg = "#d3869b", foreground = "#000000" },
--},
global = {
baseName = "CodeHighlight",
style = {
bg = "#ff8800",
foreground = "#000000"
}
},
},
events = {
osc = {
ip = "127.0.0.1",
port = 6013,
},
},
fps = 30,
},
},
sclang = {
--- Command to launch SuperCollider
cmd = "sclang",
args = {},
--- SuperCollider boot file
file = os.getenv("HOME") .. "/.config/tidal/BootSuperDirt.scd",
enabled = true,
},
split = "v",
},
--- Default keymaps
--- Set to false to disable all default mappings
--- @type table | nil
mappings = {
send_line = { mode = { "n" }, key = "<C-e>" },
send_visual = { mode = { "x" }, key = "<leader><CR>" },
send_block = { mode = { "i", "n", "x" }, key = "<M-CR>" },
send_node = { mode = "n", key = "<leader>kk" },
send_silence = { mode = "n", key = "<leader>d" },
send_hush = { mode = "n", key = "<leader><Esc>" },
},
---- Configure highlight applied to selections sent to tidal interpreter
selection_highlight = {
--- Highlight definition table
--- see ':h nvim_set_hl' for details
--- @type vim.api.keyset.highlight
highlight = { link = "IncSearch" },
--- Duration to apply the highlight for
timeout = 150,
},
},
-- Recommended: Install TreeSitter parsers for Haskell and SuperCollider
dependencies = {
"nvim-treesitter/nvim-treesitter",
opts = {
ensure_installed = {
"haskell",
"supercollider" ,
}
},
},
}
The SuperCollider boot file (BootSuperDirt.scd
) typically contains code to start the SuperDirt server, which is essential for Tidal Cycles to communicate with SuperCollider. I have custom boot file paths to be able to include other configuration options. However, the Tidal boot file (BootTidal.hs
) from thgrund
's Neovim plugin has important code to set up the Tidal environment within GHCi. It will also start a separate events loop for syntax highlighting. So make sure you copy that bit into your own boot file if you decide to customize it.