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.

Отключение звука или Отдельные Дорожки Soloing в Последовательности

Часто удобно для пользователей секвенсеров быть в состоянии выключить определенные дорожки, услышать более ясно точно, что происходит в музыке. Полнофункциональная программа секвенсера позволяет пользователю выбирать, какие дорожки должны звучать во время воспроизведения. (Говорящий более точно, так как секвенсеры фактически не создают, звучат как себя, пользователь выбирает, какие дорожки будут способствовать потоку сообщений 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.

Синхронизация с Другими MIDI-устройствами

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 спецификации.

 


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Используя Методы Секвенсера
Следующая страница: Синтезирование Звука