<h1 align="center">lwavconv</h1>

![thumb](./readmesrc/00.png)

lwavconvはループ設定されたWAV形式のファイルの変換補助ツールです。外部プロセスとしてFFmpeg等を使用します。

WAVファイルにループ設定をする場合、smplチャンク内でループ開始位置と終了位置を決める必要があります。この設定を.oggなどのタグに適用する場合、複数の工程を要することがほとんどです。このツールでは内部でループ関連の処理を済ませて適用できる形にし、外部エンコーダーで各種形式へ元のメタデータを保持したまま変換します。

変換時はループ設定から自動で曲の長さを調節し、余分な長さをカットしてから変換することが可能です。これにより、ファイル使用時の容量の最適化が期待できます。設定ファイルを変更し元ファイルの曲の長さのままループ設定を適用して変換することも可能です。

また、OGG形式のみ一部の環境で必要になり得る、ループ部分での分割ファイルも生成可能です。

非ループ形式のMP3,FLACなども変換先の対象にしているため、単にWAVファイルの多形式一括同時変換ツールとしても使用できるほか、テンプレートを使用したタグ情報のtxt出力にも対応しています。

-----

## 注意事項

lwavconvは無保証です。使用の際は自己責任となります。

lwavconvを使用したことによるいかなる損害・トラブルにおいても私は一切責任を負いません。

第三者による販売または再配布は禁止です。

-----

## 必須ファイル

動作には最低でも以下が必要です。ダウンロード方法など詳細な導入方法は割愛させていただきます。

- FFmpeg.exe    https://ffmpeg.org/
    ほぼすべての変換処理に使用します。環境変数には一応対応していますがテストしていません。以下で述べる導入方法をお勧めします。

-  AtomicParsley.exe    https://github.com/wez/atomicparsley
    AACコーデックで変換したM4Aファイルのループタグ設定に必要です。FFmpegだけではM4Aファイルのループタグを設定できません。
    <span style="color: red;">20221229.172126.d813aa6のビルドではユーザータグを正常に設定できません。それより前のバージョンを使用してください。</span>
    AACコーデックを使用しない場合はこのファイルの導入を省略できますが、意図せぬエラーが起こる可能性があるので、導入するようにしてください。

-----

### 任意ファイル

特定のエンコーダー使用時に以下が必要です。

- qaac (qaac64.exe, refalac64.exe)  https://sites.google.com/site/qaacpage/
- fdkaac.exe   https://www.rarewares.org/aac-encoders.php#fdkaac
- Opus Tools (opusenc.exe)  https://www.rarewares.org/opus.php#opus-tools

Opus形式への変換の際にはopusencの使用を推奨します。FFmpegで変換する場合使用できるサンプリングレートに限りがあります。

-----

## 導入方法

まずlwavconv.zipを適当なフォルダに解凍してください。

解凍後`lwavconv.exe`と同じフォルダにある`exe_files`フォルダーに上記リンクからダウンロードしたファイルにある各exeを設置します。ただしqaac64, refalac64は、exe_filesフォルダー内にあるqaacフォルダーに設置してください。

任意ファイルを含めすべてのファイルを導入した場合、exe_filesフォルダー内は以下のようになります。
![01](./readmesrc/01.png)

exe_filesフォルダーにFFmpegが存在しない場合は環境変数から参照する設定になっていますが、必須ファイルの部分でも述べた通りテストしていません。

-----

## 使用方法

Wavosaur, REAPERなどでsmplチャンクにループ設定を記入したWAVファイルを用意します。ループ音源を作成する必要がない場合は、普通のWAVファイルを用意して下さい。

lwavconv.exeに対しWAVファイルをドラッグアンドドロップするだけで、convertフォルダ内に各形式で変換された音声ファイルが出力されます。複数ファイルのドラッグアンドドロップに対応しています。

<span style="color: red;">convertフォルダ内に同一名のファイルが存在する場合は確認なしで上書きされます。また、入力はWAVファイル以外対応していません。ご注意ください。</span>

## lwavconv.ini 詳細設定
![02](./readmesrc/02.png)

lwavconv.iniを編集することにより、変換する形式やエンコーダーのコマンドライン引数などをある程度カスタマイズできます。ただし一部設定は予期せぬファイルの上書きなどを引き起こすため注意が必要です。

### Export

WAVファイルから変換するファイル形式の有効無効をここで選択します。`split_ogg`はWAVファイルにループ設定が存在する場合のみ出力されます。

また、`metadata_txt`は`split_ogg`以外のいずれかのファイル形式の出力が有効になっていない場合無効になります。

