Skip to content

Instantly share code, notes, and snippets.

@koyachi
Created May 6, 2010 10:50
Show Gist options
  • Save koyachi/392006 to your computer and use it in GitHub Desktop.
Save koyachi/392006 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
# 2010-01-11 koyachi
require 'rubygems'
require 'scissor'
require 'yaml'
# yaml generated by http://gist.github.com/268614#file_dump.rb
#$song = 'Lily Allen - LDN Acapella.mp3'
#$song = 'polestar1-1.mp3'
$song = 'Tom Browne - Funkin\' for Jamaica .mp3'
$segments_yaml = "#{$song}.segemnts.yaml"
class SortByTimbre
def initialize
segments = YAML.load_file($segments_yaml).map{|e|e.ivars}
init_timbre_min_max segments
init_segments segments
end
def init_timbre_min_max(segments)
@timbre_min_max = (0..11).map{|i| {:min => 1000, :max => -1000}}
segments.each do |segment|
segment['timbre'].each_with_index do |t,i|
@timbre_min_max[i][:min] = t if @timbre_min_max[i][:min] > t
@timbre_min_max[i][:max] = t if @timbre_min_max[i][:max] < t
end
end
@timbre_min_max.each_with_index do |t,i|
t[:range] = t[:max] - t[:min]
end
end
def init_segments(segments)
@segments = []
@segments_from_timbres = []
segments.each_with_index do |segment,j|
timbre = []
seg = {
:start => segment['start'],
:duration => segment['duration'],
}
segment['timbre'].each_with_index do |t,i|
norm_t = (t - @timbre_min_max[i][:min]) / @timbre_min_max[i][:range]
timbre << norm_t
@segments_from_timbres[i] ||= []
@segments_from_timbres[i] << seg.merge({:timbre => norm_t})
end
seg[:timbre] = timbre
@segments << seg
end
end
def sort_by_timbre(index)
@segments_from_timbres[index].sort do |a,b|
b[:timbre] <=> a[:timbre]
end
end
def dump_by_timbre(index)
@segments_from_timbres[index].each do |segment|
p segment
end
end
def dump_timbre_minmax(index)
p @timbre_min_max[index]
end
def generate_mp3(file, timbre_index)
file = File.expand_path file
dir = File.dirname file
basename = File.basename file
mp3 = Scissor file
fragments = []
sort_by_timbre(timbre_index).map do |seg|
mp3.slice seg[:start], seg[:duration]
end.inject(Scissor()){|r,e| r + e}.to_file "#{dir}/#{basename}.sort_by_timbre_#{timbre_index}.mp3"
end
def generate_mp3_sorted_by_timbre(file)
(0..11).each do |i|
puts "generateing mp3 sorted by timbre:#{i}..."
generate_mp3 file, i
end
end
############################################################
def skip_timbre(index, val)
@segments_from_timbres[index].find_all do |seg|
seg[:timbre] > val
end
end
def gen_mp3_skip_timbre(file, index, val)
file = File.expand_path file
dir = File.dirname file
basename = File.basename file
mp3 = Scissor file
fragments = []
skip_timbre(index, val).map do |seg|
mp3.slice seg[:start], seg[:duration]
end.inject(Scissor()){|r,e| r + e}.to_file "#{dir}/#{basename}.skip_timbre#{index}_under_#{val}.mp3"
end
############################################################
def gen_mp3_skip_random_timbre(file, index, val)
file = File.expand_path file
dir = File.dirname file
basename = File.basename file
mp3 = Scissor file
fragments = []
skip_timbre(index, val).map do |seg|
mp3.slice seg[:start], seg[:duration]
end.shuffle.inject(Scissor()){|r,e| r + e}.to_file "#{dir}/#{basename}.random_after_skip_timbre#{index}_under_#{val}.mp3"
end
def gen_mp3_skip_random_timbre_x4(file, index, val)
file = File.expand_path file
dir = File.dirname file
basename = File.basename file
mp3 = Scissor file
fragments = []
(skip_timbre(index, val).map do |seg|
mp3.slice seg[:start], seg[:duration]
end*4).shuffle.inject(Scissor()){|r,e| r + e}.to_file "#{dir}/#{basename}.random_after_skip_timbre#{index}_under_#{val}_x4.mp3"
end
############################################################
def run(file)
generate_mp3_sorted_by_timbre file
end
end
sbt = SortByTimbre.new
#sbt.dump_by_timbre 1
#sbt.generate_mp3 $song, 1
#sbt.run $song
#sbt.gen_mp3_skip_timbre $song, 8, 0.6
#sbt.dump_timbre_minmax 9
#sbt.gen_mp3_skip_random_timbre $song, 9, 0.7
sbt.gen_mp3_skip_random_timbre_x4 $song, 0, 0.9
#sbt.gen_mp3_skip_random_timbre $song, 2, 0.6
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment