Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
"Sieves" by Iannis Xenakis and John Rahn Perspectives of New Music Vol. 28, No. 1 (Winter, 1990), pp. 58-78
Synopsis
- data Sieve
- union :: [Sieve] -> Sieve
- intersection :: [Sieve] -> Sieve
- (∪) :: Sieve -> Sieve -> Sieve
- (∩) :: Sieve -> Sieve -> Sieve
- c :: Sieve -> Sieve
- sieve_pp :: Sieve -> String
- l :: Integer -> Integer -> Sieve
- (⋄) :: Integer -> Integer -> Sieve
- normalise :: Sieve -> Sieve
- is_normal :: Sieve -> Bool
- element :: Sieve -> Integer -> Bool
- i_complement :: [Integer] -> [Integer]
- build :: Sieve -> [Integer]
- buildn :: Int -> Sieve -> [Integer]
- differentiate :: Num a => [a] -> [a]
- euclid :: Integral a => a -> a -> a
- de_meziriac :: Integral a => a -> a -> a
- reduce_intersection :: Integral t => (t, t) -> (t, t) -> Maybe (t, t)
- reduce :: Sieve -> Sieve
- psappha_flint_c :: [Sieve]
- psappha_flint :: Sieve
- a_r_squibbs_c :: [Sieve]
- a_r_squibbs :: Sieve
Documentation
A Sieve.
Empty | |
L (Integer, Integer) | Primitive |
Union Sieve Sieve | |
Intersection Sieve Sieve |
|
Complement Sieve |
|
intersection :: [Sieve] -> Sieve Source #
The Intersection
of a list of Sieve
s, ie. foldl1
Intersection
.
is_normal :: Sieve -> Bool Source #
Predicate to test if a Sieve
is normal.
is_normal (L (15,4)) == True is_normal (L (11,13)) == False
element :: Sieve -> Integer -> Bool Source #
Predicate to determine if an I
is an element of the Sieve
.
map (element (L (3,1))) [1..4] == [True,False,False,True] map (element (L (15,4))) [4,19 .. 49] == [True,True,True,True]
i_complement :: [Integer] -> [Integer] Source #
I
not in set.
take 9 (i_complement [1,3..]) == [0,2..16]
build :: Sieve -> [Integer] Source #
Construct the sequence defined by a Sieve
. Note that building
a sieve that contains an intersection clause that has no elements
gives _|_
.
let d = [0,2,4,5,7,9,11] let r = d ++ map (+ 12) d take 14 (build (union (map (l 12) d))) == r
buildn :: Int -> Sieve -> [Integer] Source #
Variant of build
that gives the first n places of the reduce
of Sieve
.
buildn 6 (union (map (l 8) [0,3,6])) == [0,3,6,8,11,14] buildn 12 (L (3,2)) == [2,5,8,11,14,17,20,23,26,29,32,35] buildn 9 (L (8,0)) == [0,8,16,24,32,40,48,56,64] buildn 3 (L (3,2) ∩ L (8,0)) == [8,32,56] buildn 12 (L (3,1) ∪ L (4,0)) == [0,1,4,7,8,10,12,13,16,19,20,22] buildn 14 (5⋄4 ∪ 3⋄2 ∪ 7⋄3) == [2,3,4,5,8,9,10,11,14,17,19,20,23,24] buildn 6 (3⋄0 ∪ 4⋄0) == [0,3,4,6,8,9] buildn 8 (5⋄2 ∩ 2⋄0 ∪ 7⋄3) == [2,3,10,12,17,22,24,31] buildn 12 (5⋄1 ∪ 7⋄2) == [1,2,6,9,11,16,21,23,26,30,31,36] buildn 19 (L (3,2) ∪ L (7, 1)) == [1, 2, 5, 8, 11, 14, 15, 17, 20, 22, 23, 26, 29, 32, 35, 36, 38, 41, 43] buildn 19 (3⋄0 ∪ 7⋄0) == [0, 3, 6, 7, 9, 12, 14, 15, 18, 21, 24, 27, 28, 30, 33, 35, 36, 39, 42]
buildn 10 (3⋄2 ∩ 4⋄7 ∪ 6⋄9 ∩ 15⋄18) == [3,11,23,33,35,47,59,63,71,83]
let s = 3⋄2∩4⋄7∩6⋄11∩8⋄7 ∪ 6⋄9∩15⋄18 ∪ 13⋄5∩8⋄6∩4⋄2 ∪ 6⋄9∩15⋄19 let s' = 24⋄23 ∪ 30⋄3 ∪ 104⋄70 buildn 16 s == buildn 16 s'
buildn 10 (24⋄23 ∪ 30⋄3 ∪ 104⋄70) == [3,23,33,47,63,70,71,93,95,119]
let r = [2,3,4,5,8,9,10,11,14,17,19,20,23,24,26,29,31] buildn 17 (5⋄4 ∪ 3⋄2 ∪ 7⋄3) == r
let r = [0,1,3,6,9,10,11,12,15,16,17,18,21,24,26,27,30] buildn 17 (5⋄1 ∪ 3⋄0 ∪ 7⋄3) == r
let r = [0,2,3,4,6,7,9,11,12,15,17,18,21,22,24,25,27,30,32] buildn 19 (5⋄2 ∪ 3⋄0 ∪ 7⋄4) == r
Agon et. al. p.155
let a = c (13⋄3 ∪ 13⋄5 ∪ 13⋄7 ∪ 13⋄9) let b = 11⋄2 let c' = c (11⋄4 ∪ 11⋄8) let d = 13⋄9 let e = 13⋄0 ∪ 13⋄1 ∪ 13⋄6 let f = (a ∩ b) ∪ (c' ∩ d) ∪ e buildn 13 f == [0,1,2,6,9,13,14,19,22,24,26,27,32]
differentiate [0,1,2,6,9,13,14,19,22,24,26,27,32] == [1,1,4,3,4,1,5,3,2,2,1,5]
import Music.Theory.Pitch
let n = [0,1,2,6,9,13,14,19,22,24,26,27,32] let r = "C C𝄲 C♯ D♯ E𝄲 F𝄰 G A𝄲 B C C♯ C𝄰 E" unwords (map (pitch_class_pp . pc24et_to_pitch . (`mod` 24)) n) == r
Jonchaies
let s = map (17⋄) [0,1,4,5,7,11,12,16] let r = [1,3,1,2,4,1,4,1,1,3,1,2,4,1,4,1,1,3,1,2,4,1,4,1] differentiate (buildn 25 (union s)) == r let a2 = octpc_to_midi (2,9) let m = scanl (+) a2 r import Music.Theory.Pitch.Spelling.Table let p = "A2 A#2 C#3 D3 E3 G#3 A3 C#4 D4 D#4 F#4 G4 A4 C#5 D5 F#5 G5 G#5 B5 C6 D6 F#6 G6 B6 C7" unwords (map (pitch_pp_iso . midi_to_pitch pc_spell_sharp) m) == p
Nekuïa
let s = [24⋄0,14⋄2,22⋄3,31⋄4,28⋄7,29⋄9,19⋄10,25⋄13,24⋄14,26⋄17,23⋄21,24⋄10,30⋄9,35⋄17,29⋄24,32⋄25,30⋄29,26⋄21,30⋄17,31⋄16] let r = [2,1,1,3,2,1,3,1,2,1,4,3,1,4,1,4,1,3,1,4,1,3,1,4,1,4,1,1,3,1,3,1,2,3,1,4,1,4,4,1] differentiate (buildn 41 (union s)) == r let a0 = octpc_to_midi (0,9) let m = scanl (+) a0 r import Music.Theory.Pitch.Spelling.Table let p = "A0 B0 C1 C#1 E1 F#1 G1 A#1 B1 C#2 D2 F#2 A2 A#2 D3 D#3 G3 G#3 B3 C4 E4 F4 G#4 A4 C#5 D5 F#5 G5 G#5 B5 C6 D#6 E6 F#6 A6 A#6 D7 D#7 G7 B7 C8" unwords (map (pitch_pp_iso . midi_to_pitch pc_spell_sharp) m) == p
let s = [8⋄0∩3⋄0,2⋄0∩7⋄2,2⋄1∩11⋄3,31⋄4,4⋄3∩7⋄0,29⋄9,19⋄10,25⋄13,8⋄6∩3⋄2,2⋄1∩13⋄4,23⋄21,8⋄2∩3⋄1,2⋄1∩3⋄0∩5⋄4,5⋄2∩7⋄3,29⋄24,32⋄25,2⋄1∩3⋄2∩5⋄4,2⋄1∩13⋄8,2⋄1∩3⋄2∩5⋄2,31⋄16] differentiate (buildn 41 (union s)) == r
Major scale:
let s = (c(3⋄2) ∩ 4⋄0) ∪ (c(3⋄1) ∩ 4⋄1) ∪ (3⋄2 ∩ 4⋄2) ∪ (c(3⋄0) ∩ 4⋄3) buildn 7 s == [0,2,4,5,7,9,11]
Nomos Alpha:
let s = (c (13⋄3 ∪ 13⋄5 ∪ 13⋄7 ∪ 13⋄9) ∩ 11⋄2) ∪ (c (11⋄4 ∪ 11⋄8) ∩ 13⋄9) ∪ (13⋄0 ∪ 13⋄1 ∪ 13⋄6) let r = [0,1,2,6,9,13,14,19,22,24,26,27,32,35,39,40,45,52,53,58,61,65,66,71,78,79,84,87,90,91,92,97] buildn 32 s == r
differentiate :: Num a => [a] -> [a] Source #
Standard differentiation function.
differentiate [1,3,6,10] == [2,3,4] differentiate [0,2,4,5,7,9,11,12] == [2,2,1,2,2,2,1]
euclid :: Integral a => a -> a -> a Source #
Euclid's algorithm for computing the greatest common divisor.
euclid 1989 867 == 51
de_meziriac :: Integral a => a -> a -> a Source #
Bachet De Méziriac's algorithm.
de_meziriac 15 4 == 3 && euclid 15 4 == 1
reduce_intersection :: Integral t => (t, t) -> (t, t) -> Maybe (t, t) Source #
Attempt to reduce the Intersection
of two L
nodes to a singular L
node.
reduce_intersection (3,2) (4,7) == Just (12,11) reduce_intersection (12,11) (6,11) == Just (12,11) reduce_intersection (12,11) (8,7) == Just (24,23)
reduce :: Sieve -> Sieve Source #
Reduce the number of nodes at a Sieve
.
reduce (L (3,2) ∪ Empty) == L (3,2) reduce (L (3,2) ∩ Empty) == L (3,2) reduce (L (3,2) ∩ L (4,7)) == L (12,11) reduce (L (6,9) ∩ L (15,18)) == L (30,3)
let s = 3⋄2∩4⋄7∩6⋄11∩8⋄7 ∪ 6⋄9∩15⋄18 ∪ 13⋄5∩8⋄6∩4⋄2 ∪ 6⋄9∩15⋄19 reduce s == (24⋄23 ∪ 30⋄3 ∪ 104⋄70)
putStrLn $ sieve_pp (reduce s)
let s = 3⋄2∩4⋄7∩6⋄11∩8⋄7 ∪ 6⋄9∩15⋄18 ∪ 13⋄5∩8⋄6∩4⋄2 ∪ 6⋄9∩15⋄19 reduce s == (24⋄23 ∪ 30⋄3 ∪ 104⋄70)
Literature
psappha_flint_c :: [Sieve] Source #
psappha_flint :: Sieve Source #
Psappha (Flint)
let r = [0,1,3,4,6,8,10,11,12,13,14,16,17,19,20,22,23,25,27,28,29,31,33,35,36,37,38] buildn 27 psappha_flint == r
a_r_squibbs_c :: [Sieve] Source #
a_r_squibbs :: Sieve Source #
À R. (Hommage à Maurice Ravel) (Squibbs, 1996)
let r = [0,2,3,4,7,9,10,13,14,16,17,21,23,25,29,30,32,34,35,38,39,43,44,47,48,52,53,57,58,59,62,63,66,67,69,72,73,77,78,82,86,87] buildn 42 a_r_squibbs == r