logo
Хабибуллин

Синтез и запись звука в Java

Синтез звука заключается в создании MIDI-последовательности — объекта класса Sequence — каким-либо способом: с микрофона, линейного входа, синтезатора, из файла или просто создать в программе, как это делается в листинге 20.18.

Сначала создается пустая последовательность одним из двух конструкторов:

Sequence(float divisionType, int resolution);

Sequence(float divisionType, int resolution, int numTracks);

Первый аргумент, divisionType, определяет способ отсчета моментов (ticks) MIDIсобытий — это одна из констант:

PPQ (Pulses Per Quarter note) — отсчеты замеряются в долях от длительности звука

в четверть;

SMPTE_24, SMPTE_25, SMPTE_30, SMPTE_30DROP (Society of Motion Picture and Television

Engineers) — отсчеты в долях одного кадра, при указанном числе кадров в секунду.

Второй аргумент, resolution, задает количество отсчетов в указанную единицу, например:

Sequence seq = new Sequence(Sequence.PPQ, 10);

задает 10 отсчетов в звуке длительностью в четверть.

Третий аргумент, numTracks, определяет количество дорожек в MIDI-последова- тельности.

Потом, если применялся первый из перечисленных ранее конструкторов, в последовательности создается одна или несколько дорожек:

Track tr = seq.createTrack();

Если применялся второй конструктор, то надо получить уже созданные конструктором дорожки:

Track[] trs = seq.getTracks();

Затем дорожки заполняются MIDI-событиями с помощью MIDI-сообщений. Есть несколько типов сообщений для разных типов событий. Наиболее часто встречаются сообщения типа ShortMessage, которые создаются конструктором по умолчанию и потом заполняются методом setMessage():

ShortMessage msg = new ShortMessage(); msg.setMessage(ShortMessage.NOTE_ON, 60, 93);

Первый аргумент указывает тип сообщения: NOTE_ON — начать звучание, NOTE_OFF — прекратить звучание и т. д. Второй аргумент для типа NOTE_ON показывает высоту звука,