JFugue: Получить продолжительность музыкальной строки

#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. В идеале это должно сработать, и тот факт, что это не работает, является ошибкой. Но поскольку он использует синтаксический анализатор стаккато, который явно знает, как найти длительность аккорда, я не уверен, почему это будет ошибкой. Может быть, я написал это, предполагая только заметки. Мне придется это выяснить. Спасибо, что дали мне знать!