Skip to content

Core

Elemental patterns

sig :: (Time -> a) -> Pattern a

Takes a function of time to values, and turns it into a Pattern. Useful for creating continuous patterns such as sine or perlin.

For example, saw is defined as

saw = sig $ \t -> mod' (fromRational t) 1

sine :: Fractional a => Pattern a

sine - unipolar sinewave. A pattern of continuous values following a sinewave with frequency of one cycle, and amplitude from 0 to 1.

sine2 :: Fractional a => Pattern a

sine2 - bipolar sinewave. A pattern of continuous values following a sinewave with frequency of one cycle, and amplitude from -1 to 1.

cosine :: Fractional a => Pattern a

cosine - unipolar cosine wave. A pattern of continuous values following a cosine with frequency of one cycle, and amplitude from 0 to 1. Equivalent to 0.25 ~> sine.

cosine2 :: Fractional a => Pattern a

cosine2 - bipolar cosine wave. A pattern of continuous values following a cosine with frequency of one cycle, and amplitude from -1 to 1. Equivalent to 0.25 ~> sine2.

saw :: (Fractional a, Real a) => Pattern a

saw - unipolar ascending sawtooth wave. A pattern of continuous values following a sawtooth with frequency of one cycle, and amplitude from 0 to 1.

saw2 :: (Fractional a, Real a) => Pattern a

saw2 - bipolar ascending sawtooth wave. A pattern of continuous values following a sawtooth with frequency of one cycle, and amplitude from -1 to 1.

isaw :: (Fractional a, Real a) => Pattern a

isaw like saw, but a descending (inverse) sawtooth.

isaw2 :: (Fractional a, Real a) => Pattern a

isaw2 like saw2, but a descending (inverse) sawtooth.

tri :: (Fractional a, Real a) => Pattern a

tri - unipolar triangle wave. A pattern of continuous values following a triangle wave with frequency of one cycle, and amplitude from 0 to 1.

tri2 :: (Fractional a, Real a) => Pattern a

tri2 - bipolar triangle wave. A pattern of continuous values following a triangle wave with frequency of one cycle, and amplitude from -1 to 1.

square :: Fractional a => Pattern a

square - unipolar square wave. A pattern of continuous values following a square wave with frequency of one cycle, and amplitude from 0 to 1. | square is like sine, for square waves.

square2 :: Fractional a => Pattern a

square2 - bipolar square wave. A pattern of continuous values following a square wave with frequency of one cycle, and amplitude from -1 to 1.

envL :: Pattern Double

envL is a Pattern of continuous Double values, representing a linear interpolation between 0 and 1 during the first cycle, then staying constant at 1 for all following cycles. Possibly only useful if you’re using something like the retrig function defined in tidal.el.

envLR :: Pattern Double

like envL but reversed.

envEq :: Pattern Double

‘Equal power’ version of env, for gain-based transitions

envEqR :: Pattern Double

Equal power reversed

Pattern algebra

class Unionable a where

Methods

union :: a -> a -> a

Instances

Instances details

Unionable ValueMap 
Instance details

Defined in Sound.Tidal.Core

Methods

union :: ValueMap -> ValueMap -> ValueMap

Unionable a 
Instance details

Defined in Sound.Tidal.Core

Methods

union :: a -> a -> a

(|+|) :: (Applicative a, Num b) => a b -> a b -> a b

(|+) :: Num a => Pattern a -> Pattern a -> Pattern a

(+|) :: Num a => Pattern a -> Pattern a -> Pattern a

(||+) :: Num a => Pattern a -> Pattern a -> Pattern a

(|++|) :: Applicative a => a String -> a String -> a String

(|++) :: Pattern String -> Pattern String -> Pattern String

(++|) :: Pattern String -> Pattern String -> Pattern String

(||++) :: Pattern String -> Pattern String -> Pattern String

(|/|) :: (Applicative a, Fractional b) => a b -> a b -> a b

(|/) :: Fractional a => Pattern a -> Pattern a -> Pattern a

(/|) :: Fractional a => Pattern a -> Pattern a -> Pattern a

(||/) :: Fractional a => Pattern a -> Pattern a -> Pattern a

(|*|) :: (Applicative a, Num b) => a b -> a b -> a b

(|*) :: Num a => Pattern a -> Pattern a -> Pattern a

(*|) :: Num a => Pattern a -> Pattern a -> Pattern a

(||*) :: Num a => Pattern a -> Pattern a -> Pattern a

(|-|) :: (Applicative a, Num b) => a b -> a b -> a b

(|-) :: Num a => Pattern a -> Pattern a -> Pattern a

