Spec-Zone .ru
спецификации, руководства, описания, API
След: Звук
Предоставление Услуг MIDI
Домашняя страница > Звук

Предоставление Услуг MIDI

Введение в Интерфейсы Поставщика услуг, объясненные, что javax.sound.sampled.spi и javax.sound.midi.spi пакеты определяют абстрактные классы, которые будут использоваться разработчиками звуковых служб. Реализовывая подкласс одного из этих абстрактных классов, поставщик услуг может создать новую службу, которая расширяет функциональность системы времени выполнения. Предыдущий раздел, покрытый использование javax.sound.sampled.spi пакет. Этот раздел обсуждает, как использовать javax.sound.midi.spi пакет, чтобы предоставить новые услуги для того, чтобы обработать MIDI-устройства и файлы.

Есть четыре абстрактных класса в javax.sound.midi.spi пакет, которые представляют четыре различных типов служб, что можно предусмотреть систему MIDI:

Прикладная программа не будет непосредственно создавать экземпляр службы object⠀” ли объект провайдера, такой как a MidiDeviceProvider, или объект, такой как a Synthesizer, это предоставляется объектом провайдера. И при этом программа непосредственно не отнесется к классам SPI. Вместо этого прикладная программа обращается с просьбами к MidiSystem объект в javax.sound.midi пакет, и MidiSystem поочередно подклассы бетона использования javax.sound.midi.spi классы, чтобы обработать эти запросы.

Предоставление Услуг Записи файла MIDI

Есть три стандартных форматов файлов MIDI, все из которых реализация API Звука Java может поддерживать: Тип 0, Тип 1, и Тип 2. Эти форматы файлов отличаются по своему внутреннему представлению данных последовательности MIDI в файле, и являются подходящими для различных видов последовательностей. Если реализация самостоятельно не поддерживает все три типа, поставщик услуг может предоставить поддержку нереализованных. Есть также разновидности стандартных форматов файлов MIDI, некоторые из них собственные, который так же мог поддерживаться сторонним поставщиком.

Возможность записать файлы MIDI обеспечивается конкретными подклассами MidiFileWriter. Этот абстрактный class непосредственно походит javax.sampled.spi.AudioFileWriter. Снова, методы группируются в методы запроса для того, чтобы изучить то, что типы файлов могут быть записаны, и методы для того, чтобы фактически записать файл. Как с AudioFileWriter, два из методов запроса конкретны:

boolean isFileTypeSupported(int fileType)
boolean isFileTypeSupported(int fileType, Sequence sequence) 

Первый из них предоставляет общую информацию о том, может ли писатель файла когда-либо писать указанный тип типа файла MIDI. Второй метод является более определенным: это спрашивает, может ли определенная Последовательность быть записана указанному типу файла MIDI. Обычно, Вы не должны переопределить ни один из этих двух конкретных методов. В реализации по умолчанию каждый вызывает один из двух других соответствующих методов запроса и выполняет итерации по возвращенным результатам. Будучи абстрактным, эти другие два метода запроса должны быть реализованы в подклассе:

abstract int[] getMidiFileTypes() 
abstract int[] getMidiFileTypes(Sequence sequence) 

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

write методы a MidiFileWriter подкласс выполняет кодирование данных в данном Sequence в корректный формат данных для требуемого типа файла MIDI, пишущий кодированный поток или в файл или в поток вывода:

abstract int write(Sequence in, int fileType, 
                   java.io.File out) 
abstract int write(Sequence in, int fileType, 
                   java.io.OutputStream out) 

Сделать это, write метод должен проанализировать Sequence выполняя итерации по его дорожкам, создайте соответствующий заголовок файла, и запишите заголовок и дорожки к выводу. Формат заголовка файла MIDI, конечно, определяется спецификацией MIDI. Это включает такую информацию как "магическое число", идентифицирующее это как файл MIDI, продолжительность заголовка, число дорожек, и информация о синхронизации последовательности (тип подразделения и разрешение). Остальная часть файла MIDI состоит из данных дорожки в формате, определенном спецификацией MIDI.

