#!/usr/bin/tclsh
proc my_exit {val} {
	if {$tcl_platform(platform) == "windows"} {
		puts "Exiting with value $val - press return to continue"
		gets stdin
	}
	exit $val
}

if {[catch {package require tclmidi}]} {
	puts stderr {Can't find tclmidi package}
	my_exit 1
}

proc Usage {} {
	puts stderr {Usage: midtotcl [-playable] [filename]}
}

if {$argc > 3} {
	Usage
	my_exit 1
}

set playable 0
set fname stdin
set f stdin

if {$tcl_platform(platform) != "windows"} {
	for {set i 0} {$i < $argc} {incr i} {
		switch -- [lindex $argv $i] {
		"-?" -
		"-h" -
		"-help" {
			Usage
			my_exit 1
		}
		"-playable" -
		"-p" {
			set playable 1
		}
		default {
			if {$fname != "stdin"} {
				Usage
				my_exit 1
			} else {
				set fname [lindex $argv $i]
				set f [open $fname r]
			}
		}
		}
	}
	set of stdout
	set dest_file /tmp/foo
} else {
	puts -nonewline "MIDI file to convert: "
	flush stdout
	set fname [gets stdin]
	regsub -all {\\} $fname / newname
	set fname $newname
	if {[catch {open $fname r} f]} {
		puts "couldn't open $fname: $f"
		my_exit 1
	}
	puts -nonewline "Name of TCL script to create: "
	flush stdout
	set ofname [gets stdin]
	regsub -all {\\} $ofname / newname
	set ofname $newname
	if {[catch {open $ofname w} of]} {
		puts "couldn't open $ofname: $of"
		my_exit 1
	}
	puts -nonewline "Name of file TCL script will create when run: "
	flush stdout
	set dest_file [gets stdin]
	regsub -all {\\} $dest_file / newname
	set dest_file $newname
}

set mf [midiread $f]
midirewind $mf

set config [midiconfig $mf tracks division format]
set tracks [lindex [lindex $config 0] 1]
set division [lindex [lindex $config 1] 1]
set format [lindex [lindex $config 2] 1]

puts $of {#!/usr/bin/tclsh}
puts $of "\# tclmidi commands for midi file $fname"
puts $of ""
puts $of "proc my_exit {val} {"
puts $of "	if {\$tcl_platform(platform) == \"windows\"} {"
puts $of "		puts \"Exiting with value \$val - press return to continue\""
puts $of "		gets stdin"
puts $of "	}"
puts $of "	exit \$val"
puts $of "}"
puts $of ""
puts $of "if {\[catch {package require tclmidi}\]} {"
puts $of "	puts stderr {Can't find tclmidi package}"
puts $of "	my_exit 1"
puts $of "}"
puts $of ""
puts $of {set mf [midimake]}
puts $of "midiconfig \$mf {tracks $tracks} {division $division} {format $format}"

for {set i 0} {$i < $tracks} {incr i} {
	puts $of ""
	puts $of "\# track $i"
	while {[set event [midiget $mf $i next]] != "EOT"} {
		puts $of "midiput \$mf $i {$event}"
	}
}

puts $of ""
if {$playable} {
	puts $of {# play song}
	puts $of {set dev [mididevice /dev/midi0]}
	puts $of {midiplay $dev $mf}
	puts $of {midiwait $dev}
	puts $of {midistop $dev}
	puts $of {mididevice $dev close}
} else {
	puts $of {# write midi file}
	puts $of "if {\[string compare $dest_file \"stdout\"\] == 0} {"
	puts $of "	set df stdout"
	puts $of "} else {"
	puts $of "	if {\[catch {open $dest_file w} df\]} {"
	puts $of "		puts stderr \"couldn't open $dest_file: \$df\""
	puts $of "		my_exit 1"
	puts $of "	}"
	puts $of "}"
	puts $of "midiwrite \$df \$mf"
	puts $of "flush \$df"
}

midifree $mf
close $f
flush $of
close $of
