Class: Webmidi::Middleware::Recorder::Tape

Inherits:
Object
  • Object
show all
Defined in:
lib/webmidi/middleware/recorder.rb

Instance Method Summary collapse

Constructor Details

#initialize(entries: [], start_time: nil) ⇒ Tape

Returns a new instance of Tape.



48
49
50
51
52
# File 'lib/webmidi/middleware/recorder.rb', line 48

def initialize(entries: [], start_time: nil)
  @messages = entries.map(&:dup)
  @start_time = start_time
  @mutex = Mutex.new
end

Instance Method Details

#add(message) ⇒ Object



54
55
56
57
58
59
# File 'lib/webmidi/middleware/recorder.rb', line 54

def add(message)
  @mutex.synchronize do
    @start_time ||= message.timestamp
    @messages << {message: message, time: message.timestamp - @start_time}
  end
end

#durationObject



69
70
71
72
73
74
# File 'lib/webmidi/middleware/recorder.rb', line 69

def duration
  entries = snapshot
  return 0.0 if entries.empty?

  entries.last[:time]
end

#message_countObject



65
66
67
# File 'lib/webmidi/middleware/recorder.rb', line 65

def message_count
  @mutex.synchronize { @messages.size }
end

#messagesObject



61
62
63
# File 'lib/webmidi/middleware/recorder.rb', line 61

def messages
  snapshot.lazy.map { |entry| entry[:message] }
end

#play(output, speed: 1.0) ⇒ Object



76
77
78
# File 'lib/webmidi/middleware/recorder.rb', line 76

def play(output, speed: 1.0)
  play_from(0.0, output, speed: speed)
end

#play_from(time, output, speed: 1.0) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/webmidi/middleware/recorder.rb', line 80

def play_from(time, output, speed: 1.0)
  validate_speed!(speed)
  entries = snapshot.select { |e| e[:time] >= time }
  last_time = time

  entries.each do |entry|
    delay = (entry[:time] - last_time) / speed
    sleep(delay) if delay > 0.001
    output.send(entry[:message])
    last_time = entry[:time]
  end
end

#rewind(seconds) ⇒ Object



93
94
95
96
97
# File 'lib/webmidi/middleware/recorder.rb', line 93

def rewind(seconds)
  target = duration - seconds
  target = 0.0 if target < 0
  snapshot.select { |e| e[:time] >= target }.map { |e| e[:message] }
end

#slice(from, to) ⇒ Object



99
100
101
102
103
104
105
106
107
# File 'lib/webmidi/middleware/recorder.rb', line 99

def slice(from, to)
  entries = snapshot.select { |e| e[:time].between?(from, to) }.map do |entry|
    {
      message: entry[:message],
      time: entry[:time] - from
    }
  end
  Tape.new(entries: entries, start_time: 0.0)
end