Module: Brevity::Commands

Included in:
ScoreMaker
Defined in:
lib/brevity/commands/expr.rb,
lib/brevity/commands/part.rb,
lib/brevity/commands/meter.rb,
lib/brevity/commands/tempo.rb,
lib/brevity/commands/constants.rb

Constant Summary collapse

ENV_START_TEMPO =
:start_tempo
ENV_START_METER =
:start_meter
ENV_EXPRS =
:exprs
ENV_PARTS =
:parts
ENV_TEMPO_CHANGES =
:tempo_changes
ENV_METER_CHANGES =
:meter_changes
EXPR_PARSER =
ExpressionParser.new
LABEL_PARSER =
LabelParser.new
DYNAMIC_PARSER =
DynamicParser.new

Instance Method Summary collapse

Instance Method Details

#class_const(sym) ⇒ Object



14
15
16
# File 'lib/brevity/commands/constants.rb', line 14

def class_const sym
  self.class.const_get(sym)
end

#expr(label_str, expr_str) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
# File 'lib/brevity/commands/expr.rb', line 3

def expr label_str, expr_str
  label_node = LABEL_PARSER.parse(label_str)
  expr_node = EXPR_PARSER.parse(expr_str)
  
  if label_node.nil?
    raise ArgumentError, "Could not parse label string '#{label_str}'"
  end
  if expr_node.nil?
    raise ArgumentError, "Could not parse expr string '#{expr_str}'"
  end
  
  @env[ENV_EXPRS][label_node.to_key] = expr_node.primitives(@env[ENV_EXPRS])
end

#meter(beats_per_measure_str, beat_dur_str) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/brevity/commands/meter.rb', line 3

def meter beats_per_measure_str, beat_dur_str
  beats_per_measure_node = PositiveIntegerParser.new.parse(beats_per_measure_str)
  beat_dur_node = DurationParser.new.parse(beat_dur_str)
  
  if beats_per_measure_node.nil?
    raise ArgumentError, "Could not parse beats per measure string '#{beats_per_measure_str}'"
  end
  if beat_dur_node.nil?
    raise ArgumentError, "Could not parse beat duration string '#{beat_dur_str}'"
  end
  
  @env[ENV_START_METER] = Music::Transcription::Meter.new(
    beats_per_measure_node.to_i,
    beat_dur_node.to_r
  )
end

#part(name_str, startdynamic_str, expr_str) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/brevity/commands/part.rb', line 3

def part name_str, startdynamic_str, expr_str
  dyn_node = DYNAMIC_PARSER.parse(startdynamic_str.strip)
  expr_node = EXPR_PARSER.parse(expr_str)
  
  if dyn_node.nil?
    raise ArgumentError, "Could not parse start dynamic string '#{startdynamic_str}'"
  end
  if expr_node.nil?
    raise ArgumentError, "Could not parse expr string '#{expr_str}'"
  end
  
  startdyn = dyn_node.to_dynamic
  notes = []
  dynamic_changes = {}
  offset = 0.to_r
  change_mark = nil
  
  expr_node.primitives(@env[ENV_EXPRS]).each do |p|
    case p
    when Music::Transcription::Note
      note = p
      notes.push note
      offset += note.duration
    when Numeric
      dynamic = p
      if change_mark.nil?
        dynamic_changes[offset] = Music::Transcription::Change::Immediate.new(dynamic)
      else
        duration = offset - change_mark
        dynamic_changes[change_mark] = Music::Transcription::Change::Gradual.new(dynamic,duration)
        change_mark = nil
      end
    when GradualNode
      change_mark = offset
    end
  end
  
  @env[ENV_PARTS][name_str] = Music::Transcription::Part.new(
    startdyn,
    notes: notes,
    dynamic_changes: dynamic_changes)
end

#tempo(beats_per_minute_str) ⇒ Object



3
4
5
6
7
8
9
10
11
# File 'lib/brevity/commands/tempo.rb', line 3

def tempo beats_per_minute_str
  bpm_node = PositiveIntegerParser.new.parse(beats_per_minute_str)
  
  if bpm_node.nil?
    raise ArgumentError, "Could not parse beats per minute string '#{beats_per_minute_str}'"
  end
  
  @env[ENV_START_TEMPO] = bpm_node.to_i
end