Class: Clef::Parser::DSL::StaffBuilder

Inherits:
Object
  • Object
show all
Includes:
BlockEvaluation
Defined in:
lib/clef/parser/dsl.rb

Instance Method Summary collapse

Constructor Details

#initialize(staff) ⇒ StaffBuilder

Returns a new instance of StaffBuilder.



103
104
105
106
107
108
# File 'lib/clef/parser/dsl.rb', line 103

def initialize(staff)
  @staff = staff
  @current_measure = nil
  @next_measure_number = 1
  @lyrics = []
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Clef::Parser::DSL::BlockEvaluation

Instance Method Details

#barObject



151
152
153
# File 'lib/clef/parser/dsl.rb', line 151

def bar
  advance_measure
end

#instrument(program) ⇒ Object

Parameters:

  • program (Integer)


123
124
125
# File 'lib/clef/parser/dsl.rb', line 123

def instrument(program)
  @staff.(:midi_program, program)
end

#key(tonic, mode = :major) ⇒ Object

Parameters:



112
113
114
# File 'lib/clef/parser/dsl.rb', line 112

def key(tonic, mode = :major)
  @staff.key_signature = Clef::Core::KeySignature.new(tonic, mode)
end

#lyrics(voice_id, text) ⇒ Object

Parameters:

  • voice_id (Symbol)
  • text (String)


167
168
169
170
# File 'lib/clef/parser/dsl.rb', line 167

def lyrics(voice_id, text)
  @lyrics << Clef::Notation::Lyric.new(voice_id, text)
  @staff.(:lyrics, @lyrics)
end

#measure(number = nil, &block) ⇒ Object

Parameters:

  • number (Integer, nil) (defaults to: nil)


156
157
158
159
160
161
162
163
# File 'lib/clef/parser/dsl.rb', line 156

def measure(number = nil, &block)
  target_number = number || @next_measure_number
  @current_measure = existing_measure(target_number) || new_measure(target_number)
  evaluate_block(self, &block)
  @current_measure
ensure
  advance_measure
end

#play(lilypond_string) ⇒ Object

Parameters:

  • lilypond_string (String)


139
140
141
142
143
144
145
146
147
148
149
# File 'lib/clef/parser/dsl.rb', line 139

def play(lilypond_string)
  segments = split_measures(lilypond_string)
  voice_builder = nil
  segments.each_with_index do |segment, idx|
    measure = ensure_measure
    voice_builder ||= VoiceBuilder.new(measure.voice(:default))
    voice_builder.use_voice(measure.voice(:default)).notes(segment)
    validate_measure_overflow!(measure)
    advance_measure if idx < segments.length - 1
  end
end

#time(numerator, denominator) ⇒ Object

Parameters:

  • numerator (Integer)
  • denominator (Integer)


118
119
120
# File 'lib/clef/parser/dsl.rb', line 118

def time(numerator, denominator)
  @staff.time_signature = Clef::Core::TimeSignature.new(numerator, denominator)
end

#voice(id = :default, &block) ⇒ Object

Parameters:

  • id (Symbol) (defaults to: :default)


128
129
130
131
132
133
134
135
136
# File 'lib/clef/parser/dsl.rb', line 128

def voice(id = :default, &block)
  measure = ensure_measure
  voice = measure.voice(id)
  return voice unless block

  evaluate_block(VoiceBuilder.new(voice), &block)
  validate_measure_overflow!(measure)
  voice
end