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

;; Sat Aug  8 08:06:36 2020
# Writable Tag -wtag-mode-

Emacs の編集バッファで通常のテキストのように mp4(m4a)、 oma(atrac3plus)、 mp3(ID3v2.2 ID3v2.3)、flac のタグの書き換えをするツールです。
ディレクトリ = アルバム であることが前提です。
対象のディレクトリ(アルバム)を開くと、タイトルの一覧のバッファが開くので、 通常のテキストのように見たり 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)して展開したら、.el file を load-path の通った処に置き load するよう設定します。


```emacs-list:設定例
(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))
```

# 使い方

M-x wtag であとからファイルを指定するか、
dired 上で開きたいアルバムにポイントを合わせて M-x dired-wtag を実行します。

実行されると曲目一覧のバッファが開き､アートワークがあれば別のバッファで開きます。
`q` でバッファを残したまま終了 `Q` で kill-buffer して完全終了です。
ここで `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` マーク解除
- `w` ポイントの曲タイトルをキルリングに登録
- `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 した環境

win10(64bit) で以下のバージョンの Emacs を -Q 起動して、最低限の準備だけした環境で動くことを確認しました。

> 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-1.6")
(setq load-path (cons "." load-path))
(setq frame-title-format "%b (%f)")
(modify-frame-parameters nil '((foreground-color . "lightgray")
			       (background-color . "black")
			       (cursor-color     . "lightgray")
			       (font             . "Myrica M")
			       (line-spacing     . 1)))
(load "wtag")
(load "taged")
```

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

taged というのは、はじめ wtag でもファイルを指定して実行した場合そのファイルのみに対してのエディットになったのですが、 いつのまにかできなくなっていたので、専用のものを別途作りました。
taged でファイルを引数として実行するか、dired上なら dired-taged でポイントのファイルを対象に起動します。 必要無いなら load は不要です。

![taged-win10-dark-tamaki-small.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239081/673ee0e6-1f81-c115-7cf9-ea6178112a51.png "taged")

# Changes
## Sat Jan 23 10:25:48 2021
- [wtag](https://github.com/s-fubuki/wtag/blob/master/wtag.el): タイトルをコピーする w コマンドのエンバグ修正.

## Sat Sep 26 08:50:14 2020
- Backend `mf-tag-write` のバグ修正と Emacs 27.1 `image-mode` への適応.
- アーカイブ置き場を [github](https://github.com/s-fubuki/wtag.git) にお引っ越ししました.

## Sat Aug  8 09:33:50 2020
- [lib-flac](https://qiita.com/s-fubuki/items/0f470b859837927b4e28)バグフィクスに伴なう更新

## Fri May 29 10:44:28 2020
- qiita 上のドキュメントがグシャグシャすぎるのでコーデックが増えたのを機にゼロから仕切り直し.
- Dark mode だとちゃんと色がついていなかったのを修正. 
- wtag, taged 共々カーソル移動が割とまともになる.
- iTunes で作たれたデータなどでセットアルバムがひとつのアルバムになっている場合のソートの修正.
- 他.


# 関連プログラム

- `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/)