Sound.Tidal.Time
type
type Time = Rational
Time is rational
data
data ArcF a
An arc of time, with a start time (or onset) and a stop time (or offset)
type
type Arc = ArcF Time
sam
sam :: Time -> Time
The sam (start of cycle) for the given time value.
Cycles have duration 1, so every integer Time value divides two cycles.
toTime
toTime :: Real a => a -> Rational
Turns a number into a (rational) time value. An alias for toRational.
fromTime
fromTime :: Fractional a => Time -> a
Turns a (rational) time value into another number. An alias for fromRational.
nextSam
nextSam :: Time -> Time
The end point of the current cycle (and starting point of the next cycle)
cyclePos
cyclePos :: Time -> Time
The position of a time value relative to the start of its cycle.
hull
hull :: Arc -> Arc -> Arc
convex hull union
subArc
subArc :: Arc -> Arc -> Maybe Arc
subArc i j is the timespan that is the intersection of i and j.
intersection
The definition is a bit fiddly as results might be zero-width, but
not at the end of an non-zero-width arc - e.g. (0,1) and (1,2) do
not intersect, but (1,1) (1,1) does.
subMaybeArc
subMaybeArc :: Maybe Arc -> Maybe Arc -> Maybe (Maybe Arc)
sect
sect :: Arc -> Arc -> Arc
Simple intersection of two arcs
timeToCycleArc
timeToCycleArc :: Time -> Arc
The Arc returned is the cycle that the Time falls within.
Edge case: If the Time is an integer, the Arc claiming it is the one starting at that Time, not the previous one ending at that Time.
cycleArc
cycleArc :: Arc -> Arc
Shifts an Arc to one of equal duration that starts within cycle zero. (Note that the output Arc probably does not start at Time 0 -- that only happens when the input Arc starts at an integral Time.)
cyclesInArc
cyclesInArc :: Integral a => Arc -> [a]
Returns the numbers of the cycles that the input Arc overlaps
(excluding the input Arc's endpoint, unless it has duration 0 --
see "Edge cases" below).
(The "cycle number" of an Arc is equal to its start value.
Thus, for instance, cyclesInArc (Arc 0 1.5) == [0,1].)
Edge cases:
cyclesInArc $ Arc 0 1.0001 == [0,1] cyclesInArc $ Arc 0 1 == [0] -- the endpoint is excluded cyclesInArc $ Arc 1 1 == [1] -- unless the Arc has duration 0
PITFALL: Don't be fooled by the name. The output cycles
are not necessarily completely contained in the input Arc,
but they definitely overlap it,
and they include every cycle that overlaps it.
cycleArcsInArc
cycleArcsInArc :: Arc -> [Arc]
This provides exactly the same information as cyclesInArc,
except that this represents its output as Arcs,
whereas cyclesInArc represents the same information as integral indices.
(The Arc from 0 to 1 corresponds to the index 0,
the one from 1 to 2 has index 1, etc.)
arcCycles
arcCycles :: Arc -> [Arc]
Splits the given Arc into a list of Arcs, at cycle boundaries.
arcCyclesZW
arcCyclesZW :: Arc -> [Arc]
Like arcCycles, but returns zero-width arcs
mapCycle
mapCycle :: (Time -> Time) -> Arc -> Arc
Similar to fmap but time is relative to the cycle (i.e. the
sam of the start of the arc)
isIn
isIn :: Arc -> Time -> Bool
isIn a t is True if t is inside
the arc represented by a.