Introducing CycSeq: a cycle sequencer for tidal

And I can import Sound.Tidal.Context

Prelude> import Sound.Tidal.Context
Prelude Sound.Tidal.Context>

which ghci gives me:

/Users/xon/.ghcup/bin//ghci

I put it in the package json file.
And now npm start gives me:

(base) xon-5:cycseq xon$ npm start

cycseq@0.1.0 start /Users/xon/cycseq
concurrently --default-input-target 1 -i --kill-others -n "server,client,link" "npm run start:server" "npm run start:client -f" "npm run start:linkserver"

[client] npm WARN using --force I sure hope you know what you are doing.
[client]
[client] > cycseq@0.1.0 start:client /Users/xon/cycseq
[client] > node client.js --server 127.0.0.1 --tidalCabal -g /Users/xon/.ghcup/bin//ghci
[client]
[link]
[link] > cycseq@0.1.0 start:linkserver /Users/xon/cycseq
[link] > node linkserver.js
[link]
[server]
[server] > cycseq@0.1.0 start:server /Users/xon/cycseq
[server] > node server.js --password p -o 57121 -s 57120
[server]
[client] extramuros: connecting to ws://127.0.0.1:8000...
[client] extramuros: websocket connection ws://127.0.0.1:8000 closed
[client] Tidal/GHCI initialized
[client] Tidal/GHCI initialized
[link] Link server is listening on port 8001
[server] cycseq: listening for OSC on UDP port 57121
[server] cycseq: send osc messages on UDP port 57120
[server] cycseq server, listening on TCP port 8000 (http/WebSockets)
[client] GHCi, version 8.8.4: Glasgow Haskell Compiler — The Glasgow Haskell Compiler :? for help
[client]
[client] warning: exception in WebSocket send
[client] GHCi, version 8.8.4: Glasgow Haskell Compiler — The Glasgow Haskell Compiler :? for help
[client]
[client] Loaded package environment from /Users/xon/.ghc/x86_64-darwin-8.8.4/environments/default
[client]
[client] Loaded package environment from /Users/xon/.ghc/x86_64-darwin-8.8.4/environments/default
[client]
[client] warning: exception in WebSocket send
[client]
[client] : error:
[client] Could not load module ‘Sound.OSC.FD’
[client] It is a member of the hidden package ‘hosc-0.18.1’.
[client] You can run ‘:set -package hosc’ to expose it.
[client] (Note: this unloads all the modules in the current scope.)
[client] It is a member of the hidden package ‘hosc-0.18.1’.
[client] You can run ‘:set -package hosc’ to expose it.
[client] (Note: this unloads all the modules in the current scope.)
[client]
[client] warning: exception in WebSocket send
[client] PrePrelude> lude> Prelude> Listening for controls on 127.0.0.1:6010
[client]
[client] warning: exception in WebSocket send
[client]
[client] :39:24: error:
[client] Not in scope: ‘O.time’
[client] No module named ‘O’ is imported.
[client]
[client] warning: exception in WebSocket send
[client] *** Exception: Network.Socket.connect: <socket: 17>: does not exist (Connection refused)
[client]
[client] warning: exception in WebSocket send
[client]
[client] : error:
[client] Could not load module ‘Sound.OSC.FD’
[client] It is a member of the hidden package ‘hosc-0.18.1’.
[client] You can run ‘:set -package hosc’ to expose it.
[client]
[client] warning: exception in WebSocket send
[client] (Note: this unloads all the modules in the current scope.)
[client] It is a member of the hidden package ‘hosc-0.18.1’.
[client] You can run ‘:set -package hosc’ to expose it.
[client] (Note: this unloads all the modules in the current scope.)
[client]
[client] warning: exception in WebSocket send
[client] Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| Prelude Sound.Tidal.Context System.IO MV Tempo| tidal> tidal> tidal> tidal> tidal> tidal> Listening for controls on 127.0.0.1:6010
[client]
[client] warning: exception in WebSocket send
[client] Control listen failed. Perhaps there's already another tidal instance listening on that port?
[client]
[client] warning: exception in WebSocket send
[client]
[client]
[client] warning: exception in WebSocket send
[client] :148:24: error:
[client] Not in scope: ‘O.time’
[client] No module named ‘O’ is imported.
[client]
[client] warning: exception in WebSocket send
[client] *** Exception: Network.Socket.connect: <socket: 18>: does not exist (Connection refused)
[client]
[client] warning: exception in WebSocket send
[client] extramuros: connecting to ws://127.0.0.1:8000...
[client] Tidal/GHCI initialized
[client] extramuros: connected to ws://127.0.0.1:8000
[client] tidal> tidal> tidal> tidal> tidal> GHCi, version 8.8.4: Glasgow Haskell Compiler — The Glasgow Haskell Compiler :? for help
[client]
[client] Loaded package environment from /Users/xon/.ghc/x86_64-darwin-8.8.4/environments/default
[client]
[client]
[client] : error:
[client] Could not load module ‘Sound.OSC.FD’
[client] It is a member of the hidden package ‘hosc-0.18.1’.
[client]
[client] You can run ‘:set -package hosc’ to expose it.
[client] (Note: this unloads all the modules in the current scope.)
[client] It is a member of the hidden package ‘hosc-0.18.1’.
[client] You can run ‘:set -package hosc’ to expose it.
[client] (Note: this unloads all the modules in the current scope.)
[client]
[client] Prelude> Prelude> Listening for controls on 127.0.0.1:6010
[client]
[client] Control listen failed. Perhaps there's already another tidal instance listening on that port?
[client]
[client]
[client] :39:24: error:
[client] Not in scope: ‘O.time’
[client] No module named ‘O’ is imported.
[client]
[client] *** Exception: Network.Socket.connect: <socket: 14>: does not exist (Connection refused)
[client]

