flame_channel_parser 3.0.0 → 4.0.0

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.
Files changed (47) hide show
  1. data/.travis.yml +4 -0
  2. data/Gemfile +10 -0
  3. data/History.txt +5 -0
  4. data/README.rdoc +4 -2
  5. data/Rakefile +23 -10
  6. data/bin/{bake_flame_timewarp → framecurve_from_flame} +5 -1
  7. data/bin/framecurve_to_flame +22 -0
  8. data/flame_channel_parser.gemspec +130 -0
  9. data/lib/builder.rb +86 -0
  10. data/lib/flame_channel_parser.rb +31 -4
  11. data/lib/framecurve_writers/base.rb +49 -0
  12. data/lib/framecurve_writers/batch_timewarp.rb +41 -0
  13. data/lib/framecurve_writers/kronos.rb +23 -0
  14. data/lib/framecurve_writers/softfx_timewarp.rb +82 -0
  15. data/lib/framecurve_writers/templates/BatchTW.xml +118 -0
  16. data/lib/framecurve_writers/templates/SampleKronos.F_Kronos +376 -0
  17. data/lib/framecurve_writers/templates/TW_Sample.timewarp +79 -0
  18. data/lib/framecurve_writers/templates/key.xml +10 -0
  19. data/lib/timewarp_extractor.rb +18 -2
  20. data/lib/xml_parser.rb +90 -0
  21. data/test/helper.rb +18 -0
  22. data/test/snaps/BatchTimewar_proper.xml +157 -0
  23. data/test/snaps/BatchTimewarp_ext1.timewarp_node +1 -0
  24. data/test/test_base_timewarp_writer.rb +22 -0
  25. data/test/test_batch_timewarp_writer.rb +18 -0
  26. data/test/test_channel.rb +1 -2
  27. data/test/test_cli.rb +14 -13
  28. data/test/test_cli_framecurve_to_flame.rb +45 -0
  29. data/test/test_cli_timewarp_extractor.rb +19 -9
  30. data/test/test_extractor.rb +1 -3
  31. data/test/test_flame_builder.rb +68 -0
  32. data/test/test_flame_channel_parser.rb +2 -2
  33. data/test/test_interpolator.rb +15 -5
  34. data/test/test_key.rb +2 -2
  35. data/test/test_kronos_timewarp_writer.rb +16 -0
  36. data/test/test_segments.rb +1 -2
  37. data/test/test_softfx_timewarp_writer.rb +16 -0
  38. data/test/test_timewarp_extractor.rb +2 -4
  39. data/test/test_xml_setup.rb +37 -0
  40. data/test/timewarp_examples/TW_16_010_v01.output.txt +430 -428
  41. data/test/timewarp_examples/simple.framecurve.txt +32 -0
  42. data/test/timewarp_export_samples/BatchTW.timewarp_node +145 -0
  43. data/test/timewarp_export_samples/Kronos.F_Kronos +403 -0
  44. data/test/timewarp_export_samples/SoftFX.timewarp +81 -0
  45. metadata +127 -168
  46. data/.gemtest +0 -0
  47. data/Manifest.txt +0 -52
