Руководство для начинающих по JFugue, часть I: Примечания, продолжительность, шаблоны

Введение JFugue - это музыкальная библиотека с открытым исходным кодом, которая позволяет воспроизводить и сочинять музыку в формате MIDI с использованием языка программирования Java. Он использует их формат «стаккато» для анализа строк музыкальных инструкций. Используя JFugue, вы можете преобразовать строки Staccato в файл MIDI, а также импортировать файл MIDI и преобразовать содержимое в строки, удобочитаемые человеком. > Это будет первая часть из трех частей. В этом руководстве мы сосредоточимся на самых фундаментальных частях J

Вступление

JFugue - это музыкальная библиотека с открытым исходным кодом, которая позволяет воспроизводить и сочинять музыку в формате MIDI с помощью языка программирования Java. Он использует их формат «стаккато» для разбора строк музыкальных инструкций . Используя JFugue, вы можете преобразовать строки Staccato в файл MIDI , а также импортировать файл MIDI и преобразовать содержимое в строки, удобочитаемые человеком.

Это будет первая часть из трех частей. В этом руководстве мы сосредоточимся на самых фундаментальных частях библиотеки JFugue, узнав о нотах, октавах, длительности, темпе, инструментах и паттернах. Так мы сможем воссоздать небольшую часть вокала джазовой версии Sunday Morning by Maroon 5 .

Во второй части серии мы исследуем, как создавать и управлять аккордами и последовательностями аккордов в Jfugue. Мы узнаем, как использовать setKey() , distribute() и allChordsAs() класса ChordProgression

В третьей и заключительной части серии мы узнаем о ритмах в JFugue. Используя наши предыдущие знания, мы сможем завершить вступление к нашей песне. В заключительной части мы также рассмотрим, как сохранить нашу музыку в файл MIDI с помощью JFugue, а также прочитать музыку из файла MIDI с помощью библиотеки JFugue:

Начнем с подготовки нашей среды разработки.

Предпосылки

Поскольку мы собираемся работать с MIDI, для наблюдения результатов потребуется устройство вывода звука (динамики или наушники).

Хотя это и не обязательно, но базовые музыкальные знания помогут вам быстрее понять некоторые музыкальные концепции, упомянутые в статье.

Монтаж

Загрузите официальную библиотеку JFugue (текущая версия 5.0.9) и добавьте файл JAR в свой Java-проект в качестве внешней библиотеки.

В качестве альтернативы, если вы используете Maven, вы можете загрузить зависимость через файл pom.xml Хотя вам также придется добавить репозиторий JitPack:

 <repositories> 
 <repository> 
 <id>jitpack.io</id> 
 <url>https://jitpack.io</url> 
 </repository> 
 </repositories> 
 
 <dependency> 
 <groupId>jfugue</groupId> 
 <artifactId>jfugue</artifactId> 
 <version>5.0.9</version> 
 </dependency> 

Или, если вы используете Gradle:

 allprojects { 
 repositories { 
 ... 
 maven { url 'https://jitpack.io' } 
 } 
 } 
 
 implementation group: 'jfugue', name: 'jfugue', version: '5.0.9' 

Основным API библиотеки JFugue является класс Player Создадим его экземпляр:

 import org.jfugue.player.Player; 
 
 public class MyMusic { 
 public static void main(String[] args) { 
 Player player = new Player(); 
 } 
 } 

Мы будем использовать этот класс для интерпретации и воспроизведения звуков, которые мы хотим исполнить.

Ноты, октавы и длительности в JFugue

Как мы упоминали ранее, Staccato представляет все музыкальные функции в удобном для чтения и записи формате. Официальное руководство JFugue называет Staccato «удобочитаемым и машиночитаемым форматом» . Он довольно гибкий, не чувствителен к регистру и не учитывает несколько пробелов (если есть хотя бы один пробел).

Вот как выглядит строка стаккато:

 player.play("CDEFGAB"); 

Запустите код и приготовьте динамики услышать волшебный звук MIDI.

