ruby-mext 0.9.1 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d32aaa3192a101dd9ca1c51d9a9971de58e8b1d169101421fdc2bae2d3bab010
4
- data.tar.gz: 9ba50c10d8f2681d37e5064b72d7767709fd902dd212a409044aeb6902438145
3
+ metadata.gz: 765a069de73dccde01080cc08b7dc773781bc26f5dd5f3181a4d01e1bbdd04f2
4
+ data.tar.gz: bd1a550f9cce944c99c0fdd863696d99784eca0536278d19ec7768df45a775b0
5
5
  SHA512:
6
- metadata.gz: 5d92e921aed9ef6c445a341272382c60a2eac3d8f0fb7e3d8f78e61dc328036416bea8b8c8e5131d47fc97e72abb4e28215fc5bbcaa02bd91ca533d450db0875
7
- data.tar.gz: ee4884242a2344ec9790755fb5cde3df9d1327da33c3dba1af0706a8c2f9b14223e88c1aa693db1b5d304d2539e59ea3057e96d3cd696e77576acebf52e54bf1
6
+ metadata.gz: f3de1073d0fb33c9dd5a1fd29eae1ea17ede3915a644478ed452780de20e75c2fe3ea15464fab9515e0c0c9331e83e879a77c55f382d156443c96022143a2016
7
+ data.tar.gz: c601e4e6f42b862f06238878a2a55bed482311851fc05e8b30c74f3904ed24ae202d9c61c963d73e3bef6929661494533de7ad8409c4a95186a52c1caefc2e45
@@ -66,9 +66,9 @@ module Mext
66
66
  #
67
67
  #:nodoc:
68
68
  def +(other)
69
- octave = (self.to_semitones + other.to_semitones) / 12.0
69
+ octave = ((self.to_semitones + other.to_semitones) / 12.0).cround
70
70
  octave = octave >= 0.0 ? octave.floor : octave.ceil
71
- semis = (self.to_semitones + other.to_semitones) % 12.0
71
+ semis = (self.to_semitones + other.to_semitones).cround % 12.0
72
72
  phase = octave >= 0.0 ? 1 : -1
73
73
  PitchClass.new(octave, phase*semis)
74
74
  end
@@ -93,7 +93,7 @@ module Mext
93
93
  # returns the +PitchClass+ to a number of semitones
94
94
  #
95
95
  def to_semitones
96
- (self.octave * 12.0) + self.semi
96
+ self.to_f.pchtosemi
97
97
  end
98
98
 
99
99
  #:doc:
@@ -119,6 +119,19 @@ module Mext
119
119
  self + PitchClass.new(0.0, semi)
120
120
  end
121
121
 
122
+ #:doc:
123
+ #
124
+ # +interval_proportion(prop, other)+:
125
+ #
126
+ # returns the interval proportion (in semitones) given
127
+ #
128
+ # - +prop+: a proportional factor (should be in the range 0-1)
129
+ # - +other+: the other pitch
130
+ #
131
+ def interval_proportion(prop, other)
132
+ self.interval(other) * prop
133
+ end
134
+
122
135
  class << self
123
136
 
124
137
  #:doc:
@@ -135,6 +148,10 @@ module Mext
135
148
  end
136
149
 
137
150
  private
151
+
152
+ def setup_with_one_semitone_argument(semival)
153
+ setup_with_one_argument(semival.semitopch)
154
+ end
138
155
 
139
156
  def setup_with_one_argument(fval)
140
157
  (o, s) = separate_oct_semi(fval)
@@ -19,11 +19,17 @@ class Numeric
19
19
  #
20
20
  CHROMATIC_NOTES_PER_OCTAVE = CNPO = 12.0
21
21
 
22
+ #
23
+ # +ZERO_PITCH+ (short: +ZP+): where does the +0.00+ pitch-class reside
24
+ # in terms of semitones (+96)
25
+ #
26
+ ZERO_PITCH = ZP = PITCH_MIDDLE_C * CNPO
27
+
22
28
  #
23
29
  # +ZERO_MIDI_PITCH+ (short: +ZMP+): where does the +0.00+ pitch-class reside
24
- # in terms of midi notes
30
+ # in terms of midi notes (-36)
25
31
  #
26
- ZERO_MIDI_PITCH = ZMP = MIDI_MIDDLE_C - (PITCH_MIDDLE_C * CNPO)
32
+ ZERO_MIDI_PITCH = ZMP = MIDI_MIDDLE_C - ZERO_PITCH
27
33
 
28
34
  #
29
35
  # +PITCH_CLASS_CENTS+ (short: +PCC+): the number of parts in every semitone
@@ -0,0 +1,18 @@
1
+ class Numeric
2
+
3
+ #
4
+ # +cround(eps = 1e-8)+: conditional rounding algorithm
5
+ #
6
+ # +cround+ will return a rounded number if the starting value is nearer to
7
+ # its nearest integer by less than +eps+. Otherwise it will not round
8
+ # the receiver
9
+ #
10
+ #:nodoc:
11
+ DEFAULT_CROUND_EPS = 1e-8
12
+
13
+ def cround(eps = DEFAULT_CROUND_EPS)
14
+ rv = self.round
15
+ ((self - rv).abs < eps) ? rv : self
16
+ end
17
+
18
+ end
@@ -1,5 +1,6 @@
1
1
  class Numeric
2
2
 
3
+ #:doc:
3
4
  #
