Skip to content

Instantly share code, notes, and snippets.

@tomcha
Created July 4, 2014 10:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tomcha/eb66f25b5521cd1f8009 to your computer and use it in GitHub Desktop.
Save tomcha/eb66f25b5521cd1f8009 to your computer and use it in GitHub Desktop.
カラオケマシン問題
# coding: utf-8
class KaraokeMachine
attr_accessor :melody
def initialize(melody)
@melody = melody
end
def transpose(amount)
amount %= 12
if(amount == 0)
return @melody
else
origin_melody = Array.new()
origin_melody = @melody.split(//)
origin_melody.each_with_index do |val,index|
if val == '#'
origin_melody[index - 1] = origin_melody[index -1] + '#'
end
end
new_melody = Array.new()
origin_melody.each do |val|
if val == '#'
elsif val == ' ' || val == '|'
new_melody << val
else
new_melody << tone_convert(val, amount)
end
end
end
return new_melody.join('')
end
def tone_convert(tone, val)
tone_table = Array.new
tone_table = ['C','C#','D','D#','E','F','F#','G','G#','A','A#','B']
origin_index = tone_table.index(tone)
changed_index = origin_index + val
changed_index %= 12
tone_table[changed_index]
end
end
describe KaraokeMachine do
it "メロディ無し" do
melody = ""
answer = melody
expect(KaraokeMachine.new(melody).transpose(0)).to eq answer
end
# ここから下のコメントを外していって、テストを全部パスさせてください!
it "変更無し" do
melody = "C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
answer = melody
expect(KaraokeMachine.new(melody).transpose(0)).to eq answer
end
it "2上げる" do
melody = "C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
answer = "D E F# G |F# E D |F# G A B |A G F# |D D |D D |DDEEF#F#GG|F# E D "
expect(KaraokeMachine.new(melody).transpose(2)).to eq answer
end
it "7上げる" do
melody = "C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
answer = "G A B C |B A G |B C D E |D C B |G G |G G |GGAABBCC|B A G "
expect(KaraokeMachine.new(melody).transpose(7)).to eq answer
end
it "1下げる" do
melody = "C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
answer = "B C# D# E |D# C# B |D# E F# G# |F# E D# |B B |B B |BBC#C#D#D#EE|D# C# B "
expect(KaraokeMachine.new(melody).transpose(-1)).to eq answer
end
it "7下げる" do
melody = "C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
answer = "F G A A# |A G F |A A# C D |C A# A |F F |F F |FFGGAAA#A#|A G F "
expect(KaraokeMachine.new(melody).transpose(-7)).to eq answer
end
it "1オクターブ上げる" do
melody = "C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
answer = melody
expect(KaraokeMachine.new(melody).transpose(12)).to eq answer
end
it "1オクターブ下げる" do
melody = "C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
answer = melody
expect(KaraokeMachine.new(melody).transpose(-12)).to eq answer
end
it "14上げる" do
melody = "C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
answer = "D E F# G |F# E D |F# G A B |A G F# |D D |D D |DDEEF#F#GG|F# E D "
expect(KaraokeMachine.new(melody).transpose(14)).to eq answer
end
it "13下げる" do
melody = "C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
answer = "B C# D# E |D# C# B |D# E F# G# |F# E D# |B B |B B |BBC#C#D#D#EE|D# C# B "
expect(KaraokeMachine.new(melody).transpose(-13)).to eq answer
end
it "2オクターブ上げる" do
melody = "C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
answer = melody
expect(KaraokeMachine.new(melody).transpose(24)).to eq answer
end
it "2オクターブ下げる" do
melody = "C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
answer = melody
expect(KaraokeMachine.new(melody).transpose(-24)).to eq answer
end
it "26上げる" do
melody = "C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
answer = "D E F# G |F# E D |F# G A B |A G F# |D D |D D |DDEEF#F#GG|F# E D "
expect(KaraokeMachine.new(melody).transpose(26)).to eq answer
end
it "25上げる" do
melody = "C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
answer = "B C# D# E |D# C# B |D# E F# G# |F# E D# |B B |B B |BBC#C#D#D#EE|D# C# B "
expect(KaraokeMachine.new(melody).transpose(-25)).to eq answer
end
it "6上げる(メロディはF#から開始)" do
melody = "F# G# A# B |A# G# F# |A# B C# D# |C# B A# |F# F# |F# F# |F#F#G#G#A#A#BB|A# G# F# "
answer = "C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
expect(KaraokeMachine.new(melody).transpose(6)).to eq answer
end
it "6下げる(メロディはF#から開始)" do
melody = "F# G# A# B |A# G# F# |A# B C# D# |C# B A# |F# F# |F# F# |F#F#G#G#A#A#BB|A# G# F# "
answer = "C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
expect(KaraokeMachine.new(melody).transpose(-6)).to eq answer
end
it "連続してtransposeを呼び出す" do
melody = "C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
karaoke = KaraokeMachine.new(melody)
answer = melody
expect(karaoke.transpose(0)).to eq answer
answer = "D E F# G |F# E D |F# G A B |A G F# |D D |D D |DDEEF#F#GG|F# E D "
expect(karaoke.transpose(2)).to eq answer
answer = "B C# D# E |D# C# B |D# E F# G# |F# E D# |B B |B B |BBC#C#D#D#EE|D# C# B "
expect(karaoke.transpose(-1)).to eq answer
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment