Scales
scale
:: Fractional a => Pattern String -> Pattern Int -> Pattern a
Interprets a pattern of note numbers into a particular named scale. For example:
d1 $ jux rev $ chunk 4 (fast 2 . (|- n 12)) $ off 0.25 (|+ 7) $ struct (iter 4 "t(5,8)") $ n (scale "ritusen" "0 .. 7") # sound "superpiano"
scaleList
:: String
Outputs this list of all the available scales:
minPent majPent ritusen egyptian kumai hirajoshi iwato chinese indian pelogprometheus scriabin gong shang jiao zhi yu whole wholetone augmented augmented2hexMajor7 hexDorian hexPhrygian hexSus hexMajor6 hexAeolian major ionian dorianphrygian lydian mixolydian aeolian minor locrian harmonicMinor harmonicMajormelodicMinor melodicMinorDesc melodicMajor bartok hindu todi purvi marva bhairavahirbhairav superLocrian romanianMinor hungarianMinor neapolitanMinor enigmaticspanish leadingWhole lydianMinor neapolitanMajor locrianMajor diminishedoctatonic diminished2 octatonic2 messiaen1 messiaen2 messiaen3 messiaen4messiaen5 messiaen6 messiaen7 chromatic bayati hijaz sikah rast saba iraq
scaleTable
:: Fractional a => [(String, [a])]
Outputs a list of all available scales and their corresponding notes. For
example, its first entry is ("minPent",[0,3,5,7,10]
) which means that
a minor pentatonic scale is formed by the root (0), the minor third (3 semitones
above the root), the perfect fourth (5 semitones above the root), etc.
As the list is big, you can use the Haskell function lookup to look up a
specific scale: lookup "phrygian" scaleTable
. This will output
Just [0.0,1.0,3.0,5.0,7.0,8.0,10.0]
.
You can also do a reverse lookup into the scale table. For example:
filter ( \(_, x) -> take 3 x == [0,2,4] ) scaleTable
The above example will output all scales of which the first three notes are the root, the major second (2 semitones above the fundamental), and the major third (4 semitones above the root).
getScale
:: Fractional a => [(String, [a])] -> Pattern String -> Pattern Int -> Pattern a
Build a scale function, with additional scales if you wish. For example:
let myscale = getScale ( scaleTable ++ [ ("techno", [0,2,3,5,7,8,10]) , ("broken", [0,1,4,7,8,10]) ] )
The above takes the standard scaleTable
as a starting point and adds two custom scales to it. You’ll be able to use the new function in place of the normal one:
d1 $ n (myscale "techno" "0 1 2 3 4 5 6 7") # sound "superpiano"