4
5
  # +mtopch+: MIDI note to pitch class converter
5
6
  #
@@ -9,24 +10,7 @@ class Numeric
9
10
 
10
11
  def mtopch
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)
17
-
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);
13
+ (self - ZMP).semitopch
30
14
 
31
15
  end
32
16
 
@@ -8,16 +8,7 @@ class Numeric
8
8
  #:nodoc:
9
9
 
10
10
  def pchtom
11
- p_octave = self.to_i
12
- p_note = (self - p_octave) * 100
13
- ref = self < 0.0 ? -CHROMATIC_NOTES_PER_OCTAVE : CHROMATIC_NOTES_PER_OCTAVE
14
-
15
- p_octave += (p_note / CHROMATIC_NOTES_PER_OCTAVE).to_i # cater for octave wrapping
16
- p_note = (p_note % ref); # reduce note in a 0-11 space (keeping track of sign)
17
-
18
- m_octave = ((p_octave - PITCH_MIDDLE_C)*CHROMATIC_NOTES_PER_OCTAVE) + MIDI_MIDDLE_C; # find the appropriate midi octave
19
-
20
- m_octave + p_note
11
+ self.pchtosemi + ZMP
21
12
  end
22
13
 
23
14
  end
@@ -0,0 +1,24 @@
1
+ class Numeric
2
+
3
+ #:doc:
4
+ #
5
+ # +pchtooctsemi+: pitch class to [octave, semitones] converter
6
+ #
7
+ # interprets its receiver as a pitch class and returns an array
8
+ # in the format [+octave+, +semitones+]
9
+ #
10
+ #:nodoc:
11
+
12
+ def pchtooctsemi
13
+ p_octave = self.to_i
14
+ p_note = (self - p_octave) * 100
15
+ ref = self < 0.0 ? -CHROMATIC_NOTES_PER_OCTAVE : CHROMATIC_NOTES_PER_OCTAVE
16
+
17
+ p_octave += (p_note / CHROMATIC_NOTES_PER_OCTAVE).to_i # cater for octave wrapping
18
+ p_note = (p_note % ref); # reduce note in a 0-11 space (keeping track of sign)
19
+
20
+ [p_octave, p_note]
21
+ end
22
+
23
+ end
24
+
@@ -0,0 +1,18 @@
1
+ class Numeric
2
+
3
+ #:doc:
4
+ #
5
+ # +pchtosemi+: pitch class to semitones converter
6
+ #
7
+ # interprets its receiver as a pitch class and returns the
8
+ # corresponding quantity in semitones
9
+ #
10
+ #:nodoc:
11
+
12
+ def pchtosemi
13
+ (p_octave, p_note) = self.pchtooctsemi
14
+
15
+ (p_octave * CNPO) + p_note
16
+ end
17
+
18
+ end
@@ -0,0 +1,23 @@
1
+ class Numeric
2
+
3
+ #:doc:
4
+ #
5
+ # +semitopch+: semitone to pitch class converter
6
+ #
7
+ # interprets its receiver as a semitone quantity (starting from 0 at
8
+ # pitch class 0.00) and returns its corresponing pitch class
9
+ #
10
+ #:nodoc:
11
+
12
+ def semitopch
13
+
14
+ oct = (self / CNPO).to_i
15
+ semi = self - (oct * CNPO)
16
+ semi %= CNPO
17
+ semi = (self >= 0.0) ? semi : -((CNPO - semi) % CNPO)
18
+
19
+ oct + (semi / PCC)
20
+
21
+ end
22
+
23
+ end
data/lib/mext/numeric.rb CHANGED
@@ -3,10 +3,14 @@ module Mext
3
3
 
4
4
  PATH = File.join(Mext::PATH, 'numeric')
5
5
  VECTORIZABLE_METHODS = %w(
6
+ cround
6
7
  mtof
7
8
  ftom
8
9
  ampdb
9
10
  dbamp
11
+ pchtooctsemi
12
+ pchtosemi
13
+ semitopch
10
14
  pchtom
11
15
  mtopch
12
16
  cpspch
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Mext
2
- VERSION = '0.9.1'
2
+ VERSION = '0.10.0'
3
3
  end
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.1
4
+ version: 0.10.0
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-06 00:00:00.000000000 Z
11
+ date: 2019-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -129,6 +129,7 @@ files:
129
129
  - lib/mext/numeric/ampdb.rb
130
130
  - lib/mext/numeric/constants.rb
131
131
  - lib/mext/numeric/cpspch.rb
132
+ - lib/mext/numeric/cround.rb
132
133
  - lib/mext/numeric/dbamp.rb
133
134
  - lib/mext/numeric/ftom.rb
134
135
  - lib/mext/numeric/gold.rb
@@ -137,8 +138,11 @@ files:
137
138
  - lib/mext/numeric/mtopch.rb
138
139
  - lib/mext/numeric/pchcps.rb
139
140
  - lib/mext/numeric/pchtom.rb
141
+ - lib/mext/numeric/pchtooctsemi.rb
142
+ - lib/mext/numeric/pchtosemi.rb
140
143
  - lib/mext/numeric/pitch_fork.rb
141
144
  - lib/mext/numeric/rrand.rb
145
+ - lib/mext/numeric/semitopch.rb
142
146
  - lib/ruby-mext.rb
143
147
  - lib/ruby.rb
144
148
  - lib/ruby/extensions.rb