hindbaer 0.0.4 → 0.0.5
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/README.markdown +25 -23
- data/lib/hindbaer/audio_pool.rb +26 -9
- data/lib/hindbaer/clip.rb +15 -17
- data/lib/hindbaer/fade.rb +15 -9
- data/lib/hindbaer/file.rb +22 -24
- data/lib/hindbaer/group.rb +28 -13
- data/lib/hindbaer/info.rb +27 -74
- data/lib/hindbaer/marker.rb +20 -9
- data/lib/hindbaer/plugin.rb +5 -5
- data/lib/hindbaer/plugin/base.rb +21 -11
- data/lib/hindbaer/plugin/compressor.rb +11 -9
- data/lib/hindbaer/plugin/equalizer.rb +27 -53
- data/lib/hindbaer/plugin/voice_profiler.rb +31 -55
- data/lib/hindbaer/region.rb +28 -52
- data/lib/hindbaer/session.rb +47 -72
- data/lib/hindbaer/track.rb +41 -16
- data/lib/hindbaer/version.rb +1 -1
- data/spec/audio_pool_spec.rb +4 -2
- data/spec/clip_spec.rb +6 -8
- data/spec/fade_spec.rb +7 -5
- data/spec/file_spec.rb +8 -6
- data/spec/fixtures/{project.nhsx → session.nhsx} +0 -0
- data/spec/group_spec.rb +5 -7
- data/spec/info_spec.rb +6 -4
- data/spec/marker_spec.rb +5 -3
- data/spec/{plugin_base_spec.rb → plugin/base_spec.rb} +6 -4
- data/spec/region_spec.rb +10 -12
- data/spec/session_spec.rb +6 -7
- data/spec/track_spec.rb +5 -6
- metadata +20 -20
data/lib/hindbaer/marker.rb
CHANGED
@@ -1,19 +1,30 @@
|
|
1
1
|
module Hindbaer
|
2
2
|
class Marker
|
3
|
-
def initialize(fragment)
|
4
|
-
@doc = fragment
|
5
|
-
end
|
6
3
|
|
7
|
-
|
8
|
-
|
4
|
+
ATTRIBUTES = %w{
|
5
|
+
id name time
|
6
|
+
}
|
7
|
+
|
8
|
+
attr_accessor *ATTRIBUTES
|
9
|
+
|
10
|
+
def self.parse(fragment)
|
11
|
+
new do
|
12
|
+
ATTRIBUTES.each do |attribute|
|
13
|
+
self.send(
|
14
|
+
"#{attribute.to_sym}=",
|
15
|
+
fragment[attribute.split('_').map(&:capitalize).join]
|
16
|
+
)
|
17
|
+
end
|
18
|
+
end
|
9
19
|
end
|
10
20
|
|
11
|
-
def
|
12
|
-
|
21
|
+
def initialize(&block)
|
22
|
+
block.arity > 0 ? block.call(self) : instance_eval(&block)
|
13
23
|
end
|
14
24
|
|
15
|
-
def
|
16
|
-
|
25
|
+
def to_xml(xml)
|
26
|
+
xml.Marker Id: id, Name: name, Time: time
|
17
27
|
end
|
28
|
+
|
18
29
|
end
|
19
30
|
end
|
data/lib/hindbaer/plugin.rb
CHANGED
@@ -7,16 +7,16 @@ module Hindbaer
|
|
7
7
|
module Plugin
|
8
8
|
extend self
|
9
9
|
|
10
|
-
def
|
10
|
+
def parse(fragment)
|
11
11
|
case fragment['UID']
|
12
12
|
when 'nheq'
|
13
|
-
Hindbaer::Plugin::Equalizer.
|
13
|
+
Hindbaer::Plugin::Equalizer.parse(fragment)
|
14
14
|
when 'nhcl'
|
15
|
-
Hindbaer::Plugin::Compressor.
|
15
|
+
Hindbaer::Plugin::Compressor.parse(fragment)
|
16
16
|
when 'nhlu'
|
17
|
-
Hindbaer::Plugin::Base.
|
17
|
+
Hindbaer::Plugin::Base.parse(fragment)
|
18
18
|
when 'nhft'
|
19
|
-
Hindbaer::Plugin::VoiceProfiler.
|
19
|
+
Hindbaer::Plugin::VoiceProfiler.parse(fragment)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
data/lib/hindbaer/plugin/base.rb
CHANGED
@@ -2,20 +2,30 @@ module Hindbaer
|
|
2
2
|
module Plugin
|
3
3
|
class Base
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
ATTRIBUTES = %w{
|
6
|
+
id name bypass
|
7
|
+
}
|
8
8
|
|
9
|
-
|
10
|
-
@doc['Id'].to_i
|
11
|
-
end
|
9
|
+
attr_accessor *ATTRIBUTES, :uid
|
12
10
|
|
13
|
-
def
|
14
|
-
|
11
|
+
def self.parse(fragment)
|
12
|
+
new do
|
13
|
+
ATTRIBUTES.each do |attribute|
|
14
|
+
self.send(
|
15
|
+
"#{attribute.to_sym}=",
|
16
|
+
fragment[attribute.split('_').map(&:capitalize).join]
|
17
|
+
)
|
18
|
+
end
|
19
|
+
self.uid = fragment['UID']
|
20
|
+
end
|
15
21
|
end
|
16
|
-
|
17
|
-
def
|
18
|
-
|
22
|
+
|
23
|
+
def initialize(&block)
|
24
|
+
block.arity > 0 ? block.call(self) : instance_eval(&block)
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_xml(xml)
|
28
|
+
xml.Plugin Id: id, Name: name, UID: uid, Bypass: bypass
|
19
29
|
end
|
20
30
|
|
21
31
|
end
|
@@ -2,16 +2,18 @@ module Hindbaer
|
|
2
2
|
module Plugin
|
3
3
|
class Compressor < Hindbaer::Plugin::Base
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
'
|
5
|
+
attr_accessor :comp
|
6
|
+
|
7
|
+
def self.parse(fragment)
|
8
|
+
plugin = super(fragment)
|
9
|
+
|
10
|
+
plugin.comp = fragment['Comp']
|
11
|
+
|
12
|
+
plugin
|
11
13
|
end
|
12
|
-
|
13
|
-
def
|
14
|
-
|
14
|
+
|
15
|
+
def to_xml(xml)
|
16
|
+
xml.Plugin Id: id, Name: name, UID: uid, Bypass: bypass, Comp: comp
|
15
17
|
end
|
16
18
|
|
17
19
|
end
|
@@ -1,61 +1,35 @@
|
|
1
1
|
module Hindbaer
|
2
2
|
module Plugin
|
3
3
|
class Equalizer < Hindbaer::Plugin::Base
|
4
|
+
|
5
|
+
attr_accessor :low_freq_freq, :low_freq_gain, :low_freq_q
|
6
|
+
attr_accessor :mid_freq_freq, :mid_freq_gain, :mid_freq_q
|
7
|
+
attr_accessor :high_freq_freq, :high_freq_gain, :high_freq_q
|
8
|
+
attr_accessor :low_freq_type, :high_freq_type
|
4
9
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
'
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
def low_freq_q
|
26
|
-
@doc['LF_Q']
|
27
|
-
end
|
28
|
-
|
29
|
-
def low_freq_type
|
30
|
-
@doc['LF_Type']
|
31
|
-
end
|
32
|
-
|
33
|
-
def mid_freq_freq
|
34
|
-
@doc['MF_Freq']
|
35
|
-
end
|
36
|
-
|
37
|
-
def mid_freq_gain
|
38
|
-
@doc['MF_Gain']
|
39
|
-
end
|
40
|
-
|
41
|
-
def mid_freq_q
|
42
|
-
@doc['MF_Q']
|
43
|
-
end
|
44
|
-
|
45
|
-
def high_freq_freq
|
46
|
-
@doc['HF_Freq']
|
47
|
-
end
|
48
|
-
|
49
|
-
def high_freq_gain
|
50
|
-
@doc['HF_Gain']
|
51
|
-
end
|
52
|
-
|
53
|
-
def high_freq_q
|
54
|
-
@doc['HF_Q']
|
10
|
+
|
11
|
+
def self.parse(fragment)
|
12
|
+
plugin = super(fragment)
|
13
|
+
|
14
|
+
plugin.low_freq_freq = fragment['LF_Freq']
|
15
|
+
plugin.low_freq_gain = fragment['LF_Gain']
|
16
|
+
plugin.low_freq_q = fragment['LF_Q']
|
17
|
+
plugin.low_freq_type = fragment['LF_Type']
|
18
|
+
|
19
|
+
plugin.mid_freq_freq = fragment['MF_Freq']
|
20
|
+
plugin.mid_freq_gain = fragment['MF_Gain']
|
21
|
+
plugin.mid_freq_q = fragment['MF_Q']
|
22
|
+
|
23
|
+
plugin.high_freq_freq = fragment['HF_Freq']
|
24
|
+
plugin.high_freq_gain = fragment['HF_Gain']
|
25
|
+
plugin.high_freq_q = fragment['HF_Q']
|
26
|
+
plugin.high_freq_type = fragment['HF_Type']
|
27
|
+
|
28
|
+
plugin
|
55
29
|
end
|
56
|
-
|
57
|
-
def
|
58
|
-
|
30
|
+
|
31
|
+
def to_xml(xml)
|
32
|
+
xml.Plugin Id: id, Name: name, UID: uid, Bypass: bypass, LF_Freq: low_freq_freq, LF_Gain: low_freq_gain, LF_Q: low_freq_q, LF_Type: low_freq_type, MF_Freq: mid_freq_freq, MF_Gain: mid_freq_gain, MF_Q: mid_freq_q, HF_Freq: high_freq_freq, HF_Gain: high_freq_gain, HF_Q: high_freq_q, HF_Type: high_freq_type
|
59
33
|
end
|
60
34
|
|
61
35
|
end
|
@@ -2,62 +2,38 @@ module Hindbaer
|
|
2
2
|
module Plugin
|
3
3
|
class VoiceProfiler < Hindbaer::Plugin::Base
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
attr_accessor :comp
|
6
|
+
attr_accessor :low_freq_freq, :low_freq_gain, :low_freq_q
|
7
|
+
attr_accessor :mid_freq_freq, :mid_freq_gain, :mid_freq_q
|
8
|
+
attr_accessor :high_freq_freq, :high_freq_gain, :high_freq_q
|
9
|
+
attr_accessor :high_pass_freq, :high_pass_gain
|
10
|
+
|
11
|
+
def self.parse(fragment)
|
12
|
+
plugin = super(fragment)
|
13
|
+
|
14
|
+
plugin.comp = fragment['Comp']
|
15
|
+
|
16
|
+
plugin.low_freq_freq = fragment['LF_Freq']
|
17
|
+
plugin.low_freq_gain = fragment['LF_Gain']
|
18
|
+
plugin.low_freq_q = fragment['LF_Q']
|
19
|
+
|
20
|
+
plugin.mid_freq_freq = fragment['MF_Freq']
|
21
|
+
plugin.mid_freq_gain = fragment['MF_Gain']
|
22
|
+
plugin.mid_freq_q = fragment['MF_Q']
|
23
|
+
|
24
|
+
plugin.high_freq_freq = fragment['HF_Freq']
|
25
|
+
plugin.high_freq_gain = fragment['HF_Gain']
|
26
|
+
plugin.high_freq_q = fragment['HF_Q']
|
27
|
+
|
28
|
+
plugin.high_pass_freq = fragment['HP_Freq']
|
29
|
+
plugin.high_pass_gain = fragment['HP_Gain']
|
30
|
+
|
31
|
+
plugin
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_xml(xml)
|
35
|
+
xml.Plugin Id: id, Name: name, UID: uid, Bypass: bypass, LF_Freq: low_freq_freq, LF_Gain: low_freq_gain, LF_Q: low_freq_q, MF_Freq: mid_freq_freq, MF_Gain: mid_freq_gain, MF_Q: mid_freq_q, HF_Freq: high_freq_freq, HF_Gain: high_freq_gain, HF_Q: high_freq_q, HP_Freq: high_pass_freq, HP_Gain: high_pass_gain, Comp: comp
|
7
36
|
end
|
8
|
-
|
9
|
-
def name
|
10
|
-
'Voice Profiler'
|
11
|
-
end
|
12
|
-
|
13
|
-
def low_freq_freq
|
14
|
-
@doc['LF_Freq']
|
15
|
-
end
|
16
|
-
|
17
|
-
def low_freq_gain
|
18
|
-
@doc['LF_Gain']
|
19
|
-
end
|
20
|
-
|
21
|
-
def low_freq_q
|
22
|
-
@doc['LF_Q']
|
23
|
-
end
|
24
|
-
|
25
|
-
def mid_freq_freq
|
26
|
-
@doc['MF_Freq']
|
27
|
-
end
|
28
|
-
|
29
|
-
def mid_freq_gain
|
30
|
-
@doc['MF_Gain']
|
31
|
-
end
|
32
|
-
|
33
|
-
def mid_freq_q
|
34
|
-
@doc['MF_Q']
|
35
|
-
end
|
36
|
-
|
37
|
-
def high_freq_freq
|
38
|
-
@doc['HF_Freq']
|
39
|
-
end
|
40
|
-
|
41
|
-
def high_freq_gain
|
42
|
-
@doc['HF_Gain']
|
43
|
-
end
|
44
|
-
|
45
|
-
def high_freq_q
|
46
|
-
@doc['HF_Q']
|
47
|
-
end
|
48
|
-
|
49
|
-
def high_pass_freq
|
50
|
-
@doc['HP_Freq']
|
51
|
-
end
|
52
|
-
|
53
|
-
def high_pass_gain
|
54
|
-
@doc['HP_Gain']
|
55
|
-
end
|
56
|
-
|
57
|
-
def comp
|
58
|
-
@doc['Comp']
|
59
|
-
end
|
60
|
-
|
61
37
|
end
|
62
38
|
end
|
63
39
|
end
|
data/lib/hindbaer/region.rb
CHANGED
@@ -1,59 +1,35 @@
|
|
1
1
|
module Hindbaer
|
2
2
|
class Region
|
3
|
-
def initialize(fragment, track = nil)
|
4
|
-
@doc = fragment
|
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.files.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
3
|
|
31
|
-
|
32
|
-
|
4
|
+
ATTRIBUTES = %w{
|
5
|
+
ref name start offset length fade_in fade_out gain leq dynamics
|
6
|
+
}
|
7
|
+
|
8
|
+
attr_accessor *ATTRIBUTES
|
9
|
+
attr_accessor :fades
|
10
|
+
|
11
|
+
def self.parse(fragment)
|
12
|
+
new do
|
13
|
+
ATTRIBUTES.each do |attribute|
|
14
|
+
self.send(
|
15
|
+
"#{attribute.to_sym}=",
|
16
|
+
fragment[attribute.split('_').map(&:capitalize).join]
|
17
|
+
)
|
18
|
+
|
19
|
+
self.start = '00.0' unless start
|
20
|
+
|
21
|
+
self.fades = fragment.css('Fade').map do |f|
|
22
|
+
Hindbaer::Fade.parse(f)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def initialize(&block)
|
29
|
+
self.fades = []
|
30
|
+
|
31
|
+
block.arity > 0 ? block.call(self) : instance_eval(&block)
|
33
32
|
end
|
34
33
|
|
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.dup.unlink) }
|
57
|
-
end
|
58
34
|
end
|
59
35
|
end
|
data/lib/hindbaer/session.rb
CHANGED
@@ -1,38 +1,49 @@
|
|
1
1
|
module Hindbaer
|
2
|
-
|
3
2
|
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
3
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
def tracks
|
27
|
-
@doc.css('Tracks Track').map { |t| Hindbaer::Track.new(t.dup.unlink, self) }
|
28
|
-
end
|
4
|
+
ATTRIBUTES = %w{
|
5
|
+
version samplerate
|
6
|
+
}
|
7
|
+
|
8
|
+
attr_accessor *ATTRIBUTES
|
9
|
+
attr_accessor :info, :audio_pool, :tracks, :clipboard_groups, :markers
|
29
10
|
|
30
|
-
def
|
31
|
-
|
11
|
+
def self.parse(xml)
|
12
|
+
doc = Nokogiri::XML(xml)
|
13
|
+
|
14
|
+
new do
|
15
|
+
ATTRIBUTES.each do |attribute|
|
16
|
+
self.send("#{attribute.to_sym}=",
|
17
|
+
doc.at_css('Session')[attribute.capitalize])
|
18
|
+
end
|
19
|
+
|
20
|
+
self.info = Hindbaer::Info.parse(doc.at_css('Info'))
|
21
|
+
|
22
|
+
self.audio_pool =
|
23
|
+
Hindbaer::AudioPool.parse(doc.at_css('AudioPool'))
|
24
|
+
|
25
|
+
self.tracks = doc.css('Tracks Track').map do |t|
|
26
|
+
Hindbaer::Track.parse(t)
|
27
|
+
end
|
28
|
+
|
29
|
+
self.clipboard_groups = doc.css('Clipboard Group').map do |g|
|
30
|
+
Hindbaer::Group.parse(g)
|
31
|
+
end
|
32
|
+
|
33
|
+
self.markers = doc.css('Markers Marker').map do |m|
|
34
|
+
Hindbaer::Marker.parse(m)
|
35
|
+
end
|
36
|
+
end
|
32
37
|
end
|
33
38
|
|
34
|
-
def
|
35
|
-
|
39
|
+
def initialize(&block)
|
40
|
+
self.info = {}
|
41
|
+
self.audio_pool = {}
|
42
|
+
self.tracks = []
|
43
|
+
self.clipboard_groups = []
|
44
|
+
self.markers = []
|
45
|
+
|
46
|
+
block.arity > 0 ? block.call(self) : instance_eval(&block)
|
36
47
|
end
|
37
48
|
|
38
49
|
def length
|
@@ -41,65 +52,29 @@ module Hindbaer
|
|
41
52
|
end.compact
|
42
53
|
|
43
54
|
regions.map do |r|
|
44
|
-
Hindbaer.tc_to_secs(r.
|
55
|
+
Hindbaer.tc_to_secs(r.start) +
|
45
56
|
Hindbaer.tc_to_secs(r.length)
|
46
57
|
end.max
|
47
58
|
end
|
48
59
|
|
49
60
|
def to_xml
|
50
61
|
Nokogiri::XML::Builder.new do |xml|
|
51
|
-
xml.Session Version:
|
52
|
-
|
53
|
-
|
54
|
-
audio_pool.files.each do |file|
|
55
|
-
xml.File Id: file.id, Name: file.name, Duration: file.duration, Channels: file.num_channels, Leq: file.leq do
|
56
|
-
xml.MetaData OriginalPath: file.original_path
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
62
|
+
xml.Session Version: version, Samplerate: samplerate do
|
63
|
+
info.to_xml(xml)
|
64
|
+
audio_pool.to_xml(xml)
|
60
65
|
xml.Tracks do
|
61
66
|
tracks.each do |track|
|
62
|
-
|
63
|
-
track.regions.each do |region|
|
64
|
-
xml.Region Ref: region.reference.id, Name: region.name, Start: region.start_time, Length: region.length, Offset: region.offset, FadeIn: region.fade_in, FadeOut: region.fade_out, Gain: region.gain, Leq: region.leq do
|
65
|
-
region.fades.each do |fade|
|
66
|
-
xml.Fade Start: fade.start_time, Length: fade.length, Gain: fade.gain
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
unless track.plugins.empty?
|
71
|
-
xml.Plugins do
|
72
|
-
track.plugins.each do |plugin|
|
73
|
-
case plugin.uid
|
74
|
-
when 'nheq'
|
75
|
-
xml.Plugin Id: plugin.id, Name: plugin.name, UID: plugin.uid, Bypass: plugin.bypass, LF_Freq: plugin.low_freq_freq, LF_Gain: plugin.low_freq_gain, LF_Q: plugin.low_freq_q, LF_Type: plugin.low_freq_type, MF_Freq: plugin.mid_freq_freq, MF_Gain: plugin.mid_freq_gain, MF_Q: plugin.mid_freq_q, HF_Freq: plugin.high_freq_freq, HF_Gain: plugin.high_freq_gain, HF_Q: plugin.high_freq_q, HF_Type: plugin.high_freq_type do
|
76
|
-
xml.cdata('')
|
77
|
-
end
|
78
|
-
when 'nhcl'
|
79
|
-
xml.Plugin Id: plugin.id, Name: plugin.name, UID: plugin.uid, Comp: plugin.comp
|
80
|
-
when 'nhlu'
|
81
|
-
xml.Plugin Id: plugin.id, Name: plugin.name, UID: plugin.uid
|
82
|
-
when 'nhft'
|
83
|
-
xml.Plugin Id: plugin.id, Name: plugin.name, UID: plugin.uid, LF_Freq: plugin.low_freq_freq, LF_Gain: plugin.low_freq_gain, LF_Q: plugin.low_freq_q, MF_Freq: plugin.mid_freq_freq, MF_Gain: plugin.mid_freq_gain, MF_Q: plugin.mid_freq_q, HF_Freq: plugin.high_freq_freq, HF_Gain: plugin.high_freq_gain, HF_Q: plugin.high_freq_q, HP_Freq: plugin.high_pass_freq, HP_Gain: plugin.high_pass_gain, Comp: plugin.comp
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
67
|
+
track.to_xml(xml)
|
89
68
|
end
|
90
69
|
end
|
91
70
|
xml.Clipboard do
|
92
71
|
clipboard_groups.each do |group|
|
93
|
-
|
94
|
-
group.clips.each do |clip|
|
95
|
-
xml.Clip Ref: clip.reference.id, Name: clip.name, Length: clip.length, Leq: clip.leq
|
96
|
-
end
|
97
|
-
end
|
72
|
+
group.to_xml(xml)
|
98
73
|
end
|
99
74
|
end
|
100
75
|
xml.Markers do
|
101
76
|
markers.each do |marker|
|
102
|
-
|
77
|
+
marker.to_xml(xml)
|
103
78
|
end
|
104
79
|
end
|
105
80
|
end
|