把写歌时随手录的动机按调性分组,我用一个笨脚本加文件夹干完了
写歌的时候,手机里会攒下一堆 10 秒到 1 分钟的动机录音,大多是随手哼的、吉他扫两下的。攒到 170 多条之后,我发现自己根本找不到想要的那条——文件名是 2024-03-12 21.33.05.m4a 这种,按时间排是唯一的线索,但我要找的是“那条在 D 调上、有点闷的扫弦”。
我的做法很笨:先把所有录音按调性分到文件夹里。判断调性不靠耳朵硬听,而是用 aubio 先跑一遍估算,再靠耳朵复核。
for f in *.m4a; do
key=$(aubio pitch -i "$f" 2>/dev/null | tail -n +2 | awk '{print $2}' | sort | uniq -c | sort -rn | head -1 | awk '{print $2}')
echo "$key\t$f"
done > keys.tsv
aubio pitch 输出的是每帧的基频,我取出现次数最多的那个频率,再手动映射到音名。这个映射我直接写死在脚本里:261.6→C、293.7→D……只覆盖 C 大调的那 7 个音,遇到升号或半音就单独扔进 unknown/。
然后按调性建文件夹:
mkdir -p sorted/{C,D,E,F,G,A,B,unknown}
while IFS=$'\t' read -r key file; do
case "$key" in
C|D|E|F|G|A|B) mv "$file" "sorted/$key/" ;;
*) mv "$file" "sorted/unknown/" ;;
esac
done < keys.tsv
170 多条里,大约 120 条进了对应的调性文件夹,剩下的 50 条在 unknown/——其中大部分是说话声、环境噪音,还有几条是扫弦太糊、基频根本没出来。这批我手动听过一遍,又救回来 20 多条,真正没法用的只有十几条。
为什么这样做:调性是我找动机时最稳定的索引。速度、音色、情绪都会随心情变,但一条动机是大调还是小调、在哪个主音上,我哼的时候基本是固定的。代价是判断不准——aubio 对单音旋律还行,一有和弦或混响就乱跳,所以我只把它当第一遍粗筛,耳朵复核是必须的。
哪里会失效:清唱哼鸣很容易被误判成高八度或低八度,这个脚本不处理八度折叠;节奏松散的扫弦会被拆成好几个音,出现次数最多的那个不一定是主音;另外,同一个调性里如果攒了 30 条,文件夹本身又变成新的迷宫。
我的补救办法是文件名前缀加两个字符:D_闷扫、D_哼,靠 Finder 的搜索框过滤。不优雅,但比翻时间戳强。
现在的问题是:你们攒动机的时候,按什么维度建索引?调性、速度、还是干脆只靠文件名描述?我试过按速度分组,但随手录的东西根本对不上节拍器,最后放弃了。


0 条评论
还没有评论,写下第一条。