Spec-Zone .ru
спецификации, руководства, описания, API
След: Звук
Используя Методы Секвенсера
Домашняя страница > Звук

Используя Методы Секвенсера

Sequencer интерфейс обеспечивает методы в нескольких категориях:

Независимо от которого Sequencer методы, которые Вы вызовете, первый шаг, должны получить a Sequencer устройство от системы и резерва это для использования Вашей программы.

Получение Секвенсера

Прикладная программа не инстанцирует a Sequencer; в конце концов, Sequencer только интерфейс. Вместо этого как все устройства в пакете MIDI API Звука Java, a Sequencer получается доступ через помехи MidiSystem объект. Как ранее упомянуто в Доступе к Системным ресурсам MIDI, следующему MidiSystem метод может использоваться, чтобы получить значение по умолчанию Sequencer:

static Sequencer getSequencer()

Следующий фрагмент кода получает значение по умолчанию Sequencer, получает любые системные ресурсы, в которых это нуждается, и делает это операционным:

Sequencer sequencer;
// Get default sequencer.
sequencer = MidiSystem.getSequencer(); 
if (sequencer == null) {
    // Error -- sequencer device is not supported.
    // Inform user and return...
} else {
    // Acquire resources and make operational.
    sequencer.open();
}

Вызов open резервирует устройство секвенсера для использования Вашей программы. Не имеет большого количества смысла предполагать совместно использовать секвенсер, потому что это может играть только одну последовательность за один раз. Когда Вы делаетесь, используя секвенсер, можно сделать его доступным для других программ, вызывая close.

Секвенсеры не по умолчанию могут быть получены как описано в Доступе к Системным ресурсам MIDI.

Загрузка Последовательности

Получив секвенсер из системы и зарезервированный это, Вы тогда должны загрузить данные, которые должен играть секвенсер. Есть три типичных способа выполнить это:

Мы будем теперь смотреть на первый из этих способов получить данные последовательности. (Другие два пути описываются ниже при Записи и Сохранении Последовательностей и Редактировании Последовательности, соответственно.) Этот первый путь фактически охватывает два немного отличающихся подхода. Один подход должен подать данные файла MIDI к InputStream то, что Вы тогда читаете непосредственно в секвенсер посредством Sequencer.setSequence(InputStream). С этим подходом Вы явно не создаете a Sequence объект. Фактически, Sequencer реализация не могла бы даже создать a Sequence негласно, потому что у некоторых секвенсеров есть встроенный механизм для того, чтобы обработать данные непосредственно от файла.

Другой подход должен создать a Sequence явно. Вы должны будете использовать этот подход, если Вы соберетесь отредактировать данные последовательности прежде, чем играть его. С этим подходом Вы вызываете MidiSystem's перегруженный метод getSequence. Метод в состоянии получить последовательность от InputStream, a File, или a URL. Метод возвращает a Sequence объект, который может тогда быть загружен в a Sequencer для воспроизведения. Подробно останавливаясь на предыдущей выборке кода, вот пример получения a Sequence объект от a File и загрузка этого в наш sequencer:

try {
    File myMidiFile = new File("seq1.mid");
    // Construct a Sequence object, and
    // load it into my sequencer.
    Sequence mySeq = MidiSystem.getSequence(myMidiFile);
    sequencer.setSequence(mySeq);
} catch (Exception e) {
   // Handle error and/or return
}

Как MidiSystem's getSequence метод, setSequence может бросить InvalidMidiDataException⠀” и, в случае InputStream разновидность, IOException⠀”, если это сталкивается с проблемой.

Игра Последовательности

Запуск и остановка a Sequencer выполняется, используя следующие методы:

    void start()

и

    void stop()

Sequencer.start метод начинает воспроизведение последовательности. Отметьте, что воспроизведение запускается в текущей позиции в последовательности. Загрузка существующей последовательности, используя setSequence метод, описанный выше, инициализирует текущую позицию секвенсера к самому началу последовательности. stop метод останавливает секвенсер, но это автоматически не перематывает ток Sequence. Запуск остановленного Sequence не сбрасывая позицию просто возобновляет воспроизведение последовательности от текущей позиции. В этом случае, stop метод служил работой паузы. Однако, там являются различными Sequencer методы для того, чтобы установить текущую позицию последовательности в произвольное значение перед воспроизведением запускаются. (Мы обсудим эти методы ниже.)

