diff --git a/exec/playmidi.js b/exec/playmidi.js
index 1c998356ed8ffc4fe3592ddfe23bd4ca9f90717c..0bf9c23a22b1b0a5839068632e1bc1f8eed7ad15 100644
--- a/exec/playmidi.js
+++ b/exec/playmidi.js
@@ -27,6 +27,7 @@ const EVENT_TYPE_NOTE_OFF		=0x80
 const EVENT_TYPE_NOTE_ON		=0x90
 
 var filename;
+var tonefilename;
 var debug=false;
 var channel=0;
 var note_start=0;
@@ -66,6 +67,9 @@ for(i=0;i<argc;i++) {
 		case "-c": /* channel */
 			channel=parseInt(argv[++i]);
 			break;
+		case "-t": /* .ton file output */
+			tonefilename=argv[++i];
+			break;
 		default:
 			filename=argv[i];
 			break;
@@ -89,6 +93,13 @@ if(!file.open("rb")) {
 
 file.network_byte_order = true;
 
+var tonefile;
+if(tonefilename) {
+	tonefile=new File(tonefilename);
+	if(!tonefile.open("w"))
+		alert("error " +tonefile.error+ " creating " + tonefilename);
+}
+
 while(!file.eof && !js.terminated) {
 	/* Read chunk */
 	type = file.read(4);
@@ -208,8 +219,11 @@ while(!file.eof && !js.terminated) {
 							if(note_on)
 								break;
 							writeln("\t\tnote on:  " + note);
-							if(delta)
+							if(delta) {
 								sleep(delta*ticks_per_msec());
+								if(tonefile)
+									tonefile.writeln("r " + delta*ticks_per_msec());
+							}
 							note_on=note;
 							break;
 						case EVENT_TYPE_NOTE_OFF:
@@ -224,6 +238,8 @@ while(!file.eof && !js.terminated) {
 								freq*=Math.pow(2,note/12);
 								writeln("\t\tPlaying " + Math.floor(freq) + " for " + delta);
 								beep(freq,delta*ticks_per_msec());
+								if(tonefile)
+									tonefile.writeln(Math.floor(freq) +" "+ delta*ticks_per_msec());
 							}
 							note_on=0;
 							break;