Синтез и запись звука в Java 2
После создания последовательности ее можно проиграть, как в листинге 15.17, или записать в файл или выходной поток. Для этого вместо метода start() надо применить метод startRecording (), который одновременно и проигрывает последовательность, и подготавливает ее к записи, которую осуществляют статические методы:
write(Sequence in, int type, File out) write(Sequence in, int type, OutputStream out)
Второй аргумент type задает тип MIDI-файла, который лучше всего определить для заданной последовательности seq статическим методом getMidiFiieTypes(seq). Данный метод возвращает массив возможных типов. Надо воспользоваться нулевым элементом массива. Все это. показало в листинге 15.18.
Листинг 15.18. Создание MIDI-последовательности нот звукоряда.
import javax.sound.midi. *; import java.io.*; class SynMIDI { SynMIDI() { play(synth()); } public Sequence synth(){ Sequence seq = null; try{ // Последовательность будет отсчитывать по 10 // MIDI-событий на Звук длительностью в четверть seq = new Sequence(Sequence.PPQ, 10); // Создаем в последовательности одну дорожку Track tr = seq.createTrack(); for (int k = 0; k < 100; k++){ ShortMessage msg = new ShortMessage(); // Пробегаем MIDI-ноты от номера 10 до 109 msg.setMessage(ShortMessage.NOTE_ON, 10+k, 93); // Будем проигрывать ноты через каждые 5 отсчетов tr.add(new MidiEvent(msg, 5*k)); msg = null; } } catch (Exception e) { System, err.printing "From synth(): "+e); System.exit (0); } return seq; } public void play (Sequence seq) { try{ Sequencer sequencer = MidiSystem.getSequencer(); if (sequencer = null){ System.err.println("Sequencer is not supported"); System.exit(0); } sequencer.open(); sequencer.setSequence(seq); sequencer.startRecording(); int[] type = MidiSystem.getMidiFileTypes(seq); MidiSystem.write(seq, type[0], new File("gammas.mid")); }catch(Exception e) { System.err.println("From play(): " + e); } } public static void main(String[] args)( new SynMIDI(); } }
К сожалению, объем книги не позволяет коснуться темы о работе с синтезатором (synthesizer), микширования звука, работы с несколькими инструментами и прочих возможностей Java Sound API. В документации SUN J2SDK, в каталоге docs\guide\sound\prog_guide, есть подробное руководство программиста, а в каталоге demo\sound\src лежат исходные тексты синтезатора, использующего Java Sound API.