Class: HeadMusic::Instrument

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

Overview

A musical instrument. An instrument object can be assigned to a staff object. Attributes:

name_key: the name of the instrument
alias_name_keys: an array of alternative names for the instrument
orchestra_section_key: the section of the orchestra (e.g. "strings")
family_key: the key for the family of the instrument (e.g. "saxophone")
classification_keys: an array of classification_keys
transposition: the number of semitones between the written and the sounding pitch (optional, default: 0)
default_clefs: the default clef or system of clefs for the instrument
  - [treble] for instruments that use the treble clef
  - [treble, bass] for instruments that use the grand staff
notation:
  a hash of default and alternative notation systems,
  each with a staff's key with an array of hashes
  including clef and transposition (where applicable)

Associations:

family: the family of the instrument (e.g. "saxophone")
orchestra_section: the section of the orchestra (e.g. "strings")

Constant Summary collapse

INSTRUMENTS =
YAML.load_file(File.expand_path("data/instruments.yml", __dir__)).freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Named

#ensure_localized_name, included, #localized_name, #localized_names, #name, #name=

Instance Attribute Details

#alias_name_keysObject (readonly)

Returns the value of attribute alias_name_keys.



38
39
40
# File 'lib/head_music/instrument.rb', line 38

def alias_name_keys
  @alias_name_keys
end

#classification_keysObject (readonly)

Returns the value of attribute classification_keys.



38
39
40
# File 'lib/head_music/instrument.rb', line 38

def classification_keys
  @classification_keys
end

#default_clefsObject (readonly)

Returns the value of attribute default_clefs.



38
39
40
# File 'lib/head_music/instrument.rb', line 38

def default_clefs
  @default_clefs
end

#default_stavesObject (readonly)

Returns the value of attribute default_staves.



38
39
40
# File 'lib/head_music/instrument.rb', line 38

def default_staves
  @default_staves
end

#family_keyObject (readonly)

Returns the value of attribute family_key.



38
39
40
# File 'lib/head_music/instrument.rb', line 38

def family_key
  @family_key
end

#fundamental_pitch_spellingObject (readonly)

Returns the value of attribute fundamental_pitch_spelling.



38
39
40
# File 'lib/head_music/instrument.rb', line 38

def fundamental_pitch_spelling
  @fundamental_pitch_spelling
end

#name_keyObject (readonly)

Returns the value of attribute name_key.



38
39
40
# File 'lib/head_music/instrument.rb', line 38

def name_key
  @name_key
end

#notationObject (readonly)

Returns the value of attribute notation.



38
39
40
# File 'lib/head_music/instrument.rb', line 38

def notation
  @notation
end

#orchestra_section_keyObject (readonly)

Returns the value of attribute orchestra_section_key.



38
39
40
# File 'lib/head_music/instrument.rb', line 38

def orchestra_section_key
  @orchestra_section_key
end

#transpositionObject (readonly)

Returns the value of attribute transposition.



38
39
40
# File 'lib/head_music/instrument.rb', line 38

def transposition
  @transposition
end

Class Method Details

.allObject



32
33
34
35
36
# File 'lib/head_music/instrument.rb', line 32

def self.all
  HeadMusic::InstrumentFamily.all
  @all ||=
    INSTRUMENTS.map { |key, _data| get(key) }.sort_by(&:name)
end

.get(name) ⇒ Object



27
28
29
30
# File 'lib/head_music/instrument.rb', line 27

def self.get(name)
  result = get_by_name(name) || get_by_name(key_for_name(name)) || get_by_alias(name)
  result || new(name)
end

Instance Method Details

#==(other) ⇒ Object



46
47
48
# File 'lib/head_music/instrument.rb', line 46

def ==(other)
  to_s == other.to_s
end

#familyObject



56
57
58
59
60
# File 'lib/head_music/instrument.rb', line 56

def family
  return unless family_key

  HeadMusic::InstrumentFamily.get(family_key)
end

#multiple_staves?Boolean

Returns:

  • (Boolean)


76
77
78
# File 'lib/head_music/instrument.rb', line 76

def multiple_staves?
  default_staves.length > 1
end

#pitched?Boolean

Returns:

  • (Boolean)


80
81
82
83
84
# File 'lib/head_music/instrument.rb', line 80

def pitched?
  return false if default_clefs.compact.uniq == ["percussion"]

  default_clefs.any?
end

#single_staff?Boolean

Returns:

  • (Boolean)


72
73
74
# File 'lib/head_music/instrument.rb', line 72

def single_staff?
  default_staves.length == 1
end

#translation(locale = :en) ⇒ Object



50
51
52
53
54
# File 'lib/head_music/instrument.rb', line 50

def translation(locale = :en)
  return name unless name_key

  I18n.translate(name_key, scope: %i[head_music instruments], locale: locale, default: name)
end

#transposing?Boolean

Returns true if the instrument sounds at a different pitch than written.

Returns:

  • (Boolean)


63
64
65
# File 'lib/head_music/instrument.rb', line 63

def transposing?
  transposition != 0
end

#transposing_at_the_octave?Boolean

Returns true if the instrument sounds at a different register than written.

Returns:

  • (Boolean)


68
69
70
# File 'lib/head_music/instrument.rb', line 68

def transposing_at_the_octave?
  transposing? && transposition % 12 == 0
end