Class: Musicality::ScoreEngraver

Inherits:
Object
  • Object
show all
Defined in:
lib/musicality/printing/lilypond/score_engraver.rb

Constant Summary collapse

LILYPOND_VERSION =
"2.18.2"

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(score) ⇒ ScoreEngraver

Returns a new instance of ScoreEngraver.



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/musicality/printing/lilypond/score_engraver.rb', line 6

def initialize score
  @start_meter = score.start_meter
  @meter_changes = score.meter_changes
  @start_key = score.start_key
  @key_changes = score.key_changes

  @parts = score.collated? ? score.parts : ScoreCollator.new(score).collate_parts
  @parts.each do |part_name, part|
    unless part.lilypond_settings
      part.settings.push LilypondSettings.new(part_name)
    end
  end

  @header = ScoreEngraver.header score.title, score.composer
  @part_titles = ScoreEngraver.figure_part_titles @parts
end

Class Method Details

.figure_part_titles(parts) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/musicality/printing/lilypond/score_engraver.rb', line 23

def self.figure_part_titles parts    
  instr_name_totals = Hash.new(0)
  instr_name_used = Hash.new(0)
  part_titles = Hash[
    parts.map do |part_name, part|
      instr_name = part.lilypond_settings.instrument_name
      instr_name_totals[instr_name] += 1
      [part_name, instr_name]
    end
  ]

  needs_number = parts.keys.select {|part_name| instr_name_totals[part_titles[part_name]] > 1 }
  needs_number.each do |part_name|
    title = part_titles[part_name]
    part_titles[part_name] = "#{title} #{instr_name_used[title] += 1}"
  end

  return part_titles
end

.header(title, composer) ⇒ Object

Generate a Lilypond header for the score



44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/musicality/printing/lilypond/score_engraver.rb', line 44

def self.header title, composer
  output = "\\version \"#{LILYPOND_VERSION}\"\n"
  output += "\\header {\n"
  if title
    output += "  title = \"#{title}\"\n"
  end
  if composer
    output += "  composer = \"#{composer}\"\n"
  end
  output += "}\n"

  return output
end

Instance Method Details

#make_lilypond(selected_parts = @parts.keys) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/musicality/printing/lilypond/score_engraver.rb', line 58

def make_lilypond selected_parts = @parts.keys
  output = @header
  output += "{\n  <<\n"
  master = true
  selected_parts.each do |part_name|
    part = @parts[part_name]
    part_title = @part_titles[part_name]
    pe = PartEngraver.new(part, part_title)
    output += pe.make_lilypond(@start_key, @start_meter, 
      key_changes: @key_changes, meter_changes: @meter_changes,
      master: master)
    master = false if master
  end
  output += "  >>\n}\n"
  return output
end