在jFugue 4.0中有一个很好的功能:使用PatternTransformer转换模式
但在jFugue 5.0中删除了所有模式转换器。我知道它必须换成更酷的东西。但是在jFugue 5.0中该怎么做呢?我一点头绪都没有。我用谷歌搜索了一下,但到目前为止还没有结果。
发布于 2017-06-30 12:57:44
"PatternTransformer“类已经不存在了,但是转换模式从来没有像现在这样简单!
在旧版本的JFugue中,PatternTransformer和ParserListener实际上几乎没有区别。较早版本的JFugue也引用了PatternTool,它类似于Transformer,但它只是测量模式,而不是转换模式;例如,您可以编写一个工具来告诉您在一件作品中使用了哪些仪器。
要在JFugue中转换模式,只需创建一个实现ParserListener (或扩展ParserListenerAdapter)的类,并将其作为侦听器添加到解析器中-例如StaccatoParser:
例如,这里有一个工具,它可以找到一件作品中使用的乐器:
public class InstrumentTool extends ParserListenerAdapter
{
private List<String> instrumentNames;
public InstrumentTool() {
super();
instrumentNames = new ArrayList<String>();
}
@Override
public void onInstrumentParsed(byte instrument) {
String instrumentName = MidiDictionary.INSTRUMENT_BYTE_TO_STRING.get(instrument);
if (!instrumentNames.contains(instrumentName)) {
instrumentNames.add(instrumentName);
}
}
public List<String> getInstrumentNames() {
return this.instrumentNames;
}
}下面是如何使用它:
MidiParser midiParser = new MidiParser();
InstrumentTool instrumentTool = new InstrumentTool();
midiParser.addParserListener(instrumentTool);
midiParser.parse(MidiSystem.getSequence(new File("filename")));
List<String> instrumentNames = instrumentTool.getInstrumentNames();
for (String name : instrumentNames) {
System.out.println(name);
}JFugue 5中有一个新的类,可以将ParserListeners链接在一起。这将允许您创建一个侦听器链,每个侦听器在将事件发送到链中的下一个侦听器之前修改一个模式。例如,假设您有一个模式,您想要转换所有的乐器(例如,将吉他转换为钢琴);然后您想要使用钢琴演奏的任何音符并将其持续时间延长2;然后您想要采用新持续时间大于2.0的任何音符(两个完整的音符),并且您想要更改其八度。这是一个有点疯狂的例子,但它表明需要一系列“链接”的解析器侦听器。
这是一个使用链接的示例。这个类读取MIDI模式;然后它改变所有的乐器,然后它从原始的MIDI创建Staccato模式。
public class ChainingParserListenerDemo {
public static void main(String[] args) throws InvalidMidiDataException, IOException {
MidiParser parser = new MidiParser();
InstrumentChangingParserListener instrumentChanger = new InstrumentChangingParserListener();
StaccatoParserListener staccatoListener = new StaccatoParserListener();
instrumentChanger.addParserListener(staccatoListener);
parser.addParserListener(instrumentChanger);
parser.parse(MidiSystem.getSequence(new File("filename")));
System.out.println("Changed "+instrumentChanger.counter+" Piano's to Guitar! "+ staccatoListener.getPattern().toString());
}
}
class InstrumentChangingParserListener extends ChainingParserListenerAdapter {
int counter = 0;
@Override
public void onInstrumentParsed(byte instrument) {
if (instrument == MidiDictionary.INSTRUMENT_STRING_TO_BYTE.get("PIANO")) {
instrument = MidiDictionary.INSTRUMENT_STRING_TO_BYTE.get("GUITAR");
counter++;
}
super.onInstrumentParsed(instrument);
}
}https://stackoverflow.com/questions/44817287
复制相似问题