ruby-mext 0.10.0 → 0.10.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 +112 -34
- data/lib/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 333432c69cb5c931d71693a145648130e816cdfb17bc5a2b72965fcee4e6760c
|
4
|
+
data.tar.gz: 3b2d6f694370f4864702ff8e3c7d46fbf3343438cb8f6475c430471a4007afb2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec7603a7aef497e79f6ac624f5ed3a988f0ab1842f2520739ef0ef863ca5e3ebf29dec52d790e119537cf1f4168c98cddbee1a8dc42c380a6ddf9bc3f32f8db5
|
7
|
+
data.tar.gz: 955887187d5738f7470b9d1999d412156d76f5ae561c8db89d9a912649375e9e1c51aff040c1e07447977e1b7f09e84feaa3487cbd81b7916b38e32fcfe0d9d8
|
@@ -1,10 +1,25 @@
|
|
1
1
|
module Mext
|
2
2
|
module Music
|
3
3
|
|
4
|
+
#
|
5
|
+
# +Mext::Music::PitchClass+
|
6
|
+
#
|
7
|
+
# this is a representation of pitches in the usual +PitchClass+
|
8
|
+
# representation of +csound+ and other software
|
9
|
+
#
|
10
|
+
# Internally, the representation is in semitones. In order to be
|
11
|
+
# consistent with the +csound+ representation, a +PitchClass+ of
|
12
|
+
# +8.00+ represents +central C4+ (+ca. 261.3 Hz+, depending on tuning),
|
13
|
+
# while a +PitchClass+ of +0.00+ is 96 semitones below (8 * 12).
|
14
|
+
#
|
15
|
+
# The internal representation allows for floating point values, negative
|
16
|
+
# values etc. However, since the +PitchClass+ is a geometric
|
17
|
+
# representation of pitches, it will never produce a negative
|
18
|
+
# frequency value (for semitones that go to -Inf., it'll produce
|
19
|
+
# infinitely small positive values.
|
20
|
+
#
|
4
21
|
class PitchClass
|
5
22
|
|
6
|
-
attr_reader :octave, :semi
|
7
|
-
|
8
23
|
#
|
9
24
|
# +Mext::Music::PitchClass.new(float_value, semi = nil)+:
|
10
25
|
#
|
@@ -18,7 +33,40 @@ module Mext
|
|
18
33
|
#
|
19
34
|
#:nodoc:
|
20
35
|
def initialize(fv, semi = nil)
|
21
|
-
semi ? setup_with_two_arguments(fv, semi) : setup_with_one_argument(fv)
|
36
|
+
@semi = semi ? setup_with_two_arguments(fv, semi) : setup_with_one_argument(fv)
|
37
|
+
end
|
38
|
+
|
39
|
+
#:doc:
|
40
|
+
#
|
41
|
+
# +octave+
|
42
|
+
#
|
43
|
+
# returns the octave part of the pitch class
|
44
|
+
#
|
45
|
+
def octave
|
46
|
+
res = @semi / ::Numeric::CNPO
|
47
|
+
res >= 0.0 ? res.floor : res.ceil
|
48
|
+
end
|
49
|
+
|
50
|
+
#:doc:
|
51
|
+
#
|
52
|
+
# +semi+
|
53
|
+
#
|
54
|
+
# returns the semitone part of the pitch class
|
55
|
+
#
|
56
|
+
def semi
|
57
|
+
@semi >= 0.0 ? (@semi % 12.0) : (@semi % -12.0)
|
58
|
+
end
|
59
|
+
|
60
|
+
#:doc:
|
61
|
+
#
|
62
|
+
# +inner_representation+
|
63
|
+
#
|
64
|
+
# returns the inner representation in semitones (this is a public method
|
65
|
+
# since it is used in several comparison methods)
|
66
|
+
#
|
67
|
+
#:no_doc:
|
68
|
+
def inner_representation
|
69
|
+
@semi
|
22
70
|
end
|
23
71
|
|
24
72
|
#:doc:
|
@@ -29,11 +77,7 @@ module Mext
|
|
29
77
|
#
|
30
78
|
#:nodoc:
|
31
79
|
def to_f
|
32
|
-
|
33
|
-
# we suppose here that the pitch_class data is well-formed inside the
|
34
|
-
# object
|
35
|
-
#
|
36
|
-
self.octave + (self.semi / ::Numeric::PCC)
|
80
|
+
self.inner_representation.semitopch
|
37
81
|
end
|
38
82
|
|
39
83
|
#:doc:
|
@@ -44,7 +88,7 @@ module Mext
|
|
44
88
|
#
|
45
89
|
#:nodoc:
|
46
90
|
def to_freq
|
47
|
-
self.
|
91
|
+
self.inner_representation.semitopch.pchcps
|
48
92
|
end
|
49
93
|
|
50
94
|
#:doc:
|
@@ -55,7 +99,7 @@ module Mext
|
|
55
99
|
#:nodoc:
|
56
100
|
[:>, :>=, :<, :<=, :<=>, :==, :!=, :=== ].each do
|
57
101
|
|op|
|
58
|
-
define_method(op) { |other| self.
|
102
|
+
define_method(op) { |other| self.inner_representation.send(op, other.inner_representation) }
|
59
103
|
end
|
60
104
|
|
61
105
|
#:doc:
|
@@ -66,11 +110,7 @@ module Mext
|
|
66
110
|
#
|
67
111
|
#:nodoc:
|
68
112
|
def +(other)
|
69
|
-
|
70
|
-
octave = octave >= 0.0 ? octave.floor : octave.ceil
|
71
|
-
semis = (self.to_semitones + other.to_semitones).cround % 12.0
|
72
|
-
phase = octave >= 0.0 ? 1 : -1
|
73
|
-
PitchClass.new(octave, phase*semis)
|
113
|
+
self.class.create_from_semitones((self.inner_representation + other.inner_representation).cround)
|
74
114
|
end
|
75
115
|
|
76
116
|
#:doc:
|
@@ -82,8 +122,7 @@ module Mext
|
|
82
122
|
#
|
83
123
|
#:nodoc:
|
84
124
|
def -(other)
|
85
|
-
|
86
|
-
PitchClass.new(0.0, tot_semi)
|
125
|
+
self.class.create_from_semitones((self.inner_representation - other.inner_representation).cround)
|
87
126
|
end
|
88
127
|
|
89
128
|
#:doc:
|
@@ -92,9 +131,7 @@ module Mext
|
|
92
131
|
#
|
93
132
|
# returns the +PitchClass+ to a number of semitones
|
94
133
|
#
|
95
|
-
|
96
|
-
self.to_f.pchtosemi
|
97
|
-
end
|
134
|
+
alias_method :to_semitones, :inner_representation
|
98
135
|
|
99
136
|
#:doc:
|
100
137
|
#
|
@@ -105,18 +142,30 @@ module Mext
|
|
105
142
|
#
|
106
143
|
#:nodoc:
|
107
144
|
def interval(other)
|
108
|
-
other
|
145
|
+
(other - self).inner_representation
|
109
146
|
end
|
110
147
|
|
111
148
|
#:doc:
|
112
149
|
#
|
113
150
|
# +transpose(semitones)+
|
114
151
|
#
|
115
|
-
# returns
|
152
|
+
# returns a +PitchClass+ transposed by +semitones+ semitones
|
116
153
|
#
|
117
154
|
#:nodoc:
|
118
155
|
def transpose(semi)
|
119
|
-
self
|
156
|
+
self.class.create_from_semitones((self.inner_representation + semi).cround)
|
157
|
+
end
|
158
|
+
|
159
|
+
#:doc:
|
160
|
+
#
|
161
|
+
# +transpose!(semitones)+
|
162
|
+
#
|
163
|
+
# transposes the receiver by +semitones+ semitones
|
164
|
+
#
|
165
|
+
#:nodoc:
|
166
|
+
def transpose!(semi)
|
167
|
+
@semi += semi
|
168
|
+
self
|
120
169
|
end
|
121
170
|
|
122
171
|
#:doc:
|
@@ -132,7 +181,46 @@ module Mext
|
|
132
181
|
self.interval(other) * prop
|
133
182
|
end
|
134
183
|
|
184
|
+
#:doc:
|
185
|
+
#
|
186
|
+
# +add_semitones(semi)+:
|
187
|
+
#
|
188
|
+
# returns a +PitchClass+ the addition of semitones required by argument
|
189
|
+
#
|
190
|
+
# - +semi+: the semitones to add; can be any sort of +Numeric+, also
|
191
|
+
# negative to subtract.
|
192
|
+
#
|
193
|
+
def add_semitones(semi)
|
194
|
+
self.class.create_from_semitones((self.inner_representation + semi).cround)
|
195
|
+
end
|
196
|
+
|
197
|
+
#:doc:
|
198
|
+
#
|
199
|
+
# +add_semitones!(semi)+:
|
200
|
+
#
|
201
|
+
# returns the addition of semitones required in the receiver's pitch class
|
202
|
+
#
|
203
|
+
# - +semi+: the semitones to add; can be any sort of +Numeric+, also
|
204
|
+
# negative to subtract.
|
205
|
+
#
|
206
|
+
def add_semitones!(semi)
|
207
|
+
@semi += semi
|
208
|
+
self
|
209
|
+
end
|
210
|
+
|
135
211
|
class << self
|
212
|
+
|
213
|
+
#:doc:
|
214
|
+
#
|
215
|
+
# +create_from_semitones+
|
216
|
+
#
|
217
|
+
# creates a +PitchClass+ object out of a semitone representation
|
218
|
+
#
|
219
|
+
#:nodoc:
|
220
|
+
def create_from_semitones(s)
|
221
|
+
new(0.0, s)
|
222
|
+
end
|
223
|
+
|
136
224
|
|
137
225
|
#:doc:
|
138
226
|
#
|
@@ -172,17 +260,7 @@ module Mext
|
|
172
260
|
# taking into account that pitch classes can be positive or negative
|
173
261
|
#
|
174
262
|
def setup_with_two_arguments(oct, s)
|
175
|
-
|
176
|
-
octsemi = case
|
177
|
-
when octsemi > 0.0 then octsemi.floor
|
178
|
-
when octsemi < 0.0 then octsemi.ceil
|
179
|
-
when octsemi == 0.0 then 0.0
|
180
|
-
end
|
181
|
-
oct += octsemi
|
182
|
-
remainder = s >= 0.0 ? (s % 12.0) : (s % -12.0)
|
183
|
-
@octave = oct
|
184
|
-
@semi = remainder
|
185
|
-
self
|
263
|
+
(oct * ::Numeric::CNPO) + s
|
186
264
|
end
|
187
265
|
|
188
266
|
end
|
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.10.
|
4
|
+
version: 0.10.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-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|