### Encoder

一部ファイル形式のみ、変換に使用するエンコーダーを選択できます。使用できるエンコーダーと対応するexeファイルは以下の通りであり、下記以外の形式は全てFFmpegにて処理されています。

- aac
  - ffmpeg_aac (default, ffmpeg.exe)
  - aac_mf (ffmpeg.exe)
  - qaac64 (qaac64.exe)
  - fdkaac (fdkaac.exe)

- alac
  - ffmpeg_alac (default, ffmpeg.exe)
  - refalac64 (refalac64.exe)

- opus
  - libopus (default, ffmpeg.exe)
  - ffmpeg_opus (ffmpeg.exe)
  - opusenc (opusenc)

無効な文字列の場合はデフォルト形式が使用されます。

### Codecs_Option

変換時のコマンドライン引数をこの部分である程度制御できます。使用できる引数は各外部エンコーダーに依存するためここでは説明しません。よくわからない場合はこの設定は変更しないでください。

自分でコマンドライン引数を設定する場合、入力専用のコマンドやタグ関係のコマンドは設定しないでください。また、サンプリングレートとビット深度は後述の設定で変更できるので、ここで引数設定をして変更しようとしないでください。エラーの原因になります。

引数をカスタマイズする際はEncoderの欄の対応するexeも参照し、注意して行うようにしてください。`split_ogg`の設定は`ogg`と共有です。

### Other_Option

この項目にはその他の詳細な設定がすべて含まれています。ファイルの出力方法などにかかわるため詳しく説明します。

#### sr_bd_change
![03](./readmesrc/03.png)

`true`に設定した場合のみ変換時にサンプリングレートとビット深度の変更が有効になります。__ただしこの設定はあくまでもオプションであることに留意してください。__

この設定が有効な場合ループ位置のサンプル数は自動計算されますが、サンプリングレート変換後の正確なループを保証するものではありません。この設定は使用せず、WAVファイル用意の段階ですべて調整するべきです。

使用できる値は以下のとおりであり、それ以外はデフォルト値が適応されます。

- sample_rate
  - 8000
  - 11025
  - 12000
  - 16000
  - 22050
  - 24000
  - 32000
  - 44100
  - 48000 (default)
  - 64000
  - 88200
  - 96000
  - 128000
  - 176400
  - 192000

- bit_depth
  - 8
  - 16
  - 24 (default)
  - 32
  - 32_float
  - 64_float


#### use_both_for_loop_file, always_export_no_loop_folder

![04](./readmesrc/04.png)

後述する`tag_order.txt`,`tag_order_loop.txt`関連の設定です。Exportで`metadata_txt = true`としている場合に関係します。

`use_both_for_loop_file`が`false`の場合はWAVファイルのループ情報の有無に基づいて、タグ情報のテキスト出力に`tag_order.txt`,`tag_order_loop.txt`のどちらかを使用します。`true`の場合どちらのファイルもベースにして出力します。`tag_order.txt`で通常のメタデータを出力し、`tag_order_loop.txt`でループ関連の記述のみをする場合などに使用できます。

`always_export_no_loop_folder`が`false`の場合、`tag_order_loop.txt`をベースにしたテキストはループ設定のある音声ファイルと同じフォルダに出力されます。`true`にすることで常にMP3などの非ループ形式の保存先フォルダに出力します。


#### aac_codec_extention, add_alac_file_modifier

![05](./readmesrc/05.png)

AAC,ALACコーデックでのファイル変換時の拡張子に関与します。

aac,alacの拡張子は一般的に.m4aですが、非ループのWAVファイルの使用時や後述のフォルダ関連の設定により、この2つが同じフォルダに出力される場合があります。拡張子とファイル名が同じ場合上書きされてしまうため、その対策をするための設定です。

`aac_codec_extention`で`aac`を指定すると、AACコーデックで変換した後のファイルの拡張子が`.aac`に変更されます。デフォルトは`.m4a`です。

`add_alac_file_modifier`を有効にした場合、ファイル名の最後に`alac_file_modifier`で指定した文字列を付与し、ファイルの上書きを抑制します。

この設定は変更しないことをお勧めします。

#### sound_loop_optimization

![06](./readmesrc/06.png)

`true`の場合はループ設定のあるwavファイルをループ対応形式に変換する際に、ループ部分以降の再生されない領域をカットしてから変換します。これによりループ対応形式はファイルサイズを最適化し、非ループの形式では通常通り曲の終わりまで再生できるものを一括変換できます。

ループフラグを無効にした場合に最後まで曲を再生できる必要があるなら`false`に設定し、元ファイルの再生時間のままループ設定のみを反映してください。

