view makeWebAudio.sh @ 1029:1139aa0eb0c2

Revist tempo change code when generating web audio. Now Mac friendly.
author Jim Hague <jim.hague@acm.org>
date Wed, 19 Feb 2020 10:33:55 +0000
parents e4d31e094d24
children 70e1ff83fe34
line wrap: on
line source

#!/bin/bash
#
# Make audio required for the website but not for the book.
# They go into web/<book>.
#

if [ $# != 1 ]; then
    echo "Usage: makeWebAudio.sh <book dir name>"
    exit 1
fi

dir=`pwd`

booke=$dir/$1
basewebdir=$dir/web
basetunedir=$basewebdir/tunes

# Make MP3 and OGG files for the input .abc. Since we're listening to
# a doorbell playing the tunes, go for lowest quality (and hence smallest)
# MP3 and OGG. $1 is the input filename, $2 is the output directory,
# $3 is optional args for timidity.
makeaudiofiles()
{
    name=`basename $1 .abc`
    tunedir="$2"

    abc2midi $1 -o $tunedir/${name}.tmp.mid
    mv $tunedir/${name}.tmp.mid $tunedir/${name}.mid
    timidity -OwM $3 -o $tunedir/${name}.wav $tunedir/${name}.mid
    lame -m m -V 9 --quiet $tunedir/${name}.wav $tunedir/${name}.tmp.mp3
    mv $tunedir/${name}.tmp.mp3 $tunedir/${name}.mp3
    # Timidity can generate OGG directly. But we need to generate WAV
    # for lame, and oggenc produces smaller output. OGG is needed for
    # Firefox's audio tag. FF doesn't support MP3, some others support
    # MP3 but not OGG.
    oggenc -Q -q 0 -o $tunedir/${name}.tmp.ogg $tunedir/${name}.wav
    mv $tunedir/${name}.tmp.ogg $tunedir/${name}.ogg

    rm $tunedir/${name}.wav
}

# Make audio for a new tempo for the abc file $1, giving the output
# files the same name with a prefix $3 in output directory $2. The new
# tempo is the original tempo (120 used if not specified), multiplied
# by $4 and divided by $5.  These audio files are for Learner use;
# I've found that having the chords thumping away can make it hard to
# distinguish the melody, so arrange for timidity to mute everything
# except the melody track.
makeaudiofortempo()
{
    name=`basename $1 .abc`
    tunedir="$2"
    newspeedfilename="$3-${name}.abc"
    mkdir -p $tunedir

    # Prepare new speed audio files.
    # The tempo is either a plain number, or <notelen>=<number>.
    tempo=`$dir/abcfield.py --field Q $1`
    if [ -z $tempo ]; then
        echo "Warning: $1 has no tempo. Using 120."
        tempo="120"
    fi
    numtempo=${tempo##*=}
    notelenprefix=${tempo%%=*}
    if [ "$notelenprefix" = "$numtempo" ]; then
        notelenprefix=
    else
        notelenprefix="${notelenprefix}="
    fi
    # Calculate new tempo.
    newtempo=$(( ( $numtempo * $4 ) / $5 ))
    echo "Old tempo $tempo new tempo ${notelenprefix}${newtempo}"
    # Insert new tempo and delete old. Old may not exist,
    # so do this rather than overwrite.
    sed -e "/^Q:/d" -e "/^K:/a\\
Q: ${notelenprefix}${newtempo}" $1 > $tunedir/$newspeedfilename
    makeaudiofiles $tunedir/$newspeedfilename $tunedir --mute=0,-1
    rm $tunedir/$newspeedfilename
}

# Generate audio files and slow speed (currently half speed) audio files.
find $booke -maxdepth 1 -name "*.abc" | sort |
    while read filename
    do
        name=`basename $filename .abc`
        tunedir=$basetunedir/$name

        # Already generated?
        if [ -f $tunedir/${name}.mp3 ]; then
            continue
        fi

        mkdir -p $tunedir

        makeaudiofiles $filename $tunedir

        # Now make 1/4, 1/2 and 3/4 speed audio.
        makeaudiofortempo $filename $tunedir "veryslow" 1 4
        makeaudiofortempo $filename $tunedir "slow" 2 4
        makeaudiofortempo $filename $tunedir "littleslow" 3 4
        makeaudiofortempo $filename $tunedir "normal" 4 4
    done