#!/bin/bash

# Title: abcplaylist.sh
# Author: Martin Meyerspeer
# Date: 2007-02-20
# Download: http://dasquadr.at/geekstuff/data/abcplaylist.sh
#
# Creates a playlist containing all */*.abc files.
# Put ABC-files in directories, to create playlist.
# * Title is set to content of ./title.txt and ./subtitle.txt if present.
# * Directories must contain a file chapter.txt which will be printed.
# * ABC files may include:  %location:Bookname \n Number, page 
#
# Suggested use:
# abcplaylist.sh > pl.abc; abcm2ps pl.abc -O pl.ps; psnup -2 pl.ps > pl2.ps ; ps2pdf pl2.ps

# Things to adjust
NOTESLEFTMARGIN=1.5cm          # bigger numner:  more right
## 3 bars (also adjust lines 160+165):
NOTESRIGHTMARGIN=11.5cm      # bigger number:  more left
TITLELEFTMARGIN=10.0cm       # bigger number:  more right
SCALE=0.57
## 2 bars  (also adjust lines 160+165):
#NOTESRIGHTMARGIN=13.5cm      # bigger number:  more left
#TITLELEFTMARGIN=8.0cm       # bigger number:  more right
#SCALE=0.6

TITLERIGHTMARGIN=0cm         # bigger number:  more left
CALCULATE_UPBEAT="true"      # if "true" calculate if upbeat (Auftakt) exists
TITLESIZE=42
SUBTITLESIZE=21.8
CHAPTERSIZE=34

if [ -e ./title.txt ] ; then
  TITLE=$(cat ./title.txt)
else
  TITLE="Stückel-Liste"
fi

if [ -e ./subtitle.txt ] ; then
  SUBTITLE=$(cat ./subtitle.txt)
else
  SUBTITLE=""
fi

# no changes should be necessary below this point
TIMESTART=$(date +%s)

# Prepare printing of chapter names
CHAPTERPRE="%%textfont Helvetica 30\n%%text\n\
%%textfont Helvetica-Bold ${CHAPTERSIZE}\n%%text"
CHAPTERPOST="%%textfont Helvetica 24\n%%center"

# column width specifications
COL1="\n%%multicol start\n%%rightmargin ${TITLERIGHTMARGIN}\n%%leftmargin ${TITLELEFTMARGIN}"
COL2="%%multicol new\n%%leftmargin ${NOTESLEFTMARGIN}\n%%rightmargin ${NOTESRIGHTMARGIN}"
COLEND="%%multicol end\n"


# function for determining tune has upbeat (Auftakt)
is_upbeat()
{
  # also remove spaces and breaks at start of bar 1, for counting
  BAR1=$(echo "${NOTES}" | awk -F'|' '{print ($1)}')
  BAR2=$(echo "${NOTES}" | awk -F'|' '{print ($2)}')
##echo "erster1: $BAR1,  zweiter1: $BAR2" >&2
     # below happens: # remove {grace notes} and "chords"
		      # only allow a-g,z,1-9,/
		      # AB/C/DE2 -> AB/2C/2DE2
		      # AB/2C/2DE2 -> A+1/2+1/2D+2 -> +1+1/2+1/2+1+2 -> 1+1+..
  BAR1=$(echo $BAR1 | sed "s/ //g;\
                           s/{[^}]*}//g;\
			   s/\"[^\"]*\"//g;\
			   s/[^a-g,z,A-G,/,1-9]//g;\
			   s/,//g;\
			   s/\/\([^2-9,]\)/\/2\1/g;\
			   s/\/$/\/2/g;\
			   s/[a-g,z,A-G]\([2-9]\)/+\1/g;\
			   s/[a-g,z,A-G]/+1/g;\
			   s/^+//")
  BAR2=$(echo $BAR2 | sed "s/ //g;\
                           s/{[^}]*}//g;\
			   s/\"[^\"]*\"//g;\
			   s/[^a-g,z,A-G,/,1-9]//g;\
			   s/,//g;\
			   s/\/\([^2-9,]\)/\/2\1/g;\
			   s/\/$/\/2/g;\
			   s/[a-g,z,A-G]\([2-9]\)/+\1/g;\
			   s/[a-g,z,A-G]/+1/g;\
			   s/^+//")
  ## less time efficient code:
  #  BAR1=$(echo $BAR1 | sed 's/ //g' | sed 's/{[^}]*}//g' | sed 's/"[^"]*"//g' |\
  #    sed 's/[^a-g,z,A-G,/,1-9]//g' | sed 's/,//g' |\
  #    sed 's/\/\([^2-9,]\)/\/2\1/g' | sed  's/\/$/\/2/g' |\
  #    sed 's/[a-g,z,A-G]\([2-9]\)/+\1/g' | sed 's/[a-g,z,A-G]/+1/g' |\
  #    sed 's/^+//')
##echo "erster2: $BAR1,  zweiter2: $BAR2" >&2
##N1=$(echo "scale=5; ${BAR1}" | bc) >&2
##N2=$(echo "scale=5; ${BAR2}" | bc) >&2
##echo -n "erster2: $N1,  zweiter2: $N2  --->  " >&2
  echo "scale=5; ${BAR1} < ${BAR2}" | bc
}