@@ -0,0 +1,79 @@
1
+ TimewarpFileVersion 1.0
2
+ CreationDate Wed Dec 28 08:46:50 2011
3
+
4
+
5
+ Fields 0
6
+ Frames 28
7
+ Origin 1
8
+ RenderType yes
9
+ SamplingStep 0
10
+ Interpolation 0
11
+ FlowQuality 2
12
+ Animation
13
+ Channel Speed
14
+ Extrapolation linear
15
+ Value 100
16
+ End
17
+ Channel Timing/Timing
18
+ Extrapolation constant
19
+ Value 1
20
+ Size 3
21
+ KeyVersion 2
22
+ Key 0
23
+ Frame 1
24
+ Value 1
25
+ RHandleX 5.66666651
26
+ RHandleY 6.99977636
27
+ LHandleX 0.75
28
+ LHandleY 0.75
29
+ CurveMode bezier
30
+ CurveOrder cubic
31
+ LeftAutomaticSlope no
32
+ TangentMode manual
33
+ End
34
+ Key 1
35
+ Frame 15
36
+ Value 18.9993286
37
+ RHandleX 19.333334
38
+ RHandleY 23.3326626
39
+ LHandleX 10.333333
40
+ LHandleY 14.3326616
41
+ CurveMode bezier
42
+ CurveOrder cubic
43
+ TangentMode smooth
44
+ End
45
+ Key 2
46
+ Frame 28
47
+ Value 28
48
+ RHandleX 32.3333321
49
+ RHandleY 31.0002232
50
+ LHandleX 23.666666
51
+ LHandleY 24.9997768
52
+ CurveMode bezier
53
+ CurveOrder cubic
54
+ TangentMode smooth
55
+ End
56
+ Uncollapsed
57
+ End
58
+ Channel Mix/Mix
59
+ Extrapolation linear
60
+ Value 0
61
+ End
62
+ Channel Trail/Pre_Trail
63
+ Extrapolation linear
64
+ Value 1
65
+ End
66
+ Channel Trail/Pre_Weight
67
+ Extrapolation linear
68
+ Value 100
69
+ End
70
+ Channel Trail/Post_Trail
71
+ Extrapolation linear
72
+ Value 1
73
+ End
74
+ Channel Trail/Post_Weight
75
+ Extrapolation linear
76
+ Value 100
77
+ End
78
+ ChannelEnd
79
+ End
@@ -0,0 +1,10 @@
1
+ <Key Index="$idx">
2
+ <Frame>$frame</Frame>
3
+ <Value>$value</Value>
4
+ <RHandleX>32.666668</RHandleX>
5
+ <RHandleY>36.319729</RHandleY>
6
+ <LHandleX>16.333334</LHandleX>
7
+ <LHandleY>14.986395</LHandleY>
8
+ <CurveMode>hermite</CurveMode>
9
+ <CurveOrder>linear</CurveOrder>
10
+ </Key>
@@ -1,3 +1,5 @@
1
+ require "framecurve"
2
+
1
3
  module FlameChannelParser
2
4
  class TimewarpExtractor
3
5
 
@@ -5,7 +7,7 @@ module FlameChannelParser
5
7
  CHANNELS = %( Timing/Timing Frame )
6
8
 
7
9
  class X < Extractor
8
-
10
+
9
11
  # This one is overridden here since instead of looking for a particular channel we are looking
10
12
  # for matches from a list
11
13
  def find_channel_in(channels, channel_path)
@@ -14,8 +16,22 @@ module FlameChannelParser
14
16
  return detected_channel if detected_channel
15
17
  raise ChannelNotFoundError, compose_channel_not_found_message(CHANNELS.join(' or '), channels)
16
18
  end
19
+
20
+ FRAMECURVE_FORMAT = "%d\t%.5f\r\n"
21
+
22
+ # Overridden to force CRLF line breaks as per Framecurve spec
23
+ def write_frame(to_io, frame, value)
24
+ @c.tuple!(frame, value)
25
+ end
26
+
27
+ # Overridden to write a framecurve header
28
+ def write_channel(interpolator, to_io, from_frame_i, to_frame_i)
29
+ @c = Framecurve::Curve.new
30
+ super
31
+ Framecurve::Serializer.new.serialize(to_io, @c)
32
+ end
17
33
  end
18
-
34
+
19
35
  def extract(file_path, options)
20
36
  return X.extract(file_path, options)
21
37
  end
