src/share/classes/javax/sound/midi/MidiChannel.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 23,537 **** * questions. */ package javax.sound.midi; - /** ! * A <code>MidiChannel</code> object represents a single MIDI channel. ! * Generally, each <code>MidiChannel</code> method processes a like-named MIDI ! * "channel voice" or "channel mode" message as defined by the MIDI specification. However, ! * <code>MidiChannel</code> adds some "get" methods that retrieve the value ! * most recently set by one of the standard MIDI channel messages. Similarly, ! * methods for per-channel solo and mute have been added. ! * <p> ! * A <code>{@link Synthesizer}</code> object has a collection ! * of <code>MidiChannels</code>, usually one for each of the 16 channels ! * prescribed by the MIDI 1.0 specification. The <code>Synthesizer</code> ! * generates sound when its <code>MidiChannels</code> receive ! * <code>noteOn</code> messages. * <p> * See the MIDI 1.0 Specification for more information about the prescribed ! * behavior of the MIDI channel messages, which are not exhaustively ! * documented here. The specification is titled <code>MIDI Reference: ! * The Complete MIDI 1.0 Detailed Specification</code>, and is published by ! * the MIDI Manufacturer's Association (<a href = http://www.midi.org> ! * http://www.midi.org</a>). * <p> * MIDI was originally a protocol for reporting the gestures of a keyboard ! * musician. This genesis is visible in the <code>MidiChannel</code> API, which * preserves such MIDI concepts as key number, key velocity, and key pressure. * It should be understood that the MIDI data does not necessarily originate * with a keyboard player (the source could be a different kind of musician, or ! * software). Some devices might generate constant values for velocity ! * and pressure, regardless of how the note was performed. ! * Also, the MIDI specification often leaves it up to the ! * synthesizer to use the data in the way the implementor sees fit. For ! * example, velocity data need not always be mapped to volume and/or brightness. ! * ! * @see Synthesizer#getChannels * * @author David Rivas * @author Kara Kytle */ - public interface MidiChannel { /** ! * Starts the specified note sounding. The key-down velocity ! * usually controls the note's volume and/or brightness. ! * If <code>velocity</code> is zero, this method instead acts like ! * {@link #noteOff(int)}, terminating the note. * * @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C) * @param velocity the speed with which the key was depressed - * * @see #noteOff(int, int) */ ! public void noteOn(int noteNumber, int velocity); /** ! * Turns the specified note off. The key-up velocity, if not ignored, can ! * be used to affect how quickly the note decays. ! * In any case, the note might not die away instantaneously; its decay ! * rate is determined by the internals of the <code>Instrument</code>. ! * If the Hold Pedal (a controller; see ! * {@link #controlChange(int, int) controlChange}) ! * is down, the effect of this method is deferred until the pedal is ! * released. ! * * * @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C) * @param velocity the speed with which the key was released - * * @see #noteOff(int) * @see #noteOn * @see #allNotesOff * @see #allSoundOff */ ! public void noteOff(int noteNumber, int velocity); /** * Turns the specified note off. * * @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C) - * * @see #noteOff(int, int) */ ! public void noteOff(int noteNumber); /** ! * Reacts to a change in the specified note's key pressure. ! * Polyphonic key pressure ! * allows a keyboard player to press multiple keys simultaneously, each ! * with a different amount of pressure. The pressure, if not ignored, ! * is typically used to vary such features as the volume, brightness, ! * or vibrato of the note. ! * ! * It is possible that the underlying synthesizer ! * does not support this MIDI message. In order ! * to verify that <code>setPolyPressure</code> ! * was successful, use <code>getPolyPressure</code>. * * @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C) ! * @param pressure value for the specified key, from 0 to 127 (127 = ! * maximum pressure) ! * * @see #getPolyPressure(int) */ ! public void setPolyPressure(int noteNumber, int pressure); /** * Obtains the pressure with which the specified key is being depressed. * * @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C) - * - * If the device does not support setting poly pressure, - * this method always returns 0. Calling - * <code>setPolyPressure</code> will have no effect then. - * * @return the amount of pressure for that note, from 0 to 127 * (127 = maximum pressure) - * * @see #setPolyPressure(int, int) */ ! public int getPolyPressure(int noteNumber); /** ! * Reacts to a change in the keyboard pressure. Channel ! * pressure indicates how hard the keyboard player is depressing ! * the entire keyboard. This can be the maximum or ! * average of the per-key pressure-sensor values, as set by ! * <code>setPolyPressure</code>. More commonly, it is a measurement of ! * a single sensor on a device that doesn't implement polyphonic key ! * pressure. Pressure can be used to control various aspects of the sound, ! * as described under {@link #setPolyPressure(int, int) setPolyPressure}. ! * ! * It is possible that the underlying synthesizer ! * does not support this MIDI message. In order ! * to verify that <code>setChannelPressure</code> ! * was successful, use <code>getChannelPressure</code>. * * @param pressure the pressure with which the keyboard is being depressed, * from 0 to 127 (127 = maximum pressure) * @see #setPolyPressure(int, int) * @see #getChannelPressure */ ! public void setChannelPressure(int pressure); /** * Obtains the channel's keyboard pressure. ! * If the device does not support setting channel pressure, ! * this method always returns 0. Calling ! * <code>setChannelPressure</code> will have no effect then. ! * ! * @return the amount of pressure for that note, ! * from 0 to 127 (127 = maximum pressure) * * @see #setChannelPressure(int) */ ! public int getChannelPressure(); /** ! * Reacts to a change in the specified controller's value. A controller ! * is some control other than a keyboard key, such as a ! * switch, slider, pedal, wheel, or breath-pressure sensor. ! * The MIDI 1.0 Specification provides standard numbers for typical ! * controllers on MIDI devices, and describes the intended effect ! * for some of the controllers. ! * The way in which an ! * <code>Instrument</code> reacts to a controller change may be ! * specific to the <code>Instrument</code>. ! * <p> ! * The MIDI 1.0 Specification defines both 7-bit controllers ! * and 14-bit controllers. Continuous controllers, such ! * as wheels and sliders, typically have 14 bits (two MIDI bytes), ! * while discrete controllers, such as switches, typically have 7 bits ! * (one MIDI byte). Refer to the specification to see the ! * expected resolution for each type of control. ! * <p> ! * Controllers 64 through 95 (0x40 - 0x5F) allow 7-bit precision. ! * The value of a 7-bit controller is set completely by the ! * <code>value</code> argument. An additional set of controllers ! * provide 14-bit precision by using two controller numbers, one ! * for the most significant 7 bits and another for the least significant ! * 7 bits. Controller numbers 0 through 31 (0x00 - 0x1F) control the ! * most significant 7 bits of 14-bit controllers; controller numbers ! * 32 through 63 (0x20 - 0x3F) control the least significant 7 bits of ! * these controllers. For example, controller number 7 (0x07) controls ! * the upper 7 bits of the channel volume controller, and controller ! * number 39 (0x27) controls the lower 7 bits. ! * The value of a 14-bit controller is determined ! * by the interaction of the two halves. When the most significant 7 bits ! * of a controller are set (using controller numbers 0 through 31), the ! * lower 7 bits are automatically set to 0. The corresponding controller ! * number for the lower 7 bits may then be used to further modulate the ! * controller value. ! * ! * It is possible that the underlying synthesizer ! * does not support a specific controller message. In order ! * to verify that a call to <code>controlChange</code> ! * was successful, use <code>getController</code>. ! * ! * @param controller the controller number (0 to 127; see the MIDI ! * 1.0 Specification for the interpretation) ! * @param value the value to which the specified controller is changed (0 to 127) ! * * @see #getController(int) */ ! public void controlChange(int controller, int value); /** ! * Obtains the current value of the specified controller. The return ! * value is represented with 7 bits. For 14-bit controllers, the MSB and ! * LSB controller value needs to be obtained separately. For example, ! * the 14-bit value of the volume controller can be calculated by ! * multiplying the value of controller 7 (0x07, channel volume MSB) ! * with 128 and adding the ! * value of controller 39 (0x27, channel volume LSB). ! * ! * If the device does not support setting a specific controller, ! * this method returns 0 for that controller. ! * Calling <code>controlChange</code> will have no effect then. * * @param controller the number of the controller whose value is desired. ! * The allowed range is 0-127; see the MIDI ! * 1.0 Specification for the interpretation. ! * * @return the current value of the specified controller (0 to 127) - * * @see #controlChange(int, int) */ ! public int getController(int controller); /** ! * Changes a program (patch). This selects a specific ! * instrument from the currently selected bank of instruments. * <p> ! * The MIDI specification does not ! * dictate whether notes that are already sounding should switch ! * to the new instrument (timbre) or continue with their original timbre ! * until terminated by a note-off. * <p> ! * The program number is zero-based (expressed from 0 to 127). ! * Note that MIDI hardware displays and literature about MIDI ! * typically use the range 1 to 128 instead. ! * ! * It is possible that the underlying synthesizer ! * does not support a specific program. In order ! * to verify that a call to <code>programChange</code> ! * was successful, use <code>getProgram</code>. * * @param program the program number to switch to (0 to 127) - * * @see #programChange(int, int) * @see #getProgram() */ ! public void programChange(int program); /** * Changes the program using bank and program (patch) numbers. ! * ! * It is possible that the underlying synthesizer ! * does not support a specific bank, or program. In order ! * to verify that a call to <code>programChange</code> ! * was successful, use <code>getProgram</code> and ! * <code>getController</code>. ! * Since banks are changed by way of control changes, ! * you can verify the current bank with the following ! * statement: * <pre> ! * int bank = (getController(0) * 128) ! * + getController(32); * </pre> * * @param bank the bank number to switch to (0 to 16383) ! * @param program the program (patch) to use in the specified bank (0 to 127) * @see #programChange(int) * @see #getProgram() */ ! public void programChange(int bank, int program); /** * Obtains the current program number for this channel. * @return the program number of the currently selected patch * @see Patch#getProgram * @see Synthesizer#loadInstrument * @see #programChange(int) */ ! public int getProgram(); /** ! * Changes the pitch offset for all notes on this channel. ! * This affects all currently sounding notes as well as subsequent ones. ! * (For pitch bend to cease, the value needs to be reset to the ! * center position.) ! * <p> The MIDI specification ! * stipulates that pitch bend be a 14-bit value, where zero ! * is maximum downward bend, 16383 is maximum upward bend, and ! * 8192 is the center (no pitch bend). The actual ! * amount of pitch change is not specified; it can be changed by ! * a pitch-bend sensitivity setting. However, the General MIDI ! * specification says that the default range should be two semitones ! * up and down from center. ! * ! * It is possible that the underlying synthesizer ! * does not support this MIDI message. In order ! * to verify that <code>setPitchBend</code> ! * was successful, use <code>getPitchBend</code>. * * @param bend the amount of pitch change, as a nonnegative 14-bit value * (8192 = no bend) - * * @see #getPitchBend */ ! public void setPitchBend(int bend); /** ! * Obtains the upward or downward pitch offset for this channel. ! * If the device does not support setting pitch bend, ! * this method always returns 8192. Calling ! * <code>setPitchBend</code> will have no effect then. * * @return bend amount, as a nonnegative 14-bit value (8192 = no bend) - * * @see #setPitchBend(int) */ ! public int getPitchBend(); /** * Resets all the implemented controllers to their default values. * * @see #controlChange(int, int) */ ! public void resetAllControllers(); /** ! * Turns off all notes that are currently sounding on this channel. ! * The notes might not die away instantaneously; their decay ! * rate is determined by the internals of the <code>Instrument</code>. ! * If the Hold Pedal controller (see ! * {@link #controlChange(int, int) controlChange}) ! * is down, the effect of this method is deferred until the pedal is ! * released. * * @see #allSoundOff * @see #noteOff(int) */ ! public void allNotesOff(); /** * Immediately turns off all sounding notes on this channel, ignoring the * state of the Hold Pedal and the internal decay rate of the current ! * <code>Instrument</code>. * * @see #allNotesOff */ ! public void allSoundOff(); /** ! * Turns local control on or off. The default is for local control ! * to be on. The "on" setting means that if a device is capable ! * of both synthesizing sound and transmitting MIDI messages, ! * it will synthesize sound in response to the note-on and ! * note-off messages that it itself transmits. It will also respond ! * to messages received from other transmitting devices. ! * The "off" setting means that the synthesizer will ignore its ! * own transmitted MIDI messages, but not those received from other devices. ! * ! * It is possible that the underlying synthesizer ! * does not support local control. In order ! * to verify that a call to <code>localControl</code> ! * was successful, check the return value. ! * ! * @param on <code>true</code> to turn local control on, <code>false</code> ! * to turn local control off ! * @return the new local-control value, or false ! * if local control is not supported ! * ! */ ! public boolean localControl(boolean on); ! ! /** ! * Turns mono mode on or off. In mono mode, the channel synthesizes ! * only one note at a time. In poly mode (identical to mono mode off), ! * the channel can synthesize multiple notes simultaneously. ! * The default is mono off (poly mode on). ! * <p> ! * "Mono" is short for the word "monophonic," which in this context ! * is opposed to the word "polyphonic" and refers to a single synthesizer ! * voice per MIDI channel. It ! * has nothing to do with how many audio channels there might be ! * (as in "monophonic" versus "stereophonic" recordings). ! * ! * It is possible that the underlying synthesizer ! * does not support mono mode. In order ! * to verify that a call to <code>setMono</code> ! * was successful, use <code>getMono</code>. ! * ! * @param on <code>true</code> to turn mono mode on, <code>false</code> to ! * turn it off (which means turning poly mode on). * * @see #getMono * @see VoiceStatus */ ! public void setMono(boolean on); /** ! * Obtains the current mono/poly mode. ! * Synthesizers that do not allow changing mono/poly mode ! * will always return the same value, regardless ! * of calls to <code>setMono</code>. ! * @return <code>true</code> if mono mode is on, otherwise ! * <code>false</code> (meaning poly mode is on). * * @see #setMono(boolean) */ ! public boolean getMono(); /** ! * Turns omni mode on or off. In omni mode, the channel responds ! * to messages sent on all channels. When omni is off, the channel ! * responds only to messages sent on its channel number. ! * The default is omni off. ! * ! * It is possible that the underlying synthesizer ! * does not support omni mode. In order ! * to verify that <code>setOmni</code> ! * was successful, use <code>getOmni</code>. ! * ! * @param on <code>true</code> to turn omni mode on, <code>false</code> to ! * turn it off. * * @see #getOmni * @see VoiceStatus */ ! public void setOmni(boolean on); /** ! * Obtains the current omni mode. ! * Synthesizers that do not allow changing the omni mode ! * will always return the same value, regardless ! * of calls to <code>setOmni</code>. ! * @return <code>true</code> if omni mode is on, otherwise ! * <code>false</code> (meaning omni mode is off). * * @see #setOmni(boolean) */ ! public boolean getOmni(); /** ! * Sets the mute state for this channel. A value of ! * <code>true</code> means the channel is to be muted, <code>false</code> ! * means the channel can sound (if other channels are not soloed). ! * <p> ! * Unlike {@link #allSoundOff()}, this method ! * applies to only a specific channel, not to all channels. Further, it ! * silences not only currently sounding notes, but also subsequently ! * received notes. ! * ! * It is possible that the underlying synthesizer ! * does not support muting channels. In order ! * to verify that a call to <code>setMute</code> ! * was successful, use <code>getMute</code>. * * @param mute the new mute state - * * @see #getMute * @see #setSolo(boolean) */ ! public void setMute(boolean mute); /** ! * Obtains the current mute state for this channel. ! * If the underlying synthesizer does not support ! * muting this channel, this method always returns ! * <code>false</code>. ! * ! * @return <code>true</code> the channel is muted, ! * or <code>false</code> if not * * @see #setMute(boolean) */ ! public boolean getMute(); /** ! * Sets the solo state for this channel. ! * If <code>solo</code> is <code>true</code> only this channel ! * and other soloed channels will sound. If <code>solo</code> ! * is <code>false</code> then only other soloed channels will ! * sound, unless no channels are soloed, in which case all ! * unmuted channels will sound. ! * ! * It is possible that the underlying synthesizer ! * does not support solo channels. In order ! * to verify that a call to <code>setSolo</code> ! * was successful, use <code>getSolo</code>. * * @param soloState new solo state for the channel * @see #getSolo() */ ! public void setSolo(boolean soloState); /** ! * Obtains the current solo state for this channel. ! * If the underlying synthesizer does not support ! * solo on this channel, this method always returns ! * <code>false</code>. ! * ! * @return <code>true</code> the channel is solo, ! * or <code>false</code> if not * * @see #setSolo(boolean) */ ! public boolean getSolo(); } --- 23,474 ---- * questions. */ package javax.sound.midi; /** ! * A {@code MidiChannel} object represents a single MIDI channel. Generally, ! * each {@code MidiChannel} method processes a like-named MIDI "channel voice" ! * or "channel mode" message as defined by the MIDI specification. However, ! * {@code MidiChannel} adds some "get" methods that retrieve the value most ! * recently set by one of the standard MIDI channel messages. Similarly, methods ! * for per-channel solo and mute have been added. ! * <p> ! * A {@link Synthesizer} object has a collection of {@code MidiChannels}, ! * usually one for each of the 16 channels prescribed by the MIDI 1.0 ! * specification. The {@code Synthesizer} generates sound when its ! * {@code MidiChannels} receive {@code noteOn} messages. * <p> * See the MIDI 1.0 Specification for more information about the prescribed ! * behavior of the MIDI channel messages, which are not exhaustively documented ! * here. The specification is titled ! * {@code MIDI Reference: The Complete MIDI 1.0 Detailed Specification}, and is ! * published by the MIDI Manufacturer's Association ! * (<a href = http://www.midi.org>http://www.midi.org</a>). * <p> * MIDI was originally a protocol for reporting the gestures of a keyboard ! * musician. This genesis is visible in the {@code MidiChannel} API, which * preserves such MIDI concepts as key number, key velocity, and key pressure. * It should be understood that the MIDI data does not necessarily originate * with a keyboard player (the source could be a different kind of musician, or ! * software). Some devices might generate constant values for velocity and ! * pressure, regardless of how the note was performed. Also, the MIDI ! * specification often leaves it up to the synthesizer to use the data in the ! * way the implementor sees fit. For example, velocity data need not always be ! * mapped to volume and/or brightness. * * @author David Rivas * @author Kara Kytle + * @see Synthesizer#getChannels */ public interface MidiChannel { /** ! * Starts the specified note sounding. The key-down velocity usually ! * controls the note's volume and/or brightness. If {@code velocity} is ! * zero, this method instead acts like {@link #noteOff(int)}, terminating ! * the note. * * @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C) * @param velocity the speed with which the key was depressed * @see #noteOff(int, int) */ ! void noteOn(int noteNumber, int velocity); /** ! * Turns the specified note off. The key-up velocity, if not ignored, can be ! * used to affect how quickly the note decays. In any case, the note might ! * not die away instantaneously; its decay rate is determined by the ! * internals of the {@code Instrument}. If the Hold Pedal (a controller; see ! * {@link #controlChange(int, int) controlChange}) is down, the effect of ! * this method is deferred until the pedal is released. * * @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C) * @param velocity the speed with which the key was released * @see #noteOff(int) * @see #noteOn * @see #allNotesOff * @see #allSoundOff */ ! void noteOff(int noteNumber, int velocity); /** * Turns the specified note off. * * @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C) * @see #noteOff(int, int) */ ! void noteOff(int noteNumber); /** ! * Reacts to a change in the specified note's key pressure. Polyphonic key ! * pressure allows a keyboard player to press multiple keys simultaneously, ! * each with a different amount of pressure. The pressure, if not ignored, ! * is typically used to vary such features as the volume, brightness, or ! * vibrato of the note. ! * <p> ! * It is possible that the underlying synthesizer does not support this MIDI ! * message. In order to verify that {@code setPolyPressure} was successful, ! * use {@code getPolyPressure}. * * @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C) ! * @param pressure value for the specified key, from 0 to 127 ! * (127 = maximum pressure) * @see #getPolyPressure(int) */ ! void setPolyPressure(int noteNumber, int pressure); /** * Obtains the pressure with which the specified key is being depressed. + * <p> + * If the device does not support setting poly pressure, this method always + * returns 0. Calling {@code setPolyPressure} will have no effect then. * * @param noteNumber the MIDI note number, from 0 to 127 (60 = Middle C) * @return the amount of pressure for that note, from 0 to 127 * (127 = maximum pressure) * @see #setPolyPressure(int, int) */ ! int getPolyPressure(int noteNumber); /** ! * Reacts to a change in the keyboard pressure. Channel pressure indicates ! * how hard the keyboard player is depressing the entire keyboard. This can ! * be the maximum or average of the per-key pressure-sensor values, as set ! * by {@code setPolyPressure}. More commonly, it is a measurement of a ! * single sensor on a device that doesn't implement polyphonic key pressure. ! * Pressure can be used to control various aspects of the sound, as ! * described under {@link #setPolyPressure(int, int) setPolyPressure}. ! * <p> ! * It is possible that the underlying synthesizer does not support this MIDI ! * message. In order to verify that {@code setChannelPressure} was ! * successful, use {@code getChannelPressure}. * * @param pressure the pressure with which the keyboard is being depressed, * from 0 to 127 (127 = maximum pressure) * @see #setPolyPressure(int, int) * @see #getChannelPressure */ ! void setChannelPressure(int pressure); /** * Obtains the channel's keyboard pressure. ! * <p> ! * If the device does not support setting channel pressure, this method ! * always returns 0. Calling {@code setChannelPressure} will have no effect ! * then. * + * @return the amount of pressure for that note, from 0 to 127 + * (127 = maximum pressure) * @see #setChannelPressure(int) */ ! int getChannelPressure(); /** ! * Reacts to a change in the specified controller's value. A controller is ! * some control other than a keyboard key, such as a switch, slider, pedal, ! * wheel, or breath-pressure sensor. The MIDI 1.0 Specification provides ! * standard numbers for typical controllers on MIDI devices, and describes ! * the intended effect for some of the controllers. The way in which an ! * {@code Instrument} reacts to a controller change may be specific to the ! * {@code Instrument}. ! * <p> ! * The MIDI 1.0 Specification defines both 7-bit controllers and 14-bit ! * controllers. Continuous controllers, such as wheels and sliders, ! * typically have 14 bits (two MIDI bytes), while discrete controllers, such ! * as switches, typically have 7 bits (one MIDI byte). Refer to the ! * specification to see the expected resolution for each type of control. ! * <p> ! * Controllers 64 through 95 (0x40 - 0x5F) allow 7-bit precision. The value ! * of a 7-bit controller is set completely by the {@code value} argument. An ! * additional set of controllers provide 14-bit precision by using two ! * controller numbers, one for the most significant 7 bits and another for ! * the least significant 7 bits. Controller numbers 0 through 31 ! * (0x00 - 0x1F) control the most significant 7 bits of 14-bit controllers; ! * controller numbers 32 through 63 (0x20 - 0x3F) control the least ! * significant 7 bits of these controllers. For example, controller number 7 ! * (0x07) controls the upper 7 bits of the channel volume controller, and ! * controller number 39 (0x27) controls the lower 7 bits. The value of a ! * 14-bit controller is determined by the interaction of the two halves. ! * When the most significant 7 bits of a controller are set (using ! * controller numbers 0 through 31), the lower 7 bits are automatically set ! * to 0. The corresponding controller number for the lower 7 bits may then ! * be used to further modulate the controller value. ! * <p> ! * It is possible that the underlying synthesizer does not support a ! * specific controller message. In order to verify that a call to ! * {@code controlChange} was successful, use {@code getController}. ! * ! * @param controller the controller number (0 to 127; see the MIDI 1.0 ! * Specification for the interpretation) ! * @param value the value to which the specified controller is changed ! * (0 to 127) * @see #getController(int) */ ! void controlChange(int controller, int value); /** ! * Obtains the current value of the specified controller. The return value ! * is represented with 7 bits. For 14-bit controllers, the MSB and LSB ! * controller value needs to be obtained separately. For example, the 14-bit ! * value of the volume controller can be calculated by multiplying the value ! * of controller 7 (0x07, channel volume MSB) with 128 and adding the value ! * of controller 39 (0x27, channel volume LSB). ! * <p> ! * If the device does not support setting a specific controller, this method ! * returns 0 for that controller. Calling {@code controlChange} will have no ! * effect then. * * @param controller the number of the controller whose value is desired. ! * The allowed range is 0-127; see the MIDI 1.0 Specification for ! * the interpretation. * @return the current value of the specified controller (0 to 127) * @see #controlChange(int, int) */ ! int getController(int controller); /** ! * Changes a program (patch). This selects a specific instrument from the ! * currently selected bank of instruments. * <p> ! * The MIDI specification does not dictate whether notes that are already ! * sounding should switch to the new instrument (timbre) or continue with ! * their original timbre until terminated by a note-off. * <p> ! * The program number is zero-based (expressed from 0 to 127). Note that ! * MIDI hardware displays and literature about MIDI typically use the range ! * 1 to 128 instead. ! * <p> ! * It is possible that the underlying synthesizer does not support a ! * specific program. In order to verify that a call to {@code programChange} ! * was successful, use {@code getProgram}. * * @param program the program number to switch to (0 to 127) * @see #programChange(int, int) * @see #getProgram() */ ! void programChange(int program); /** * Changes the program using bank and program (patch) numbers. ! * <p> ! * It is possible that the underlying synthesizer does not support a ! * specific bank, or program. In order to verify that a call to ! * {@code programChange} was successful, use {@code getProgram} and ! * {@code getController}. Since banks are changed by way of control changes, ! * you can verify the current bank with the following statement: * <pre> ! * int bank = (getController(0) * 128) + getController(32); * </pre> * * @param bank the bank number to switch to (0 to 16383) ! * @param program the program (patch) to use in the specified bank ! * (0 to 127) * @see #programChange(int) * @see #getProgram() */ ! void programChange(int bank, int program); /** * Obtains the current program number for this channel. + * * @return the program number of the currently selected patch * @see Patch#getProgram * @see Synthesizer#loadInstrument * @see #programChange(int) */ ! int getProgram(); /** ! * Changes the pitch offset for all notes on this channel. This affects all ! * currently sounding notes as well as subsequent ones. (For pitch bend to ! * cease, the value needs to be reset to the center position.) ! * <p> ! * The MIDI specification stipulates that pitch bend be a 14-bit value, ! * where zero is maximum downward bend, 16383 is maximum upward bend, and ! * 8192 is the center (no pitch bend). The actual amount of pitch change is ! * not specified; it can be changed by a pitch-bend sensitivity setting. ! * However, the General MIDI specification says that the default range ! * should be two semitones up and down from center. ! * <p> ! * It is possible that the underlying synthesizer does not support this MIDI ! * message. In order to verify that {@code setPitchBend} was successful, use ! * {@code getPitchBend}. * * @param bend the amount of pitch change, as a nonnegative 14-bit value * (8192 = no bend) * @see #getPitchBend */ ! void setPitchBend(int bend); /** ! * Obtains the upward or downward pitch offset for this channel. If the ! * device does not support setting pitch bend, this method always returns ! * 8192. Calling {@code setPitchBend} will have no effect then. * * @return bend amount, as a nonnegative 14-bit value (8192 = no bend) * @see #setPitchBend(int) */ ! int getPitchBend(); /** * Resets all the implemented controllers to their default values. * * @see #controlChange(int, int) */ ! void resetAllControllers(); /** ! * Turns off all notes that are currently sounding on this channel. The ! * notes might not die away instantaneously; their decay rate is determined ! * by the internals of the {@code Instrument}. If the Hold Pedal controller ! * (see {@link #controlChange(int, int) controlChange}) is down, the effect ! * of this method is deferred until the pedal is released. * * @see #allSoundOff * @see #noteOff(int) */ ! void allNotesOff(); /** * Immediately turns off all sounding notes on this channel, ignoring the * state of the Hold Pedal and the internal decay rate of the current ! * {@code Instrument}. * * @see #allNotesOff */ ! void allSoundOff(); /** ! * Turns local control on or off. The default is for local control to be on. ! * The "on" setting means that if a device is capable of both synthesizing ! * sound and transmitting MIDI messages, it will synthesize sound in ! * response to the note-on and note-off messages that it itself transmits. ! * It will also respond to messages received from other transmitting ! * devices. The "off" setting means that the synthesizer will ignore its own ! * transmitted MIDI messages, but not those received from other devices. ! * <p> ! * It is possible that the underlying synthesizer does not support local ! * control. In order to verify that a call to {@code localControl} was ! * successful, check the return value. ! * ! * @param on {@code true} to turn local control on, {@code false} to turn ! * local control off ! * @return the new local-control value, or false if local control is not ! * supported ! */ ! boolean localControl(boolean on); ! ! /** ! * Turns mono mode on or off. In mono mode, the channel synthesizes only one ! * note at a time. In poly mode (identical to mono mode off), the channel ! * can synthesize multiple notes simultaneously. The default is mono off ! * (poly mode on). ! * <p> ! * "Mono" is short for the word "monophonic," which in this context is ! * opposed to the word "polyphonic" and refers to a single synthesizer voice ! * per MIDI channel. It has nothing to do with how many audio channels there ! * might be (as in "monophonic" versus "stereophonic" recordings). ! * <p> ! * It is possible that the underlying synthesizer does not support mono ! * mode. In order to verify that a call to {@code setMono} was successful, ! * use {@code getMono}. * + * @param on {@code true} to turn mono mode on, {@code false} to turn it + * off (which means turning poly mode on) * @see #getMono * @see VoiceStatus */ ! void setMono(boolean on); /** ! * Obtains the current mono/poly mode. Synthesizers that do not allow ! * changing mono/poly mode will always return the same value, regardless of ! * calls to {@code setMono}. * + * @return {@code true} if mono mode is on, otherwise {@code false} (meaning + * poly mode is on) * @see #setMono(boolean) */ ! boolean getMono(); /** ! * Turns omni mode on or off. In omni mode, the channel responds to messages ! * sent on all channels. When omni is off, the channel responds only to ! * messages sent on its channel number. The default is omni off. ! * <p> ! * It is possible that the underlying synthesizer does not support omni ! * mode. In order to verify that {@code setOmni} was successful, use ! * {@code getOmni}. * + * @param on {@code true} to turn omni mode on, {@code false} to turn it + * off * @see #getOmni * @see VoiceStatus */ ! void setOmni(boolean on); /** ! * Obtains the current omni mode. Synthesizers that do not allow changing ! * the omni mode will always return the same value, regardless of calls to ! * {@code setOmni}. * + * @return {@code true} if omni mode is on, otherwise {@code false} (meaning + * omni mode is off) * @see #setOmni(boolean) */ ! boolean getOmni(); /** ! * Sets the mute state for this channel. A value of {@code true} means the ! * channel is to be muted, {@code false} means the channel can sound (if ! * other channels are not soloed). ! * <p> ! * Unlike {@link #allSoundOff()}, this method applies to only a specific ! * channel, not to all channels. Further, it silences not only currently ! * sounding notes, but also subsequently received notes. ! * <p> ! * It is possible that the underlying synthesizer does not support muting ! * channels. In order to verify that a call to {@code setMute} was ! * successful, use {@code getMute}. * * @param mute the new mute state * @see #getMute * @see #setSolo(boolean) */ ! void setMute(boolean mute); /** ! * Obtains the current mute state for this channel. If the underlying ! * synthesizer does not support muting this channel, this method always ! * returns {@code false}. * + * @return {@code true} the channel is muted, or {@code false} if not * @see #setMute(boolean) */ ! boolean getMute(); /** ! * Sets the solo state for this channel. If {@code solo} is {@code true} ! * only this channel and other soloed channels will sound. If {@code solo} ! * is {@code false} then only other soloed channels will sound, unless no ! * channels are soloed, in which case all unmuted channels will sound. ! * <p> ! * It is possible that the underlying synthesizer does not support solo ! * channels. In order to verify that a call to {@code setSolo} was ! * successful, use {@code getSolo}. * * @param soloState new solo state for the channel * @see #getSolo() */ ! void setSolo(boolean soloState); /** ! * Obtains the current solo state for this channel. If the underlying ! * synthesizer does not support solo on this channel, this method always ! * returns {@code false}. * + * @return {@code true} the channel is solo, or {@code false} if not * @see #setSolo(boolean) */ ! boolean getSolo(); }