summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2016-05-03 11:18:57 +0200
committerErich Eckner <git@eckner.net>2016-05-03 11:18:57 +0200
commit55288d7e36a6b2c79dd0f134dd1ee0d45d4e5be4 (patch)
tree40504d5168766287b981f219ae78bf83992a96b3
downloadsound-cutter-55288d7e36a6b2c79dd0f134dd1ee0d45d4e5be4.tar.xz
Initial commit
-rwxr-xr-xaddtimes59
-rwxr-xr-xdoit281
-rwxr-xr-xdoit.save264
-rwxr-xr-xsubtimes59
-rwxr-xr-xtimetosample31
-rwxr-xr-xtrimpoints75
6 files changed, 769 insertions, 0 deletions
diff --git a/addtimes b/addtimes
new file mode 100755
index 0000000..cc90901
--- /dev/null
+++ b/addtimes
@@ -0,0 +1,59 @@
+#!/bin/bash
+
+# subtimes t1 t2
+# -> "t1-t2"
+
+for i in {1..2}
+do
+ inp=$(echo "${@:i:1}" | sed "s/^ *//" | sed "s/ *#.*$//")
+ p1=$(echo "$inp" | tr ":" " " | awk '{print $1}')
+ p2=$(echo "$inp" | tr ":" " " | awk '{print $2}')
+ p3=$(echo "$inp" | tr ":" " " | awk '{print $3}')
+ for j in {1..2}
+ do
+ if [ "$p3" == "" ]
+ then
+ p3=$p2
+ p2=$p1
+ p1="0"
+ fi
+ done
+ p4=$(echo $p3 | tr "." " " | awk '{print $2}')
+ while [ ${#p4} -lt 6 ]
+ do
+ p4=${p4}"0"
+ done
+ f[$i]=$(echo $p4 | sed "s/^0*//" | sed "s/^$/0/")
+ s[$i]=$(echo $p3 | tr "." " " | awk '{print $1}' | sed "s/^0*//" | sed "s/^$/0/")
+ m[$i]=$(echo $p2 | sed "s/^0*//" | sed "s/^$/0/")
+ h[$i]=$(echo $p1 | sed "s/^0*//" | sed "s/^$/0/")
+done
+
+fd=$[${f[1]}+${f[2]}]
+ut=0
+while [ $fd -ge 1000000 ]
+do
+ ut=$[$ut+1]
+ fd=$[$fd-1000000]
+done
+while [ ${#fd} -lt 6 ]
+do
+ fd="0"$fd
+done
+sd=$[${s[1]}+${s[2]}+$ut]
+ut=0
+while [ $sd -ge 60 ]
+do
+ ut=$[$ut+1]
+ sd=$[$sd-60]
+done
+md=$[${m[1]}+${m[2]}+$ut]
+ut=0
+while [ $md -ge 60 ]
+do
+ ut=$[$ut+1]
+ md=$[$md-60]
+done
+hd=$[${h[1]}+${h[2]}+$ut]
+
+echo $hd":"$md":"$sd"."$fd
diff --git a/doit b/doit
new file mode 100755
index 0000000..5822ca7
--- /dev/null
+++ b/doit
@@ -0,0 +1,281 @@
+#!/bin/bash
+
+# doit [ -f ] [ -ng ] input_1 input_2 ... input_n points output
+
+
+eval set -- "$(getopt -o hf1ni:p:o:s: --long help,force,noGain,dummy,input:,points:,output:,sampleRate: -n "$(basename "$0")" -- "$@")"
+
+force=false
+noGain=false
+dummy=false
+
+while true; do
+ case "$1" in
+ -h|--help)
+ echo "$0"' [ -f | --force ] [ -1 | --noGain ] [ -n | --dummy ] { ( -i | --input= ) input$i.flac } ( -o | --output= ) output.flac ( -p | --points= ) points'
+ echo ' Mischen und Schneiden:'
+ echo ' -f | --force: output.flac ggf. überschreiben'
+ echo ' -1 | --noGain: Lautstärke nicht normalisieren'
+ echo ' -n | --dummy: nur auszuführenden Befehl anzeigen und nichts tun'
+ echo ' -s | --sampleRate=: alternative Samplerate zum Abspeichern'
+ echo ' -i | --input=: Quelle'
+ echo ' -o | --output=: Ziel'
+ echo ' -p | --points=: Punktedatei'
+ echo "$0"' [ -h | --help ]'
+ echo ' Hilfe anzeigen'
+ exit 0
+ ;;
+ -f|--force)
+ force=true
+ ;;
+ -1|--noGain)
+ noGain=true
+ ;;
+ -n|--dummy)
+ dummy=true
+ ;;
+ -i|--input)
+ shift
+ inputs[${#inputs[@]}]="$1"
+ ;;
+ -o|--output)
+ shift
+ [ -n "${output}" ] && echo 'Ich kann nur eine Output-Datei-Option verstehen.' && exit 1
+ output="$1"
+ ;;
+ -p|--points)
+ shift
+ [ -n "${points}" ] && echo 'Ich kann nur eine Point-Datei-Option verstehen.' && exit 1
+ points="$1"
+ ;;
+ -s|--sampleRate)
+ shift
+ [ -n "${outRate}" ] && echo 'Ich kann nur eine Samplerate-Option verstehen.' && exit 1
+ outRate="$1"
+ ;;
+ --)
+ shift
+ [ $# -gt 0 ] && echo 'Unbekannte Parameter: '"$#" && exit 1
+ break
+ ;;
+ *)
+ echo 'Hups, das sollte nicht passieren könne, '"$1"' kenne ich doch nicht ...'
+ exit -1
+ ;;
+ esac
+ shift
+done
+
+[ -z "${output}" ] && echo 'Output-Datei fehlt!' && exit 1
+[ -z "${points}" ] && echo 'Points-Datei fehlt!' && exit 1
+[ "${#inputs[@]}" -eq 0 ] && echo 'Input-Datei fehlt!' && exit 1
+
+dir="$(dirname $0)"
+
+[ ! -e "${points}" ] && echo "Die Schnittpunktedatei ${points} existiert nicht!" && exit 1
+for inp in "${inputs[@]}"
+do
+ [ ! -e "${inp}" ] && echo "Die Inputdatei ${inp} existiert nicht!" && exit 1
+ [ $(echo "${inp}" | grep -c " ") -gt 0 ] && echo "Bitte keine Leerzeichen im input-Dateinamen!" && exit 1
+done
+
+[ $(echo "${output}" | grep -c " ") -gt 0 ] && echo "Bitte keine Leerzeichen im output-Dateinamen!" && exit 1
+[ $(echo "${points}" | grep -c " ") -gt 0 ] && echo "Bitte keine Leerzeichen im points-Dateinamen!" && exit 1
+
+if [ -e "${output}" ]
+then
+ if ${force}
+ then
+ ${dummy} || rm "${output}"
+ else
+ echo "Die Ausgabedatei ${output} existiert bereits!" && exit 1
+ fi
+fi
+odn="$(dirname "${output}")"
+obn="$(basename "${output}")"
+if [ $(ls -1 "${odn}" | grep "$(echo "${obn}" | sed "s/%[0-9]\?n/.*/g")" | wc -l) -gt 0 ]
+then
+ if ${force}
+ then
+ ${dummy} || rm ${odn}/$(echo "${obn}" | sed "s/%[0-9]\?n/*/g")
+ else
+ echo "Die Ausgabedatei ${output} existiert bereits!" && exit 1
+ fi
+fi
+
+samplerate=$(soxi -r "${inputs[0]}")
+[ -z ${outRate} ] && outRate=${samplerate}
+i=-1
+abstime=0
+while read -r in
+do
+ line="$(echo "${in}" | sed "s/^ *//" | sed "s/ *\(\# .*\)\{0,1\}$//")"
+ [ "${line}" == "" ] && continue
+ if [ $i -eq -1 ]
+ then
+ firstline="$(echo "${line}" | sed "s/ *\#.*$//")"
+ remixcmd="$(echo "${in}" | sed "s/^[^\#]*\#//" | sed "s/ *\(\# .*\)\{0,1\}$//")"
+ i=0
+ continue
+ fi
+ if [ $(echo "${line}" | grep -c "^\#") -eq 1 ]
+ then
+ trackmods[${i}]=" $(echo "${line}" | sed "s/^.*\#//")"
+ timecorrections[${i}]=0
+ while [ $(echo "${trackmods[${i}]}" | grep -c " trimsplice") -eq 1 ]
+ do
+ tmp="$(echo "${trackmods[${i}]}" | sed "s/X/x/g" | sed "s/trimsplice/X/g" | sed "s/^[^X]* X *//" | sed "s/ / /g")"
+ end=$(${dir}/timetosample ${samplerate} $(echo "${tmp}" | awk '{print $1}'))
+ if [ ! "${doverlaps[${i}]}" == "" ]
+ then
+ end=$[${end}+${doverlaps[${i}]}]
+ fi
+ discard=$(${dir}/timetosample ${samplerate} $(echo "${tmp}" | awk '{print $2}'))
+ excess=$(${dir}/timetosample ${samplerate} $(echo "${tmp}" | awk '{print $3}'))
+ leeway=$(${dir}/timetosample ${samplerate} $(echo "${tmp}" | awk '{print $4}'))
+ trackmods[${i}]="$(echo "${trackmods[${i}]}" | sed "s/ *trimsplice *[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]*/ trim 0s ${end}s ${discard}s splice -t ${end}s,${excess}s,${leeway}s/")"
+# trackmods[${i}]="$(echo "${trackmods[${i}]}" | sed "s/ *trimsplice *[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]*/ trim 0s ${end}s ${discard}s/")"
+ timecorrections[${i}]=$[${timecorrections[${i}]}+${discard}+2*${excess}]
+ done
+ continue
+ fi
+ i=$[${i}+1]
+ tmp=$(${dir}/timetosample ${samplerate} $(echo "${line}" | sed "s/ *\(\#.*$\)\{0,1\}$//"))
+ times[${i}]=$[${tmp}-${abstime}]
+ abstime=${tmp}
+
+ newFile[${i}]=true
+ tmp="$(echo "${line}" | sed "s/^[^\#]*#\?//" | sed "s/\s\./ 0./g")"
+ while [ -n "${tmp}" ]
+ do
+ if [[ "$tmp" = "overlap "* ]]
+ then
+ overlaps[${i}]=$[$(${dir}/timetosample ${samplerate} $(echo "${tmp}" | sed "s/^overlap \(\S\+\)\(\s.*\)\?$/\1/"))/2]
+ doverlaps[${i}]=$[2*${overlaps[${i}]}]
+ tmp="$(echo "${tmp}" | sed "s/^\S\+\s\+\S\+\s*//")"
+ continue
+ fi
+ if [[ "$tmp" = "noNewFile"* ]]
+ then
+ newFile[${i}]=false
+ tmp="$(echo "${tmp}" | sed "s/^\S\+\s*//")"
+ continue
+ fi
+ echo "'${tmp}' ist unverständlich zwischen zwei Stücken"
+ exit 1
+ done
+done < "${points}"
+
+#for (( i=0; i<=${#times[@]}; i++ ))
+#do
+# echo "${i} ; ${trackmods[${i}]} ; ${times[${i}]} ; ${overlaps[${i}]} ; ${doverlaps[${i}]} ; ${timecorrections[${i}]}"
+#done
+#exit 0
+
+repcmd=""
+abstime=0
+for (( i=1; i<=${#times[@]}; i++ ))
+do
+ abstime=$[${abstime}+${times[${i}]}]
+ [ "${doverlaps[${i}]}" == "" ] && continue
+ repcmd="${repcmd} trim 0s $[${abstime}-${doverlaps[${i}]}]s : trim 0s ${doverlaps[${i}]}s repeat :"
+ abstime=0
+done
+
+trackmodcmd=""
+abstime=0
+for (( i=0; i<=${#times[@]}; i++ ))
+do
+ if [ ${i} -gt 0 ]
+ then
+ [ "${timecorrections[$[${i}-1]]}" == "" ] || times[${i}]=$[${times[${i}]}-${timecorrections[$[${i}-1]]}]
+ fi
+ [ "${times[$[${i}+1]]}" == "" ] || abstime=$[${abstime}+${times[$[${i}+1]]}]
+ [ "${doverlaps[${i}]}" == "" ] || abstime=$[${abstime}+${doverlaps[${i}]}]
+ [ "${trackmods[${i}]}" == "${trackmods[$[${i}+1]]}" ] && continue
+ if [ ${i} -eq ${#times[@]} ]
+ then
+ trackmodcmd="${trackmodcmd}${trackmods[${i}]} "
+ else
+ trackmodcmd="${trackmodcmd}trim 0s ${abstime}s${trackmods[${i}]} : "
+ fi
+ abstime=0
+done
+
+splicecmd=""
+abstime=0
+for (( i=0; i<=${#times[@]}; i++ ))
+do
+ [ "${times[${i}]}" == "" ] || abstime=$[${abstime}+${times[${i}]}]
+ [ "${overlaps[${i}]}" == "" ] && continue
+ splicecmd="${splicecmd} ${abstime}s,${overlaps[${i}]}s,0s"
+ abstime=$[${abstime}+${doverlaps[${i}]}]
+done
+[ "${splicecmd}" == "" ] || splicecmd="splice -t${splicecmd}"
+
+trimcmd=""
+for (( i=1; i<=${#times[@]}; i++ ))
+do
+ if [ ${outRate} -eq ${samplerate} ]
+ then
+ trimcmd="${trimcmd}trim 0s =${times[${i}]}s : "
+ else
+ trimcmd="${trimcmd}trim 0s =$[$[${times[${i}]}*${outRate}+${samplerate}/2]/${samplerate}]s : "
+ fi
+ ${newFile[${i}]} && trimcmd="${trimcmd}newfile : "
+done
+
+if [ ! ${outRate} -eq ${samplerate} ]
+then
+ remixcmd="${remixcmd} rate -v ${outRate}"
+fi
+
+if ! ${noGain}
+then
+ firstline="${firstline} gain -b"
+ remixcmd="${remixcmd} gain -n"
+fi
+
+echo sox -M "${inputs[@]}" -p trim ${firstline}
+echo sox -t sox - -p ${repcmd}
+echo sox -t sox - -p ${trackmodcmd}
+echo sox -t sox - -p ${splicecmd} ${remixcmd}
+echo sox -t sox - ${output} ${trimcmd}
+
+if ! ${dummy}
+then
+ sox -M "${inputs[@]}" -p trim ${firstline}| \
+ sox -t sox - -p ${repcmd} | \
+ sox -t sox - -p ${trackmodcmd} | \
+ sox -t sox - -p ${splicecmd} ${remixcmd} | \
+ sox -t sox - ${output} ${trimcmd}
+fi
+
+#if $noGain
+#then
+# echo sox -M "${@:1:$[$#-2]}" -p trim ${firstline}
+# echo sox -t sox - -p ${repcmd}
+# echo sox -t sox - -p ${trackmodcmd}
+# echo sox -t sox - -p ${splicecmd} ${remixcmd}
+# echo sox -t sox - ${output} ${trimcmd}
+#
+# sox -M "${@:1:$[$#-2]}" -p trim ${firstline}| \
+# sox -t sox - -p ${repcmd} | \
+# sox -t sox - -p ${trackmodcmd} | \
+# sox -t sox - -p ${splicecmd} ${remixcmd} | \
+# sox -t sox - ${output} ${trimcmd}
+#else
+# echo sox -M "${@:1:$[$#-2]}" -p trim ${firstline} gain -b
+# echo sox -t sox - -p ${repcmd}
+# echo sox -t sox - -p ${trackmodcmd}
+# echo sox -t sox - -p ${splicecmd} ${remixcmd}
+# echo sox -t sox - -p gain -n
+# echo sox -t sox - ${output} ${trimcmd}
+#
+# sox -M "${@:1:$[$#-2]}" -p trim ${firstline} gain -b | \
+# sox -t sox - -p ${repcmd} | \
+# sox -t sox - -p ${trackmodcmd} | \
+# sox -t sox - -p ${splicecmd} ${remixcmd} | \
+# sox -t sox - -p gain -n | \
+# sox -t sox - ${output} ${trimcmd}
+#fi
diff --git a/doit.save b/doit.save
new file mode 100755
index 0000000..c6bb1e1
--- /dev/null
+++ b/doit.save
@@ -0,0 +1,264 @@
+#!/bin/bash
+
+# doit [ -f ] [ -ng ] input_1 input_2 ... input_n points output
+
+
+eval set -- "$(getopt -o hf1ni:p:o: --long help,force,noGain,dummy,input:,points:,output: -n "$(basename "$0")" -- "$@")"
+
+force=false
+noGain=false
+dummy=false
+
+while true; do
+ case "$1" in
+ -h|--help)
+ echo "$0"' [ -f | --force ] [ -1 | --noGain ] [ -n | --dummy ] { ( -i | --input= ) input$i.flac } ( -o | --output= ) output.flac ( -p | --points= ) points'
+ echo ' Mischen und Schneiden:'
+ echo ' -f | --force: output.flac ggf. überschreiben'
+ echo ' -1 | --noGain: Lautstärke nicht normalisieren'
+ echo ' -n | --dummy: nur auszuführenden Befehl anzeigen und nichts tun'
+ echo ' -i | --input=: Quelle'
+ echo ' -o | --output=: Ziel'
+ echo ' -p | --points=: Punktedatei'
+ echo "$0"' [ -h | --help ]'
+ echo ' Hilfe anzeigen'
+ exit 0
+ ;;
+ -f|--force)
+ force=true
+ ;;
+ -1|--noGain)
+ noGain=true
+ ;;
+ -n|--dummy)
+ dummy=true
+ ;;
+ -i|--input)
+ shift
+ inputs[${#inputs[@]}]="$1"
+ ;;
+ -o|--output)
+ shift
+ [ -n "$output" ] && echo 'Ich kann nur eine Output-Datei-Option verstehen.' && exit 1
+ output="$1"
+ ;;
+ -p|--points)
+ shift
+ [ -n "$points" ] && echo 'Ich kann nur eine Point-Datei-Option verstehen.' && exit 1
+ points="$1"
+ ;;
+ --)
+ shift
+ [ $# -gt 0 ] && echo 'Unbekannte Parameter: '"$#" && exit 1
+ break
+ ;;
+ *)
+ echo 'Hups, das sollte nicht passieren könne, '"$1"' kenne ich doch nicht ...'
+ exit -1
+ ;;
+ esac
+ shift
+done
+
+[ -z "${output}" ] && echo 'Output-Datei fehlt!' && exit 1
+[ -z "${points}" ] && echo 'Points-Datei fehlt!' && exit 1
+[ "${#inputs[@]}" -eq 0 ] && echo 'Input-Datei fehlt!' && exit 1
+
+dir="$(dirname $0)"
+
+[ ! -e "${points}" ] && echo "Die Schnittpunktedatei ${points} existiert nicht!" && exit 1
+for inp in "${inputs[@]}"
+do
+ [ ! -e "${inp}" ] && echo "Die Inputdatei ${inp} existiert nicht!" && exit 1
+ [ $(echo "${inp}" | grep -c " ") -gt 0 ] && echo "Bitte keine Leerzeichen im input-Dateinamen!" && exit 1
+done
+
+[ $(echo "${output}" | grep -c " ") -gt 0 ] && echo "Bitte keine Leerzeichen im output-Dateinamen!" && exit 1
+[ $(echo "${points}" | grep -c " ") -gt 0 ] && echo "Bitte keine Leerzeichen im points-Dateinamen!" && exit 1
+
+if [ -e "${output}" ]
+then
+ if ${force}
+ then
+ ${dummy} || rm "${output}"
+ else
+ echo "Die Ausgabedatei ${output} existiert bereits!" && exit 1
+ fi
+fi
+odn="$(dirname "${output}")"
+obn="$(basename "${output}")"
+if [ $(ls -1 "${odn}" | grep "$(echo "${obn}" | sed "s/%[0-9]\?n/.*/g")" | wc -l) -gt 0 ]
+then
+ if ${force}
+ then
+ ${dummy} || rm ${odn}/$(echo "${obn}" | sed "s/%[0-9]\?n/*/g")
+ else
+ echo "Die Ausgabedatei ${output} existiert bereits!" && exit 1
+ fi
+fi
+
+samplerate=$(soxi -r "${inputs[0]}")
+i=-1
+abstime=0
+while read -r in
+do
+ line="$(echo "${in}" | sed "s/^ *//" | sed "s/ *\(\# .*\)\{0,1\}$//")"
+ [ "${line}" == "" ] && continue
+ if [ $i -eq -1 ]
+ then
+ firstline="$(echo "${line}" | sed "s/ *\#.*$//")"
+ remixcmd="$(echo "${in}" | sed "s/^[^\#]*\#//" | sed "s/ *\(\# .*\)\{0,1\}$//")"
+ i=0
+ continue
+ fi
+ if [ $(echo "${line}" | grep -c "^\#") -eq 1 ]
+ then
+ trackmods[${i}]=" $(echo "${line}" | sed "s/^.*\#//")"
+ timecorrections[${i}]=0
+ while [ $(echo "${trackmods[${i}]}" | grep -c " trimsplice") -eq 1 ]
+ do
+ tmp="$(echo "${trackmods[${i}]}" | sed "s/X/x/g" | sed "s/trimsplice/X/g" | sed "s/^[^X]* X *//" | sed "s/ / /g")"
+ end=$(${dir}/timetosample ${samplerate} $(echo "${tmp}" | awk '{print $1}'))
+ if [ ! "${doverlaps[${i}]}" == "" ]
+ then
+ end=$[${end}+${doverlaps[${i}]}]
+ fi
+ discard=$(${dir}/timetosample ${samplerate} $(echo "${tmp}" | awk '{print $2}'))
+ excess=$(${dir}/timetosample ${samplerate} $(echo "${tmp}" | awk '{print $3}'))
+ leeway=$(${dir}/timetosample ${samplerate} $(echo "${tmp}" | awk '{print $4}'))
+ trackmods[${i}]="$(echo "${trackmods[${i}]}" | sed "s/ *trimsplice *[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]*/ trim 0s ${end}s ${discard}s splice -t ${end}s,${excess}s,${leeway}s/")"
+# trackmods[${i}]="$(echo "${trackmods[${i}]}" | sed "s/ *trimsplice *[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]*/ trim 0s ${end}s ${discard}s/")"
+ timecorrections[${i}]=$[${timecorrections[${i}]}+${discard}+2*${excess}]
+ done
+ continue
+ fi
+ i=$[${i}+1]
+ tmp=$(${dir}/timetosample ${samplerate} $(echo "${line}" | sed "s/ *\(\#.*$\)\{0,1\}$//"))
+ times[${i}]=$[${tmp}-${abstime}]
+ abstime=${tmp}
+
+ newFile[${i}]=true
+ tmp="$(echo "${line}" | sed "s/^[^\#]*#\?//" | sed "s/\s\./ 0./g")"
+ while [ -n "${tmp}" ]
+ do
+ if [[ "$tmp" = "overlap "* ]]
+ then
+ overlaps[${i}]=$[$(${dir}/timetosample ${samplerate} $(echo "${tmp}" | sed "s/^overlap \(\S\+\)\(\s.*\)\?$/\1/"))/2]
+ doverlaps[${i}]=$[2*${overlaps[${i}]}]
+ tmp="$(echo "${tmp}" | sed "s/^\S\+\s\+\S\+\s*//")"
+ continue
+ fi
+ if [[ "$tmp" = "noNewFile"* ]]
+ then
+ newFile[${i}]=false
+ tmp="$(echo "${tmp}" | sed "s/^\S\+\s*//")"
+ continue
+ fi
+ echo "'${tmp}' ist unverständlich zwischen zwei Stücken"
+ exit 1
+ done
+done < "${points}"
+
+#for (( i=0; i<=${#times[@]}; i++ ))
+#do
+# echo "${i} ; ${trackmods[${i}]} ; ${times[${i}]} ; ${overlaps[${i}]} ; ${doverlaps[${i}]} ; ${timecorrections[${i}]}"
+#done
+#exit 0
+
+repcmd=""
+abstime=0
+for (( i=1; i<=${#times[@]}; i++ ))
+do
+ abstime=$[${abstime}+${times[${i}]}]
+ [ "${doverlaps[${i}]}" == "" ] && continue
+ repcmd="${repcmd} trim 0s $[${abstime}-${doverlaps[${i}]}]s : trim 0s ${doverlaps[${i}]}s repeat :"
+ abstime=0
+done
+
+trackmodcmd=""
+abstime=0
+for (( i=0; i<=${#times[@]}; i++ ))
+do
+ if [ ${i} -gt 0 ]
+ then
+ [ "${timecorrections[$[${i}-1]]}" == "" ] || times[${i}]=$[${times[${i}]}-${timecorrections[$[${i}-1]]}]
+ fi
+ [ "${times[$[${i}+1]]}" == "" ] || abstime=$[${abstime}+${times[$[${i}+1]]}]
+ [ "${doverlaps[${i}]}" == "" ] || abstime=$[${abstime}+${doverlaps[${i}]}]
+ [ "${trackmods[${i}]}" == "${trackmods[$[${i}+1]]}" ] && continue
+ if [ ${i} -eq ${#times[@]} ]
+ then
+ trackmodcmd="${trackmodcmd}${trackmods[${i}]} "
+ else
+ trackmodcmd="${trackmodcmd}trim 0s ${abstime}s${trackmods[${i}]} : "
+ fi
+ abstime=0
+done
+
+splicecmd=""
+abstime=0
+for (( i=0; i<=${#times[@]}; i++ ))
+do
+ [ "${times[${i}]}" == "" ] || abstime=$[${abstime}+${times[${i}]}]
+ [ "${overlaps[${i}]}" == "" ] && continue
+ splicecmd="${splicecmd} ${abstime}s,${overlaps[${i}]}s,0s"
+ abstime=$[${abstime}+${doverlaps[${i}]}]
+done
+[ "${splicecmd}" == "" ] || splicecmd="splice -t${splicecmd}"
+
+trimcmd=""
+for (( i=1; i<=${#times[@]}; i++ ))
+do
+ trimcmd="${trimcmd}trim 0s =${times[${i}]}s : "
+ ${newFile[${i}]} && trimcmd="${trimcmd}newfile : "
+done
+
+if ! ${noGain}
+then
+ firstline="${firstline} gain -b"
+ remixcmd="${remixcmd} gain -n"
+fi
+
+echo sox -M "${inputs[@]}" -p trim ${firstline}
+echo sox -t sox - -p ${repcmd}
+echo sox -t sox - -p ${trackmodcmd}
+echo sox -t sox - -p ${splicecmd} ${remixcmd}
+echo sox -t sox - ${output} ${trimcmd}
+
+if ! ${dummy}
+then
+ sox -M "${inputs[@]}" -p trim ${firstline}| \
+ sox -t sox - -p ${repcmd} | \
+ sox -t sox - -p ${trackmodcmd} | \
+ sox -t sox - -p ${splicecmd} ${remixcmd} | \
+ sox -t sox - ${output} ${trimcmd}
+fi
+
+#if $noGain
+#then
+# echo sox -M "${@:1:$[$#-2]}" -p trim ${firstline}
+# echo sox -t sox - -p ${repcmd}
+# echo sox -t sox - -p ${trackmodcmd}
+# echo sox -t sox - -p ${splicecmd} ${remixcmd}
+# echo sox -t sox - ${output} ${trimcmd}
+#
+# sox -M "${@:1:$[$#-2]}" -p trim ${firstline}| \
+# sox -t sox - -p ${repcmd} | \
+# sox -t sox - -p ${trackmodcmd} | \
+# sox -t sox - -p ${splicecmd} ${remixcmd} | \
+# sox -t sox - ${output} ${trimcmd}
+#else
+# echo sox -M "${@:1:$[$#-2]}" -p trim ${firstline} gain -b
+# echo sox -t sox - -p ${repcmd}
+# echo sox -t sox - -p ${trackmodcmd}
+# echo sox -t sox - -p ${splicecmd} ${remixcmd}
+# echo sox -t sox - -p gain -n
+# echo sox -t sox - ${output} ${trimcmd}
+#
+# sox -M "${@:1:$[$#-2]}" -p trim ${firstline} gain -b | \
+# sox -t sox - -p ${repcmd} | \
+# sox -t sox - -p ${trackmodcmd} | \
+# sox -t sox - -p ${splicecmd} ${remixcmd} | \
+# sox -t sox - -p gain -n | \
+# sox -t sox - ${output} ${trimcmd}
+#fi
diff --git a/subtimes b/subtimes
new file mode 100755
index 0000000..7eda175
--- /dev/null
+++ b/subtimes
@@ -0,0 +1,59 @@
+#!/bin/bash
+
+# subtimes t1 t2
+# -> "t1-t2"
+
+for i in {1..2}
+do
+ inp=$(echo "${@:i:1}" | sed "s/^ *//" | sed "s/ *#.*$//")
+ p1=$(echo "$inp" | tr ":" " " | awk '{print $1}')
+ p2=$(echo "$inp" | tr ":" " " | awk '{print $2}')
+ p3=$(echo "$inp" | tr ":" " " | awk '{print $3}')
+ for j in {1..2}
+ do
+ if [ "$p3" == "" ]
+ then
+ p3=$p2
+ p2=$p1
+ p1="0"
+ fi
+ done
+ p4=$(echo $p3 | tr "." " " | awk '{print $2}')
+ while [ ${#p4} -lt 6 ]
+ do
+ p4=${p4}"0"
+ done
+ f[$i]=$(echo $p4 | sed "s/^0*//" | sed "s/^$/0/")
+ s[$i]=$(echo $p3 | tr "." " " | awk '{print $1}' | sed "s/^0*//" | sed "s/^$/0/")
+ m[$i]=$(echo $p2 | sed "s/^0*//" | sed "s/^$/0/")
+ h[$i]=$(echo $p1 | sed "s/^0*//" | sed "s/^$/0/")
+done
+
+fd=$[${f[1]}-${f[2]}]
+ut=0
+while [ $fd -lt 0 ]
+do
+ ut=$[$ut+1]
+ fd=$[$fd+1000000]
+done
+while [ ${#fd} -lt 6 ]
+do
+ fd="0"$fd
+done
+sd=$[${s[1]}-${s[2]}-$ut]
+ut=0
+while [ $sd -lt 0 ]
+do
+ ut=$[$ut+1]
+ sd=$[$sd+60]
+done
+md=$[${m[1]}-${m[2]}-$ut]
+ut=0
+while [ $md -lt 0 ]
+do
+ ut=$[$ut+1]
+ md=$[$md+60]
+done
+hd=$[${h[1]}-${h[2]}-$ut]
+
+echo $hd":"$md":"$sd"."$fd
diff --git a/timetosample b/timetosample
new file mode 100755
index 0000000..42168fb
--- /dev/null
+++ b/timetosample
@@ -0,0 +1,31 @@
+#!/bin/bash
+
+# timetosample samplerate time
+
+inp=$(echo "$2" | sed "s/^ *//" | sed "s/ *\(#.*\)*$//")
+p1=$(echo "${inp}" | tr ":" " " | awk '{print $1}')
+p2=$(echo "${inp}" | tr ":" " " | awk '{print $2}')
+p3=$(echo "${inp}" | tr ":" " " | awk '{print $3}')
+for i in {1..2}
+do
+ if [ "${p3}" == "" ]
+ then
+ p3="${p2}"
+ p2="${p1}"
+ p1="0"
+ fi
+done
+p4=$(echo "${p3}" | sed "s/^[^.]*\(\.\|$\)//")
+while [ ${#p4} -lt 6 ]
+do
+ p4="${p4}0"
+done
+frc=$(echo "${p4}" | sed "s/^0*//" | sed "s/^$/0/")
+sek=$(echo "${p3}" | sed "s/\..*$//" | sed "s/^0*//" | sed "s/^$/0/")
+min=$(echo "${p2}" | sed "s/^0*//" | sed "s/^$/0/")
+stu=$(echo "${p1}" | sed "s/^0*//" | sed "s/^$/0/")
+
+samp=$[${stu}*60+${min}]
+samp=$[${samp}*60+${sek}]
+samp=$[${samp}*$1+$[$[${frc}*$1 + 500000]/1000000]]
+echo ${samp}
diff --git a/trimpoints b/trimpoints
new file mode 100755
index 0000000..9e2d48e
--- /dev/null
+++ b/trimpoints
@@ -0,0 +1,75 @@
+#!/bin/bash
+
+h=0
+m=0
+s=0
+f=0
+
+read in
+while [ "$in" != "" ]
+do
+ inp=$(echo "$in" | sed "s/^ *//" | sed "s/ *#.*$//")
+ p1=$(echo "$inp" | tr ":" " " | awk '{print $1}')
+ p2=$(echo "$inp" | tr ":" " " | awk '{print $2}')
+ p3=$(echo "$inp" | tr ":" " " | awk '{print $3}')
+ for i in {1..2}
+ do
+ if [ "$p3" == "" ]
+ then
+ p3=$p2
+ p2=$p1
+ p1="0"
+ fi
+ done
+ fn=$(echo $p3 | tr "." " " | awk '{print $2}')
+ while [ ${#fn} -lt 6 ]
+ do
+ fn=$fn"0"
+ done
+ fn=$(echo $fn | sed "s/^0*//" | sed "s/^$/0/")
+ sn=$(echo $p3 | tr "." " " | awk '{print $1}' | sed "s/^0*//" | sed "s/^$/0/")
+ mn=$(echo $p2 | sed "s/^0*//" | sed "s/^$/0/")
+ hn=$(echo $p1 | sed "s/^0*//" | sed "s/^$/0/")
+ fp=$[$fn-$f]
+ ut=0
+ while [ $fp -lt 0 ]
+ do
+ ut=$[$ut+1]
+ fp=$[$fp+1000000]
+ done
+ while [ ${#fp} -lt 6 ]
+ do
+ fp="0"$fp
+ done
+ sp=$[$sn-$s-$ut]
+ ut=0
+ while [ $sp -lt 0 ]
+ do
+ ut=$[$ut+1]
+ sp=$[$sp+60]
+ done
+ mp=$[$mn-$m-$ut]
+ ut=0
+ while [ $mp -lt 0 ]
+ do
+ ut=$[$ut+1]
+ mp=$[$mp+60]
+ done
+ hp=$[$hn-$h-$ut]
+ if [ "$1" == "raw" ]
+ then
+ echo $hp":"$mp":"$sp"."$fp
+ else
+ echo -ne "trim 0 "$hp":"$mp":"$sp"."$fp" "
+ if [ $(echo "$in" | sed "s/^.*#//" | grep -c "^compress") -eq 1 ]
+ then
+ echo -ne "$1 "
+ fi
+ echo -ne ": newfile : "
+ fi
+ f=$fn
+ s=$sn
+ m=$mn
+ h=$hn
+ read in
+done