#### loop_sound_individual_folder、no_loop_sound_filename_folder

![07](./readmesrc/07.png)

ループ設定のあるWAVファイルを変換する場合、 ループ設定されているファイル形式は1つのフォルダーにまとめられます。`split_ogg`の出力結果はその中の`unityloop`フォルダーに入ります。`loop_sound_individual_folder`を`false`にした場合、 ループ対応形式のファイルも全て非ループ形式の保存先と同じフォルダーに出力されます。これを`false`にする場合は、前述の.m4a拡張子関連の設定に注意してください。

`no_loop_sound_filename_folder`をtrueにすると、非ループ形式ファイルも名前フォルダーに保存されるようになります。これは`loop_sound_individual_folder`と併用することができます。

双方を`true`に設定するとconvertフォルダにファイル名のフォルダが作られ、その中に非ループ音源とファイル名のフォルダが作られ、さらにその中にループ音源とunityloopフォルダーが作られ、unityloopフォルダー内に`split_ogg`が出力されます。

`loop_sound_individual_folder`のみを`true`にした場合はconvertフォルダ以下にファイル名のフォルダを作成し、その直下にすべての出力結果が保存されます。

#### length_add

![08](./readmesrc/08.png)

メタデータのtxt出力時の再生時間表記を変更します。双方を`true`にするとhh:mm:ss.xxxの形で出力されます。

#### split_ogg_name

![09](./readmesrc/09.png)

`Export`で`split_ogg`の出力を有効にした場合のファイル名末尾の修飾子を設定します。同じファイル名にした場合上書きされてしまうので、必ず違う名前を設定してください。

## tag_order.txt, tag_order_loop.txtについて

lwavconvにはメタデータ出力用のテンプレートとしてtag_order.txt, tag_order_loop.txtが付属しています。

このテンプレートは編集可能であり、ある程度出力結果のレイアウトをカスタマイズできます。

![10](./readmesrc/10.png)

上記はtag_order.txtのデフォルト内容です。このテンプレートを使用し、foobar2000で可能な限りタグ付けした結果が以下になります。

![11](./readmesrc/11.png)

このように`<タグ名>`で指定した位置に該当するタグ内容で置き換えて出力されます。`<タグ名>`で指定したタグがwavファイル内に存在しない場合は、以下のように空白となります。

![12](./readmesrc/12.png)

付属のtag_order.txtはfoobar2000でデフォルトで設定可能なすべてのタグ内容を記載していますが、任意のユーザータグを設定している場合はそれも`<タグ名>`の形で記入すればその位置に置き換えて出力が可能です。その際txt側に記載するタグ名は小文字にしてください。

`<`,`>`以外は内部で何も処理していませんので、txtにある程度自由に装飾することが可能です。

![13](./readmesrc/13.png)

上記はtag_order_loop.txtのデフォルト内容です。ループ設定のあるwavファイルでこのテンプレートを使用した結果が以下になります。

![14](./readmesrc/14.png)

tag_order_loop.txtには簡易的な情報しか載せていませんが、tag_order.txtと同じように`<title>`や`<artist>`などを追加すれば、こちらのテンプレートを使用した場合でもその内容が表示されます。

### タグ名`<length>`, `<filename>`について

tag_order.txt,tag_order_loop.txtでは私の個人的な都合により2つの特殊なタグを追加しています。

`<length>`タグはlwavconv.ini 詳細設定でも少し触れましたが、元となるWAVファイルの再生時間を参照し、通常のタグと同様txtに記載します。元のWAVファイルしか参照していないため、ループ最適化後の再生時間は記載できません。

`<filename>`タグは単純に元となるWAVファイルのファイル名を記載します。拡張子は表記しませんが、表記が必要な場合はテンプレート内直接記載すると拡張子付きで出力できます。以下はファイル名の後に`.ogg`と表示したい場合の例です。

![15](./readmesrc/15.png)
![16](./readmesrc/16.png)

`<filename>`タグの直後に`.ogg`と書けばこのように記載された状態で出力されます。

使い道は少ないですが、`<filename>`タグだけでなく他のタグ情報の後にも任意の文字列を記載可能です。

## 更新履歴

2023-07-07 
v1.0.1 split oggの出力ファイル名を修正

2023-06-28 
v1.0.0 リリース

-----

Copyright© 2023 [doranarasi](https://doranarasi.com/) All rights reserved.

lwavconv.exe is compiled by [Nuitka](https://nuitka.net/)

[Nuitka](https://nuitka.net/) is licensed under the Apache License, Version 2.0

