Class: Deftones::Core::Clock

Inherits:
Emitter
  • Object
show all
Defined in:
lib/deftones/core/clock.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(frequency: 1.0, context: Deftones.context, &block) ⇒ Clock

Returns a new instance of Clock.



8
9
10
11
12
13
14
15
16
# File 'lib/deftones/core/clock.rb', line 8

def initialize(frequency: 1.0, context: Deftones.context, &block)
  super()
  @context = context
  @frequency = Signal.new(value: frequency, units: :frequency, context: context)
  @state = :stopped
  @start_time = 0.0
  @offset_ticks = 0.0
  on(:tick, &block) if block
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.



6
7
8
# File 'lib/deftones/core/clock.rb', line 6

def context
  @context
end

#frequencyObject (readonly)

Returns the value of attribute frequency.



6
7
8
# File 'lib/deftones/core/clock.rb', line 6

def frequency
  @frequency
end

#stateObject (readonly)

Returns the value of attribute state.



6
7
8
# File 'lib/deftones/core/clock.rb', line 6

def state
  @state
end

Instance Method Details

#current_frequencyObject (private)



86
87
88
# File 'lib/deftones/core/clock.rb', line 86

def current_frequency
  [frequency.value.to_f, 1.0e-6].max
end

#emit_ticks_until(time) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/deftones/core/clock.rb', line 58

def emit_ticks_until(time)
  return self unless state == :started

  current_time = resolve_time(time)
  emitted_ticks = (@last_emitted_tick || @offset_ticks.floor) + 1
  while emitted_ticks <= ticks_at(current_time).floor
    emit(:tick, emitted_ticks)
    emitted_ticks += 1
  end
  @last_emitted_tick = emitted_ticks - 1
  self
end

#get_ticks_at_time(time) ⇒ Object Also known as: getTicksAtTime



54
55
56
# File 'lib/deftones/core/clock.rb', line 54

def get_ticks_at_time(time)
  ticks(time)
end

#next_tick_time(time = context.current_time) ⇒ Object Also known as: nextTickTime



47
48
49
50
51
52
# File 'lib/deftones/core/clock.rb', line 47

def next_tick_time(time = context.current_time)
  tick_duration = 1.0 / current_frequency
  current_ticks = ticks(time)
  next_tick = current_ticks.floor + 1
  resolve_time(time) + ((next_tick - current_ticks) * tick_duration)
end

#pause(time = nil) ⇒ Object



32
33
34
35
36
37
# File 'lib/deftones/core/clock.rb', line 32

def pause(time = nil)
  @offset_ticks = ticks_at(resolve_time(time))
  @start_time = resolve_time(time)
  @state = :paused
  self
end

#resolve_time(value) ⇒ Object (private)



76
77
78
# File 'lib/deftones/core/clock.rb', line 76

def resolve_time(value)
  value.nil? ? context.current_time : Deftones::Music::Time.parse(value)
end

#seconds(time = context.current_time) ⇒ Object



43
44
45
# File 'lib/deftones/core/clock.rb', line 43

def seconds(time = context.current_time)
  ticks(time) / current_frequency
end

#start(time = nil, offset: nil) ⇒ Object



18
19
20
21
22
23
# File 'lib/deftones/core/clock.rb', line 18

def start(time = nil, offset: nil)
  @start_time = resolve_time(time)
  @offset_ticks = offset.to_f if offset
  @state = :started
  self
end

#stop(time = nil) ⇒ Object



25
26
27
28
29
30
# File 'lib/deftones/core/clock.rb', line 25

def stop(time = nil)
  @offset_ticks = ticks_at(resolve_time(time))
  @start_time = resolve_time(time)
  @state = :stopped
  self
end

#ticks(time = context.current_time) ⇒ Object



39
40
41
# File 'lib/deftones/core/clock.rb', line 39

def ticks(time = context.current_time)
  ticks_at(resolve_time(time))
end

#ticks_at(time) ⇒ Object (private)



80
81
82
83
84
# File 'lib/deftones/core/clock.rb', line 80

def ticks_at(time)
  return @offset_ticks unless state == :started

  @offset_ticks + ([time - @start_time, 0.0].max * current_frequency)
end