Примечание. Вместе с этим руководством вы встретите множество player.play() Чтобы избежать осложнений, вы можете оставить один player.play() в конце кода и заменять его каждый раз, когда видите новый.

Эта строка действительно удобочитаема. Но вы, возможно, заметили, что мы не указали октаву или длительность ни для одной из нот. Если информация об октаве не указана, ноты будут воспроизводиться с октавой по умолчанию, равной 5. Это означает, что указанная выше музыкальная строка такая же, как и следующая:

 player.play("C5 D5 E5 F5 G5 A5 B5"); 

Мы можем указать число октавы от 1 до 10, где 1 - самая низкая октава, а 10 - самая высокая октава. Номер октавы должен следовать сразу после ноты или аккорда (подробнее об аккордах позже в статье):

 player.play("G4 G3 A3 B2"); 

Обратите внимание, что мы дважды сыграли одну и ту же ноту G, но одна с 4-й октавой, а вторая - с 3-й октавой, что дает другой звук.

Конечно, в настоящий момент наша музыкальная струна звучит не очень интересно, потому что все ноты имеют одинаковую продолжительность. Как и в случае с октавами, если ничего не указано, будет использоваться длительность по умолчанию «q».

«Q» означает «четвертную ноту» . Некоторые из наиболее распространенных длительностей - «целая», «половина», «четверть», «восьмая» . Каждая продолжительность в два раза быстрее или короче, чем предыдущая, и в два раза медленнее или длиннее, чем следующая. Например, продолжительность «четверти» (¼) короче, чем «половинной» (½) ноты, и в два раза больше, чем «восьмой» () ноты. JFugue позволяет вам быть настолько точным, насколько вы хотите, с длительностью до 1/128 .

Вот полная таблица длительностей с десятичными значениями из официального руководства JFugue:

Продолжительность Персонаж Десятичное значение


Весь W 1.0 Половина ЧАС 0,5 Четверть Q 0,25 Восьмой я 0,125 Шестнадцатый S 0,0625 Тридцать второй Т 0,03125 Шестьдесят четвертый Икс 0,015625 Одна двадцать восьмая О 0,0078125

Теперь, когда мы знаем, как работают длительности в JFugue, мы можем использовать их в нашей музыкальной строке (также известной как Staccato):

 player.play("G4qi G3s A3is B2is"); 

Обратите внимание, что мы использовали два обозначения продолжительности для G4qi . С JFugue вы можете комбинировать столько нот длительности, сколько захотите, чтобы создать звук и ощущение, которое вы хотите. Порядок обозначений продолжительности не имеет значения, но для удобства чтения рекомендуется использовать их в возрастающем порядке. Это означает, что начните с большей продолжительности, а затем с меньшей продолжительностью.

Еще одна важная музыкальная концепция - это отдых . Проще говоря, отдых - это пауза, тишина, отсутствие музыки. В JFugue отдых обозначается буквой «R» или «r» . Подобно нотам, остальные также могут иметь длину, и значение длительности по умолчанию такое же, как и у остальных - четверть .

Давайте попробуем воссоздать фрагмент вокала Sunday Morning, используя все, что мы узнали до сих пор:

 player.play("G5is E5i Ri | G5s Ris E5q Rs | G5q E5i Rs D5q rs C5h Rs"); 

Вы можете удалить все токены «R» и сравнить две версии, чтобы понять влияние остальных.

Вы, наверное, заметили, что есть также "|" (вертикальная черта) символ, о котором мы еще не упоминали. Канал в JFugue предназначен только для лучшей читаемости и не влияет на звук. Вы можете разделить свой стаккато, используя столько труб, сколько захотите, и это не повлияет на музыкальный выход. Это похоже на «тактовую линию» в нотах, но, в отличие от тактовой линии, трубка не определяет количество долей.

Поскольку наш Staccato является строкой, мы можем использовать конкатенацию строк с + для объединения нескольких строк.

