peas 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/peas/integer_helper.rb +96 -0
- data/lib/peas/interval.rb +99 -0
- data/lib/peas/pitch.rb +104 -0
- data/lib/peas/pitch_class.rb +69 -0
- data/lib/peas/version.rb +5 -0
- data/lib/peas.rb +7 -0
- metadata +69 -0
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'peas/interval'
|
2
|
+
|
3
|
+
class Integer
|
4
|
+
def unisons
|
5
|
+
Peas::Interval::Diatonic::P1
|
6
|
+
end
|
7
|
+
alias unison unisons
|
8
|
+
|
9
|
+
def semitones
|
10
|
+
Peas::Interval::Semitone "S#{self}", self
|
11
|
+
end
|
12
|
+
alias semitone semitones
|
13
|
+
|
14
|
+
def minor_seconds
|
15
|
+
Peas::Interval::Diatonic "m2x#{self}", self
|
16
|
+
end
|
17
|
+
alias minor_second minor_seconds
|
18
|
+
|
19
|
+
def wholetones
|
20
|
+
Peas::Interval::Wholetone "W#{self}", self * 2
|
21
|
+
end
|
22
|
+
alias wholetone wholetones
|
23
|
+
|
24
|
+
def major_seconds
|
25
|
+
Peas::Interval::Diatonic "M2x#{self}", self * 2
|
26
|
+
end
|
27
|
+
alias major_second major_seconds
|
28
|
+
|
29
|
+
def minor_thirds
|
30
|
+
Peas::Interval::Diatonic "m3x#{self}", self * 3
|
31
|
+
end
|
32
|
+
alias minor_third minor_thirds
|
33
|
+
|
34
|
+
def major_thirds
|
35
|
+
Peas::Interval::Diatonic "M3x#{self}", self * 4
|
36
|
+
end
|
37
|
+
alias major_third major_thirds
|
38
|
+
|
39
|
+
def perfect_fourths
|
40
|
+
Peas::Interval::Diatonic "P4x#{self}", self * 5
|
41
|
+
end
|
42
|
+
alias perfect_fourth perfect_fourths
|
43
|
+
|
44
|
+
def tritones
|
45
|
+
# Peas::Interval::Latin "TTx#{self}", self * 6
|
46
|
+
self * 6
|
47
|
+
end
|
48
|
+
alias tritone tritones
|
49
|
+
|
50
|
+
def diminished_fifths
|
51
|
+
Peas::Interval::Diatonic "d5x#{self}", self * 6
|
52
|
+
end
|
53
|
+
alias diminished_fifth diminished_fifths
|
54
|
+
|
55
|
+
def augmented_fourths
|
56
|
+
Peas::Interval::Diatonic "S6x#{self}", self * 6
|
57
|
+
end
|
58
|
+
alias augmented_fourth augmented_fourths
|
59
|
+
|
60
|
+
def perfect_fifths
|
61
|
+
Peas::Interval::Diatonic "P5x#{self}", self * 7
|
62
|
+
end
|
63
|
+
alias perfect_fifth perfect_fifths
|
64
|
+
|
65
|
+
def minor_sixths
|
66
|
+
Peas::Interval::Diatonic "m6x#{self}", self * 8
|
67
|
+
end
|
68
|
+
alias minor_sixth minor_sixths
|
69
|
+
|
70
|
+
def augmented_fifths
|
71
|
+
Peas::Interval::Chromatic "S8x#{self}", self * 8
|
72
|
+
end
|
73
|
+
alias augmented_fifth augmented_fifths
|
74
|
+
|
75
|
+
def major_sixths
|
76
|
+
Peas::Interval::Diatonic "M6x#{self}", self * 9
|
77
|
+
end
|
78
|
+
alias major_sixth major_sixths
|
79
|
+
|
80
|
+
def minor_sevenths
|
81
|
+
Peas::Interval::Diatonic "m7x#{self}", self * 10
|
82
|
+
end
|
83
|
+
alias minor_seventh minor_sevenths
|
84
|
+
|
85
|
+
def major_sevenths
|
86
|
+
Peas::Interval::Diatonic "M7x#{self}", self * 11
|
87
|
+
end
|
88
|
+
alias major_seventh major_sevenths
|
89
|
+
|
90
|
+
def octaves
|
91
|
+
Peas::Interval::Diatonic "P8x#{self}", self * 12
|
92
|
+
end
|
93
|
+
alias octave octaves
|
94
|
+
end
|
95
|
+
|
96
|
+
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'named_value_class'
|
2
|
+
require 'peas/pitch'
|
3
|
+
|
4
|
+
module Peas
|
5
|
+
module Interval
|
6
|
+
# see: http://en.wikipedia.org/wiki/Interval_(music)
|
7
|
+
|
8
|
+
NamedValueClass 'Semitone', Fixnum
|
9
|
+
128.times do |x|
|
10
|
+
Semitone "S#{x}", x
|
11
|
+
end
|
12
|
+
|
13
|
+
NamedValueClass 'Wholetone', Fixnum
|
14
|
+
64.times do |x|
|
15
|
+
Wholetone "W#{x}", x * 2
|
16
|
+
end
|
17
|
+
|
18
|
+
NamedValueClass 'Chromatic', Fixnum
|
19
|
+
Chromatic :d2, 0
|
20
|
+
Chromatic :A1, 1
|
21
|
+
Chromatic :d3, 2
|
22
|
+
Chromatic :A2, 3
|
23
|
+
Chromatic :d4, 4
|
24
|
+
Chromatic :A3, 5
|
25
|
+
Chromatic :d5, 6
|
26
|
+
Chromatic :A4, 6
|
27
|
+
Chromatic :d6, 7
|
28
|
+
Chromatic :A5, 8
|
29
|
+
Chromatic :d7, 9
|
30
|
+
Chromatic :A6, 10
|
31
|
+
Chromatic :d8, 11
|
32
|
+
Chromatic :A7, 12
|
33
|
+
|
34
|
+
NamedValueClass 'Latin', Fixnum
|
35
|
+
Latin 'S', 1
|
36
|
+
Latin 'T', 3
|
37
|
+
Latin 'TT', 6
|
38
|
+
|
39
|
+
NamedValueClass 'Diatonic', Fixnum do
|
40
|
+
def inverse
|
41
|
+
case @name
|
42
|
+
when 'P1' then Diatonic::P8
|
43
|
+
when 'm2' then Diatonic::M7
|
44
|
+
when 'M2' then Diatonic::m7
|
45
|
+
when 'm3' then Diatonic::M6
|
46
|
+
when 'M3' then Diatonic::m6
|
47
|
+
when 'P4' then Diatonic::P5
|
48
|
+
when 'A4' then Diatonic::d5
|
49
|
+
when 'd5' then Diatonic::A4
|
50
|
+
when 'P5' then Diatonic::P4
|
51
|
+
when 'm6' then Diatonic::M3
|
52
|
+
when 'M6' then Diatonic::m3
|
53
|
+
when 'm7' then Diatonic::M2
|
54
|
+
when 'M7' then Diatonic::m2
|
55
|
+
when 'P8' then Diatonic::P1
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def interval_class
|
60
|
+
if (mod_12 = self % 12) > 6
|
61
|
+
12 - mod_12
|
62
|
+
else
|
63
|
+
mod_12
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
Diatonic 'P1', 0
|
68
|
+
Diatonic 'm2', 1
|
69
|
+
Diatonic 'M2', 2
|
70
|
+
Diatonic 'm3', 3
|
71
|
+
Diatonic 'M3', 4
|
72
|
+
Diatonic 'P4', 5
|
73
|
+
Diatonic 'A4', 6
|
74
|
+
Diatonic 'd5', 6
|
75
|
+
Diatonic 'P5', 7
|
76
|
+
Diatonic 'm6', 8
|
77
|
+
Diatonic 'M6', 9
|
78
|
+
Diatonic 'm7', 10
|
79
|
+
Diatonic 'M7', 11
|
80
|
+
Diatonic 'P8', 12
|
81
|
+
end
|
82
|
+
|
83
|
+
module Intervals
|
84
|
+
include Interval::Semitone::NamedValues
|
85
|
+
extend Interval::Semitone::NamedValues
|
86
|
+
|
87
|
+
include Interval::Wholetone::NamedValues
|
88
|
+
extend Interval::Wholetone::NamedValues
|
89
|
+
|
90
|
+
include Interval::Chromatic::NamedValues
|
91
|
+
extend Interval::Chromatic::NamedValues
|
92
|
+
|
93
|
+
include Interval::Latin::NamedValues
|
94
|
+
extend Interval::Latin::NamedValues
|
95
|
+
|
96
|
+
include Interval::Diatonic::NamedValues
|
97
|
+
extend Interval::Diatonic::NamedValues
|
98
|
+
end
|
99
|
+
end
|
data/lib/peas/pitch.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require 'peas/pitch_class'
|
3
|
+
|
4
|
+
module Peas
|
5
|
+
NamedValueClass 'Pitch', Fixnum do
|
6
|
+
extend Forwardable
|
7
|
+
def_delegators :pitch_class, :is_sharp?, :is_flat?, :is_natural?
|
8
|
+
|
9
|
+
def as_flat
|
10
|
+
self.class.flats(self)
|
11
|
+
end
|
12
|
+
|
13
|
+
def as_sharp
|
14
|
+
self.class.sharps(self)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.flats(value)
|
18
|
+
{
|
19
|
+
0 => C_1 , 32 => Ab1 , 64 => E4 , 96 => C7 ,
|
20
|
+
1 => Db_1 , 33 => A1 , 65 => F4 , 97 => Db7 ,
|
21
|
+
2 => D_1 , 34 => Bb1 , 66 => Gb4 , 98 => D7 ,
|
22
|
+
3 => Eb_1 , 35 => B1 , 67 => G4 , 99 => Eb7 ,
|
23
|
+
4 => E_1 , 36 => C2 , 68 => Ab4 , 100 => E7 ,
|
24
|
+
5 => F_1 , 37 => Db2 , 69 => A4 , 101 => F7 ,
|
25
|
+
6 => Gb_1 , 38 => D2 , 70 => Bb4 , 102 => Gb7 ,
|
26
|
+
7 => G_1 , 39 => Eb2 , 71 => B4 , 103 => G7 ,
|
27
|
+
8 => Ab_1 , 40 => E2 , 72 => C5 , 104 => Ab7 ,
|
28
|
+
9 => A_1 , 41 => F2 , 73 => Db5 , 105 => A7 ,
|
29
|
+
10 => Bb_1 , 42 => Gb2 , 74 => D5 , 106 => Bb7 ,
|
30
|
+
11 => B_1 , 43 => G2 , 75 => Eb5 , 107 => B7 ,
|
31
|
+
12 => C0 , 44 => Ab2 , 76 => E5 , 108 => C8 ,
|
32
|
+
13 => Db0 , 45 => A2 , 77 => F5 , 109 => Db8 ,
|
33
|
+
14 => D0 , 46 => Bb2 , 78 => Gb5 , 110 => D8 ,
|
34
|
+
15 => Eb0 , 47 => B2 , 79 => G5 , 111 => Eb8 ,
|
35
|
+
16 => E0 , 48 => C3 , 80 => Ab5 , 112 => E8 ,
|
36
|
+
17 => F0 , 49 => Db3 , 81 => A5 , 113 => F8 ,
|
37
|
+
18 => Gb0 , 50 => D3 , 82 => Bb5 , 114 => Gb8 ,
|
38
|
+
19 => G0 , 51 => Eb3 , 83 => B5 , 115 => G8 ,
|
39
|
+
20 => Ab0 , 52 => E3 , 84 => C6 , 116 => Ab8 ,
|
40
|
+
21 => A0 , 53 => F3 , 85 => Db6 , 117 => A8 ,
|
41
|
+
22 => Bb0 , 54 => Gb3 , 86 => D6 , 118 => Bb8 ,
|
42
|
+
23 => B0 , 55 => G3 , 87 => Eb6 , 119 => B8 ,
|
43
|
+
24 => C1 , 56 => Ab3 , 88 => E6 , 120 => C9 ,
|
44
|
+
25 => Db1 , 57 => A3 , 89 => F6 , 121 => Db9 ,
|
45
|
+
26 => D1 , 58 => Bb3 , 90 => Gb6 , 122 => D9 ,
|
46
|
+
27 => Eb1 , 59 => B3 , 91 => G6 , 123 => Eb9 ,
|
47
|
+
28 => E1 , 60 => C4 , 92 => Ab6 , 124 => E9 ,
|
48
|
+
29 => F1 , 61 => Db4 , 93 => A6 , 125 => F9 ,
|
49
|
+
30 => Gb1 , 62 => D4 , 94 => Bb6 , 126 => Gb9 ,
|
50
|
+
31 => G1 , 63 => Eb4 , 95 => B6 , 127 => G9
|
51
|
+
}[value]
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.sharps(value)
|
55
|
+
{
|
56
|
+
0 => C_1 , 32 => Gs1 , 64 => E4 , 96 => C7 ,
|
57
|
+
1 => Cs_1 , 33 => A1 , 65 => F4 , 97 => Cs7 ,
|
58
|
+
2 => D_1 , 34 => As1 , 66 => Fs4 , 98 => D7 ,
|
59
|
+
3 => Ds_1 , 35 => B1 , 67 => G4 , 99 => Ds7 ,
|
60
|
+
4 => E_1 , 36 => C2 , 68 => Gs4 , 100 => E7 ,
|
61
|
+
5 => F_1 , 37 => Cs2 , 69 => A4 , 101 => F7 ,
|
62
|
+
6 => Fs_1 , 38 => D2 , 70 => As4 , 102 => Fs7 ,
|
63
|
+
7 => G_1 , 39 => Ds2 , 71 => B4 , 103 => G7 ,
|
64
|
+
8 => Gs_1 , 40 => E2 , 72 => C5 , 104 => Gs7 ,
|
65
|
+
9 => A_1 , 41 => F2 , 73 => Cs5 , 105 => A7 ,
|
66
|
+
10 => As_1 , 42 => Fs2 , 74 => D5 , 106 => As7 ,
|
67
|
+
11 => B_1 , 43 => G2 , 75 => Ds5 , 107 => B7 ,
|
68
|
+
12 => C0 , 44 => Gs2 , 76 => E5 , 108 => C8 ,
|
69
|
+
13 => Cs0 , 45 => A2 , 77 => F5 , 109 => Cs8 ,
|
70
|
+
14 => D0 , 46 => As2 , 78 => Fs5 , 110 => D8 ,
|
71
|
+
15 => Ds0 , 47 => B2 , 79 => G5 , 111 => Ds8 ,
|
72
|
+
16 => E0 , 48 => C3 , 80 => Gs5 , 112 => E8 ,
|
73
|
+
17 => F0 , 49 => Cs3 , 81 => A5 , 113 => F8 ,
|
74
|
+
18 => Fs0 , 50 => D3 , 82 => As5 , 114 => Fs8 ,
|
75
|
+
19 => G0 , 51 => Ds3 , 83 => B5 , 115 => G8 ,
|
76
|
+
20 => Gs0 , 52 => E3 , 84 => C6 , 116 => Gs8 ,
|
77
|
+
21 => A0 , 53 => F3 , 85 => Cs6 , 117 => A8 ,
|
78
|
+
22 => As0 , 54 => Fs3 , 86 => D6 , 118 => As8 ,
|
79
|
+
23 => B0 , 55 => G3 , 87 => Ds6 , 119 => B8 ,
|
80
|
+
24 => C1 , 56 => Gs3 , 88 => E6 , 120 => C9 ,
|
81
|
+
25 => Cs1 , 57 => A3 , 89 => F6 , 121 => Cs9 ,
|
82
|
+
26 => D1 , 58 => As3 , 90 => Fs6 , 122 => D9 ,
|
83
|
+
27 => Ds1 , 59 => B3 , 91 => G6 , 123 => Ds9 ,
|
84
|
+
28 => E1 , 60 => C4 , 92 => Gs6 , 124 => E9 ,
|
85
|
+
29 => F1 , 61 => Cs4 , 93 => A6 , 125 => F9 ,
|
86
|
+
30 => Fs1 , 62 => D4 , 94 => As6 , 126 => Fs9 ,
|
87
|
+
31 => G1 , 63 => Ds4 , 95 => B6 , 127 => G9
|
88
|
+
}[value]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
PitchClass::NamedValues::Collection.each do |pclass|
|
92
|
+
Pitch "#{pclass}_1", pclass, pitch_class:pclass, octave:-1
|
93
|
+
0.upto(9) do |octave|
|
94
|
+
name = pclass.to_s + octave.to_s
|
95
|
+
Pitch name, (((octave+1)*12)+pclass), pitch_class:pclass, octave:octave
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
module Pitches
|
100
|
+
include Pitch::NamedValues
|
101
|
+
include PitchClass::NamedValues
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'named_value_class'
|
2
|
+
|
3
|
+
module Peas
|
4
|
+
NamedValueClass 'PitchClass', Fixnum do
|
5
|
+
def is_sharp?
|
6
|
+
%w|Bs Cs Ds Es Fs Gs As|.include? @name
|
7
|
+
end
|
8
|
+
|
9
|
+
def is_flat?
|
10
|
+
%w|Bb Cb Db Eb Fb Gb Ab|.include? @name
|
11
|
+
end
|
12
|
+
|
13
|
+
def is_natural?
|
14
|
+
%w|B C D E F G A|.include? @name
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.flats(value)
|
18
|
+
{
|
19
|
+
0 => C, 6 => Gb,
|
20
|
+
1 => Db, 7 => G,
|
21
|
+
2 => D, 8 => Ab,
|
22
|
+
3 => Eb, 9 => A,
|
23
|
+
4 => E, 10 => Bb,
|
24
|
+
5 => F, 11 => B
|
25
|
+
}[value]
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.sharps(value)
|
29
|
+
{
|
30
|
+
0 => C, 6 => Fs,
|
31
|
+
1 => Cs, 7 => G,
|
32
|
+
2 => D, 8 => Gs,
|
33
|
+
3 => Ds, 9 => A,
|
34
|
+
4 => E, 10 => As,
|
35
|
+
5 => F, 11 => B
|
36
|
+
}[value]
|
37
|
+
end
|
38
|
+
|
39
|
+
def as_flat
|
40
|
+
self.class.flats(self)
|
41
|
+
end
|
42
|
+
|
43
|
+
def as_sharp
|
44
|
+
self.class.sharps(self)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
PitchClass 'Bs', 0 # B sharp is just Bs
|
49
|
+
PitchClass 'C', 0
|
50
|
+
PitchClass 'Cs', 1
|
51
|
+
PitchClass 'Db', 1
|
52
|
+
PitchClass 'D', 2
|
53
|
+
PitchClass 'Ds', 3
|
54
|
+
PitchClass 'Eb', 3
|
55
|
+
PitchClass 'E', 4
|
56
|
+
PitchClass 'Es', 5
|
57
|
+
PitchClass 'Fb', 4
|
58
|
+
PitchClass 'F', 5
|
59
|
+
PitchClass 'Fs', 6
|
60
|
+
PitchClass 'Gb', 6
|
61
|
+
PitchClass 'G', 7
|
62
|
+
PitchClass 'Gs', 8
|
63
|
+
PitchClass 'Ab', 8
|
64
|
+
PitchClass 'A', 9
|
65
|
+
PitchClass 'As', 10
|
66
|
+
PitchClass 'Bb', 10
|
67
|
+
PitchClass 'B', 11
|
68
|
+
PitchClass 'Cb', 11
|
69
|
+
end
|
data/lib/peas/version.rb
ADDED
data/lib/peas.rb
ADDED
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: peas
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Michael Garriss
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-11-17 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: named_value_class
|
16
|
+
requirement: &2156329420 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0.4'
|
22
|
+
- - ! '>='
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 0.4.0
|
25
|
+
type: :runtime
|
26
|
+
prerelease: false
|
27
|
+
version_requirements: *2156329420
|
28
|
+
description: ! 'Peas defines constants from music theory and allows one to perform
|
29
|
+
math with them. Currently supports pitches (as MIDI values), pitch classes, and
|
30
|
+
intervals using semitones, wholetones, chromatic, latin or diatonic
|
31
|
+
|
32
|
+
abbreviations.'
|
33
|
+
email: mgarriss@gmail.com
|
34
|
+
executables: []
|
35
|
+
extensions: []
|
36
|
+
extra_rdoc_files: []
|
37
|
+
files:
|
38
|
+
- lib/peas/integer_helper.rb
|
39
|
+
- lib/peas/interval.rb
|
40
|
+
- lib/peas/pitch.rb
|
41
|
+
- lib/peas/pitch_class.rb
|
42
|
+
- lib/peas/version.rb
|
43
|
+
- lib/peas.rb
|
44
|
+
homepage: http://github.com/mgarriss/peas
|
45
|
+
licenses: []
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
requirements: []
|
63
|
+
rubyforge_project:
|
64
|
+
rubygems_version: 1.8.11
|
65
|
+
signing_key:
|
66
|
+
specification_version: 3
|
67
|
+
summary: Peas defines constants from music theory and allows one to perform math with
|
68
|
+
them.
|
69
|
+
test_files: []
|