読者です 読者をやめる 読者になる 読者になる

😃 mattintosh note 📝

Hello Raspberry Pi!

Ubuntu Linux で qaac.exe を使って AAC/ALAC にエンコードする

Linux Ubuntu qaac Wine cdrdao bchunk SoX p7zip aac Mac OS X mp4

脱 Nero AAC Enc を目指して SoX とか色々使いつつもなんか違うなぁ〜と試行錯誤。(そもそも libav の aac コーデックが好きじゃないなら何やっても無駄じゃ…)

もう諦めてやっぱり CoreAudio を使う方向にシフト。しかし、ここ1年はもっぱらペンギン属で林檎マシンを起動することもなくなったのでエンコードのために林檎マシンを起動するのが面倒くさい。ここはなんとか Linux 機でどうにかしたいところだが、Linux 版 iTunes なんてものはないし、そんなものは自分が生きている間にリリースされるかどうかもわからない。

だがしかし、手間は少しかかるものの、Linux でも CoreAudio を使って AAC を作成することはできる。

  1. WINE と 7z(p7zip)のインストール
  2. iTunes6464Setup.exe の入手
  3. AppleApplicationSupport64.msi の抽出
  4. 各種 dll の抽出
  5. qaac64.exe の入手
apt-get install wine p7zip

CoreAudioToolbox.dll などの抽出

その前に 32-bit 版と 64-bit 版の qaac はどちらが良いのか?

自分の環境では、64-bit 版の方が AAC のエンコードが 2.5倍早かった。(マジで)

なので 64-bit 版をベースに記載する。なお、iTunes6464Setup.exe には 32-bit 版のライブラリも含まれているので 64-bit 版の iTunes をダウンロードしておけばどちらにも対応ができる。

7z でまずは AppleApplicationSupport64.msi を取り出す。

7z e iTunes6464Setup.exe AppleApplicationSupport64.msi

次に、ライブラリだけを取り出す。いくつか出力されるのでここでは出力先を AAS64 とする。

※シェルが苦手で、コマンドラインからライブラリのファイル名を変更したりするのが難しい場合は msiexec /a AppleApplicationSupport64.msi /qn で MSI パッケージをインストールしてしまった方が楽。

7z e -oAAS64 AppleApplicationSupport.msi \*.dll

ここで出てきたライブラリは頭に x64_AppleApplicationSupport_ が付いているのでこれを取り除く必要がある。ここではシェルの置換展開を使ってファイル名の頭の x64_AppleApplicationSupport_ だけを取り除く。

