musi 0.1.2 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b748d083bddb0e6ab09f09407fd66bbec7bd68e824c2a65d842319c214fd81bf
4
- data.tar.gz: 55ef187bca090ec7f9fd38114997bb68add5c26055e316f707a4ee89c5df48b3
3
+ metadata.gz: 05013b57172445c7de43bc022ec4e27f3ae29e87209caaa2ec40160dab088066
4
+ data.tar.gz: 6ab87d588e9f75324caa8c1095849f8ec2c0ba4266923b15ed3005d1c1e49c78
5
5
  SHA512:
6
- metadata.gz: d7d84fc85d947c139da366224cc130b81744e8f9a920e731046de29722b4f2b59d877b3bf0da553411639fe94423850839ca68d28914d43104a6d8a8838897cb
7
- data.tar.gz: 5b76a83afb58dda3dc185172afbb009d1f16f56eff368e433c0d3ac27da4b78600b2bfded775f534106cbd3128304d992bda54d276c6c969ffb479e44a243db5
6
+ metadata.gz: 9fe508c1357e966768d8960be1ea6161a59327ce446dd25fd9c612055c48d2f48e02c1d0a239fa79bfaff656a5eabca2368aa390b34e241c6d8600dbfbf5cc14
7
+ data.tar.gz: 5cc5b487d261f13ceaf6fab5cbdafd5b5730a6a120ec4126f0731b7b576b34b6b1131d616a673d6d63829780f8a61fb7b1597cf8df3f7f531aac5124e8a541fd
@@ -1,12 +1,17 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- musi (0.1.2)
4
+ musi (1.0.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
+ coderay (1.1.2)
9
10
  diff-lcs (1.3)
11
+ method_source (0.9.2)
12
+ pry (0.12.2)
13
+ coderay (~> 1.1.0)
14
+ method_source (~> 0.9.0)
10
15
  rake (10.5.0)
11
16
  rspec (3.8.0)
12
17
  rspec-core (~> 3.8.0)
@@ -28,6 +33,7 @@ PLATFORMS
28
33
  DEPENDENCIES
29
34
  bundler (~> 2.0)
30
35
  musi!
36
+ pry
31
37
  rake (~> 10.0)
32
38
  rspec (~> 3.0)
33
39
 
data/README.md CHANGED
@@ -1,8 +1,10 @@
1
1
  # Musi
2
2
 
3
- Welcome to Musi! A very basic gem for calculating intervals in music theory. Pass a note as a string such as "C" or "Ab" to a method and receive a new note in the form of a string.
3
+ Welcome to Musi 1.0.0! A very basic gem for calculating intervals in music theory. Pass a note as a string such as "C" or "Ab" to a method and receive a new note in the form of a string.
4
4
 
5
- You may sharp or flat a note or raise by perfect 4th and 5th intervals. Minor/Major intervals not yet supported.
5
+ Musi 1.0.0 now allows a user to raise or lower a note by all major/minor and perfect intervals as well as tritones.
6
+
7
+ Musi 1.0.0 updates Musi 0.1.2 which only had support for basic sharping, flatting, and raising and lowering by perfect fourths and fifths.
6
8
 
7
9
 
8
10
  ## Installation
@@ -23,21 +25,40 @@ Or install it yourself as:
23
25
 
24
26
  ## Usage
25
27
 
26
- .sharp is a method which will raise the input of a note given as a string by one half step
27
- .flat is a a method which will lower the input of a note given as a string by one half step
28
- .raise_whole_step raises a note by a whole step
29
- .lower_whole_step lowers a note by a whole step
30
- .raiseP4 raises a note by a perfect fourth
31
- .lowerP4 lowers a note by a perfect fourth
32
- .raiseP5 raises a note by a perfect fifth
33
- .lowerP5 lowers a note by a perfect fifth
28
+ .sharp and .raisem2 are methods which both raise the input of a note given as a string by a minor 2nd interval
29
+ .flat is a a method which will lower the input of a note given as a string by a minor 2nd
30
+ .raise_whole_step and .raiseM2 raise a note by a major 2nd
31
+ .lower_whole_step and .lowerM2 lower a note by a major 2nd
32
+
33
+ Other methods included:
34
+ .raisem3
35
+ .lowerm3
36
+ .raiseM3
37
+ .lowerM3
38
+ .raiseP4
39
+ .lowerP4
40
+ .raiseA4
41
+ .lowerA4
42
+ .raised5
43
+ .lowerd5
44
+ .raiseP5
45
+ .lowerP5
46
+ .raisem6
47
+ .lowerm6
48
+ .raiseM6
49
+ .lowerM6
50
+ .raisem7
51
+ .lowerm7
52
+ .raiseM7
53
+ .lowerM7
54
+
55
+ To use:
34
56
 
35
57
  Musi::Note.sharp("D") => D#
36
58
 
37
- Enharmonic spellings such as B# and Gx are currently not supported.
38
- .raise_whole_step("A#") will raise to "C"
59
+ Enharmonic spellings such as B#, E# and Gx are currently not supported as input values, although spellings such as Cb and B# are valid output values.
39
60
 
40
- Currently only these 8 actions available.
61
+ No support for augmented and diminished intervals yet aside from triones.
41
62
 
42
63
  ## Development
43
64
 
@@ -31,90 +31,235 @@ module Musi
31
31
  "B" => 11
32
32
  }
