From: Rudolf Polzer Date: Wed, 24 Mar 2021 12:16:46 +0000 (-0400) Subject: FUN: a shell script to convert Nokia ringtones to cfg files for the tuba. X-Git-Tag: xonotic-v0.8.5~68 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=dfc50257f1f968c924fd2561b0f1826924f8915a;p=xonotic%2Fxonotic.git FUN: a shell script to convert Nokia ringtones to cfg files for the tuba. Use with care. Demo video: https://www.youtube.com/watch?v=n7b5UVkpg8g --- diff --git a/misc/tools/nokia2tuba.sh b/misc/tools/nokia2tuba.sh new file mode 100755 index 00000000..ac9172ed --- /dev/null +++ b/misc/tools/nokia2tuba.sh @@ -0,0 +1,178 @@ +#!/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