Class: Webmidi::Middleware::Recorder::Tape
- Inherits:
-
Object
- Object
- Webmidi::Middleware::Recorder::Tape
- Defined in:
- lib/webmidi/middleware/recorder.rb
Instance Method Summary collapse
- #add(message) ⇒ Object
- #duration ⇒ Object
-
#initialize(entries: [], start_time: nil) ⇒ Tape
constructor
A new instance of Tape.
- #message_count ⇒ Object
- #messages ⇒ Object
- #play(output, speed: 1.0) ⇒ Object
- #play_from(time, output, speed: 1.0) ⇒ Object
- #rewind(seconds) ⇒ Object
- #slice(from, to) ⇒ Object
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() @mutex.synchronize do @start_time ||= . @messages << {message: , time: . - @start_time} end end |
#duration ⇒ Object
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_count ⇒ Object
65 66 67 |
# File 'lib/webmidi/middleware/recorder.rb', line 65 def @mutex.synchronize { @messages.size } end |
#messages ⇒ Object
61 62 63 |
# File 'lib/webmidi/middleware/recorder.rb', line 61 def 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 |