/*
* JFugue - API for Music Programming
* Copyright (C) 2003-2008 David Koelle
*
* http://www.jfugue.org
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
package org.jfugue;
/**
* This class is used to transform a pattern. Extend this class to create your
* own PatternTransformer, which listens to parser events and can modify the
* events that are fired off by the parser. Some sample PatternTransformer
* subclasses are packaged with JFugue; refer to those to see examples of
* transformers in action.
*
* This feature is covered in detail in The Complete Guide to JFugue.
*
* @see org.jfugue.extras.DiatonicIntervalPatternTransformer
* @see org.jfugue.extras.DurationPatternTransformer
* @see org.jfugue.extras.IntervalPatternTransformer
* @see org.jfugue.extras.ReversePatternTransformer
* @author David Koelle
* @version 2.0
*/
public class PatternTransformer implements ParserListener {
/**
* Contains the pattern to return at the end of the transformation. As of
* version 4.0, this variable is private. Use the protected methods
* getReturnPattern() and setReturnPattern() to access the return pattern.
*/
private Pattern returnPattern;
/**
* Returns the pattern that the transformer is modifying
*
* @version 4.0
*/
protected Pattern getReturnPattern() {
return returnPattern;
}
/**
* Sets the pattern that the transformer is modifying
*
* @version 4.0
*/
protected void setReturnPattern(Pattern pattern) {
this.returnPattern = pattern;
}
/**
* Transforms the pattern, according to the event method that you have
* presumably extended.
*/
public Pattern transform(Pattern p) {
setReturnPattern(new Pattern());
MusicStringParser parser = new MusicStringParser();
parser.addParserListener(this);
try {
parser.parse(p);
} catch (JFugueException e) {
e.printStackTrace();
}
return getReturnPattern();
}
/** Extend this method to make your transformer modify the voice. */
@Override
public void voiceEvent(Voice voice) {
returnPattern.addElement(voice);
}
/** Extend this method to make your transformer modify the tempo. */
@Override
public void tempoEvent(Tempo tempo) {
returnPattern.addElement(tempo);
}
/** Extend this method to make your transformer modify the instrument. */
@Override
public void instrumentEvent(Instrument instrument) {
returnPattern.addElement(instrument);
}
/** Extend this method to make your transformer modify the layer. */
@Override
public void layerEvent(Layer layer) {
returnPattern.addElement(layer);
}
/** Extend this method to make your transformer modify the time. */
@Override
public void timeEvent(Time time) {
returnPattern.addElement(time);
}
/** Extend this method to make your transformer modify the time. */
@Override
public void keySignatureEvent(KeySignature keySig) {
returnPattern.addElement(keySig);
}
/** Extend this method to make your transformer modify the measure. */
@Override
public void measureEvent(Measure measure) {
returnPattern.addElement(measure);
}
/**
* Extend this method to make your transformer modify the controller
* messages.
*/
@Override
public void controllerEvent(Controller controller) {
returnPattern.addElement(controller);
}
/**
* Extend this method to make your transformer modify the channel pressure
* messages.
*/
@Override
public void channelPressureEvent(ChannelPressure channelPressure) {
returnPattern.addElement(channelPressure);
}
/**
* Extend this method to make your transformer modify the polyphonic
* pressure messages.
*/
@Override
public void polyphonicPressureEvent(PolyphonicPressure polyphonicPressure) {
returnPattern.addElement(polyphonicPressure);
}
/**
* Extend this method to make your transformer modify the pitch bend
* messages.
*/
@Override
public void pitchBendEvent(PitchBend pitchBend) {
returnPattern.addElement(pitchBend);
}
/**
* Extend this method to make your transformer modify the note. Don't forget
* to also extend sequentialNoteEvent and parallelNoteEvent.
*/
@Override
public void noteEvent(Note note) {
returnPattern.addElement(note);
}
/**
* Extend this method to make your transformer modify the note. Don't forget
* to also extend noteEvent and parallelNoteEvent.
*/
@Override
public void sequentialNoteEvent(Note note) {
returnPattern.addElement(note);
}
/**
* Extend this method to make your transformer modify the note. Don't forget
* to also extend noteEvent and sequentialNoteEvent.
*/
@Override
public void parallelNoteEvent(Note note) {
returnPattern.addElement(note);
}
}