@@ -0,0 +1,90 @@
1
+ require 'rexml/document'
2
+ require "rexml/streamlistener"
3
+
4
+ class FlameChannelParser::XMLParser < FlameChannelParser::Parser
5
+ # Here you can assign a logger proc or a lambda that will be call'ed with progress reports
6
+ attr_accessor :logger_proc
7
+
8
+ # A SAX-based translation layer
9
+ class XMLToSetup
10
+ include REXML::StreamListener
11
+
12
+ def initialize(vanilla_setup)
13
+ @dest = vanilla_setup
14
+ @indent = 0
15
+ @in_channel = false
16
+ @path = []
17
+ end
18
+
19
+ # <KFrames>
20
+ # <Key Index="0">
21
+ # <Frame>1.000000</Frame>
22
+ # <Value>100</Value>
23
+ # <RHandleX>1.297667</RHandleX>
24
+ # <RHandleY>100.000000</RHandleY>
25
+ # <LHandleX>0.750000</LHandleX>
26
+ # <LHandleY>100.000000</LHandleY>
27
+ # <CurveMode>hermite</CurveMode>
28
+ # <CurveOrder>linear</CurveOrder>
29
+ # </Key>
30
+ # </KFrames>
31
+ def tag_start(element, attributes)
32
+ @path.push(element)
33
+ if element == "Channel"
34
+ channel_name = attributes["Name"]
35
+ @in_channel = true
36
+ # Compose the full channel name
37
+
38
+ @dest.puts("Channel %s" % channel_name)
39
+ elsif element == "Key"
40
+ @in_key = true
41
+ @dest.puts("\tKey %d" % attributes["Index"].to_i)
42
+ end
43
+ end
44
+
45
+ def text(text)
46
+ @text = text
47
+ end
48
+
49
+ def tag_end(element)
50
+ @path.pop
51
+ if element == "Channel"
52
+ @in_channel = false
53
+ @dest.puts("\tEnd")
54
+ end
55
+
56
+ if element == "Key"
57
+ @in_key = false
58
+ @dest.puts("\t\tEnd")
59
+ end
60
+
61
+ if @in_key
62
+ @dest.puts("\t\t" + transfo(element) + " " + @text)
63
+ end
64
+
65
+ if !@in_key && @in_channel
66
+ @dest.puts("\t" + transfo(element) + " " + @text)
67
+ end
68
+ end
69
+
70
+ def transfo(t)
71
+ t == "Extrap" ? "Extrapolation" : t
72
+ end
73
+ end
74
+
75
+ # Parses the setup passed in the IO. If a block is given to the method it will yield Channel
76
+ # objects one by one instead of accumulating them into an array (useful for big setups)
77
+ def parse(io)
78
+ # Ok this is gothic BUT needed. What we do is we transform the XML setup into the OLD
79
+ # setup format, after which we run it through the OLD parser all the same.
80
+ # I am almost sure that ADSK does the same.
81
+ t = Tempfile.new("bx")
82
+ REXML::Document.parse_stream(io, XMLToSetup.new(t))
83
+ t.rewind
84
+ if block_given?
85
+ super(t, &Proc.new)
86
+ else
87
+ super(t)
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,18 @@
1
+ require "test/unit"
2
+ require "stringio"
3
+ require "tempfile"
4
+ require "cli_test"
5
+
6
+ require File.dirname(__FILE__) + "/../lib/flame_channel_parser"
7
+
8
+ class Test::Unit::TestCase
9
+ def assert_same_buffer(ref_buffer, actual_buffer, message = "The line should be identical")
10
+ [ref_buffer, actual_buffer].each{|io| io.rewind }
11
+ at_line = 0
12
+ until ref_buffer.eof? && actual_buffer.eof?
13
+ at_line += 1
14
+ reference_line, output_line = ref_buffer.readline, actual_buffer.readline
15
+ assert_equal reference_line, output_line, "Line #{at_line} - #{message}"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,157 @@
1
+ <?xml version="1.0"?>
2
+ <Setup>
3
+ <Base>
4
+ <Version>7.130000</Version>
5
+ <NAME>timewarp3</NAME>
6
+ <Note/>
7
+ <Expanded>False</Expanded>
8
+ <ScrollBar>0</ScrollBar>
9
+ <Frames>0</Frames>
10
+ <Current_Time>82</Current_Time>
11
+ <Input_DataType>3</Input_DataType>
12
+ <ClampMode>0</ClampMode>
13
+ <AdapDegrad>False</AdapDegrad>
14
+ </Base>
15
+ <State>
16
+ <TW_FlowQuality>4</TW_FlowQuality>
17
+ <TW_DoBlur>False</TW_DoBlur>
18
+ <TW_BlurPhase>0</TW_BlurPhase>
19
+ <TW_DoBlurReference>False</TW_DoBlurReference>
20
+ <TW_BlurRefColor>
21
+ <R>1.000000</R>
22
+ <G>0.000000</G>
23
+ <B>0.000000</B>
24
+ <A>1.000000</A>
25
+ </TW_BlurRefColor>
26
+ <TW_FrameMode>0</TW_FrameMode>
27
+ <TW_SamplingMode>0</TW_SamplingMode>
28
+ <TW_StartFrameIn>1</TW_StartFrameIn>
29
+ <TW_EndFrameIn>102</TW_EndFrameIn>
30
+ <TW_RenderMode>0</TW_RenderMode>
31
+ <TW_ReverseCurves>False</TW_ReverseCurves>
32
+ <TW_HeadMode>0</TW_HeadMode>
33
+ <TW_TailMode>0</TW_TailMode>
34
+ <TW_Regen>False</TW_Regen>
35
+ <TW_RetimerMode>1</TW_RetimerMode>
36
+ <TW_ReferencePointX>
37
+ <Channel Name="X"/>
38
+ </TW_ReferencePointX>
39
+ <TW_ReferencePointY>
40
+ <Channel Name="Y"/>
41
+ </TW_ReferencePointY>
42
+ <TW_Speed>
43
+ <Channel Name="Speed">
44
+ <Extrap>constant</Extrap>
45
+ <Value>100</Value>
46
+ <Size>1</Size>
47
+ <KeyVersion>2.000000</KeyVersion>
48
+ <KFrames>
49
+ <Key Index="0">
50
+ <Frame>1.000000</Frame>
51
+ <Value>100</Value>
52
+ <RHandleX>1.297667</RHandleX>
53
+ <RHandleY>100.000000</RHandleY>
54
+ <LHandleX>0.750000</LHandleX>
55
+ <LHandleY>100.000000</LHandleY>
56
+ <CurveMode>hermite</CurveMode>
57
+ <CurveOrder>linear</CurveOrder>
58
+ </Key>
59
+ </KFrames>
60
+ </Channel>
61
+ </TW_Speed>
62
+ <TW_SpeedTiming>
63
+ <Channel Name="SpeedTiming">
64
+ <Extrap>linear</Extrap>
65
+ <Value>1</Value>
66
+ <Size>1</Size>
67
+ <KeyVersion>2.000000</KeyVersion>
68
+ <KFrames>
69
+ <Key Index="0">
70
+ <Frame>1.000000</Frame>
71
+ <Value>1</Value>
72
+ <RHandleX>1.250000</RHandleX>
73
+ <RHandleY>1.250000</RHandleY>
74
+ <LHandleX>0.750000</LHandleX>
75
+ <LHandleY>0.750000</LHandleY>
76
+ <CurveMode>hermite</CurveMode>
77
+ <CurveOrder>quadratic</CurveOrder>
78
+ <RAutoSlope>False</RAutoSlope>
79
+ <LAutoSlope>False</LAutoSlope>
80
+ <TangentMode>manual</TangentMode>
81
+ </Key>
82
+ </KFrames>
83
+ </Channel>
84
+ </TW_SpeedTiming>
85
+ <TW_Timing>
86
+ <Channel Name="Timing">
87
+ <Extrap>linear</Extrap>
88
+ <Value>87.7692261</Value>
89
+ <Size>4</Size>
90
+ <KeyVersion>2.000000</KeyVersion>
91
+ <KFrames>
92
+ <Key Index="0">
93
+ <Frame>1.000000</Frame>
94
+ <Value>1</Value>
95
+ <RHandleX>8.666667</RHandleX>
96
+ <RHandleY>9.000000</RHandleY>
97
+ <LHandleX>0.750000</LHandleX>
98
+ <LHandleY>0.750000</LHandleY>
99
+ <CurveMode>hermite</CurveMode>
100
+ <CurveOrder>linear</CurveOrder>
101
+ </Key>
102
+ <Key Index="1">
103
+ <Frame>24.000000</Frame>
104
+ <Value>25</Value>
105
+ <RHandleX>32.666668</RHandleX>
106
+ <RHandleY>36.319729</RHandleY>
107
+ <LHandleX>16.333334</LHandleX>
108
+ <LHandleY>14.986395</LHandleY>
109
+ <CurveMode>hermite</CurveMode>
110
+ <CurveOrder>linear</CurveOrder>
111
+ </Key>
112
+ <Key Index="2">
113
+ <Frame>50.000000</Frame>
114
+ <Value>65</Value>
115
+ <RHandleX>67.333336</RHandleX>
116
+ <RHandleY>82.111107</RHandleY>
117
+ <LHandleX>41.333332</LHandleX>
118
+ <LHandleY>56.444447</LHandleY>
119
+ <CurveMode>hermite</CurveMode>
120
+ <CurveOrder>linear</CurveOrder>
121
+ </Key>
122
+ <Key Index="3">
123
+ <Frame>102.000000</Frame>
124
+ <Value>102</Value>
125
+ <RHandleX>135.666672</RHandleX>
126
+ <RHandleY>117.420235</RHandleY>
127
+ <LHandleX>68.333336</LHandleX>
128
+ <LHandleY>86.579773</LHandleY>
129
+ <CurveMode>hermite</CurveMode>
130
+ <CurveOrder>linear</CurveOrder>
131
+ </Key>
132
+ </KFrames>
133
+ </Channel>
134
+ </TW_Timing>
135
+ <TW_BlurSamplesChannel>
136
+ <Channel Name="Samples"/>
137
+ </TW_BlurSamplesChannel>
138
+ <TW_BlurShutterChannel>
139
+ <Channel Name="Shutter"/>
140
+ </TW_BlurShutterChannel>
141
+ <TW_Mix>
142
+ <Channel Name="MixAmount"/>
143
+ </TW_Mix>
144
+ <TW_PreTrail>
145
+ <Channel Name="Pre"/>
146
+ </TW_PreTrail>
147
+ <TW_PreWeight>
148
+ <Channel Name="Pre"/>
149
+ </TW_PreWeight>
150
+ <TW_PostTrail>
151
+ <Channel Name="Post"/>
152
+ </TW_PostTrail>
153
+ <TW_PostWeight>
154
+ <Channel Name="Post"/>
155
+ </TW_PostWeight>
156
+ </State>
157
+ </Setup>
@@ -0,0 +1 @@
1
+ <Setup><Base><Version>7.130000</Version><NAME>timewarp3</NAME><Note></Note><Expanded>False</Expanded><ScrollBar>0</ScrollBar><Frames>0</Frames><Current_Time>82</Current_Time><Input_DataType>3</Input_DataType><ClampMode>0</ClampMode><AdapDegrad>False</AdapDegrad></Base><State><TW_FlowQuality>4</TW_FlowQuality><TW_DoBlur>False</TW_DoBlur><TW_BlurPhase>0</TW_BlurPhase><TW_DoBlurReference>False</TW_DoBlurReference><TW_BlurRefColor><R>1.000000</R><G>0.000000</G><B>0.000000</B><A>1.000000</A></TW_BlurRefColor><TW_FrameMode>0</TW_FrameMode><TW_SamplingMode>0</TW_SamplingMode><TW_StartFrameIn>1</TW_StartFrameIn><TW_EndFrameIn>102</TW_EndFrameIn><TW_RenderMode>0</TW_RenderMode><TW_ReverseCurves>False</TW_ReverseCurves><TW_HeadMode>0</TW_HeadMode><TW_TailMode>0</TW_TailMode><TW_Regen>False</TW_Regen><TW_RetimerMode>1</TW_RetimerMode><TW_ReferencePointX><Channel Name="X"/></TW_ReferencePointX><TW_ReferencePointY><Channel Name="Y"/></TW_ReferencePointY><TW_Speed><Channel Name="Speed"><Extrap>constant</Extrap><Value>100</Value><Size>1</Size><KeyVersion>2.000000</KeyVersion><KFrames><Key Index="0"><Frame>1.000000</Frame><Value>100</Value><RHandleX>1.297667</RHandleX><RHandleY>100.000000</RHandleY><LHandleX>0.750000</LHandleX><LHandleY>100.000000</LHandleY><CurveMode>hermite</CurveMode><CurveOrder>linear</CurveOrder></Key></KFrames></Channel></TW_Speed><TW_SpeedTiming><Channel Name="SpeedTiming"><Extrap>linear</Extrap><Value>1</Value><Size>1</Size><KeyVersion>2.000000</KeyVersion><KFrames><Key Index="0"><Frame>1.000000</Frame><Value>1</Value><RHandleX>1.250000</RHandleX><RHandleY>1.250000</RHandleY><LHandleX>0.750000</LHandleX><LHandleY>0.750000</LHandleY><CurveMode>hermite</CurveMode><CurveOrder>quadratic</CurveOrder><RAutoSlope>False</RAutoSlope><LAutoSlope>False</LAutoSlope><TangentMode>manual</TangentMode></Key></KFrames></Channel></TW_SpeedTiming><TW_Timing><Channel Name="Timing"><Extrap>linear</Extrap><Value>87.7692261</Value><Size>4</Size><KeyVersion>2.000000</KeyVersion><KFrames><Key Index="0"><Frame>1.000000</Frame><Value>1</Value><RHandleX>8.666667</RHandleX><RHandleY>9.000000</RHandleY><LHandleX>0.750000</LHandleX><LHandleY>0.750000</LHandleY><CurveMode>hermite</CurveMode><CurveOrder>linear</CurveOrder></Key><Key Index="1"><Frame>24.000000</Frame><Value>25</Value><RHandleX>32.666668</RHandleX><RHandleY>36.319729</RHandleY><LHandleX>16.333334</LHandleX><LHandleY>14.986395</LHandleY><CurveMode>hermite</CurveMode><CurveOrder>linear</CurveOrder></Key><Key Index="2"><Frame>50.000000</Frame><Value>65</Value><RHandleX>67.333336</RHandleX><RHandleY>82.111107</RHandleY><LHandleX>41.333332</LHandleX><LHandleY>56.444447</LHandleY><CurveMode>hermite</CurveMode><CurveOrder>linear</CurveOrder></Key><Key Index="3"><Frame>102.000000</Frame><Value>102</Value><RHandleX>135.666672</RHandleX><RHandleY>117.420235</RHandleY><LHandleX>68.333336</LHandleX><LHandleY>86.579773</LHandleY><CurveMode>hermite</CurveMode><CurveOrder>linear</CurveOrder></Key></KFrames></Channel></TW_Timing><TW_BlurSamplesChannel><Channel Name="Samples"/></TW_BlurSamplesChannel><TW_BlurShutterChannel><Channel Name="Shutter"/></TW_BlurShutterChannel><TW_Mix><Channel Name="MixAmount"/></TW_Mix><TW_PreTrail><Channel Name="Pre"/></TW_PreTrail><TW_PreWeight><Channel Name="Pre"/></TW_PreWeight><TW_PostTrail><Channel Name="Post"/></TW_PostTrail><TW_PostWeight><Channel Name="Post"/></TW_PostWeight></State></Setup>
@@ -0,0 +1,22 @@
1
+ require "helper"
2
+
3
+ class TestBaseTimewarpWriter < Test::Unit::TestCase
4
+ def test_with_each_writer
5
+ pack = []
6
+ FlameChannelParser::FramecurveWriters::Base.with_each_writer do | w |
7
+ pack.push(w)
8
+ end
9
+ assert_equal [FlameChannelParser::FramecurveWriters::SoftfxTimewarp,
10
+ FlameChannelParser::FramecurveWriters::BatchTimewarp,
11
+ FlameChannelParser::FramecurveWriters::Kronos], pack
12
+ end
13
+
14
+ def test_write_from_framecurve
15
+ c = Framecurve::Curve.new(Framecurve::Tuple.new(10, 123.45), Framecurve::Tuple.new(15, 456.78))
16
+ b = FlameChannelParser::FramecurveWriters::Base.new
17
+ buf = StringIO.new
18
+ b.run_export_from_framecurve(buf, c)
19
+ assert_equal "10 123.45000\n11 190.11600\n12 256.78200\n13 323.44800\n14 390.11400\n15 456.78000\n", buf.string
20
+ end
21
+
22
+ end
@@ -0,0 +1,18 @@
1
+ require "helper"
2
+
3
+ class TestBatchTimewarpWriter < Test::Unit::TestCase
4
+ def test_simple_export
5
+ buf = StringIO.new
6
+ w = FlameChannelParser::FramecurveWriters::BatchTimewarp.new
7
+ w.run_export(buf) do | key_writer |
8
+ key_writer.key(1, 15)
9
+ key_writer.key(15, 50)
10
+ key_writer.key(19, 102)
11
+ end
12
+
13
+ File.open(File.dirname(__FILE__) + "/timewarp_export_samples/BatchTW.timewarp_node", "wb"){|f| f.write(buf.string) }
14
+
15
+ assert_same_buffer File.open(File.dirname(__FILE__) + "/timewarp_export_samples/BatchTW.timewarp_node"), buf
16
+ end
17
+
18
+ end
@@ -1,5 +1,4 @@
1
- require "test/unit"
2
- require File.dirname(__FILE__) + "/../lib/flame_channel_parser"
1
+ require "helper"
3
2
 
4
3
  D = 0.001
5
4