Guest User

Untitled

a guest
May 27th, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.65 KB | None | 0 0
  1. class AbstractNota
  2. def initialize(nome, altura = 4)
  3. raise 'Uma subclasse deve definir o método escala !' unless self.respond_to? :escala
  4. @nome = nome.to_s.strip.downcase #tira espacos e tranforma em minúsculas
  5. raise "Esta nota não existe nesta escala!" unless escala.has_key?(@nome)
  6. @altura = altura
  7. raise "Altura inválida!" unless (1..7).include?(@altura) #altura só pode ser de 1 a 7
  8. end
  9. attr_reader :nome, :altura
  10. def succ
  11. # ...
  12. end
  13. def <=>(other)
  14. if @altura == other.altura
  15. escala[@nome] <=> escala[other.nome]
  16. else
  17. @altura <=> other.altura
  18. end
  19. end
  20. def to_s
  21. "#{@nome} (#{@altura})"
  22. end
  23. private
  24. # Hash da escala com chaves e valores trocados
  25. def escala_invertida
  26. # o operador ||= faz com que a operação invert seja executada somente na
  27. # primeira chamada e o seu valor fique armazenado nas chamadas seguintes,
  28. # por questões de performance
  29. @escala_invertida ||= escala.invert #troca chaves por valores no hash
  30. end
  31. end
  32.  
  33. class NotaDoMaior < AbstractNota
  34. def escala
  35. @escala ||= {"do" => 0, "re" => 1, "mi" => 2, "fa" => 3, "sol" => 4, "la" => 5, "si" => 6}
  36. end
  37. end
  38. class NotaPentatonicaDoMaior < AbstractNota
  39. def escala
  40. @escala ||= {"do" => 0, "re" => 1, "mi" => 2, "fa" => 3, "sol" => 4, "la" => 5, "si" => 6}
  41. end
  42. end
  43. class NotaReMaior < AbstractNota
  44. def escala
  45. @escala ||= {"do\#" => 0, "re" => 1, "mi" => 2, "fa\#" => 3, "sol" => 4, "la" => 5, "si" => 6 }
  46. end
  47. end
  48. class NotaPentatonicaDoMaior < AbstractNota
  49. def escala
  50. @escala ||= {"do" => 0, "re" => 1, "mi" => 2, "sol" => 3, "la" => 4}
  51. end
  52. end
Add Comment
Please, Sign In to add comment