tsunami 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/lib/tsunami/bucket.rb +37 -0
- data/lib/tsunami.rb +44 -22
- data/tsunami.gemspec +4 -3
- metadata +33 -17
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
class Tsunami
|
4
|
+
class Bucket
|
5
|
+
extend ::Forwardable
|
6
|
+
|
7
|
+
def_delegator :@values, :each, :each_value
|
8
|
+
def_delegator :@values, :each_with_index, :each_value_with_index
|
9
|
+
|
10
|
+
attr_reader :width, :height, :frames
|
11
|
+
|
12
|
+
def initialize(frames, width, height)
|
13
|
+
@values = []
|
14
|
+
@frames = frames
|
15
|
+
@width = width
|
16
|
+
@height = height
|
17
|
+
end
|
18
|
+
|
19
|
+
def set(frame, value)
|
20
|
+
values(frame)[:min] = value if value < values(frame)[:min]
|
21
|
+
|
22
|
+
values(frame)[:max] = value if value > values(frame)[:max]
|
23
|
+
end
|
24
|
+
|
25
|
+
def frames_per_pixel
|
26
|
+
@frames_per_pixel ||= frames / @width
|
27
|
+
end
|
28
|
+
|
29
|
+
def index(frame)
|
30
|
+
frame / frames_per_pixel
|
31
|
+
end
|
32
|
+
|
33
|
+
def values(frame)
|
34
|
+
@values[index(frame)] ||= { :max => -1, :min => 1 }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/tsunami.rb
CHANGED
@@ -3,6 +3,7 @@ require 'rubygems'
|
|
3
3
|
require 'RMagick'
|
4
4
|
require 'ruby-audio'
|
5
5
|
require 'buffer_ext.rb'
|
6
|
+
require 'tsunami/bucket'
|
6
7
|
|
7
8
|
class Tsunami
|
8
9
|
|
@@ -11,26 +12,49 @@ class Tsunami
|
|
11
12
|
end
|
12
13
|
|
13
14
|
def create_waveform(image_file, options = {})
|
14
|
-
|
15
|
-
|
15
|
+
dimensions = {
|
16
|
+
:width => options[:width] || 100,
|
17
|
+
:height => options[:height] || 50
|
18
|
+
}
|
16
19
|
|
17
|
-
|
20
|
+
versions = {
|
21
|
+
image_file => dimensions
|
22
|
+
}
|
18
23
|
|
19
|
-
|
24
|
+
create_waveforms(versions)
|
25
|
+
end
|
26
|
+
|
27
|
+
def create_waveforms(versions)
|
28
|
+
create_buckets versions
|
29
|
+
fill_buckets
|
30
|
+
|
31
|
+
@buckets.each do |key, bucket|
|
32
|
+
canvas = draw_waveform_from_bucket(bucket)
|
33
|
+
canvas.write(key.to_s)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def draw_waveform_from_bucket(bucket)
|
38
|
+
gc = build_graph bucket
|
20
39
|
|
21
|
-
canvas = Magick::Image.new(
|
40
|
+
canvas = Magick::Image.new(bucket.width, bucket.height) { self.background_color = 'transparent' }
|
22
41
|
|
23
42
|
gc.draw(canvas)
|
24
43
|
|
25
|
-
canvas
|
44
|
+
canvas
|
45
|
+
end
|
46
|
+
|
47
|
+
def create_buckets(versions)
|
48
|
+
@buckets = {}
|
49
|
+
versions.each_key do |key|
|
50
|
+
@buckets[key] = Bucket.new(total_frames, versions[key][:width], versions[key][:height])
|
51
|
+
end
|
26
52
|
end
|
27
53
|
|
28
54
|
def fill_buckets
|
29
55
|
@audio_file.seek(0,0)
|
30
|
-
frames = @audio_file.read("float",
|
31
|
-
buckets = []
|
56
|
+
frames = @audio_file.read("float", total_frames)
|
32
57
|
frame_index = 0
|
33
|
-
frames_per_pixel = frames.size / @width
|
34
58
|
|
35
59
|
frames.each do |channel_frames|
|
36
60
|
if @audio_file.info.channels > 1
|
@@ -39,29 +63,22 @@ class Tsunami
|
|
39
63
|
frame = channel_frames
|
40
64
|
end
|
41
65
|
|
42
|
-
|
43
|
-
buckets[index] ||= { :max => -1, :min => 1 }
|
44
|
-
|
45
|
-
buckets[index][:min] = frame if frame < buckets[index][:min]
|
46
|
-
|
47
|
-
buckets[index][:max] = frame if frame > buckets[index][:max]
|
66
|
+
@buckets.values.each { |b| b.set(frame_index, frame) }
|
48
67
|
|
49
68
|
frame_index += 1
|
50
69
|
end
|
51
|
-
|
52
|
-
return buckets[0, @width]
|
53
70
|
end
|
54
71
|
|
55
|
-
def build_graph
|
72
|
+
def build_graph bucket
|
56
73
|
gc = Magick::Draw.new
|
57
74
|
gc.stroke('red')
|
58
75
|
gc.stroke_width(1)
|
59
76
|
|
60
|
-
mid =
|
77
|
+
mid = bucket.height / 2
|
61
78
|
|
62
|
-
|
63
|
-
low =
|
64
|
-
high =
|
79
|
+
bucket.each_value_with_index do |values, i|
|
80
|
+
low = values[:min]
|
81
|
+
high = values[:max]
|
65
82
|
|
66
83
|
low_point = mid * ( 1 - low )
|
67
84
|
high_point = mid * ( 1 - high )
|
@@ -71,4 +88,9 @@ class Tsunami
|
|
71
88
|
|
72
89
|
return gc
|
73
90
|
end
|
91
|
+
|
92
|
+
def total_frames
|
93
|
+
@total_frames ||= @audio_file.info.frames
|
94
|
+
end
|
95
|
+
|
74
96
|
end
|
data/tsunami.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{tsunami}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Andrei Bocan"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-04-19}
|
13
13
|
s.description = %q{For reals, it draws waveforms, man}
|
14
14
|
s.email = %q{zmaxor@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -25,6 +25,7 @@ Gem::Specification.new do |s|
|
|
25
25
|
"VERSION",
|
26
26
|
"lib/buffer_ext.rb",
|
27
27
|
"lib/tsunami.rb",
|
28
|
+
"lib/tsunami/bucket.rb",
|
28
29
|
"test/helper.rb",
|
29
30
|
"test/test_tsunami.rb",
|
30
31
|
"tsunami.gemspec"
|
@@ -32,7 +33,7 @@ Gem::Specification.new do |s|
|
|
32
33
|
s.homepage = %q{http://github.com/zmack/tsunami}
|
33
34
|
s.rdoc_options = ["--charset=UTF-8"]
|
34
35
|
s.require_paths = ["lib"]
|
35
|
-
s.rubygems_version = %q{1.3.
|
36
|
+
s.rubygems_version = %q{1.3.6}
|
36
37
|
s.summary = %q{It draws waveforms.}
|
37
38
|
s.test_files = [
|
38
39
|
"test/helper.rb",
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tsunami
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 3
|
8
|
+
- 0
|
9
|
+
version: 0.3.0
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Andrei Bocan
|
@@ -9,39 +14,47 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-
|
17
|
+
date: 2010-04-19 00:00:00 +03:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: rmagick
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
25
|
- - ">="
|
22
26
|
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
23
29
|
version: "0"
|
24
|
-
|
30
|
+
type: :runtime
|
31
|
+
version_requirements: *id001
|
25
32
|
- !ruby/object:Gem::Dependency
|
26
33
|
name: ruby-audio
|
27
|
-
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
34
|
+
prerelease: false
|
35
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
37
|
- - ">="
|
32
38
|
- !ruby/object:Gem::Version
|
39
|
+
segments:
|
40
|
+
- 1
|
41
|
+
- 0
|
42
|
+
- 0
|
33
43
|
version: 1.0.0
|
34
|
-
|
44
|
+
type: :runtime
|
45
|
+
version_requirements: *id002
|
35
46
|
- !ruby/object:Gem::Dependency
|
36
47
|
name: thoughtbot-shoulda
|
37
|
-
|
38
|
-
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
48
|
+
prerelease: false
|
49
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
40
50
|
requirements:
|
41
51
|
- - ">="
|
42
52
|
- !ruby/object:Gem::Version
|
53
|
+
segments:
|
54
|
+
- 0
|
43
55
|
version: "0"
|
44
|
-
|
56
|
+
type: :development
|
57
|
+
version_requirements: *id003
|
45
58
|
description: For reals, it draws waveforms, man
|
46
59
|
email: zmaxor@gmail.com
|
47
60
|
executables: []
|
@@ -60,6 +73,7 @@ files:
|
|
60
73
|
- VERSION
|
61
74
|
- lib/buffer_ext.rb
|
62
75
|
- lib/tsunami.rb
|
76
|
+
- lib/tsunami/bucket.rb
|
63
77
|
- test/helper.rb
|
64
78
|
- test/test_tsunami.rb
|
65
79
|
- tsunami.gemspec
|
@@ -76,18 +90,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
76
90
|
requirements:
|
77
91
|
- - ">="
|
78
92
|
- !ruby/object:Gem::Version
|
93
|
+
segments:
|
94
|
+
- 0
|
79
95
|
version: "0"
|
80
|
-
version:
|
81
96
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
97
|
requirements:
|
83
98
|
- - ">="
|
84
99
|
- !ruby/object:Gem::Version
|
100
|
+
segments:
|
101
|
+
- 0
|
85
102
|
version: "0"
|
86
|
-
version:
|
87
103
|
requirements: []
|
88
104
|
|
89
105
|
rubyforge_project:
|
90
|
-
rubygems_version: 1.3.
|
106
|
+
rubygems_version: 1.3.6
|
91
107
|
signing_key:
|
92
108
|
specification_version: 3
|
93
109
|
summary: It draws waveforms.
|