RealTimeSequencer.java revision 2362
0N/A private final static boolean DEBUG_PUMP = false;
0N/A private final static boolean DEBUG_PUMP_ALL = false;
0N/A private boolean autoConnect = false;
0N/A private boolean doAutoConnectAtNextOpen = false;
0N/A throws InvalidMidiDataException {
0N/A if (Printer.trace) Printer.trace("<< RealTimeSequencer: setSequence(" + sequence +") completed");
0N/A public synchronized void setSequence(InputStream stream) throws IOException, InvalidMidiDataException {
0N/A Sequence seq = MidiSystem.getSequence(stream); // can throw IOException, InvalidMidiDataException
0N/A if (Printer.trace) Printer.trace("<< RealTimeSequencer: setSequence(" + stream +") completed");
0N/A public void startRecording() {
0N/A public void stopRecording() {
0N/A public boolean isRecording() {
0N/A synchronized(recordingTracks) {
0N/A synchronized(recordingTracks) {
0N/A public float getTempoInBPM() {
0N/A public float getTempoInMPQ() {
0N/A if (needCaching()) {
0N/A return (float) cacheTempoMPQ;
if (needCaching()) {
if (needCaching()) {
public float getTempoFactor() {
if (needCaching()) {
return cacheTempoFactor;
public long getTickLength() {
public synchronized long getTickPosition() {
public long getMicrosecondLength() {
public long getMicrosecondPosition() {
synchronized (tempoCache) {
if (Printer.trace) Printer.trace(">> RealTimeSequencer: setMicrosecondPosition("+microseconds+") ");
synchronized(tempoCache) {
return masterSyncMode;
return returnedModes;
return slaveSyncMode;
return returnedModes;
protected int getTrackCount() {
synchronized(metaEventListeners) {
synchronized(metaEventListeners) {
synchronized(controllerEventListeners) {
boolean flag = false;
flag = true;
if (!flag) {
synchronized(controllerEventListeners) {
boolean flag = false;
flag = true;
if (!flag) {
public long getLoopStartPoint() {
return loopStart;
public long getLoopEndPoint() {
return loopEnd;
public int getLoopCount() {
return loopCount;
if (doAutoConnectAtNextOpen) {
private void doAutoConnect() {
} catch (Exception e) {
} catch (Exception e) {
} catch (Exception e) {}
private synchronized void propagateCaches() {
private synchronized void setCaches() {
protected synchronized void implClose() {
if (Printer.err) Printer.err("RealTimeSequencer.implClose() called, but playThread not instanciated!");
super.implClose();
running = false;
} catch (Exception e) {}
protected void implStart() {
if (Printer.err) Printer.err("RealTimeSequencer.implStart() called, but playThread not instanciated!");
if (!running) {
running = true;
protected void implStop() {
if (Printer.err) Printer.err("RealTimeSequencer.implStop() called, but playThread not instanciated!");
recording = false;
if (running) {
running = false;
private boolean needCaching() {
return null;
return tempoCache;
return new boolean[desiredSize];
return newArray;
return array;
protected boolean hasReceivers() {
return new SequencerReceiver();
protected boolean hasTransmitters() {
return new SequencerTransmitter();
private SequencerTransmitter() {
if (recording) {
synchronized(tempoCache) {
private RealTimeSequencerInfo() {
private class ControllerListElement {
int [] controllers;
controllers[i] = i;
private void addControllers(int[] c) {
if (c==null) {
controllers[i] = i;
int elements;
boolean flag = false;
if (c[i] == controllers[j]) {
flag = true;
if (!flag) {
private void removeControllers(int[] c) {
if (c==null) {
boolean flag = false;
if (controllers[i] == c[j]) {
flag = true;
if (!flag){
private int[] getControllers() {
return null;
c[i] = controllers[i];
static class RecordingTrack {
private int channel;
synchronized(recordingTracks) {
return current;
return null;
synchronized(recordingTracks) {
return null;
boolean interrupted = false;
boolean isPumping = false;
PlayThread() {
return dataPump;
synchronized void start() {
running = true;
synchronized(lock) {
synchronized void stop() {
while (isPumping) {
synchronized(lock) {
void playThreadImplStop() {
running = false;
synchronized(lock) {
void close() {
interrupted = true;
synchronized(lock) {
public void run() {
while (!interrupted) {
boolean EOM = false;
if (wasRunning) {
if (EOM) {
synchronized (lock) {
isPumping = false;
private class DataPump {
private int resolution;
private float divisionType;
private long lastTick;
private boolean needReindex = false;
DataPump() {
init();
synchronized void init() {
if (running) {
notesOff(false);
needReindex = true;
if (!hasCachedTempo()) {
long getTickPos() {
return lastTick;
boolean hasCachedTempo() {
float getTempoMPQ() {
return currTempo;
float getTempoFactor() {
return tempoFactor;
synchronized void muteSoloChanged() {
if (running) {
init();
needReindex = true;
synchronized void resetLoopCount() {
void clearNoteOnCache() {
done++;
if (doControllers) {
done++;
private boolean[] makeDisabledArray() {
return null;
boolean[] solo;
boolean[] mute;
synchronized(RealTimeSequencer.this) {
boolean hasSolo = false;
if (solo[i]) {
hasSolo = true;
if (hasSolo) {
return newTrackDisabled;
done++;
synchronized(RealTimeSequencer.this) {
|| !oldDisabled[i])
&& newDisabled[i]) {
&& oldDisabled[i]
&& !newDisabled[i]) {
long startTick,
long endTick,
boolean doReindex,
byte[][] tempArray) {
if (DEBUG_PUMP) Printer.println(" chaseEvents: setting trackReadPos["+trackNum+"] = "+trackReadPos[trackNum]);
if (DEBUG_PUMP) Printer.println(" chaseTrackEvents track "+trackNum+": sent "+numControllersSent+" controllers.");
|| (!trackDisabled[t])) {
private long getCurrentTimeMillis() {
* ((double) divisionType)
* ((double) resolution))
return (long) dTick;
return (long) dMillis;
if (DEBUG_PUMP) Printer.println(" reindexTrack: setting trackReadPos["+trackNum+"] = "+trackReadPos[trackNum]);
boolean changesPending = false;
changesPending = true;
return changesPending;
synchronized boolean pump() {
long currMillis;
boolean changesPending = false;
boolean doLoop = false;
boolean EOM = false;
changesPending = false;
if (needReindex) {
if (DEBUG_PUMP) Printer.println("Need to re-index at "+currMillis+" millis. TargetTick="+targetTick);
needReindex = false;
doLoop = true;
readPos++;
if (!disabled ||
if (DEBUG_PUMP_ALL) {
} catch(Exception e) {
if (e instanceof ArrayIndexOutOfBoundsException) {
needReindex = true;
changesPending = true;
if (changesPending) {
if (doLoop
&& !changesPending
&& EOM)) {
needReindex = false;
changesPending = false;
doLoop = false;
EOM = false;
} while (changesPending);
return EOM;