hindbaer 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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