33
33
 
34
- #Helper Method for lowering intervals that go below C
35
- def self.above_zero(next_note)
36
- if next_note < 0
37
- next_note += 12
38
- else
39
- next_note
40
- end
41
- end
34
+ @@letter_names = [
35
+ "A", "B", "C", "D", "E", "F", "G", "A", "B", "C", "D", "E", "F", "G"
36
+ ]
42
37
 
43
- #Helper method for raising(m2, M2, P4, P5)
44
- def self.raise_helper(note, modifier)
45
- if note.include?("b")
46
- next_note = (@@flat_notes[note] + modifier) % 12
47
- @@flat_notes.keys.each do |k|
48
- if @@flat_notes[k] == next_note
49
- return k
50
- end
38
+ def self.raise_helper(note, diatonic_step, semitones)
39
+ letter = note[0]
40
+ i = 0
41
+ while i < 7
42
+ if letter == @@letter_names[i]
43
+ new_letter = @@letter_names[i + diatonic_step]
44
+ break
45
+ end
46
+ i += 1
47
+ end
48
+ if !note.match /b/
49
+ if @@sharp_notes[new_letter] - @@sharp_notes[note] == semitones || @@sharp_notes[new_letter] - @@sharp_notes[note] == (semitones - 12)
50
+ return new_letter
51
+ elsif @@sharp_notes[new_letter] - @@sharp_notes[note] == semitones - 1 || @@sharp_notes[new_letter] - @@sharp_notes[note] == (semitones - 13)
52
+ new_letter += "#"
53
+ else
54
+ new_letter += "b"
51
55
  end
52
56
  else
53
- next_note = (@@sharp_notes[note] + modifier) % 12
54
- @@sharp_notes.keys.each do |k|
55
- if @@sharp_notes[k] == next_note
56
- return k
57
- end
57
+ if @@flat_notes[new_letter] - @@flat_notes[note] == semitones || @@flat_notes[new_letter] - @@flat_notes[note] == (semitones - 12)
58
+ return new_letter
59
+ else
60
+ new_letter += "b"
58
61
  end
59
62
  end
60
63
  end
61
64
 
62
-
63
- #Helper method for lowering(m2, M2, P4, P5)
64
- def self.lower_helper(note, modifier)
65
- if note.include?("#")
66
- next_note = (@@sharp_notes[note] - modifier) % 12
67
- @@sharp_notes.keys.each do |k|
68
- if @@sharp_notes[k] == self.above_zero(next_note)
69
- return k
70
- end
65
+ def self.lower_helper(note, diatonic_step, semitones)
66
+ letter = note[0]
67
+ i = 13
68
+ while i >= 7
69
+ if letter == @@letter_names[i]
70
+ new_letter = @@letter_names[i - diatonic_step]
71
+ break
72
+ end
73
+ i -= 1
74
+ end
75
+ if !note.match /b/
76
+ if @@sharp_notes[note] - @@sharp_notes[new_letter] == semitones || @@sharp_notes[note] - @@sharp_notes[new_letter] == (semitones - 12)
77
+ return new_letter
78
+ elsif @@sharp_notes[note] - @@sharp_notes[new_letter] == semitones + 1 || @@sharp_notes[note] - @@sharp_notes[new_letter] == (semitones - 11)
79
+ new_letter += "#"
80
+ else
81
+ new_letter += "b"
71
82
  end
