code: func (e *Event) String() string {
  	if e == nil {
  		return ""
  	}
  	var k string
  	var ok bool
  	if k, ok = EventMap[e.MsgType]; !ok {
  		k = fmt.Sprintf("%#X", e.MsgType)
  	}
  	out := fmt.Sprintf("Ch %d @ %d \t%s", e.MsgChan, e.TimeDelta, k)
  	if e.Velocity > 0 {
  		out += fmt.Sprintf(" Vel: %d", e.Velocity)
  	}
  	if e.MsgType == EventByteMap["NoteOn"] || e.MsgType == EventByteMap["NoteOff"] {
  		out += fmt.Sprintf(" Note: %s", NoteToName(int(e.Note)))
  	}
  	if e.Cmd != 0 {
  		out = fmt.Sprintf("Ch %d @ %d \t%s", e.MsgChan, e.TimeDelta, MetaCmdMap[e.Cmd])
  		switch e.Cmd {
  		case MetaByteMap["Sequence/Track name"]:
  			out = fmt.Sprintf("%s -> %s", out, e.SeqTrackName)
  		case MetaByteMap["Time Signature"]:
  			out = fmt.Sprintf("%s -> %s", out, e.TimeSignature)
  		case MetaByteMap["Copyright"]:
  			out = fmt.Sprintf("%s -> %s", out, e.Copyright)
  		case MetaByteMap["Tempo"]:
  			out = fmt.Sprintf("%s -> %d", out, e.Bpm)
  		}
  	}
  
  	return out
  }
docs: // String implements the stringer interface