本文整理匯總了Java中javax.sound.midi.Track.size方法的典型用法代碼示例。如果您正苦於以下問題:Java Track.size方法的具體用法?Java Track.size怎麽用?Java Track.size使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在類javax.sound.midi.Track
的用法示例。
在下文中一共展示了Track.size方法的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Java代碼示例。
示例1: computeTrackLength
import javax.sound.midi.Track; //導入方法依賴的package包/類
/**
* Compute the length of a track as it will be written to the
* output stream.
*
* @param track the track to measure
* @param dos a MidiDataOutputStream used for helper method
* @return the length of the track
*/
private int computeTrackLength(Track track, MidiDataOutputStream dos)
{
int count = 0, length = 0, i = 0, eventCount = track.size();
long ptick = 0;
while (i < eventCount)
{
MidiEvent me = track.get(i);
long tick = me.getTick();
length += dos.variableLengthIntLength((int) (tick - ptick));
ptick = tick;
length += me.getMessage().getLength();
i++;
}
return length;
}
示例2: computeTrackLength
import javax.sound.midi.Track; //導入方法依賴的package包/類
/**
* Compute the length of a track as it will be written to the
* output stream.
*
* @param track the track to measure
* @param dos a MidiDataOutputStream used for helper method
* @return the length of the track
*/
private int computeTrackLength(Track track, MidiDataOutputStream dos)
{
int count = 0, length = 0, i = 0, eventCount = track.size();
long ptick = 0;
while (i < eventCount)
{
MidiEvent me = track.get(i);
long tick = me.getTick();
length += dos.variableLengthIntLength((int) (tick - ptick));
ptick = tick;
length += me.getMessage().getLength();
i++;
}
return length;
}
示例3: getMicrosecondsPerQuarterNote
import javax.sound.midi.Track; //導入方法依賴的package包/類
/**
* Gets the number of microseconds per quarter note for a sequence, used to
* determine its BPM.
*
* @param sequence
* @return
*/
private static int getMicrosecondsPerQuarterNote(Sequence sequence) {
// Check all MIDI tracks for MIDI_SET_TEMPO message
for (Track track : sequence.getTracks()) {
for (int i = 0; i < track.size(); i++) {
MidiEvent event = track.get(i);
MidiMessage message = event.getMessage();
if (message instanceof MetaMessage) {
MetaMessage m = (MetaMessage) message;
byte[] data = m.getData();
int type = m.getType();
if (type == MIDI_SET_TEMPO) {
return ((data[0] & 0xff) << 16) | ((data[1] & 0xff) << 8) | (data[2] & 0xff);
}
}
}
}
return 0;
}
示例4: track2polylist
import javax.sound.midi.Track; //導入方法依賴的package包/類
static public Polylist track2polylist(Track track)
{
PolylistBuffer buffer = new PolylistBuffer();
buffer.append(Polylist.list("ticks", track.ticks()));
long len = track.size();
buffer.append(Polylist.list("events", len));
for( int i = 0; i < len; i++ )
{
buffer.append(midiEvent2polylist(i, track.get(i)));
}
return buffer.toPolylist();
}
示例5: findFirstTempo
import javax.sound.midi.Track; //導入方法依賴的package包/類
/**
* Find the first tempo meta message and return the tempo value
* @return
*/
public static float findFirstTempo(Sequence sequence) throws Exception
{
for(Track track : sequence.getTracks())
{
for(int n=0;n<track.size();n++)
{
MidiEvent event = track.get(n);
if(event.getMessage() instanceof MetaMessage
&& ((MetaMessage)event.getMessage()).getType()==0x51)
{
float tempo = new TempoMessage((MetaMessage)event.getMessage()).getBpm();
System.out.println("Found tempomessage "+tempo+" bpm");
return tempo;
}
}
}
throw new Exception("No tempo message found");
}
示例6: calcLastNoteTick
import javax.sound.midi.Track; //導入方法依賴的package包/類
public long calcLastNoteTick()
{
long lastNoteTick = 0;
for (Track t : sequence.getTracks())
{
for (int j = t.size() - 1; j >= 0; j--)
{
MidiEvent evt = t.get(j);
MidiMessage msg = evt.getMessage();
if (msg instanceof ShortMessage)
{
ShortMessage m = (ShortMessage) msg;
if (m.getCommand() == ShortMessage.NOTE_OFF)
{
if (evt.getTick() > lastNoteTick)
{
lastNoteTick = evt.getTick();
}
break;
}
}
}
}
return lastNoteTick;
}
示例7: computeTrackLength
import javax.sound.midi.Track; //導入方法依賴的package包/類
/**
* Compute the length of a track as it will be written to the
* output stream.
*
* @param track the track to measure
* @param dos a MidiDataOutputStream used for helper method
* @return the length of the track
*/
private int computeTrackLength(Track track, MidiDataOutputStream dos)
{
int length = 0, i = 0, eventCount = track.size();
long ptick = 0;
while (i < eventCount)
{
MidiEvent me = track.get(i);
long tick = me.getTick();
length += dos.variableLengthIntLength((int) (tick - ptick));
ptick = tick;
length += me.getMessage().getLength();
i++;
}
return length;
}
示例8: writeToTrack
import javax.sound.midi.Track; //導入方法依賴的package包/類
/**
* Loads and adds the effects to the given midi track
*
* @param track The track to write to
* @param channel The channel to write to
*/
@Override
public void writeToTrack(Track track, int channel) {
long lastEnd = 0;
for (String name : effects.keySet()) {
Sequence sequence = FileUtils.LoadMidiFile("effects/" + name + ".mid");
if (sequence != null) {
int start =// Position effect in track
(int) (QUARTER * tempo.averageBpm / 60.0 * //beats per second
15 * //because 15 seconds
effects.get(name) //i-th word in text
);
if (start < lastEnd)
start = (int) lastEnd;
if (sequence.getMicrosecondLength() / 1000000.0 + TicksInSecs(start, tempo.resolution) > 15.0) {
start -= SecsInTicks(TicksInSecs(start, tempo.resolution) + sequence.getMicrosecondLength() / 1000000.0 - 15, tempo.resolution);
}
float scale = tempo.resolution / (float) sequence.getResolution(); // Make the tempo fit
for (Track t : sequence.getTracks()) {
for (int i = 0; i < t.size(); i++) {
MidiEvent event = t.get(i);
byte[] data = event.getMessage().getMessage();//(command & 0xF0) | (channel & 0x0F)
data[0] += 2; // Keep channel 1 and 2 free
long tick = (long) (event.getTick() * scale) + start;
MidiEvent ev = new MidiEvent(new MidiMessage(data) {
@Override
public Object clone() {
return null;
}
}, tick);
track.add(ev);
if (tick > lastEnd)
lastEnd = tick;
}
}
}
}
}
示例9: tick2index
import javax.sound.midi.Track; //導入方法依賴的package包/類
/**
* Binary search for the event indexes of the track
*
* @param tick tick number of index to be found in array
* @return index in track which is on or after "tick".
* if no entries are found that follow after tick, track.size() is returned
*/
public static int tick2index(Track track, long tick) {
int ret = 0;
if (tick > 0) {
int low = 0;
int high = track.size() - 1;
while (low < high) {
// take the middle event as estimate
ret = (low + high) >> 1;
// tick of estimate
long t = track.get(ret).getTick();
if (t == tick) {
break;
} else if (t < tick) {
// estimate too low
if (low == high - 1) {
// "or after tick"
ret++;
break;
}
low = ret;
} else { // if (t>tick)
// estimate too high
high = ret;
}
}
}
return ret;
}
示例10: main
import javax.sound.midi.Track; //導入方法依賴的package包/類
public static void main(String argv[]) throws Exception {
Sequence seq = new Sequence(Sequence.PPQ, 240);
Track t = seq.createTrack();
log("add 10 events in random order");
t.add(createEvent(10, 5));
t.add(createEvent(0, 0));
t.add(createEvent(10, 6));
t.add(createEvent(11, 8));
t.add(createEvent(10, 7));
t.add(createEvent(0, 1));
t.add(createEvent(0, 2));
t.add(createEvent(15, 9));
t.add(createEvent(0, 3));
t.add(createEvent(1, 4));
// now compare the events.
// The note param will tell us the
// the expected position
long lastTick = 0;
for (int i = 0; i < t.size(); i++) {
MidiEvent ev = t.get(i);
if (ev.getMessage() instanceof ShortMessage) {
ShortMessage msg = (ShortMessage) ev.getMessage();
log(""+i+": ShortMessage at tick "+ev.getTick()
+" with expected position "+msg.getData1());
if (ev.getTick() < lastTick) {
log(" FAILED: last tick is larger than this event's tick!");
failed = true;
}
if (i != msg.getData1()) {
log(" FAILED: Track did not order correctly.");
failed = true;
}
}
}
if (failed) throw new Exception("Test FAILED!");
log("Test passed.");
}
示例11: writeTrack
import javax.sound.midi.Track; //導入方法依賴的package包/類
/**
* Write a track to an output stream.
*
* @param track the track to write
* @param dos a MidiDataOutputStream to write to
* @return the number of bytes written
*/
private int writeTrack(Track track, MidiDataOutputStream dos)
throws IOException
{
int i = 0, elength = track.size(), trackLength;
MidiEvent pme = null;
dos.writeInt(0x4d54726b); // "MTrk"
trackLength = computeTrackLength(track, dos);
dos.writeInt(trackLength);
while (i < elength)
{
MidiEvent me = track.get(i);
int dtime = 0;
if (pme != null)
dtime = (int) (me.getTick() - pme.getTick());
dos.writeVariableLengthInt(dtime);
// FIXME: use running status byte
byte msg[] = me.getMessage().getMessage();
dos.write(msg);
pme = me;
i++;
}
// We're done if the last event was an End of Track meta message.
if (pme != null && (pme.getMessage() instanceof MetaMessage))
{
MetaMessage mm = (MetaMessage) pme.getMessage();
if (mm.getType() == 0x2f) // End of Track message
return trackLength + 8;
}
// Write End of Track meta message
dos.writeVariableLengthInt(0); // Delta time of 0
dos.writeByte(0xff); // Meta Message
dos.writeByte(0x2f); // End of Track message
dos.writeVariableLengthInt(0); // Length of 0
return trackLength + 8 + 4;
}
示例12: writeTrack
import javax.sound.midi.Track; //導入方法依賴的package包/類
/**
* Write a track to an output stream.
*
* @param track the track to write
* @param dos a MidiDataOutputStream to write to
* @return the number of bytes written
*/
private int writeTrack(Track track, MidiDataOutputStream dos)
throws IOException
{
int i = 0, elength = track.size(), trackLength;
MidiEvent pme = null;
dos.writeInt(0x4d54726b); // "MTrk"
trackLength = computeTrackLength(track, dos);
dos.writeInt(trackLength);
while (i < elength)
{
MidiEvent me = track.get(i);
int dtime = 0;
if (pme != null)
dtime = (int) (me.getTick() - pme.getTick());
dos.writeVariableLengthInt(dtime);
// FIXME: use running status byte
byte msg[] = me.getMessage().getMessage();
dos.write(msg);
pme = me;
i++;
}
// We're done if the last event was an End of Track meta message.
if (pme != null && (pme.getMessage() instanceof MetaMessage))
{
MetaMessage mm = (MetaMessage) pme.getMessage();
if (mm.getType() == 0x2f) // End of Track message
return trackLength + 8;
}
// Write End of Track meta message
dos.writeVariableLengthInt(0); // Delta time of 0
dos.writeByte(0xff); // Meta Message
dos.writeByte(0x2f); // End of Track message
dos.writeVariableLengthInt(0); // Length of 0
return trackLength + 8 + 4;
}
示例13: ChangeResolution
import javax.sound.midi.Track; //導入方法依賴的package包/類
/**
* Change resolution (TPQN) and retiming events.
* @param seq Sequence to be processed.
* @param resolution Ticks per quarter note of new sequence.
* @return New sequence with new resolution.
* @throws InvalidMidiDataException throw if MIDI data is invalid.
*/
public static Sequence ChangeResolution(Sequence sourceSeq, int resolution) throws InvalidMidiDataException
{
// sequence must be tick-based
if (sourceSeq.getDivisionType() != Sequence.PPQ)
{
throw new UnsupportedOperationException("SMPTE is not supported.");
}
Sequence seq = new Sequence(sourceSeq.getDivisionType(), resolution);
// process all input tracks
for (int trackIndex = 0; trackIndex < sourceSeq.getTracks().length; trackIndex++)
{
Track sourceTrack = sourceSeq.getTracks()[trackIndex];
Track track = seq.createTrack();
// process all events
double timingRate = (double) resolution / sourceSeq.getResolution();
for (int eventIndex = 0; eventIndex < sourceTrack.size(); eventIndex++)
{
MidiEvent sourceEvent = sourceTrack.get(eventIndex);
MidiEvent event = new MidiEvent(sourceEvent.getMessage(), Math.round(sourceEvent.getTick() * timingRate));
track.add(event);
}
}
// if the target resolution is shorter than source resolution,
// events at different timing might be located at the same timing.
// As a result, there might be zero-length note and/or
// same control changes at the same timing.
//
// Probably, they should be removed for better conversion.
// I do not remove them anyway at the moment,
// because it does not cause any major problems.
return seq;
}
示例14: setSequence
import javax.sound.midi.Track; //導入方法依賴的package包/類
public void setSequence(Sequence sequence) {
this.sequence = sequence;
// calculate length in beats and notes count
Track track = getTrack();
notesCount = 0;
long start = -1;
long end = -1;
int size = track.size();
if (size > 0) {
for (int i = 0; i < size; i++) {
MidiEvent ev = track.get(i);
MidiMessage msg = ev.getMessage();
if ((msg instanceof ShortMessage) && (((ShortMessage)msg).getCommand() == ShortMessage.NOTE_ON)) {
notesCount++;
if (start == -1) {
start = ev.getTick();
}
end = ev.getTick();
}
}
int resolution = sequence.getResolution();
long b1 = (start + (resolution/4)) / resolution; // +res/2: allow notes to start a bit earlier but still be counted to other bar
long b2 = (end - (resolution/4)) / resolution; // - res/2: ...
lengthInBeats = (int)(b2 - b1 + 1);
length = lengthInBeats * resolution;
} else {
length = 0;
}
}
示例15: findNearest
import javax.sound.midi.Track; //導入方法依賴的package包/類
private long findNearest(long tick, int[] v) {
if (notesCount == 0) return tick;
Track track = getTrack();
int size = track.size();
int shift = 4 * sequence.getResolution(); // pattern starts at 4 * ppq
long t = tick % length; // tick inside pattern, to be (de-)quantized
t = tick + shift;
int i = 0;
long nearest = -1;
v[0] = 100;
long tt = t;
MidiEvent ev;
boolean isNote;
do {
ev = track.get(i++);
tt = ev.getTick();
MidiMessage msg = ev.getMessage();
isNote = (msg instanceof ShortMessage) && (((ShortMessage)msg).getCommand() == ShortMessage.NOTE_ON);
if ((isNote) && ( ( tt < t ) || ( (tt-t) < (t-nearest) ) ) ) {
nearest = tt;
v[0] = ((ShortMessage)msg).getData2();
}
} while ((i < size) && ((!isNote) || (tt < t))); // stops after first note imediately following after (tt<t) no longer is true
return nearest - shift;
}