Created
May 6, 2010 10:50
-
-
Save koyachi/392006 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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