#!/bin/bash VERSION="0.3.5+lite" # History: # 0.3.5+lite: strip mkost 0.3.5+ost down to essentials. set -e set -u function showVersion() { echo "$0 Version $VERSION" } MINLENGTH=120 MAXLENGTH=600 DEBUG_LEVEL=0 function showHelp() { cat << FEOF $0 [args] > out-file.ly Arguments include: -m|--min SECONDS ($MINLENGTH) : Require songs to be SECONDS long. Will clear MAX setting, if greater. -M|--max SECONDS ($MAXLENGTH) : Prevent songs from being over SECONDS long. Will clear MIN setting, if lesser. --epic : Same as: -m 180 -M 235 Song length 3:00 to 3:55 --song : Same as: -m 120 -M 180 Song length 2:00 to 3:00 --ringtone : Same as: -m 45 -M 75 Song length: 0:45 to 1:15 --alert : Same as: -m 25 -M 35 Song length: 0:25 to 0:35 -h|--help : show this help message --version : show the version number FEOF } while [ $# -gt 0 ] ; do case "$1" in -h|--help) showHelp ; exit 0 ;; --version) showVersion ; exit 0 ;; --feat-bridge) FEAT_BRIDGE=1 ;; --no-feat-bridge) FEAT_BRIDGE=0 ;; --epic) MINLENGTH=180 MAXLENGTH=235 FEAT_BRIDGE=0 ;; --song) MINLENGTH=120 MAXLENGTH=180 FEAT_BRIDGE=1 ;; --ringtone) MINLENGTH=45 MAXLENGTH=75 FEAT_BRIDGE=0 ;; --alert) MINLENGTH=25 MAXLENGTH=35 FEAT_BRIDGE=0 ;; -m|--min) shift MINLENGTH="$1" if [ $MINLENGTH -ne 0 -a $MINLENGTH -gt $MAXLENGTH ] ; then MAXLENGTH=0 fi ;; -M|--max) shift MAXLENGTH="$1" if [ $MAXLENGTH -ne 0 -a $MAXLENGTH -lt $MINLENGTH ] ; then MINLENGTH=0 fi ;; *) echo "ERROR: Unknown argument: $1" 1>&2 ; exit 1 ;; esac shift done function warning() { echo "$@" 1>&2 } warning "Requested: Song length $MINLENGTH to $MAXLENGTH" warning function randomNote() { local N=$(( $RANDOM % $# )) local -a ARR=( "$@" ) echo "${ARR[$N]} " } function bassLine() { local -a ARR1=( a4 b4 c4 d4 e4 f4 g4 ) local -a ARR2=( e2 f2 g2 a2 b2 c2 d2 ) CNT="$1" while [ $CNT -gt 0 ] ; do local N=$(( $RANDOM % 7 )) local A="${ARR1[$N]}" local B="${ARR2[$N]}" echo -n "$A $A $B " CNT=$(( $CNT - 1 )) done } function random8Tune() { CNT="$1" while [ $CNT -gt 0 ] ; do local I for I in 1 2 3 4 5 6 7 8 ; do randomNote a\'8 b\'8 c\'8 d\'8 e\'8 f\'8 g\'8 done CNT=$(( $CNT - 1 )) done } T=$(( $RANDOM % 6 )) TEMPO=$(( 110 + 10 * $T )) unset T MinBars=$(( $MINLENGTH * $TEMPO / 60 / 4 )) MaxBars=$(( $MAXLENGTH * $TEMPO / 60 / 4 )) BarOff=$(( $MaxBars - $MinBars )) barcnt=$(( $RANDOM % $BarOff + $MinBars )) sec=$(( $barcnt * 4 * 60 / $TEMPO )) BASS=`bassLine $barcnt` TUNE=`random8Tune $barcnt` nfo="$(( $sec / 60 )) minutes, $(( $sec % 60 )) seconds, or $barcnt bars at $TEMPO" warning "Generated: ${barcnt} bars" warning " Length: $nfo" cat << FEOF \\version "2.14.2" % ${nfo} % Bar Count: ${barcnt} tuneGlobal = { \\key c \\major \\time 4/4 \\tempo 4 = ${TEMPO} } bassMusic = \\absolute { ${BASS} } tuneMusic = \\absolute { ${TUNE} } \\score { << \\new Staff { \\set Staff.instrumentName = #"Bass" \\new Voice = "bass" { \\tuneGlobal \\bassMusic } } \\new Staff << \\set Staff.midiInstrument = #"flute" \\new Voice = "tune" { \\tuneGlobal \\tuneMusic } >> >> \\midi { } } FEOF warning "Done."