Class: Tsunami

Inherits:
Object
  • Object
show all
Defined in:
lib/tsunami.rb,
lib/tsunami/bucket.rb

Defined Under Namespace

Classes: Bucket

Instance Method Summary collapse

Constructor Details

#initialize(audio_file) ⇒ Tsunami

Returns a new instance of Tsunami.



10
11
12
# File 'lib/tsunami.rb', line 10

def initialize audio_file
  @audio_file = RubyAudio::Sound.new audio_file
end

Instance Method Details

#build_graph(bucket) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/tsunami.rb', line 72

def build_graph bucket
  gc = Magick::Draw.new
  gc.stroke('red')
  gc.stroke_width(1)

  mid = bucket.height / 2

  bucket.each_value_with_index do |values, i|
    low = values[:min]
    high = values[:max]

    low_point = mid * ( 1 - low )
    high_point = mid * ( 1 - high )

    gc.line(i, low_point.to_i, i, high_point.to_i)
  end

  return gc
end

#create_buckets(versions) ⇒ Object



47
48
49
50
51
52
# File 'lib/tsunami.rb', line 47

def create_buckets(versions)
  @buckets = {}
  versions.each_key do |key|
    @buckets[key] = Bucket.new(total_frames, versions[key][:width], versions[key][:height])
  end
end

#create_waveform(image_file, options = {}) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/tsunami.rb', line 14

def create_waveform(image_file, options = {})
  dimensions = {
    :width => options[:width] || 100,
    :height => options[:height] || 50
  }

  versions = {
    image_file => dimensions
  }

  create_waveforms(versions)
end

#create_waveforms(versions) ⇒ Object



27
28
29
30
31
32
33
34
35
# File 'lib/tsunami.rb', line 27

def create_waveforms(versions)
  create_buckets versions
  fill_buckets

  @buckets.each do |key, bucket|
    canvas = draw_waveform_from_bucket(bucket)
    canvas.write(key.to_s)
  end
end

#draw_waveform_from_bucket(bucket) ⇒ Object



37
38
39
40
41
42
43
44
45
# File 'lib/tsunami.rb', line 37

def draw_waveform_from_bucket(bucket)
  gc = build_graph bucket

  canvas = Magick::Image.new(bucket.width, bucket.height) { self.background_color = 'transparent' }

  gc.draw(canvas)

  canvas
end

#fill_bucketsObject



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/tsunami.rb', line 54

def fill_buckets
  @audio_file.seek(0,0)
  frames = @audio_file.read("float", total_frames)
  frame_index = 0

  frames.each do |channel_frames|
    if @audio_file.info.channels > 1
      frame = channel_frames[0]
    else
      frame = channel_frames
    end

    @buckets.values.each { |b| b.set(frame_index, frame) }

    frame_index += 1
  end
end

#total_framesObject



92
93
94
# File 'lib/tsunami.rb', line 92

def total_frames
  @total_frames ||= @audio_file.info.frames
end