#jfugue
Вопрос:
Учитывая музыкальную строку 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
Ответ №1:
org.jfugue.tools
Пакет JFugue содержит несколько инструментов, в том числе один, который сообщит вам общую продолжительность каждого голоса (независимо от того, записаны ли эти голоса в виде строк стаккато, как у вас, или в виде MIDI — каналов для импортируемой музыки, или что-либо еще, что JFugue может анализировать-и легко писать новые анализаторы). ComputeDurationForEachTrackTool
(и еще один инструмент GetInstrumentsUsedTool
) — это ParserListener
s, и в 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();
Хотя это длиннее, чем утверждение, которое вы предложили в своем вопросе, это чрезвычайно мощно, поскольку оно предоставляет средство для подключения любого анализатора к любому прослушивателю или инструменту анализатора.
Вы найдете 1.0 в durationsOfEachVoice[0]
.
На самом деле, вы найдете там 2.0, что неожиданно. Но я только что провел тест на нем, и он возвращает 0,5 для четвертной ноты и 0,25 для восьмой ноты. Похоже на исправление для JFugue версии 6! А пока, пожалуйста, разделитесь на 2.0 и примите мои извинения.
Комментарии:
1. Хорошо, большое спасибо. В любом случае мне, возможно, потребуется получить длительность строки стаккато, которая также содержит аккорды, например «C#mini C#mini C#mini C#mini C#mini C#mini C#mini C#mini C # mini C # mini C # mini». Для этого случая я получаю 0,0 внутри durationsOfEachVoice[0]. Есть ли другой синтаксический анализатор для аккордов?
2. В идеале это должно сработать, и тот факт, что это не работает, является ошибкой. Но поскольку он использует синтаксический анализатор стаккато, который явно знает, как найти длительность аккорда, я не уверен, почему это будет ошибкой. Может быть, я написал это, предполагая только заметки. Мне придется это выяснить. Спасибо, что дали мне знать!