/
sox-slice.rb
65 lines (55 loc) · 1.61 KB
/
sox-slice.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/env ruby
NUM_SLICES = 10
LOW_FREQ = 32
GAIN = 6 # dB
class Slicer
def usage
puts "give me a list of wav (or sox compatible files on the commandline"
end
def slice(file,slices,low_freq)
@file=file
@slices=slices
slices=0..slices-1
@freqs=slices.map{|x| low_freq*(2**x)}
if !File.exist? file
raise "File doesn't exist (#{file})"
end
if !File.file? file
raise "File isn't a file (#{file})"
end
if !File.readable? file
raise "File isn't readable (#{file})"
end
inform = "slicing #{file} into #{slices.count} slices"
puts "Beginning #{inform}"
slices.each {|num| do_slice(num)}
puts "Finished #{inform}"
end
protected
def do_slice(num)
puts "Slice #{num+1} of #{@slices}, #{@freqs[num]} hz"
args = ['nice','-n','15','sox','--buffer','131072','--multi-threaded','-S','--norm',@file,filename(num),'sinc']
if num==0
args.push("-#{@freqs[0]}") # lowpass
elsif num==@freqs.length-1
args.push("#{@freqs[num]}") # highpass
else # general case
args.push("#{@freqs[num-1]}-#{@freqs[num+1]}") #bandpass
end
#print "args are "
#args.each{|x|print x," "}
#puts ""
Kernel.system(*args)
end
def filename(num)
file="#{@file.sub(/\.[^.]+/,'')}-#{"%02d" % (num+1)}-#{@freqs[num]}hz#{$~}"
end
end
slicer = Slicer.new
if ARGV.empty?
slicer.usage
else
ARGV.each do|a|
slicer.slice a, NUM_SLICES, LOW_FREQ
end
end