package core;
import java.io.Serializable;
import java.util.Calendar;
/* Measure est une transposition du concept de mesure en musique classique
* Attention! Cette classe n'est pas synchronis�e avec la fonction draw() de processing
* Elle compte elle-m�me le temps via la fonction "tic"
* Le sampling est sensible � la dur�e de la mesure
* Une mesure lente est moins pr�cise temporellement qu'une mesure courte
* */
public class Measure implements Serializable {
public static final int sampling = 192000; // sampling: this means there are 192000 slots in one beat, not more. getRelativeCurrent will always returns a value between 0 and sampling
private long absoluteStartTime;
private long startTime;
private long current;
private int duration; // dur�e d'une mesure
private int count; // sert � compter le nombre de mesures depuis le d�marrage et � savoir si un mouseGesture dure plus d'une mesure
private boolean indexed = false;
private int index; // sert � identifier chaque mesure depuis le d�marrage
private int divisions;
/* The length of a beat is its duration in frames
* */
public Measure(int durationInMillisecond, boolean enableMeasureIndexing) {
this.absoluteStartTime = System.currentTimeMillis();
this.startTime = this.absoluteStartTime;
this.current = 0;
this.duration = durationInMillisecond;
this.indexed = enableMeasureIndexing;
this.index = 0;
this.divisions = 4;
}
private void tic() {
long cmillis = System.currentTimeMillis();
current = cmillis - this.startTime;
if (current >= duration) {
this.count++;
if (this.indexed) { this.index++; }
this.startTime = cmillis;
/*
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(cmillis);
java.util.Date date = cal.getTime();
System.out.println(date);
*/
}
while (current >= duration) { current -= duration; }
}
public float getRelativeNow() {
tic();
return (float)current/(float)duration;
}
public int getCount() {
tic();
return count;
}
public int getIndex() {
tic();
return index;
}
public int getSamplingFor(long millis) {
long cmillis = millis - absoluteStartTime;
while (cmillis >= duration) { cmillis-=duration; }
return (int) (((float)cmillis/(float)duration)*(float)sampling);
}
public int getSampledNow() {
tic();
return (int) (((float)current/(float)duration)*(float)sampling);
}
public int getSampledBeforeNow() {
int n = getSampledNow();
n--;
if (n < 0) { n = duration-1; }
return n;
}
public int getDivisions() {
return divisions;
}
public int getDuration() {
return duration;
}
}