(-|) :: Num a => Pattern a -> Pattern a -> Pattern a

(||-) :: Num a => Pattern a -> Pattern a -> Pattern a

(|%|) :: (Applicative a, Moddable b) => a b -> a b -> a b

(|%) :: Moddable a => Pattern a -> Pattern a -> Pattern a

(%|) :: Moddable a => Pattern a -> Pattern a -> Pattern a

(||%) :: Moddable a => Pattern a -> Pattern a -> Pattern a

(|**|) :: (Applicative a, Floating b) => a b -> a b -> a b

(|**) :: Floating a => Pattern a -> Pattern a -> Pattern a

(**|) :: Floating a => Pattern a -> Pattern a -> Pattern a

(||**) :: Floating a => Pattern a -> Pattern a -> Pattern a

(|>|) :: (Applicative a, Unionable b) => a b -> a b -> a b

(|>) :: Unionable a => Pattern a -> Pattern a -> Pattern a

(>|) :: Unionable a => Pattern a -> Pattern a -> Pattern a

(||>) :: Unionable a => Pattern a -> Pattern a -> Pattern a

(|<|) :: (Applicative a, Unionable b) => a b -> a b -> a b

(|<) :: Unionable a => Pattern a -> Pattern a -> Pattern a

(<|) :: Unionable a => Pattern a -> Pattern a -> Pattern a

(||<) :: Unionable a => Pattern a -> Pattern a -> Pattern a

