HIITとは
例えばこんな感じ
- 20秒運動して10秒休むという運動方法
- 10秒休むことで継続できる
- 10秒休むことで20秒は全力で運動できる
- 8セットやっても4分で終わる
- だから毎日継続できる
HIITのためのBGMに求められること
- 20秒もそこそこつらい
- あと何秒かがわかると嬉しい
- リズムをキープしたいので1秒ごとに音はなって欲しい
- 映像で見せるタイプのタイマーもあるが、プランクの姿勢もあるので音だけでわかるようにしたい
DTMツールではなくFFmpegで実装したい
なぜFFmpegか
- オープンソースであるためコンパイルさえ通ればずっと使える
- CLIであるため自動化が可能
- 自動化が可能ということはWebサービスにしやすい
- Webサービスにしないまでも、bashスクリプトにすることで、コピペ修正で亜種が作りやすい
- ブラウザ+JavaScriptでメトロノーム的な動きもできなくはないが、テンポがどうしてもずれるので断念
- 音声ファイルを生成することで、音声プレーヤーや動画プレーヤー側の機能で速度を変えたりできる
まずはFFmpegで自力で音を作るお勉強
# このバージョンでやっています
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
すべて1秒のwaveファイルを作る
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
次にできたファイルを結合する。
# これを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'
# これで1秒おきにピッとなる音声ファイルの完成
ffmpeg -f concat -safe 0 -i myfile.txt -c copy hiit.wav
アップロードしやすいようにwavをmp4に変換。動画ファイルに変換するには
理想のwaveができたから、あとはwav→mp3に変換していつでも聞けるようにしておきたい。
waveファイル無理やり動画に変換する。映像はないので黒背景の動画に変換。
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