Class: Musa::Transport::Transport

Inherits:
Object
  • Object
show all
Defined in:
lib/musa-dsl/transport/transport.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(clock, beats_per_bar = nil, ticks_per_beat = nil, offset: nil, sequencer: nil, before_begin: nil, on_start: nil, after_stop: nil, on_position_change: nil, logger: nil, do_log: nil) ⇒ Transport

Returns a new instance of Transport.



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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/musa-dsl/transport/transport.rb', line 12

def initialize(clock,
               beats_per_bar = nil,
               ticks_per_beat = nil,
               offset: nil,
               sequencer: nil,
               before_begin: nil,
               on_start: nil,
               after_stop: nil,
               on_position_change: nil,
               logger: nil,
               do_log: nil)

  beats_per_bar ||= 4
  ticks_per_beat ||= 24
  offset ||= 0r

  do_log ||= false

  @clock = clock

  @before_begin = []
  @before_begin << Musa::Extension::SmartProcBinder::SmartProcBinder.new(before_begin) if before_begin

  @on_start = []
  @on_start << Musa::Extension::SmartProcBinder::SmartProcBinder.new(on_start) if on_start

  @on_change_position = []
  @on_change_position << Musa::Extension::SmartProcBinder::SmartProcBinder.new(on_position_change) if on_position_change

  @after_stop = []
  @after_stop << Musa::Extension::SmartProcBinder::SmartProcBinder.new(after_stop) if after_stop

  @do_log = do_log

  @sequencer = sequencer
  @sequencer ||= Musa::Sequencer::Sequencer.new beats_per_bar, ticks_per_beat, offset: offset, logger: logger, do_log: @do_log

  @clock.on_start do
    do_on_start
  end

  @clock.on_stop do
    do_stop
  end

  @clock.on_change_position do |bars: nil, beats: nil, midi_beats: nil|
    change_position_to bars: bars, beats: beats, midi_beats: midi_beats
  end
end

Instance Attribute Details

#sequencerObject (readonly)

Returns the value of attribute sequencer.



10
11
12
# File 'lib/musa-dsl/transport/transport.rb', line 10

def sequencer
  @sequencer
end

Instance Method Details

#after_stop(&block) ⇒ Object



70
71
72
# File 'lib/musa-dsl/transport/transport.rb', line 70

def after_stop(&block)
  @after_stop << Musa::Extension::SmartProcBinder::SmartProcBinder.new(block)
end

#before_begin(&block) ⇒ Object



62
63
64
# File 'lib/musa-dsl/transport/transport.rb', line 62

def before_begin(&block)
  @before_begin << Musa::Extension::SmartProcBinder::SmartProcBinder.new(block)
end

#change_position_to(bars: nil, beats: nil, midi_beats: nil) ⇒ Object

Raises:

  • (ArgumentError)


87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/musa-dsl/transport/transport.rb', line 87

def change_position_to(bars: nil, beats: nil, midi_beats: nil)
  logger.debug('Transport') do
    "asked to change position to #{"#{bars} bars " if bars}#{"#{beats} beats " if beats}" \
    "#{"#{midi_beats} midi beats " if midi_beats}"
  end

  position = bars&.rationalize || 1r
  position += Rational(midi_beats, 4 * @sequencer.beats_per_bar) if midi_beats
  position += Rational(beats, @sequencer.beats_per_bar) if beats

  position += @sequencer.offset
  position -= @sequencer.tick_duration

  raise ArgumentError, "undefined new position" unless position

  logger.debug('Transport') { "received message position change to #{position.inspect}" }

  start_again_later = false

  if @sequencer.position > position
    do_stop
    start_again_later = true
  end

  logger.debug('Transport') { "setting sequencer position #{position.inspect}" }

  @sequencer.raw_at position, force_first: true do
    @on_change_position.each { |block| block.call @sequencer }
  end

  @sequencer.position = position

  do_on_start if start_again_later
end

#loggerObject



126
127
128
# File 'lib/musa-dsl/transport/transport.rb', line 126

def logger
  @sequencer.logger
end

#on_change_position(&block) ⇒ Object



74
75
76
# File 'lib/musa-dsl/transport/transport.rb', line 74

def on_change_position(&block)
  @on_change_position << Musa::Extension::SmartProcBinder::SmartProcBinder.new(block)
end

#on_start(&block) ⇒ Object



66
67
68
# File 'lib/musa-dsl/transport/transport.rb', line 66

def on_start(&block)
  @on_start << Musa::Extension::SmartProcBinder::SmartProcBinder.new(block)
end

#startObject



78
79
80
81
82
83
84
85
# File 'lib/musa-dsl/transport/transport.rb', line 78

def start
  do_before_begin unless @before_begin_already_done

  @clock.run do
    @before_begin_already_done = false
    @sequencer.tick
  end
end

#stopObject



122
123
124
# File 'lib/musa-dsl/transport/transport.rb', line 122

def stop
  @clock.terminate
end