(#) :: Unionable b => Pattern b -> Pattern b -> Pattern b

Constructing patterns

fromList :: [a] -> Pattern a

Turns a list of values into a pattern, playing one of them per cycle. The following are equivalent:

d1 $ n (fromList [0, 1, 2]) # s "superpiano" d1 $ n "<0 1 2>" # s "superpiano"

fastFromList :: [a] -> Pattern a

Turns a list of values into a pattern, playing all of them per cycle. The following are equivalent:

d1 $ n (fastFromList [0, 1, 2]) # s "superpiano" d1 $ n "[0 1 2]" # s "superpiano"

listToPat :: [a] -> Pattern a

A synonym for fastFromList

fromMaybes :: [Maybe a] -> Pattern a

‘fromMaybes; is similar to fromList, but allows values to be optional using the Maybe type, so that Nothing results in gaps in the pattern. The following are equivalent: > d1 $ n (fromMaybes [Just 0, Nothing, Just 2]) # s “superpiano” > d1 $ n “0 ~ 2” # s “superpiano”

run :: (Enum a, Num a) => Pattern a -> Pattern a

A pattern of whole numbers from 0 to the given number, in a single cycle. Can be used used to run through a folder of samples in order:

d1 $ n (run 8) # sound "amencutup"

The first parameter to run can be given as a pattern:

d1 $ n (run "<4 8 4 6>") # sound "amencutup"

_run :: (Enum a, Num a) => a -> Pattern a

scan :: (Enum a, Num a) => Pattern a -> Pattern a

Similar to run, but starts from 1 for the first cycle, successively adds a number until it gets up to n. > d1 $ n (scan 8) # sound “amencutup”

_scan :: (Enum a, Num a) => a -> Pattern a

Combining patterns

append :: Pattern a -> Pattern a -> Pattern a

Alternate between cycles of the two given patterns > d1 $ append (sound “bd*2 sn”) (sound “arpy jvbass*2”)

cat :: [Pattern a] -> Pattern a

Like append, but for a list of patterns. Interlaces them, playing the first cycle from each in turn, then the second cycle from each, and so on. It concatenates a list of patterns into a new pattern; each pattern in the list will maintain its original duration. For example:

d1 $ cat [sound "bd*2 sn", sound "arpy jvbass*2"] d1 $ cat [sound "bd*2 sn", sound "arpy jvbass*2", sound "drum*2"] d1 $ cat [sound "bd*2 sn", sound "jvbass*3", sound "drum*2", sound "ht mt"]

slowCat :: [Pattern a] -> Pattern a

Alias for cat

slowcat :: [Pattern a] -> Pattern a

slowAppend :: Pattern a -> Pattern a -> Pattern a

Alias for append

slowappend :: Pattern a -> Pattern a -> Pattern a

fastAppend :: Pattern a -> Pattern a -> Pattern a

Like append, but twice as fast > d1 $ fastAppend (sound “bd*2 sn”) (sound “arpy jvbass*2”)

fastappend :: Pattern a -> Pattern a -> Pattern a

fastCat :: [Pattern a] -> Pattern a

The same as cat, but speeds up the result by the number of patterns there are, so the cycles from each are squashed to fit a single cycle.

d1 $ fastcat [sound "bd*2 sn", sound "arpy jvbass*2"] d1 $ fastcat [sound "bd*2 sn", sound "arpy jvbass*2", sound "drum*2"] d1 $ fastcat [sound "bd*2 sn", sound "jvbass*3", sound "drum*2", sound "ht mt"]

fastcat :: [Pattern a] -> Pattern a

Alias for fastCat

timeCat :: [(Time, Pattern a)] -> Pattern a

Similar to fastCat, but each pattern is given a relative duration. You provide proportionate sizes of the patterns to each other for when they’re concatenated into one cycle. The larger the value in the list, the larger relative size the pattern takes in the final loop. If all values are equal then this is equivalent to fastcat (e.g. the following two code fragments are equivalent).

d1 $ fastcat [s "bd*4", s "hh27*8", s "superpiano" # n 0]``d1 $ timeCat [ (1, s "bd*4") , (1, s "hh27*8") , (1, s "superpiano" # n 0) ]

timecat :: [(Time, Pattern a)] -> Pattern a

Alias for timeCat

overlay :: Pattern a -> Pattern a -> Pattern a

overlay combines two Patterns into a new pattern, so that their events are combined over time. For example, the following two lines are equivalent:

d1 $ sound (overlay "bd sn:2" "cp*3") d1 $ sound "[bd sn:2, cp*3]"

overlay is equal to <>,

(<>) :: Semigroup a => a -> a -> a

which can thus be used as an infix operator equivalent of overlay:

d1 $ sound ("bd sn:2" <> "cp*3")

stack :: [Pattern a] -> Pattern a

stack combines a list of Patterns into a new pattern, so that their events are combined over time, i.e., all of the patterns in the list are played simultaneously.

d1 $ stack [ sound "bd bd*2", sound "hh*2 [sn cp] cp future*4", sound "arpy" +| n "0 .. 15" ]

This is particularly useful if you want to apply a function or synth control pattern to multiple patterns at once:

d1 $ whenmod 5 3 (striate 3) $ stack [ sound "bd bd*2", sound "hh*2 [sn cp] cp future*4", sound "arpy" +| n "0 .. 15" ] # speed "[[1 0.8], [1.5 2]*2]/3"

Manipulating time

(<~) :: Pattern Time -> Pattern a -> Pattern a

Shifts a pattern back in time by the given amount, expressed in cycles

(~>) :: Pattern Time -> Pattern a -> Pattern a

Shifts a pattern forward in time by the given amount, expressed in cycles

slowSqueeze :: Pattern Time -> Pattern a -> Pattern a

Slow down a pattern by the factors in the given time pattern, “squeezing” the pattern to fit the slot given in the time pattern. It is the slow analogue to fastSqueeze.

If the time pattern only has a single value in a cycle, slowSqueeze becomes equivalent to slow. These are equivalent:

d1 $ slow "<2 4>" $ s "bd*8" d1 $ slowSqueeze "<2 4>" $ s "bd*8"

When the time pattern has multiple values, however, the behavior is a little different. Instead, a slowed version of the pattern will be made for each value in the time pattern, and they’re all combined together in a cycle according to the structure of the time pattern. For example, these are equivalent:

d1 $ slowSqueeze "2 4 8 16" $ s "bd*8" d1 $ s "bd*4 bd*2 bd bd/2"

as are these:

d1 $ slowSqueeze "2 4 [8 16]" $ s "bd*8" d1 $ s "bd*4 bd*2 [bd bd/2]"

sparsity :: Pattern Time -> Pattern a -> Pattern a

An alias for slow

zoom :: (Time, Time) -> Pattern a -> Pattern a

Plays a portion of a pattern, specified by a time arc (start and end time). The new resulting pattern is played over the time period of the original pattern.

d1 $ zoom (0.25, 0.75) $ sound "bd*2 hh*3 [sn bd]*2 drum"

In the pattern above, zoom is used with an arc from 25% to 75%. It is equivalent to:

d1 $ sound "hh*3 [sn bd]*2"

Here’s an example of it being used with a conditional:

d1 $ every 4 (zoom (0.25, 0.75)) $ sound "bd*2 hh*3 [sn bd]*2 drum"

zoomArc :: Arc -> Pattern a -> Pattern a

fastGap :: Pattern Time -> Pattern a -> Pattern a

fastGap is similar to fast but maintains its cyclic alignment, i.e., rather than playing the pattern multiple times, it instead leaves a gap in the remaining space of the cycle. For example, fastGap 2 p would squash the events in pattern p into the first half of each cycle (and the second halves would be empty). The factor should be at least 1.

densityGap :: Pattern Time -> Pattern a -> Pattern a

An alias for fastGap

compress :: (Time, Time) -> Pattern a -> Pattern a

compress takes a pattern and squeezes it within the specified time span (i.e. the ‘arc’). The new resulting pattern is a sped up version of the original.

d1 $ compress (1/4, 3/4) $ s "[bd sn]!"

In the above example, the pattern will play in an arc spanning from 25% to 75% of the duration of a cycle. It is equivalent to:

d1 $ s "~ [bd sn]! ~"

Another example, where all events are different:

d1 $ compress (1/4, 3/4) $ n (run 4) # s "arpy"

It differs from zoom in that it preserves the original pattern but it speeds up its events so to match with the new time period.

compressTo :: (Time, Time) -> Pattern a -> Pattern a

repeatCycles :: Pattern Int -> Pattern a -> Pattern a

_repeatCycles :: Int -> Pattern a -> Pattern a

fastRepeatCycles :: Int -> Pattern a -> Pattern a

every :: Pattern Int -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a

  • Higher order functions

Functions which work on other functions (higher order functions)

every n f p applies the function f to p, but only affects every n cycles.

It takes three inputs: how often the function should be applied (e.g. 3 to apply it every 3 cycles), the function to be applied, and the pattern you are applying it to. For example: to reverse a pattern every three cycles (and for the other two play it normally)

d1 $ every 3 rev $ n "0 1 [~ 2] 3" # sound "arpy"

Note that if the function you’re applying requires additional parameters itself (such as fast 2 to make a pattern twice as fast), then you’ll need to wrap it in parenthesis, like so:

d1 $ every 3 (fast 2) $ n "0 1 [~ 2] 3" # sound "arpy"

Otherwise, the every function will think it is being passed too many parameters.

_every :: Int -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a

every' :: Pattern Int -> Pattern Int -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a

every' n o f p is like every n f p but with an offset of o cycles.

For example, every' 3 0 (fast 2) will speed up the cycle on cycles 0,3,6,… whereas every' 3 1 (fast 2) will transform the pattern on cycles 1,4,7,….

With this in mind, setting the second argument of every' to 0 gives the equivalent every function. For example, every 3 is equivalent to every’ 3 0.

The every functions can be used to silence a full cycle or part of a cycle by using silent or mask ”~”. Mask provides additional flexibility to turn on/off individual steps.

d1 $ every 3 silent $ n "2 9 11 2" # s "hh27" d1 $ every 3 (mask "~") $ n "2 9 10 2" # s "hh27" d1 $ every 3 (mask "0 0 0 0") $ n "2 9 11 2" # s "hh27"

_every' :: Int -> Int -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a

foldEvery :: [Int] -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a

foldEvery ns f p applies the function f to p, and is applied for each cycle in ns.

It is similar to chaining multiple every functions together. It transforms a pattern with a function, once per any of the given number of cycles. If a particular cycle is the start of more than one of the given cycle periods, then it it applied more than once.

d1 $ foldEvery [5,3] (|+ n 1) $ s "moog" # legato 1

The first moog samples are tuned to C2, C3 and C4. Note how on cycles that are multiples of 3 or 5 the pitch is an octave higher, and on multiples of 15 the pitch is two octaves higher, as the transformation is applied twice.

when :: (Int -> Bool) -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a

The given pattern transformation is applied only when the given test function returns True. The test function will be called with the current cycle as a number.

d1 $ when (elem '4' . show) (striate 4) $ sound "hh hc"

The above will only apply striate 4 to the pattern if the current cycle number contains the number 4. So the fourth cycle will be striated and the fourteenth and so on. Expect lots of striates after cycle number 399.

whenT :: (Time -> Bool) -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a

Like when, but works on continuous time values rather than cycle numbers. The following will apply # speed 2 only when the remainder of the current Time divided by 2 is less than 0.5:

d1 $ whenT ((< 0.5) . (flip Data.Fixed.mod' 2)) (# speed 2) $ sound "hh(4,8) hc(3,8)"

_getP_ :: (Value -> Maybe a) -> Pattern Value -> Pattern a

_getP :: a -> (Value -> Maybe a) -> Pattern Value -> Pattern a

_cX :: a -> (Value -> Maybe a) -> String -> Pattern a

_cX_ :: (Value -> Maybe a) -> String -> Pattern a

cF :: Double -> String -> Pattern Double

cF_ :: String -> Pattern Double

cF0 :: String -> Pattern Double

cN :: Note -> String -> Pattern Note

cN_ :: String -> Pattern Note

cN0 :: String -> Pattern Note

cI :: Int -> String -> Pattern Int

cI_ :: String -> Pattern Int

cI0 :: String -> Pattern Int

cB :: Bool -> String -> Pattern Bool

cB_ :: String -> Pattern Bool

cB0 :: String -> Pattern Bool

cR :: Rational -> String -> Pattern Rational

cR_ :: String -> Pattern Rational

cR0 :: String -> Pattern Rational

cT :: Time -> String -> Pattern Time

cT0 :: String -> Pattern Time

cT_ :: String -> Pattern Time

cS :: String -> String -> Pattern String

cS_ :: String -> Pattern String

cS0 :: String -> Pattern String

in0 :: Pattern Double

in1 :: Pattern Double

in2 :: Pattern Double

in3 :: Pattern Double

in4 :: Pattern Double

in5 :: Pattern Double

in6 :: Pattern Double

in7 :: Pattern Double

in8 :: Pattern Double

in9 :: Pattern Double

in10 :: Pattern Double

in11 :: Pattern Double

in12 :: Pattern Double

in13 :: Pattern Double

in14 :: Pattern Double

in15 :: Pattern Double

in16 :: Pattern Double

in17 :: Pattern Double

in18 :: Pattern Double

in19 :: Pattern Double

in20 :: Pattern Double

in21 :: Pattern Double

in22 :: Pattern Double

in23 :: Pattern Double

in24 :: Pattern Double

in25 :: Pattern Double

in26 :: Pattern Double

in27 :: Pattern Double

in28 :: Pattern Double

in29 :: Pattern Double

in30 :: Pattern Double

in31 :: Pattern Double

in32 :: Pattern Double

in33 :: Pattern Double

in34 :: Pattern Double

in35 :: Pattern Double

in36 :: Pattern Double

in37 :: Pattern Double

in38 :: Pattern Double

in39 :: Pattern Double

in40 :: Pattern Double

in41 :: Pattern Double

in42 :: Pattern Double

in43 :: Pattern Double

in44 :: Pattern Double

in45 :: Pattern Double

in46 :: Pattern Double

in47 :: Pattern Double

in48 :: Pattern Double

in49 :: Pattern Double

in50 :: Pattern Double

in51 :: Pattern Double

in52 :: Pattern Double

in53 :: Pattern Double

in54 :: Pattern Double

in55 :: Pattern Double

in56 :: Pattern Double

in57 :: Pattern Double

in58 :: Pattern Double

in59 :: Pattern Double

in60 :: Pattern Double

in61 :: Pattern Double

in62 :: Pattern Double

in63 :: Pattern Double

in64 :: Pattern Double

in65 :: Pattern Double

in66 :: Pattern Double

in67 :: Pattern Double

in68 :: Pattern Double

in69 :: Pattern Double

in70 :: Pattern Double

in71 :: Pattern Double

in72 :: Pattern Double

in73 :: Pattern Double

in74 :: Pattern Double

in75 :: Pattern Double

in76 :: Pattern Double

in77 :: Pattern Double

in78 :: Pattern Double

in79 :: Pattern Double

in80 :: Pattern Double

in81 :: Pattern Double

in82 :: Pattern Double

in83 :: Pattern Double

in84 :: Pattern Double

in85 :: Pattern Double

in86 :: Pattern Double

in87 :: Pattern Double

in88 :: Pattern Double

in89 :: Pattern Double

in90 :: Pattern Double

in91 :: Pattern Double

in92 :: Pattern Double

in93 :: Pattern Double

in94 :: Pattern Double

in95 :: Pattern Double

in96 :: Pattern Double

in97 :: Pattern Double

in98 :: Pattern Double

in99 :: Pattern Double

in100 :: Pattern Double

in101 :: Pattern Double

in102 :: Pattern Double

in103 :: Pattern Double

in104 :: Pattern Double

in105 :: Pattern Double

in106 :: Pattern Double

in107 :: Pattern Double

in108 :: Pattern Double

in109 :: Pattern Double

in110 :: Pattern Double

in111 :: Pattern Double

in112 :: Pattern Double

in113 :: Pattern Double

in114 :: Pattern Double

in115 :: Pattern Double

in116 :: Pattern Double

in117 :: Pattern Double

in118 :: Pattern Double

in119 :: Pattern Double

in120 :: Pattern Double

in121 :: Pattern Double

in122 :: Pattern Double

in123 :: Pattern Double

in124 :: Pattern Double

in125 :: Pattern Double

in126 :: Pattern Double

in127 :: Pattern Double