# How and where do I define and use custom functions?

Let's say I have a crazy idea for a new pattern transformer, or maybe I just want to create a shortcut for a typical chain of transformers that I use a lot. How do I create a custom function to do this? Where do I type this code, and how do I make sure that the function is loaded before using it?

d1 $every 2 (rev . stut 4 0.25 0.125)$ s "bd cp bd*2 cp"


I want to type this:

d1 $every 2 (revstut)$ s "bd cp bd*2 cp"

edit retag close merge delete

Sort by » oldest newest most voted

Hi!

How:
I might be wrong, but to define a "function", you can do something like:

let revstut = rev . stut 4 0.25 0.125


Or a bit more complex example:

let revstut sN = rev . stut sN 0.25 0.125


then you could do

d1 $every 2 (slowspread revstut [2, 4, 8])$ s "bd cp bd*2 cp"


with 2, 4, 8 which being applied to revstut sN (ie: rev . stut 2 0.25 0.125, rev . stut 4 0.25 0.125, ...)

BTW, you can have a group of functions by using one let ...:

let revstut sN = rev . stut sN 0.25 0.125
revstut' = revstut 2


So this way you have both, one with a default value (revstut') and one where you can pass an Int param (revstut sN)

disclaimer: Wrote this without testing, but IIRC this should work fine :-)

Where:

That's another subject. Sometimes I add them at the top of the .tidal file I'm working on, sometimes on a custom .tidal file which I evatuate after start coding, I'm not really sure which is the best practice for this.
OTOH, if you use emacs, and have your custom .tidal file with your functions you can do something like the author of TideBox did in these lines (he evaluates automagically a file when the editor starts).

Hope this helps!

more

Yep this works. I think there is a way to put functions in the .ghci file so that they're loaded when Tidal boots, but I've struggled to get it to work for some reason. The .tidal file method is easy enough.

( 2016-06-20 09:36:30 -0500 )edit

There are a few options, but I haven't found a perfect way.

I think using the .ghci file has problems because that file will get executed before anything else from Tidal gets loaded, so I don't think it works too well.

In GHCi you can execute commands from a file using :script. The problem I run into with this is that GHCi isn't in "multiline" mode by default, so it might give errors that you wouldn't see if you just sent the block from your Atom session (which has some special code to deal with such things). You can :set +m to get around some of it, but there can still be some issues.

You can write up your functions as a more permanent module, and load that using :load. And you could add a line to BootTidal.hs to automatically load it upon starting Tidal. The trick with this is that you need to write your functions as "normal" Haskell, not the interactive form. So you don't need let, and there are some syntax differences. This can be nice if you hope to merge your functions into core Tidal, or need to use some other external Haskell modules, but can be a bit of work to set up.

In practice, I used to do the :load thing, but it's a bit of extra work and nowadays I just have a snippets.tidal file with a giant let block that I execute by hand whenever I start Tidal.

more