72
83
  else
73
- next_note = (@@flat_notes[note] - modifier)
74
- @@flat_notes.keys.each do |k|
75
- if @@flat_notes[k] == self.above_zero(next_note)
76
- return k
77
- end
84
+ if @@flat_notes[note] - @@flat_notes[new_letter] == semitones || @@flat_notes[note] - @@flat_notes[new_letter] == (semitones - 12)
85
+ return new_letter
86
+ else
87
+ new_letter += "b"
78
88
  end
79
89
  end
80
90
  end
81
91
 
82
92
  #m2
83
93
  def self.sharp(note)
84
- self.raise_helper(note, 1)
94
+ self.raise_helper(note, 1, 1)
95
+ end
96
+
97
+ def self.raisem2(note)
98
+ self.raise_helper(note, 1, 1)
85
99
  end
86
100
 
87
101
  def self.flat(note)
88
- self.lower_helper(note, 1)
102
+ self.lower_helper(note, 1, 1)
103
+ end
104
+
105
+ def self.lowerm2(note)
106
+ self.lower_helper(note, 1, 1)
89
107
  end
90
108
 
91
109
  #M2
92
110
  def self.raise_whole_step(note)
93
- self.raise_helper(note, 2)
111
+ self.raise_helper(note, 1, 2)
112
+ end
113
+
114
+ def self.raiseM2(note)
115
+ self.raise_helper(note, 1, 2)
94
116
  end
95
117
 
96
118
  def self.lower_whole_step(note)
97
- self.lower_helper(note, 2)
119
+ self.lower_helper(note, 1, 2)
120
+ end
121
+
122
+ def self.lowerM2(note)
123
+ self.lower_helper(note, 1, 2)
124
+ end
125
+
126
+ #m3
127
+ def self.raisem3(note)
128
+ self.raise_helper(note, 2, 3)
129
+ end
130
+
131
+ def self.lowerm3(note)
132
+ self.lower_helper(note, 2, 3)
98
133
  end
99
134
 
100
- #P4
135
+ #M3
136
+
137
+ def self.raiseM3(note)
138
+ self.raise_helper(note, 2, 4)
139
+ end
140
+
141
+ def self.lowerM3(note)
142
+ self.lower_helper(note, 2, 4)
143
+ end
144
+
145
+ # P4
101
146
  def self.raiseP4(note)
102
- self.raise_helper(note, 5)
147
+ self.raise_helper(note, 3, 5)
103
148
  end
104
149
 
105
150
  def self.lowerP4(note)
106
- self.lower_helper(note, 5)
151
+ self.lower_helper(note, 3, 5)
152
+ end
153
+
154
+ # tritone
155
+ def self.raiseA4(note)
156
+ self.raise_helper(note, 3, 6)
157
+ end
158
+
159
+ def self.raised5(note)
160
+ self.raise_helper(note, 4, 6)
161
+ end
162
+
163
+ def self.lowerA4(note)
164
+ self.lower_helper(note, 3, 6)
165
+ end
166
+
167
+ def self.lowerd5(note)
168
+ self.lower_helper(note, 4, 6)
107
169
  end
108
170
 
109
- #P5
171
+ # P5
110
172
  def self.raiseP5(note)
111
- self.raise_helper(note, 7)
173
+ self.raise_helper(note, 4, 7)
112
174
  end
113
175
 
114
176
  def self.lowerP5(note)
