Проигрывание звука в Java 2
Управлять проигрыванием файла можно с помощью событий. Событие класса LineEvent происходит при открытии, OPEN, и закрытии, CLOSE, потока, при начале, START, и окончании, STOP, проигрывания. Характер события отмечается указанными константами. Соответствующий интерфейс LineListener описывает только один метод update ().
В MIDI-файлах хранится последовательность (sequence) команд для секвенсора (sequencer) – устройства для записи, проигрывания и редактирования MlDI-последовательности, которым может быть физическое устройство или программа. Последовательность состоит из нескольких дорожек (tracks), на которых записаны MIDI-события (events). Каждая дорожка загружается в своем канале (channel). Обычно дорожка содержит звучание одного музыкального инструмента или запись голоса одного исполнителя или запись нескольких исполнителей, микшированную синтезатором (synthesizer).
Для проигрывания MIDI-последовательности в простейшем случае надо создать экземпляр секвенсора, открыть его и направить в него последовательность, извлеченную из файла, как показано в листинге 15.17. После этого следует начать проигрывание методом start (). Закончить проигрывание можно методом stop(), "перемотать" последовательность на начало записи или на указанное время проигрывания – методами setMicrosecondPosition(long mcs) или setTickPosition(long tick).
Листинг 15.17. Проигрывание MIDI-последовательности.
import javax.sound.midi.*; import java.io.*; class PlayMIDK PlayMIDKString s) { play(s); } public void play(String file){ try{ File f = new File(file); // Получаем секвенсор по умолчанию Sequencer sequencer = MidiSystem.getSequencerО; // Проверяем, получен ли секвенсор if (sequencer = null) { System.err.println("Sequencer is not supported"); System.exit(0); } // Открываем секвенсор sequencer.open(); // Получаем MIDI-последовательность из файла Sequence seq = MidiSystem.getSequence(f); // Направляем последовательность в секвенсор sequencer.setSequence(seq); // Начинаем проигрывание sequencer.start(); // Здесь надо сделать задержку на время проигрывания, // а затем остановить: sequencer.stop(); )catch(Exception e){ System.err.println(e); } } public static void main(String[] args){ String s = "doom.mid"; if (args.length > 0) s = args[0]; new PlayMIDI(s); } }