Java Sound. Eine Einführung toc prev next
2.1. Das Midi Package
MIDI MessagesMidiMessage ist eine abstrakte Klasse die Ereignisse wie im MIDI wire protocol repräsentiert. Sie besitzen also keine timing-Informationen. Drei MidiMessage subclasses:
Midi deviceNeben der SoundCard und externen Midi-Instrumenten ist jede Software, die das MidiDevice interface implementiert eine MidiDevice. Sie besitzt mindestens
SequencerEin sequencer kann sequences aufnehmen und wiedergeben. Dafür besitzt er:
Wenn er aufnimmt, fügt er den "nackten" Midi messages
timing Informationen hinzu. SynthesizersEin Synthesizer ist eine device zum erzeugen von Sound, somit die einzige in dem Package.
Die MidiDevice interface Hierachie: 2.2. Zugriff auf die Midi System ResourcenMidiSystemEine Application kann von MidiSystem (muß nicht mit new erzeugt werden) folgende resources erhalten:
Diese methode liefern die default resources: static Sequencer getSequencer() static Synthesizer getSynthesizer() static Receiver getReceiver() static Transmitter getTransmitter() Auch alle übrigen resources werden als array von MidiDevice.Info Objekten zurückgegeben: static MidiDevice.Info[] getMidiDeviceInfo() Jedes MidiDevice.Info Objekten enthält
Durch Übergabe des MidiDevice.Info Objekts kann die entsprechende MidiDevice angefordert werden: static MidiDevice getMidiDevice(MidiDevice.Info info) Öffnen einer MidiDevice: if (!(device.isOpen())) { try { device.open(); } catch (MidiUnavailableException e) { // Handle or throw exception... } } Senden einer Message an einen ReceiverShortMessage myMsg = new ShortMessage(); // Start playing the note Middle C (60), // moderately loud (velocity = 93). myMsg.setMessage(ShortMessage.NOTE_ON, 0, 60, 93); long timeStamp = -1; // Get default Receiver. Receiver rcvr = MidiSystem.getReceiver(); rcvr.send(myMsg, timeStamp); Nachdem mit new eine neue ShortMessage erzeugt wurde. Er hält sie einen Inhalt. void setMessage(int command, int channel, int data1, int data2) Ein command könnte z.B. die Konstante ShortMessage.NOTE_ON sein. void send(MidiMessage message, long timeStamp) Die timeStamp -1 meint: Die Message soll so schnell wie möglich gesendet werden. Verbinden von Transmitter und ReceiverSequencer seq; Transmitter seqTrans; Synthesizer synth; Receiver synthRcvr; try { seq = MidiSystem.getSequencer(); seqTrans = seq.getTransmitter(); synth = MidiSystem.getSynthesizer(); synthRcvr = synth.getReceiver(); seqTrans.setReceiver(synthRcvr); } catch (MidiUnavailableException e) { // handle or throw exception } Übrigens können so die decive und alle dazugehörigen transmitters und receivers geschlossen werden: MidiDevice.close() 2.3. Abspielen, Aufzeichnen von Midi filesSequence
Ein MidiEvent kappselt eine MidiMessage, wie der Konstruktor zeigt MidiEvent(MidiMessage message, long tick) Die time-stamp darf nicht wie bei der MidiMessage in Milisekunden angegeben werden, sondern in sogenannte ticks. Die Länge eines ticks wird bestimmt in
mit Sequence.getDivisionType() erfährt man, welcher Type für die Sequence gilt. SequencerDer default Sequencer wird geöffnet durch: 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(); } Ein Midi file kann nur als Sequence in einen Sequencer geladen werden: 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 } Abspielen eines Midi filesgeschieht dann durch void start() void stop() des Sequencers. Recording und Saving einer Sequence
|
Java Sound. Eine Einführung toc prev next [ back to a P a g e ]