Copyright | (c) Hans Hoglund, Edward Lilley 2012–2014 |
---|---|
License | BSD-style |
Maintainer | hans@hanshoglund.se |
Stability | experimental |
Portability | non-portable (TF,GNTD) |
Safe Haskell | None |
Language | Haskell2010 |
Provides standard intervals.
- data Interval
- interval :: Iso' (Quality, Number) Interval
- interval' :: Iso' (ChromaticSteps, DiatonicSteps) Interval
- _number :: Lens' Interval Number
- _quality :: Lens' Interval Quality
- _steps :: Lens' Interval DiatonicSteps
- _alteration :: Lens' Interval ChromaticSteps
- perfect :: Number -> Interval
- major :: Number -> Interval
- minor :: Number -> Interval
- augmented :: Number -> Interval
- diminished :: Number -> Interval
- doublyAugmented :: Number -> Interval
- doublyDiminished :: Number -> Interval
- isNegative :: Interval -> Bool
- isPositive :: Interval -> Bool
- isNonNegative :: Interval -> Bool
- isPerfectUnison :: Interval -> Bool
- isStep :: Interval -> Bool
- isLeap :: Interval -> Bool
- isSimple :: Interval -> Bool
- isCompound :: Interval -> Bool
- separate :: Interval -> (Octaves, Interval)
- simple :: Interval -> Interval
- octaves :: Interval -> Octaves
- invert :: Interval -> Interval
- asInterval :: Interval -> Interval
- data IntervalBasis
- convertBasis :: Interval -> Interval -> Interval -> Maybe (Int, Int)
- convertBasisFloat :: (Fractional t, Eq t) => Interval -> Interval -> Interval -> Maybe (t, t)
- intervalDiv :: Interval -> Interval -> Int
Intervals
A musical interval such as minor third, augmented fifth, duodecim etc.
We include direction in in this definition, so a downward minor third (written -m3
)
is distinct from an upward minor third (written m3
). Note that _P1
and -P1
are
synynoms.
Not to be confused with a mathematical inverval in pitch space, which is called
Ambitus
. Intervals and pitches form an affine-vector space pair with intervals and
vectors and pitches as points. To add an interval to a, use .+^
. To get the
interval between two pitches, use .-.
.
c .+^ minor third == eb f .-. c == perfect fourth
Adding intervals preserves spelling. For example:
m3 ^+^ _M3 = _P5 d5 ^+^ _M6 = m10
The scalar type of Interval
is Int
, using ^*
to stack intervals of a certain type
on top of each other. For example _P5 ^* 2
is a stack of 2 perfect fifths, or a major
ninth. The Num
instance works as expected for +
, negate
and abs
, and
(arbitrarily) uses minor seconds for multiplication. If you find yourself *
, or
signum
on intervals, consider switching to *^
or normalized
.
Intervals are generally described in terms of Quality
and Number
. To construct an
interval, use the interval
constructor, the utility constructors major
, minor
,
augmented
and diminished
, or the interval literals:
m5 == minor fifth == interval Minor 5 > _P4 == perfect fourth == interval
Perfect 5 > d5 == diminished fifth == diminish (perfect fifth)
Eq Interval | |
Num Interval | Avoid using '(*)', or |
Ord Interval | Lexicographical ordering, comparing the |
Show Interval | |
Monoid Interval | |
Semigroup Interval | |
IsInterval Interval | |
Augmentable Interval | |
HasBasis Interval | |
VectorSpace Interval | |
AdditiveGroup Interval | |
HasNumber Interval | |
HasQuality Interval | |
HasSemitones Interval | |
Typeable * Interval | |
type Basis Interval = IntervalBasis | |
type Scalar Interval = Integer |
Creating intervals
interval :: Iso' (Quality, Number) Interval Source
View an interval as a pair of quality and number or vice versa.
interval' :: Iso' (ChromaticSteps, DiatonicSteps) Interval Source
View an interval as a pair of alteration and diatonic steps or vice versa.
_steps :: Lens' Interval DiatonicSteps Source
View or set the number of chromatic steps in an interval.
_alteration :: Lens' Interval ChromaticSteps Source
View or set the alteration (i.e. the number of chromatic steps differing from the excepted number) in an interval.
Synonyms
perfect :: Number -> Interval Source
Creates a perfect interval. If given an inperfect number, constructs a major interval.
major :: Number -> Interval Source
Creates a major interval. If given a perfect number, constructs a perfect interval.
minor :: Number -> Interval Source
Creates a minor interval. If given a perfect number, constructs a diminished interval.
diminished :: Number -> Interval Source
Creates a diminished interval.
doublyAugmented :: Number -> Interval Source
Creates a doubly augmented interval.
doublyDiminished :: Number -> Interval Source
Creates a doubly diminished interval.
Inspecting intervals
isNegative :: Interval -> Bool Source
Returns whether the given interval is negative.
isPositive :: Interval -> Bool Source
Returns whether the given interval is positive.
isNonNegative :: Interval -> Bool Source
Returns whether the given interval is non-negative. This implies that it is either positive or a perfect unison.
isPerfectUnison :: Interval -> Bool Source
Returns whether the given interval a perfect unison.
isStep :: Interval -> Bool Source
Returns whether the given interval is a step (a second or smaller).
Only diatonic number
is taken into account, so _A2
is considered
a step and m3
a leap, even though they have the same number of
semitones.
isLeap :: Interval -> Bool Source
Returns whether the given interval is a leap (larger than a second).
Only the diatonic number
is taken into account, so _A2
is considered
a step and m3
a leap, even though they have the same number of
semitones.
Simple and compound intervals
isSimple :: Interval -> Bool Source
Returns whether the given interval is simple.
A simple interval is a non-negative interval spanning less than one octave.
isCompound :: Interval -> Bool Source
Returns whether the given interval is compound.
A compound interval is either a negative interval, or a positive interval spanning one octave or more.
separate :: Interval -> (Octaves, Interval) Source
Separate a compound interval into octaves and a simple interval.
(perfect octave)^*x + y = z iff (x, y) = separate z
simple :: Interval -> Interval Source
Returns the simple part of an interval.
(perfect octave)^*x + y = z iff y = simple z
octaves :: Interval -> Octaves Source
Returns the non-simple part of an interval.
_P8^*octaves x ^+^ simple x = x
Inversion
invert :: Interval -> Interval Source
Intervallic inversion.
The inversion an interval is determined as follows:
- The number of a simple interval the difference of nine and the number of its inversion.
- The quality of a simple interval is the inversion of the quality of its inversion.
- The inversion of a compound interval is the inversion of its simple component.
Utility
asInterval :: Interval -> Interval Source
This is just the identity function, but is useful to fix the type of Interval
.
Basis values
data IntervalBasis Source
Converting basis
convertBasis :: Interval -> Interval -> Interval -> Maybe (Int, Int) Source
Represent an interval i in a new basis (j, k).
We want x,y where i = x*j + y*k
e.g., convertBasis basis_d2 _P5 basis_P8 == Just (-12,7), as expected.
convertBasisFloat :: (Fractional t, Eq t) => Interval -> Interval -> Interval -> Maybe (t, t) Source
Same as above, but don't worry if new interval has non-integer coefficients -- useful when getting a value to use as a frequency ratio in a tuning system.
intervalDiv :: Interval -> Interval -> Int Source
Integer div of intervals: i / di = x, where x is an integer