给定音乐字符串Aq Aq Bi Bi Ci Ci
,JFugue 中是否有一个对象可以检索其持续时间(作为双精度或字符串)?
例如:
double musicStringDuration = new DurationMapper().getDoubleMSDuration("Aq Aq Bi Bi Ci Ci");
System.out.println(musicStringDuration); \\ prints 1.0
给定音乐字符串Aq Aq Bi Bi Ci Ci
,JFugue 中是否有一个对象可以检索其持续时间(作为双精度或字符串)?
例如:
double musicStringDuration = new DurationMapper().getDoubleMSDuration("Aq Aq Bi Bi Ci Ci");
System.out.println(musicStringDuration); \\ prints 1.0
JFugue 的org.jfugue.tools
软件包包含几个工具,包括一个可以告诉你每个声音的总持续时间的工具(无论这些声音是像你一样写成 Staccato Strings,还是作为你导入的音乐的 MIDI 通道,或者 JFugue 可以解析的任何其他东西 - 和编写新的解析器很容易)。ComputeDurationForEachTrackTool
(和另一个工具,GetInstrumentsUsedTool
)是ParserListener
s,在 JFugue 中有一个常见的模式来使用 Parser Listener:
*Some*Parser parser = new *Some*Parser();
*Another*ParserListener listener = new *Another*ParserListener();
parser.addParserListener(listener);
parser.parse(*whatever the parser takes*);
*Type* *value* = listener.*method*();
特别针对您的情况,您将拥有:
StaccatoParser parser = new StaccatoParser();
ComputeDurationForEachTrackTool tool = new ComputeDurationForEachTrackTool();
parser.addParserListener(tool);
parser.parse("Aq Aq Bi Bi Ci Ci");
double[] durationsOfEachVoice = tool.getDurations();
虽然这比您在问题中建议的陈述要长,但它非常强大,因为它提供了一种将任何解析器连接到任何解析器侦听器或工具的方法。
你会发现 1.0 在durationsOfEachVoice[0]
.
实际上,您会在其中找到 2.0,这是出乎意料的。但我刚刚对其进行了测试,它返回 0.5 的四分音符和 0.25 的八分音符。听起来像是对 JFugue 版本 6 的修复!同时,请除以 2.0 并接受我的道歉。