Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/classes/javax/sound/midi/Sequencer.java
38830 views
/*1* Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425package javax.sound.midi;2627import java.io.InputStream;28import java.io.IOException;293031/**32* A hardware or software device that plays back a MIDI33* <code>{@link Sequence sequence}</code> is known as a <em>sequencer</em>.34* A MIDI sequence contains lists of time-stamped MIDI data, such as35* might be read from a standard MIDI file. Most36* sequencers also provide functions for creating and editing sequences.37* <p>38* The <code>Sequencer</code> interface includes methods for the following39* basic MIDI sequencer operations:40* <ul>41* <li>obtaining a sequence from MIDI file data</li>42* <li>starting and stopping playback</li>43* <li>moving to an arbitrary position in the sequence</li>44* <li>changing the tempo (speed) of playback</li>45* <li>synchronizing playback to an internal clock or to received MIDI46* messages</li>47* <li>controlling the timing of another device</li>48* </ul>49* In addition, the following operations are supported, either directly, or50* indirectly through objects that the <code>Sequencer</code> has access to:51* <ul>52* <li>editing the data by adding or deleting individual MIDI events or entire53* tracks</li>54* <li>muting or soloing individual tracks in the sequence</li>55* <li>notifying listener objects about any meta-events or56* control-change events encountered while playing back the sequence.</li>57* </ul>58*59* @see Sequencer.SyncMode60* @see #addMetaEventListener61* @see ControllerEventListener62* @see Receiver63* @see Transmitter64* @see MidiDevice65*66* @author Kara Kytle67* @author Florian Bomers68*/69public interface Sequencer extends MidiDevice {707172/**73* A value indicating that looping should continue74* indefinitely rather than complete after a specific75* number of loops.76*77* @see #setLoopCount78* @since 1.579*/80public static final int LOOP_CONTINUOUSLY = -1;81828384/**85* Sets the current sequence on which the sequencer operates.86*87* <p>This method can be called even if the88* <code>Sequencer</code> is closed.89*90* @param sequence the sequence to be loaded.91* @throws InvalidMidiDataException if the sequence contains invalid92* MIDI data, or is not supported.93*/94public void setSequence(Sequence sequence) throws InvalidMidiDataException;959697/**98* Sets the current sequence on which the sequencer operates.99* The stream must point to MIDI file data.100*101* <p>This method can be called even if the102* <code>Sequencer</code> is closed.103*104* @param stream stream containing MIDI file data.105* @throws IOException if an I/O exception occurs during reading of the stream.106* @throws InvalidMidiDataException if invalid data is encountered107* in the stream, or the stream is not supported.108*/109public void setSequence(InputStream stream) throws IOException, InvalidMidiDataException;110111112/**113* Obtains the sequence on which the Sequencer is currently operating.114*115* <p>This method can be called even if the116* <code>Sequencer</code> is closed.117*118* @return the current sequence, or <code>null</code> if no sequence is currently set.119*/120public Sequence getSequence();121122123/**124* Starts playback of the MIDI data in the currently125* loaded sequence.126* Playback will begin from the current position.127* If the playback position reaches the loop end point,128* and the loop count is greater than 0, playback will129* resume at the loop start point for the number of130* repetitions set with <code>setLoopCount</code>.131* After that, or if the loop count is 0, playback will132* continue to play to the end of the sequence.133*134* <p>The implementation ensures that the synthesizer135* is brought to a consistent state when jumping136* to the loop start point by sending appropriate137* controllers, pitch bend, and program change events.138*139* @throws IllegalStateException if the <code>Sequencer</code> is140* closed.141*142* @see #setLoopStartPoint143* @see #setLoopEndPoint144* @see #setLoopCount145* @see #stop146*/147public void start();148149150/**151* Stops recording, if active, and playback of the currently loaded sequence,152* if any.153*154* @throws IllegalStateException if the <code>Sequencer</code> is155* closed.156*157* @see #start158* @see #isRunning159*/160public void stop();161162163/**164* Indicates whether the Sequencer is currently running. The default is <code>false</code>.165* The Sequencer starts running when either <code>{@link #start}</code> or <code>{@link #startRecording}</code>166* is called. <code>isRunning</code> then returns <code>true</code> until playback of the167* sequence completes or <code>{@link #stop}</code> is called.168* @return <code>true</code> if the Sequencer is running, otherwise <code>false</code>169*/170public boolean isRunning();171172173/**174* Starts recording and playback of MIDI data. Data is recorded to all enabled tracks,175* on the channel(s) for which they were enabled. Recording begins at the current position176* of the sequencer. Any events already in the track are overwritten for the duration177* of the recording session. Events from the currently loaded sequence,178* if any, are delivered to the sequencer's transmitter(s) along with messages179* received during recording.180* <p>181* Note that tracks are not by default enabled for recording. In order to record MIDI data,182* at least one track must be specifically enabled for recording.183*184* @throws IllegalStateException if the <code>Sequencer</code> is185* closed.186*187* @see #startRecording188* @see #recordEnable189* @see #recordDisable190*/191public void startRecording();192193194/**195* Stops recording, if active. Playback of the current sequence continues.196*197* @throws IllegalStateException if the <code>Sequencer</code> is198* closed.199*200* @see #startRecording201* @see #isRecording202*/203public void stopRecording();204205206/**207* Indicates whether the Sequencer is currently recording. The default is <code>false</code>.208* The Sequencer begins recording when <code>{@link #startRecording}</code> is called,209* and then returns <code>true</code> until <code>{@link #stop}</code> or <code>{@link #stopRecording}</code>210* is called.211* @return <code>true</code> if the Sequencer is recording, otherwise <code>false</code>212*/213public boolean isRecording();214215216/**217* Prepares the specified track for recording events received on a particular channel.218* Once enabled, a track will receive events when recording is active.219* @param track the track to which events will be recorded220* @param channel the channel on which events will be received. If -1 is specified221* for the channel value, the track will receive data from all channels.222* @throws IllegalArgumentException thrown if the track is not part of the current223* sequence.224*/225public void recordEnable(Track track, int channel);226227228/**229* Disables recording to the specified track. Events will no longer be recorded230* into this track.231* @param track the track to disable for recording, or <code>null</code> to disable232* recording for all tracks.233*/234public void recordDisable(Track track);235236237/**238* Obtains the current tempo, expressed in beats per minute. The239* actual tempo of playback is the product of the returned value240* and the tempo factor.241*242* @return the current tempo in beats per minute243*244* @see #getTempoFactor245* @see #setTempoInBPM(float)246* @see #getTempoInMPQ247*/248public float getTempoInBPM();249250251/**252* Sets the tempo in beats per minute. The actual tempo of playback253* is the product of the specified value and the tempo factor.254*255* @param bpm desired new tempo in beats per minute256* @see #getTempoFactor257* @see #setTempoInMPQ(float)258* @see #getTempoInBPM259*/260public void setTempoInBPM(float bpm);261262263/**264* Obtains the current tempo, expressed in microseconds per quarter265* note. The actual tempo of playback is the product of the returned266* value and the tempo factor.267*268* @return the current tempo in microseconds per quarter note269* @see #getTempoFactor270* @see #setTempoInMPQ(float)271* @see #getTempoInBPM272*/273public float getTempoInMPQ();274275276/**277* Sets the tempo in microseconds per quarter note. The actual tempo278* of playback is the product of the specified value and the tempo279* factor.280*281* @param mpq desired new tempo in microseconds per quarter note.282* @see #getTempoFactor283* @see #setTempoInBPM(float)284* @see #getTempoInMPQ285*/286public void setTempoInMPQ(float mpq);287288289/**290* Scales the sequencer's actual playback tempo by the factor provided.291* The default is 1.0. A value of 1.0 represents the natural rate (the292* tempo specified in the sequence), 2.0 means twice as fast, etc.293* The tempo factor does not affect the values returned by294* <code>{@link #getTempoInMPQ}</code> and <code>{@link #getTempoInBPM}</code>.295* Those values indicate the tempo prior to scaling.296* <p>297* Note that the tempo factor cannot be adjusted when external298* synchronization is used. In that situation,299* <code>setTempoFactor</code> always sets the tempo factor to 1.0.300*301* @param factor the requested tempo scalar302* @see #getTempoFactor303*/304public void setTempoFactor(float factor);305306307/**308* Returns the current tempo factor for the sequencer. The default is309* 1.0.310*311* @return tempo factor.312* @see #setTempoFactor(float)313*/314public float getTempoFactor();315316317/**318* Obtains the length of the current sequence, expressed in MIDI ticks,319* or 0 if no sequence is set.320* @return length of the sequence in ticks321*/322public long getTickLength();323324325/**326* Obtains the current position in the sequence, expressed in MIDI327* ticks. (The duration of a tick in seconds is determined both by328* the tempo and by the timing resolution stored in the329* <code>{@link Sequence}</code>.)330*331* @return current tick332* @see #setTickPosition333*/334public long getTickPosition();335336337/**338* Sets the current sequencer position in MIDI ticks339* @param tick the desired tick position340* @see #getTickPosition341*/342public void setTickPosition(long tick);343344345/**346* Obtains the length of the current sequence, expressed in microseconds,347* or 0 if no sequence is set.348* @return length of the sequence in microseconds.349*/350public long getMicrosecondLength();351352353/**354* Obtains the current position in the sequence, expressed in355* microseconds.356* @return the current position in microseconds357* @see #setMicrosecondPosition358*/359public long getMicrosecondPosition();360361362/**363* Sets the current position in the sequence, expressed in microseconds364* @param microseconds desired position in microseconds365* @see #getMicrosecondPosition366*/367public void setMicrosecondPosition(long microseconds);368369370/**371* Sets the source of timing information used by this sequencer.372* The sequencer synchronizes to the master, which is the internal clock,373* MIDI clock, or MIDI time code, depending on the value of374* <code>sync</code>. The <code>sync</code> argument must be one375* of the supported modes, as returned by376* <code>{@link #getMasterSyncModes}</code>.377*378* @param sync the desired master synchronization mode379*380* @see SyncMode#INTERNAL_CLOCK381* @see SyncMode#MIDI_SYNC382* @see SyncMode#MIDI_TIME_CODE383* @see #getMasterSyncMode384*/385public void setMasterSyncMode(SyncMode sync);386387388/**389* Obtains the current master synchronization mode for this sequencer.390*391* @return the current master synchronization mode392*393* @see #setMasterSyncMode(Sequencer.SyncMode)394* @see #getMasterSyncModes395*/396public SyncMode getMasterSyncMode();397398399/**400* Obtains the set of master synchronization modes supported by this401* sequencer.402*403* @return the available master synchronization modes404*405* @see SyncMode#INTERNAL_CLOCK406* @see SyncMode#MIDI_SYNC407* @see SyncMode#MIDI_TIME_CODE408* @see #getMasterSyncMode409* @see #setMasterSyncMode(Sequencer.SyncMode)410*/411public SyncMode[] getMasterSyncModes();412413414/**415* Sets the slave synchronization mode for the sequencer.416* This indicates the type of timing information sent by the sequencer417* to its receiver. The <code>sync</code> argument must be one418* of the supported modes, as returned by419* <code>{@link #getSlaveSyncModes}</code>.420*421* @param sync the desired slave synchronization mode422*423* @see SyncMode#MIDI_SYNC424* @see SyncMode#MIDI_TIME_CODE425* @see SyncMode#NO_SYNC426* @see #getSlaveSyncModes427*/428public void setSlaveSyncMode(SyncMode sync);429430431/**432* Obtains the current slave synchronization mode for this sequencer.433*434* @return the current slave synchronization mode435*436* @see #setSlaveSyncMode(Sequencer.SyncMode)437* @see #getSlaveSyncModes438*/439public SyncMode getSlaveSyncMode();440441442/**443* Obtains the set of slave synchronization modes supported by the sequencer.444*445* @return the available slave synchronization modes446*447* @see SyncMode#MIDI_SYNC448* @see SyncMode#MIDI_TIME_CODE449* @see SyncMode#NO_SYNC450*/451public SyncMode[] getSlaveSyncModes();452453454/**455* Sets the mute state for a track. This method may fail for a number456* of reasons. For example, the track number specified may not be valid457* for the current sequence, or the sequencer may not support this functionality.458* An application which needs to verify whether this operation succeeded should459* follow this call with a call to <code>{@link #getTrackMute}</code>.460*461* @param track the track number. Tracks in the current sequence are numbered462* from 0 to the number of tracks in the sequence minus 1.463* @param mute the new mute state for the track. <code>true</code> implies the464* track should be muted, <code>false</code> implies the track should be unmuted.465* @see #getSequence466*/467public void setTrackMute(int track, boolean mute);468469470/**471* Obtains the current mute state for a track. The default mute472* state for all tracks which have not been muted is false. In any473* case where the specified track has not been muted, this method should474* return false. This applies if the sequencer does not support muting475* of tracks, and if the specified track index is not valid.476*477* @param track the track number. Tracks in the current sequence are numbered478* from 0 to the number of tracks in the sequence minus 1.479* @return <code>true</code> if muted, <code>false</code> if not.480*/481public boolean getTrackMute(int track);482483/**484* Sets the solo state for a track. If <code>solo</code> is <code>true</code>485* only this track and other solo'd tracks will sound. If <code>solo</code>486* is <code>false</code> then only other solo'd tracks will sound, unless no487* tracks are solo'd in which case all un-muted tracks will sound.488* <p>489* This method may fail for a number490* of reasons. For example, the track number specified may not be valid491* for the current sequence, or the sequencer may not support this functionality.492* An application which needs to verify whether this operation succeeded should493* follow this call with a call to <code>{@link #getTrackSolo}</code>.494*495* @param track the track number. Tracks in the current sequence are numbered496* from 0 to the number of tracks in the sequence minus 1.497* @param solo the new solo state for the track. <code>true</code> implies the498* track should be solo'd, <code>false</code> implies the track should not be solo'd.499* @see #getSequence500*/501public void setTrackSolo(int track, boolean solo);502503504/**505* Obtains the current solo state for a track. The default mute506* state for all tracks which have not been solo'd is false. In any507* case where the specified track has not been solo'd, this method should508* return false. This applies if the sequencer does not support soloing509* of tracks, and if the specified track index is not valid.510*511* @param track the track number. Tracks in the current sequence are numbered512* from 0 to the number of tracks in the sequence minus 1.513* @return <code>true</code> if solo'd, <code>false</code> if not.514*/515public boolean getTrackSolo(int track);516517518/**519* Registers a meta-event listener to receive520* notification whenever a meta-event is encountered in the sequence521* and processed by the sequencer. This method can fail if, for522* instance,this class of sequencer does not support meta-event523* notification.524*525* @param listener listener to add526* @return <code>true</code> if the listener was successfully added,527* otherwise <code>false</code>528*529* @see #removeMetaEventListener530* @see MetaEventListener531* @see MetaMessage532*/533public boolean addMetaEventListener(MetaEventListener listener);534535536/**537* Removes the specified meta-event listener from this sequencer's538* list of registered listeners, if in fact the listener is registered.539*540* @param listener the meta-event listener to remove541* @see #addMetaEventListener542*/543public void removeMetaEventListener(MetaEventListener listener);544545546/**547* Registers a controller event listener to receive notification548* whenever the sequencer processes a control-change event of the549* requested type or types. The types are specified by the550* <code>controllers</code> argument, which should contain an array of551* MIDI controller numbers. (Each number should be between 0 and 127,552* inclusive. See the MIDI 1.0 Specification for the numbers that553* correspond to various types of controllers.)554* <p>555* The returned array contains the MIDI controller556* numbers for which the listener will now receive events.557* Some sequencers might not support controller event notification, in558* which case the array has a length of 0. Other sequencers might559* support notification for some controllers but not all.560* This method may be invoked repeatedly.561* Each time, the returned array indicates all the controllers562* that the listener will be notified about, not only the controllers563* requested in that particular invocation.564*565* @param listener the controller event listener to add to the list of566* registered listeners567* @param controllers the MIDI controller numbers for which change568* notification is requested569* @return the numbers of all the MIDI controllers whose changes will570* now be reported to the specified listener571*572* @see #removeControllerEventListener573* @see ControllerEventListener574*/575public int[] addControllerEventListener(ControllerEventListener listener, int[] controllers);576577578/**579* Removes a controller event listener's interest in one or more580* types of controller event. The <code>controllers</code> argument581* is an array of MIDI numbers corresponding to the controllers for582* which the listener should no longer receive change notifications.583* To completely remove this listener from the list of registered584* listeners, pass in <code>null</code> for <code>controllers</code>.585* The returned array contains the MIDI controller586* numbers for which the listener will now receive events. The587* array has a length of 0 if the listener will not receive588* change notifications for any controllers.589*590* @param listener old listener591* @param controllers the MIDI controller numbers for which change592* notification should be cancelled, or <code>null</code> to cancel593* for all controllers594* @return the numbers of all the MIDI controllers whose changes will595* now be reported to the specified listener596*597* @see #addControllerEventListener598*/599public int[] removeControllerEventListener(ControllerEventListener listener, int[] controllers);600601602/**603* Sets the first MIDI tick that will be604* played in the loop. If the loop count is605* greater than 0, playback will jump to this606* point when reaching the loop end point.607*608* <p>A value of 0 for the starting point means the609* beginning of the loaded sequence. The starting610* point must be lower than or equal to the ending611* point, and it must fall within the size of the612* loaded sequence.613*614* <p>A sequencer's loop start point defaults to615* start of the sequence.616*617* @param tick the loop's starting position,618* in MIDI ticks (zero-based)619* @throws IllegalArgumentException if the requested620* loop start point cannot be set, usually because621* it falls outside the sequence's622* duration or because the start point is623* after the end point624*625* @see #setLoopEndPoint626* @see #setLoopCount627* @see #getLoopStartPoint628* @see #start629* @since 1.5630*/631public void setLoopStartPoint(long tick);632633634/**635* Obtains the start position of the loop,636* in MIDI ticks.637*638* @return the start position of the loop,639in MIDI ticks (zero-based)640* @see #setLoopStartPoint641* @since 1.5642*/643public long getLoopStartPoint();644645646/**647* Sets the last MIDI tick that will be played in648* the loop. If the loop count is 0, the loop end649* point has no effect and playback continues to650* play when reaching the loop end point.651*652* <p>A value of -1 for the ending point653* indicates the last tick of the sequence.654* Otherwise, the ending point must be greater655* than or equal to the starting point, and it must656* fall within the size of the loaded sequence.657*658* <p>A sequencer's loop end point defaults to -1,659* meaning the end of the sequence.660*661* @param tick the loop's ending position,662* in MIDI ticks (zero-based), or663* -1 to indicate the final tick664* @throws IllegalArgumentException if the requested665* loop point cannot be set, usually because666* it falls outside the sequence's667* duration or because the ending point is668* before the starting point669*670* @see #setLoopStartPoint671* @see #setLoopCount672* @see #getLoopEndPoint673* @see #start674* @since 1.5675*/676public void setLoopEndPoint(long tick);677678679/**680* Obtains the end position of the loop,681* in MIDI ticks.682*683* @return the end position of the loop, in MIDI684* ticks (zero-based), or -1 to indicate685* the end of the sequence686* @see #setLoopEndPoint687* @since 1.5688*/689public long getLoopEndPoint();690691692/**693* Sets the number of repetitions of the loop for694* playback.695* When the playback position reaches the loop end point,696* it will loop back to the loop start point697* <code>count</code> times, after which playback will698* continue to play to the end of the sequence.699* <p>700* If the current position when this method is invoked701* is greater than the loop end point, playback702* continues to the end of the sequence without looping,703* unless the loop end point is changed subsequently.704* <p>705* A <code>count</code> value of 0 disables looping:706* playback will continue at the loop end point, and it707* will not loop back to the loop start point.708* This is a sequencer's default.709*710* <p>If playback is stopped during looping, the711* current loop status is cleared; subsequent start712* requests are not affected by an interrupted loop713* operation.714*715* @param count the number of times playback should716* loop back from the loop's end position717* to the loop's start position, or718* <code>{@link #LOOP_CONTINUOUSLY}</code>719* to indicate that looping should720* continue until interrupted721*722* @throws IllegalArgumentException if <code>count</code> is723* negative and not equal to {@link #LOOP_CONTINUOUSLY}724*725* @see #setLoopStartPoint726* @see #setLoopEndPoint727* @see #getLoopCount728* @see #start729* @since 1.5730*/731public void setLoopCount(int count);732733734/**735* Obtains the number of repetitions for736* playback.737*738* @return the number of loops after which739* playback plays to the end of the740* sequence741* @see #setLoopCount742* @see #start743* @since 1.5744*/745public int getLoopCount();746747/**748* A <code>SyncMode</code> object represents one of the ways in which749* a MIDI sequencer's notion of time can be synchronized with a master750* or slave device.751* If the sequencer is being synchronized to a master, the752* sequencer revises its current time in response to messages from753* the master. If the sequencer has a slave, the sequencer754* similarly sends messages to control the slave's timing.755* <p>756* There are three predefined modes that specify possible masters757* for a sequencer: <code>INTERNAL_CLOCK</code>,758* <code>MIDI_SYNC</code>, and <code>MIDI_TIME_CODE</code>. The759* latter two work if the sequencer receives MIDI messages from760* another device. In these two modes, the sequencer's time gets reset761* based on system real-time timing clock messages or MIDI time code762* (MTC) messages, respectively. These two modes can also be used763* as slave modes, in which case the sequencer sends the corresponding764* types of MIDI messages to its receiver (whether or not the sequencer765* is also receiving them from a master). A fourth mode,766* <code>NO_SYNC</code>, is used to indicate that the sequencer should767* not control its receiver's timing.768*769* @see Sequencer#setMasterSyncMode(Sequencer.SyncMode)770* @see Sequencer#setSlaveSyncMode(Sequencer.SyncMode)771*/772public static class SyncMode {773774/**775* Synchronization mode name.776*/777private String name;778779/**780* Constructs a synchronization mode.781* @param name name of the synchronization mode782*/783protected SyncMode(String name) {784785this.name = name;786}787788789/**790* Determines whether two objects are equal.791* Returns <code>true</code> if the objects are identical792* @param obj the reference object with which to compare793* @return <code>true</code> if this object is the same as the794* <code>obj</code> argument, <code>false</code> otherwise795*/796public final boolean equals(Object obj) {797798return super.equals(obj);799}800801802/**803* Finalizes the hashcode method.804*/805public final int hashCode() {806807return super.hashCode();808}809810811/**812* Provides this synchronization mode's name as the string813* representation of the mode.814* @return the name of this synchronization mode815*/816public final String toString() {817818return name;819}820821822/**823* A master synchronization mode that makes the sequencer get824* its timing information from its internal clock. This is not825* a legal slave sync mode.826*/827public static final SyncMode INTERNAL_CLOCK = new SyncMode("Internal Clock");828829830/**831* A master or slave synchronization mode that specifies the832* use of MIDI clock833* messages. If this mode is used as the master sync mode,834* the sequencer gets its timing information from system real-time835* MIDI clock messages. This mode only applies as the master sync836* mode for sequencers that are also MIDI receivers. If this is the837* slave sync mode, the sequencer sends system real-time MIDI clock838* messages to its receiver. MIDI clock messages are sent at a rate839* of 24 per quarter note.840*/841public static final SyncMode MIDI_SYNC = new SyncMode("MIDI Sync");842843844/**845* A master or slave synchronization mode that specifies the846* use of MIDI Time Code.847* If this mode is used as the master sync mode,848* the sequencer gets its timing information from MIDI Time Code849* messages. This mode only applies as the master sync850* mode to sequencers that are also MIDI receivers. If this851* mode is used as the852* slave sync mode, the sequencer sends MIDI Time Code853* messages to its receiver. (See the MIDI 1.0 Detailed854* Specification for a description of MIDI Time Code.)855*/856public static final SyncMode MIDI_TIME_CODE = new SyncMode("MIDI Time Code");857858859/**860* A slave synchronization mode indicating that no timing information861* should be sent to the receiver. This is not a legal master sync862* mode.863*/864public static final SyncMode NO_SYNC = new SyncMode("No Timing");865866} // class SyncMode867}868869870