给定的音乐字符串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
包包含几个工具,其中一个会告诉你每个声音的总持续时间(无论这些声音是像你一样写成断奏字符串,还是作为你导入的音乐的MIDI通道,或者JFugue可以解析的任何其他东西-并且很容易编写新的解析器)。ComputeDurationForEachTrackTool
(和另一个工具GetInstrumentsUsedTool
)是ParserListener
,在JFugue中有一种使用解析器侦听器的常见模式:
*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();
虽然这比你在问题中建议的语句长,但这是非常强大的,因为它提供了一种将任何解析器连接到任何解析器侦听器或工具的方法。
你会在durationsOfEachVoice[0]
中找到1.0。
实际上,你会在那里找到2.0,这是意想不到的。但我刚刚对它进行了测试,四分音符返回0.5八分音符返回0.25。听起来像是JFugue版本6的修复!同时,请除以2.0,并接受我的道歉。