Prelude> import Sound.Tidal.Context
Prelude Sound.Tidal.Context>

So that is an indication that you have a working tidal module.

The GHCI session is establisehd, but the hosc package cannot be found. This is a dependency on Tidal, so it should be there because you have Tidal installed. But because Tidal is installed somehow, it seems to be a problem with the Tidal installation or the paths.

What I would do at this point is set the path to ghcup/bin (so no manual export is necessary), delete the default environment and check the installation:

  1. Add export PATH="$HOME/.ghcup/bin/:$PATH" to the .bash_profile and .zshrc (if available) Hopefully it should then be possible to call ghci in the console.

  2. save the file /Users/xon/.ghc/x86_64-darwin-8.8.4/environments/default to another location and delete it

  3. if ghci is available in the console, then cabal should be too. Enter cabal list tidal. I have it installed with version 1.6.1

  4. if "Installed Version" says [Not installed], then please enter cabal update and then cabal install tidal.

  5. In any case you should have installed hosc if you have tidal. Please check this with cabal list hosc. In my installation it looks like this:

  6. if everything works so far, then try to import Sound.OSC under ghci.

A small note about the log output of CycSeq:
I also see that the output at startup is very large and diffuse. I should make this more user friendly.

Btw. pls remove the duplicated `. $HOME/.ghcup/env' in your .bashrc It should only one.

Hello,

With cabal list tidal, I've got:

(base) xon-5:~ xon$ cabal list tidal

  • maquinitas-tidal
    Synopsis: library for MIDI control of hardware
    Default available version: 0.2.4
    Installed versions: [ Not installed ]
    Homepage: GitHub - maquinitas/maquinitas-tidal: maquinitas x TidalCycles
    License: MIT
  • tidal
    Synopsis: Pattern language for improvised music
    Default available version: 1.6.1
    Installed versions: [ Not installed ]
    Homepage: http://tidalcycles.org/
    License: GPL-3
  • tidal-midi
    Synopsis: MIDI support for tidal
    Default available version: 0.9.10
    Installed versions: [ Not installed ]
    Homepage: http://tidal.lurk.org/
    License: GPL-3
  • tidal-serial
    Synopsis: Serial support for tidal
    Default available version: 0.8
    Installed versions: [ Not installed ]
    Homepage: http://tidalcycles.org/
    License: GPL-3
  • tidal-vis
    Synopsis: Visual rendering for Tidal patterns and osc messages
    Default available version: 1.0.15
    Installed versions: [ Not installed ]
    Homepage: http://yaxu.org/tidal/
    License: GPL-3

What I do not understand is that nothing seems installed, whereas I followed Tidal setup instructions...
Anyway, so I did cabal install tidal, But I've got:

(base) xon-5:~ xon$ cabal install tidal
Resolving dependencies...
Up to date
Warning: You asked to install executables, but there are no executables in
target: tidal. Perhaps you want to use --lib to install libraries instead.

I've tried also by adding --lib, nothing seems installed after...

With cabal list hosc, I've got:

(base) xon-5:~ xon$ cabal list hosc

  • hosc
    Synopsis: Haskell Open Sound Control
    Default available version: 0.18.1
    Installed versions: [ Not installed ]
    Homepage: rd: hosc
    License: GPL-3
  • hosc-json
    Synopsis: Haskell Open Sound Control JSON Serialisation
    Default available version: 0.16
    Installed versions: [ Not installed ]
    Homepage: rd: hosc-json
    License: GPL
  • hosc-utils
    Synopsis: Haskell Open Sound Control Utilities
    Default available version: 0.15
    Installed versions: [ Unknown ]
    Homepage: http://rd.slavepianos.org/?t=hosc-utils
    License: GPL

I'm a bit confused about what is happening here. @yaxu could you please help us?
@Xon has an installation issue and I can't get any further at this point. He tried the installation with tidal-bootstrap and a manual installation too, but cabal says that tidal wasn't installed.

Yes cabal is gets confused very easily :confused:

@xon If cabal install tidal --lib isn't working you could try cabal v1-install tidal

You might need to remove the hidden .ghc and .cabal files in your home folder.

Thanks @yaxu!

I removed the hidden .ghc and .cabal files.
I did cabal update and then cabal v1-install tidal.

And now, I've got with cabal list tidal:

  • tidal
    Synopsis: Pattern language for improvised music
    Default available version: 1.6.1
    Installed versions: 1.6.1
    Homepage: http://tidalcycles.org/
    License: GPL-3
  • tidal-midi
    Synopsis: MIDI support for tidal
    Default available version: 0.9.10
    Installed versions: [ Not installed ]
    Homepage: http://tidal.lurk.org/
    License: GPL-3
  • tidal-serial
    Synopsis: Serial support for tidal
    Default available version: 0.8
    Installed versions: [ Not installed ]
    Homepage: http://tidalcycles.org/
    License: GPL-3
  • tidal-vis
    Synopsis: Visual rendering for Tidal patterns and osc messages
    Default available version: 1.0.15
    Installed versions: [ Not installed ]
    Homepage: http://yaxu.org/tidal/
    License: GPL-3

So, thanks to cabal v1-install tidal, Tidal is installed, whereas it was mentioned it was not installed with cabal install tidal --lib. do not know why?
I do also not know why e.g. tidal-midi is mentioned as not installed ?, (midi support is important to me)

Concerning cabal list hosc, I've got:

(base) xon-5:~ xon$ cabal list hosc

  • hosc
    Synopsis: Haskell Open Sound Control
    Default available version: 0.18.1
    Installed versions: 0.18.1
    Homepage: rd: hosc
    License: GPL-3
  • hosc-json
    Synopsis: Haskell Open Sound Control JSON Serialisation
    Default available version: 0.16
    Installed versions: [ Not installed ]
    Homepage: rd: hosc-json
    License: GPL

So hoc is installed now and import Sound.OSC under ghci works.
But still, I have the same kind of error message I mentioned before when I do npm start.
@mrreason, I can send you the complete error message if you want.

[client] *** Exception: Network.Socket.connect: <socket: 14>: does not exist (Connection refused)
[client]

Also, now, when I launch Atom and boot Tidal, I've got:

Choose ghcup default path: /Users/xon/.ghcup/bin
Ghci command: /Users/xon/.ghcup/bin/ghci
Ghc-pkg command: /Users/xon/.ghcup/bin/ghc-pkg

And if evaluate a line, I've got some sound, but it is printed:

Load BootTidal.hs from /Users/xon/.cabal/share/x86_64-osx-ghc-8.8.4/tidal-1.6.1/BootTidal.hs
t>
t>
t>Listening for controls on 127.0.0.1:6010 Control listen failed. Perhaps there's already another tidal instance listening on that port?

When I first installed Tidal, it seems to me, I had not all these lines printed and Tidal was booting directly...

But it looks like Tidal is now correctly installed. One thing I have to mention first: you can only use one editor at a time. That means you can only use either Atom or CycSeq. But the problem might also occur if you want to use VSCode or Atom in parallel. The error messages in CycSeq are not nice yet, I will fix that, but can you call localhost:8000 in your browser and enter tidal code in a text field and evaluate it with Shift-Enter?

Good news by the way:
I have implemented an OSC control in the meantime. With SuperCollider you can also send MIDI signals with it. I documented it in the README of the GitHub project.

As far as I can tell, haskell is transitioning between one version of cabal and another, and a lot is broken in the new version..

Ignore that tidal-midi module, it no longer works. These days, all midi is done via superdirt.

In theory, there should be no problem at all with multiple versions of tidal running. In practice, I think the time sync might be broken.. I need to look at that.

Atom prints out some extra diagnostic information these days, but if it works there's nothing to worry about.

1 Like

Thanks @yaxu & @mrreason,

BTW, CycSeq and Atom can work in parallel independently, i.e. SC generates synths from messages from both CycSeq and Atom. So, you can have 2 tracks d1 running in parallel.
I cannot see a goal to do that, but just a simple remark.

@mrreason, CycSeq works great, and I have several comments / questions:

  1. When I call localhost:8000 in my browser, I've got no Link (Link showed).
    I've tried sock <- carabiner tidal 4 (0) in the terminal in order to synchronize Tidal & CycSeq, but 1 Link is not showed in the upper left ?
    I've got 1 Link only when I evaluate l = LinkClock(1).latency_(Server.default.latency); in SC, which is intended for the synchronization with SC also.
    But, how to get 1 Link when I call localhost:8000 in the browser directly ?
    Shouldn't I see 2 Link in CycSeq when Tidal, CycSeq and SC are all synchronized ?

  2. What is the use for the box 4,8, right to 1/4 ?

  3. What is the use for the arrows, right to the slider ?

  4. When I load a custom json.file, the textbook at the right is not updated with the corresponding filename in my case.

  5. The figures for each parameter / box of the editor could be showed, at the left, above or below the play arrow of each box. It would be practical to know which box to trigger e.g. via SC or midi.
    If so, The figures should be obviously updated if you add or delete a box.

  6. Concerning OSC messages to Cycseq and MIDI support through SC, thanks a lot for that.
    By changing the parameter of the editor via SC, I've noticed several late messages in SC. I don't know why yet ?

  7. I find your sequencer of code great. But it would be my dream sequencer if it could be a little bit more modular in the same way as the session view in Ableton Live.
    There could be an option where each track (d1, d2...) could be in different tabs. And that's already possible by opening several tabs in the browser. But in that case, the different editors should be identified differently in OSC in order to control a different parameter for each editor, e.g.:
    ~cycseqOSC.sendMsg("/cycseq/editor1", 1);
    ~cycseqOSC.sendMsg("/cycseq/editor2", 2);
    If this OSC identification could be implemented, it would be great.

  8. There could be also a different kind of visualisation, showing different tabs in the same page, like the 1st image in this post:
    https://club.tidalcycles.org/t/live-workflow-and-mixing-eq-options/2026
    But, it requires in-depth reflection, a lot more work to develop and I am not sure it is better, practical...

Many Thanks for all,

Christophe

Great to hear that everything works now and thanks for the hint with the parallel editors!

To your questions/comments:

  1. You need to use carabiner, for the time synchronisation. TidalCycles has its own clock and runs independently of the SuperCollider clock. Unfortunately there is currently no direct implementation of Ableton Link in TidalCycles. But if you use LinkClock(1).latency_(Server.default.latency); in SuperCollider and carabiner was started, you can change the speed in SuperCollider

  2. It is the trigger point within the beat. Unfortunately not all values works (like 1). I originally used this to adjust latencies. But in the meantime I don't need the offset anymore.

  3. If this is activated, the sequence will be looped, otherwise hush is sent after the last editor is reached.

  4. This is a standard HTML element that is difficult to customize directly, so I was just lazy. But there are workarounds and I will adapt them. I think that it should simply be a button without a text field.

  5. I think this is a philosophica question. I like it when the ui doesn't look too overloaded. But I could add a button that shows all addresses optionally. Basically, the addresses are also adjusted when adding and deleting editors.

  6. I can't explain that right now, but see if that disappears when you have successfully set up AbletonLink.

  7. I had the same idea at the very beginning, but I think that it becomes too confusing in a live-coding context. But I can imagine that it is practical to compose locally with TidalCycles, if you use it as a generative tool. I can imagine a mixture of Ableton's Session View and the Cells view, with external controls and multiple sequencer. I would consider this as a standalone view and keep the current one (so you can switch).

  8. I have activated the Issues tab on the GitHub project page. We could discuss something like that directly there.

Basically I would prefer, when we discuss feature topics on GitHub. Questions and problems can still be discussed here at TidalClub.

This is exactly what I needed right now. From what I can see nobody tested on Windows. Will let you know how it goes!

Hey @geikha! :wave: I assume that this editor will not work anymore, because originally I created this when Ableton Link was not integrated in TidalCycles.

But beside that I would be interested in your concrete use case. Maybe it's related to this topic: Performing long live sets - #2 by geikha?

Since one year (or so?!) I started to reduce my complete setup, so that I only use SuperCollider and Tidalcycles with Pulsar, but keep it easy usable for performing long live sets + combine it with the TidalLooper. So I got rid of i.e. Ableton and some special solutions like CycSeq. I didn't made this public, but it works pretty well. The idea is to have complete songs with transition parts and stuff like that and improvise over the single parts. The switch between these segments/parts are bounded to the global cycle count.

Using link as scheduler is optional iirc, I could switch to the old one while using the newer Tidal versions!

Also, my use case isn't live performance. Actually the complete opposite! I want to sequence my codes to create structured songs, instead of recording a performance and edit the audio later. Basically using this as a compositional tool. Any other ideas are welcome!

Yes, I used my approach mainly for composition (to write an intro, parts, transitions, an outro etc.). And then I was thinking of how to use this approach on stage (with the SuperDirtMixer, preset management, remote control, but still keep the code editable). You could say I highly customized my complete environment, but it works pretty well for my personal workflow.

Before I elaborate, I give you a small code snippet from the TidalCycles side to check, whether this makes sense to you (but for me it gives me flexibility, stability and the possibility to compose complex pieces). But of course this will not work with vanilla TidalCycles:

do
let
    globalkey = sheet { key = "e5" |- 2}
    root = globalkey {  mode = "<dorian>", numerals = "1" }
    --
    intro = globalkey { mode = "dorian", numerals = "<1>" }
    introHarmonic = globalkey { mode = "dorian", numerals = "<1 3 4 8>"}
    introStacker = stacker [
          ("pure", pure 1)
          , ("fx", s "pwm" <| prog introHarmonic "[1,5]" |- note 12
              # chiptune "1" # pan 0.7 # cutoff 8000 )
          , ("arp",
                while "<t!4 f!4>" (# silence)
                $ struct "t t@2 t t@2 t t" $ s "sally:0"
                <| prog intro "[1,5,8]" |- note 0 # legato 1
                # hpf 600 )
        ]
    --
    --
    rock = globalkey { mode = "dorian", numerals = "<1 3 4 8 1 1 2 4>"}
    rockPartStacker = stacker [
         ("pure", pure 1)
         , ("lead",  s "[pwm, lead]"
            <| prog root "<[1 1 1 1 8 7 5 3] [4 5 5 5 5 5 4 3 ][4 5 3 1 1 1 1 1] [1 1 5 3 ~ 4 2 ~]>"
            # legato 1 # chiptune "1" )
         , ("drums",
             (s $ sew "<t!7 f>"
              "[bd ~ bd ~ ~ bd bd ~, <cr ~!3>, hh:1 hho hh:1!3 hho hh:1!2, ~ sn]"
              "[cr, ~! [sn:0 sn:2]!3 [sn, tom], bd*4]") # drumBank 3 # legato 2
           )
         , ("strings", s "violin" <| prog rock "<[1][3 7][1][1 2]>" # amp 0.8 )
       ]
-- Preset for the SuperDirtMixer
once $ s "loadPreset" # presetFile (cS "Memories1.json" "presetFile") # orbit 0
dx' ( ((tParam rotL) $ cT 0 "offset") ) -- Offset to always start to the current cycle, even with different cycle length. Only needed for remote control switch (if needed).
  -- (cP' "2:1@16" "memories")
  (cP' "1:1@8" "memories") -- Decide which stacker to play; this can be even more complex like "2:2@8 3:2@8 4:1@8 5:1@1"
  (cT 8 "duration")
  -- Custom tempo -> change time signature and stay at the same relative tempo
  (mapfx 0.5708333333333333 [4/4, 9/8, 7/4])
  -- SuperCollider synth to handle remote part switch
  "memoriesPing"
  -- Optional transition
  (False, xfade)
  -- List of parts, first element starts with "1" in the remote control
  ([introStacker, rockPartStacker]) -- Or transition, outro, whatever

The parameters in the dx' functions are mainly needed for the live performances, but not for composing pieces. I have a simplified version for this as well, but The idea should be clear?!

It's not complete up to date, but I follow these approaches, that I basically described here: