Class: HeadMusic::Rudiment::RhythmicUnit

Inherits:
Object
  • Object
show all
Includes:
Named
Defined in:
lib/head_music/rudiment/rhythmic_unit.rb

Overview

A rhythmic unit is a rudiment of duration consisting of doublings and divisions of a whole note.

Constant Summary collapse

MULTIPLES =
["whole", "double whole", "longa", "maxima"].freeze
FRACTIONS =
[
  "whole", "half", "quarter", "eighth", "sixteenth", "thirty-second",
  "sixty-fourth", "hundred twenty-eighth", "two hundred fifty-sixth"
].freeze
BRITISH_MULTIPLE_NAMES =
%w[semibreve breve longa maxima].freeze
BRITISH_DIVISION_NAMES =
%w[
  semibreve minim crotchet quaver semiquaver demisemiquaver
  hemidemisemiquaver semihemidemisemiquaver demisemihemidemisemiquaver
].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(canonical_name) ⇒ RhythmicUnit

Returns a new instance of RhythmicUnit.



30
31
32
33
34
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 30

def initialize(canonical_name)
  self.name = canonical_name
  @numerator = 2**numerator_exponent
  @denominator = 2**denominator_exponent
end

Instance Attribute Details

#alias_name_keysObject (readonly) Originally defined in module Named

Returns the value of attribute alias_name_keys.

#denominatorObject (readonly)

Returns the value of attribute denominator.



24
25
26
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 24

def denominator
  @denominator
end

#name_keyObject (readonly) Originally defined in module Named

Returns the value of attribute name_key.

#numeratorObject (readonly)

Returns the value of attribute numerator.



24
25
26
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 24

def numerator
  @numerator
end

Class Method Details

.for_denominator_value(denominator) ⇒ Object



20
21
22
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 20

def self.for_denominator_value(denominator)
  get(FRACTIONS[Math.log2(denominator).to_i])
end

.get(name) ⇒ Object



26
27
28
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 26

def self.get(name)
  get_by_name(name)
end

Instance Method Details

#british_fractions_keysObject (private)



103
104
105
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 103

def british_fractions_keys
  BRITISH_DIVISION_NAMES.map { |fraction| fraction.gsub(/\W+/, "_") }
end

#british_multiples_keysObject (private)



91
92
93
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 91

def british_multiples_keys
  BRITISH_MULTIPLE_NAMES.map { |multiple| multiple.gsub(/\W+/, "_") }
end

#british_nameObject



61
62
63
64
65
66
67
68
69
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 61

def british_name
  if multiple?
    BRITISH_MULTIPLE_NAMES[MULTIPLES.index(name)]
  elsif fraction?
    BRITISH_DIVISION_NAMES[FRACTIONS.index(name)]
  elsif BRITISH_MULTIPLE_NAMES.include?(name) || BRITISH_DIVISION_NAMES.include?(name)
    name
  end
end

#denominator_exponentObject (private)



95
96
97
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 95

def denominator_exponent
  fractions_keys.index(name.gsub(/\W+/, "_")) || british_fractions_keys.index(name.gsub(/\W+/, "_")) || 0
end

#ensure_localized_name(name:, locale_code: Locale::DEFAULT_CODE, abbreviation: nil) ⇒ Object Originally defined in module Named

#flagsObject



53
54
55
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 53

def flags
  FRACTIONS.include?(name) ? [FRACTIONS.index(name) - 2, 0].max : 0
end

#fraction?Boolean (private)

Returns:

  • (Boolean)


79
80
81
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 79

def fraction?
  FRACTIONS.include?(name)
end

#fractions_keysObject (private)



99
100
101
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 99

def fractions_keys
  FRACTIONS.map { |fraction| fraction.gsub(/\W+/, "_") }
end

#localized_name(locale_code: Locale::DEFAULT_CODE) ⇒ Object Originally defined in module Named

#localized_name_in_default_localeObject (private) Originally defined in module Named

#localized_name_in_locale_matching_language(locale) ⇒ Object (private) Originally defined in module Named

#localized_name_in_matching_locale(locale) ⇒ Object (private) Originally defined in module Named

#localized_namesObject Originally defined in module Named

Returns an array of LocalizedName instances that are synonymous with the name.

#multiple?Boolean (private)

Returns:

  • (Boolean)


75
76
77
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 75

def multiple?
  MULTIPLES.include?(name)
end

#multiples_keysObject (private)



87
88
89
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 87

def multiples_keys
  MULTIPLES.map { |multiple| multiple.gsub(/\W+/, "_") }
end

#name(locale_code: Locale::DEFAULT_CODE) ⇒ Object Originally defined in module Named

#name=(name) ⇒ Object Originally defined in module Named

#noteheadObject



44
45
46
47
48
49
50
51
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 44

def notehead
  return :maxima if relative_value == 8
  return :longa if relative_value == 4
  return :breve if relative_value == 2
  return :open if [0.5, 1].include? relative_value

  :closed
end

#numerator_exponentObject (private)



83
84
85
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 83

def numerator_exponent
  multiples_keys.index(name.gsub(/\W+/, "_")) || british_multiples_keys.index(name.gsub(/\W+/, "_")) || 0
end

#relative_valueObject



36
37
38
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 36

def relative_value
  @numerator.to_f / @denominator
end

#stemmed?Boolean

Returns:

  • (Boolean)


57
58
59
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 57

def stemmed?
  relative_value < 1
end

#ticksObject



40
41
42
# File 'lib/head_music/rudiment/rhythmic_unit.rb', line 40

def ticks
  HeadMusic::Rudiment::Rhythm::PPQN * 4 * relative_value
end