Предположим, что у нас есть отдельные струны для вокала, мы можем легко объединить их, чтобы сформировать непрерывную струну и играть:

 String vocals = "Rh G5is E5i Ri | G5s Ris E5q Rs | G5q E5i Rs D5q rs C5h Rs " 
 + "C4i A5q G5isa50d0 Rs A5s E5i D5is Rs C5qis " 
 + "Rqi A4s G5i E5i Rs | G5is Rs E5q | D5is C5i Rs C5q G4q Ri"; 
 player.play(vocals); 

Обратите внимание на пробелы в конце первой и второй строк. Поскольку мы конкатенируем, мы хотим избежать соединения конца строки с началом другой строки, например «RsC4i» .

Это не вызовет никаких ошибок, но JFugue просто пропустит воспроизведение этой ноты (нот), поскольку она неузнаваема. К счастью, JFugue предлагает лучший способ комбинирования нескольких Staccatos, без необходимости иметь дело с такими тривиальными вопросами, как пробелы в конце каждой строки. В следующем разделе мы узнаем о паттернах и о том, как использовать инструменты.

Использование паттернов и инструментов в JFugue

Каждый музыкальный элемент в строке стаккато - это жетон . Каждая нота, отдых и продолжительность, а также все остальное, что мы узнаем позже в статье, являются токенами . Паттерн оборачивает строку стаккато, состоящую из токенов, и позволяет нам управлять ею удобными способами.

Класс Pattern предоставляет несколько эффективных методов, таких как setTempo() , setInstrument() , setVoice() и другие. Мы также можем связать эти методы. Используя метод add() , мы можем добавить несколько шаблонов или несколько Staccatos вместе.

Давайте импортируем и создадим объект Patter n, чтобы обернуть нашу строку Staccato и объединить несколько строк, не беспокоясь о пробелах в конце:

 import org.jfugue.pattern.Pattern; 
 
 Pattern vocals = new Pattern(); 
 vocals.add("Rh G5is E5i Ri | G5s Ris E5q Rs | G5q E5i Rs D5q rs C5h Rs"); 
 vocals.add("C4i A5q G5isa50d0 Rs A5s E5i D5is Rs C5qis"); 
 vocals.add("Rqi A4s G5i E5i Rs | G5is Rs E5q | D5is C5i Rs C5q G4q Ri"); 
 vocals.add("G3is A3s C4is D4s C4is D4s G4is A4s G4is A4s | E4q rs F4h"); 
 vocals.add("G5is E5i Ri | G5s Ris E5q Rs | G5q E5i Rs A5is rs G5q A5s E5i D5i ri C5h Ri"); 
 vocals.add("C5s A3q C5i Rs | D5i Rs Eb5qs Rs | D5q Eb5i Rs D5is Eb5s D4q Rs | C5i A4q C5h"); 
 
 player.play(vocals); 

Такое сложение строк не только предотвращает ошибки, связанные с пробелами, но и предоставляет нам больше функциональных возможностей.

Если вы попытаетесь воспроизвести вышеуказанный vocals , вы заметите, что он звучит слишком медленно. Причина, как вы уже догадались, связана с длительностью . Хотя на самом деле мы не хотим сокращать продолжительность. Мы хотим увеличить темп .

Мы можем легко установить новый темп, используя setTempo(int) экземпляра Pattern

 vocals.setTempo(180); 

Теперь мы заметим разницу, если поиграем:

 player.play(vocals); 

До сих пор мы использовали только инструмент по умолчанию, которым является фортепиано . В то время как один из более универсален инструментов, к сожалению, это не наилучшим образом подходит для любой ситуации. Давайте сделаем это более «джазовым», добавив несколько инструментов:

Мы можем связать несколько методов с Pattern , изменив конфигурацию с помощью нескольких настроек:

 vocals.setTempo(180).setInstrument("TROMBONE"); 

Есть 128 инструментов, включая, ну, не такие инструменты, как "SEASHORE" , "BIRDTWEET" и даже "HELICOPTER" .