# formatting-stuff
echo "%%scale ${SCALE}"

echo "%%titlefont      Times-Roman 32"
echo "%%subtitlefont   Times-Roman 20"
echo "%%voicefont      Times-Roman 16"
echo "%%footerfont     Times-Roman 12"

#  spaces
echo "%%topspace       -0.5cm"
echo "%%titlespace     0.0cm"
echo "%%subtitlespace  0.0cm"
echo "%%composerspace  0.0cm"
echo "%%musicspace     -1.5cm"
echo "%%partsspace     0.0cm"
echo "%%wordsspace     0.0cm"
echo "%%textspace      0.0cm"
echo "%%vocalspace     0pt"
   
#%  for typesetting text
#%   lineskipfac 1.1
#%   parskipfac 0.3

echo "%%writehistory false"
echo "%%titleformat  T-1 T-1 T-1"
echo "%%footer \t generated automagically with abcplaylist.sh \n \$D \t download:  http://dasquadr.at/geekstuff/ \t page \$P"


# Title
echo -e "%%textfont Helvetica-Bold ${TITLESIZE}\n%%center ${TITLE}"
echo -e "%%textfont Helvetica ${SUBTITLESIZE}\n%%center ${SUBTITLE}"

for CHAPTER in */chapter.txt ; do 
  DIR=$(dirname $CHAPTER)
  CHAP=$(cat ${CHAPTER})

##  sodass alle dirs mit .abcs genommen werden...
#
#for DIR in $(find . -type d) ; do
#if [ -f ${DIR}/*.abc ] ; then   #  das *.abc geht so nicht; macht zu viele args
#if [ -f ${DIR}/chapter.txt ] ; then
#  CHAP=$(cat ${DIR}/chapter.txt)
#else
#  CHAP=${DIR}
#fi

  echo "  ${DIR}" >&2
  echo -e "${CHAPTERPRE} ${CHAP}"
  echo -e "${CHAPTERPOST}"
  for FILE in ${DIR}/*.abc ; do
## header
      grep -h "^[A-Z]:" $FILE |\
      grep -v "^Q:\|^V:\|^M:\|^W:\|^K:" |\
      sed "s/X:\(.*\)/X:\1${COL1}/"    # start column 1 (title on the left)
#      grep -v "^Q:\|^V:\|^M:\|^W:" |\
#      sed "s/K:/K:clef=none /;\
#           s/X:\(.*\)/X:\1${COL1}/"    # start column 1 (title on the left)
      grep "^K:" $FILE | sed "s/K:/K:clef=none /" |\
                         head -n 1  #assume 1st Key is correct, ignore others
      LOCATION=$(grep '%location:' ${FILE} | \
                 sed "s/[ ]*%location:[ ]*//;\
	              s/\"//g;\
		      s/\'//g")
#                sed 's/[ ]*%location:[ ]*//' | \
#	         sed 's/"//g' | sed "s/\'//g")
      echo "V:1 name=\"${LOCATION}\""  # expects in ABC:  %location: Book \n No., p.
    echo M:none                        # remove meter
## notes
    echo -e ${COL2}
    NOTES=$(grep -v '^[A-Z]:' $FILE   |\
      sed "s/%.*//g;\
      s/://g;\
      s/\\\//g" |\
      tr '
' ' ' |\
      sed "s/^ *|//g;\
           s/^[ ,x,y]*[0-9,/, ]*//g")    # remove leading bar lines and spaces
   if [ "${CALCULATE_UPBEAT}" == "true" ] ; then 
##    echo  "DEBUG: $FILE" >&2
   if [ `is_upbeat` -eq 0 ] ; then
       # upbeat (Auftakt):  print 4 bars
       echo "${NOTES}" | awk -F'|' '{print ($1) "|" ($2) "|" ($3) "x"}'
       # upbeat (Auftakt):  print 3 bars
#       echo "${NOTES}" | awk -F'|' '{print ($1) "|" ($2) "x"}'
     else
       # no upbeat (kein Auftakt):  print 3 bars
       echo "${NOTES}" | awk -F'|' '{print ($1) "|" ($2) "|" ($3) "|" ($4) "x"}'
       # no upbeat (kein Auftakt):  print 2 bars
#       echo "${NOTES}" | awk -F'|' '{print ($1) "|" ($2) "|" ($3) "x"}'
     fi
     echo
   else
     echo "${NOTES}" | awk -F'|' '{print ($1) "|" ($2) "|" ($3) "x"}'
   fi
     echo -e "${COLEND}"
  done
#fi
done 


