public void message(Bead message) {
		//TODO check position, because it may be that we've looped
		
		
		
		if (timePoints.hasNext()) {
			//work out how long until the next event
			timeGap = nextTimePoint;			//position is in ms now
			position = nextTimePoint; //and move to this point
			nextTimePoint = timePoints.next()[0];
			timeGap = Math.max(1, nextTimePoint - timeGap);
			if(!rateDecay && message instanceof Clock) {
				Clock clock = (Clock)message;
				float untilNextTick = clock.getIntervalEnvelope().getValue(); 
				float timeLeft = Math.max(0, nextTimePoint - (float)position);
				rateEnvelope.setValue(timeLeft / untilNextTick);
			}  
		}
	}