Кратко давайте смотреть на то, как прикладная программа, система MIDI, и поставщик услуг сотрудничают в письменной форме файл MIDI. В типичной ситуации у прикладной программы есть определенный MIDI Sequence сохранить к файлу. Программа запрашивает MidiSystem объект видеть, какие форматы файлов MIDI, если таковые вообще имеются, поддерживаются для детали Sequence под рукой, прежде, чем попытаться записать файл. MidiSystem.getMidiFileTypes(Sequence) метод возвращает массив всех типов файла MIDI, в которые система может записать определенную последовательность. Это делает это, вызывая соответствие getMidiFileTypes метод для каждого из установленных MidiFileWriter службы, и сбор и возврат результатов в массиве целых чисел, которые могут считаться основным списком всех типов файла, совместимых с данным Sequence. Когда дело доходит до записи Sequence к файлу, звонку MidiSystem.write передается целое число, представляющее тип файла, наряду с Sequence быть записанным и выходной файл; MidiSystem использует предоставленный тип, чтобы решить, который устанавливал MidiFileWriter должен обработать запрос записи, и диспетчеризирует соответствие write к соответствующему MidiFileWriter.

Предоставление Услуг Чтения файла MIDI

MidiFileReader абстрактный class непосредственно походит javax.sampled.spi.AudioFileReader class. Оба состоят из двух перегруженных методов, каждый из которых может взять a File, URL, или InputStream параметр. Первый из перегруженных методов возвращает формат файла указанного файла. В случае MidiFileReader, API:

abstract MidiFileFormat getMidiFileFormat(java.io.File file) 
abstract MidiFileFormat getMidiFileFormat(
    java.io.InputStream stream) 
abstract MidiFileFormat getMidiFileFormat(java.net.URL url) 

Конкретные подклассы должны реализовать эти методы, чтобы возвратить заполненный MidiFileFormat объект, описывающий формат указанного файла MIDI (или поток или URL), предполагая, что файл имеет тип, поддерживаемый средством чтения файлов и что это содержит допустимую информацию о заголовке. Иначе, InvalidMidiDataException должен быть брошен.

Другой перегруженный метод возвращает MIDI Sequence от данного файла, потока, или URL:

abstract Sequence getSequence(java.io.File file) 
abstract Sequence getSequence(java.io.InputStream stream) 
abstract Sequence getSequence(java.net.URL url) 

getSequence метод выполняет фактическую работу парсинга байтов во входном файле MIDI и построении соответствия Sequence объект. Это - по существу инверсия процесса, используемого MidiFileWriter.write. Поскольку есть взаимно-однозначное соответствие между содержанием файла MIDI как определено спецификацией MIDI и a Sequence возразите как определено API Звука Java, детали парсинга являются прямыми. Если файл, к которому передают getSequence содержит данные, которые не может проанализировать средство чтения файлов (например, потому что файл был поврежден или не соответствует спецификации MIDI), InvalidMidiDataException должен быть брошен.

Обеспечение Определенных MIDI-устройств

A MidiDeviceProvider может считаться фабрикой, которая предоставляет один или более определенных типов MIDI-устройства. class состоит из метода, который возвращает экземпляр MIDI-устройства, так же как методы запроса, чтобы изучить, какие виды устройств этот провайдер может предоставить.

Как с другим javax.sound.midi.spi службы, разработчики приложений получают косвенный доступ к a MidiDeviceProvider служба посредством звонка MidiSystem методы, в этом случае MidiSystem.getMidiDevice и MidiSystem.getMidiDeviceInfo. Цель разделить на подклассы MidiDeviceProvider должен предоставить новый вид устройства, таким образом, разработчик службы должен также создать сопроводительный class для устройства, являющегося returned⠀”, как мы видели с MixerProvider в javax.sound.sampled.spi пакет. Там, class возвращенного устройства, реализованный javax.sound.sampled.Mixer интерфейс; здесь это реализует javax.sound.midi.MidiDevice интерфейс. Это могло бы также реализовать подынтерфейс MidiDevice, такой как Synthesizer или Sequencer.

