Spec-Zone .ru
спецификации, руководства, описания, API
|
Sequencer
интерфейс обеспечивает методы в нескольких категориях:
Sequence
объект, и сохранять в настоящий момент загруженные данные последовательности к файлу MIDI.Sequence
.Sequencer
может играть в различных темпах, с некоторыми Tracks
с отключенным звуком, и в различной синхронизации утверждает с другими объектами.Sequencer
определенные виды процессов событий MIDI. Независимо от которого Sequencer
методы, которые Вы вызовете, первый шаг, должны получить a Sequencer
устройство от системы и резерва это для использования Вашей программы.
Прикладная программа не инстанцирует a Sequencer
; в конце концов, Sequencer
только интерфейс. Вместо этого как все устройства в пакете MIDI API Звука Java, a Sequencer
получается доступ через помехи MidiSystem
объект. Как ранее упомянуто в 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.
Получив секвенсер из системы и зарезервированный это, Вы тогда должны загрузить данные, которые должен играть секвенсер. Есть три типичных способа выполнить это:
MidiEvent
объекты к тем дорожкам Мы будем теперь смотреть на первый из этих способов получить данные последовательности. (Другие два пути описываются ниже при Записи и Сохранении Последовательностей и Редактировании Последовательности, соответственно.) Этот первый путь фактически охватывает два немного отличающихся подхода. Один подход должен подать данные файла 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
:
MidiSystem.getSequencer
заставить новый секвенсер использовать для того, чтобы записать, как выше.setReceiver
метод, чтобы отправить данные a Receiver
связанный с записью Sequencer
.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
; они могут быть добавлены позже как необходимый.Track
в Sequence
, с Sequence.createTrack
. Этот шаг является ненужным если Sequence
создавался с начальной буквой Tracks
.Sequencer.setSequence
, выберите наше новое Sequence
получить запись. setSequence
метод связывает существующее Sequence
с Sequencer
, который несколько походит на загрузку ленты на магнитофон.Sequencer.recordEnable
для каждого Track
быть записанным. В случае необходимости получите ссылку на доступное Tracks
в Sequence
вызывая Sequence.getTracks
.startRecording
на Sequencer
.Sequencer.stop
или Sequencer.stopRecording
.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
.
В комбинации эти низкоуровневые методы обеспечивают основание для функциональности редактирования, необходимой полнофункциональной программе секвенсера.