Emacs 画面で音楽ファイルのタグの編集

# この記事は期限切れです (May 30 2020)
書き直した新しいものが[此処](https://qiita.com/s-fubuki/items/f2bed629f51aeca3b38f)にあります。

# Writable Tag -wtag-mode-

Emacs の編集バッファで通常のテキストのように mp4(m4a)、 oma(atrac3plus)、 mp3(ID3v2.2 ID3v2.3) のタグの書き換えをするツールです。
ディレクトリ = アルバム であることが前提です。
dired から対象のディレクトリ(アルバム)を開くと、タイトルの一覧が出るので、 通常のテキストのように見たり Emacs の編集機能を使って編集したりすることができるようになります。


![wtag-read-70.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239081/af703644-3286-13c1-dc9b-9ccaa2d6faa2.png "アルバムを読み込んだ画面")

注意: 音楽データそのものを書き換えするだけで、iTunes や MusicCenter 等の管理データベースまで書き換えするわけでありません。整合性が崩れるのでそちらで曲を管理されている場合はアルバムフォルダをコピーしてそこで試してください。

# インストール

mf-tag-write/read が必要です。このプログラムはそのパッケージの附属なので、mf-tag-write がインストール済みならすぐに使えます。

[アーカイブファイルをダウンロード](https://github.com/s-fubuki/wtag.git) して展開したディレクトリを運用したい場所に置き、そこに load-path を通し load します。
具体的には init.el 等で以下のようにします。 "~/.emacs.d/local/" にコピーした場合です。

```emacs-list:init.el
(setq load-path (cons "~/.emacs.d/local/wtag/" load-path))
(require 'wtag)
```

必要なら適当なキーにバインドします。

```emacs-list:init.el
(add-hook 'dired-mode-hook '(lambda () (local-set-key "\C-ci" 'dired-wtag))
```

# 使い方

dired 上で開きたいアルバムにポイントを合わせて実行します。

```
M-x dired-wtag
```

実行されると曲目一覧のバッファが開きアートワークがあればそれも別のバッファで開きます。
`q` で終了 `Q` で完全終了です。
ここで `C-x C-q` すると編集モードになります。
`C-c C-c` で編集した内容で各ファイルに書き戻されます。
`C-c C-c` する前ならば `C-c C-q` で編集をキャンセルできます。

wdired のように使いたいと思ったので、 参考にして操作を似せてあるつもりなので Emacs を使っている人ならば特に違和感なく使えると思います。 ちなみに編集時の skk の確定は `C-j` でします。

## ビューモード時の主なキー割り当て
- `q` 抜ける
- `Q` 終了
- `C-x C-q` 編集モードにする
- `C-c C-a`アートワークを再表示.
- `F` アートワークを別フレームで表示
- `C` ポイントの曲を次のバッファにコピー
- `P` ポイントの曲を再生
- `m` コピーしたい曲をマーク
- `u` マーク解除
- `C-=` ポイントのファイル名の表示。 編集モードでも有効です。
- `C-c C-l` 画面の折り返し表示をトグルします。編集モードでも有効です。

`P` で使うアプリは `wtag-music-player` に、オプションは `wtag-music-opts` 設定します。
デフォルトでは "wmplayer.exe" と '("/play" "/close") で、`wtag-music-opts` はリストで指定します。

`C` の次のバッファとはふたつウィンドウが開いていれば現在の隣のウィンドウのバッファになります。

## 編集モード

![wtag-write-70.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239081/d087cc76-3c6d-66b3-1694-3a3604004976.png "編集モード")

編集モードになると画面がモノクロ基調になり、 編集できない箇所は反転グレーになり、 編集できる箇所にだけカーソルが移動できるようになります。
`tab` や `S-tab` で前後のエリアにポイントを移動できます。 `c-k`, `c-y` 等もエリア内で動くようになります。 Emacs の矩形選択機能も意図した動作になり有用です。

## 編集モード時の主な主なキー割り当て
- `C-c C-c` 変更されたファイルがあれば書き出して終了。

- `C-c C-q` 変更を破棄して終了。

- `TAB` 次のエリアにポイントを移動。`S-TAB` で逆方向移動。

- `C-c C-a` アルバム・アーティスト名を各トラックのアーティストのエリアすべてにコピーします。キャンセルしたいときは普通に undo します。

- `C-x C-t` で行の入れ替えをするとトラック番号も降順に振り直されます。
このとき prefix として `0` を付けることでポイント行とマーク行の入れ替えになるので、離れた行の入れ替えができます(`C-u 0 C-x C-t`)。1?2行目にかかる箇所では使えなくなっています。

- `C-c C-i` 新たなアートワークをロード。
ウィンドウズならエクスプローラからマウスで D&D することもできます。 テキストウィンドウ、イメージウィンドウどちら側にドロップしても OK です。


# 画面構成やその他の注意点等
|行|foo|bar|
|:--:|:--|:--|--:|
| 1 | ディスク番号 | アルバムアーティスト      | アルバムタイトル |
| 2 | ジャンル     | リリース年                |                  |
| 3 | トラック番号 | アーティスト名            | 曲タイトル       |
| . |              | 以下曲数分3行目と同じ構成 |                  |

1行目から2行目とアートワーク(あれば)はトラック番号が一番小さなデータのものを共通データとして利用します。なので実際の各データが持つ当該データとは必ずしも一致しない場合があります。
編集モードでファイルに書き戻したとき、ここが元のデータと違っていてもこのデータに書き変ります。
稀に曲ごとにジャンルだけまちまちなアルバム等ありますが、それを維持したい場合は注意してください。

- 該当タグが無い場合は "n/a" と表示されます。
コーデックの仕様によってはそもそも存在しないタグもあり、そういうものは書き変えしても反映されません。(oma のディスク番号等。)

- 書き出すとき mf-tag-write 側で規定のコーディングにエンコードするので、編集時のバッファのコーディングは影響しません。

- 等倍のフォントでないと画面表示は崩れます。

- 各トラックのアーティスト名の末尾に、表示の位置揃えのための空白がついていて編集時にも存在したままですが、書き出されるときにその部分はカットされます。

- 決め打ちしているので mf-tag-write の alias 設定が変更されている場合うまく動きません。


# kakasi について
システムに kakasi(漢字→かな(ローマ字)変換プログラム)がインストールされていると、 読み変換したものを(例え正しく変換されなくても)ソート用タグとして自動的に追加します。
ウィンドウズ用の kakasi はバイナリが Unicode に対応する前の古いものしかないようなので nkf も使います。

システムに kakasi がインストール済みで Emacs 上で kakasi にパスが通っていれば自動的にセットアップされます。

kakasi が無いとソート用タグは元のタグと同じ文字列が使われます。

[kakasi web] (http://kakasi.namazu.org/index.html.ja)

kakasi に指定する辞書は skk-user.dic > 無指定 > skk-large.dic の順で賢くなるようです。


# 動作 test した環境

以下のバージョンの Emacs でいつも使っている通常の環境(win10/win7)と
-Q 起動して最低限の準備だけした環境で動くことを確認しました。 32bit/64bit 版双方の Emacs です。

> GNU Emacs 26.3 (build 1, i686-w64-mingw32)
>  of 2019-08-29

[Gnu Emacs DownLoad](https://www.gnu.org/software/emacs/)

```emacs-lisp:emacs&nbsp;-Q&nbsp;環境にて
;; ライブラリを展開したディレクトリに移動
(cd wtag)

;; load-path にカレントディレクトリを追加
(setq load-path (cons nil load-path)) 

;; emacs に load する (mf-tag-write 等もあることとします)
(require 'wtag)

;; キャプチャする為フレームタイトルをバッファ名にする
(setq frame-title-format "%b (%f)")

;; 等幅フォントにする https://myrica.estable.jp/
(set-face-attribute 'default nil :family "Myrica M")
```

使ったデータは 90% が SonicStageCP, MediaGoGo, MusicCenter1, 2 でリッピングしたデータで残りが iTunes やレコチョク, dead.net 等のデータです。

# Changes
## Sat Sep 26 08:50:14 2020
- Bug-fix と アーカイブのロケーションを変更

## Sat Feb 15 10:03:39 2020
- wtag
 - oma(atrac) だとアルバムアーティストが変更できないバグを修正しました.
 - kakasiを呼ぶ no nkf 関数が win10 だと何故だか動かないことがあったので 変数 wtag-kakashi-nkf が non-nil なら要 nkf の旧関数を使います.

- taged
 - キーボード操作からのアートワークロードがうまく動いていなかったのを修正しました.
 -  C-c C-f でアートワークを別フレームに開いたとき q でフレームをクローズできるようにしました.
 
- mf-lib-utility
 -  dired-image-extract で既存ファイルを保護するようにしました.
 -  123456789.m4a 等レコチョク系ファイルから正規表現にマッチするタグを含んだファイルをマークするコマンド dired-music-file-match (dired から C-% m) を追加しました.
 - 他.

## Sat Feb  1 10:35:45 2020
- mf-tag-write でアートワーク等をオブジェクト指定できるよう修正.
- wtag kakasi 利用で nkf を不要に.
- wtag wtag-log-file-name nil でログをファイルに残さない.

## Tue Dec 31 14:02:24 2019 1.1
- mf-lib-mp4 の MediaGo 対応。
- `wtag` で起動した場合の引数の修正。
- Write mode 時 `C-x C-q' もキャンセルにする。
- emacs 終了時にログを書き出す。


# 関連プログラム

- `C-h f wdired-mode`
- [mf-tag-write](https://qiita.com/s-fubuki/items/0f470b859837927b4e28)
- [kakasi](http://kakasi.namazu.org/index.html.ja)
- [GNU EMACS](https://www.gnu.org/software/emacs/)