youpy-scissor 0.0.20 → 0.0.21

Sign up to get free protection for your applications and to get access to all the features.
@@ -31,29 +31,42 @@ supported file format:
31
31
 
32
32
  == Synopsis
33
33
 
34
+ === instanciate
35
+
34
36
  foo = Scissor('foo.mp3')
35
37
  bar = Scissor('bar.wav')
36
38
 
37
- # concat
39
+ === concat
40
+
38
41
  foo + bar > 'foobar.mp3'
39
42
 
40
- # slice + concat
43
+ === slice + concat
44
+
41
45
  foo[10, 1] + bar[2, 3] > 'slicefoobar.mp3'
42
46
 
43
- # slice + concat + loop
47
+ === slice + concat + loop
48
+
44
49
  (foo[10, 1] + bar[2, 3]) * 4 > 'slicefoobarloop.mp3'
45
50
 
46
- # split
51
+ === split
52
+
47
53
  (Scissor('sequence.mp3') / 16).first.to_file('split.mp3')
48
54
 
49
- # replace first 10 seconds with 30 seconds of silence
55
+ === replace first 10 seconds with 30 seconds of silence
56
+
50
57
  foo.replace(0, 10, Scissor.silence(30)).to_file('replace.mp3')
51
58
 
52
- # sequence + loop
59
+ === sequence + loop
60
+
53
61
  seq = Scissor.sequence('x y xyz', 0.2)
54
62
  seq.apply(:x => foo, :y => Proc.new { bar }, :z => foo.reverse) * 4 > 'sequence.wav'
55
63
 
56
- # mix
64
+ === half the pitch
65
+
66
+ foo.pitch(50)
67
+
68
+ === mix
69
+
57
70
  Scissor.mix([foo, bar], 'mix.mp3')
58
71
 
59
72
  == Copyright
data/Rakefile CHANGED
@@ -17,7 +17,7 @@ DESCRIPTION = "utility to chop sound files"
17
17
  RUBYFORGE_PROJECT = "scissor"
18
18
  HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
19
19
  BIN_FILES = %w( )
20
- VERS = "0.0.20"
20
+ VERS = "0.0.21"
21
21
 
22
22
  REV = File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
23
23
  CLEAN.include ['**/.*.sw?', '*.gem', '.config']
@@ -150,20 +150,31 @@ module Scissor
150
150
  new_instance.add_fragment(Fragment.new(
151
151
  fragment.filename,
152
152
  fragment.start,
153
- fragment.duration,
154
- !fragment.reversed?))
153
+ fragment.true_duration,
154
+ !fragment.reversed?,
155
+ fragment.pitch))
155
156
  end
156
157
 
157
158
  new_instance
158
159
  end
159
160
 
160
- def to_file(filename, options = {})
161
- writer = Writer.new
161
+ def pitch(pitch)
162
+ new_instance = self.class.new
162
163
 
163
- writer.add_track(@fragments)
164
- writer.to_file(filename, options)
164
+ @fragments.each do |fragment|
165
+ new_instance.add_fragment(Fragment.new(
166
+ fragment.filename,
167
+ fragment.start,
168
+ fragment.true_duration,
169
+ fragment.reversed?,
170
+ fragment.pitch * (pitch.to_f / 100)))
171
+ end
165
172
 
166
- self.class.new(filename)
173
+ new_instance
174
+ end
175
+
176
+ def to_file(filename, options = {})
177
+ Scissor.mix([self], filename, options)
167
178
  end
168
179
 
169
180
  alias > to_file
@@ -2,17 +2,26 @@ require 'pathname'
2
2
 
3
3
  module Scissor
4
4
  class Fragment
5
- attr_reader :filename, :start, :duration
5
+ attr_reader :filename, :start, :pitch
6
6
 
7
- def initialize(filename, start, duration, reverse = false)
7
+ def initialize(filename, start, duration, reverse = false, pitch = 100)
8
8
  @filename = Pathname.new(filename).realpath
9
9
  @start = start
10
10
  @duration = duration
11
11
  @reverse = reverse
12
+ @pitch = pitch
12
13
 
13
14
  freeze
14
15
  end
15
16
 
17
+ def duration
18
+ @duration * (100 / pitch.to_f)
19
+ end
20
+
21
+ def true_duration
22
+ @duration
23
+ end
24
+
16
25
  def reversed?
17
26
  @reverse
18
27
  end
@@ -26,16 +35,20 @@ module Scissor
26
35
  if remaining_start + remaining_length >= duration
27
36
  new_fragment = self.class.new(
28
37
  filename,
29
- start + remaining_start,
30
- duration - remaining_start)
38
+ start + remaining_start * pitch.to_f / 100,
39
+ (duration - remaining_start) * pitch.to_f / 100,
40
+ false,
41
+ pitch)
31
42
 
32
- remaining_length -= (duration - remaining_start)
43
+ remaining_length -= duration - remaining_start
33
44
  remaining_start = 0
34
45
  else
35
46
  new_fragment = self.class.new(
36
47
  filename,
37
- start + remaining_start,
38
- remaining_length)
48
+ start + remaining_start * pitch.to_f / 100,
49
+ remaining_length * pitch.to_f / 100,
50
+ false,
51
+ pitch)
39
52
 
40
53
  remaining_start = 0
41
54
  remaining_length = 0
@@ -46,8 +46,9 @@ module Scissor
46
46
  "-a:#{index} " +
47
47
  "-i:" +
48
48
  (fragment.reversed? ? 'reverse,' : '') +
49
- "select,#{fragment.start},#{fragment_duration},\"#{fragment_outfile}\" " +
49
+ "select,#{fragment.start},#{fragment.true_duration},\"#{fragment_outfile}\" " +
50
50
  "-o:#{outfile} " +
51
+ (fragment.pitch.to_f == 100.0 ? "" : "-ei:#{fragment.pitch} ") +
51
52
  "-y:#{position}"
52
53
 
53
54
  position += fragment_duration
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: youpy-scissor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.20
4
+ version: 0.0.21
5
5
  platform: ruby
6
6
  authors:
7
7
  - youpy