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 ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.DS_Store
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'http://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in hindbaer.gemspec
4
+ gemspec
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
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
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,21 @@
1
+ module Hindbaer
2
+ class Fade
3
+
4
+ def initialize(node)
5
+ @doc = node
6
+ end
7
+
8
+ def start_time
9
+ @doc['Start']
10
+ end
11
+
12
+ def length
13
+ @doc['Length']
14
+ end
15
+
16
+ def gain
17
+ @doc['Gain']
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ module Hindbaer
2
+ class Marker
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 time
16
+ @doc['Time']
17
+ end
18
+ end
19
+ 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
@@ -0,0 +1,3 @@
1
+ module Hindbaer
2
+ VERSION = "0.0.1"
3
+ 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
@@ -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>
@@ -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
@@ -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
@@ -0,0 +1,6 @@
1
+ require 'minitest/autorun'
2
+
3
+ require 'bundler'
4
+ Bundler.require(:development)
5
+
6
+ require 'hindbaer'
@@ -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