Sha256: 38f88d4b3b848f70c2784e2a3cd5b38bcd8f07d12369e3f9526a02de0a1f5524

Contents?: true

Size: 1.68 KB

Versions: 16

Compression:

Stored size: 1.68 KB

Contents

class HeadMusic::Clef
  CLEFS = [
    { pitch: 'G4', line: 2, names: ['treble', 'G-clef'], modern: true },
    { pitch: 'G4', line: 1, names: ['French', 'French violin'] },
    { pitch: 'G3', line: 2, names: ['tenor'], modern: true },

    { pitch: 'F3', line: 3, names: ['baritone'] },
    { pitch: 'F3', line: 4, names: ['bass', 'F-clef'], modern: true },
    { pitch: 'F3', line: 5, names: ['sub-bass'] },

    { pitch: 'C4', line: 1, names: ['soprano'] },
    { pitch: 'C4', line: 2, names: ['mezzo-soprano'] },
    { pitch: 'C4', line: 3, names: ['alto', 'viola', 'counter-tenor', 'countertenor'], modern: true },
    { pitch: 'C4', line: 4, names: ['tenor'], modern: true },
    { pitch: 'C4', line: 5, names: ['baritone'] },

    { pitch: nil, line: 3, names: ['neutral', 'percussion'] }
  ]

  def self.get(name)
    name = name.to_s
    @clefs ||= {}
    key = HeadMusic::Utilities::HashKey.for(name)
    @clefs[key] ||= new(name)
  end

  attr_reader :name, :pitch, :line
  delegate :to_s, to: :name

  def initialize(name)
    @name = name.to_s
    clef_data = CLEFS.detect { |clef| clef[:names].map(&:downcase).include?(name.downcase) }
    @pitch = HeadMusic::Pitch.get(clef_data[:pitch])
    @line = clef_data[:line]
  end

  def clef_type
    "#{pitch.letter_name}-clef"
  end

  def line_pitch(line_number)
    @line_pitches ||= {}
    @line_pitches[line_number] ||= begin
      steps = (line_number - line) * 2
      pitch.natural_steps(steps)
    end
  end

  def space_pitch(space_number)
    @space_pitches ||= {}
    @space_pitches[space_number] ||= begin
      steps = (space_number - line) * 2 + 1
      pitch.natural_steps(steps)
    end
  end

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

Version data entries

16 entries across 16 versions & 1 rubygems

Version Path
head_music-0.11.9 lib/head_music/clef.rb
head_music-0.11.8 lib/head_music/clef.rb
head_music-0.11.7 lib/head_music/clef.rb
head_music-0.11.6 lib/head_music/clef.rb
head_music-0.11.5 lib/head_music/clef.rb
head_music-0.11.4 lib/head_music/clef.rb
head_music-0.11.3 lib/head_music/clef.rb
head_music-0.11.2 lib/head_music/clef.rb
head_music-0.11.1 lib/head_music/clef.rb
head_music-0.10.0 lib/head_music/clef.rb
head_music-0.8.0 lib/head_music/clef.rb
head_music-0.7.0 lib/head_music/clef.rb
head_music-0.6.4 lib/head_music/clef.rb
head_music-0.6.3 lib/head_music/clef.rb
head_music-0.6.1 lib/head_music/clef.rb
head_music-0.6.0 lib/head_music/clef.rb