waveform 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +48 -19
- data/Rakefile +1 -1
- data/lib/waveform.rb +1 -1
- data/test/waveform_test.rb +119 -0
- data/waveform.gemspec +2 -0
- metadata +14 -2
data/README.md
CHANGED
@@ -6,6 +6,26 @@ combine it with jPlayer to make a soundcloud.com style MP3 player. It also
|
|
6
6
|
comes with a handy CLI you can use to generate waveform images on the command
|
7
7
|
line.
|
8
8
|
|
9
|
+
Installation
|
10
|
+
============
|
11
|
+
|
12
|
+
Build libsndfile (http://www.mega-nerd.com/libsndfile/), or install it via `apt`
|
13
|
+
(`sudo apt-get install libsndfile1-dev`), or `libsndfile` in macports.
|
14
|
+
|
15
|
+
$ sudo gem install waveform
|
16
|
+
|
17
|
+
You might also want to, but don't have to:
|
18
|
+
|
19
|
+
$ sudo gem install oily_png
|
20
|
+
|
21
|
+
to make things a bit faster, and:
|
22
|
+
|
23
|
+
$ sudo apt-get install ffmpeg
|
24
|
+
|
25
|
+
if you want Waveform to convert non WAV audio for you.
|
26
|
+
|
27
|
+
_See Requirements below for more info_
|
28
|
+
|
9
29
|
CLI Usage
|
10
30
|
=========
|
11
31
|
|
@@ -23,11 +43,11 @@ There are some nifty options you can supply to switch things up:
|
|
23
43
|
'peak' or 'rms'. 'peak' is probably what you want because it looks
|
24
44
|
cooler, but 'rms' is closer to what you actually hear.
|
25
45
|
|
26
|
-
There
|
46
|
+
There are also some less-nifty options:
|
27
47
|
|
28
48
|
-q will generate your waveform without printing out a bunch of stuff.
|
29
49
|
-h will prit out a help screen with all this info.
|
30
|
-
|
50
|
+
|
31
51
|
Generating a small waveform "cut out" of a white background is pretty useful,
|
32
52
|
then you can overlay it on a web-gradient on the website for your new startup
|
33
53
|
and it will look really cool. To make it you could use:
|
@@ -68,18 +88,15 @@ format converters to convert your files to WAV before generating waveforms.
|
|
68
88
|
|
69
89
|
Or you could be all retro and use WAV audio for everything in the first place.
|
70
90
|
|
71
|
-
|
72
|
-
|
91
|
+
Tests
|
92
|
+
=====
|
73
93
|
|
74
|
-
|
75
|
-
second version in another couple. During those days I committed a cardinal sin
|
76
|
-
and didn't write any tests, because decoding sound files and drawing pictures
|
77
|
-
of them is more fun than writing tests. `ChunkyPNG` is cool though and will let
|
78
|
-
you read raw pixel data, so it should be pretty easy to write some tests that
|
79
|
-
actually read the pixel data of a waveform generated from a known source and
|
80
|
-
ensure everything went according to plan. I'll do that later.
|
94
|
+
Tests require `contest` gem & `ffmpeg` (to test conversion), run via:
|
81
95
|
|
82
|
-
|
96
|
+
$ rake
|
97
|
+
|
98
|
+
Sample sound file is in Public Domain from soundbible.com.
|
99
|
+
<http://soundbible.com/1598-Electronic-Chime.html>
|
83
100
|
|
84
101
|
References
|
85
102
|
==========
|
@@ -92,10 +109,22 @@ References
|
|
92
109
|
License
|
93
110
|
=======
|
94
111
|
|
95
|
-
Copyright (c) 2010 Ben Alavi
|
96
|
-
|
97
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
112
|
+
Copyright (c) 2010-2011 Ben Alavi
|
113
|
+
|
114
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
115
|
+
this software and associated documentation files (the "Software"), to deal in
|
116
|
+
the Software without restriction, including without limitation the rights to
|
117
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
118
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
119
|
+
so, subject to the following conditions:
|
120
|
+
|
121
|
+
The above copyright notice and this permission notice shall be included in all
|
122
|
+
copies or substantial portions of the Software.
|
123
|
+
|
124
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
125
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
126
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
127
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
128
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
129
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
130
|
+
SOFTWARE.
|
data/Rakefile
CHANGED
data/lib/waveform.rb
CHANGED
@@ -0,0 +1,119 @@
|
|
1
|
+
require "contest"
|
2
|
+
require "fileutils"
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "waveform"))
|
4
|
+
|
5
|
+
class WaveformTest < Test::Unit::TestCase
|
6
|
+
def self.fixture(file)
|
7
|
+
File.join(File.dirname(__FILE__), "fixtures", file)
|
8
|
+
end
|
9
|
+
def fixture(file);self.class.fixture(file);end;
|
10
|
+
|
11
|
+
def self.output(file)
|
12
|
+
File.join(File.dirname(__FILE__), "output", file)
|
13
|
+
end
|
14
|
+
def output(file);self.class.output(file);end;
|
15
|
+
|
16
|
+
def open_png(file)
|
17
|
+
ChunkyPNG::Image.from_datastream(ChunkyPNG::Datastream.from_file(file))
|
18
|
+
end
|
19
|
+
|
20
|
+
puts "Removing existing testing artifacts..."
|
21
|
+
FileUtils.rm_rf(output("")) if File.exists?(output(""))
|
22
|
+
FileUtils.mkdir(output(""))
|
23
|
+
sample_wav = fixture("sample_mp3.wav")
|
24
|
+
FileUtils.rm(sample_wav) if File.exists?(sample_wav)
|
25
|
+
|
26
|
+
context "generating waveform" do
|
27
|
+
setup do
|
28
|
+
@waveform = Waveform.new(fixture("sample.wav"))
|
29
|
+
end
|
30
|
+
|
31
|
+
should "generate waveform from audio source" do
|
32
|
+
@waveform.generate(output("waveform_from_audio_source.png"))
|
33
|
+
assert File.exists?(output("waveform_from_audio_source.png"))
|
34
|
+
|
35
|
+
image = open_png(output("waveform_from_audio_source.png"))
|
36
|
+
assert_equal ChunkyPNG::Color.from_hex(Waveform::DefaultOptions[:color]), image[60, 120]
|
37
|
+
assert_equal ChunkyPNG::Color.from_hex(Waveform::DefaultOptions[:background_color]), image[0, 0]
|
38
|
+
end
|
39
|
+
|
40
|
+
should "convert non-wav audio source before generation" do
|
41
|
+
Waveform.new(fixture("sample_mp3.mp3")).generate(output("from_mp3.png"))
|
42
|
+
|
43
|
+
assert File.exists?(output("from_mp3.png"))
|
44
|
+
end
|
45
|
+
|
46
|
+
should "log to given io" do
|
47
|
+
File.open(output("waveform.log"), "w") do |io|
|
48
|
+
Waveform.new(fixture("sample.wav"), io).generate(output("logged.png"))
|
49
|
+
end
|
50
|
+
|
51
|
+
assert_match /Generated waveform/, File.read(output("waveform.log"))
|
52
|
+
end
|
53
|
+
|
54
|
+
should "generate waveform using rms method instead of peak" do
|
55
|
+
@waveform.generate(output("peak.png"))
|
56
|
+
@waveform.generate(output("rms.png"), :method => :rms)
|
57
|
+
rms = open_png(output("rms.png"))
|
58
|
+
peak = open_png(output("peak.png"))
|
59
|
+
|
60
|
+
assert_equal ChunkyPNG::Color.from_hex(Waveform::DefaultOptions[:color]), peak[44, 43]
|
61
|
+
assert_equal ChunkyPNG::Color.from_hex(Waveform::DefaultOptions[:background_color]), rms[44, 43]
|
62
|
+
assert_equal ChunkyPNG::Color.from_hex(Waveform::DefaultOptions[:color]), rms[60, 120]
|
63
|
+
end
|
64
|
+
|
65
|
+
should "generate waveform 900px wide" do
|
66
|
+
@waveform.generate(output("width-900.png"), :width => 900)
|
67
|
+
image = open_png(output("width-900.png"))
|
68
|
+
|
69
|
+
assert_equal 900, image.width
|
70
|
+
end
|
71
|
+
|
72
|
+
should "generate waveform 100px tall" do
|
73
|
+
@waveform.generate(output("height-100.png"), :height => 100)
|
74
|
+
image = open_png(output("height-100.png"))
|
75
|
+
|
76
|
+
assert_equal 100, image.height
|
77
|
+
end
|
78
|
+
|
79
|
+
should "generate waveform on red background color" do
|
80
|
+
@waveform.generate(output("background_color-#ff0000.png"), :background_color => "#ff0000")
|
81
|
+
image = open_png(output("background_color-#ff0000.png"))
|
82
|
+
|
83
|
+
assert_equal ChunkyPNG::Color.from_hex("#ff0000"), image[0, 0]
|
84
|
+
end
|
85
|
+
|
86
|
+
should "generate waveform on transparent background color" do
|
87
|
+
@waveform.generate(output("background_color-transparent.png"), :background_color => :transparent)
|
88
|
+
image = open_png(output("background_color-transparent.png"))
|
89
|
+
|
90
|
+
assert_equal ChunkyPNG::Color::TRANSPARENT, image[0, 0]
|
91
|
+
end
|
92
|
+
|
93
|
+
should "generate waveform in black foreground color" do
|
94
|
+
@waveform.generate(output("color-#000000.png"), :color => "#000000")
|
95
|
+
image = open_png(output("color-#000000.png"))
|
96
|
+
|
97
|
+
assert_equal ChunkyPNG::Color.from_hex("#000000"), image[60, 120]
|
98
|
+
end
|
99
|
+
|
100
|
+
should "generate waveform on red background color with transparent foreground cut-out" do
|
101
|
+
@waveform.generate(output("background_color-#ff0000+color-transparent.png"), :background_color => "#ff0000", :color => :transparent)
|
102
|
+
image = open_png(output("background_color-#ff0000+color-transparent.png"))
|
103
|
+
|
104
|
+
assert_equal ChunkyPNG::Color.from_hex("#ff0000"), image[0, 0]
|
105
|
+
assert_equal ChunkyPNG::Color::TRANSPARENT, image[60, 120]
|
106
|
+
end
|
107
|
+
|
108
|
+
# Bright green is our transparency mask color, so this test ensures that we
|
109
|
+
# don't destroy the image if the background also uses the transparency mask
|
110
|
+
# color
|
111
|
+
should "generate waveform with transparent foreground on bright green background" do
|
112
|
+
@waveform.generate(output("background_color-#00ff00+color-transparent.png"), :background_color => "#00ff00", :color => :transparent)
|
113
|
+
image = open_png(output("background_color-#00ff00+color-transparent.png"))
|
114
|
+
|
115
|
+
assert_equal ChunkyPNG::Color.from_hex("#00ff00"), image[0, 0]
|
116
|
+
assert_equal ChunkyPNG::Color::TRANSPARENT, image[60, 120]
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
data/waveform.gemspec
CHANGED
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: waveform
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Ben Alavi
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-07-
|
13
|
+
date: 2011-07-18 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: ruby-audio
|
@@ -34,6 +34,17 @@ dependencies:
|
|
34
34
|
version: "0"
|
35
35
|
type: :runtime
|
36
36
|
version_requirements: *id002
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: contest
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: "0"
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id003
|
37
48
|
description: Generate waveform images from WAV and MP3 files -- in your code or via included CLI.
|
38
49
|
email:
|
39
50
|
- benalavi@gmail.com
|
@@ -48,6 +59,7 @@ files:
|
|
48
59
|
- Rakefile
|
49
60
|
- lib/waveform.rb
|
50
61
|
- waveform.gemspec
|
62
|
+
- test/waveform_test.rb
|
51
63
|
- bin/waveform
|
52
64
|
homepage: http://github.com/benalavi/waveform
|
53
65
|
licenses: []
|