Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class AbstractNota
- def initialize(nome, altura = 4)
- raise 'Uma subclasse deve definir o método escala !' unless self.respond_to? :escala
- @nome = nome.to_s.strip.downcase #tira espacos e tranforma em minúsculas
- raise "Esta nota não existe nesta escala!" unless escala.has_key?(@nome)
- @altura = altura
- raise "Altura inválida!" unless (1..7).include?(@altura) #altura só pode ser de 1 a 7
- end
- attr_reader :nome, :altura
- def succ
- # ...
- end
- def <=>(other)
- if @altura == other.altura
- escala[@nome] <=> escala[other.nome]
- else
- @altura <=> other.altura
- end
- end
- def to_s
- "#{@nome} (#{@altura})"
- end
- private
- # Hash da escala com chaves e valores trocados
- def escala_invertida
- # o operador ||= faz com que a operação invert seja executada somente na
- # primeira chamada e o seu valor fique armazenado nas chamadas seguintes,
- # por questões de performance
- @escala_invertida ||= escala.invert #troca chaves por valores no hash
- end
- end
- class NotaDoMaior < AbstractNota
- def escala
- @escala ||= {"do" => 0, "re" => 1, "mi" => 2, "fa" => 3, "sol" => 4, "la" => 5, "si" => 6}
- end
- end
- class NotaPentatonicaDoMaior < AbstractNota
- def escala
- @escala ||= {"do" => 0, "re" => 1, "mi" => 2, "fa" => 3, "sol" => 4, "la" => 5, "si" => 6}
- end
- end
- class NotaReMaior < AbstractNota
- def escala
- @escala ||= {"do\#" => 0, "re" => 1, "mi" => 2, "fa\#" => 3, "sol" => 4, "la" => 5, "si" => 6 }
- end
- end
- class NotaPentatonicaDoMaior < AbstractNota
- def escala
- @escala ||= {"do" => 0, "re" => 1, "mi" => 2, "sol" => 3, "la" => 4}
- end
- end
Add Comment
Please, Sign In to add comment