B
Ben Rho
Evan Hanson wrote all single >'d lines
actually the name of a type of chord, it would be counted as Gbsusb.
Your code (with my comments):
note[1..-1].scan(/./).each do |n| #for every
character in the input except the first store it in n and do the
following ( btw an easier way is simply note[1..-1].each('') ):
if n == 'b' then flat! #if n is b
then flat the base note
elsif n == '#' then sharp! #else, if n
is # then sharp the base note
else raise ArgumentError, 'Invalid note name!' end #otherwise
rase an error
end #endfor
For Gbsusb (assuming susb is a valid chord type) get the second
character, which is b, and if it is b (which it is), flat the base note.
Then do the same for s, then u, then s, then b (and flat it again), etc.
On second thought, the sus should hit the ArgumentError, hm.. Can anyone
explain that?
@name = note[0,1] #if note="Hello World" this sets
@name to 'H'
#...#
#apply sharps and flats to @name
#...#
def to_s
@name
end
#...#
To me it seems that the base note is stored in @name, which is what is
returned in to_s - so it would just return the base note.
array.join(str):
[1,2,3]* #=> ERROR
[1,2,3]*'' #=> '123'
[1,2,3]*' ' #=> '1 2 3'
[1,2,3].join #=> '123'
[1,2,3].join(' ') #=> '1 2 3'
Wait, I just realized some of my arguments are invalid! For some reason
I've been looking at the Note class all along, instead of the Chord
class! *facepalm* Sorry about that..
--------------------------
I started re-doing this Quiz from scratch about an hour ago without
looking at anyone else's code, unfortunately, the results look about the
same as David Springer's code (mine follows).
code!
#I'll be making this library bigger, given enough time. I'd copy David
Springer's (he has given me his permission), but this is case
insensitive and doesn't have optional notes).
chord_library={
'7' => [3,4,3],
'major' => [4,3],
'maj' => [4,3],
'major7' => [4,3,4],
'maj7' => [4,3,4],
'minor' => [3,4],
'min' => [3,4],
'minor7' => [3,4,3],
'min7' => [3,4,3],
'm7' => [3,4,3],
'sus' => [7],
'sus2' => [2,5],
'sus4' => [5,2]
}
rotated_notes = []
while !((chord=gets.to_s.chomp.downcase).empty?)
base_note = chord[/^[abdeg]b/]
if (base_note == nil)
base_note = chord[/^[acdfg]#/]
if (base_note == nil)
base_note = chord[/^[a-g]/]
if (base_note == nil)
puts 'ERROR: Invalid base note'
next
end
end
end
note_list = ((base_note[1,1]=='b') ? (%w(ab a bb b c db d eb e f gb
g)) : (%w(a a# b c c# d d# e f f# g g#)))
i=-1
rotated_notes = note_list.map do
i += 1
note_list[(i + note_list.index(base_note))%12]
end
variation = ($'.empty?) ? ('major') : ($')
if (chord_library[variation] == nil)
puts 'ERROR: Chord not found'
next
end
out = 'The notes in the chord ' + chord.capitalize + ' are: ' +
base_note.capitalize
note_tally = 0
chord_library[variation].each do |note|
if (note<0)
next
end
out << ' ' + rotated_notes[((note+note_tally)%12)].capitalize
note_tally += note
end
puts out
end
Yes, I do mean like Gsusb. Susb wasn't a valid example, but if it wasI'm not sure when "susb" would cause an issue -- do you mean an
instance like Gsusb? I don't know that that's a chord, but the G would
be read and the susb would raise an exception as an invalid chord
symbol.
actually the name of a type of chord, it would be counted as Gbsusb.
Your code (with my comments):
note[1..-1].scan(/./).each do |n| #for every
character in the input except the first store it in n and do the
following ( btw an easier way is simply note[1..-1].each('') ):
if n == 'b' then flat! #if n is b
then flat the base note
elsif n == '#' then sharp! #else, if n
is # then sharp the base note
else raise ArgumentError, 'Invalid note name!' end #otherwise
rase an error
end #endfor
For Gbsusb (assuming susb is a valid chord type) get the second
character, which is b, and if it is b (which it is), flat the base note.
Then do the same for s, then u, then s, then b (and flat it again), etc.
On second thought, the sus should hit the ArgumentError, hm.. Can anyone
explain that?
#...#It actually returns the individual notes in the chord, as generated by
Chord#names.
@name = note[0,1] #if note="Hello World" this sets
@name to 'H'
#...#
#apply sharps and flats to @name
#...#
def to_s
@name
end
#...#
To me it seems that the base note is stored in @name, which is what is
returned in to_s - so it would just return the base note.
See Jesús' answer. One thing to add - array * str is the same asAs an aside, can anyone tell me if there is a slick Ruby way to do
what is done in cases like my Key#names, Chord#names, Chord#to_s, etc.
functions, where you're just mapping things from one array to another,
or from one array to a string, etc?
array.join(str):
[1,2,3]* #=> ERROR
[1,2,3]*'' #=> '123'
[1,2,3]*' ' #=> '1 2 3'
[1,2,3].join #=> '123'
[1,2,3].join(' ') #=> '1 2 3'
Wait, I just realized some of my arguments are invalid! For some reason
I've been looking at the Note class all along, instead of the Chord
class! *facepalm* Sorry about that..
--------------------------
I started re-doing this Quiz from scratch about an hour ago without
looking at anyone else's code, unfortunately, the results look about the
same as David Springer's code (mine follows).
I agree! They're also useful for anyone trying to read or debug your# Sharps the note in place... Comments are fun!
code!
#I'll be making this library bigger, given enough time. I'd copy David
Springer's (he has given me his permission), but this is case
insensitive and doesn't have optional notes).
chord_library={
'7' => [3,4,3],
'major' => [4,3],
'maj' => [4,3],
'major7' => [4,3,4],
'maj7' => [4,3,4],
'minor' => [3,4],
'min' => [3,4],
'minor7' => [3,4,3],
'min7' => [3,4,3],
'm7' => [3,4,3],
'sus' => [7],
'sus2' => [2,5],
'sus4' => [5,2]
}
rotated_notes = []
while !((chord=gets.to_s.chomp.downcase).empty?)
base_note = chord[/^[abdeg]b/]
if (base_note == nil)
base_note = chord[/^[acdfg]#/]
if (base_note == nil)
base_note = chord[/^[a-g]/]
if (base_note == nil)
puts 'ERROR: Invalid base note'
next
end
end
end
note_list = ((base_note[1,1]=='b') ? (%w(ab a bb b c db d eb e f gb
g)) : (%w(a a# b c c# d d# e f f# g g#)))
i=-1
rotated_notes = note_list.map do
i += 1
note_list[(i + note_list.index(base_note))%12]
end
variation = ($'.empty?) ? ('major') : ($')
if (chord_library[variation] == nil)
puts 'ERROR: Chord not found'
next
end
out = 'The notes in the chord ' + chord.capitalize + ' are: ' +
base_note.capitalize
note_tally = 0
chord_library[variation].each do |note|
if (note<0)
next
end
out << ' ' + rotated_notes[((note+note_tally)%12)].capitalize
note_tally += note
end
puts out
end