From bbd2a006152cce4e5fa28bb2793d239ebdfdb491 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 13 Oct 2013 08:54:05 +0000 Subject: trimfx: initial bits This will allow editing individual portions of audio of a larger file while creating cross fade effects to join them. --- lib/dtas/trimfx.rb | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 lib/dtas/trimfx.rb (limited to 'lib/dtas') diff --git a/lib/dtas/trimfx.rb b/lib/dtas/trimfx.rb new file mode 100644 index 0000000..5cfac26 --- /dev/null +++ b/lib/dtas/trimfx.rb @@ -0,0 +1,67 @@ +# Copyright (C) 2013, Eric Wong and all contributors +# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt) +require_relative '../dtas' +require 'shellwords' + +class DTAS::TrimFX + attr_reader :tbeg + attr_reader :tlen + + def initialize(args) + args = args.dup + case args.shift + when "trim" + parse_trim!(args) + when "all" + @tbeg = 0 + @tlen = nil + else + raise ArgumentError, "#{args.inspect} not understood" + end + end + + def to_sox_arg(format) + if @tbeg && @tlen + %W(trim #{@tbeg * format.rate}s #{@tlen * format.rate}s) + else + [] + end + end + + def parse_time(tbeg) + case tbeg + when /\A\d+\z/ + tbeg.to_i + when /\A[\d\.]+\z/ + tbeg.to_f + when /\A[:\d\.]+\z/ + hhmmss = tbeg.dup + rv = hhmmss.sub!(/\.(\d+)\z/, "") ? "0.#$1".to_f : 0 + + # deal with HH:MM:SS + t = hhmmss.split(/:/) + raise ArgumentError, "Bad time format: #{hhmmss}" if t.size > 3 + + mult = 1 + while part = t.pop + rv += part.to_i * mult + mult *= 60 + end + rv + else + raise ArgumentError, "unparseable: #{tbeg.inspect}" + end + end + + def parse_trim!(args) + tbeg = parse_time(args.shift) + tlen = args.shift + is_stop_time = tlen.sub!(/\A=/, "") ? true : false + tlen = parse_time(tlen) + if is_stop_time + tlen = tlen - tbeg + end + @tbeg = tbeg + @tlen = tlen + end +end -- cgit v1.2.3-24-ge0c7