Tidal Cy­cles

1:15AMOctober 23 2025Daniel Tompkins

Archive KB

Tidal Cy­cles is a do­main-spe­cific lan­guage (DSL) for live coding music, par­tic­u­larly fo­cused on pat­tern-based music cre­ation. It was cre­ated by Alex McLean and is built on top of Haskell . Tidal Cy­cles al­lows mu­si­cians and pro­gram­mers to create com­plex rhythmic pat­terns and se­quences using a simple and ex­pres­sive syntax.

Get­ting Started

To get started with Tidal Cy­cles, you'll need to have Haskell and Su­per­Col­lider in­stalled on your system. You can follow the in­stal­la­tion in­struc­tions on the Tidal Cy­cles web­site . Their in­staller script sim­pli­fies the process and will go through each de­pen­dency to make sure it's pre­sent and up-to-date.

The macOS in­stal­la­tion is pretty straight­for­ward, but Linux and Win­dows users may need to follow ad­di­tional steps to get every­thing set up cor­rectly.

macOS
shell
# 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 In­te­gra­tion

Neovim is a great tool for editing code, but it can also be used for live-coding with Tidal Cy­cles. I'm using a plugin by thgrund that forks an­other pop­ular Tidal plugin. Both the fork and the orig­inal pro­vide useful scripts for auto-starting Su­per­Col­lider and the Tidal REPL when opening a .tidal file.

The fea­ture that made Thomas Grund's fork most ap­pealing is an ad­di­tional syntax-high­lighting event loop which will high­light a given sample as it's eval­u­a­tion in the given loop— sim­ilar to how it works in the Pulsar IDE that Tidal rec­om­mends.

Install tidal.nvim with Lazy
lua
-- 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 Su­per­Col­lider boot file (BootSuperDirt.scd) typ­i­cally con­tains code to start the Su­perDirt server, which is es­sen­tial for Tidal Cy­cles to com­mu­ni­cate with Su­per­Col­lider. I have custom boot file paths to be able to in­clude other con­fig­u­ra­tion op­tions. How­ever, the Tidal boot file (BootTidal.hs) from thgrund's Neovim plugin has im­por­tant code to set up the Tidal en­vi­ron­ment within GHCi. It will also start a sep­a­rate events loop for syntax high­lighting. So make sure you copy that bit into your own boot file if you de­cide to cus­tomize it.