From 066ea49ab80f843f93a913b621f5ee87454040b2 Mon Sep 17 00:00:00 2001 From: Luke Tidd Date: Sun, 23 Apr 2023 10:56:05 -0400 Subject: [PATCH] init - has the wrong tracks but a good start --- split_tracks | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100755 split_tracks diff --git a/split_tracks b/split_tracks new file mode 100755 index 0000000..6136204 --- /dev/null +++ b/split_tracks @@ -0,0 +1,136 @@ +# split_tracks splits each track of the library. +# +# The library is mirrored for each type of split. +# karaoke: reduces the volume of the vocals by 80% and remixes it +# drum only: just the drums +# no drum: everything but the drums + +#!/bin/bash + +function make_drum() { + mkdir -p "${dest_dir['no drums']}" + quiet_drums="${actual_work_dir}/quiet drums.wav" + wav_name="$(sed 's/\.flac$/.wav/' <<< "$file_name")" + mixed_wav="${dest_dir['no drums']}/${wav_name}" + final_opus="$(sed 's/\.wav$/.opus/' <<< "$mixed_wav")" + + echo sox -v "$volume_reduction_factor" "$drum_track" "$quiet_drums" + sox -v "$volume_reduction_factor" "$drum_track" "$quiet_drums" + echo sox -m "${no_drums[@]}" "$quiet_drums" "$mixed_wav" + sox -m "${no_drums[@]}" "$quiet_drums" "$mixed_wav" + rm -r "$quiet_drums" + echo opusenc --comp 10 --downmix-stereo \ + --title "'${tags[TITLE]}'" --artist "'${tags[ARTIST]}'" \ + --album "'${tags[ALBUM]}'" --tracknumber "'${tags[TRACKNUMBER]}'" \ + --date "'${tags[DATE]}'" "'$mixed_wav'" "'$final_opus'" + opusenc --comp 10 --downmix-stereo \ + --title "${tags[TITLE]}" --artist "${tags[ARTIST]}" \ + --album "${tags[ALBUM]}" --tracknumber "${tags[TRACKNUMBER]}" \ + --date "${tags[DATE]}" "$mixed_wav" "$final_opus" + rm "$mixed_wav" +} + +function make_karaoke() { + mkdir -p "${dest_dir[karaoke]}" + quiet_vocals="${actual_work_dir}/quiet vocals.wav" + wav_name="$(sed 's/\.flac$/.wav/' <<< "$file_name")" + mixed_wav="${dest_dir['karaoke']}/${wav_name}" + final_opus="$(sed 's/\.wav$/.opus/' <<< "$mixed_wav")" + echo sox -v "$volume_reduction_factor" "$vocal_track" "$quiet_vocals" + sox -v "$volume_reduction_factor" "$vocal_track" "$quiet_vocals" + sox -m "${karaoke}" "$quiet_vocals" "$mixed_wav" + rm -r "$quiet_vocals" + echo opusenc --comp 10 --downmix-stereo \ + --title "'${tags[TITLE]}'" --artist "'${tags[ARTIST]}'" \ + --album "'${tags[ALBUM]}'" --tracknumber "'${tags[TRACKNUMBER]}'" \ + --date "'${tags[DATE]}'" "'$mixed_wav'" "'$final_opus'" + opusenc --comp 10 --downmix-stereo \ + --title "${tags[TITLE]}" --artist "${tags[ARTIST]}" \ + --album "${tags[ALBUM]}" --tracknumber "${tags[TRACKNUMBER]}" \ + --date "${tags[DATE]}" "$mixed_wav" "$final_opus" + rm "$mixed_wav" +} + +volume_reduction_factor='0.3' +src_library="${HOME}/flac" +work_dir="${HOME}/split" +actual_work_dir="${work_dir}/htdemucs_ft" + +type -P 'demucs' || ( + printf 'No demucs in path.\nInstall with `pip install demucs` or something.\n\n' >&2 + exit 1 +) + +find "$src_library" -type f -name '*.flac' | while read -r file; do + echo $file + # file is full original path + filename + src_dir="$(dirname "$file")" + file_name="$(basename "$file")" + unset tags + unset dest_dir + + declare -A tags + while read -r line; do + tag_type="$(cut -d= -f1 <<< "$line")" + tag_val="$(cut -d= -f2- <<< "$line")" + tags[$tag_type]="$tag_val" + done < <(metaflac --list --block-type=VORBIS_COMMENT "$file" | grep 'comment\[' | cut -d: -f2- | sed 's/^ //') + + declare -a ensure + ensure=( TRACKNUMBER TITLE DATE ALBUM ARTIST ) + for tag_type in "${ensure[@]}"; do + if [[ -z "${tags[$tag_type]}" ]]; then + $tags[$tag_type]="missing $tag_type" + fi + done + + declare -A dest_dir + dest_dir['karaoke']="${src_dir//flac/karaoke}" + dest_dir['drums only']="${src_dir//flac/drums only}" + dest_dir['no drums']="${src_dir//flac/no drums}" + + # demucs -n htdemucs_ft -o "$work_dir" --filename '{track} {stem}.{ext}' -j2 -d cpu --clip-mode rescale -- "$file" + unset files karaoke nodrums + declare -a files karaoke nodrums + readarray -t files < <(find "$work_dir" -type f -name '*.wav') + unset vocal_track + unset drum_track + + for file in "${files[@]}"; do + echo file: "$file" + if ! grep -Eq 'drums\.wav$' <<< "$file"; then + echo no drums.wav + nodrums+=("$file") + else + echo yes drums.wav + drum_track="$file" + fi + + if ! grep -Eq 'vocals\.wav$' <<< "$file"; then + echo no vocal + karaoke+=("$file") + else + vocal_track="$file" + fi + done + + for i in "${nodrums[@]}"; do + printf 'Drum practice: %s\n' "$i" + done + if [[ -z "$drum_track" ]]; then + printf 'No drum track. Will not create a drum practice file.\n' + else + make_drum + fi + for i in "${karaoke[@]}"; do + printf 'Karaoke practice: %s\n' "$i" + done + if [[ ! "$vocal_track" ]]; then + printf 'No vocal track. Will not create a karaoke file.\n' + else + make_karaoke + fi + + exit 0 +done +