ruby-mext 0.9.0 → 0.9.1
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.
- 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
|