Skip to content

Instantly share code, notes, and snippets.

@jobbautista9
Last active April 2, 2022 15:26
Show Gist options
  • Save jobbautista9/107f502d20dadd6f851f920e568cf1cf to your computer and use it in GitHub Desktop.
Save jobbautista9/107f502d20dadd6f851f920e568cf1cf to your computer and use it in GitHub Desktop.
Sleeping Terror (bash/SoX arrange)
#!/bin/bash
: '
Copyright (C) 2022 Job Bautista
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'
echo ' __ ___ ___ __ __ ___ ___ __ __ __ __'
echo '/__` | |__ |__ |__) | |\ | / _` | |__ |__) |__) / \ |__)'
echo '.__/ |___ |___ |___ | | | \| \__> | |___ | \ | \ \__/ | \'
echo "Sleeping Terror"
echo "Composed by ZUN for Touhou Gensoukyou: Lotus Land Story"
printf "Arranged by Job Bautista\n\n"
# notes
c=(16 32 65 130 261 523 1046 2093 4186)
cs=(17 34 69 138 277 554 1108 2217 4434)
d=(18 36 73 146 293 587 1174 2349 4698)
ds=(19 38 77 155 311 622 1244 2489 4978)
e=(20 41 82 164 329 659 1318 2637 5274)
f=(21 43 87 174 349 698 1396 2793 5587)
fs=(23 46 92 184 369 739 1479 2959 5919)
g=(24 48 97 195 391 783 1567 3135 6271)
gs=(25 51 103 207 415 830 1661 3322 6644)
a=(27 55 110 220 440 880 1760 3520 7040)
as=(29 58 116 233 466 932 1864 3729 7458)
b=(30 61 123 246 493 987 1975 3951 7902)
declare -r c cs d ds e f g gs a as b
function setTempo {
declare -g BPM=$1
# durations
declare -g fu=$(echo "scale=3; 240 / $BPM" | bc -l) # Whole note
declare -g ha=$(echo "scale=3; 120 / $BPM" | bc -l) # Half note
declare -g qu=$(echo "scale=3; 60 / $BPM" | bc -l) # Quarter note
declare -g ei=$(echo "scale=3; 30 / $BPM" | bc -l) # Eighth note
declare -g si=$(echo "scale=3; 15 / $BPM" | bc -l) # Sixteenth note
declare -g dqu=$(echo "scale=3; 90 / $BPM" | bc -l) # Dotted-quarter note
declare -g dei=$(echo "scale=3; 45 / $BPM" | bc -l) # Dotted-eighth note
declare -g dsi=$(echo "scale=3; 22.5 / $BPM" | bc -l) # Dotted-sixteenth note
declare -g tqu=$(echo "scale=3; 40 / $BPM" | bc -l) # Triplet-quarter note
declare -g tqu=$(echo "scale=3; 20 / $BPM" | bc -l) # Triplet-eighth note
declare -g tqu=$(echo "scale=3; 10 / $BPM" | bc -l) # Triplet-sixteenth note
}
declare -a notes # In the following format - "$duration:${key}[pitch]"
function soxPipesCreator {
soxpipes=$(printf '%b' '"|sox -n -p synth '$(echo "${notes[0]}" |
sed 's/:.*//')' sin '$(echo ${notes[0]} | sed 's/.*://')'"\n')
for note in "${notes[@]:1}"
do
soxpipes+=$(printf '%b' '\n"|sox -n -p synth '$(echo "$note" |
sed 's/:.*//')' sin '$(echo "$note" | sed 's/.*://')'"\n')
done
}
function soxPlayPipes {
echo "$soxpipes" | xargs -n"${#notes[*]}" play -S -V1
}
trap 'pkill -f "play -S -V1"; exit 0' SIGINT SIGTERM
sleep 1
# intro
setTempo 102
notes=(
"$qu:${ds[3]}"
"$qu:${f[3]}"
"$qu:${fs[3]}"
"$ei:${as[3]}"
"$si:${cs[3]}"
"$si:${ds[3]}"
"$ei:${ds[3]}"
"$ei:${ds[3]}"
"$ei:${f[3]}"
"$ei:${f[3]}"
"$ei:${fs[3]}"
"$si:${as[3]}"
"$dei:${cs[3]}"
"$ei:${ds[3]}"
"$qu:${ds[3]}"
"$qu:${f[3]}"
"$qu:${fs[3]}"
"$ei:${as[3]}"
"$si:${cs[3]}"
"$si:${d[3]}"
"$ei:${d[3]}"
"$ei:${ds[3]}"
"$si:${d[3]}"
"$si:${ds[3]}"
"$si:${as[3]}"
"$si:${ds[3]}"
"$si:${gs[3]}"
"$si:${d[3]}"
"$qu:${f[3]}"
"$qu:${fs[3]}"
"$qu:${gs[3]}"
"$ei:${as[3]}"
"$si:${ds[4]}"
"$ei:${as[3]}"
"$ei:${gs[3]}"
"$ei:${fs[3]}"
"$ei:${fs[3]}"
"$ei:${gs[3]}"
"$ei:${gs[3]}"
"$ei:${as[3]}"
"$si:${ds[4]}"
"$dei:${as[3]}"
"$si:${as[3]}"
"$si:${gs[3]}"
"$si:${fs[3]}"
"$si:${f[3]}"
"$qu:${fs[3]}"
"$qu:${gs[3]}"
"$ei:${as[3]}"
"$si:${ds[4]}"
"$dei:${as[3]}"
"$ei:${ds[4]}"
"$ei:${d[4]}"
"$ei:${d[4]}"
"$ei:${ds[4]}"
"$si:${d[4]}"
"$si:${ds[4]}"
"$si:${as[4]}"
"$si:${ds[4]}"
"$si:${gs[4]}"
"$si:${d[4]}"
"$qu:${f[4]}"
)
soxPipesCreator &&
soxPlayPipes 0.5
notes=() # empty notes array for next part
echo "Pipes are loading, please wait..."
# main loop
setTempo 155
notes=(
# fast bridge
"$si:${c[5]}"
"$si:${gs[4]}"
"$si:${fs[4]}"
"$si:${e[4]}"
"$si:${ds[4]}"
"$si:${cs[4]}"
"$si:${c[4]}"
"$si:${gs[4]}"
"$si:${fs[4]}"
"$si:${e[4]}"
"$si:${ds[4]}"
"$si:${cs[4]}"
"$si:${c[4]}"
"$si:${e[3]}"
"$si:${ds[3]}"
)
# verse 1
function verse1-common {
notes+=(
"$qu:${cs[4]}"
"$qu:${ds[4]}"
"$qu:${e[4]}"
"$ei:${gs[4]}"
"$si:${b[3]}"
"$si:${cs[4]}"
)
}
verse1-common
notes+=(
"$ei:${cs[4]}"
"$ei:${cs[4]}"
"$ei:${ds[4]}"
"$ei:${ds[4]}"
"$ei:${e[4]}"
"$si:${gs[4]}"
"$dei:${b[3]}"
"$ei:${cs[4]}"
)
verse1-common
notes+=(
"$ei:${c[4]}"
"$ei:${c[4]}"
"$ei:${cs[4]}"
"$si:${c[4]}"
"$si:${cs[4]}"
"$si:${gs[4]}"
"$si:${cs[4]}"
"$si:${cs[4]}"
"$si:${fs[4]}"
"$si:${c[4]}"
"$qu:${ds[4]}"
"$qu:${e[4]}"
"$qu:${fs[4]}"
"$ei:${gs[4]}"
"$si:${cs[5]}"
"$dei:${gs[4]}"
"$ei:${fs[4]}"
"$ei:${e[4]}"
"$ei:${e[4]}"
"$ei:${fs[4]}"
"$ei:${fs[4]}"
"$ei:${gs[4]}"
"$si:${cs[5]}"
"$si:${gs[4]}"
"$si:${gs[4]}"
"$si:${fs[4]}"
"$si:${e[4]}"
"$si:${ds[4]}"
"$qu:${e[4]}"
"$qu:${fs[4]}"
"$ei:${gs[4]}"
"$si:${cs[5]}"
"$dei:${gs[4]}"
"$ei:${cs[5]}"
"$ei:${c[5]}"
"$ei:${c[5]}"
"$ei:${cs[5]}"
"$si:${c[5]}"
"$si:${cs[5]}"
"$si:${gs[5]}"
"$si:${cs[5]}"
"$si:${fs[5]}"
"$si:${c[5]}"
"$qu:${ds[5]}"
)
# verse 2
notes+=( "$qu:${gs[3]}" )
function verse2-common1 {
notes+=(
"$si:${cs[4]}"
"$si:${ds[4]}"
"$si:${e[4]}"
"$si:${gs[4]}"
"$si:${cs[5]}"
"$si:${ds[5]}"
"$si:${e[5]}"
"$si:${gs[5]}"
"$si:${e[5]}"
"$si:${ds[5]}"
"$si:${cs[5]}"
"$si:${gs[4]}"
)
}
verse2-common1
notes+=(
"$qu:${fs[3]}"
"$si:${b[3]}"
"$si:${cs[4]}"
"$si:${ds[4]}"
"$si:${fs[4]}"
"$si:${b[4]}"
"$si:${cs[5]}"
"$si:${ds[5]}"
"$si:${fs[5]}"
"$si:${ds[5]}"
"$si:${cs[5]}"
"$si:${b[4]}"
"$si:${fs[4]}"
"$qu:${e[3]}"
)
verse2-common1
notes+=(
"$qu:${ds[3]}"
"$si:${c[4]}"
"$si:${cs[4]}"
"$si:${ds[4]}"
"$si:${fs[4]}"
"$si:${c[5]}"
"$si:${cs[5]}"
"$si:${ds[5]}"
"$si:${fs[5]}"
"$si:${ds[5]}"
"$si:${cs[5]}"
"$si:${c[5]}"
"$si:${fs[4]}"
"$qu:${cs[4]}"
)
function verse2-common2 {
notes+=(
"$si:${cs[5]}"
"$si:${gs[4]}"
"$si:${fs[4]}"
"$si:${e[4]}"
"$si:${cs[5]}"
"$si:${gs[4]}"
"$si:${fs[4]}"
"$si:${e[4]}"
"$si:${cs[5]}"
"$si:${gs[4]}"
"$si:${fs[4]}"
"$si:${e[4]}"
)
}
verse2-common2
notes+=(
"$qu:${ds[4]}"
"$si:${ds[5]}"
"$si:${gs[4]}"
"$si:${fs[4]}"
"$si:${e[4]}"
"$si:${ds[5]}"
"$si:${gs[4]}"
"$si:${fs[4]}"
"$si:${e[4]}"
"$si:${ds[5]}"
"$si:${gs[4]}"
"$si:${fs[4]}"
"$si:${e[4]}"
"$qu:${cs[4]}"
)
verse2-common2
notes+=(
"$qu:${c[4]}"
"$si:${c[5]}"
"$si:${gs[4]}"
"$si:${fs[4]}"
"$si:${e[4]}"
"$qu:${cs[4]}"
"$qu:${ds[4]}"
)
# verse 3
function verse3 {
function verse3-common {
notes+=(
"$ei:${e[4]}"
"$ei:${fs[4]}"
"$ei:${gs[4]}"
"$ei:${cs[4]}"
"$si:${ds[4]}"
"$si:${e[4]}"
"$ei:${ds[4]}"
"$ei:${cs[4]}"
"$ei:${b[3]}"
"$qu:${cs[4]}"
)
}
verse3-common
notes+=(
"$ei:${gs[3]}"
"$ei:${cs[4]}"
"$ei:${ds[4]}"
"$ei:${e[4]}"
"$ei:${ds[4]}"
"$ei:${gs[3]}"
)
verse3-common
notes+=(
"$ei:${ds[4]}"
"$ei:${gs[4]}"
"$ei:${fs[4]}"
"$ei:${ds[4]}"
"$ei:${e[4]}"
"$ei:${cs[4]}"
"$ei:${gs[4]}"
"$ei:${cs[5]}"
"$ei:${ds[5]}"
"$ei:${gs[4]}"
"$si:${e[5]}"
"$si:${fs[5]}"
"$ei:${e[5]}"
"$ei:${ds[5]}"
"$ei:${b[4]}"
"$si:${fs[4]}"
"$dei:${gs[4]}"
"$ei:${b[3]}"
"$ei:${cs[4]}"
"$ei:${ds[4]}"
"$ei:${cs[4]}"
"$ei:${ds[4]}"
"$ei:${e[4]}"
"$ei:${e[4]}"
"$ei:${fs[4]}"
"$ei:${gs[4]}"
"$ei:${cs[4]}"
"$si:${ds[4]}"
"$si:${e[4]}"
"$ei:${ds[4]}"
"$ei:${cs[4]}"
"$ei:${c[4]}"
"$ha:${cs[4]}"
"$ha:${ds[4]}"
)
}
verse3; verse3;
# verse 4
function verse4-common {
notes+=(
"$qu:${as[3]}"
"$qu:${c[4]}"
"$qu:${cs[4]}"
"$ei:${f[4]}"
"$si:${gs[3]}"
"$si:${as[3]}"
)
}
verse4-common
notes+=(
"$ei:${as[3]}"
"$ei:${as[3]}"
"$ei:${c[4]}"
"$ei:${c[4]}"
"$ei:${cs[4]}"
"$si:${f[4]}"
"$dei:${gs[3]}"
"$ei:${as[3]}"
)
verse4-common
notes+=(
"$ei:${a[3]}"
"$ei:${a[3]}"
"$ei:${as[3]}"
"$si:${a[3]}"
"$si:${as[3]}"
"$si:${f[4]}"
"$si:${as[3]}"
"$si:${ds[4]}"
"$si:${a[3]}"
"$qu:${c[4]}"
"$qu:${cs[4]}"
"$qu:${ds[4]}"
"$ei:${f[4]}"
"$si:${as[4]}"
"$dei:${f[4]}"
"$ei:${ds[4]}"
"$ei:${cs[4]}"
"$ei:${cs[4]}"
"$ei:${ds[4]}"
"$ei:${ds[4]}"
"$ei:${f[4]}"
"$si:${as[4]}"
"$si:${f[4]}"
"$si:${f[4]}"
"$si:${ds[4]}"
"$si:${cs[4]}"
"$si:${c[4]}"
"$qu:${cs[4]}"
"$qu:${ds[4]}"
"$ei:${f[4]}"
"$si:${as[4]}"
"$dei:${f[4]}"
"$ei:${as[4]}"
"$ei:${a[4]}"
"$ei:${a[4]}"
"$ei:${as[4]}"
"$si:${a[4]}"
"$si:${as[4]}"
"$si:${f[5]}"
"$si:${as[4]}"
"$si:${ds[5]}"
"$si:${a[4]}"
"$qu:${c[5]}"
)
# verse 5
notes+=( "$qu:${f[3]}" )
function verse5-common1 {
notes+=(
"$si:${as[3]}"
"$si:${c[4]}"
"$si:${cs[4]}"
"$si:${f[4]}"
"$si:${as[4]}"
"$si:${c[5]}"
"$si:${cs[5]}"
"$si:${f[5]}"
"$si:${cs[5]}"
"$si:${c[5]}"
"$si:${as[4]}"
"$si:${f[4]}"
)
}
verse5-common1
notes+=(
"$qu:${ds[3]}"
"$si:${gs[3]}"
"$si:${as[3]}"
"$si:${c[4]}"
"$si:${ds[4]}"
"$si:${gs[4]}"
"$si:${as[4]}"
"$si:${c[5]}"
"$si:${ds[5]}"
"$si:${c[5]}"
"$si:${as[4]}"
"$si:${gs[4]}"
"$si:${ds[4]}"
"$qu:${cs[3]}"
)
verse5-common1
notes+=(
"$qu:${c[3]}"
"$si:${a[3]}"
"$si:${as[3]}"
"$si:${c[4]}"
"$si:${ds[4]}"
"$si:${a[4]}"
"$si:${as[4]}"
"$si:${c[5]}"
"$si:${ds[5]}"
"$si:${c[5]}"
"$si:${as[4]}"
"$si:${a[4]}"
"$si:${ds[4]}"
"$qu:${as[3]}"
)
function verse5-common2 {
notes+=(
"$si:${as[4]}"
"$si:${f[4]}"
"$si:${ds[4]}"
"$si:${cs[4]}"
"$si:${as[4]}"
"$si:${f[4]}"
"$si:${ds[4]}"
"$si:${cs[4]}"
"$si:${as[4]}"
"$si:${f[4]}"
"$si:${ds[4]}"
"$si:${cs[4]}"
)
}
verse5-common2
notes+=(
"$qu:${c[4]}"
"$si:${c[5]}"
"$si:${f[4]}"
"$si:${ds[4]}"
"$si:${cs[4]}"
"$si:${c[5]}"
"$si:${f[4]}"
"$si:${ds[4]}"
"$si:${cs[4]}"
"$si:${c[5]}"
"$si:${f[4]}"
"$si:${ds[4]}"
"$si:${cs[4]}"
"$qu:${as[3]}"
)
verse5-common2
notes+=(
"$qu:${a[3]}"
"$si:${a[4]}"
"$si:${f[4]}"
"$si:${ds[4]}"
"$si:${cs[4]}"
"$qu:${as[3]}"
"$qu:${c[4]}"
)
# verse 6
function verse6 {
function verse6-common {
notes+=(
"$ei:${cs[4]}"
"$ei:${ds[4]}"
"$ei:${f[4]}"
"$ei:${as[3]}"
"$si:${c[4]}"
"$si:${cs[4]}"
"$ei:${c[4]}"
"$ei:${as[3]}"
"$ei:${gs[3]}"
"$qu:${as[3]}"
)
}
verse6-common
notes+=(
"$ei:${f[3]}"
"$ei:${as[3]}"
"$ei:${c[4]}"
"$ei:${cs[4]}"
"$ei:${c[4]}"
"$ei:${f[3]}"
)
verse6-common
notes+=(
"$ei:${c[4]}"
"$ei:${f[4]}"
"$ei:${ds[4]}"
"$ei:${c[4]}"
"$ei:${cs[4]}"
"$ei:${as[3]}"
"$ei:${f[4]}"
"$ei:${as[4]}"
"$ei:${c[5]}"
"$ei:${f[4]}"
"$si:${cs[5]}"
"$si:${ds[5]}"
"$ei:${cs[5]}"
"$ei:${c[5]}"
"$ei:${gs[4]}"
"$si:${ds[4]}"
"$dei:${f[4]}"
"$ei:${gs[3]}"
"$ei:${as[3]}"
"$ei:${c[4]}"
"$ei:${as[3]}"
"$ei:${c[4]}"
"$ei:${cs[4]}"
"$ei:${cs[4]}"
"$ei:${ds[4]}"
"$ei:${f[4]}"
"$ei:${as[3]}"
"$si:${c[4]}"
"$si:${cs[4]}"
"$ei:${c[4]}"
"$ei:${as[3]}"
"$ei:${a[3]}"
"$qu:${as[3]}"
"$ei:${cs[4]}"
"$ei:${f[4]}"
"$qu:${c[4]}"
"$ei:${cs[4]}"
"$ei:${f[4]}"
)
}
verse6; verse6;
# verse 7
function verse7 {
function verse7-common {
notes+=(
"$ei:${d[4]}"
"$ei:${e[4]}"
"$ei:${fs[4]}"
"$ei:${b[3]}"
"$si:${cs[4]}"
"$si:${d[4]}"
"$ei:${cs[4]}"
"$ei:${b[3]}"
"$ei:${a[3]}"
"$qu:${b[3]}"
)
}
verse7-common
notes+=(
"$ei:${fs[3]}"
"$ei:${b[3]}"
"$ei:${cs[4]}"
"$ei:${d[4]}"
"$ei:${cs[4]}"
"$ei:${fs[3]}"
)
verse7-common
notes+=(
"$ei:${cs[4]}"
"$ei:${fs[4]}"
"$ei:${e[4]}"
"$ei:${cs[4]}"
"$ei:${d[4]}"
"$ei:${b[3]}"
"$ei:${fs[4]}"
"$ei:${b[4]}"
"$ei:${cs[5]}"
"$ei:${fs[4]}"
"$si:${d[5]}"
"$si:${e[5]}"
"$ei:${d[5]}"
"$ei:${cs[5]}"
"$ei:${a[4]}"
"$si:${e[4]}"
"$dei:${fs[4]}"
"$ei:${a[3]}"
"$ei:${b[3]}"
"$ei:${cs[4]}"
"$ei:${b[3]}"
"$ei:${cs[4]}"
"$ei:${d[4]}"
"$ei:${d[4]}"
"$ei:${e[4]}"
"$ei:${fs[4]}"
"$ei:${b[3]}"
"$si:${cs[4]}"
"$si:${d[4]}"
"$ei:${cs[4]}"
"$ei:${b[3]}"
"$ei:${as[3]}"
"$qu:${b[3]}"
"$ei:${d[4]}"
"$ei:${fs[4]}"
"$qu:${cs[4]}"
"$ei:${d[4]}"
"$ei:${fs[4]}"
)
}
verse7; verse7;
soxPipesCreator &&
while true
do
soxPlayPipes
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment