--- /dev/null
+#!/bin/sh
+
+bpm=120
+transpose=0
+defaultoctave=1
+defaultlength=4
+baseoctave=1
+gato=-0.1
+
+tuba_note_42="moveleft back crouch fire"
+tuba_note_43="back crouch fire"
+tuba_note_44="moveright back crouch fire"
+tuba_note_47="forward moveright crouch fire"
+tuba_note_48="crouch fire"
+tuba_note_49="moveleft back crouch fire2"
+tuba_note_50="moveright crouch fire"
+tuba_note_51="forward moveleft crouch fire"
+tuba_note_52="forward crouch fire"
+tuba_note_53="moveleft crouch fire"
+tuba_note_54="moveleft back fire"
+tuba_note_55="back fire"
+tuba_note_56="back moveright fire"
+tuba_note_57="moveright crouch fire2"
+tuba_note_58="forward moveleft crouch fire2"
+tuba_note_59="forward moveright fire"
+tuba_note_60="fire"
+tuba_note_61="moveleft back fire2"
+tuba_note_62="moveright fire"
+tuba_note_63="forward moveleft fire"
+tuba_note_64="forward fire"
+tuba_note_65="moveleft fire"
+tuba_note_66="forward moveright fire2"
+tuba_note_67="fire2"
+tuba_note_68="back moveright jump fire"
+tuba_note_69="moveright fire2"
+tuba_note_70="forward moveleft fire2"
+tuba_note_71="forward fire2"
+tuba_note_72="moveleft fire2"
+tuba_note_73="moveleft back jump fire2"
+tuba_note_74="moveright jump fire"
+tuba_note_75="forward moveleft jump fire"
+tuba_note_76="forward jump fire"
+tuba_note_77="moveleft jump fire"
+tuba_note_78="forward moveright jump fire2"
+tuba_note_79="jump fire2"
+tuba_note_81="moveright jump fire2"
+tuba_note_82="forward moveleft jump fire2"
+tuba_note_83="forward jump fire2"
+tuba_note_84="moveleft jump fire2"
+
+tuba() {
+ plusminus=$1
+ eval "tuba_note=\$tuba_note_$pitch"
+ if [ -z "$tuba_note" ]; then
+ echo >&2 "Cannot play note $pitch"
+ fi
+ semi=
+ for n in $tuba_note; do
+ echo -n "${semi}${plusminus}${n}"
+ semi=';'
+ done
+}
+
+time=0
+playnote() {
+ # Move the dot where it belongs.
+ case "$octave" in
+ *.)
+ octave=${octave%.}
+ length=$length.
+ ;;
+ esac
+ # Normalize the note.
+ pitch=''
+ case "$note" in
+ [Cc]_|_[Cc]) pitch=-1 ;;
+ [Cc]) pitch=0 ;;
+ [Cc][#+]|[#+][Cc]|[Dd]_|_[Dd]) pitch=1 ;;
+ [Dd]) pitch=2 ;;
+ [Dd][#+]|[#+][Dd]|[Ee]_|_[Ee]) pitch=3 ;;
+ [Ee]|[Ff]_|_[Ff]) pitch=4 ;;
+ [Ff]|[Ee][#+]|[#+][Ee]) pitch=5 ;;
+ [Ff][#+]|[#+][Ff]|[Gg]_|_[Gg]) pitch=6 ;;
+ [Gg]) pitch=7 ;;
+ [Gg][#+]|[#+][Gg]|[Aa]_|_[Aa]) pitch=8 ;;
+ [Aa]) pitch=9 ;;
+ [Aa][#+]|[#+][Aa]|[Bb]_|_[Bb]) pitch=10 ;;
+ [Bb]) pitch=11 ;;
+ [Bb][#+]|[#+][Bb]) pitch=12 ;;
+ [p-]) pitch='' ;;
+ *) echo >&2 "Unrecognized note: $note" ;;
+ esac
+ echo "// $length$note$octave"
+ # Calculate the duration.
+ case "$length" in
+ .)
+ length=$defaultlength
+ f=1.5
+ ;;
+ '')
+ length=$defaultlength
+ f=1
+ ;;
+ *.)
+ f=1.5
+ ;;
+ *)
+ f=1
+ ;;
+ esac
+ duration=$(echo "240 / $bpm / ${length%.} * $f" | bc -l)
+ if [ -n "$pitch" ]; then
+ # Calculate the MIDI pitch.
+ if [ -z "$octave" ]; then
+ octave=$defaultoctave
+ fi
+ pitch=$((pitch + (octave - baseoctave) * 12 + transpose + 60))
+ case "$gato" in
+ -*)
+ noteoff=$(echo "$time + $duration + $gato" | bc -l)
+ ;;
+ *)
+ noteoff=$(echo "$time + $gato" | bc -l)
+ ;;
+ esac
+ echo "defer $time \"$(tuba +)\""
+ echo "defer $noteoff \"$(tuba -)\""
+ fi
+ time=$(echo "$time + $duration" | bc -l)
+}
+
+notes=$*
+case "$notes" in
+ *:*)
+ notes=${notes#*:}
+ baseoctave=5
+ ;;
+esac
+while [ -n "$notes" ]; do
+ note=${notes%%[:, ]*}
+ notes=${notes#$note}
+ notes=${notes#?}
+ case "$note" in
+ ml)
+ gato=-0.04
+ ;;
+ ms)
+ gato=0.04
+ ;;
+ mn)
+ gato=-0.1
+ ;;
+ b=*)
+ bpm=${note#*=}
+ ;;
+ d=*)
+ defaultlength=${note#*=}
+ ;;
+ t=*)
+ transpose=${note#*=}
+ ;;
+ o=*)
+ defaultoctave=${note#*=}
+ ;;
+ O=*)
+ baseoctave=${note#*=}
+ ;;
+ *)
+ octave=${note##*[cCdDeEfFgGaAbBp-]}
+ octave=${octave##[#+_]}
+ note=${note%$octave}
+ length=${note%[cCdDeEfFgGaAbBp-]*}
+ length=${length%%[#+_]}
+ note=${note#$length}
+ playnote
+ ;;
+ esac
+done