#!/bin/bash VERSION="0.3.5+ost" # History: # 0.3.5+ost: strip mkrandom 0.3.5 down to OST edges. 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 randomChord() { local T=$(( $RANDOM % 6 )) case $T in 0) echo -n "c" ;; 1) echo -n "g" ;; 2) echo -n "a:m" ;; 3) echo -n "f" ;; 4) echo -n "d:m" ;; 5) echo -n "e:m" ;; *) echo "ERROR: Unexpected number $T" 1>&2 ; exit 1 esac } function randomChords() { local num="$1" local c=0 while [ $c -lt $num ] ; do randomChord echo -n " " c=$(( $c + 1 )) done } function bassLine() { while [ $# -gt 0 ] ; do case "$1" in c) echo -n "c4 c g2 " ;; g) echo -n "g4 g d2 " ;; a:m) echo -n "a4 a e2 " ;; f) echo -n "f4 f c2 " ;; d:m) echo -n "d4 d a2 " ;; e:m) echo -n "e4 e b2 " ;; r) echo -n "r1 " ;; *) echo "ERROR: Unknown $1 in bassLine" 1>&2 ; exit 1 ;; esac shift done } function randomNote() { local N=$(( $RANDOM % $# )) local -a ARR=( "$@" ) echo "${ARR[$N]} " } function random8Tune() { while [ $# -gt 0 ] ; do local I for I in 1 2 3 4 5 6 7 8 ; do case "$1" in c) randomNote c\'8 e\'8 g\'8 ;; g) randomNote g\'8 b\'8 d\'8 ;; a:m) randomNote a\'8 c\'8 e\'8 ;; f) randomNote f\'8 a\'8 c\'8 ;; d:m) randomNote d\'8 e\'8 a\'8 ;; e:m) randomNote e\'8 g\'8 b\'8 ;; r1|r) echo -n "r1 " ;; *) echo "ERROR: randomTune does not know $1." 1>&2 exit 1 ;; esac done shift 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 )) BaseChords=`randomChords $barcnt` BASS=`bassLine $BaseChords` TUNE=`random8Tune $BaseChords` 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} % Music Chord 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."