code: public static TimecodeBuilder fromSMPTE(String smpte)
  	{
  		final boolean dropFrame = smpte.indexOf(';') != -1;
  		final boolean negative = smpte.charAt(0) == '-';
  
  		final String[] parts = smpte.replace(';', ':').split(":");
  
  		if (parts.length > 5 || parts.length < 4)
  			throw new IllegalArgumentException("Field mismatch: expected 4 or 5 ([dd:]hh:mm:ss:ff) but got " + parts.length);
  
  		// next field pointer
  		int i = 0;
  
  		final int days;
  		// If there is a days component, parse that (N.B. this may be the first field, make sure we don't parse as a negative number)
  		if (parts.length == 5)
  			days = Math.abs(Integer.parseInt(parts[i++]));
  		else
  			days = 0;
  
  		// N.B. if there is no days component this could be the first field, make sure we don't parse as a negative number
  		final int hours = Math.abs(Integer.parseInt(parts[i++]));
  		final int minutes = Integer.parseInt(parts[i++]);
  		final int seconds = Integer.parseInt(parts[i++]);
  		final int frames = Integer.parseInt(parts[i++]);
  
  		return new TimecodeBuilder()
  				       .withNegative(negative)
  				       .withDropFrame(dropFrame)
  				       .withDays(days)
  				       .withHours(hours)
  				       .withMinutes(minutes)
  				       .withSeconds(seconds)
  				       .withFrames(frames);
  	}
docs: Part a Timecode encoded in the SMPTE style (<code>[dd:]hh:mm:ss:ff</code> - or <code>[dd:]hh:mm:ss;ff</code> for
  drop-frame
  timecode)
  
  @param smpte
  the SMPTE-encoded timecode
  
  @return a parsed timecode object
  
  @throws RuntimeException
  if parsing fails