IceDragon200

Scale Gizmo

Jul 24th, 2011
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.45 KB | None | 0 0
  1.  
  2. KEY_COUNT = 12
  3.  
  4. KEYS = []
  5. KEYS[0] = "C"
  6. KEYS[1] = "C#"
  7. KEYS[2] = "D"
  8. KEYS[3] = "D#"
  9. KEYS[4] = "E"
  10. KEYS[5] = "F"
  11. KEYS[6] = "F#"
  12. KEYS[7] = "G"
  13. KEYS[8] = "G#"
  14. KEYS[9] = "A"
  15. KEYS[10] = "A#"
  16. KEYS[11] = "B"
  17.  
  18. KEYS_S = {}
  19. for i in 0...KEYS.size ; KEYS_S[KEYS[i]] = i ; end
  20. KEYS_S["BB"] = KEYS_S["A#"]
  21.  
  22. SCALES = {}
  23. SCALES["MAJ"]  = [0, 4, 3]
  24. SCALES["MIN"]  = [0, 3, 4]
  25. SCALES["MAJ7"] = [0, 4, 3, 4]
  26.  
  27. def scale_to_keys( scale )
  28.   result = []
  29.   num = 0
  30.   for key in scale
  31.     num += key
  32.     num %= KEY_COUNT
  33.     result << num
  34.   end
  35.   return result
  36. end
  37.  
  38. def scale_to_keys_s( scale )
  39.   result = []
  40.   num = 0
  41.   for key in scale
  42.     num += key
  43.     num %= KEY_COUNT
  44.     result << KEYS[num]
  45.   end
  46.   return result
  47. end
  48.  
  49. def array_space_to_s( arra )
  50.   result = ""
  51.   arra.each { |e| result += "#{e} " }
  52.   return result
  53. end
  54.  
  55. def offset_scale( scale, amount )
  56.   result = scale.clone ; result[0] += amount ; return result
  57. end
  58.  
  59. loop do
  60.  
  61.   case gets
  62.   # // scale maj D
  63.   when /scale[ ](.*) (.*)/i
  64.     sc    = $1 # // Scale
  65.     key   = $2 # // Note
  66.     scal  = SCALES[sc.upcase]
  67.     scal2 = offset_scale( scal, KEYS_S[key.upcase] )
  68.    
  69.     notes = scale_to_keys_s( scal2 )
  70.     keys1 = scal
  71.     keys2 = scale_to_keys( scal2 )
  72.    
  73.     notes = array_space_to_s(notes)
  74.     keys1 = array_space_to_s(keys1)
  75.     keys2 = array_space_to_s(keys2)
  76.    
  77.     puts "#{notes} : #{keys1} : #{keys2}"
  78.   when /break/i
  79.     break  
  80.   end
  81.  
  82. end
Advertisement
Add Comment
Please, Sign In to add comment