2014-06-30 04:17:04 +02:00
|
|
|
/*
|
|
|
|
* opsu! - an open-source osu! client
|
2015-01-16 18:05:44 +01:00
|
|
|
* Copyright (C) 2014, 2015 Jeffrey Han
|
2014-06-30 04:17:04 +02:00
|
|
|
*
|
|
|
|
* opsu! is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* opsu! is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with opsu!. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package itdelatrisu.opsu;
|
|
|
|
|
2014-07-09 19:36:42 +02:00
|
|
|
import org.newdawn.slick.util.Log;
|
|
|
|
|
2014-06-30 04:17:04 +02:00
|
|
|
/**
|
|
|
|
* Data type representing a timing point.
|
|
|
|
*/
|
|
|
|
public class OsuTimingPoint {
|
2014-07-09 19:36:42 +02:00
|
|
|
/**
|
|
|
|
* Timing point start time/offset (in ms).
|
|
|
|
*/
|
|
|
|
private int time = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Time per beat (in ms). [NON-INHERITED]
|
|
|
|
*/
|
|
|
|
private float beatLength = 0f;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Slider multiplier. [INHERITED]
|
|
|
|
*/
|
|
|
|
private int velocity = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Beats per measure.
|
|
|
|
*/
|
|
|
|
private int meter = 4;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sound sample type.
|
|
|
|
*/
|
|
|
|
private byte sampleType = 1;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Custom sound sample type.
|
|
|
|
*/
|
|
|
|
private byte sampleTypeCustom = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Volume of samples. [0, 100]
|
|
|
|
*/
|
|
|
|
private int sampleVolume = 100;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Whether or not this timing point is inherited.
|
|
|
|
*/
|
|
|
|
private boolean inherited = false;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Whether or not Kiai Mode is active.
|
|
|
|
*/
|
|
|
|
private boolean kiai = false;
|
2014-06-30 04:17:04 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Constructor.
|
2014-07-09 19:36:42 +02:00
|
|
|
* @param line the line to be parsed
|
|
|
|
*/
|
|
|
|
public OsuTimingPoint(String line) {
|
|
|
|
// TODO: better support for old formats
|
|
|
|
String[] tokens = line.split(",");
|
|
|
|
try {
|
|
|
|
this.time = (int) Float.parseFloat(tokens[0]); // rare float
|
|
|
|
this.meter = Integer.parseInt(tokens[2]);
|
|
|
|
this.sampleType = Byte.parseByte(tokens[3]);
|
|
|
|
this.sampleTypeCustom = Byte.parseByte(tokens[4]);
|
|
|
|
this.sampleVolume = Integer.parseInt(tokens[5]);
|
|
|
|
// this.inherited = (Integer.parseInt(tokens[6]) == 1);
|
|
|
|
this.kiai = (Integer.parseInt(tokens[7]) == 1);
|
|
|
|
} catch (ArrayIndexOutOfBoundsException e) {
|
|
|
|
Log.debug(String.format("Error parsing timing point: '%s'", line));
|
|
|
|
}
|
|
|
|
|
|
|
|
// tokens[1] is either beatLength (positive) or velocity (negative)
|
|
|
|
float beatLength = Float.parseFloat(tokens[1]);
|
|
|
|
if (beatLength > 0)
|
|
|
|
this.beatLength = beatLength;
|
|
|
|
else {
|
|
|
|
this.velocity = (int) beatLength;
|
|
|
|
this.inherited = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the timing point start time/offset.
|
|
|
|
* @return the start time (in ms)
|
|
|
|
*/
|
|
|
|
public int getTime() { return time; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the beat length. [NON-INHERITED]
|
|
|
|
* @return the time per beat (in ms)
|
|
|
|
*/
|
|
|
|
public float getBeatLength() { return beatLength; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the slider multiplier. [INHERITED]
|
|
|
|
*/
|
|
|
|
public float getSliderMultiplier() { return velocity / -100f; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the meter.
|
|
|
|
* @return the number of beats per measure
|
|
|
|
*/
|
|
|
|
public int getMeter() { return meter; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the sample type.
|
|
|
|
* <ul>
|
|
|
|
* <li>0: none
|
|
|
|
* <li>1: normal
|
|
|
|
* <li>2: soft
|
|
|
|
* <li>3: drum
|
|
|
|
* </ul>
|
|
|
|
*/
|
|
|
|
public byte getSampleType() { return sampleType; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the custom sample type.
|
|
|
|
* <ul>
|
|
|
|
* <li>0: default
|
|
|
|
* <li>1: custom 1
|
|
|
|
* <li>2: custom 2
|
|
|
|
* </ul>
|
|
|
|
*/
|
|
|
|
public byte getSampleTypeCustom() { return sampleTypeCustom; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the sample volume.
|
|
|
|
* @return the sample volume [0, 1]
|
|
|
|
*/
|
|
|
|
public float getSampleVolume() { return sampleVolume / 100f; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns whether or not this timing point is inherited.
|
|
|
|
* @return the inherited
|
|
|
|
*/
|
|
|
|
public boolean isInherited() { return inherited; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns whether or not Kiai Time is active.
|
|
|
|
* @return true if active
|
2014-06-30 04:17:04 +02:00
|
|
|
*/
|
2014-07-09 19:36:42 +02:00
|
|
|
public boolean isKiaiTimeActive() { return kiai; }
|
2014-06-30 04:17:04 +02:00
|
|
|
}
|