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 +4 -4
- data/Gemfile.lock +7 -1
- data/README.md +34 -13
- data/lib/musi/note.rb +190 -45
- data/lib/musi/version.rb +1 -1
- data/musi-0.1.2.gem +0 -0
- data/musi.gemspec +0 -15
- 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: 05013b57172445c7de43bc022ec4e27f3ae29e87209caaa2ec40160dab088066
|
4
|
+
data.tar.gz: 6ab87d588e9f75324caa8c1095849f8ec2c0ba4266923b15ed3005d1c1e49c78
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9fe508c1357e966768d8960be1ea6161a59327ce446dd25fd9c612055c48d2f48e02c1d0a239fa79bfaff656a5eabca2368aa390b34e241c6d8600dbfbf5cc14
|
7
|
+
data.tar.gz: 5cc5b487d261f13ceaf6fab5cbdafd5b5730a6a120ec4126f0731b7b576b34b6b1131d616a673d6d63829780f8a61fb7b1597cf8df3f7f531aac5124e8a541fd
|
data/Gemfile.lock
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
musi (0.
|
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
|
-
|
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
|
27
|
-
.flat is a a method which will lower the input of a note given as a string by
|
28
|
-
.raise_whole_step
|
29
|
-
.lower_whole_step
|
30
|
-
|
31
|
-
|
32
|
-
.
|
33
|
-
.
|
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
|
-
|
61
|
+
No support for augmented and diminished intervals yet aside from triones.
|
41
62
|
|
42
63
|
## Development
|
43
64
|
|
data/lib/musi/note.rb
CHANGED
@@ -31,90 +31,235 @@ module Musi
|
|
31
31
|
"B" => 11
|
32
32
|
}
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
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
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
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
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
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
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
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
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
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
|
-
#
|
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
|
data/lib/musi/version.rb
CHANGED
data/musi-0.1.2.gem
ADDED
Binary file
|
data/musi.gemspec
CHANGED
@@ -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.
|
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
|
+
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:
|