ずいぶんと以前、
Audacityでカセットの整理で書いたのだが、古いカセットテープの音源は、すべてMP3に落として後生大事にハードディスクに保存している。なつかしいテープばかりだから、捨てる気になれず、手間暇かけてMP3化したわけだ。ところが、この音楽ファイルを聞くことは滅多にない。いろいろと理由はあるのだけれど、最大の問題は再生装置がないことだ。もちろんパソコンで再生することはできるし、MP3プレーヤーで聞くこともできる。けれど、コンポが壊れて以来バックグラウンドミュージックとして部屋で流すのに適した装置がなく、わざわざイヤホンつけてまで聞くのも大層なので、ほとんどオクラ入りになっていた。
実際、最近は音楽を聞くのはほとんどカーステレオに限られてきてしまっている。だから、MP3プレーヤーとFMトランスミッターを組み合わせて車で聞くつもりだった。ところが、これが雑音を拾うばかりでちっとも快適ではない。なんだかなあと思って、それもやめていた。調べてみると軽自動車ではエンジンからトランスミッターまでの距離の関係で雑音を拾うことがあるらしい。どうもそういうレアなケースに遭遇したらしいと、すっかりその方面は諦めていた。
ところが、最近になって妻がMP3プレーヤーの代わりにiPhoneを持ちだしてFMトランスミッターを試してみると、雑音のないクリアな再生音がする。なんのことはない、雑音を拾っていたのはFMトランスミッターではなく安物のMP3プレーヤーだったわけだ。そうとわかったら、やっぱり古い音源も聞きたくなるだろう。
だが、ここで問題が発生した。いや、あらためて発生したというよりも、以前から放置してあった問題がクローズアップされることになった。
カセットテープの走行速度は、ちゃんとした規格が定められている。もしも規格外のスピードで再生したら、音程やテンポが元の音源と狂ってしまう。けれど、実際にはカセットテープの走行速度はデッキやテープレコーダー、ラジカセの機種によって、微妙に異なっている。このことはずいぶんと以前から気づいていた。というのははるか昔、高校入学祝いにカセットデッキを買ってもらったとき(というか、「祝いに買ってやる」というので自分で日本橋に買いに行ったのだけれど)、そのデッキでラジカセ録音のテープを再生すると音程が違うのに気づいたからだ。これは私がギターが趣味で、録音した音源に合わせてギターの練習をしていたからはっきりとわかったのであって、ぼんやり聞いていたのではわからないレベルだっただろう。実際、その後も「デモテープ作ったから練習しておいて」と言われて渡されたテープの再生でフラストレーションを感じたことは何度もあった。
そして、妻と私が過去に何台かのデッキで録音したテープを最終的にMP3化する際に使用したウォークマンタイプのカセットプレーヤーで再生すると、ほとんどのテープで再生速度が数%遅くなる現象が発生した。なかには音程がぴったりのものもあったから、このあたりは相性というか組み合わせの問題だったのだろう。
最初は、「まあいいか、しょせんはカセットテープの音源だし」と思っていたが、この数%の間延びした音は、音楽として楽しむにはちょっとつらいものがある。ようやくちゃんとした環境で古い音源を鑑賞できるようになったのに、どうにも間延び感が気に入らず、結局は聞くのをやめてしまった。
これではあんまりにも情けない。Audacityを使えば再生速度の変更はフィルター一発でできる。もともとMP3への変換ではAudacityを使ったのだからその時点でひと手間かけておけばなんの問題もなかったわけだ。ただ、それをいまからやり直そうと思ったら、いちいちファイルを開き、フィルターをかけ、保存をしなおすという手間をファイルの数だけやらなければならない。テープはA面とB面の2ファイルに分かれているから、約300本のテープで600ファイル以上。これはやっていられない。
こういうバッチ処理は、やはりスクリプトで処理すべきだろう。私は「端末を開いてコマンドを」というCLIがほとんどできないGUI派だけれど、スクリプト処理の威力は知っている。コマンドラインでAudacityが使えればいちいち手作業で変換処理をしなくてもバッチでOKではないかと見当をつけた。
その上でちょっと調べてみると、Audacity並みのパワフルなサウンド処理ができるCLIのソフトでsoXというのがあるのを知った。これはUbuntuのリポジトリにも収録されている。そこで、このsoxをインストールし、端末を開いて
sox 1.mp3 2.mp3 speed 1.04
と入力してみた。ここで1.mp3というのはテスト用のmp3ファイル、2.mp3が出力ファイル、1.04という数字は4%だけスピードを早くするようにという指定である。ところがエラーが出て処理ができない。ちょっと悩んだが、これはリポジトリに収録されているsox用の追加のライブラリをインストールすることで解決した。このコマンドを実行すれば、1.mp3というファイルの再生速度が修正されたファイルが2.mp3として作成される。
さあ、あとはこれをバッチでやればいいんだと思ったものの、方法がわからない。ワイルドカードを使ってみてもうまく行かない。というのは、出力側のファイル名をうまく指定できないからだ。こういうときはシェルスクリプトを書けばいいとは思うのだが、シェルスクリプトの作法は知らない。昨年少しだけPythonを勉強する機会があったのでそれを応用しようかとも思うけれど、正月早々にそんな大層なことをやるのも面倒だ。
そんなことを思いながらさらに調べていたら、
こちらにsoxを使ってwav形式のファイルを.cdrという形式に変換するコマンドが掲載されていた。ちなみに.cdrという拡張子のファイルがどういう形式なのかはさっぱりわからないが、この際それはどうでもいい。最終的にこのコマンドを参考にして、次のコマンドでバッチ処理を行った。
$ for i in `ls *.mp3`; do echo -e "$i"; sox $i a/$i.mp3 speed 1.04; echo -e "$i.mp3"; done
これを大量のmp3ファイルがあるディレクトリで端末を開いて実行する。なお、このディレクトリ内に"a"という名前のフォルダを予めつくっておいた。変換後のファイルは、このaフォルダに生成されていく。スクリプトの意味は恥ずかしながらあんまりわからないが、端末に処理済みのファイルの名前が次々に表示されていくところを見ると、「echo」はその指定なのだろう。lsでフォルダ内のファイルの情報を読み取り、それを順次処理していくことになるようだ。最終的にできるファイルは、ファイル名が1.mp3.mp3というぐあいに拡張子がダブってしまう。これをスクリプトで処理しておくのが本当なのだろうけれど、このぐらいのことならxfce4のデフォルトファイルマネージャであるThunar付属のバルクリネームであっという間に処理できる。ちなみに、上記のスクリプトはファイル名にスペースがあるとエラーを起こすので、処理前にファイル名のスペースを別文字に変換しておく前処理が必要になる。この処理にもバルクリネームは使える。なに、Thunarでフォルダを開いておき、ファイルを複数選択してF2を押すだけなので至って簡単。
うまくいかなかったのは、おそらく元ファイルの圧縮率の関係で、変換後のファイルサイズが変換前のおよそ2倍になってしまうこと。圧縮率を変化させるコマンドもsoxにはあるのだけれど、これはどうも使い方がよくわからずに断念した。
本当は、一律4%ではなく、それぞれのファイルごとに微妙に音程は異なるようだ。けれど、そこを突き詰めるよりは、とりあえずこれで快く聞けるようになったのだからよしとしようではないか。