Superdirt FX and Haskell

Hello all,

I have a question about this article on the main Tidal help under "Configuration -> Superdirt Configuration"

I know a bit about Supercollider, but not about the workings of Tidal, Haskell (or Cabal).

It says: Open Sound/Tidal/Params.hs. All that I've been able to find (and mostly by the help of my wonderful friend @mbutz) is a path to Params.hi which seems to be compiled code.

I'm using both Linux and Mac OS. If anyone can direct me as to where the flies are on the Tidal side that need editing, I'd be very grateful.

I am pretty sure much of this comes down to my limited knowledge of Haskell projects as well.


Hi @hypostatic,

I'm not clear on why the instructions ask you to open that file, which is part of tidal's source. Perhaps the idea is just to look at it and see how parameters are defined internal to tidal. But you don't need to look at it.

Actually you can just run this code in your editor the same way as you run a tidal pattern:

let tsdelay = pF "tsdelay"
    xsdelay = pI "xsdelay"

The instructions tell you to add it to your BootTidal.hs, as a convenience, so it automatically gets run every time you start tidal. But you don't need to, to get it working.

Indeed you don't even need to make these shorthands, you could just run e.g.:

d1 $ sound "bd sn" # pF "tsdelay" "0 0.5"

tsdelay = pF "tsdelay" just allows you the shorthand of:

d1 $ sound "bd sn" # tsdelay "0 0.5"

Okay, that makes complete sense! Very helpful. Thank you!

@yaxu - one silly question. I see pF and pI as what I assume are data types (Float and Integer). I've seen these for using controllers as cF and cI etc. Firstly, what does "p" mean or is an arbitrary letter. However, even though I haven't done a deep-dive into Haskell, I was wondering if this is purely a Tidal convention or part of Haskell?

The 'p' there is short for 'parameter' if I remember right. pF is a function that takes a name and a pattern of floats as input, and returns a 'control pattern' - a pattern of hash maps (dictionaries) with the name as the key for each float value.

'F' and 'I' do refer to haskell types 'Float' and 'Integer', but these are tidal-specific functions. As far as Haskell is concerned, they're just arbitrary names of functions.


Okay, once again, thank you for the response @yaxu - this also makes sense. I can see the power in this, just wasn't sure and hadn't come across it in the documentation.