#!/bin/bash # # Input files, supplied by user: COVER="cover.jpg" OPENING_SOUND="Titel" NULLSOUND="silence" SHEETSIZE="7016x4960" BUTTON_H_POSITION=4015 BUTTON_V_POSITION=600 BUTTON_H_OFFSET=0 BUTTON_V_OFFSET=170 OID_H_POSITION=4015 OID_V_POSITION=600 OID_H_OFFSET=0 OID_V_OFFSET=170 TEXT_H_POSITION=4250 TEXT_V_POSITION=700 TEXT_H_OFFSET=0 TEXT_V_OFFSET=170 PRODUCT_ID_H_POS=5100 PRODUCT_ID_V_POS=4800 COPYRIGHT_H_POSITION=6000 COPYRIGHT_V_POSITION=4800 COVER_MAX_WIDTH=3300 COVER_MAX_HEIGHT=3300 COVER_SIZE="${COVER_MAX_WIDTH}x${COVER_MAX_HEIGHT}" TRACKBUTTON_WIDTH=189 TRACKBUTTON_HEIGHT=142 TRACKBUTTONSIZE="${TRACKBUTTON_WIDTH}x${TRACKBUTTON_HEIGHT}" CONTROLBUTTON_WIDTH=600 CONTROLBUTTON_HEIGHT=600 CONTROLBUTTONSIZE="${CONTROLBUTTON_WIDTH}x${CONTROLBUTTON_HEIGHT}" BUTTON_STROKEWIDTH=12 BUTTON_FONT_SIZE=120 TEXT_FONT_SIZE=$BUTTON_FONT_SIZE PRODUCT_ID="" STARTSCRIPTCODE=7000 COMMENT="" TRACKS=0 COUNTER=0 DEBUG_MAX_LEVEL=3 DEBUG_LEVEL=0 WORKFOLDER="" MESSAGE_METHOD="" TRACKLIST="tracklist.txt" # special folders to use: #TEMPLATES="templates" OIDS="oids" OGGS="ogg" WAVES="WAV" # Output file for printing OUTPUT="" # tttool config file to generate: YAML_FILE="" # Functions needed to do all jobs ;-) check_tools () { command -v $1 >/dev/null 2>&1 || { echo "The required tool $1 is not installed. Aborting." >&2; exit 1; } } debug () # Print debug output if needed { MESSAGE=$1 DEBUG_MESSAGE_LEVEL=$2 LINEFEED=$3 if [ $DEBUG_LEVEL -le -1 ] || [ $DEBUG_LEVEL -gt $DEBUG_MAX_LEVEL ] ; then echo "Error - wrong debug level selected - EXIT!" exit 1 else if [ $((DEBUG_MESSAGE_LEVEL)) -le $((DEBUG_LEVEL)) ]; then echo $LINEFEED "$MESSAGE" fi fi } desktop_message () { MESSAGE=$1 if [ ! -z `command -v notify-send` ]; then notify-send "$MESSAGE" else if [ ! -z `command -v zenity` ]; then zenity --notification --text "$MESSAGE" else echo "$MESSAGE" fi fi } cleanup () # Clean up all temporarily generated files { debug "Cleaning up $1 ... " 1 -n case $1 in output) if [ -f $WORKFOLDER/$OUTPUT ]; then debug " - \"$WORKFOLDER/$OUTPUT\" - " 2 -n rm $WORKFOLDER/$OUTPUT rm $WORKFOLDER/$YAML_FILE rm $WORKFOLDER/*.gme else debug " - no \"$WORKFOLDER/$OUTPUT\" file found - " 2 -n fi ;; tracklist) if [ -e $WORKFOLDER/$TRACKLIST ]; then debug " - \"$WORKFOLDER/$TRACKLIST\" - " 2 -n rm $WORKFOLDER/$TRACKLIST else debug " - no \"$WORKFOLDER/$TRACKLIST\" file found - " 2 -n fi ;; cover) if [ -e $WORKFOLDER/cover_resized.jpg ]; then debug " - \"$WORKFOLDER/cover_resized.jpg\" - " 2 -n rm $WORKFOLDER/cover_resized.jpg else debug " - no \"$WORKFOLDER/cover_resized.jpg\" file found - " 2 -n fi ;; ogg) if [ -d $WORKFOLDER/$OGGS ]; then debug " - \"$WORKFOLDER/$OGGS\" folder - " 2 -n rm $WORKFOLDER/$OGGS/*.ogg rmdir $WORKFOLDER/$OGGS else debug " - no \"$WORKFOLDER/$OGGS\" folder found - " 2 -n fi ;; oids) if [ -d $WORKFOLDER/$OIDS ]; then debug " - \"$WORKFOLDER/$OIDS\" folder - " 2 -n rm $WORKFOLDER/$OIDS/*.png rmdir $WORKFOLDER/$OIDS else debug " - no \"$WORKFOLDER/$OIDS\" folder found - " 2 -n fi ;; *) ;; esac debug " done" 1 } mk_ogg_files() { if [ $DEBUG_LEVEL -le 1 ]; then debug "Makeing *.ogg files ..." 1 -n else debug "Makeing *.ogg files ..." 1 fi if [ ! -d "$WORKFOLDER/$OGGS" ]; then mkdir -p $WORKFOLDER/$OGGS fi if [ -d "$WORKFOLDER/$WAVES" ]; then for wavefile in $WORKFOLDER/$WAVES/*.wav do COUNTER=$((COUNTER+1)) debug "File to prepare: $wavefile ... " 2 -n basename "$wavefile" | cut -f2 -d'/' | cut -f1 -d'.' | sed -e 's/_/ /g' >> $WORKFOLDER/$TRACKLIST oggenc -Q -b 128 "${wavefile}" -o $WORKFOLDER/$WAVES/$(printf "Track_%02d.ogg" $COUNTER) mv "$WORKFOLDER/$WAVES/$(printf "Track_%02d.ogg" $COUNTER)" $WORKFOLDER/$OGGS/ debug " done" 2 done else echo "Source folder \"$WORKFOLDER/$WAVES\" for wave files not found -> EXIT!" exit 1 fi # save number of tracks TRACKS=$COUNTER if [ ! -f $WORKFOLDER/${NULLSOUND}.ogg ]; then debug "File \"$WORKFOLDER/${NULLSOUND}.ogg\" not found - generating it" 2 rec $WORKFOLDER/${NULLSOUND}.wav trim 0 0.1 2> /dev/null oggenc -Q -b 128 $WORKFOLDER/${NULLSOUND}.wav > /dev/null rm $WORKFOLDER/${NULLSOUND}.wav fi if [ -f $WORKFOLDER/$OGGS/${NULLSOUND}.ogg ]; then rm $WORKFOLDER/$OGGS/${NULLSOUND}.ogg fi cp $WORKFOLDER/${NULLSOUND}.ogg $WORKFOLDER/$OGGS/${NULLSOUND}.ogg if [ ! -f $WORKFOLDER/${OPENING_SOUND}.wav ] && [ ! -f $WORKFOLDER/${OPENING_SOUND}.ogg ] ; then echo "Error: Opening sound \"${OPENING_SOUND}.wav\" or \"${OPENING_SOUND}.ogg\" in \"$WORKFOLDER\" not found -> EXIT!" exit 1 else if [ -f $WORKFOLDER/${OPENING_SOUND}.wav ] && [ ! -f $WORKFOLDER/${OPENING_SOUND}.ogg ]; then debug "Encoding \"${OPENING_SOUND}.wav\" ... " 2 -n oggenc -Q -b 128 $WORKFOLDER/${OPENING_SOUND}.wav > /dev/null debug " done" 2 fi fi cp $WORKFOLDER/${OPENING_SOUND}.ogg $WORKFOLDER/$OGGS debug " done" 1 } mk_yaml_file() { if [ $DEBUG_LEVEL -le 1 ]; then debug "Generating \"$WORKFOLDER/$YAML_FILE\" ... " 1 -n else debug "Generating \"$WORKFOLDER/$YAML_FILE\" ... " 1 fi if [ -f $WORKFOLDER/$YAML_FILE ]; then rm $WORKFOLDER/$YAML_FILE fi echo "product-id: $PRODUCT_ID" >> $WORKFOLDER/$YAML_FILE echo "media-path: ${OGGS}/%s" >> $WORKFOLDER/$YAML_FILE echo comment: $COMMENT >> $WORKFOLDER/$YAML_FILE echo "init: \$track := 0" >> $WORKFOLDER/$YAML_FILE echo "welcome: `eval basename $WORKFOLDER/$OPENING_SOUND | cut -f1 -d'.'`" >> $WORKFOLDER/$YAML_FILE echo "scripts:" >> $WORKFOLDER/$YAML_FILE echo " play:" >> $WORKFOLDER/$YAML_FILE COUNTER=0 echo " - \$track == $COUNTER? \$track := $((COUNTER+1)) J(play)" >> $WORKFOLDER/$YAML_FILE COUNTER=$((COUNTER+1)) while [ $COUNTER -le $TRACKS ]; do echo " - \$track == $COUNTER? P($(printf "Track_%02d" $COUNTER)) \$track := $((COUNTER+1)) J(play)" >> $WORKFOLDER/$YAML_FILE COUNTER=$((COUNTER+1)) done echo " - \$track == $COUNTER? P(`eval basename $WORKFOLDER/$NULLSOUND | cut -f1 -d'.'`) \$track := 0 J(play)" >> $WORKFOLDER/$YAML_FILE echo " previous:" >> $WORKFOLDER/$YAML_FILE echo " - \$track > 2? P(`eval basename $WORKFOLDER/$NULLSOUND | cut -f1 -d'.'`) \$track -= 2 J(play)" >> $WORKFOLDER/$YAML_FILE echo " next:" >> $WORKFOLDER/$YAML_FILE echo " - P(`eval basename $WORKFOLDER/$NULLSOUND | cut -f1 -d'.'`) J(play)" >> $WORKFOLDER/$YAML_FILE echo " stop:" >> $WORKFOLDER/$YAML_FILE echo " - P(`eval basename $WORKFOLDER/$NULLSOUND | cut -f1 -d'.'`) \$track := 0" >> $WORKFOLDER/$YAML_FILE COUNTER=1 while [ $COUNTER -le $TRACKS ]; do echo " $(printf "track_%02d" $COUNTER):" >> $WORKFOLDER/$YAML_FILE echo " - P(`eval basename $WORKFOLDER/$NULLSOUND | cut -f1 -d'.'`) \$track := $COUNTER J(play)" >> $WORKFOLDER/$YAML_FILE COUNTER=$((COUNTER+1)) done echo "scriptcodes:" >> $WORKFOLDER/$YAML_FILE echo " play: $((STARTSCRIPTCODE+1))" >> $WORKFOLDER/$YAML_FILE echo " previous: $((STARTSCRIPTCODE+2))" >> $WORKFOLDER/$YAML_FILE echo " next: $((STARTSCRIPTCODE+3))" >> $WORKFOLDER/$YAML_FILE echo " stop: $((STARTSCRIPTCODE+4))" >> $WORKFOLDER/$YAML_FILE COUNTER=1 while [ $COUNTER -le $TRACKS ]; do echo " $(printf "track_%02d" $COUNTER): $((STARTSCRIPTCODE+4+$COUNTER))" >> $WORKFOLDER/$YAML_FILE COUNTER=$((COUNTER+1)) done debug " done" 1 } mk_oids() { if [ $DEBUG_LEVEL -le 1 ]; then debug "Generating OIDs ..." 1 -n else debug "Generating OIDs ..." 1 fi if [ ! -d $WORKFOLDER/$OIDS ]; then mkdir -p $WORKFOLDER/$OIDS fi debug "Using YAML-File: $WORKFOLDER/$YAML_FILE" 2 if [ $DEBUG_LEVEL -le 1 ]; then tttool --dpi 600 --code-dim 8x6 oid-codes $WORKFOLDER/$YAML_FILE > /dev/null else tttool --dpi 600 --code-dim 8x6 oid-codes $WORKFOLDER/$YAML_FILE fi mv *track*.png $WORKFOLDER/$OIDS if [ $DEBUG_LEVEL -le 1 ]; then tttool --dpi 600 --code-dim 25x25 oid-codes $WORKFOLDER/$YAML_FILE > /dev/null else tttool --dpi 600 --code-dim 25x25 oid-codes $WORKFOLDER/$YAML_FILE fi rm *track*.png mv *.png $WORKFOLDER/$OIDS debug " done" 1 } mk_gme() { debug "Generate GME-file ... " 1 -n tttool assemble $WORKFOLDER/$YAML_FILE debug " done" 1 } mk_base_image() { debug "Generate printable image ..." 1 -n convert $WORKFOLDER/$COVER -resize $COVER_SIZE\! $WORKFOLDER/cover_resized.jpg convert -size $SHEETSIZE xc:white $WORKFOLDER/$OUTPUT convert -size $CONTROLBUTTONSIZE xc:white -fill white -stroke black -strokewidth 30 -draw "roundrectangle 15,15 585,585 30,30\ stroke-linecap round line 150,150 450,300\ stroke-linecap round line 450,300 150,450\ stroke-linecap round line 150,450 150,150" $WORKFOLDER/play.png convert -size $CONTROLBUTTONSIZE xc:white -fill white -stroke black -strokewidth 30 -draw "roundrectangle 15,15 585,585 30,30\ stroke-linecap round line 150,150 450,150\ stroke-linecap round line 450,150 450,450\ stroke-linecap round line 450,450 150,450\ stroke-linecap round line 150,450 150,150" $WORKFOLDER/stop.png convert -size $CONTROLBUTTONSIZE xc:white -fill white -stroke black -strokewidth 30 -draw "roundrectangle 15,15 585,585 30,30\ stroke-linecap round line 150,150 200,150\ stroke-linecap round line 200,150 200,300\ stroke-linecap round line 200,300 450,150\ stroke-linecap round line 450,150 450,450\ stroke-linecap round line 450,450 200,300\ stroke-linecap round line 200,300 200,450\ stroke-linecap round line 200,450 150,450\ stroke-linecap round line 150,450 150,150" $WORKFOLDER/previous.png convert -size $CONTROLBUTTONSIZE xc:white -fill white -stroke black -strokewidth 30 -draw "roundrectangle 15,15 585,585 30,30\ stroke-linecap round line 150,150 400,300\ stroke-linecap round line 400,300 400,150\ stroke-linecap round line 400,150 450,150\ stroke-linecap round line 450,150 450,450\ stroke-linecap round line 450,450 400,450\ stroke-linecap round line 400,450 400,300\ stroke-linecap round line 400,300 150,450\ stroke-linecap round line 150,450 150,150" $WORKFOLDER/next.png convert -size $CONTROLBUTTONSIZE xc:white -fill white -stroke black -strokewidth 30 -draw "roundrectangle 15,15 585,585 30,30"\ -stroke black -strokewidth 50 -draw "stroke-linecap round ellipse 300,300 200,200 305,235"\ -stroke black -strokewidth 50 -draw "stroke-linecap round line 300,65 300,180" $WORKFOLDER/on.png composite -geometry +600+1200 $WORKFOLDER/cover_resized.jpg $WORKFOLDER/$OUTPUT $WORKFOLDER/$OUTPUT composite -geometry +600+600 $WORKFOLDER/on.png $WORKFOLDER/$OUTPUT $WORKFOLDER/$OUTPUT rm $WORKFOLDER/on.png composite -geometry +600+600 $WORKFOLDER/$OIDS/oid-${PRODUCT_ID}-START.png $WORKFOLDER/$OUTPUT $WORKFOLDER/$OUTPUT composite -geometry +1275+600 $WORKFOLDER/play.png $WORKFOLDER/$OUTPUT $WORKFOLDER/$OUTPUT rm $WORKFOLDER/play.png composite -geometry +1275+600 $WORKFOLDER/$OIDS/oid-${PRODUCT_ID}-play.png $WORKFOLDER/$OUTPUT $WORKFOLDER/$OUTPUT composite -geometry +1950+600 $WORKFOLDER/stop.png $WORKFOLDER/$OUTPUT $WORKFOLDER/$OUTPUT rm $WORKFOLDER/stop.png composite -geometry +1950+600 $WORKFOLDER/$OIDS/oid-${PRODUCT_ID}-stop.png $WORKFOLDER/$OUTPUT $WORKFOLDER/$OUTPUT composite -geometry +2625+600 $WORKFOLDER/previous.png $WORKFOLDER/$OUTPUT $WORKFOLDER/$OUTPUT rm $WORKFOLDER/previous.png composite -geometry +2625+600 $WORKFOLDER/$OIDS/oid-${PRODUCT_ID}-previous.png $WORKFOLDER/$OUTPUT $WORKFOLDER/$OUTPUT composite -geometry +3300+600 $WORKFOLDER/next.png $WORKFOLDER/$OUTPUT $WORKFOLDER/$OUTPUT rm $WORKFOLDER/next.png composite -geometry +3300+600 $WORKFOLDER/$OIDS/oid-${PRODUCT_ID}-next.png $WORKFOLDER/$OUTPUT $WORKFOLDER/$OUTPUT convert $WORKFOLDER/$OUTPUT -font Times-Roman -pointsize $TEXT_FONT_SIZE -draw "fill black text +$PRODUCT_ID_H_POS+$PRODUCT_ID_V_POS 'Product ID: $PRODUCT_ID" $WORKFOLDER/$OUTPUT convert $WORKFOLDER/$OUTPUT -font Times-Roman -pointsize $TEXT_FONT_SIZE -draw "fill black text +$COPYRIGHT_H_POSITION+$COPYRIGHT_V_POSITION 'Created by ChrvTh" $WORKFOLDER/$OUTPUT debug " done" 1 } mk_trackbuttons() { COUNTER=1 debug "Generating track buttons and adding them to printable image ..." 1 -n while [ $COUNTER -le $TRACKS ]; do debug "COUNTER: $COUNTER" 3 debug "TRACKS: $TRACKS" 3 debug "BUTTON H: $BUTTON_H_POSITION" 3 debug "BUTTON V: $BUTTON_V_POSITION" 3 convert -size $TRACKBUTTONSIZE xc:white -fill white -stroke black -strokewidth $BUTTON_STROKEWIDTH -draw "roundrectangle 0,0 $TRACKBUTTON_WIDTH,$TRACKBUTTON_HEIGHT 30,30" $WORKFOLDER/$(printf "track_%02d" $COUNTER)_button.png convert $WORKFOLDER/$(printf "track_%02d" $COUNTER)_button.png -font Arial -pointsize $BUTTON_FONT_SIZE -draw "fill black text +30+115 '$(printf "%02d" $COUNTER)" $WORKFOLDER/$(printf "track_%02d" $COUNTER)_button.png composite -geometry +$BUTTON_H_POSITION+$BUTTON_V_POSITION $WORKFOLDER/$(printf "track_%02d" $COUNTER)_button.png $WORKFOLDER/$OUTPUT $WORKFOLDER/$OUTPUT rm $WORKFOLDER/$(printf "track_%02d" $COUNTER)_button.png composite -geometry +$OID_H_POSITION+$OID_V_POSITION $WORKFOLDER/$OIDS/oid-$PRODUCT_ID-$(printf "track_%02d" $COUNTER).png $WORKFOLDER/$OUTPUT $WORKFOLDER/$OUTPUT rm $WORKFOLDER/$OIDS/oid-$PRODUCT_ID-$(printf "track_%02d" $COUNTER).png convert $WORKFOLDER/$OUTPUT -font Times-Roman -pointsize $TEXT_FONT_SIZE -draw "fill black text +$TEXT_H_POSITION+$TEXT_V_POSITION '`eval sed '$COUNTER!d' $WORKFOLDER/$TRACKLIST`'" $WORKFOLDER/$OUTPUT COUNTER=$((COUNTER+1)) BUTTON_H_POSITION=$((BUTTON_H_POSITION+$BUTTON_H_OFFSET)) BUTTON_V_POSITION=$((BUTTON_V_POSITION+$BUTTON_V_OFFSET)) OID_H_POSITION=$((OID_H_POSITION+$OID_H_OFFSET)) OID_V_POSITION=$((OID_V_POSITION+$OID_V_OFFSET)) TEXT_H_POSITION=$((TEXT_H_POSITION+$TEXT_H_OFFSET)) TEXT_V_POSITION=$((TEXT_V_POSITION+$TEXT_V_OFFSET)) done debug " done" 1 } ## Main while [ $# -ne 0 ]; do case $1 in -c) shift if [ ! "$1" ]; then echo "No comment given -> EXIT!" exit 1 else case "$1" in *\ * ) COMMENT=`eval echo "$1" | sed -e 's/ /_/g'` YAML_FILE=${COMMENT}.yaml OUTPUT="${COMMENT}.png" ;; *) COMMENT="$1" YAML_FILE="$1.yaml" OUTPUT="$1.png" ;; esac fi shift ;; -d) shift if [ "$1" -eq "$1" ] 2>/dev/null ; then DEBUG_LEVEL=$1 else echo "No debug level given! -> EXIT!" exit 1 fi shift ;; -h) echo "usage: $0 [ARGUMENTS] " echo "-c [TEXT]: Comment which is used in gme-file" echo "-d [n]: Debug output with level n (0...3)" echo "-h - this help ;-)" echo "-pid [nnn] - Product ID to use e.g. 701 " echo "-w [path to working folder] - Working folder. All operations will be performed in this folder. The source folder for wave files will be expected here." echo "" echo "" echo "" echo "" exit 0 ;; -pid) shift if [ -n "$1" ]; then if [ "$1" -eq "$1" ] 2>/dev/null ; then PRODUCT_ID="$1" else echo "Error - no product ID given -> EXIT!" exit 1 fi else echo "Error - no product ID given -> EXIT!" exit 1 fi shift ;; -w) shift if [ -e "$1" ] || [ ! "$1" ] ; then WORKFOLDER=$1 shift else echo "Given work folder does not exist or is not accessible -> EXIT!" exit 1 fi ;; *) echo "Parameter \"$1\" unkown -> exit!" shift exit 1 ;; esac done if [ $DEBUG_LEVEL -le 1 ]; then echo -n "Generating $COMMENT.gme ... " else echo "Generating $COMMENT.gme ... " fi if [ -z $PRODUCT_ID ]; then echo "Error - no product ID given -> EXIT!" exit 1 else debug "Product-ID: $PRODUCT_ID" 1 fi if [ -z $COMMENT ]; then echo "Error - no comment given -> EXIT!" exit 1 else debug "Comment: $COMMENT" 1 debug "Output: $OUTPUT" 1 debug "YAML: $YAML_FILE" 1 fi check_tools tttool check_tools oggenc check_tools composite check_tools convert check_tools rec check_tools notify-send check_tools zenity cleanup cover cleanup tracklist cleanup output cleanup ogg cleanup oids mk_ogg_files mk_yaml_file mk_oids mk_gme mk_base_image mk_trackbuttons desktop_message "GME file generated" cleanup cover cleanup tracklist cleanup templates cleanup ogg cleanup oids echo "done!" echo "" echo "GME file generated - please copy ${COMMENT}.gme to your TipToi device and print out $OUTPUT by using 600 dpi printing resolution!" echo ""