/*
* JFugue, an Application Programming Interface (API) for Music Programming
* http://www.jfugue.org
*
* Copyright (C) 2003-2014 David Koelle
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jfugue.temporal;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jfugue.parser.Parser;
import org.jfugue.parser.ParserListener;
import org.jfugue.theory.Chord;
import org.jfugue.theory.Note;
public class TemporalPLP extends Parser implements ParserListener
{
private TemporalEventManager eventManager;
private TemporalEvents events;
public TemporalPLP() {
super();
this.events = new TemporalEvents();
this.eventManager = new TemporalEventManager();
}
public Map<Long, List<TemporalEvent>> getTimeToEventMap() {
return eventManager.getTimeToEventMap();
}
/* ParserListener Events */
@Override
public void beforeParsingStarts() {
this.eventManager.reset();
}
@Override
public void afterParsingFinished() {
this.eventManager.finish();
}
@Override
public void onTrackChanged(byte track) {
this.eventManager.setCurrentTrack(track);
this.eventManager.addRealTimeEvent(events.new TrackEvent(track));
}
@Override
public void onLayerChanged(byte layer) {
this.eventManager.setCurrentLayer(layer);
this.eventManager.addRealTimeEvent(events.new LayerEvent(layer));
}
@Override
public void onInstrumentParsed(byte instrument) {
this.eventManager.addRealTimeEvent(events.new InstrumentEvent(instrument));
}
@Override
public void onTempoChanged(int tempoBPM) {
this.eventManager.setTempo(tempoBPM);
this.eventManager.addRealTimeEvent(events.new TempoEvent(tempoBPM));
}
@Override
public void onKeySignatureParsed(byte key, byte scale) {
this.eventManager.addRealTimeEvent(events.new KeySignatureEvent(key, scale));
}
@Override
public void onTimeSignatureParsed(byte numerator, byte powerOfTwo) {
this.eventManager.addRealTimeEvent(events.new TimeSignatureEvent(numerator, powerOfTwo));
}
@Override
public void onBarLineParsed(long time) {
this.eventManager.addRealTimeEvent(events.new BarEvent(time));
}
@Override
public void onTrackBeatTimeBookmarked(String timeBookmarkID) {
this.eventManager.addTrackTickTimeBookmark(timeBookmarkID);
}
@Override
public void onTrackBeatTimeBookmarkRequested(String timeBookmarkID) {
double time = this.eventManager.getTrackBeatTimeBookmark(timeBookmarkID);
this.eventManager.setTrackBeatTime(time);
}
@Override
public void onTrackBeatTimeRequested(double time) {
this.eventManager.setTrackBeatTime(time);
}
@Override
public void onPitchWheelParsed(byte lsb, byte msb) {
this.eventManager.addRealTimeEvent(events.new PitchWheelEvent(lsb, msb));
}
@Override
public void onChannelPressureParsed(byte pressure) {
this.eventManager.addRealTimeEvent(events.new ChannelPressureEvent(pressure));
}
@Override
public void onPolyphonicPressureParsed(byte key, byte pressure) {
this.eventManager.addRealTimeEvent(events.new PolyphonicPressureEvent(key, pressure));
}
@Override
public void onSystemExclusiveParsed(byte... bytes) {
this.eventManager.addRealTimeEvent(events.new SystemExclusiveEvent(bytes));
}
@Override
public void onControllerEventParsed(byte controller, byte value) {
this.eventManager.addRealTimeEvent(events.new ControllerEvent(controller, value));
}
@Override
public void onLyricParsed(String lyric) {
this.eventManager.addRealTimeEvent(events.new LyricEvent(lyric));
}
@Override
public void onMarkerParsed(String marker) {
this.eventManager.addRealTimeEvent(events.new MarkerEvent(marker));
}
@Override
public void onFunctionParsed(String id, Object message) {
this.eventManager.addRealTimeEvent(events.new UserEvent(id, message));
}
@Override
public void onNoteParsed(Note note) {
this.eventManager.addRealTimeEvent(events.new NoteEvent(note));
}
@Override
public void onChordParsed(Chord chord) {
this.eventManager.addRealTimeEvent(events.new ChordEvent(chord));
}
private void delay(long millis) {
try {
Thread.sleep(millis);
} catch (Exception e) {
// An exception? Ain't no one got time for that!
}
}
public void parse() {
fireBeforeParsingStarts();
long oldTime = 0;
Set<Long> times = this.eventManager.getTimeToEventMap().keySet();
for (long time : times) {
delay(time - oldTime);
oldTime = time;
for (TemporalEvent event : this.eventManager.getTimeToEventMap().get(time)) {
event.execute(this);
}
}
fireAfterParsingFinished();
}
}