view makeWebAudio.sh @ 1026:e4d31e094d24

Changes to get Beginners booke building. The web pages include prev and next links, so to get those right we have to make the tune filenames distinct from the main booke names. So fall back to taking the easy way, and just prefix all tune names with @ or _.
author Jim Hague <jim.hague@acm.org>
date Tue, 18 Feb 2020 15:13:38 +0000
parents d6e2a281cceb
children 1139aa0eb0c2
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
    pos=`expr index $tempo '='`
    numtempo=${tempo:pos}
    notelenprefix=${tempo:0:pos}
    # Calculate new tempo.
    newtempo=$(( ( $numtempo * $4 ) / $5 ))
    # Insert new tempo and delete old. Old may not exist,
    # so do this rather than overwrite.
    sed -e "/^Q:/d" -e "/^K:/aQ: ${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