2009-09-20(Sun) [長年日記]

_1 [Mac] AACGain

  • 図書館で状態の悪いCDを借りることがある
  • TS-H653Aの載ったDell機で録音時間の長いCDをiTunesで取り込むと、最後の方でノイズが入りがちだった
  • 最近のCDは録音レベルが高過ぎ。椎名林檎とか椎名林檎とか椎名林檎とか

という事情から、Windowsでは

  1. EACでリップしてwav+cueを作成
  2. DAEMON Toolsでマウント
  3. iTunesで取り込み
  4. iGainで音量調整(オプションタブの音量調整)

としていた。

Macで同等のフローを組めていないため、さらにMacのiTunesにコピーという手順が加わっていて、面倒な状況になっている。 iTunes9のホームシェアリングでコピーは便利になったけれど。

iGainについては、 MacMP3GainAACGainで 代替できそうだったが、どのタグを使って音量調整をしているのか分からなかったので、 導入に踏み切れなかった。オプションタブの音量調整を使う方法がベストとも思わないが。

そこで、MacPortsでaacgainコマンドをインストールして解析だけさせて、ruby scriptでiTunesの音量調整(volume adjustment)を使うことにした。

  • iTunesで選択しているトラックを対象にする
  • aacgainで何デシベル上げろ、下げろという指示に、3.2を掛けた値に音量調整(単位%)を設定する
    • 3.2というのは、iGainを使ってみての雰囲気
    • -sオプション指定時は、トラックごとの値で調整する
    • -aオプション指定時は、選択している全トラックでの平均値で調整する
      • iGainの調整値をアルバム音圧から、というのとかなり値が違うけど...
    • aacgainの基準はデフォルト89デシベルのはず

高尾 宏治 "RubyによるMac OS Xデスクトップアプリケーション開発入門 ~Ruby×RubyCocoa/MacRuby×HotCocoa~" を読むと、GUIなwrapperを作れるかな。

#! /usr/bin/env ruby

require 'osx/cocoa'
include OSX
OSX.require_framework 'ScriptingBridge'

require 'getopts'
include Math

AACGAIN = 'aacgain'
DB2VA = 3.2
DBGAIN = 0

def usage

puts <<EOM
SYNOPSYS
	#{$0} {-a|-s} [-n]

OPTIONS
	-a	album mode. set an average value to all tracks
	-s	single mode
	-n	dry run
EOM

end

def main

  if ((! getopts('asn')) ||
      (! ($OPT_a || $OPT_s)) ||
      ($OPT_a && $OPT_s))
    usage
    exit
  end

  iTunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")
  selections = iTunes.selection.get

  dbs = Array::new

  selections.each do |t|
    puts t.location.path
    path = t.location.path.to_s.gsub(/([ \'\"\&\(\)\[\]])/, '\\\\' + '\1')
    strs = `#{AACGAIN} -o -s s -d #{DBGAIN} #{path}`
    db = strs.split[-4].to_f
    dbs.push(db)
    puts "#{db}dB #{t.name}"
  end

  powers = dbs.map {|db| 10 ** (db/10.0)}
  sum = 0
  powers.each {|power| sum += power}
  avg_db = 10 * log10(sum / powers.length)
  puts "#{avg_db}dB average"

  avg_va = (DB2VA * avg_db).to_i
  vas = dbs.map{|db| (db * DB2VA).to_i}

  selections.each do |t|
    if ($OPT_a)
      va = avg_va
    elsif ($OPT_s)
      va = vas.shift
    end
    if ($OPT_n)
      puts "#{va} volume adjustment setting to #{t.name} skipped"
    else
      t.volumeAdjustment = va
      puts "#{t.volumeAdjustment} volume adjustment setting to #{t.name}"
    end
  end
end

main

トップ «前の日記(2009-09-13(Sun)) 最新 次の日記(2009-09-21(Mon))»