HIITのためのBGMをFFmpegコマンドだけでで作成する

### HIITとは

例えばこんな感じ

- 20秒運動して10秒休むという運動方法
- 10秒休むことで継続できる
- 10秒休むことで20秒は全力で運動できる
- 8セットやっても4分で終わる
- だから毎日継続できる

### HIITのためのBGMに求められること

- 20秒もそこそこつらい
- あと何秒かがわかると嬉しい
- リズムをキープしたいので1秒ごとに音はなって欲しい
- 映像で見せるタイプのタイマーもあるが、プランクの姿勢もあるので音だけでわかるようにしたい

### DTMツールではなくFFmpegで実装したい

なぜFFmpegか

- オープンソースであるためコンパイルさえ通ればずっと使える
- CLIであるため自動化が可能
    - 自動化が可能ということはWebサービスにしやすい
    - Webサービスにしないまでも、bashスクリプトにすることで、コピペ修正で亜種が作りやすい
- ブラウザ＋JavaScriptでメトロノーム的な動きもできなくはないが、テンポがどうしてもずれるので断念
- 音声ファイルを生成することで、音声プレーヤーや動画プレーヤー側の機能で速度を変えたりできる


### まずはFFmpegで自力で音を作るお勉強

```bash
# このバージョンでやっています
ffmpeg --version
#=> ffmpeg version 4.2.7-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers

# 試しに1000Hzの音を5秒ならす
ffmpeg -f lavfi -i "sine=frequency=1000:duration=5" 1000hz5sec.wav

# 1000 Hz を0.1秒短く鳴らす
ffmpeg -f lavfi -i "sine=frequency=1000:duration=0.1" 1000hz100msec.wav

# 音を低めにして500 Hz を0.1秒ならす
ffmpeg -f lavfi -i "sine=frequency=500:duration=0.1" 500hz100msec.wav

# 500 Hz を0.1秒で音を慣らして、全体が1秒になるように無音をPaddingする
# 参考 https://nico-lab.net/apad_with_ffmpeg/
ffmpeg -f lavfi  -i "sine=frequency=500:duration=0.1"  -af "apad=whole_dur=1" 500hz100msecpadding.wav
```

### ここから本物を作ってみる

- 基本は低めの音 500Hz100msec.wav
- 5秒前に高めの音 1000Hz100msec.wav
- タイムアップで長めの音 1000Hz1000msec.wav


すべて１秒のwaveファイルを作る

```bash
ffmpeg -f lavfi  -i "sine=frequency=500:duration=0.1"  -af "apad=whole_dur=1" 500hz100msec.wav
ffmpeg -f lavfi  -i "sine=frequency=1000:duration=0.1"  -af "apad=whole_dur=1" 1000Hz100msec.wav
ffmpeg -f lavfi  -i "sine=frequency=1000:duration=1"   1000Hz1000msec.wav
```

次にできたファイルを結合する。

```bash
# これをffmpegのファイル結合機能で結合する
# 毎度のことながら、ファイル結合のリストってフルパスでないと駄目なの？
cat myfile.txt
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/1000Hz100msec.wav'
#=> file '/root/work/memo/1000Hz100msec.wav'
#=> file '/root/work/memo/1000Hz100msec.wav'
#=> file '/root/work/memo/1000Hz100msec.wav'
#=> file '/root/work/memo/1000Hz1000msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/500Hz100msec.wav'
#=> file '/root/work/memo/1000Hz100msec.wav'
#=> file '/root/work/memo/1000Hz100msec.wav'
#=> file '/root/work/memo/1000Hz100msec.wav'
#=> file '/root/work/memo/1000Hz100msec.wav'
#=> file '/root/work/memo/1000Hz1000msec.wav'


# これで１秒おきにピッとなる音声ファイルの完成
ffmpeg -f concat -safe 0 -i myfile.txt -c copy hiit.wav
```

アップロードしやすいようにwavをmp4に変換。動画ファイルに変換するには


理想のwaveができたから、あとはwav→mp3に変換していつでも聞けるようにしておきたい。
waveファイル無理やり動画に変換する。映像はないので黒背景の動画に変換。

```bash
ffmpeg -f lavfi -i color=c=black:s=1280x720:r=5 -i hiit.wav -s 1980x1080 -c:a aac -b:a 128k -t 30.0 hiit.mp4
```

完成品をTwitterにアップした
https://twitter.com/yugo_yamamoto/status/1720424805537886320