#!/bin/bash - 
#===========================================================================
#
#          FILE: serial.sh

#         USAGE: ./serial.sh 

#   DESCRIPTION: generates tonerow randomly, compiles on Lilypond
#                and creates static html page.
#       OPTIONS: ---
#  REQUIREMENTS: lilypond, shuf
#          BUGS: ---
#         NOTES: ---
#        AUTHOR: Jonathan Kulp (), 
#  ORGANIZATION: 
#       CREATED: 03/20/2013 07:35:41 AM CDT
#      REVISION:  ---
#===========================================================================

pitches=/tmp/pitches.ily
random=/tmp/random.ily
lilyfile=/tmp/tonerow.ly
midifile=/tmp/tonerow.midi
stem=$(readlink -f $lilyfile | sed -e 's/\..*$//')

withrhythms=/tmp/withrhythms.ily
chordOne=/tmp/chord1.ily
chordTwo=/tmp/chord2.ily
chordThree=/tmp/chord3.ily

getpitches (){
  # first make a list of all 12 chromatic pitches 
  # using lilypond's naming conventions 
  # one per line b/c it's easier to shuffle, add rhythms, etc
  cat $pitches << EOFallpitches
c'
cis'
d'
dis'
e'
f'
fis'
g'
gis'
a'
bes'
b'
EOFallpitches
# now run them through the shuf command to put them in random order 
shuf $pitches $random
# ------------ end of getpitches ---------------

add_rhythms(){
# todo: randomize the rhythms
sed -f $random $withrhythms << EOFrhythms
  1s/$/4/
  3s/$/4../
  4s/$/16/
  5s/$/4/
  6s/$/4./
  7s/$/8/
  8s/$/8./
  12s/$/2./
EOFrhythms
# ------------ end of add_rhythms ---------------

## On web version I'm not running this function
#chords(){
  ## stack up the notes of the row in 3 chords of
  ## 4 notes each
  #cat $random | sed -n '1,4p' \
  #| sed -e :a -e '$!N;s/\n/ /;ta' -e 'P;D' \
  #| sed -e 's/^/</' | sed -e 's/$/>2/' > $chordOne
  #cat $random | sed -n '5,8p' \
  #| sed -e :a -e '$!N;s/\n/ /;ta' -e 'P;D' \
  #| sed -e 's/^/</' | sed -e 's/$/>4/' > $chordTwo
  #cat $random | sed -n '9,12p' \
  #| sed -e :a -e '$!N;s/\n/ /;ta' -e 'P;D' \
  #| sed -e 's/^/</' | sed -e 's/$/>2./' > $chordThree
#} # ------------ end of chords ---------------

make_lily_file (){
  # determine lilypond version for later inclusion
  version=$(lilypond --version | grep LilyPond | cut -d " " -f3)
  # make it cat the random list of pitches
  lilypitches=$(cat $withrhythms $chordOne $chordTwo $chordThree)
  # assemble the lilypond source file, sticking the 
  # pitches in at the right place 
  cat $lilyfile << EOFscore
\\score {
{
\\version "$version"
\\time 3/4
#(set-accidental-style 'dodecaphonic)

\\set Staff.midiInstrument = "violin"
\\partial 4 
$lilypitches
\\bar "|."
}
\\layout { 
  #(set-global-staff-size 24)
} \\midi {\\tempo 4 = 120}
}
EOFscore
# ------------ end of chords ---------------

runlily(){
# compile the lilypond file
lilycmd="lilypond -dno-point-and-click -ddelete-intermediate-files -dpreview" 
$lilycmd $lilyfile &> /dev/null
# ------------ end of runlily ---------------

# make background transparent, reduce png filesize w/optimizer tool
optimize(){
    pngtopnm "$stem".preview.png "$stem".pnm
    pnmtopng -transparent '#FFFFFF' "$stem".pnm "$stem".png
    optipng "$stem".png &> /dev/null
}

## create static html page for my website
html(){
web="$stem".html
image="$stem".png
midi="$stem".midi
cat $web << EOFhtml
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv=Content-Type content="text/html; charset=UTF-8"> 
    <link rel="shortcut icon" type="image/png" href="jk64.png">

<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.5; user-scalable=yes;"/> 
<title>12-Tone Row of the Day</title>

<style type="text/css">

@media screen {
    body { 
        font: 15px arial,helvetica,clean,sans-serif;
        background: #dfdfdf;
    }
    html, body { height: auto;}
    
    #page-container {
        width: 100%;
        max-width: 53em;
        margin: auto;
        background: #dfdfdf; /* Old browsers */
        background: -moz-linear-gradient(left,  #ffffff 0%, #e3debc 100%); /* FF3.6+ */
        background: -webkit-gradient(linear, left top, right top, color-stop(0%,#ffffff), color-stop(100%,#e3debc)); /* Chrome,Safari4+ */
        background: -webkit-linear-gradient(left,  #ffffff 0%,#e3debc 100%); /* Chrome10+,Safari5.1+ */
        background: -o-linear-gradient(left,  #ffffff 0%,#e3debc 100%); /* Opera 11.10+ */
        background: -ms-linear-gradient(left,  #ffffff 0%,#e3debc 100%); /* IE10+ */
        background: linear-gradient(to right,  #ffffff 0%,#e3debc 100%); /* W3C */
        filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#e3debc',GradientType=1 ); /* IE6-9 */
        border: 1px solid;
    }
    
    #content { 
        padding: 2em;
        width: auto;
    }
    
    A:link {text-decoration: none; color: #a00b0b }
    A:visited {text-decoration: none; color: #800909}
    A:active {text-decoration: none}
    A:hover {text-decoration: none; color: red;}
}

@media only screen and (max-device-width: 720px) { 

    #page-container {
        width: 100%;
        margin: auto;
        border: 1px solid;
    }
    #content {
        padding: 1em;
    }
    img { max-width: 100%; }
}

@media print {
    img, nav {display: none;}
    @page { margin: 2cm; }
    body { font: 15px "times new roman",clean,serif;}
}
</style>

</head>

<body>

<div id="page-container">
    <div id="content">
    
    <!-- PUT YOUR STUFF HERE -->
        <center>
        <h2>Random 12-Tone Row of the Day</h2>
        <p>
        <img src="tonerow.png" alt="randomly generated 12-tone
        row" 
        title="randomly-generated 12-tone row">
        </p>
<!--         <a href="tonerow.midi">Midi file</a> -->


        <h3>MIDI Output</h3>
            <div>
                <audio controls>
                  <source src="tonerow.ogg" type="audio/ogg">
                  <source src="tonerow.mp3" type="audio/mpeg">
                Your browser does not support the audio element.
                </audio>
            </div>

        <p>
        Generated with <a href="12toneweb.html" target="_blank">bash fu</a> and <a href="http://lilypond.org"
        target="_blank">Lilypond</a>
        </p>
        </center>
        </div>
    </div>

</body>
</html>

EOFhtml
# ------------ end of html ---------------

conversions (){
    timidity -Ow -o tonerow.midi lame $stem.mp3
    /usr/local/bin/mp32ogg $stem.mp3
}

# RUN ALL FUNCTIONS HERE

cd /tmp
getpitches
#chords
add_rhythms
make_lily_file
runlily
# sleep for half a second to make sure Lilypond has time to compile 
sleep .5
optimize
html
conversions

#clean stuff up
rm /tmp/*.ily /tmp/*.eps