package org.open2jam.parsers;
public class Event implements Comparable<Event> {
public enum Channel {
NONE, //Channel to /dev/null
//Player 1
NOTE_1, NOTE_2, NOTE_3, NOTE_4, NOTE_5, NOTE_6, NOTE_7, NOTE_SC,
//Player 2
NOTE_8, NOTE_9, NOTE_10, NOTE_11, NOTE_12, NOTE_13, NOTE_14, NOTE_SC2,
TIME_SIGNATURE, // This channel will hold all the time signature changes
BPM_CHANGE, // This channel will hold all the bpm changes
STOP, // This channel will hold all the stops
MEASURE, // This will be used when the velocity tree is constructed
BGA,
AUTO_PLAY(true);// Autoplay, used by the background music/sounds
private boolean autoplay;
private Channel() {
this.autoplay = false;
}
private Channel(boolean auto) {
this.autoplay = auto;
}
public boolean isAutoplay() {
return autoplay;
}
public void enableAutoplay() {
this.autoplay = true;
}
public void disableAutoplay() {
this.autoplay = false;
}
public static Channel[] playableChannels() {
Channel[] playable = {
NOTE_1, NOTE_2, NOTE_3, NOTE_4, NOTE_5, NOTE_6, NOTE_7
};
return playable;
}
public static Channel mirrorChannel(Channel c) {
switch(c) {
case NOTE_1: return NOTE_7;
case NOTE_2: return NOTE_6;
case NOTE_3: return NOTE_5;
case NOTE_4: return NOTE_4;
case NOTE_5: return NOTE_3;
case NOTE_6: return NOTE_2;
case NOTE_7: return NOTE_1;
default: return c;
}
}
}
/**
* wrapper for the sound sample
*
* contains the sample id for the SoundManager volume and pan
*/
public class SoundSample {
public final int sample_id;
public final float volume;
public final float pan;
boolean bgm = false;
public SoundSample(int sample, float vol, float pan) {
this.sample_id = sample;
this.volume = vol;
this.pan = pan;
}
public void toBGM() {
this.bgm = true;
}
public boolean isBGM() {
return bgm;
}
}
public enum Flag {
NONE, HOLD, RELEASE, ROLL, MINE, LIFT
};
private Channel channel;
private final int measure;
private final double position;
private final double value;
private final double offset;
Flag flag;
private final SoundSample sound_sample;
/**
* The time to hit
*/
private double time;
public Event(Channel channel, int measure, double position,
double value, Flag flag) {
this.channel = channel;
this.measure = measure;
this.position = position;
this.value = value;
this.flag = flag;
this.sound_sample = new SoundSample((int) value, 1, 0);
this.offset = 0;
}
public Event(Channel channel, int measure, double position,
double value, Flag flag, float vol, float pan) {
this.channel = channel;
this.measure = measure;
this.position = position;
this.value = value;
this.flag = flag;
this.sound_sample = new SoundSample((int) value, vol, pan);
this.offset = 0;
}
public Event(Channel channel, int measure, double position,
double value, double offset, Flag flag) {
this.channel = channel;
this.measure = measure;
this.position = position;
this.value = value;
this.flag = flag;
this.sound_sample = new SoundSample((int) value, 1, 0);
this.offset = offset;
}
public Event(Channel channel, int measure, double position,
double value, double offset, Flag flag, float vol, float pan) {
this.channel = channel;
this.measure = measure;
this.position = position;
this.value = value;
this.flag = flag;
this.sound_sample = new SoundSample((int) value, vol, pan);
this.offset = offset;
}
public int compareTo(Event e) {
double a = measure + position;
double b = e.getMeasure() + e.getPosition();
if (a < b) {
return -1;
} else if (a == b) {
if (channel == Channel.STOP) {
return 1;
}
return 0;
} else {
return 1;
}
}
public void setChannel(Channel chan) {
this.channel = chan;
}
public Channel getChannel() {
return channel;
}
public int getMeasure() {
return measure;
}
public double getPosition() {
return position;
}
public double getTotalPosition() {
return measure+position;
}
public Flag getFlag() {
return flag;
}
public double getValue() {
return value;
}
public SoundSample getSample() {
return sound_sample;
}
public double getOffset() {
return offset;
}
public void setTime(double t) {
this.time = t;
}
public double getTime() {
return time;
}
@Override
public String toString() {
String s = "";
s += "Event (" + this.flag + ", " + this.value + ")\n";
s += "\tCHANNEL: " + this.channel + " @ " + (this.measure + this.position) + "\n";
s += this.offset != 0f ? "\tOFFSET: " + this.offset + "\n" : "";
s += "\tTIME: " + this.time;
return s;
}
}