117 lines
2.9 KiB
Bash
117 lines
2.9 KiB
Bash
|
#!/bin/bash
|
||
|
|
||
|
# UNIX SETUP
|
||
|
# ------------------------------------
|
||
|
# nodejs - http://nodejs.org/
|
||
|
# gzip - http://www.gzip.org/
|
||
|
# fluidsynth - http://sourceforge.net/apps/trac/fluidsynth/
|
||
|
# oggenc - http://www.rarewares.org/ogg-oggenc.php
|
||
|
# lame - http://lame.sourceforge.net/
|
||
|
|
||
|
# PROCESSING
|
||
|
# ------------------------------------
|
||
|
# file types to build
|
||
|
MP3=1
|
||
|
OGG=1
|
||
|
|
||
|
# formats to create
|
||
|
JS=1
|
||
|
JGZ=1
|
||
|
|
||
|
# operating mode
|
||
|
SINGLE=0
|
||
|
PACKAGE=1
|
||
|
|
||
|
# directory to generate into
|
||
|
MIDIDIR="./build"
|
||
|
if [ ! -d "$MIDIDIR" ]; then
|
||
|
mkdir $MIDIDIR
|
||
|
fi
|
||
|
|
||
|
# .SF2 file to map MIDI to (make sure this exists!)
|
||
|
SOUNDFONT="./sf2/FluidSynth_1.43.sf2"
|
||
|
|
||
|
# put into the head of each generated .JS/.JGZ file
|
||
|
JSHEADER="{"
|
||
|
JSFOOTER="}"
|
||
|
|
||
|
# create MIDI files for audible notes
|
||
|
node "./inc/gen-midi.js"
|
||
|
|
||
|
# write the headers
|
||
|
if [ $OGG -eq 1 ]; then
|
||
|
echo $JSHEADER > $MIDIDIR/soundfont-ogg.js
|
||
|
fi
|
||
|
if [ $MP3 -eq 1 ]; then
|
||
|
echo $JSHEADER > $MIDIDIR/soundfont-mp3.js
|
||
|
fi
|
||
|
|
||
|
# from MIDI to WAV to OGG to JS to JGZ, and beyond!
|
||
|
find $MIDIDIR -name '*.midi' -print0 | while read -d $'\0' file
|
||
|
do
|
||
|
# from MIDI to WAV
|
||
|
fluidsynth -C 1 -R 1 -g 0.5 -F "$file.wav" "$SOUNDFONT" "$file"
|
||
|
# from WAV to OGG
|
||
|
if [ $OGG -eq 1 ]; then
|
||
|
OGGFILE=`echo ${file%.midi}.ogg`;
|
||
|
oggenc -m 32 -M 64 "$file.wav"
|
||
|
mv "$file.ogg" "$OGGFILE"
|
||
|
# from OGG to base64 embedded in Javascript
|
||
|
JSCONTENT="\"`basename \"${file%.midi}\"`\": \"data:audio/ogg;base64,`node ./inc/gen-base64.js \"$OGGFILE\"`\","
|
||
|
if [ $SINGLE -eq 1 ]; then
|
||
|
echo $JSHEADER > "$OGGFILE.js"
|
||
|
echo $JSCONTENT >> "$OGGFILE.js"
|
||
|
echo $JSFOOTER >> "$OGGFILE.js"
|
||
|
# gzipped version
|
||
|
if [ $JGZ -eq 1 ]; then
|
||
|
gzip "$OGGFILE.js" -c > "$OGGFILE.jgz"
|
||
|
fi
|
||
|
fi
|
||
|
if [ $PACKAGE -eq 1 ]; then
|
||
|
echo "$JSCONTENT" >> "$MIDIDIR/soundfont-ogg.js"
|
||
|
fi
|
||
|
`rm "$OGGFILE"`
|
||
|
fi
|
||
|
# from WAV to MP3
|
||
|
if [ $MP3 -eq 1 ]; then
|
||
|
MP3FILE=`echo "${file%.midi}.mp3"`
|
||
|
lame -v -b 8 -B 32 "$file.wav" "$MP3FILE"
|
||
|
# from MP3 to base64 embedded in Javascript
|
||
|
JSCONTENT="\"`basename \"${file%.midi}\"`\": \"data:audio/mpeg;base64,`node ./inc/gen-base64.js \"$MP3FILE\"`\","
|
||
|
if [ $SINGLE -eq 1 ]; then
|
||
|
echo $JSHEADER > "$MP3FILE.js"
|
||
|
echo $JSCONTENT >> "$MP3FILE.js"
|
||
|
echo $JSFOOTER >> "$MP3FILE.js"
|
||
|
# gzipped version
|
||
|
if [ $JGZ -eq 1 ]; then
|
||
|
gzip "$MP3FILE.js" -c > "$MP3FILE.jgz"
|
||
|
fi
|
||
|
fi
|
||
|
if [ $PACKAGE -eq 1 ]; then
|
||
|
echo $JSCONTENT >> "$MIDIDIR/soundfont-mp3.js"
|
||
|
fi
|
||
|
# `rm "$MP3FILE"`
|
||
|
fi
|
||
|
# cleanup
|
||
|
rm "$file"
|
||
|
rm "$file.wav"
|
||
|
done
|
||
|
|
||
|
# write the footers
|
||
|
if [ $OGG -eq 1 ]; then
|
||
|
echo $JSFOOTER >> $MIDIDIR/soundfont-ogg.js
|
||
|
fi
|
||
|
if [ $MP3 -eq 1 ]; then
|
||
|
echo $JSFOOTER >> $MIDIDIR/soundfont-mp3.js
|
||
|
fi
|
||
|
|
||
|
if [ $PACKAGE -eq 1 ]; then
|
||
|
if [ $JGZ -eq 1 ]; then
|
||
|
if [ $OGG -eq 1 ]; then
|
||
|
gzip $MIDIDIR/soundfont-ogg.js -c > $MIDIDIR/soundfont-ogg.jgz
|
||
|
fi
|
||
|
if [ $MP3 -eq 1 ]; then
|
||
|
gzip $MIDIDIR/soundfont-mp3.js -c > $MIDIDIR/soundfont-mp3.jgz
|
||
|
fi
|
||
|
fi
|
||
|
fi
|