hindbaer 0.0.1
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/.gitignore +18 -0
- data/Gemfile +4 -0
- data/Guardfile +15 -0
- data/README.markdown +100 -0
- data/Rakefile +2 -0
- data/hindbaer.gemspec +26 -0
- data/lib/hindbaer/audio.rb +36 -0
- data/lib/hindbaer/fade.rb +21 -0
- data/lib/hindbaer/marker.rb +19 -0
- data/lib/hindbaer/region.rb +59 -0
- data/lib/hindbaer/session.rb +88 -0
- data/lib/hindbaer/track.rb +23 -0
- data/lib/hindbaer/version.rb +3 -0
- data/lib/hindbaer.rb +23 -0
- data/spec/audio_spec.rb +38 -0
- data/spec/fade_spec.rb +23 -0
- data/spec/fixtures/project.nhsx +94 -0
- data/spec/marker_spec.rb +21 -0
- data/spec/region_spec.rb +49 -0
- data/spec/session_spec.rb +69 -0
- data/spec/spec_helper.rb +6 -0
- data/spec/track_spec.rb +21 -0
- metadata +152 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'minitest' do
|
5
|
+
# with Minitest::Unit
|
6
|
+
watch(%r|^test/test_(.*)\.rb|)
|
7
|
+
watch(%r|^lib/(.*)([^/]+)\.rb|) { |m| "test/#{m[1]}test_#{m[2]}.rb" }
|
8
|
+
watch(%r|^test/test_helper\.rb|) { "test" }
|
9
|
+
|
10
|
+
# with Minitest::Spec
|
11
|
+
watch(%r|^spec/(.*)_spec\.rb|)
|
12
|
+
watch(%r|^lib/(.*)\.rb|) { |m| "spec/#{m[1]}_spec.rb" }
|
13
|
+
watch(%r|^lib/hindbaer/(.*)\.rb|) { |m| "spec/#{m[1]}_spec.rb" }
|
14
|
+
watch(%r|^spec/spec_helper\.rb|) { "spec" }
|
15
|
+
end
|
data/README.markdown
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
Hindbær
|
2
|
+
=======
|
3
|
+
|
4
|
+
A [Hindenburg Journalist](http://hindenburgsystems.com/) client for parsing,
|
5
|
+
modifying and generating audio session files.
|
6
|
+
|
7
|
+
Installation
|
8
|
+
------------
|
9
|
+
|
10
|
+
gem install hindbaer
|
11
|
+
|
12
|
+
Usage
|
13
|
+
-----
|
14
|
+
|
15
|
+
Parse a session file:
|
16
|
+
|
17
|
+
project = Hindbaer::Session.new('spec/fixtures/project.nhsx')
|
18
|
+
project.software_version
|
19
|
+
project.sample_rate
|
20
|
+
project.title
|
21
|
+
project.subtitle
|
22
|
+
project.description
|
23
|
+
project.author
|
24
|
+
project.album
|
25
|
+
project.album_track
|
26
|
+
project.keywords
|
27
|
+
project.length # in seconds
|
28
|
+
|
29
|
+
Retrieve all tracks:
|
30
|
+
|
31
|
+
tracks = project.tracks
|
32
|
+
track = tracks.first
|
33
|
+
track.name
|
34
|
+
track.panning
|
35
|
+
|
36
|
+
Retrieve all regions for a given track:
|
37
|
+
|
38
|
+
regions = tracks.first.regions
|
39
|
+
region = region.first
|
40
|
+
region.reference # audio file reference
|
41
|
+
region.name
|
42
|
+
region.start_time
|
43
|
+
region.length
|
44
|
+
region.offset
|
45
|
+
region.fade_in
|
46
|
+
region.fade_out
|
47
|
+
region.gain
|
48
|
+
region.leq # (long-term equivalent level)
|
49
|
+
|
50
|
+
Retrieve all fades for a given region:
|
51
|
+
|
52
|
+
fades = regions.first.fades
|
53
|
+
fade = fades.first
|
54
|
+
fade.start_time
|
55
|
+
fade.length
|
56
|
+
fade.gain
|
57
|
+
|
58
|
+
Retrieve all markers:
|
59
|
+
|
60
|
+
markers = project.markers
|
61
|
+
marker = markers.first
|
62
|
+
marker.id
|
63
|
+
marker.name
|
64
|
+
marker.time
|
65
|
+
|
66
|
+
Retrieve all audio file references:
|
67
|
+
|
68
|
+
audio_pool = project.audio_pool
|
69
|
+
file = audio_pool.first
|
70
|
+
file.id
|
71
|
+
file.name
|
72
|
+
file.duration
|
73
|
+
file.num_channels
|
74
|
+
file.leq # (long-term equivalent level)
|
75
|
+
file.dynamics
|
76
|
+
file.original_path # original file path
|
77
|
+
|
78
|
+
License
|
79
|
+
-------
|
80
|
+
|
81
|
+
Copyright (c) 2011 Jamie Hodge
|
82
|
+
|
83
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
84
|
+
a copy of this software and associated documentation files (the
|
85
|
+
"Software"), to deal in the Software without restriction, including
|
86
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
87
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
88
|
+
permit persons to whom the Software is furnished to do so, subject to
|
89
|
+
the following conditions:
|
90
|
+
|
91
|
+
The above copyright notice and this permission notice shall be
|
92
|
+
included in all copies or substantial portions of the Software.
|
93
|
+
|
94
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
95
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
96
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
97
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
98
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
99
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
100
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
data/hindbaer.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/hindbaer/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Jamie Hodge"]
|
6
|
+
gem.email = ["jamiehodge@me.com"]
|
7
|
+
gem.description = %q{A Hindenburg Journalist client}
|
8
|
+
gem.summary = %q{Parse, modify and generate Hindenburg Journalist audio session files}
|
9
|
+
gem.homepage = "http://github.com/jamiehodge/hindbaer"
|
10
|
+
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
gem.name = "hindbaer"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Hindbaer::VERSION
|
17
|
+
|
18
|
+
gem.add_development_dependency 'bundler'
|
19
|
+
gem.add_development_dependency 'guard'
|
20
|
+
gem.add_development_dependency 'guard-minitest'
|
21
|
+
gem.add_development_dependency 'rb-fsevent'
|
22
|
+
gem.add_development_dependency 'growl_notify'
|
23
|
+
gem.add_development_dependency 'mocha'
|
24
|
+
|
25
|
+
gem.add_dependency 'nokogiri'
|
26
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Hindbaer
|
2
|
+
class Audio
|
3
|
+
def initialize(fragment)
|
4
|
+
@doc = fragment
|
5
|
+
end
|
6
|
+
|
7
|
+
def id
|
8
|
+
@doc['Id'].to_i
|
9
|
+
end
|
10
|
+
|
11
|
+
def name
|
12
|
+
@doc['Name']
|
13
|
+
end
|
14
|
+
|
15
|
+
def duration
|
16
|
+
@doc['Duration']
|
17
|
+
end
|
18
|
+
|
19
|
+
def num_channels
|
20
|
+
@doc['Channels'].to_i
|
21
|
+
end
|
22
|
+
|
23
|
+
def leq
|
24
|
+
@doc['Leq'].to_f || 0
|
25
|
+
end
|
26
|
+
|
27
|
+
def dynamics
|
28
|
+
@doc['Dyn'].to_f || 0
|
29
|
+
end
|
30
|
+
|
31
|
+
def original_path
|
32
|
+
return unless md = @doc.at_css('MetaData')
|
33
|
+
md['OriginalPath']
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Hindbaer
|
2
|
+
class Region
|
3
|
+
def initialize(node, track = nil)
|
4
|
+
@doc = node
|
5
|
+
@track = track
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader :track
|
9
|
+
|
10
|
+
def reference
|
11
|
+
id = @doc['Ref'].to_i
|
12
|
+
self.track.session.audio_pool.find { |a| a.id == id }
|
13
|
+
end
|
14
|
+
|
15
|
+
def name
|
16
|
+
@doc['Name']
|
17
|
+
end
|
18
|
+
|
19
|
+
def start_time
|
20
|
+
@doc['Start'] || '00.0'
|
21
|
+
end
|
22
|
+
|
23
|
+
def length
|
24
|
+
@doc['Length']
|
25
|
+
end
|
26
|
+
|
27
|
+
def relative_length
|
28
|
+
length / track.session.length
|
29
|
+
end
|
30
|
+
|
31
|
+
def offset
|
32
|
+
@doc['Offset'] || '00:00'
|
33
|
+
end
|
34
|
+
|
35
|
+
def fade_in
|
36
|
+
@doc['FadeIn']|| '00.0'
|
37
|
+
end
|
38
|
+
|
39
|
+
def fade_out
|
40
|
+
@doc['FadeOut'] || '00.0'
|
41
|
+
end
|
42
|
+
|
43
|
+
def gain
|
44
|
+
@doc['Gain'].to_f || 0.0
|
45
|
+
end
|
46
|
+
|
47
|
+
def leq
|
48
|
+
@doc['Leq'].to_f || 0.0
|
49
|
+
end
|
50
|
+
|
51
|
+
def dynamics
|
52
|
+
@doc['Dyn'].to_f || 0.0
|
53
|
+
end
|
54
|
+
|
55
|
+
def fades
|
56
|
+
@doc.css('Fade').map { |f| Hindbaer::Fade.new(f.unlink) }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module Hindbaer
|
2
|
+
|
3
|
+
class Session
|
4
|
+
def initialize(file)
|
5
|
+
File.open(file, 'r') do |file|
|
6
|
+
@doc = Nokogiri::XML(file)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def software_version
|
11
|
+
@doc.at_css('Session')['Version']
|
12
|
+
end
|
13
|
+
|
14
|
+
def sample_rate
|
15
|
+
@doc.at_css('Session')['Samplerate']
|
16
|
+
end
|
17
|
+
|
18
|
+
def name
|
19
|
+
info['Name']
|
20
|
+
end
|
21
|
+
|
22
|
+
def title
|
23
|
+
info['Title']
|
24
|
+
end
|
25
|
+
|
26
|
+
def subtitle
|
27
|
+
info['Subtitle']
|
28
|
+
end
|
29
|
+
|
30
|
+
def author
|
31
|
+
info['Author']
|
32
|
+
end
|
33
|
+
|
34
|
+
def description
|
35
|
+
info['Description']
|
36
|
+
end
|
37
|
+
|
38
|
+
def album
|
39
|
+
info['Album']
|
40
|
+
end
|
41
|
+
|
42
|
+
def album_track
|
43
|
+
info['Track']
|
44
|
+
end
|
45
|
+
|
46
|
+
def keywords
|
47
|
+
info['Keywords'].split(',').map { |k| k.strip }
|
48
|
+
end
|
49
|
+
|
50
|
+
def audio_pool
|
51
|
+
@doc.css('AudioPool File').map { |f| Hindbaer::Audio.new(f.unlink) }
|
52
|
+
end
|
53
|
+
|
54
|
+
def audio_pool_path
|
55
|
+
@doc.at_css('AudioPool')['Path']
|
56
|
+
end
|
57
|
+
|
58
|
+
def audio_pool_location
|
59
|
+
@doc.at_css('AudioPool')['Location']
|
60
|
+
end
|
61
|
+
|
62
|
+
def tracks
|
63
|
+
@doc.css('Tracks Track').map { |t| Hindbaer::Track.new(t.unlink, self) }
|
64
|
+
end
|
65
|
+
|
66
|
+
def markers
|
67
|
+
@doc.css('Markers Marker').map { |m| Hindbaer::Marker.new(m.unlink) }
|
68
|
+
end
|
69
|
+
|
70
|
+
def length
|
71
|
+
regions = tracks.map do |t|
|
72
|
+
t.regions.last
|
73
|
+
end.compact
|
74
|
+
|
75
|
+
regions.map do |r|
|
76
|
+
Hindbaer.tc_to_secs(r.start_time) +
|
77
|
+
Hindbaer.tc_to_secs(r.length)
|
78
|
+
end.max
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def info
|
84
|
+
@doc.at_css('Info')
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Hindbaer
|
2
|
+
class Track
|
3
|
+
|
4
|
+
def initialize(node, session = nil)
|
5
|
+
@doc = node
|
6
|
+
@session = session
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_reader :session
|
10
|
+
|
11
|
+
def name
|
12
|
+
@doc['Name']
|
13
|
+
end
|
14
|
+
|
15
|
+
def pan
|
16
|
+
@doc['Pan']
|
17
|
+
end
|
18
|
+
|
19
|
+
def regions
|
20
|
+
@doc.css('Region').map { |r| Hindbaer::Region.new(r.unlink, self) }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/hindbaer.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
|
3
|
+
require 'nokogiri'
|
4
|
+
|
5
|
+
require 'hindbaer/version'
|
6
|
+
require 'hindbaer/session'
|
7
|
+
require 'hindbaer/audio'
|
8
|
+
require 'hindbaer/track'
|
9
|
+
require 'hindbaer/region'
|
10
|
+
require 'hindbaer/fade'
|
11
|
+
require 'hindbaer/marker'
|
12
|
+
|
13
|
+
module Hindbaer
|
14
|
+
extend self
|
15
|
+
|
16
|
+
def tc_to_secs(timecode)
|
17
|
+
seconds, minutes, hours = timecode.split(':').reverse
|
18
|
+
total = seconds.to_f if seconds
|
19
|
+
total += minutes.to_f * 60 if minutes
|
20
|
+
total += hours.to_f * 60 * 60 if hours
|
21
|
+
total
|
22
|
+
end
|
23
|
+
end
|
data/spec/audio_spec.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hindbaer::Audio do
|
4
|
+
|
5
|
+
before do
|
6
|
+
project = Hindbaer::Session.new('spec/fixtures/project.nhsx')
|
7
|
+
@audio = project.audio_pool.first
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'must return id' do
|
11
|
+
@audio.id.must_equal 1
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'must return name' do
|
15
|
+
@audio.name.must_equal 'file1.wav'
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'must return duration' do
|
19
|
+
@audio.duration.must_equal '2:51:09.025'
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'must return the number of channels' do
|
23
|
+
@audio.num_channels.must_equal 2
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'must return leq' do
|
27
|
+
@audio.leq.must_equal -10.4
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'must return dynamics' do
|
31
|
+
@audio.dynamics.must_equal 0.0
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'must return the original file path' do
|
35
|
+
@audio.original_path.must_equal '/path/to/file1.wav'
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
data/spec/fade_spec.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hindbaer::Fade do
|
4
|
+
|
5
|
+
before do
|
6
|
+
project = Hindbaer::Session.new('spec/fixtures/project.nhsx')
|
7
|
+
track = project.tracks[2]
|
8
|
+
region = track.regions.first
|
9
|
+
@fade = region.fades.first
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'must return start time' do
|
13
|
+
@fade.start_time.must_equal '06.426'
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'must return length' do
|
17
|
+
@fade.length.must_equal '00.351'
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'must return gain' do
|
21
|
+
@fade.gain.must_equal '-11.4868'
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<Session Version="Hindenburg Journalist Pro 1.12.1752" Samplerate="44100">
|
3
|
+
<Info Subtitle="An example session" Album="An example album" Track="An example track" Author="Jamie Hodge" Description="An example description" Title="Example session" Keywords="example, test"/>
|
4
|
+
<AudioPool Path="Example session Files" Location="/Users/jamiehodge/Desktop">
|
5
|
+
<File Id="1" Name="file1.wav" Duration="2:51:09.025" Channels="2" Leq="-10.4">
|
6
|
+
<MetaData OriginalPath="/path/to/file1.wav"/>
|
7
|
+
</File>
|
8
|
+
<File Id="2" Name="file2.wav" Duration="04:03.670" Channels="2" Leq="-16.4">
|
9
|
+
<MetaData OriginalPath="/path/to/file2.wav"/>
|
10
|
+
</File>
|
11
|
+
<File Id="3" Name="file3.wav" Duration="18.945" Channels="2" Leq="-20.2">
|
12
|
+
<MetaData OriginalPath="/path/to/file3.wav"/>
|
13
|
+
</File>
|
14
|
+
<File Id="4" Name="file4.wav" Duration="1:12:23.850" Channels="2" Leq="-16.2">
|
15
|
+
<MetaData OriginalPath="/path/to/file4.wav/>
|
16
|
+
</File>
|
17
|
+
</AudioPool>
|
18
|
+
<Tracks>
|
19
|
+
<Track Name="Speak" Pan="0.025">
|
20
|
+
<Region Ref="1" Name="Speak 1" Length="11.099" Offset="08.000" FadeIn="01.000" FadeOut="00.294" Gain="-3.3" Leq="-16.4">
|
21
|
+
<Fade Start="00.200" Length="01.013" Gain="2.33123"/>
|
22
|
+
</Region>
|
23
|
+
<Region Ref="1" Name="Speak 2" Start="44.171" Length="08.808" Offset="01:11.521" FadeIn="00.036" FadeOut="00.245" Gain="-0.8" Leq="-16.4"/>
|
24
|
+
</Track>
|
25
|
+
<Track Name="Interview" Pan="0.025">
|
26
|
+
<Region Ref="2" Name="Interview 1" Start="10.758" Length="33.553" FadeIn="00.085" Gain="1.2" Leq="-21.1"/>
|
27
|
+
<Region Ref="2" Name="Interview 2" Start="58.078" Length="05.636" Offset="05.840" FadeIn="00.773" FadeOut="00.140" Gain="-3.7"/>
|
28
|
+
<Plugins>
|
29
|
+
<Plugin Id="0" Name="Equalizer" UID="nheq" Bypass="1" MF_Q="0.1" LF_Gain="0.5" HP_Freq="0.00454545" HP_Gain="0.2" HF_Q="0.1" MF_Gain="0.5" HF_Gain="0.5" HF_Freq="0.363636" HF_Type="0" MF_Freq="0.0454545" LF_Freq="0.00909091" LF_Q="0.1" LF_Type="0">
|
30
|
+
<![CDATA[]]>
|
31
|
+
</Plugin>
|
32
|
+
</Plugins>
|
33
|
+
</Track>
|
34
|
+
<Track Name="Ambience">
|
35
|
+
<Region Ref="3" Name="Ambience 1" Start="52.822" Length="10.285" Offset="01:10.203" FadeIn="00.100" FadeOut="00.200" Gain="3.2" Leq="-26.2">
|
36
|
+
<Fade Start="06.426" Length="00.351" Gain="-11.4868"/>
|
37
|
+
</Region>
|
38
|
+
<Region Ref="3" Name="Ambience 2" Start="01:02.907" Length="01:30.618" Offset="30.710" FadeIn="00.200" FadeOut="03.493" Gain="-4.7" Leq="-26.2">
|
39
|
+
<Fade Start="00.200" Length="01.013" Gain="2.33123"/>
|
40
|
+
<Fade Start="22.564" Length="01.577" Gain="-21.9136"/>
|
41
|
+
<Fade Start="36.697" Length="04.043" Gain="-23.0791"/>
|
42
|
+
<Fade Start="41.296" Length="05.464" Gain="-20.7479"/>
|
43
|
+
<Fade Start="49.727" Length="02.221" Gain="-19.5823"/>
|
44
|
+
<Fade Start="54.777" Length="01.750" Gain="0.932491"/>
|
45
|
+
<Fade Start="01:08.548" Length="01.475" Gain="-21.6804"/>
|
46
|
+
<Fade Start="01:19.307" Length="00.366" Gain="0.233123"/>
|
47
|
+
<Fade Start="01:22.591" Length="04.534" Gain="-13.5211"/>
|
48
|
+
</Region>
|
49
|
+
</Track>
|
50
|
+
<Track Name="Music">
|
51
|
+
<Region Ref="4" Name="Music 1" Length="12:43.363" FadeIn="33.600" Gain="-24.3" Leq="-10.4">
|
52
|
+
<Fade Start="52.061" Length="00.833" Gain="-25.6549"/>
|
53
|
+
<Fade Start="53.554" Length="06.690" Gain="-27.5199"/>
|
54
|
+
<Fade Start="01:15.820" Length="01.072" Gain="-27.2867"/>
|
55
|
+
<Fade Start="01:21.182" Length="01.072" Gain="-28.2193"/>
|
56
|
+
<Fade Start="01:39.550" Length="02.357" Gain="-25.4218"/>
|
57
|
+
<Fade Start="01:51.335" Length="02.357" Gain="-28.2193"/>
|
58
|
+
<Fade Start="04:10.289" Length="04.000" Gain="-34.7467"/>
|
59
|
+
<Fade Start="04:34.007" Length="04.000" Gain="-28.2193"/>
|
60
|
+
<Fade Start="05:23.655" Length="03.435" Gain="-25.6549"/>
|
61
|
+
<Fade Start="05:40.833" Length="03.435" Gain="-28.2193"/>
|
62
|
+
<Fade Start="07:50.425" Length="01.666" Gain="-22.1581"/>
|
63
|
+
<Fade Start="07:59.759" Length="04.266" Gain="-28.2193"/>
|
64
|
+
<Fade Start="08:40.114" Length="06.116" Gain="-16.7963"/>
|
65
|
+
<Fade Start="09:01.125" Length="08.671" Gain="-25.6549"/>
|
66
|
+
<Fade Start="09:44.453" Length="09.621" Gain="-23.5568"/>
|
67
|
+
<Fade Start="10:23.671" Length="05.839" Gain="-25.6549"/>
|
68
|
+
<Fade Start="11:31.380" Length="10.503" Gain="-19.3606"/>
|
69
|
+
<Fade Start="12:30.116" Length="05.898" Gain="-25.6549"/>
|
70
|
+
</Region>
|
71
|
+
<Region Ref="4" Name="Music 2" Start="14:25.914" Length="2:36:43.111" Offset="14:25.914" Gain="-28.2" Leq="-10.4"/>
|
72
|
+
</Track>
|
73
|
+
<Track Name="Empty" Pan="-0.425"/>
|
74
|
+
</Tracks>
|
75
|
+
<Clipboard>
|
76
|
+
<Group Caption="Group 1" Used="2">
|
77
|
+
<Clip Ref="2" Name="Group 1 1" Length="04:03.669" Leq="-"/>
|
78
|
+
<Clip Ref="4" Name="Group 1 2" Length="1:12:23.850" Leq="-"/>
|
79
|
+
</Group>
|
80
|
+
<Group Caption="Group 2" Used="1">
|
81
|
+
<Clip Ref="1" Name="Group 2 1" Length="03:34.460" Leq="-"/>
|
82
|
+
<Clip Ref="2" Name="Group 2 2" Length="02:19.878" Leq="-"/>
|
83
|
+
</Group>
|
84
|
+
<Group Caption="Group 3" Used="2">
|
85
|
+
<Clip Ref="3" Name="Group 3 1" Length="03:16.023" Leq="-"/>
|
86
|
+
<Clip Ref="4" Name="Group 3 2" Length="02:24.057" Leq="-"/>
|
87
|
+
</Group>
|
88
|
+
<Group Caption="Group 4"/>
|
89
|
+
</Clipboard>
|
90
|
+
<Markers>
|
91
|
+
<Marker Id="1" Name="In" Time="01:01.000"/>
|
92
|
+
<Marker Id="2" Name="Out" Time="12:42.720"/>
|
93
|
+
</Markers>
|
94
|
+
</Session>
|
data/spec/marker_spec.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hindbaer::Marker do
|
4
|
+
|
5
|
+
before do
|
6
|
+
project = Hindbaer::Session.new('spec/fixtures/project.nhsx')
|
7
|
+
@marker = project.markers.first
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'must return id' do
|
11
|
+
@marker.id.must_equal 1
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'must return name' do
|
15
|
+
@marker.name.must_equal 'In'
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'must return time' do
|
19
|
+
@marker.time.must_equal '01:01.000'
|
20
|
+
end
|
21
|
+
end
|
data/spec/region_spec.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hindbaer::Region do
|
4
|
+
|
5
|
+
before do
|
6
|
+
session = Hindbaer::Session.new('spec/fixtures/project.nhsx')
|
7
|
+
@region = session.tracks.first.regions.first
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'must return audio reference' do
|
11
|
+
@region.reference.id.must_equal 1
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'must return name' do
|
15
|
+
@region.name.must_equal 'Speak 1'
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'must return start time' do
|
19
|
+
@region.start_time.must_equal '00.0'
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'must return length' do
|
23
|
+
@region.length.must_equal '11.099'
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'must return offset' do
|
27
|
+
@region.offset.must_equal '08.000'
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'must return fade_in' do
|
31
|
+
@region.fade_in.must_equal '01.000'
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'must return fade_out' do
|
35
|
+
@region.fade_out.must_equal '00.294'
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'must return gain' do
|
39
|
+
@region.gain.must_equal -3.3
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'must return long-term equivalent level' do
|
43
|
+
@region.leq.must_equal -16.4
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'must return all fades' do
|
47
|
+
@region.fades.size.must_equal 1
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hindbaer::Session do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@session = Hindbaer::Session.new('spec/fixtures/project.nhsx')
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'must return software version' do
|
10
|
+
@session.software_version.must_equal 'Hindenburg Journalist Pro 1.12.1752'
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'must return sample rate' do
|
14
|
+
@session.sample_rate.must_equal '44100'
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'must return title' do
|
18
|
+
@session.title.must_equal 'Example session'
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'must return subtitle' do
|
22
|
+
@session.subtitle.must_equal 'An example session'
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'must return description' do
|
26
|
+
@session.description.must_equal 'An example description'
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'must return author' do
|
30
|
+
@session.author.must_equal 'Jamie Hodge'
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'must return album' do
|
34
|
+
@session.album.must_equal 'An example album'
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'must return album track' do
|
38
|
+
@session.album_track.must_equal 'An example track'
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'must return keywords' do
|
42
|
+
@session.keywords.must_equal ['example', 'test']
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'must return all audio files' do
|
46
|
+
@session.audio_pool.size.must_equal 4
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'must return path to audio files' do
|
50
|
+
@session.audio_pool_path.must_equal 'Example session Files'
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'must return location of audio file path' do
|
54
|
+
@session.audio_pool_location.must_equal '/Users/jamiehodge/Desktop'
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'must return all tracks' do
|
58
|
+
@session.tracks.size.must_equal 5
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'must return all markers' do
|
62
|
+
@session.markers.size.must_equal 2
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'must calculate the total length in seconds' do
|
66
|
+
@session.length.must_equal 10269.025000000001
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/spec/track_spec.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hindbaer::Track do
|
4
|
+
|
5
|
+
before do
|
6
|
+
project = Hindbaer::Session.new('spec/fixtures/project.nhsx')
|
7
|
+
@track = project.tracks.first
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'must return name' do
|
11
|
+
@track.name.must_equal 'Speak'
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'must return panning' do
|
15
|
+
@track.pan.must_equal '0.025'
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'must return all regions' do
|
19
|
+
@track.regions.size.must_equal 2
|
20
|
+
end
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hindbaer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jamie Hodge
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-08-24 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: &70169311054780 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70169311054780
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: guard
|
27
|
+
requirement: &70169311056940 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70169311056940
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: guard-minitest
|
38
|
+
requirement: &70169311058800 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70169311058800
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rb-fsevent
|
49
|
+
requirement: &70169311068340 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70169311068340
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: growl_notify
|
60
|
+
requirement: &70169311070940 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70169311070940
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: mocha
|
71
|
+
requirement: &70169313613200 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *70169313613200
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: nokogiri
|
82
|
+
requirement: &70169313675020 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
type: :runtime
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *70169313675020
|
91
|
+
description: A Hindenburg Journalist client
|
92
|
+
email:
|
93
|
+
- jamiehodge@me.com
|
94
|
+
executables: []
|
95
|
+
extensions: []
|
96
|
+
extra_rdoc_files: []
|
97
|
+
files:
|
98
|
+
- .gitignore
|
99
|
+
- Gemfile
|
100
|
+
- Guardfile
|
101
|
+
- README.markdown
|
102
|
+
- Rakefile
|
103
|
+
- hindbaer.gemspec
|
104
|
+
- lib/hindbaer.rb
|
105
|
+
- lib/hindbaer/audio.rb
|
106
|
+
- lib/hindbaer/fade.rb
|
107
|
+
- lib/hindbaer/marker.rb
|
108
|
+
- lib/hindbaer/region.rb
|
109
|
+
- lib/hindbaer/session.rb
|
110
|
+
- lib/hindbaer/track.rb
|
111
|
+
- lib/hindbaer/version.rb
|
112
|
+
- spec/audio_spec.rb
|
113
|
+
- spec/fade_spec.rb
|
114
|
+
- spec/fixtures/project.nhsx
|
115
|
+
- spec/marker_spec.rb
|
116
|
+
- spec/region_spec.rb
|
117
|
+
- spec/session_spec.rb
|
118
|
+
- spec/spec_helper.rb
|
119
|
+
- spec/track_spec.rb
|
120
|
+
homepage: http://github.com/jamiehodge/hindbaer
|
121
|
+
licenses: []
|
122
|
+
post_install_message:
|
123
|
+
rdoc_options: []
|
124
|
+
require_paths:
|
125
|
+
- lib
|
126
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
127
|
+
none: false
|
128
|
+
requirements:
|
129
|
+
- - ! '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
|
+
none: false
|
134
|
+
requirements:
|
135
|
+
- - ! '>='
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0'
|
138
|
+
requirements: []
|
139
|
+
rubyforge_project:
|
140
|
+
rubygems_version: 1.8.5
|
141
|
+
signing_key:
|
142
|
+
specification_version: 3
|
143
|
+
summary: Parse, modify and generate Hindenburg Journalist audio session files
|
144
|
+
test_files:
|
145
|
+
- spec/audio_spec.rb
|
146
|
+
- spec/fade_spec.rb
|
147
|
+
- spec/fixtures/project.nhsx
|
148
|
+
- spec/marker_spec.rb
|
149
|
+
- spec/region_spec.rb
|
150
|
+
- spec/session_spec.rb
|
151
|
+
- spec/spec_helper.rb
|
152
|
+
- spec/track_spec.rb
|