Вы можете оставить остальные строки как есть и запустить код, чтобы услышать разницу. setInstrument() к концу, мы устанавливаем «TROMBONE» для всех строк Staccato над этим вызовом.

Конечно, мы можем установить разные инструменты для каждой отдельной линии , встраивая информацию об инструменте в сам Staccato:

 Pattern vocals = new Pattern(); 
 vocals.add("I[TROMBONE] Rh G5is E5i Ri | G5s Ris E5q Rs | G5q E5i Rs D5q rs C5h Rs"); 
 vocals.add("I[ALTO_SAX] C4i A5q G5isa50d0 Rs A5s E5i D5is Rs C5qis"); 
 vocals.add("I[TROMBONE] Rqi A4s G5i E5i Rs | G5is Rs E5q | D5is C5i Rs C5q G4q Ri"); 
 vocals.add("I[TRUMPET] G3is A3s C4is D4s C4is D4s G4is A4s G4is A4s | E4q rs F4h"); 
 vocals.add("I[TROMBONE] G5is E5i Ri | G5s Ris E5q Rs | G5q E5i Rs A5is rs G5q A5s E5i D5i ri C5h Ri"); 
 vocals.add("C5s A3q C5i Rs | D5i Rs Eb5qs Rs | D5q Eb5i Rs D5is Eb5s D4q Rs | C5i A4q C5h"); 
 vocals.setTempo(180); 

Обратите внимание, что в последней строке нет информации об инструменте. JFugue продолжит выбор последнего инструмента до тех пор, пока не будет сделан какой-либо другой выбор. Но, конечно, для лучшей читаемости лучше по возможности предоставлять информацию о приборе.

Опять же, JFugue имеет 128 предустановленных инструментов. Если вы хотите узнать о других возможностях инструментов, вот полный список .

Подобно инструментам, мы можем установить значение темпа внутри самого стаккато, передав значение темпа в наш Pattern когда мы создаем его экземпляр в первой строке.

Окончательный результат модели vocals должен выглядеть так:

 Pattern vocals = new Pattern("T180"); 
 vocals.add("I[TROMBONE] Rh G5is E5i Ri | G5s Ris E5q Rs | G5q E5i Rs D5q rs C5h Rs"); 
 vocals.add("I[ALTO_SAX] C4i A5q G5isa50d0 Rs A5s E5i D5is Rs C5qis"); 
 vocals.add("I[TROMBONE] Rqi A4s G5i E5i Rs | G5is Rs E5q | D5is C5i Rs C5q G4q Ri"); 
 vocals.add("I[TRUMPET] G3is A3s C4is D4s C4is D4s G4is A4s G4is A4s | E4q rs F4h"); 
 vocals.add("I[TROMBONE] G5is E5i Ri | G5s Ris E5q Rs | G5q E5i Rs A5is rs G5q A5s E5i D5i ri C5h Ri"); 
 vocals.add("I[TROMBONE] C5s A3q C5i Rs | D5i Rs Eb5qs Rs | D5q Eb5i Rs D5is Eb5s D4q Rs | C5i A4q C5h"); 

Мы удалили vocals.setTempo(180); поскольку установка темпа в начале имеет тот же эффект.

На этом мы завершаем вокальную часть нашей песни, а также первую часть нашей обучающей серии.

Заключение

В этом руководстве мы рассмотрели самые фундаментальные части музыкальной библиотеки Java с открытым исходным кодом JFugue. Мы узнали, как использовать ноты, длительность, темп и паттерны.

Хотя это были основные элементы JFugue, это был лишь шаг к тому множеству возможностей, которые JFugue может предложить. В следующих частях мы рассмотрим, как управлять аккордами и последовательностями аккордов, основы ритма, а также как импортировать и экспортировать файлы MIDI с помощью JFugue.

Продолжайте читать вторую часть серии руководств: Руководство для начинающих по JFugue, часть II: Аккорды и последовательности аккордов.

comments powered by Disqus