Как отмечалось ранее, a Sequencer обычно имеет один или больше Transmitter объекты, через которые это передается MidiMessages к a Receiver. Это через них Transmitters это a Sequencer игры Sequence, испуская соответственно синхронизированный MidiMessages это соответствует MidiEvents содержавшийся в токе Sequence. Поэтому, часть процедуры установки для того, чтобы воспроизвести a Sequence должен вызвать setReceiver метод на Sequencer's Transmitter объект, в действительности соединяя его вывод проводом к устройству, которое использует назад играемые данные. Для получения дополнительной информации на Transmitters и Receivers, вернитесь к Передаче и Получению сообщений MIDI.

Запись и Сохранение Последовательностей

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

  1. Использовать MidiSystem.getSequencer заставить новый секвенсер использовать для того, чтобы записать, как выше.
  2. Установите "проводное соединение" соединений MIDI. Объект, который передает данные MIDI, которые будут записаны, должен быть сконфигурирован через setReceiver метод, чтобы отправить данные a Receiver связанный с записью Sequencer.
  3. Создайте новое Sequence объект, который будет хранить записанные данные. Когда Вы создаете Sequence объект, следует определить глобальную информацию о синхронизации для последовательности. Например:
          Sequence mySeq;
          try{
              mySeq = new Sequence(Sequence.PPQ, 10);
          } catch (Exception ex) { 
              ex.printStackTrace(); 
          }
    
    Конструктор для Sequence берет в качестве параметров a divisionType и разрешение синхронизации. divisionType параметр определяет модули параметра разрешения. В этом случае мы определили что разрешение синхронизации Sequence мы создаем, будут 10 импульсов на четвертную ноту. Дополнительный дополнительный параметр Sequence конструктор является многим параметром дорожек, который заставил бы начальную последовательность начинаться с конкретного количества (первоначально пустой) Tracks. Иначе Sequence будет создаваться без начальной буквы Tracks; они могут быть добавлены позже как необходимый.
  4. Создайте пустое Track в Sequence, с Sequence.createTrack. Этот шаг является ненужным если Sequence создавался с начальной буквой Tracks.
  5. Используя Sequencer.setSequence, выберите наше новое Sequence получить запись. setSequence метод связывает существующее Sequence с Sequencer, который несколько походит на загрузку ленты на магнитофон.
  6. Вызвать Sequencer.recordEnable для каждого Track быть записанным. В случае необходимости получите ссылку на доступное Tracks в Sequence вызывая Sequence.getTracks.
  7. Вызвать startRecording на Sequencer.
  8. Когда сделано записывая, вызвать Sequencer.stop или Sequencer.stopRecording.
  9. Сохраните записанный Sequence к файлу MIDI с MidiSystem.write. write метод MidiSystem берет a Sequence как один из его параметров, и запишет это Sequence к потоку или файлу.

Редактирование Последовательности

Много прикладных программ позволяют последовательности создаваться, загружая это из файла, и довольно многие также позволяют последовательности создаваться, получая это от живого ввода MIDI (то есть, записывая). Некоторые программы, однако, должны будут создать последовательности MIDI с нуля, или программно или в ответ на ввод данных пользователем. Полнофункциональные программы секвенсера разрешают пользователю вручную создавать новые последовательности, так же как редактировать существующие.

Эти редактирующие данные операции достигаются в API Звука Java не Sequencer методы, но методами объектов данных непосредственно: Sequence, Track, и MidiEvent. Можно создать пустую последовательность, используя один из Sequence конструкторы, и затем добавляют дорожки к этому, вызывая следующий Sequence метод:

    Track createTrack() 

Если Ваша программа позволит пользователю редактировать последовательности, то Вы будете нуждаться в этом Sequence метод, чтобы удалить дорожки:

    boolean deleteTrack(Track track) 

Как только последовательность содержит дорожки, можно изменить содержание дорожек, вызывая методы Track class. MidiEvents содержавшийся в Track сохранены как a java.util.Vector в Track объект, и Track обеспечивает ряд методов для того, чтобы он получил доступ, добавил, и удалил события в списке. Методы add и remove довольно очевидны, добавляя или удаляя указанное MidiEvent от a Track. A get метод обеспечивается, который берет индексирование в Track's список событий и возвраты MidiEvent сохраненный там. Кроме того, есть size и tick методы, которые соответственно возвращают число MidiEvents в дорожке, и продолжительности дорожки, выраженной как общее количество Ticks.

Чтобы создать новое событие прежде, чем добавить это к дорожке, Вы будете, конечно, использовать MidiEvent конструктор. Чтобы определить или изменить сообщение MIDI, встроенное в конечном счете, можно вызвать setMessage метод соответствующего MidiMessage подкласс (ShortMessage, SysexMessage, или MetaMessage). Чтобы изменить время, когда событие должно иметь место, вызвать MidiEvent.setTick.

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


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

Предыдущая страница: Введение в Секвенсеры
Следующая страница: Использование Усовершенствованных Функций Секвенсера