ruby-mext 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mext/music/pitch_class.rb +57 -13
- data/lib/mext/numeric/constants.rb +34 -0
- data/lib/mext/numeric/mtopch.rb +17 -4
- data/lib/mext/numeric/pchtom.rb +0 -3
- data/lib/mext/numeric.rb +1 -0
- data/lib/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d32aaa3192a101dd9ca1c51d9a9971de58e8b1d169101421fdc2bae2d3bab010
|
4
|
+
data.tar.gz: 9ba50c10d8f2681d37e5064b72d7767709fd902dd212a409044aeb6902438145
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d92e921aed9ef6c445a341272382c60a2eac3d8f0fb7e3d8f78e61dc328036416bea8b8c8e5131d47fc97e72abb4e28215fc5bbcaa02bd91ca533d450db0875
|
7
|
+
data.tar.gz: ee4884242a2344ec9790755fb5cde3df9d1327da33c3dba1af0706a8c2f9b14223e88c1aa693db1b5d304d2539e59ea3057e96d3cd696e77576acebf52e54bf1
|
@@ -6,15 +6,19 @@ module Mext
|
|
6
6
|
attr_reader :octave, :semi
|
7
7
|
|
8
8
|
#
|
9
|
-
# +Mext::Music::PitchClass.new(float_value)
|
9
|
+
# +Mext::Music::PitchClass.new(float_value, semi = nil)+:
|
10
10
|
#
|
11
11
|
# pitch class object, where argument is:
|
12
12
|
#
|
13
13
|
# +float_value+: a pitch class in float notation (i.e. 8.00 for middle C, etc.)
|
14
|
+
# +or+ an octave value when given in octave, semi pair (see below)
|
15
|
+
# +semi+: (optional) when this argument is not nil, then it is assumed
|
16
|
+
# that the first argument is the octave, and this one is the
|
17
|
+
# semitone value
|
14
18
|
#
|
15
19
|
#:nodoc:
|
16
|
-
def initialize(fv)
|
17
|
-
|
20
|
+
def initialize(fv, semi = nil)
|
21
|
+
semi ? setup_with_two_arguments(fv, semi) : setup_with_one_argument(fv)
|
18
22
|
end
|
19
23
|
|
20
24
|
#:doc:
|
@@ -29,7 +33,7 @@ module Mext
|
|
29
33
|
# we suppose here that the pitch_class data is well-formed inside the
|
30
34
|
# object
|
31
35
|
#
|
32
|
-
self.octave + (self.semi /
|
36
|
+
self.octave + (self.semi / ::Numeric::PCC)
|
33
37
|
end
|
34
38
|
|
35
39
|
#:doc:
|
@@ -59,11 +63,14 @@ module Mext
|
|
59
63
|
# +\+(other)+ (operator plus)
|
60
64
|
#
|
61
65
|
# sums two pitch classes
|
62
|
-
#
|
63
66
|
#
|
64
67
|
#:nodoc:
|
65
68
|
def +(other)
|
66
|
-
|
69
|
+
octave = (self.to_semitones + other.to_semitones) / 12.0
|
70
|
+
octave = octave >= 0.0 ? octave.floor : octave.ceil
|
71
|
+
semis = (self.to_semitones + other.to_semitones) % 12.0
|
72
|
+
phase = octave >= 0.0 ? 1 : -1
|
73
|
+
PitchClass.new(octave, phase*semis)
|
67
74
|
end
|
68
75
|
|
69
76
|
#:doc:
|
@@ -75,7 +82,8 @@ module Mext
|
|
75
82
|
#
|
76
83
|
#:nodoc:
|
77
84
|
def -(other)
|
78
|
-
|
85
|
+
tot_semi = self.to_semitones - other.to_semitones
|
86
|
+
PitchClass.new(0.0, tot_semi)
|
79
87
|
end
|
80
88
|
|
81
89
|
#:doc:
|
@@ -100,6 +108,17 @@ module Mext
|
|
100
108
|
other.to_semitones - self.to_semitones
|
101
109
|
end
|
102
110
|
|
111
|
+
#:doc:
|
112
|
+
#
|
113
|
+
# +transpose(semitones)+
|
114
|
+
#
|
115
|
+
# returns the transposition in semitones
|
116
|
+
#
|
117
|
+
#:nodoc:
|
118
|
+
def transpose(semi)
|
119
|
+
self + PitchClass.new(0.0, semi)
|
120
|
+
end
|
121
|
+
|
103
122
|
class << self
|
104
123
|
|
105
124
|
#:doc:
|
@@ -117,13 +136,38 @@ module Mext
|
|
117
136
|
|
118
137
|
private
|
119
138
|
|
120
|
-
def
|
121
|
-
|
122
|
-
s
|
123
|
-
@octave += (s/12.0).floor
|
124
|
-
@semi = s % 12.0
|
139
|
+
def setup_with_one_argument(fval)
|
140
|
+
(o, s) = separate_oct_semi(fval)
|
141
|
+
setup_with_two_arguments(o, s)
|
125
142
|
end
|
126
|
-
|
143
|
+
|
144
|
+
def separate_oct_semi(fval)
|
145
|
+
octave = fval >= 0.0 ? fval.floor : fval.ceil
|
146
|
+
s = (fval-octave) * ::Numeric::PCC
|
147
|
+
[octave, s]
|
148
|
+
end
|
149
|
+
|
150
|
+
#
|
151
|
+
# +setup_with_two_arguments(oct, semi)+:
|
152
|
+
#
|
153
|
+
# we must make sure that the two values are congruent, that is:
|
154
|
+
# +oct+ is a float number and +semi+ is between 0..11.999999
|
155
|
+
# taking into account that pitch classes can be positive or negative
|
156
|
+
#
|
157
|
+
def setup_with_two_arguments(oct, s)
|
158
|
+
octsemi = (s / 12.0)
|
159
|
+
octsemi = case
|
160
|
+
when octsemi > 0.0 then octsemi.floor
|
161
|
+
when octsemi < 0.0 then octsemi.ceil
|
162
|
+
when octsemi == 0.0 then 0.0
|
163
|
+
end
|
164
|
+
oct += octsemi
|
165
|
+
remainder = s >= 0.0 ? (s % 12.0) : (s % -12.0)
|
166
|
+
@octave = oct
|
167
|
+
@semi = remainder
|
168
|
+
self
|
169
|
+
end
|
170
|
+
|
127
171
|
end
|
128
172
|
|
129
173
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class Numeric
|
2
|
+
|
3
|
+
#
|
4
|
+
# a set of constants needed for pitch classes and MIDI
|
5
|
+
#
|
6
|
+
|
7
|
+
#
|
8
|
+
# +MIDI_MIDDLE_C+: the central C (Do) in MIDI jargon
|
9
|
+
#
|
10
|
+
MIDI_MIDDLE_C = 60
|
11
|
+
|
12
|
+
#
|
13
|
+
# +PITCH_MIDDLE_C+: the central C (Do) in pitch-class jargon
|
14
|
+
#
|
15
|
+
PITCH_MIDDLE_C = 8.0
|
16
|
+
|
17
|
+
#
|
18
|
+
# +CHROMATIC_NOTES_PER_OCTAVE+ (short: +CNPO+): the number of notes per octave
|
19
|
+
#
|
20
|
+
CHROMATIC_NOTES_PER_OCTAVE = CNPO = 12.0
|
21
|
+
|
22
|
+
#
|
23
|
+
# +ZERO_MIDI_PITCH+ (short: +ZMP+): where does the +0.00+ pitch-class reside
|
24
|
+
# in terms of midi notes
|
25
|
+
#
|
26
|
+
ZERO_MIDI_PITCH = ZMP = MIDI_MIDDLE_C - (PITCH_MIDDLE_C * CNPO)
|
27
|
+
|
28
|
+
#
|
29
|
+
# +PITCH_CLASS_CENTS+ (short: +PCC+): the number of parts in every semitone
|
30
|
+
#
|
31
|
+
PITCH_CLASS_CENTS = PCC = 100.0
|
32
|
+
|
33
|
+
|
34
|
+
end
|
data/lib/mext/numeric/mtopch.rb
CHANGED
@@ -9,12 +9,25 @@ class Numeric
|
|
9
9
|
|
10
10
|
def mtopch
|
11
11
|
|
12
|
-
|
12
|
+
semi = (self - ZMP) / CNPO
|
13
|
+
oct = semi.to_i
|
14
|
+
semi = (semi - oct) * CNPO
|
15
|
+
semi %= CNPO
|
16
|
+
semi = (self > ZMP) ? semi : -((CNPO - semi) % CNPO)
|
13
17
|
|
14
|
-
|
15
|
-
|
18
|
+
oct + (semi / PCC)
|
19
|
+
|
20
|
+
# intv = self - MIDI_MIDDLE_C
|
21
|
+
# intv /= CHROMATIC_NOTES_PER_OCTAVE
|
22
|
+
|
23
|
+
# intv_octave = intv.floor
|
24
|
+
# intv_semi = (intv_octave >= 0.0) ? (intv - intv_octave) : (1 - (intv_octave - intv))
|
25
|
+
#
|
26
|
+
# intv_semi *= CHROMATIC_NOTES_PER_OCTAVE;
|
27
|
+
# intv_semi %= CHROMATIC_NOTES_PER_OCTAVE;
|
28
|
+
|
29
|
+
# PITCH_MIDDLE_C + intv_octave + (intv_semi/100.0);
|
16
30
|
|
17
|
-
PITCH_MIDDLE_C + intv_octave + (intv_semi/100.0);
|
18
31
|
end
|
19
32
|
|
20
33
|
end
|
data/lib/mext/numeric/pchtom.rb
CHANGED
data/lib/mext/numeric.rb
CHANGED
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-mext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicola Bernardini
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-05-
|
11
|
+
date: 2019-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -127,6 +127,7 @@ files:
|
|
127
127
|
- lib/mext/music/pitch_class.rb
|
128
128
|
- lib/mext/numeric.rb
|
129
129
|
- lib/mext/numeric/ampdb.rb
|
130
|
+
- lib/mext/numeric/constants.rb
|
130
131
|
- lib/mext/numeric/cpspch.rb
|
131
132
|
- lib/mext/numeric/dbamp.rb
|
132
133
|
- lib/mext/numeric/ftom.rb
|