Вступление
В этом руководстве мы узнаем, как создавать и управлять аккордами и
последовательностями аккордов, как использовать setKey()
,
distribute()
и allChordsAs()
ChordProgression
и как воспроизводить
различные паттерны одновременно с использованием голосов в JFugue.
Это вторая часть учебной серии из трех частей, в которой мы пытаемся воссоздать вступление джазовой версии Sunday Morning by Maroon 5 . Но шаги, описанные в статьях, легко применимы и к любому другому процессу создания песни.
В предыдущей части серии мы рассмотрели основы библиотеки JFugue, научившись использовать ноты, октавы, длительность, темп, инструменты и паттерны. В конце первой статьи мы создали вступительный вокал без каких-либо аккордов. К концу этого урока в нашей песне будут готовые аккорды, которые будут играть вместе с вокалом.
В заключительной части нашей серии руководств мы узнаем о ритмах в JFugue. Это позволит нам строить и воспроизводить ритмы поверх предыдущих частей. Мы также рассмотрим, как сохранить нашу музыку в файл MIDI с помощью JFugue, а также как читать музыку из файла MIDI с помощью библиотеки JFugue.
Если вы хотите ознакомиться с другими частями серии, вот ссылки:
- Руководство для начинающих по JFugue, часть I: Примечания, продолжительность, шаблоны
- Руководство для начинающих по JFugue, часть II: аккорды и последовательности аккордов (здесь)
- Руководство для начинающих по JFugue, часть III: ритмы, чтение и запись в MIDI
Аккорды и аккордовые последовательности в JFugue
Что касается аккордов, JFugue предлагает несколько способов их создания. Во-первых, давайте посмотрим, как создавать свои собственные аккорды, комбинируя ноты одну за другой.
Мы создадим аккорд D-Minor7 , который также будет первым аккордом нашей песни. Этот аккорд состоит из четырех (4) нот, которые мы можем комбинировать и играть одновременно:
player.play("D+F+A+C");
Пока это работает хорошо, но создание каждого аккорда по ноте может стать очень утомительной работой. В этой песне у нас есть три (3) аккорда (Dm, G, C) с 3 инверсиями (DMin9, GMaj13, CMaj9) .
Нам не обязательно создавать все аккорды вручную. Вы можете создавать
свои аккорды с помощью ChordProgression
если вы знакомы с теорией
музыки. Для этого мы импортируем и ChordProgression
экземпляр класса
ChordProgression с последовательностями аккордов наших аккордов:
import org.jfugue.theory.ChordProgression;
ChordProgression cp = new ChordProgression("ii VI");
Мы также можем установить тональность аккордовой последовательности,
привязав к ней метод setKey()
ChordProgression cp = new ChordProgression("ii VI")
.setKey("C");
Мы можем играть аккорды так же, как и с паттернами:
player.play(cp);
ChordProgression
реализует PatternProducer
, который, как следует из
названия, создает шаблоны. И когда мы передаем ChordProgression
в
метод Player.play()
, метод запрашивает шаблон у ChordProgression
и
воспроизводит его так же, как и с шаблонами.
Еще один эффективный метод ChordProgression
- distribute()
. Этот
метод позволяет нам распространять музыкальную функцию вместе с
аккордами внутри объекта ChordProgression
На данный момент наши аккорды в cp
- это Dm , G и C.
Давайте изменим все аккорды на 7-е с помощью distribute()
:
ChordProgression cp = new ChordProgression("ii VI")
.setKey("C")
.distribute("7");
player.play(cp);
Еще одно существенное изменение - установить длительность каждого
аккорда и добавить паузу между аккордами. Используя allChordsAs()
,
мы можем выбрать каждый аккорд в cp
, набрав $
с порядковым номером
аккорда:
ChordProgression cp = new ChordProgression("ii VI")
.setKey("C")
.distribute("7")
.allChordsAs("$0hqit Ri $1hqi Ri $2wh Rht");
Мы можем рассматривать $0
, $1
и $2
как заполнители, которые
относятся к ii
, V
и I
соответственно. Любые модификации, которые
мы применяем к ним, применяются к аккордам в cp
. Играйте, чтобы
увидеть разницу.
Еще одна интересная особенность ChordProgression
заключается в том,
что мы можем легко преобразовать его в Pattern
и использовать
специальные методы Pattern для его дальнейшего изменения:
Pattern cpPattern = cp.getPattern();
System.out.print(cpPattern);
player.play(cpPattern.setTempo(180).setInstrument("DRAWBAR_ORGAN").repeat(4));
С помощью getPattern()
мы преобразуем cp
в Pattern
, затем
печатаем текущие аккорды в cp
чтобы мы могли видеть заполняемые
аккорды. Наконец, мы устанавливаем темп, инструмент и значение повтора.
.
Аккорды, которые играет JFugue, выглядят так:
D4MIN7hqit Ri G4MAJ7hqi Ri C4MAJ7wh Rht
ChordProgression
предоставляет ряд возможностей, но, как упоминалось
ранее, для этого требуются некоторые знания теории музыки. Если вы плохо
разбираетесь в теории музыки, но имеете базовые знания об аккордах, вы
можете удобно использовать аккорды внутри паттернов.
Чтобы полностью раскрыть потенциал стаккато, которое гордится своей удобочитаемостью, мы запишем аккорды прямо в паттерн:
Pattern mainChords = new Pattern("T180 D4Min9hqit Ri G4Maj13hqi Ri C4Maj9wh Rht");
Давайте разберемся с D4Min9hqit
. «D» - это название аккорда, за
которым следует «4» , обозначающее октаву, за которым следует
«Min9», обозначающее «Minor 9th» , и за которым следует «hqit»,
которые представляют собой измерения длительности.
Мы можем воспользоваться преимуществом Pattern
и добавить к нему еще
несколько аккордов, связав метод .add()
mainChords.add("D4Minhqit Ri 4Majhqi Ri C4Majwh Rht");
Обратите внимание, что мы не указали темп во второй части паттерна, поскольку однократной установки темпа достаточно, чтобы применить его ко всем следующим музыкальным событиям.
В реальном мире не каждый инструмент в песне играет в последовательном
порядке. Теперь, когда наши аккорды воспроизводятся правильно, мы хотели
бы добавить некоторые другие паттерны, чтобы играть вместе с ними, а не
добавлять непосредственно к ним, как мы это делали с add()
.
JFugue предоставляет специальный токен под названием «Голос» . Большинство песен состоит из слоев узоров. Например, фортепиано продолжает играть аккорды, в то время как продолжается барабанная дробь и вокал поет им. В JFugue жетон «Голос» представляет каждого из этих отдельных исполнителей / певцов, что позволяет им играть вместе, играть одновременно.
Мы можем использовать до 16 различных голосов, что является суммой
стандартных MIDI-каналов. V15
могут варьироваться от V0
до V15. Мы
можем заполнить голоса любыми инструментами, которые захотим. Кроме
10-го канала или V9
. Этот специальный голосовой слой по умолчанию
зарезервирован для перкуссии и может иметь различные наборы ударных
инструментов и слоев в V9 (подробнее об этом позже).
Давайте попробуем воссоздать вступление к ' Sunday Morning' (джазовая
версия) , добавив новые голоса к нашим текущим mainChords
:
Pattern mainChords = new Pattern("T180 V0 D4Min9hqit Ri G3Maj13hqi Ri C4Maj9wh Rh");
mainChords.add("D4Minhqit Ri G4Majhqi Ri C4Majwh Rht");
Pattern pianoTouch = new Pattern("T180 V1 Rw | Rw | Rhi | G4qi G3s A3is CMajis ri");
pianoTouch.add("Rw | Rw | Rhi | G4s C5wa100d0");
player.play(mainChords, pianoTouch);
mainChords
такой же, как и раньше. Мы добавили новый паттерн
pianoTouch
и установили его на второй голосовой канал V1
. Поскольку
эти ноты появлялись в конце каждой петли аккордов, нам приходилось
удерживать их с помощью Rw
чтобы играть точно в нужное время.
Возможно, вы заметили, что последняя нота pianoTouch
имеет этот
странный токен a100d0
приклеенный ко всей ноте до . Этот жетон
представляет скорость атаки и скорость затухания ноты.
Мы установили значение атаки на 100 , чтобы наша нота звучала немного громче, чем другие, и установили значение затухания на 0 , что привело к очень быстрому уменьшению громкости нашей ноты до нуля. Вы можете установить любой из них и ни один из них по своему усмотрению на любое значение от 0 до 127 .
Партия, которую мы сочинили для pianoTouch
играет в оригинальной песне
только один раз. Итак, мы хотим убедиться, что пока mainChords
воспроизводится с повторением, pianoTouch
не повторяется.
Мы можем создать новый паттерн introOnce
чтобы сгруппировать другие
наши паттерны. Таким образом, мы можем организовать, что играть один
раз, а что повторять. Замените строку, которая вызывает play()
этими
двумя строками:
Pattern introOnce = new Pattern(mainChords, pianoTouch);
player.play(introOnce, mainChords.repeat(2));
Это должно сыграть на pianoTouch
один раз, а затем повторить
mainChords
2 раза.
Наша песня идет отлично! Пришло время помочь танцорам, мы воспользуемся
Rhythm
», чтобы направлять их в следующей части серии!
Заключение
В этом руководстве мы узнали, как использовать аккорды и
последовательности аккордов в библиотеке JFugue. Мы также рассмотрели
setKey()
, distribute()
и allChordsAs()
ChordProgression
, как
воспроизводить разные паттерны одновременно с использованием голосов и
как применять свойства атаки / затухания к нотам или аккордам.
В следующей и заключительной части серии статей мы узнаем, как создавать и использовать ритмы в JFugue. Таким образом мы сможем завершить нашу песню. Мы также расскажем, как сохранить нашу песню в формате MIDI-файла с помощью JFugue, а также как импортировать MIDI-файл и прочитать содержимое в формате Staccato.
Вы можете продолжить чтение следующей части: Руководство для начинающих JFugue Часть III: Ритмы, чтение и запись в MIDI .
Или, если вам нужны более подробные сведения об основах JFugue, вы можете ознакомиться с первой статьей, чтобы освежить свои знания: Руководство для начинающих по JFugue, часть I: примечания, продолжительность, шаблоны .