Spec-Zone .ru
спецификации, руководства, описания, API
|
До сих пор мы сосредоточились на простом воспроизведении и записи данных MIDI. Этот раздел кратко опишет некоторые большего количества расширенных функций, доступных через методы Sequencer
взаимодействуйте через интерфейс и Sequence
class.
Есть два Sequencer
методы, которые получают текущую позицию секвенсера в последовательности. Первый из них:
long getTickPosition()
возвращает позицию, измеренную в галочках MIDI с начала последовательности. Второй метод:
long getMicrosecondPosition()
возвращает текущую позицию в микросекундах. Этот метод предполагает, что последовательность играется на уровне значения по умолчанию как сохраненный в файле MIDI или в Sequence
. Это не возвращает различное значение, если Вы изменили скорость воспроизведения как описано ниже.
Можно так же установить текущую позицию секвенсера согласно одному модулю или другому:
void setTickPosition(long tick)
или
void setMicrosecondPosition(long microsecond)
Как обозначено ранее, скорость последовательности обозначается ее темпом, который может измениться в течение последовательности. Последовательность может содержать события, которые инкапсулируют стандартные сообщения изменения темпа MIDI. Когда секвенсер обрабатывает такое событие, он изменяет скорость воспроизведения, чтобы отразить обозначенный темп. Кроме того, можно программно изменить темп, вызывая любой из них Sequencer
методы:
public void setTempoInBPM(float bpm) public void setTempoInMPQ(float mpq) public void setTempoFactor(float factor)
Первые два из этих методов набор темп в ударах в минуту или микросекунды на четвертную ноту, соответственно. Темп останется в указанном значении, пока один из этих методов не будет вызван снова, или пока с событием изменения темпа встречаются в последовательности, в которой точке текущий темп переопределяется недавно указанным.
Третий метод, setTempoFactor
, отличается в природе. Это масштабируется, любой темп устанавливается для секвенсера (ли событиями изменения темпа или одним из первых двух методов выше). Скаляр значения по умолчанию 1.0 (никакое изменение). Хотя этот метод заставляет воспроизведение или записывающий быть быстрее или медленнее чем номинальный темп (если фактор не 1.0), это не изменяет номинальный темп. Другими словами, значения темпа, возвращенные getTempoInBPM
и getTempoInMPQ
незатронуты фактором темпа, даже при том, что фактор темпа действительно влияет на фактический уровень воспроизведения или записи. Кроме того, если темп изменяется событием изменения темпа или на один из первых двух методов, это все еще масштабируется любым фактором темпа, был последний набор. Если Вы загружаете новую последовательность, однако, фактор темпа сбрасывается к 1.0.
Отметьте, что все эти директивы изменения темпа неэффективны, когда тип подразделения последовательности является одним из типов SMPTE вместо PPQ.
Часто удобно для пользователей секвенсеров быть в состоянии выключить определенные дорожки, услышать более ясно точно, что происходит в музыке. Полнофункциональная программа секвенсера позволяет пользователю выбирать, какие дорожки должны звучать во время воспроизведения. (Говорящий более точно, так как секвенсеры фактически не создают, звучат как себя, пользователь выбирает, какие дорожки будут способствовать потоку сообщений MIDI, что секвенсер производит.) Как правило, есть два типа графических средств управления на каждой дорожке: бесшумная кнопка и сольная кнопка. Если бесшумная кнопка будет активирована, то та дорожка не будет звучать ни при каких обстоятельствах, пока бесшумная кнопка не будет деактивирована. Soloing является менее известной функцией. Это - примерно противоположность отключения звука. Если сольная кнопка на какой-либо дорожке будет активирована, то только дорожки, сольные кнопки которых активируются, будут звучать. Эта функция позволяет пользователю быстро прослушивать небольшое количество дорожек, не имея необходимость отключать звук всех других дорожек. Бесшумная кнопка обычно берет приоритет над сольной кнопкой: если оба активируются, дорожка не звучит.
Используя Sequencer
методы, дорожки отключения звука или soloing (так же как запросы бесшумного тока дорожки или сольное состояние) легко выполняются. Давайте предполагать, что мы получили значение по умолчанию Sequencer
и это мы загрузили данные последовательности в это. Отключение звука пятой дорожки в последовательности было бы выполнено следующим образом:
sequencer.setTrackMute(4, true); boolean muted = sequencer.getTrackMute(4); if (!muted) { return; // muting failed }
Есть несколько вещей отметить о вышеупомянутом фрагменте кода. Во-первых, дорожки последовательности нумеруются, запускаясь с 0 и заканчиваясь общим количеством дорожек минус 1. Кроме того, второй параметр setTrackMute
булево. Если это - истина, запрос должен отключить звук дорожки; иначе запрос должен неотключить звук указанной дорожки. Наконец, чтобы протестировать это, отключение звука вступило в силу, мы вызываем Sequencer getTrackMute
метод, передавая это номер дорожки мы запрашиваем. Если это возвращается true
, поскольку мы ожидали бы в этом случае, тогда бесшумный работавший запрос. Если это возвращается false
, тогда это перестало работать.
Бесшумные запросы могут перестать работать по различным причинам. Например, номер дорожки, определенный в setTrackMute
вызов мог бы превысить общее количество дорожек, или секвенсер не мог бы поддерживать отключение звука. Вызывая getTrackMute
, мы можем определить если наш запрос, за которым следуют или отказавший.
Как в стороне, булево это возвращается getTrackMute
может, действительно, сказать нам, если отказ произошел, но он не может сказать нам, почему он произошел. Мы могли протестировать, чтобы видеть, был ли отказ вызван, передавая недопустимый номер дорожки к setTrackMute
метод. Чтобы сделать это, мы вызвали бы getTracks
метод Sequence
, который возвращает массив, содержащий все дорожки в последовательности. Если номер дорожки, определенный в setTrackMute
вызов превышает длину этого массива, тогда мы знаем, что определили недопустимый номер дорожки.
Если бесшумный запрос успешно выполнялся, то в нашем примере, пятая дорожка не будет звучать, когда последовательность будет играть, ни будут любые другие дорожки, которые в настоящий момент отключаются звук.
Метод и методы для soloing дорожка очень подобны тем для того, чтобы отключить звук. К соло дорожка вызовите setTrackSolo
метод Sequence:
void setTrackSolo(int track, boolean bSolo)
Как в setTrackMute
, первый параметр определяет основанный на нуле номер дорожки, и второй параметр, если true
, определяет, что дорожка должна быть в сольном режиме; иначе дорожка не должна быть soloed.
По умолчанию дорожка ни не отключается звук, ни soloed.
Sequencer
вызывали внутренний class Sequencer.SyncMode
. A SyncMode
объект представляет один из путей, которыми понятие секвенсера MIDI времени может синхронизироваться с ведущим или ведомым устройством. Если секвенсер синхронизируется с ведущим устройством, секвенсер пересматривает свое текущее время в ответ на определенные сообщения MIDI от ведущего устройства. Если у секвенсера есть ведомое устройство, секвенсер так же отправляет сообщения MIDI, чтобы управлять синхронизацией ведомого устройства.
Есть три предопределенных режима, которые определяют возможные ведущие устройства для секвенсера: INTERNAL_CLOCK
, MIDI_SYNC
, и MIDI_TIME_CODE
. Последние два работают, если секвенсер получает сообщения MIDI от другого устройства. В этих двух режимах время секвенсера сбрасывается основанное на системе сообщения часов синхронизации в реальном времени или временной код MIDI (MTC) сообщения, соответственно. (См. спецификацию MIDI для получения дополнительной информации об этих типах сообщения.) Эти два режима могут также использоваться в качестве ведомых режимов, когда секвенсер отправляет соответствующие типы сообщений MIDI к его получателю. Четвертый режим, NO_SYNC
, используется, чтобы указать, что секвенсер не должен отправить информацию о синхронизации своим получателям.
Вызывая setMasterSyncMode
метод с поддерживаемым SyncMode
возразите как параметр, можно определить, как синхронизацией секвенсера управляют. Аналогично, setSlaveSyncMode
метод определяет, какую информацию о синхронизации секвенсер отправит его получателям. Эта информация управляет синхронизацией устройств, которые используют секвенсер в качестве основного источника синхронизации.
Каждая дорожка последовательности может содержать много различных видов MidiEvents
. Такие события включают Примечание По и Примечание От сообщений, изменений программы, управляют изменениями, и метасобытиями. API Звука Java определяет интерфейсы "слушателя" для последних двух из этих типов события (события изменения управления и метасобытия). Можно использовать эти интерфейсы, чтобы получить уведомления, когда такие события имеют место во время воспроизведения последовательности.
Объекты, которые поддерживают ControllerEventListener
интерфейс может получить уведомление когда a Sequencer
процессы определенные сообщения изменения управления. Сообщение изменения управления является стандартным типом сообщения MIDI, которое представляет изменение в значении MIDI-контроллера, такого как колесо изгиба подачи или ползунок данных. (См. спецификацию MIDI для полного списка сообщений изменения управления.), Когда такое сообщение обрабатывается во время воспроизведения последовательности, сообщение сообщает любому устройству (вероятно, синтезатор), это получает данные от секвенсера, чтобы обновить значение некоторого параметра. Параметр обычно управляет некоторым аспектом синтеза звука, такого как подача в настоящий момент звучащих примечаний, если контроллер был колесом изгиба подачи. Когда последовательность записывается, сообщение изменения управления означает, что контроллер на внешнем физическом устройстве, которое создало сообщение, был перемещен, или что такое перемещение было моделировано в программном обеспечении.
Вот то, как ControllerEventListener
интерфейс используется. Давайте предполагать, что Вы разработали class, который реализует ControllerEventListener
интерфейс, означая, что Ваш class содержит следующий метод:
void controlChange(ShortMessage msg)
Также давайте предполагать, что Вы создали экземпляр своего class и присвоили его вызванной переменной myListener
. Если Вы включаете следующие операторы где-нибудь в пределах Вашей программы:
int[] controllersOfInterest = { 1, 2, 4 }; sequencer.addControllerEventListener(myListener, controllersOfInterest);
тогда Ваш class controlChange
метод будет вызван каждый раз, когда секвенсер обрабатывает сообщение изменения управления для MIDI-контроллера номера 1, 2, или 4. Другими словами, когда Sequencer
обрабатывает запрос, чтобы установить значение любого из зарегистрированных контроллеров, Sequencer
вызовет Ваш class controlChange
метод. (Отметьте, что присвоения чисел MIDI-контроллера к определенным управляющим устройствам детализируются в MIDI 1.0 Спецификации.)
controlChange
метод передают a ShortMessage
содержа число контроллера, на которое влияют, и новое значение, в которое был установлен контроллер. Можно получить число контроллера, используя ShortMessage.getData1
метод, и новая установка значения контроллера, используя ShortMessage.getData2
метод.
Другой вид слушателя специального мероприятия определяется MetaEventListener
интерфейс. Сообщения Меты, согласно Стандартным Файлам MIDI 1.0 спецификации, являются сообщениями, которые не присутствуют в протоколе провода MIDI, но это может быть встроено в файл MIDI. Они не значимы для синтезатора, но могут быть интерпретированы секвенсером. Сообщения Меты включают инструкции (такие как команды изменения темпа), лирика или другой текст, и другие индикаторы (такие как конец дорожки).
MetaEventListener
механизм походит ControllerEventListener
. Реализуйте MetaEventListener
интерфейс в любом class, экземпляры которого должны быть уведомлены когда a MetaMessage
обрабатывается секвенсером. Это включает добавление следующего метода к class:
void meta(MetaMessage msg)
Вы регистрируете экземпляр этого class, передавая это как параметр Sequencer addMetaEventListener
метод:
boolean b = sequencer.addMetaEventListener (myMetaListener);
Это немного отличается от подхода, проявленного ControllerEventListener
интерфейс, потому что необходимо зарегистрироваться, чтобы получить все MetaMessages,
не только выбранные интереса. Если секвенсер встречается с a MetaMessage
в его последовательности это вызовет myMetaListener.meta
, передача этого MetaMessage
встреченный. meta
метод может вызвать getType
на MetaMessage
параметр, чтобы получить целое число от 0 до 127, который указывает на тип сообщения, как определено Стандартными Файлами MIDI 1.0 спецификации.