115
- self.lower_helper(note, 7)
177
+ self.lower_helper(note, 4, 7)
178
+ end
179
+
180
+ #m6
181
+ def self.raisem6(note)
182
+ self.raise_helper(note, 5, 8)
183
+ end
184
+
185
+ def self.lowerm6(note)
186
+ self.lower_helper(note, 5, 8)
187
+ end
188
+
189
+ #M6
190
+ def self.raiseM6(note)
191
+ self.raise_helper(note, 5, 9)
192
+ end
193
+
194
+ def self.lowerM6(note)
195
+ self.lower_helper(note, 5, 9)
196
+ end
197
+
198
+ #m7
199
+ def self.raisem7(note)
200
+ self.raise_helper(note, 6, 10)
201
+ end
202
+
203
+ def self.lowerm7(note)
204
+ self.lower_helper(note, 6, 10)
205
+ end
206
+
207
+ #M7
208
+ def self.raiseM7(note)
209
+ self.raise_helper(note, 6, 11)
210
+ end
211
+
212
+ def self.lowerM7(note)
213
+ self.lower_helper(note, 6, 11)
116
214
  end
117
215
 
118
216
  end
119
217
 
120
218
  end
219
+
220
+ #Original Helper method for raising(m2, M2, P4, P5)
221
+ # def self.raise_helper(note, modifier)
222
+ # if note.include?("b")
223
+ # next_note = (@@flat_notes[note] + modifier) % 12
224
+ # @@flat_notes.keys.each do |k|
225
+ # if @@flat_notes[k] == next_note
226
+ # return k
227
+ # end
228
+ # end
229
+ # else
230
+ # next_note = (@@sharp_notes[note] + modifier) % 12
231
+ # @@sharp_notes.keys.each do |k|
232
+ # if @@sharp_notes[k] == next_note
233
+ # return k
234
+ # end
235
+ # end
236
+ # end
237
+ # end
238
+
239
+ #Original Helper Method for lowering intervals that go below C
240
+ # def self.above_zero(next_note)
241
+ # if next_note < 0
242
+ # next_note += 12
243
+ # else
244
+ # next_note
245
+ # end
246
+ # end
247
+
248
+ #Original Helper method for lowering(m2, M2, P4, P5)
249
+ # def self.lower_helper(note, modifier)
250
+ # if note.include?("#")
251
+ # next_note = (@@sharp_notes[note] - modifier) % 12
252
+ # @@sharp_notes.keys.each do |k|
253
+ # if @@sharp_notes[k] == self.above_zero(next_note)
254
+ # return k
255
+ # end
256
+ # end
257
+ # else
258
+ # next_note = (@@flat_notes[note] - modifier)
259
+ # @@flat_notes.keys.each do |k|
260
+ # if @@flat_notes[k] == self.above_zero(next_note)
261
+ # return k
262
+ # end
263
+ # end
264
+ # end
265
+ # end
@@ -1,3 +1,3 @@
1
1
  module Musi
2
- VERSION = "0.1.2"
2
+ VERSION = "1.0.0"
3
3
  end
Binary file
@@ -14,21 +14,6 @@ Gem::Specification.new do |spec|
14
14
  spec.homepage = "https://github.com/Eselbeus/musi.git"
15
15
  spec.license = "MIT"
16
16
 
17
- # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
- # to allow pushing to a single host or delete this section to allow pushing to any host.
19
- # if spec.respond_to?(:metadata)
20
- # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
21
- #
22
- # spec.metadata["homepage_uri"] = spec.homepage
23
- # spec.metadata["source_code_uri"] = "https://github.com/Eselbeus/musi.git"
24
- # spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
25
- # else
26
- # raise "RubyGems 2.0 or newer is required to protect against " \
27
- # "public gem pushes."
28
- # end
29
-
30
- # Specify which files should be added to the gem when it is released.
31
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
32
17
  spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
33
18
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
34
19
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: musi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eselbeus
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-03-11 00:00:00.000000000 Z
11
+ date: 2019-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -74,6 +74,7 @@ files:
74
74
  - lib/musi/version.rb
75
75
  - musi-0.1.0.gem
76
76
  - musi-0.1.1.gem
77
+ - musi-0.1.2.gem
77
78
  - musi.gemspec
78
79
  homepage: https://github.com/Eselbeus/musi.git
79
80
  licenses: