diff --git a/.dir-locals.el b/.dir-locals.el new file mode 100644 index 0000000..dbf6316 --- /dev/null +++ b/.dir-locals.el @@ -0,0 +1,2 @@ +((nil . ((tidal-boot-script-path . "BootTidal.hs") + (tidal-interpreter . "tidal")))) diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/BootTidal.hs b/BootTidal.hs new file mode 100644 index 0000000..1157ec0 --- /dev/null +++ b/BootTidal.hs @@ -0,0 +1,82 @@ +:set -XOverloadedStrings +:set prompt "" + +import Sound.Tidal.Context + +import System.IO (hSetEncoding, stdout, utf8) +hSetEncoding stdout utf8 + +tidal <- startTidal (superdirtTarget {oLatency = 0.05, oAddress = "127.0.0.1", oPort = 57120}) (defaultConfig {cVerbose = True, cFrameTimespan = 1/20}) + +:{ +let only = (hush >>) + p = streamReplace tidal + hush = streamHush tidal + panic = do hush + once $ sound "superpanic" + list = streamList tidal + mute = streamMute tidal + unmute = streamUnmute tidal + unmuteAll = streamUnmuteAll tidal + unsoloAll = streamUnsoloAll tidal + solo = streamSolo tidal + unsolo = streamUnsolo tidal + once = streamOnce tidal + first = streamFirst tidal + asap = once + nudgeAll = streamNudgeAll tidal + all = streamAll tidal + resetCycles = streamResetCycles tidal + setCycle = streamSetCycle tidal + setcps = asap . cps + getcps = streamGetcps tidal + getnow = streamGetnow tidal + xfade i = transition tidal True (Sound.Tidal.Transition.xfadeIn 4) i + xfadeIn i t = transition tidal True (Sound.Tidal.Transition.xfadeIn t) i + histpan i t = transition tidal True (Sound.Tidal.Transition.histpan t) i + wait i t = transition tidal True (Sound.Tidal.Transition.wait t) i + waitT i f t = transition tidal True (Sound.Tidal.Transition.waitT f t) i + jump i = transition tidal True (Sound.Tidal.Transition.jump) i + jumpIn i t = transition tidal True (Sound.Tidal.Transition.jumpIn t) i + jumpIn' i t = transition tidal True (Sound.Tidal.Transition.jumpIn' t) i + jumpMod i t = transition tidal True (Sound.Tidal.Transition.jumpMod t) i + jumpMod' i t p = transition tidal True (Sound.Tidal.Transition.jumpMod' t p) i + mortal i lifespan release = transition tidal True (Sound.Tidal.Transition.mortal lifespan release) i + interpolate i = transition tidal True (Sound.Tidal.Transition.interpolate) i + interpolateIn i t = transition tidal True (Sound.Tidal.Transition.interpolateIn t) i + clutch i = transition tidal True (Sound.Tidal.Transition.clutch) i + clutchIn i t = transition tidal True (Sound.Tidal.Transition.clutchIn t) i + anticipate i = transition tidal True (Sound.Tidal.Transition.anticipate) i + anticipateIn i t = transition tidal True (Sound.Tidal.Transition.anticipateIn t) i + forId i t = transition tidal False (Sound.Tidal.Transition.mortalOverlay t) i + d1 = p 1 . (|< orbit 0) + d2 = p 2 . (|< orbit 1) + d3 = p 3 . (|< orbit 2) + d4 = p 4 . (|< orbit 3) + d5 = p 5 . (|< orbit 4) + d6 = p 6 . (|< orbit 5) + d7 = p 7 . (|< orbit 6) + d8 = p 8 . (|< orbit 7) + d9 = p 9 . (|< orbit 8) + d10 = p 10 . (|< orbit 9) + d11 = p 11 . (|< orbit 10) + d12 = p 12 . (|< orbit 11) + d13 = p 13 + d14 = p 14 + d15 = p 15 + d16 = p 16 +:} + +:{ +let getState = streamGet tidal + setI = streamSetI tidal + setF = streamSetF tidal + setS = streamSetS tidal + setR = streamSetR tidal + setB = streamSetB tidal +:} + +:set prompt "tidal> " +:set prompt-cont "" + +default (Pattern String, Integer, Double) diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..19749e5 --- /dev/null +++ b/flake.lock @@ -0,0 +1,165 @@ +{ + "nodes": { + "dirt-samples-src": { + "flake": false, + "locked": { + "lastModified": 1698439458, + "narHash": "sha256-Mp8qBpsOvW9Zguv95Kv7EU6S3ICaF2aO02Wz6xGURtE=", + "owner": "tidalcycles", + "repo": "dirt-samples", + "rev": "9a6dff8f9ec3cd55b287290cf04e01afa6b8f532", + "type": "github" + }, + "original": { + "owner": "tidalcycles", + "repo": "dirt-samples", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1722813957, + "narHash": "sha256-IAoYyYnED7P8zrBFMnmp7ydaJfwTnwcnqxUElC1I26Y=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "cb9a96f23c491c081b38eab96d22fa958043c9fa", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "tidal": "tidal", + "utils": "utils" + } + }, + "superdirt-src": { + "flake": false, + "locked": { + "lastModified": 1697377840, + "narHash": "sha256-9qU9CHYAXbN1IE3xXDqGipuroifVaSVXj3c/cDfwM80=", + "owner": "musikinformatik", + "repo": "superdirt", + "rev": "c7f32998572984705d340e7c1b9ed9ad998a39b6", + "type": "github" + }, + "original": { + "owner": "musikinformatik", + "repo": "superdirt", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "tidal": { + "inputs": { + "dirt-samples-src": "dirt-samples-src", + "nixpkgs": "nixpkgs", + "superdirt-src": "superdirt-src", + "tidal-src": "tidal-src", + "vim-tidal-src": "vim-tidal-src", + "vowel-src": "vowel-src" + }, + "locked": { + "lastModified": 1730626669, + "narHash": "sha256-nFyZrvTPn9OM9UZmuAwy3e1Ba0ZuYc2FaDCOOhGtqg4=", + "owner": "mitchmindtree", + "repo": "tidalcycles.nix", + "rev": "0db0918e7a3d3c30ed7a6e81dc9d4e3832870ac4", + "type": "github" + }, + "original": { + "owner": "mitchmindtree", + "repo": "tidalcycles.nix", + "type": "github" + } + }, + "tidal-src": { + "flake": false, + "locked": { + "lastModified": 1712519522, + "narHash": "sha256-LbvxQmVxHElidCgvt+w0g1k+QQbNLebK46vtRCgsLeQ=", + "owner": "tidalcycles", + "repo": "tidal", + "rev": "88f09edf6bef2228d5f530dea872b08a9d803066", + "type": "github" + }, + "original": { + "owner": "tidalcycles", + "ref": "v1.9.5", + "repo": "tidal", + "type": "github" + } + }, + "utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "vim-tidal-src": { + "flake": false, + "locked": { + "lastModified": 1685703852, + "narHash": "sha256-8gyk17YLeKpLpz3LRtxiwbpsIbZka9bb63nK5/9IUoA=", + "owner": "tidalcycles", + "repo": "vim-tidal", + "rev": "e440fe5bdfe07f805e21e6872099685d38e8b761", + "type": "github" + }, + "original": { + "owner": "tidalcycles", + "repo": "vim-tidal", + "type": "github" + } + }, + "vowel-src": { + "flake": false, + "locked": { + "lastModified": 1641306144, + "narHash": "sha256-zfF6cvAGDNYWYsE8dOIo38b+dIymd17Pexg0HiPFbxM=", + "owner": "supercollider-quarks", + "repo": "vowel", + "rev": "ab59caa870201ecf2604b3efdd2196e21a8b5446", + "type": "github" + }, + "original": { + "owner": "supercollider-quarks", + "repo": "vowel", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..d51c740 --- /dev/null +++ b/flake.nix @@ -0,0 +1,15 @@ +{ + description = "A Tidal Cycles project. https://tidalcycles.org/"; + + inputs = { + tidal.url = "github:mitchmindtree/tidalcycles.nix"; + utils.url = "github:numtide/flake-utils"; + }; + + outputs = + inputs: + inputs.utils.lib.eachDefaultSystem (system: { + devShells = inputs.tidal.devShells.${system}; + formatter = inputs.tidal.formatter.${system}; + }); +} diff --git a/main.tidal b/main.tidal new file mode 100644 index 0000000..40b8acd --- /dev/null +++ b/main.tidal @@ -0,0 +1,2 @@ +d1 $ s "bd" +d2 $ s "ac"