cd AAS64
for f in x64_*.dll; do mv ${f} ${f##*_}; done

置換展開が使えない場合は何らかのコマンドを併用して x64_AppleApplicationSupport_ を取り除くか、手作業でリネームする。_ を区切り文字として cut を使った例を載せておく。

for f in x64_*.dll; do mv ${f} `echo ${f} | cut -d_ -f3`; done

プレフィックスを取り除いたダイナミックライブラリの種類。AAC の変換に必要なのは多分3つくらい。

  • ApplePushService.dll
  • AppleVersions.dll
  • ASL.dll
  • AVFoundationCF.dll
  • CFNetwork.dll
  • CoreADI.dll
  • CoreAudioToolbox.dll
  • CoreFoundation.dll
  • CoreGraphics.dll
  • CoreLSKD.dll
  • CoreMedia.dll
  • CoreText.dll
  • CoreVideo.dll
  • Foundation.dll
  • icudt49.dll
  • JavaScriptCore.dll
  • libcache.dll
  • libdispatch.dll
  • libexslt.dll
  • libicuin.dll
  • libicuuc.dll
  • libtidy.dll
  • libxml2.dll
  • libxslt.dll
  • main.dll
  • MediaAccessibility.dll
  • objc.dll
  • pthreadVC2.dll
  • QuartzCore.dll
  • SafariTheme.dll
  • SQLite3.dll
  • WebKit.dll
  • WebKitQuartzCoreAdditions.dll
  • WTF.dll
  • YSCrashDump.dll
  • YSUtilities.dll
  • zlib1.dll

これらのダイナミックライブラリを qaac64.exe と同じディレクトリに入れておくか、C:\windows\system32 に相当する ${WINEPREFIX}/drive_c/windows/system32(一般的に ~/.wine/drive_c/windows/system32)に入れておけばよい。

WINE で qaac を使うための準備

https://sites.google.com/site/qaacpage/ の cabinet から qaac を入手する(執筆時点での最新版は qaac_2.59.zip)。

64-bit 版だけを取り出す。

7z e -oqaac qaac_2.59.zip qaac_2.59/x64/\*

先ほどのダイナミックライブラリを移動またはコピー。

cp AAS64/*.dll qaac

試しに実行。qaac のバージョンと CoreAudioToolbox のバージョンが出力されれば使用可能。もし、ERROR: CoreAudioToolbox.dll: Module not found. のようなメッセージが出るのであればライブラリが呼び出せていない。

wine qaac/qaac64.exe --check
qaac 2.59, CoreAudioToolbox 7.9.9.6 libsoxconvolver 0.1.0 libsoxr-0.1.1

qaac.exe を実行すると WINE の fixme メッセージが出るため WINEDEBUG=fixme-all しておくといいかもしれない。

export WINEDEBUG=fixme-all

qaac64 として呼び出せるように ~/.bashrc に alias を追記。--threading は常用だし入れておいて問題ないと思う。

alias qaac64='WINEDEBUG=fixme-all wine ~/Applications/qaac_2.59/x64/qaac64.exe --threading'

CUE シートを使った AAC エンコード

cdrdao、toc2cue で作成した CUE シートから AAC を作成する。cdrdao で作成したバイナリはデフォルトではビッグエンディアンになっているので s16b の指定が必要になる(忘れると砂嵐というかホワイトノイズ)。また、toc2cue で作成した CUE シートは(恐らく)UTF-8 なので --text-codepage 65001 を指定しないと ERROR: 80004001: mlang->DetectCodepageInIStream(0, GetACP(), stream, encoding, &nscores) となる。CUE シートはカレントディレクトリになくてもよい。

qaac64 --raw --raw-format s16b --text-codepage 65001 album.cue

アルバムをトラックごとに分割しない場合は --concat オプションを併用する。

qaac64 --raw --raw-format s16b --text-codepage 65001 --concat album.cue

Mac OS で afconvert を使ってたときも思ったけど、品質の設定がわかりづらい。--tvbr は 127 が最も高品質だが、実際、内部ではある程度決められた段階の値に丸められる。--abr などは 0 を指定すると最高となり、最大ビットレートは自動的に選択される。--quality は 0 が低品質で 2 が高品質だが、ファイルサイズは 2 の高品質の方が小さくなる。

リサンプル

44.1kHz -> 48kHz などのリサンプルは --rate で 48000 を指定する。--native-resampler オプションで品質を指定することができ、bats,127 が最高品質(127 は 96 に丸められる?)。このオプションはスペースではなく、= で繋がなければならない。

qaac64 --rate 48000 --native-resampler=bats,127 infile.wav

cdrdao、toc2cue で抽出したオーディオ CD の最高品質変換だとこんなところだろうか。

qaac64 \
    --threading \
    --raw \
    --raw-format s16b \
    --text-codepage 65001 \
    --cvbr 0 \
    --quality 2 \
    --rate 48000 \
    --native-resampler=bats,127 \
    album.cue

品質比較

オリジナルの CD 品質の WAV ファイル。

f:id:mattintosh4:20160828001143p:plain

デフォルトの設定でエンコードしたもの。これは暗黙的に --quality 2。(TVBR q91, Quality 96)

f:id:mattintosh4:20160828001236p:plain

--quality 0。(TVBR q91, Quality 32)

f:id:mattintosh4:20160828001639p:plain

--quality 0 と --quality 2(デフォルト)は並べてみるとわかりづらいが、重ねて見ると --quality 0 の方がデータが損失している。

f:id:mattintosh4:20160828003945g:plain

スクリプト

多分まだ書いてる途中。

問題点

--fname-format 内で ${artist}、${album} といったタグが呼び出せない。唯一、呼び出せるのは ${track} か ${tracknumber} くらい?

仕方ないのでシェル側で埋め込むしかない。

qaac 2.59 ヘルプ

qaac 2.59 Usage: qaac [options] infiles.... "-" as infile means stdin. On ADTS/WAV output mode, "-" as outfile means stdout. Main options: --formats Show available AAC formats and exit -a, --abr <bitrate> AAC ABR mode / bitrate -V, --tvbr <n> AAC True VBR mode / quality [0-127] -v, --cvbr <bitrate> AAC Constrained VBR mode / bitrate -c, --cbr <bitrate> AAC CBR mode / bitrate For -a, -v, -c, "0" as bitrate means "highest". Highest bitrate available is automatically chosen. For LC, default is -V90 For HE, default is -v0 --he HE AAC mode (TVBR is not available) -q, --quality <n> AAC encoding Quality [0-2] --adts ADTS output (AAC only) --no-smart-padding Don't apply smart padding for gapless playback. By default, beginning and ending of input is extrapolated to achieve smooth transition between songs. This option also works as a workaround for bug of CoreAudio HE-AAC encoder that stops encoding 1 frame too early. Setting this option can lead to gapless playback issue especially on HE-AAC. However, resulting bitstream will be identical with iTunes only when this option is set. -d <dirname> Output directory. Default is current working dir. --check Show library versions and exit. -A, --alac ALAC encoding mode -D, --decode Decode to a WAV file. --caf Output to CAF file instead of M4A/WAV/AAC. --play Decode to a WaveOut device (playback). -r, --rate <keep|auto|n> keep: output sampling rate will be same as input if possible. auto: output sampling rate will be automatically chosen by encoder. n: desired output sampling rate in Hz. --lowpass <number> Specify lowpass filter cut-off frequency in Hz. Use this when you want lower cut-off than Apple default. -b, --bits-per-sample <n> Bits per sample of output (for WAV/ALAC only) --no-dither Turn off dither when quantizing to lower bit depth. --peak Scan + print peak (don't generate output file). Cannot be used with encoding mode or -D. When DSP options are set, peak is computed after all DSP filters have been applied. --gain <f> Adjust gain by f dB. Use negative value to decrese gain, when you want to avoid clipping introduced by DSP. -N, --normalize Normalize (works in two pass. can generate HUGE tempfile for large piped input) --drc <thresh:ratio:knee:attack:release> Dynamic range compression. Loud parts over threshold are attenuated by ratio. thresh: threshold (in dBFS, < 0.0) ratio: compression ratio (> 1.0) knee: knee width (in dB, >= 0.0) attack: attack time (in millis, >= 0.0) release: release time (in millis, >= 0.0) --limiter Apply smart limiter that softly clips portions where peak exceeds (near) 0dBFS --start <[[hh:]mm:]ss[.ss..]|<n>s|<mm:ss:ff>f> Specify start point of the input. You specify either in seconds(hh:mm:ss.sss..form) or number of samples followed by 's' or cuesheet frames(mm:ss:ff form) followed by 'f'. Example: --start 4010160s : start at 4010160 samples --start 1:30:70f : same as above, in cuepoint --start 1:30.93333 : same as above --end <[[hh:]mm:]ss[.ss..]|<n>s|<mm:ss:ff>f> Specify end point of the input (exclusive). --delay <[[hh:]mm:]ss[.ss..]|<n>s|<mm:ss:ff>f> Specify amount of delay. When positive value is given, silence is prepended at the begining to achieve specified amount of delay. When negative value is given, specified length is dropped from the beginning. --no-delay Compensate encoder delay by prepending 960 samples of scilence, then trimming 3 AAC frames from the beginning (and also tweak iTunSMPB). This option is mainly intended for resolving A/V sync issue of video. --num-priming <n> (Experimental). Set arbitrary number of priming samples in range from 0 to 2112 (default 2112). Applicable only for AAC LC. --num-priming=0 is the same as --no-delay. Doesn't work with --no-smart-padding. --gapless-mode <n> Encoder delay signaling for gapless playback. 0: iTunSMPB (default) 1: ISO standard (elst + sbgp + sgpd) 2: Both --matrix-preset <name> Specify user defined preset for matrix mixer. --matrix-file <file> Matrix file for remix. --no-matrix-normalize Don't automatically normalize(scale) matrix coefficients for the matrix mixer. --chanmap <n1,n2...> Rearrange input channels to the specified order. Example: --chanmap 2,1 -> swap L and R. --chanmap 2,3,1 -> C+L+R -> L+R+C. --chanmask <n> Force input channel mask(bitmap). Either decimal or hex number with 0x prefix can be used. When 0 is given, qaac works as if no channel mask is present in the source and picks default layout. --no-optimize Don't optimize MP4 container after encoding. --tmpdir <dirname> Specify temporary directory. Default is %TMP% -s, --silent Suppress console messages. --verbose More verbose console messages. -i, --ignorelength Assume WAV input and ignore the data chunk length. --threading Enable multi-threading. -n, --nice Give lower process priority. --sort-args Sort filenames given by command line arguments. --text-codepage <n> Specify text code page of cuesheet/chapter/lyrics. Example: 1252 for Latin-1, 65001 for UTF-8. Use this when bogus values are written into tags due to automatic encoding detection failure. -S, --stat Save bitrate statistics into file. --log <filename> Output message to file. Option for output filename generation: --fname-from-tag Generate filename based on metadata of input. By default, output filename will be the same as input (only different by the file extension). Name generation can be tweaked by --fname-format. --fname-format <string> Format string for output filename. Option for single output: -o <filename> Specify output filename --concat Encodes whole inputs into a single file. Requires output filename (with -o) Option for cuesheet input only: --cue-tracks <n[-n][,n[-n]]*> Limit extraction to specified tracks. Tracks can be specified with comma separated numbers. Hyphen can be used to denote range of numbers. Tracks non-existent in the cue are just ignored. Numbers must be in the range 0-99. Example: --cue-tracks 1-3,6-9,11 -> equivalent to --cue-tracks 1,2,3,6,7,8,9,11 --cue-tracks 2-99 -> can be used to skip first track (and HTOA) Options for Raw PCM input only: -R, --raw Raw PCM input. --raw-channels <n> Number of channels, default 2. --raw-rate <n> Sample rate, default 44100. --raw-format <str> Sample format, default S16L. Sample format spec: 1st char: S(igned) | U(nsigned) | F(loat) 2nd part: Bitwidth Last part: L(ittle Endian) | B(ig Endian) Last part can be omitted, L is assumed by default. Cases are ignored. u16b is OK. Options for CoreAudio sample rate converter: --native-resampler[=line|norm|bats,n] Arguments are optional. Without argument, codec default SRC is used. With argument, dedicated AudioConverter is used for sample rate conversion. '--native-resampler' and arguments must be delimited by a '=' (space is not usable here). Arguments must be delimited by a ','(comma). First argument is sample rate converter complexity, and one of line, norm, bats. line: linear (worst, don't use this) norm: normal bats: mastering (best, but quite sloooow) Second argument is sample rate converter quality, which is an integer between 0-127. Example: --native-resampler --native-resampler=norm,96 Tagging options: (same value is set to all files, so use with care for multiple files) --title <string> --artist <string> --band <string> This means "Album Artist". --album <string> --grouping <string> --composer <string> --comment <string> --genre <string> --date <string> --track <number[/total]> --disk <number[/total]> --compilation[=0|1] By default, iTunes compilation flag is not set. --compilation or --compilation=1 sets flag on. --compilation=0 is same as default. --lyrics <filename> --artwork <filename> --artwork-size <n> Specify maximum width or height of artwork in pixels. If specified artwork (with --artwork) is larger than this, artwork is automatically resized. --copy-artwork Copy front cover art(APIC:type 3) from the source. When --artwork is also given, this option is ignored. --chapter <filename> Set chapter from file. --tag <fcc>:<value> Set iTunes pre-defined tag with fourcc key and value. 1) When key starts with U+00A9 (copyright sign), you can use 3 chars starting from the second char instead. 2) Some known tags having type other than UTF-8 string are taken care of. Others are just stored as UTF-8 string. --tag-from-file <fcc>:<path> Same as above, but value is read from file. --long-tag <key>:<value> Set long tag (iTunes custom metadata) with arbitrary key/value pair. Value is always stored as UTF8 string.

mpv でギャップレス再生したい

Linux mpv mplayer

最近、曲間の継ぎ目が無い音楽をほとんど聞いてなかったけど、前の例大祭で買った FELT さんの Rebirth Story III に収録されている Puppet in the Dark(ディスク2の2曲目と3曲目)がそれだった。

前まで使っていた mplayer はギャップレス再生機能は無いっぽかったけど、mpv のマニュアルを読んでみたら --gapless-audio=<no|yes|weak> で指定できた。

mpv --gapless-audio=yes *.m4a

ただ、これだけでは NAS から読んでるせいもあるかもしれないが、継ぎ目が消えない。--audio-buffer オプションでいくらか先読みさせておく。

mpv --gapless-audio=yes --audio-buffer=2 *.m4a

mpv.conf に書いておいてもよさそう。

ところで、Nero AAC Codec を使ってエンコードすると、iTunSMPB というタグが入るけど、ギャップレス再生で使うものらしい。へー。

SOX で Upsampling? stdout with mpv とか

Raspberry Pi SoX mpv ffmpeg ShellScript

この前、Raspberry Pi で cdrdao と toc2cue、bchunk でオーディオの取り込みが出来るようにした。

mattintosh.hatenablog.com

AAC へのエンコードは長い間 Nero AAC Codec を使ってたが、結構古いしそろそろ最近のエンコーダの方がいいかなと思い、変えてみることにした。

最近よく「ハイレゾ」って聞くけど色々放浪してたら、SoX でサンプリングレートを弄ったりする遊びがあるらしい。(Windows では foober2000 のプラグインに入ってるっぽい?)

http://www.hcn.zaq.ne.jp/___/unix/sox-ja.html#E-rate にある最高品質再サンプルを参考に 44.1kHz s16le を 96kHz f32le に変換。

sox -G infile.wav outfile.wav rate -v -I -b 90 96000 dither -S

ファイルサイズがトンデモナイことになる。これは流石に困るので、mpv で AAC に変換する。Libavcodec だから FFmpeg とかと同じかね。FFmpeg は AAC を使うときに -strict experimental の指定が面倒くさい。

sox から標準出力(stdout)を行う場合はタイプを指定する必要がある。標準出力ファイル名は -。(-t f32 でもいいのか? Precision が 32-bit にならない?)

sox -G infile -e floating-point -b 32 -t raw - rate -v -I -b 90 96000 dither -S

mpv 側の標準入力で受け取る場合も - でもいいが、明示的にファイルディスクリプタを指定できる fd://012 書式があるのでそちらを使う。RAW で送られてくるのでソースのフォーマットなどを指定する必要がある。オプションの書き方が FFmpeg ともまた違って面白い。--oac=aac を指定するとバージョンによっては Experimental Codec の注意書きが出るようだ(Arch Linux ARM の mpv では出ないが、Ubuntu の 16.04 の mpv では出る)。

mpv --no-config --demuxer=rawaudio --demuxer-rawaudio-channels=2 --demuxer-rawaudio-format=floatle --demuxer-rawaudio-rate=96000 fd://0 --oac=aac --oacopts=ab=192k

SoX ではスペクトログラムも作成出来るのでやってみる。

sox infile.wav -n spectrogram -h
Input File : '干物妹!うまるちゃん - UMARU THE BEST - 01.wav' Channels : 2 Sample Rate : 44100 Precision : 16-bit Duration : 00:03:32.01 = 9349788 samples = 15901 CDDA sectors File Size : 37.4M Bit Rate : 1.41M Sample Encoding: 16-bit Signed Integer PCM

f:id:mattintosh4:20160824001803p:plain

Input File : '干物妹!うまるちゃん - UMARU THE BEST - 01 (96kHz).wav' Channels : 2 Sample Rate : 96000 Precision : 24-bit Duration : 00:03:32.01 = 20353280 samples ~ 15901 CDDA sectors File Size : 163M Bit Rate : 6.14M Sample Encoding: 32-bit Floating Point PCM

f:id:mattintosh4:20160824001817p:plain

ぱっと見、44.1kHz の方は 22.05kHz をぶっちぎってるような…。

では AAC に変換したものから PCM に書き戻してスペクトログラムを見てみる。mpv はオプション調べるのがめんどくさかったのでとりあえず ffmpeg を使う。

ffmpeg -i infile-96kHz.m4a -f f32le hoge.f32le
sox -b 32 -c 2 -r 96000 -t f32 hoge.f32le -n spectrogram -h

f:id:mattintosh4:20160824010652p:plain

なんか所々ぴょんぴょんしたものもある。これはそこそこまともに戻ってる方なんだろうか。


今回から mpv でエンコードしてみたけど、音質は AAC にしては頑張ってる方なんじゃないだろうか。(iPhone で聴く限りは)

とりあえず一括変換用のスクリプト書いてみた。設定はまた暇なときだなぁ。仕事あがりで聴き比べようとしても疲れてもう無理だ…。

#!/bin/sh
set -e
set -x

: ${1:?}

which sox mpv

for f
do
    case ${f} in
    *.wav|*.WAV)
    ;;
    *)
         continue
    ;;
    esac
    
    sox -G "${f}" -e floating-point -b 32 -t raw - rate -v -I -b 90 96000 dither -S \
    | mpv --no-config --demuxer=rawaudio \
                      --demuxer-rawaudio-channels=2 \
                      --demuxer-rawaudio-format=floatle \
                      --demuxer-rawaudio-rate=96000 \
                      fd://0 \
                      -o "${f%.*}".m4a --oac=aac --oacopts=ab=192k
done

追記(2016年8月24日)

SoX のオプションを少し読んだのでちょい修正。

書式が少し特殊である。

sox [gopts] [[fopts] infile]... [fopts] outfile [effect [effopt]]...

ショートオプションだとわかりづらいのでロングオプションを使用。

今回のサンプルは bchunk で cdr として書き出したので --endian も指定する。自分の場合、cdrdao のあと、dd conv=swab をかけているので little だが場合によっては big かもしれない。

sox -V3 --buffer 65536 \
        --guard \
        --multi-threaded \
        --show-progress \
        --type cdr \
        --endian little \
        CROW\'SCLAW\ -\ Shelling\ And\ Torpedoing\ -\ 02.cdr \
        --bits 24 \
        --type raw - \
        rate -v -I 96000 \
        dither -S \
| mpv --no-config \
      --demuxer{=rawaudio,-rawaudio-{channels=2,format=s24le,rate=96000}} \
      fd://0 \
      -o outfile.m4a \
      --oac=aac \
      --oacopts=ab=192k
sox: SoX v14.4.2 sox INFO formats: `CROW'SCLAW - Shelling And Torpedoing - 02.cdr': overriding file-type byte-order Input File : 'CROW'SCLAW - Shelling And Torpedoing - 02.cdr' Channels : 2 Sample Rate : 44100 Precision : 16-bit Duration : 00:03:10.65 = 8407812 samples = 14299 CDDA sectors File Size : 33.6M Bit Rate : 1.41M Sample Encoding: 16-bit Signed Integer PCM Endian Type : little Reverse Nibbles: no Reverse Bits : no Output File : '-' (raw) Channels : 2 Sample Rate : 96000 Precision : 24-bit Duration : 00:03:10.65 = 18302720 samples ~ 14299 CDDA sectors Sample Encoding: 24-bit Signed Integer PCM Endian Type : little Reverse Nibbles: no Reverse Bits : no Comment : 'Processed by SoX' sox INFO sox: effects chain: input 44100Hz 2 channels sox INFO sox: effects chain: gain 44100Hz 2 channels sox INFO sox: effects chain: rate 96000Hz 2 channels sox INFO sox: effects chain: gain 96000Hz 2 channels sox INFO sox: effects chain: dither 96000Hz 2 channels sox INFO sox: effects chain: output 96000Hz 2 channels

追記(2016年8月25日)

dd で conv=swab してしまった(cdr だとバイトオーダー変更必要なかったのに…)バイナリファイルを bchunk で cdr として書き出したときのためのスクリプトを書き直した。

compand エフェクトの項目に騒音が多くても聴きとりやすくなるというサンプルが載っていたのでそれを入れてみた。rate のあとと前だとどっちがいいんだろうか…。FFmpeg は 3.0 から AAC が正式なものになったらしい(そういや Ubuntu は libav だったから自分で ffmpeg ビルドしたの忘れてた)。最新版をビルドしたら -strict experimental を要求されなくなった。

なかなか Nero AAC Codec との比較をしている時間がない。cdrdao の取り込みやり直そうかなぁ。リトルエンディアンにしておいて方が楽ではあるんだけど。

Audio CD を RAW データで取り込む

Linux Ubuntu cdrdao ffmpeg ffplay mplayer VLC dd bchunk cdparanoia toc2cue

この前買った CD をいい加減取り込まなくてはと思いつつ、あきばおーでポータブル DVD ドライブを買ってきた。最近だと ¥2,500 もあれば買えてしまうのね。1台買っておけばよかった。(でも読み込み 24x って遅い…)

取込みはいつも cdparanoia を使って、NeroAacEnc でエンコードしているのだけど、今日は RAW でも取り込んで遊んでみた。ちなみに Audio CD は dd コマンドでは取込みが出来ない。

Audio CD を RAW データで取り込む

まずは cdrdao の使い方を見てみよう。

cdrdao

cdrdao は cdrdao だけでは動作せず、cdrdao <command> 形式で実行する必要がある。

Cdrdao version 1.2.3 - (C) Andreas Mueller Usage: cdrdao [options] [toc-file] command: show-toc - prints out toc and exits toc-info - prints out short toc-file summary toc-size - prints total number of blocks for toc read-toc - create toc file from audio CD read-cd - create toc and rip audio data from CD read-cddb - contact CDDB server and add data as CD-TEXT to toc-file show-data - prints out audio data and exits read-test - reads all audio files and exits disk-info - shows information about inserted medium discid - prints out CDDB information msinfo - shows multi session info, output is suited for scripts drive-info - shows drive information unlock - unlock drive after failed writing blank - blank a CD-RW scanbus - scan for devices simulate - shortcut for 'write --simulate' write - writes CD copy - copies CD Try 'cdrdao -h' to get a list of available options

今回は読み取りを行うので read-cd コマンドを使う。これもヘルプを見てみる。

cdrdao read-cd
Cdrdao version 1.2.3 - (C) Andreas Mueller Usage: cdrdao read-cd [options] toc-file options: --device [proto:]{|device} - sets SCSI device of CD-ROM reader --driver - force usage of specified driver for source device --datafile - name of data file placed in toc-file --session # - select session --fast-toc - do not extract pre-gaps and index marks --read-raw - read raw data sectors (including L-EC data) --no-mode2-mixed - don't switch to mode2_mixed --rspeed - selects reading speed --read-subchan - defines sub-channel reading mode = rw | rw_raw --tao-source - indicate that source CD was written in TAO mode --tao-source-adjust # - # of link blocks for TAO source CDs (def. 2) --paranoia-mode # - DAE paranoia mode (0..3) --with-cddb - retrieve CDDB CD-TEXT data while copying --cddb-servers - sets space separated list of CDDB servers --cddb-timeout # - timeout in seconds for CDDB server communication --cddb-directory - path to local CDDB directory where fetched CDDB records will be stored --force - force execution of operation -v # - sets verbose level

今回はデータファイルを作成するので --datafile オプションを使う。今回は --swap を使って s16le -> s16be にバイトオーダーを入れ替えてみる。(※こんな話をしておきながら実は --swap を使わずに dd conv=swab した方が何かと都合がよい)

CD はこれ。(その情報は重要か?)

Walkure Attack!(初回限定盤)(DVD付)

Walkure Attack!(初回限定盤)(DVD付)

※面倒なので以降、シェルのブレース展開を使う。

cdrdao read-cd --rspeed 24 --read-raw --swap --datafile 'Walküre Attack!'.{bin,toc}

TOC ファイルは以下のようなものになる。CATALOG は値を調べてみたら JAN が入ってるっぽい。ISRC(International Standard Recording Code)とは日本語で「国際標準レコーディングコード」のこと。

CD_DA CATALOG "4580325321982" // Track 1 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "Walküre Attack!.bin" 0 04:54:47 // Track 2 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "Walküre Attack!.bin" 04:54:47 04:12:55 // Track 3 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "Walküre Attack!.bin" 09:07:27 03:54:70 // Track 4 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "Walküre Attack!.bin" 13:02:22 04:04:28 // Track 5 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "Walküre Attack!.bin" 17:06:50 04:25:60 // Track 6 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "Walküre Attack!.bin" 21:32:35 04:30:72 // Track 7 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "Walküre Attack!.bin" 26:03:32 05:34:68 // Track 8 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "Walküre Attack!.bin" 31:38:25 05:14:57 // Track 9 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "Walküre Attack!.bin" 36:53:07 05:11:25 // Track 10 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "Walküre Attack!.bin" 42:04:32 04:26:38 // Track 11 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "Walküre Attack!.bin" 46:30:70 04:39:52 // Track 12 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO ISRC "JPVI01610890" FILE "Walküre Attack!.bin" 51:10:47 05:09:18

RAW データの再生

出来上がった RAW データは mplayer で再生できる。

mplayer --demuxer rawaudio 'Walküre Attack!'.bin

ffmpeg(ffplay)の場合はフォーマット、レート、チャンネルを指定しないと正しく再生できない。(cdrdao read-cd --swap していない場合は -f s16le)

ffplay -f s16be -ar 44100 -ac 2 -i 'Walküre Attack!'.bin

VLC の場合はチャンネル数のデフォルトが 2 なので --rawaud-channels=2 は省略してもよい。(cdrdao read-cd --swap していない場合は --rawaud=fourcc=s16l)

vlc 'Walküre Attack!'.bin --demux=rawaud --rawaud-fourcc=s16b --rawaud-samplerate=44100

dd conv=swab している場合は s16le になる。

dd if='Walküre Attack!'.bin of='Walküre Attack!'.bin.swaped conv=swab
mplayer --demuxer rawaudio 'Walküre Attack!'.bin.swaped
ffplay -f s16le -ac 2 'Walküre Attack!'.bin.swaped
vlc 'Walküre Attack!'.bin --demux=rawaud --rawaud-samplerate=44100

dd で変換した場合、TOC 内に記述されているファイル名と一致しなくなるので古い方を捨ててリネームしておく。

rm 'Walküre Attack!'.bin
mv 'Walküre Attack!'.bin.swaped 'Walküre Attack!'.bin

RAW データの分割

TOC ファイルから CUE シートを作成する。

toc2cue 'Walküre Attack!'.{toc,cue}

bchunk を使って分割、WAVE ファイルを作成する。(-w をつけない場合は BIN 状態のまま分割される)

bchunk -w 'Walküre Attack!'.{bin,cue,}

自動化

RAW 読み込み、スワップ、CUE シート作成、WAV ファイル作成まで一括で。デバイスの指定とか環境によっては細かい指定が必要かも。

#!/bin/sh
set -e
set -x

: ${1:?}

cdrdao read-cd --read-raw --datafile "$1".bin "$1".toc
mv "$1".bin "$1".bin.orig
dd conv=swab if="$1".bin.orig of="$1".bin
rm "$1".bin.orig
toc2cue "$1".toc "$1".cue
bchunk -w "$1".bin "$1".cue "$1 - "

参考

forums.freebsd.org

linux.die.net

Maker Faire Tokyo 2016 に行ってきた

Raspberry Pi

2016年8月6日、7日に東京ビッグサイトで行われた『Maker Faire Tokyo 2016』に行ってきました。(仕事前だったので7日の終了間際だけなんだけど…)

MFTにやってきました

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

目当ては『アールエスコンポーネンツ株式会社』さん(F01-09)、『Raspberry Pi Shop by KSY』さん(F01-10)、『株式会社スイッチサイエンス』さん(F02-10)だったんだけど、まずは目玉展示品『1/2 タチコマ』。いただいたパンフレットによると2018年3月に社会実装実証を予定しているとのこと。

1/2タチコマ☆*:.。. o(≧▽≦)o .。.:*☆ #MFT2016

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

アールエスコンポーネンツさんのところでアンケートに答えて Raspberry Pi のクリアファイルをもらいつつ隣の KSY さんのところへ。目当ての Raspberry Pi 用アルミケース『Pi ケース Leg V1』のサンプル見せてもらってファン対応モデルを1個購入(¥2,500)。注意事項として、今回のサンプルには RPi3 のワイヤレスモジュール用のスリットが入っていないらしく、電波が弱くなるかもしれないとのこと。

筐体の作りは非常によく、Raspberry Pi をがっちり守ってくれそう。これはファンが取り付け可能なタイプの方なんだけど、吸気できても排気が難しい構造なような(?)。

ただ、無線モジュールのスリット問題以前に、電源用 microUSB ケーブル部分の穴が小さく、コネクターがひっかかって挿さらないといった問題があった…。自分が使ってるのは Anker 製のケーブルで、ケースの穴より一回り大きい。ほかにもいくつかケーブルは持っていたけどいずれもコネクター部分がひっかかってしまい、使えなかった。

秋葉原あたりで探せばもう少しコネクターの小さなケーブルもあるだろうけど、2.4 A 対応タイプとかでそれがあるのかどうかはわからない。ケースの素材がアルミだから自分で削ってもいいのだけど。

スイッチサイエンスのブースを見てきたけど、ヤバイ、Arduino 欲しくなる、Edison 欲しい!。IoT(Internet of Toilet)も面白かったな。アイディア次第で色々遊べそう。

次回はもうちょっと長く滞在したいなぁ、と思ったのでした。