Поскольку единственный подкласс MidiDeviceProvider может обеспечить больше чем один тип MidiDevice, getDeviceInfo метод class возвращает массив MidiDevice.Info объекты, перечисляющие различное MidiDevices доступный:

abstract MidiDevice.Info[] getDeviceInfo() 

Возвращенный массив может содержать единственный элемент, конечно. Типичная реализация провайдера могла бы инициализировать массив в своем конструкторе и возвратить его сюда. Это позволяет MidiSystem выполнить итерации по всем установленным MidiDeviceProviders создать список всех установленных устройств. MidiSystem может тогда возвратить этот список (MidiDevice.Info[] массив) к прикладной программе.

MidiDeviceProvider также включает конкретный метод запроса:

boolean isDeviceSupported(MidiDevice.Info info) 

Этот метод разрешает системе запрашивать провайдера об определенном виде устройства. Обычно, Вы не должны переопределить этот метод удобства. Реализация по умолчанию выполняет итерации по массиву, возвращенному getDeviceInfo, и сравнивает параметр каждому элементу.

Третье и заключительное MidiDeviceProvider метод возвращает требуемое устройство:

abstract MidiDevice getDevice(MidiDevice.Info info) 

Этот метод должен сначала протестировать параметр, чтобы удостовериться, что это описывает устройство, которое может предоставить этот провайдер. Если это не делает, это должно бросить IllegalArgumentException. Иначе, это возвращает устройство.

Обеспечение Служб Чтения файла Soundbank

A SoundBank ряд Instruments это может быть загружено в a Synthesizer. Instrument реализация алгоритма синтеза звука, который производит определенный вид звука, и включает сопроводительное имя и информационные строки. A SoundBank примерно соответствует банку в спецификации MIDI, но это - более обширный и адресуемый набор; это может, возможно, лучше считаться набором банков MIDI.

SoundbankReader состоит из единственного перегруженного метода, который система вызывает, чтобы считать a Soundbank объект от soundbank файла:

abstract Soundbank getSoundbank(java.io.File file) 
abstract Soundbank getSoundbank(java.io.InputStream stream) 
abstract Soundbank getSoundbank(java.net.URL url) 

Конкретные подклассы SoundbankReader будет работать в тандеме с определенными определенными с помощью провайдера реализациями SoundBank, Instrument, и Synthesizer позволить системе загружать a SoundBank от файла в экземпляр детали Synthesizer class. Методы синтеза могут отличаться дико от одного Synthesizer другому, и, как следствие, данным, хранившим в Instrument или SoundBank обеспечение управления или данных спецификации для процесса синтеза a Synthesizer может взять множество форм. Один метод синтеза может потребовать только нескольких байтов данных параметра; другой может быть основан на обширных звуковых выборках. Ресурсы, существующие в a SoundBank будет зависеть от природы Synthesizer в который они загружаются, и поэтому реализация getSoundbank метод a SoundbankReader у подкласса есть доступ к знанию детали отчасти SoundBank. Кроме того, определенный подкласс SoundbankReader понимает определенный формат файла для того, чтобы сохранить SoundBank данные. Тот формат файла может быть специфичным для поставщика и собственным.

SoundBank только интерфейс, с только слабыми ограничениями на содержание a SoundBank объект. Методы объект должны поддерживать, чтобы реализовать этот интерфейс (getResources, getInstruments, getVendor, getName, и т.д.), налагают свободные требования к данным, чтобы объект содержал. Например, getResources и getInstruments может возвратить пустые массивы. Фактическое содержание разделенного на подклассы SoundBank объект, в особенности его инструменты и его неинструментальные ресурсы, определяется поставщиком услуг. Таким образом механизм парсинга soundbank файла зависит полностью от спецификации того определенного вида soundbank файла.

Файлы Soundbank создаются вне API Звука Java, обычно поставщиком синтезатора, который может загрузить такой soundbank. Некоторые поставщики могли бы предоставить инструменты конечного пользователя для того, чтобы создать такие файлы.

 


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

Предыдущая страница: Предоставление Услуг Выбранного аудио
Следующая страница: Конец Следа