JD2022-TU1/main/tools/apps/TeaBox/Script/_Dependencies/Midi.xml

3257 lines
153 KiB
XML

<?xml version="1.0"?>
<doc>
<assembly>
<name>Midi</name>
</assembly>
<members>
<member name="T:Midi.ScalePattern">
<summary>
Description of a scale's pattern as it ascends through an octave.
</summary>
<remarks>
This class describes the general behavior of a scale as it ascends from a tonic up to
the next tonic. It is described in terms of semitones relative to the tonic; to apply it to
a particular tonic, pass one of these to the constructor of <see cref="T:Midi.Scale"/>.
</remarks>
</member>
<member name="M:Midi.ScalePattern.#ctor(System.String,System.Int32[])">
<summary>
Constructs a scale pattern.
</summary>
<param name="name">The name of the scale pattern.</param>
<param name="ascent">The ascending pattern of the scale. See the <see cref="P:Midi.ScalePattern.Ascent"/>
property for a detailed description and requirements. This parameter is copied.</param>
<exception cref="T:System.ArgumentNullException">name or ascent is null.</exception>
<exception cref="T:System.ArgumentException">ascent is invalid.</exception>
</member>
<member name="M:Midi.ScalePattern.ToString">
<summary>
ToString returns the pattern name.
</summary>
<returns>The pattern's name, such as "Major" or "Melodic Minor (ascending)".</returns>
</member>
<member name="M:Midi.ScalePattern.op_Equality(Midi.ScalePattern,Midi.ScalePattern)">
<summary>
Equality operator does value equality.
</summary>
</member>
<member name="M:Midi.ScalePattern.op_Inequality(Midi.ScalePattern,Midi.ScalePattern)">
<summary>
Inequality operator does value inequality.
</summary>
</member>
<member name="M:Midi.ScalePattern.Equals(System.Object)">
<summary>
Value equality.
</summary>
</member>
<member name="M:Midi.ScalePattern.GetHashCode">
<summary>
Hash code.
</summary>
</member>
<member name="M:Midi.ScalePattern.AscentIsValid(System.Int32[])">
<summary>Returns true if ascent is valid.</summary>
</member>
<member name="P:Midi.ScalePattern.Name">
<summary>The name of the scale being described.</summary>
</member>
<member name="P:Midi.ScalePattern.Ascent">
<summary>The ascent of the scale.</summary>
<remarks>
<para>The ascent is expressed as a series of integers, each giving a semitone
distance above the tonic. It must have at least two elements, start at zero (the
tonic), be monotonically increasing, and stay below 12 (the next tonic above).</para>
<para>The number of elements in the ascent tells us how many notes-per-octave in the
scale. For example, a heptatonic scale will always have seven elements in the ascent.
</para>
</remarks>
</member>
<member name="T:Midi.Scale">
<summary>
A scale based on a pattern and a tonic note.
</summary>
<remarks>
<para>For our purposes, a scale is defined by a tonic and then the pattern that it uses to
ascend up to the next tonic. The tonic is described with a <see cref="T:Midi.Note"/> because it is
not specific to any one octave. The ascending pattern is provided by the
<see cref="T:Midi.ScalePattern"/> class.
</para>
<para>This class comes with a collection of predefined patterns, such as
<see cref="F:Midi.Scale.Major"/> and <see cref="F:Midi.Scale.HarmonicMinor"/>.</para>
</remarks>
</member>
<member name="M:Midi.Scale.#ctor(Midi.Note,Midi.ScalePattern)">
<summary>
Constructs a scale from its tonic and its pattern.
</summary>
<param name="tonic">The tonic note.</param>
<param name="pattern">The scale pattern.</param>
<exception cref="T:System.ArgumentNullException">tonic or pattern is null.</exception>
</member>
<member name="M:Midi.Scale.Contains(Midi.Pitch)">
<summary>
Returns true if pitch is in this scale.
</summary>
<param name="pitch">The pitch to test.</param>
<returns>True if pitch is in this scale.</returns>
</member>
<member name="M:Midi.Scale.ScaleDegree(Midi.Pitch)">
<summary>
Returns the scale degree of the given pitch in this scale.
</summary>
<param name="pitch">The pitch to test.</param>
<returns>The scale degree of pitch in this scale, where 1 is the tonic. Returns -1
if pitch is not in this scale.</returns>
</member>
<member name="F:Midi.Scale.Major">
<summary>
Pattern for Major scales.
</summary>
</member>
<member name="F:Midi.Scale.NaturalMinor">
<summary>
Pattern for Natural Minor scales.
</summary>
</member>
<member name="F:Midi.Scale.HarmonicMinor">
<summary>
Pattern for Harmonic Minor scales.
</summary>
</member>
<member name="F:Midi.Scale.MelodicMinorAscending">
<summary>
Pattern for Melodic Minor scale as it ascends.
</summary>
</member>
<member name="F:Midi.Scale.MelodicMinorDescending">
<summary>
Pattern for Melodic Minor scale as it descends.
</summary>
</member>
<member name="F:Midi.Scale.Chromatic">
<summary>
Pattern for Chromatic scales.
</summary>
</member>
<member name="F:Midi.Scale.Patterns">
<summary>
Array of all the built-in scale patterns.
</summary>
</member>
<member name="M:Midi.Scale.ToString">
<summary>
ToString returns the scale's human-readable name.
</summary>
<returns>The scale's name, such as "G# Major" or "Eb Melodic Minor (ascending)".
</returns>
</member>
<member name="M:Midi.Scale.op_Equality(Midi.Scale,Midi.Scale)">
<summary>
Equality operator does value equality because Scale is immutable.
</summary>
</member>
<member name="M:Midi.Scale.op_Inequality(Midi.Scale,Midi.Scale)">
<summary>
Inequality operator does value inequality because Chord is immutable.
</summary>
</member>
<member name="M:Midi.Scale.Equals(System.Object)">
<summary>
Value equality.
</summary>
</member>
<member name="M:Midi.Scale.GetHashCode">
<summary>
Hash code.
</summary>
</member>
<member name="M:Midi.Scale.Build(Midi.Note,Midi.ScalePattern,System.Int32[],Midi.Note[],System.Int32@)">
<summary>
Builds a scale.
</summary>
<param name="tonic">The tonic.</param>
<param name="pattern">The scale pattern.</param>
<param name="positionInOctaveToSequenceIndex">Must have 12 elements, and is filled with
the 0-indexed scale position (or -1) for each position in the octave.</param>
<param name="noteSequence">Must have pattern.Ascent.Length elements, and is filled with
the notes for each scale degree.</param>
<param name="numAccidentals">Filled with the total number of accidentals in the built
scale.</param>
</member>
<!-- Badly formed XML comment ignored for member "P:Midi.Scale.Name" -->
<member name="P:Midi.Scale.Tonic">
<summary>The tonic of this scale.</summary>
</member>
<member name="P:Midi.Scale.Pattern">
<summary>The pattern of this scale.</summary>
</member>
<member name="P:Midi.Scale.NoteSequence">
<summary>
The sequence of notes in this scale.
</summary>
<remarks>
<para>This sequence begins at the tonic and ascends, stopping before the next tonic.
</para>
</remarks>
</member>
<member name="T:Midi.Message">
<summary>
Base class for all MIDI messages.
</summary>
</member>
<member name="M:Midi.Message.#ctor(System.Single)">
<summary>
Protected constructor.
</summary>
<param name="time">The timestamp for this message.</param>
</member>
<member name="M:Midi.Message.SendNow">
<summary>
Sends this message immediately.
</summary>
</member>
<member name="M:Midi.Message.MakeTimeShiftedCopy(System.Single)">
<summary>
Returns a copy of this message, shifted in time by the specified amount.
</summary>
</member>
<member name="P:Midi.Message.Time">
<summary>
Milliseconds since the music started.
</summary>
</member>
<member name="T:Midi.DeviceMessage">
<summary>
Base class for messages relevant to a specific device.
</summary>
</member>
<member name="M:Midi.DeviceMessage.#ctor(Midi.DeviceBase,System.Single)">
<summary>
Protected constructor.
</summary>
</member>
<member name="P:Midi.DeviceMessage.Device">
<summary>
The device from which this message originated, or for which it is destined.
</summary>
</member>
<member name="T:Midi.ChannelMessage">
<summary>
Base class for messages relevant to a specific device channel.
</summary>
</member>
<member name="M:Midi.ChannelMessage.#ctor(Midi.DeviceBase,Midi.Channel,System.Single)">
<summary>
Protected constructor.
</summary>
</member>
<member name="P:Midi.ChannelMessage.Channel">
<summary>
Channel.
</summary>
</member>
<member name="T:Midi.NoteMessage">
<summary>
Base class for messages relevant to a specific note.
</summary>
</member>
<member name="M:Midi.NoteMessage.#ctor(Midi.DeviceBase,Midi.Channel,Midi.Pitch,System.Int32,System.Single)">
<summary>
Protected constructor.
</summary>
</member>
<member name="P:Midi.NoteMessage.Pitch">
<summary>The pitch for this note message.</summary>
</member>
<member name="P:Midi.NoteMessage.Velocity">
<summary>
Velocity, 0..127.
</summary>
</member>
<member name="T:Midi.NoteOnMessage">
<summary>
Note On message.
</summary>
</member>
<member name="M:Midi.NoteOnMessage.#ctor(Midi.DeviceBase,Midi.Channel,Midi.Pitch,System.Int32,System.Single)">
<summary>
Constructs a Note On message.
</summary>
<param name="device">The device associated with this message.</param>
<param name="channel">Channel, 0..15, 10 reserved for percussion.</param>
<param name="pitch">The pitch for this note message.</param>
<param name="velocity">Velocity, 0..127.</param>
<param name="time">The timestamp for this message.</param>
</member>
<member name="M:Midi.NoteOnMessage.SendNow">
<summary>
Sends this message immediately.
</summary>
</member>
<member name="M:Midi.NoteOnMessage.MakeTimeShiftedCopy(System.Single)">
<summary>
Returns a copy of this message, shifted in time by the specified amount.
</summary>
</member>
<member name="T:Midi.PercussionMessage">
<summary>
Percussion message.
</summary>
<remarks>
A percussion message is simply shorthand for sending a Note On message to Channel10 with a
percussion-specific note. This message can be sent to an OutputDevice but will be received
by an InputDevice as a NoteOn message.
</remarks>
</member>
<member name="M:Midi.PercussionMessage.#ctor(Midi.DeviceBase,Midi.Percussion,System.Int32,System.Single)">
<summary>
Constructs a Percussion message.
</summary>
<param name="device">The device associated with this message.</param>
<param name="percussion">Percussion.</param>
<param name="velocity">Velocity, 0..127.</param>
<param name="time">The timestamp for this message.</param>
</member>
<member name="M:Midi.PercussionMessage.SendNow">
<summary>
Sends this message immediately.
</summary>
</member>
<member name="M:Midi.PercussionMessage.MakeTimeShiftedCopy(System.Single)">
<summary>
Returns a copy of this message, shifted in time by the specified amount.
</summary>
</member>
<member name="P:Midi.PercussionMessage.Percussion">
<summary>
Percussion.
</summary>
</member>
<member name="P:Midi.PercussionMessage.Velocity">
<summary>
Velocity, 0..127.
</summary>
</member>
<member name="T:Midi.NoteOffMessage">
<summary>
Note Off message.
</summary>
</member>
<member name="M:Midi.NoteOffMessage.#ctor(Midi.DeviceBase,Midi.Channel,Midi.Pitch,System.Int32,System.Single)">
<summary>
Constructs a Note Off message.
</summary>
<param name="device">The device associated with this message.</param>
<param name="channel">Channel, 0..15, 10 reserved for percussion.</param>
<param name="pitch">The pitch for this note message.</param>
<param name="velocity">Velocity, 0..127.</param>
<param name="time">The timestamp for this message.</param>
</member>
<member name="M:Midi.NoteOffMessage.SendNow">
<summary>
Sends this message immediately.
</summary>
</member>
<member name="M:Midi.NoteOffMessage.MakeTimeShiftedCopy(System.Single)">
<summary>
Returns a copy of this message, shifted in time by the specified amount.
</summary>
</member>
<member name="T:Midi.NoteOnOffMessage">
<summary>
A Note On message which schedules its own Note Off message when played.
</summary>
</member>
<member name="M:Midi.NoteOnOffMessage.#ctor(Midi.DeviceBase,Midi.Channel,Midi.Pitch,System.Int32,System.Single,Midi.Clock,System.Single)">
<summary>
Constructs a Note On/Off message.
</summary>
<param name="device">The device associated with this message.</param>
<param name="channel">Channel, 0..15, 10 reserved for percussion.</param>
<param name="pitch">The pitch for this note message.</param>
<param name="velocity">Velocity, 0..127.</param>
<param name="time">The timestamp for this message.</param>
<param name="clock">The clock that should schedule the off message.</param>
<param name="duration">Time delay between on message and off messasge.</param>
</member>
<member name="M:Midi.NoteOnOffMessage.SendNow">
<summary>
Sends this message immediately.
</summary>
</member>
<member name="M:Midi.NoteOnOffMessage.MakeTimeShiftedCopy(System.Single)">
<summary>
Returns a copy of this message, shifted in time by the specified amount.
</summary>
</member>
<member name="P:Midi.NoteOnOffMessage.Clock">
<summary>
The clock used to schedule the follow-up message.
</summary>
</member>
<member name="P:Midi.NoteOnOffMessage.Duration">
<summary>
Time delay between the Note On and the Note Off.
</summary>
</member>
<member name="T:Midi.ControlChangeMessage">
<summary>
Control change message.
</summary>
</member>
<member name="M:Midi.ControlChangeMessage.#ctor(Midi.DeviceBase,Midi.Channel,Midi.Control,System.Int32,System.Single)">
<summary>
Construts a Control Change message.
</summary>
<param name="device">The device associated with this message.</param>
<param name="channel">Channel, 0..15, 10 reserved for percussion.</param>
<param name="control">Control, 0..119</param>
<param name="value">Value, 0..127.</param>
<param name="time">The timestamp for this message.</param>
</member>
<member name="M:Midi.ControlChangeMessage.SendNow">
<summary>
Sends this message immediately.
</summary>
</member>
<member name="M:Midi.ControlChangeMessage.MakeTimeShiftedCopy(System.Single)">
<summary>
Returns a copy of this message, shifted in time by the specified amount.
</summary>
</member>
<member name="P:Midi.ControlChangeMessage.Control">
<summary>
The control for this message.
</summary>
</member>
<member name="P:Midi.ControlChangeMessage.Value">
<summary>
Value, 0..127.
</summary>
</member>
<member name="T:Midi.PitchBendMessage">
<summary>
Pitch Bend message.
</summary>
</member>
<member name="M:Midi.PitchBendMessage.#ctor(Midi.DeviceBase,Midi.Channel,System.Int32,System.Single)">
<summary>
Constructs a Pitch Bend message.
</summary>
<param name="device">The device associated with this message.</param>
<param name="channel">Channel, 0..15, 10 reserved for percussion.</param>
<param name="value">Pitch bend value, 0..16383, 8192 is centered.</param>
<param name="time">The timestamp for this message.</param>
</member>
<member name="M:Midi.PitchBendMessage.SendNow">
<summary>
Sends this message immediately.
</summary>
</member>
<member name="M:Midi.PitchBendMessage.MakeTimeShiftedCopy(System.Single)">
<summary>
Returns a copy of this message, shifted in time by the specified amount.
</summary>
</member>
<member name="P:Midi.PitchBendMessage.Value">
<summary>
Pitch bend value, 0..16383, 8192 is centered.
</summary>
</member>
<member name="T:Midi.ProgramChangeMessage">
<summary>
Program Change message.
</summary>
</member>
<member name="M:Midi.ProgramChangeMessage.#ctor(Midi.DeviceBase,Midi.Channel,Midi.Instrument,System.Single)">
<summary>
Constructs a Program Change message.
</summary>
<param name="device">The device associated with this message.</param>
<param name="channel">Channel.</param>
<param name="instrument">Instrument.</param>
<param name="time">The timestamp for this message.</param>
</member>
<member name="M:Midi.ProgramChangeMessage.SendNow">
<summary>
Sends this message immediately.
</summary>
</member>
<member name="M:Midi.ProgramChangeMessage.MakeTimeShiftedCopy(System.Single)">
<summary>
Returns a copy of this message, shifted in time by the specified amount.
</summary>
</member>
<member name="P:Midi.ProgramChangeMessage.Instrument">
<summary>
Instrument.
</summary>
</member>
<member name="T:Midi.CallbackMessage">
<summary>
Pseudo-MIDI message used to arrange for a callback at a certain time.
</summary>
<remarks>
<para>This message can be scheduled with <see cref="M:Midi.Clock.Schedule(Midi.Message)">
Clock.Schedule</see> just like any other message. When its time comes and it
gets "sent", it invokes the callback provided in the constructor.</para>
<para>The idea is that you can embed callback points into the music you've
scheduled, so that (if the clock gets to that point in the music) your code has
an opportunity for some additional processing.</para>
<para>The callback is invoked on the MidiOutputDevice's worker thread.</para>
</remarks>
</member>
<member name="M:Midi.CallbackMessage.#ctor(Midi.CallbackMessage.CallbackType,System.Single)">
<summary>
Constructs a Callback message.
</summary>
<param name="callback">The callback to invoke when this message is "sent".</param>
<param name="time">The timestamp for this message.</param>
</member>
<member name="M:Midi.CallbackMessage.SendNow">
<summary>
Sends this message immediately, ignoring the beatTime.
</summary>
</member>
<member name="M:Midi.CallbackMessage.MakeTimeShiftedCopy(System.Single)">
<summary>
Returns a copy of this message, shifted in time by the specified amount.
</summary>
</member>
<member name="P:Midi.CallbackMessage.Callback">
<summary>
The callback to invoke when this message is "sent".
</summary>
</member>
<member name="T:Midi.CallbackMessage.CallbackType">
<summary>
Delegate called when a CallbackMessage is sent.
</summary>
<param name="time">The time at which this event was scheduled.</param>
<returns>Additional messages which should be scheduled as a result of this callback,
or null.</returns>
</member>
<member name="T:Midi.DeviceBase">
<summary>
Common base class for input and output devices.
</summary>
This base class exists mainly so that input and output devices can both go into the same
kinds of MidiMessages.
</member>
<member name="M:Midi.DeviceBase.#ctor(System.String)">
<summary>
Protected constructor.
</summary>
<param name="name">The name of this device.</param>
</member>
<member name="P:Midi.DeviceBase.Name">
<summary>
The name of this device.
</summary>
</member>
<member name="T:Midi.DeviceException">
<summary>
Exception thrown when an operation on a MIDI device cannot be satisfied.
</summary>
</member>
<member name="M:Midi.DeviceException.#ctor(System.String)">
<summary>
Constructs exception with a specific error message.
</summary>
<param name="message"></param>
</member>
<member name="T:Midi.ChordPattern">
<summary>
Description of a chord's pattern starting at the root note.
</summary>
<remarks>
This class describes the ascending sequence of notes included in a chord, starting with
the root note. It is described in terms of semitones relative to root and letters
relative to the root. To apply it to particular tonic, pass one of these to the
constructor of <see cref="T:Midi.Chord"/>.
</remarks>
</member>
<member name="M:Midi.ChordPattern.#ctor(System.String,System.String,System.Int32[],System.Int32[])">
<summary>
Constructs a chord pattern.
</summary>
<param name="name">The name of the chord pattern.</param>
<param name="abbreviation">The abbreviation for the chord. See the
<see cref="P:Midi.ChordPattern.Abbreviation"/> property for details.</param>
<param name="ascent">Array encoding the notes in the chord. See the
<see cref="P:Midi.ChordPattern.Ascent"/> property for details.</param>
<param name="letterOffsets">Array encoding the sequence of letters in the chord.
Must be the same length as ascent. See the <see cref="P:Midi.ChordPattern.LetterOffsets"/> property for
details.</param>
<exception cref="T:System.ArgumentException">ascent or letterOffsets is invalid, or they have
different lengths.</exception>
<exception cref="T:System.ArgumentNullException">an argument is null.</exception>
</member>
<member name="M:Midi.ChordPattern.ToString">
<summary>
ToString returns the pattern name.
</summary>
<returns>The pattern's name, such as "Major" or "Minor".</returns>
</member>
<member name="M:Midi.ChordPattern.op_Equality(Midi.ChordPattern,Midi.ChordPattern)">
<summary>
Equality operator does value equality.
</summary>
</member>
<member name="M:Midi.ChordPattern.op_Inequality(Midi.ChordPattern,Midi.ChordPattern)">
<summary>
Inequality operator does value inequality.
</summary>
</member>
<member name="M:Midi.ChordPattern.Equals(System.Object)">
<summary>
Value equality.
</summary>
</member>
<member name="M:Midi.ChordPattern.GetHashCode">
<summary>
Hash code.
</summary>
</member>
<member name="M:Midi.ChordPattern.IsSequenceValid(System.Int32[])">
<summary>
Returns true if sequence has at least two elements, starts at zero, and is monotonically
increasing.
</summary>
</member>
<member name="P:Midi.ChordPattern.Name">
<summary>
The name of the chord pattern.
</summary>
</member>
<member name="P:Midi.ChordPattern.Abbreviation">
<summary>
Abbreviation for this chord pattern.
</summary>
<remarks>
This is the string used in the abbreviated name for a chord, placed immediately
after the tonic and before the slashed inversion (if there is one). For example,
for minor chords the abbreviation is "m", as in "Am".
</remarks>
</member>
<member name="P:Midi.ChordPattern.Ascent">
<summary>
The ascending note sequence of the chord, in semitones-above-the-root.
</summary>
<remarks>
<para>This sequence starts at zero (for the root) and is monotonically
increasing, each element representing a pitch in semitones above the root.</para>
</remarks>
</member>
<member name="P:Midi.ChordPattern.LetterOffsets">
<summary>
The sequence of letters in the chord.
</summary>
<remarks>
<para>This array describes what sequence of letters appears in this chord. Each
element is a "letter offset", a positive integer that tell you how many letters to
move up from the root for that note. It must start at zero, representing the
letter for the root note.</para>
</remarks>
</member>
<member name="T:Midi.Chord">
<summary>
A chord.
</summary>
<remarks>
<para>A chord is defined by its root note, the sequence of semitones, the sequence of
letters, and the inversion. The root note is described with a <see cref="T:Midi.Note"/>
because we want to be able to talk about the chord independent of any one octave. The
pattern of semitones and letters is given by the <see cref="P:Midi.Chord.Pattern"/> nested class. The
inversion is an integer indicating how many rotations the pattern has undergone.
</para>
<para>This class comes with a collection of predefined chord patterns, such as
<see cref="F:Midi.Chord.Major"/> and <see cref="F:Midi.Chord.Minor"/>.</para>
</remarks>
</member>
<member name="M:Midi.Chord.#ctor(Midi.Note,Midi.ChordPattern,System.Int32)">
<summary>
Constructs a chord from its root note, pattern, and inversion.
</summary>
<param name="root">The root note of the chord.</param>
<param name="pattern">The chord pattern.</param>
<param name="inversion">The inversion, in [0..N-1] where N is the number of notes
in pattern.</param>
<exception cref="T:System.ArgumentNullException">pattern is null.</exception>
<exception cref="T:System.ArgumentOutOfRangeException">inversion is out of range.</exception>
</member>
<member name="M:Midi.Chord.#ctor(System.String)">
<summary>
Constructs a chord from a string.
</summary>
<param name="name">The name to parse. This is the same format as the Name property:
a letter in ['A'..'G'], an optional series of accidentals (#'s or b's), then an
optional inversion specified as a '/' followed by another note name. If the
inversion is present it must be one of the notes in the chord.</param>
<exception cref="T:System.ArgumentNullException">name is null.</exception>
<exception cref="T:System.ArgumentException">cannot parse a chord from name.</exception>
</member>
<member name="M:Midi.Chord.FindMatchingChords(System.Collections.Generic.List{Midi.Pitch})">
<summary>
Returns a list of chords which match the set of input pitches.
</summary>
<param name="pitches">Notes being analyzed.</param>
<returns>A (possibly empty) list of chords.</returns>
</member>
<member name="M:Midi.Chord.Contains(Midi.Pitch)">
<summary>
Returns true if this chord contains the specified pitch.
</summary>
<param name="pitch">The pitch to test.</param>
<returns>True if this chord contains the pitch.</returns>
</member>
<member name="F:Midi.Chord.Major">
<summary>
Pattern for Major chords.
</summary>
</member>
<member name="F:Midi.Chord.Minor">
<summary>
Pattern for Minor chords.
</summary>
</member>
<member name="F:Midi.Chord.Seventh">
<summary>
Pattern for Seventh chords.
</summary>
</member>
<member name="F:Midi.Chord.Augmented">
<summary>
Pattern for Augmented chords.
</summary>
</member>
<member name="F:Midi.Chord.Diminished">
<summary>
Pattern for Diminished chords.
</summary>
</member>
<member name="F:Midi.Chord.Patterns">
<summary>
Array of all the built-in chord patterns.
</summary>
</member>
<member name="M:Midi.Chord.ToString">
<summary>
ToString returns the chord name.
</summary>
<returns>The chord's name.</returns>
</member>
<member name="M:Midi.Chord.op_Equality(Midi.Chord,Midi.Chord)">
<summary>
Equality operator does value equality because Chord is immutable.
</summary>
</member>
<member name="M:Midi.Chord.op_Inequality(Midi.Chord,Midi.Chord)">
<summary>
Inequality operator does value inequality because Chord is immutable.
</summary>
</member>
<member name="M:Midi.Chord.Equals(System.Object)">
<summary>
Value equality.
</summary>
</member>
<member name="M:Midi.Chord.GetHashCode">
<summary>
Hash code.
</summary>
</member>
<member name="M:Midi.Chord.RotateArrayLeft(System.Array,System.Array,System.Int32)">
<summary>
Fills dest with a rotated version of source.
</summary>
<param name="source">The source array.</param>
<param name="dest">The dest array, which must have the same length and underlying type
as source.</param>
<param name="rotation">The number of elements to rotate to the left by.</param>
</member>
<member name="P:Midi.Chord.Name">
<summary>
The name of this chord.
</summary>
</member>
<member name="P:Midi.Chord.Root">
<summary>The root note of this chord.</summary>
</member>
<member name="P:Midi.Chord.Bass">
<summary>The bass note of this chord.</summary>
</member>
<member name="P:Midi.Chord.Pattern">
<summary>The pattern of this chord.</summary>
</member>
<member name="P:Midi.Chord.Inversion">
<summary>The inversion of this chord.</summary>
</member>
<member name="P:Midi.Chord.NoteSequence">
<summary>
The sequence of notes in this chord.
</summary>
</member>
<member name="T:Midi.Instrument">
<summary>
General MIDI instrument, used in Program Change messages.
</summary>
<remarks>
<para>The MIDI protocol defines a Program Change message, which can be used to switch a
device among "presets". The General MIDI specification further standardizes those presets
into the specific instruments in this enum. General-MIDI-compliant devices will
have these particular instruments; non-GM devices may have other instruments.</para>
<para>MIDI instruments are one-indexed in the spec, but they're zero-indexed in code, so
we have them zero-indexed here.</para>
<para>This enum has extension methods, such as <see cref="M:Midi.InstrumentExtensionMethods.Name(Midi.Instrument)"/>
and <see cref="M:Midi.InstrumentExtensionMethods.IsValid(Midi.Instrument)"/>, defined in
<see cref="T:Midi.InstrumentExtensionMethods"/>.</para>
</remarks>
</member>
<member name="F:Midi.Instrument.AcousticGrandPiano">
<summary>General MIDI instrument 0 ("Acoustic Grand Piano").</summary>
</member>
<member name="F:Midi.Instrument.BrightAcousticPiano">
<summary>General MIDI instrument 1 ("Bright Acoustic Piano").</summary>
</member>
<member name="F:Midi.Instrument.ElectricGrandPiano">
<summary>General MIDI instrument 2 ("Electric Grand Piano").</summary>
</member>
<member name="F:Midi.Instrument.HonkyTonkPiano">
<summary>General MIDI instrument 3 ("Honky Tonk Piano").</summary>
</member>
<member name="F:Midi.Instrument.ElectricPiano1">
<summary>General MIDI instrument 4 ("Electric Piano 1").</summary>
</member>
<member name="F:Midi.Instrument.ElectricPiano2">
<summary>General MIDI instrument 5 ("Electric Piano 2").</summary>
</member>
<member name="F:Midi.Instrument.Harpsichord">
<summary>General MIDI instrument 6 ("Harpsichord").</summary>
</member>
<member name="F:Midi.Instrument.Clavinet">
<summary>General MIDI instrument 7 ("Clavinet").</summary>
</member>
<member name="F:Midi.Instrument.Celesta">
<summary>General MIDI instrument 8 ("Celesta").</summary>
</member>
<member name="F:Midi.Instrument.Glockenspiel">
<summary>General MIDI instrument 9 ("Glockenspiel").</summary>
</member>
<member name="F:Midi.Instrument.MusicBox">
<summary>General MIDI instrument 10 ("Music Box").</summary>
</member>
<member name="F:Midi.Instrument.Vibraphone">
<summary>General MIDI instrument 11 ("Vibraphone").</summary>
</member>
<member name="F:Midi.Instrument.Marimba">
<summary>General MIDI instrument 12 ("Marimba").</summary>
</member>
<member name="F:Midi.Instrument.Xylophone">
<summary>General MIDI instrument 13 ("Xylophone").</summary>
</member>
<member name="F:Midi.Instrument.TubularBells">
<summary>General MIDI instrument 14 ("Tubular Bells").</summary>
</member>
<member name="F:Midi.Instrument.Dulcimer">
<summary>General MIDI instrument 15 ("Dulcimer").</summary>
</member>
<member name="F:Midi.Instrument.DrawbarOrgan">
<summary>General MIDI instrument 16 ("Drawbar Organ").</summary>
</member>
<member name="F:Midi.Instrument.PercussiveOrgan">
<summary>General MIDI instrument 17 ("Percussive Organ").</summary>
</member>
<member name="F:Midi.Instrument.RockOrgan">
<summary>General MIDI instrument 18 ("Rock Organ").</summary>
</member>
<member name="F:Midi.Instrument.ChurchOrgan">
<summary>General MIDI instrument 19 ("Church Organ").</summary>
</member>
<member name="F:Midi.Instrument.ReedOrgan">
<summary>General MIDI instrument 20 ("Reed Organ").</summary>
</member>
<member name="F:Midi.Instrument.Accordion">
<summary>General MIDI instrument 21 ("Accordion").</summary>
</member>
<member name="F:Midi.Instrument.Harmonica">
<summary>General MIDI instrument 22 ("Harmonica").</summary>
</member>
<member name="F:Midi.Instrument.TangoAccordion">
<summary>General MIDI instrument 23 ("Tango Accordion").</summary>
</member>
<member name="F:Midi.Instrument.AcousticGuitarNylon">
<summary>General MIDI instrument 24 ("Acoustic Guitar (nylon)").</summary>
</member>
<member name="F:Midi.Instrument.AcousticGuitarSteel">
<summary>General MIDI instrument 25 ("Acoustic Guitar (steel)").</summary>
</member>
<member name="F:Midi.Instrument.ElectricGuitarJazz">
<summary>General MIDI instrument 26 ("Electric Guitar (jazz)").</summary>
</member>
<member name="F:Midi.Instrument.ElectricGuitarClean">
<summary>General MIDI instrument 27 ("Electric Guitar (clean)").</summary>
</member>
<member name="F:Midi.Instrument.ElectricGuitarMuted">
<summary>General MIDI instrument 28 ("Electric Guitar (muted)").</summary>
</member>
<member name="F:Midi.Instrument.OverdrivenGuitar">
<summary>General MIDI instrument 29 ("Overdriven Guitar").</summary>
</member>
<member name="F:Midi.Instrument.DistortionGuitar">
<summary>General MIDI instrument 30 ("Distortion Guitar").</summary>
</member>
<member name="F:Midi.Instrument.GuitarHarmonics">
<summary>General MIDI instrument 31 ("Guitar Harmonics").</summary>
</member>
<member name="F:Midi.Instrument.AcousticBass">
<summary>General MIDI instrument 32 ("Acoustic Bass").</summary>
</member>
<member name="F:Midi.Instrument.ElectricBassFinger">
<summary>General MIDI instrument 33 ("Electric Bass (finger)").</summary>
</member>
<member name="F:Midi.Instrument.ElectricBassPick">
<summary>General MIDI instrument 34 ("Electric Bass (pick)").</summary>
</member>
<member name="F:Midi.Instrument.FretlessBass">
<summary>General MIDI instrument 35 ("Fretless Bass").</summary>
</member>
<member name="F:Midi.Instrument.SlapBass1">
<summary>General MIDI instrument 36 ("Slap Bass 1").</summary>
</member>
<member name="F:Midi.Instrument.SlapBass2">
<summary>General MIDI instrument 37 ("Slap Bass 2").</summary>
</member>
<member name="F:Midi.Instrument.SynthBass1">
<summary>General MIDI instrument 38 ("Synth Bass 1").</summary>
</member>
<member name="F:Midi.Instrument.SynthBass2">
<summary>General MIDI instrument 39("Synth Bass 2").</summary>
</member>
<member name="F:Midi.Instrument.Violin">
<summary>General MIDI instrument 40 ("Violin").</summary>
</member>
<member name="F:Midi.Instrument.Viola">
<summary>General MIDI instrument 41 ("Viola").</summary>
</member>
<member name="F:Midi.Instrument.Cello">
<summary>General MIDI instrument 42 ("Cello").</summary>
</member>
<member name="F:Midi.Instrument.Contrabass">
<summary>General MIDI instrument 43 ("Contrabass").</summary>
</member>
<member name="F:Midi.Instrument.TremoloStrings">
<summary>General MIDI instrument 44 ("Tremolo Strings").</summary>
</member>
<member name="F:Midi.Instrument.PizzicatoStrings">
<summary>General MIDI instrument 45 ("Pizzicato Strings").</summary>
</member>
<member name="F:Midi.Instrument.OrchestralHarp">
<summary>General MIDI instrument 46 ("Orchestral Harp").</summary>
</member>
<member name="F:Midi.Instrument.Timpani">
<summary>General MIDI instrument 47 ("Timpani").</summary>
</member>
<member name="F:Midi.Instrument.StringEnsemble1">
<summary>General MIDI instrument 48 ("String Ensemble 1").</summary>
</member>
<member name="F:Midi.Instrument.StringEnsemble2">
<summary>General MIDI instrument 49 ("String Ensemble 2").</summary>
</member>
<member name="F:Midi.Instrument.SynthStrings1">
<summary>General MIDI instrument 50 ("Synth Strings 1").</summary>
</member>
<member name="F:Midi.Instrument.SynthStrings2">
<summary>General MIDI instrument 51 ("Synth Strings 2").</summary>
</member>
<member name="F:Midi.Instrument.ChoirAahs">
<summary>General MIDI instrument 52 ("Choir Aahs").</summary>
</member>
<member name="F:Midi.Instrument.VoiceOohs">
<summary>General MIDI instrument 53 ("Voice oohs").</summary>
</member>
<member name="F:Midi.Instrument.SynthVoice">
<summary>General MIDI instrument 54 ("Synth Voice").</summary>
</member>
<member name="F:Midi.Instrument.OrchestraHit">
<summary>General MIDI instrument 55 ("Orchestra Hit").</summary>
</member>
<member name="F:Midi.Instrument.Trumpet">
<summary>General MIDI instrument 56 ("Trumpet").</summary>
</member>
<member name="F:Midi.Instrument.Trombone">
<summary>General MIDI instrument 57 ("Trombone").</summary>
</member>
<member name="F:Midi.Instrument.Tuba">
<summary>General MIDI instrument 58 ("Tuba").</summary>
</member>
<member name="F:Midi.Instrument.MutedTrumpet">
<summary>General MIDI instrument 59 ("Muted Trumpet").</summary>
</member>
<member name="F:Midi.Instrument.FrenchHorn">
<summary>General MIDI instrument 60 ("French Horn").</summary>
</member>
<member name="F:Midi.Instrument.BrassSection">
<summary>General MIDI instrument 61 ("Brass Section").</summary>
</member>
<member name="F:Midi.Instrument.SynthBrass1">
<summary>General MIDI instrument 62 ("Synth Brass 1").</summary>
</member>
<member name="F:Midi.Instrument.SynthBrass2">
<summary>General MIDI instrument 63 ("Synth Brass 2").</summary>
</member>
<member name="F:Midi.Instrument.SopranoSax">
<summary>General MIDI instrument 64 ("Soprano Sax").</summary>
</member>
<member name="F:Midi.Instrument.AltoSax">
<summary>General MIDI instrument 65 ("Alto Sax").</summary>
</member>
<member name="F:Midi.Instrument.TenorSax">
<summary>General MIDI instrument 66 ("Tenor Sax").</summary>
</member>
<member name="F:Midi.Instrument.BaritoneSax">
<summary>General MIDI instrument 67 ("Baritone Sax").</summary>
</member>
<member name="F:Midi.Instrument.Oboe">
<summary>General MIDI instrument 68 ("Oboe").</summary>
</member>
<member name="F:Midi.Instrument.EnglishHorn">
<summary>General MIDI instrument 69 ("English Horn").</summary>
</member>
<member name="F:Midi.Instrument.Bassoon">
<summary>General MIDI instrument 70 ("Bassoon").</summary>
</member>
<member name="F:Midi.Instrument.Clarinet">
<summary>General MIDI instrument 71 ("Clarinet").</summary>
</member>
<member name="F:Midi.Instrument.Piccolo">
<summary>General MIDI instrument 72 ("Piccolo").</summary>
</member>
<member name="F:Midi.Instrument.Flute">
<summary>General MIDI instrument 73 ("Flute").</summary>
</member>
<member name="F:Midi.Instrument.Recorder">
<summary>General MIDI instrument 74 ("Recorder").</summary>
</member>
<member name="F:Midi.Instrument.PanFlute">
<summary>General MIDI instrument 75 ("PanFlute").</summary>
</member>
<member name="F:Midi.Instrument.BlownBottle">
<summary>General MIDI instrument 76 ("Blown Bottle").</summary>
</member>
<member name="F:Midi.Instrument.Shakuhachi">
<summary>General MIDI instrument 77 ("Shakuhachi").</summary>
</member>
<member name="F:Midi.Instrument.Whistle">
<summary>General MIDI instrument 78 ("Whistle").</summary>
</member>
<member name="F:Midi.Instrument.Ocarina">
<summary>General MIDI instrument 79 ("Ocarina").</summary>
</member>
<member name="F:Midi.Instrument.Lead1Square">
<summary>General MIDI instrument 80 ("Lead 1 (square)").</summary>
</member>
<member name="F:Midi.Instrument.Lead2Sawtooth">
<summary>General MIDI instrument 81 ("Lead 2 (sawtooth)").</summary>
</member>
<member name="F:Midi.Instrument.Lead3Calliope">
<summary>General MIDI instrument 82 ("Lead 3 (calliope)").</summary>
</member>
<member name="F:Midi.Instrument.Lead4Chiff">
<summary>General MIDI instrument 83 ("Lead 4 (chiff)").</summary>
</member>
<member name="F:Midi.Instrument.Lead5Charang">
<summary>General MIDI instrument 84 ("Lead 5 (charang)").</summary>
</member>
<member name="F:Midi.Instrument.Lead6Voice">
<summary>General MIDI instrument 85 ("Lead 6 (voice)").</summary>
</member>
<member name="F:Midi.Instrument.Lead7Fifths">
<summary>General MIDI instrument 86 ("Lead 7 (fifths)").</summary>
</member>
<member name="F:Midi.Instrument.Lead8BassPlusLead">
<summary>General MIDI instrument 87 ("Lead 8 (bass + lead)").</summary>
</member>
<member name="F:Midi.Instrument.Pad1NewAge">
<summary>General MIDI instrument 88 ("Pad 1 (new age)").</summary>
</member>
<member name="F:Midi.Instrument.Pad2Warm">
<summary>General MIDI instrument 89 ("Pad 2 (warm)").</summary>
</member>
<member name="F:Midi.Instrument.Pad3Polysynth">
<summary>General MIDI instrument 90 ("Pad 3 (polysynth)").</summary>
</member>
<member name="F:Midi.Instrument.Pad4Choir">
<summary>General MIDI instrument 91 ("Pad 4 (choir)").</summary>
</member>
<member name="F:Midi.Instrument.Pad5Bowed">
<summary>General MIDI instrument 92 ("Pad 5 (bowed)").</summary>
</member>
<member name="F:Midi.Instrument.Pad6Metallic">
<summary>General MIDI instrument 93 ("Pad 6 (metallic)").</summary>
</member>
<member name="F:Midi.Instrument.Pad7Halo">
<summary>General MIDI instrument 94 ("Pad 7 (halo)").</summary>
</member>
<member name="F:Midi.Instrument.Pad8Sweep">
<summary>General MIDI instrument 95 ("Pad 8 (sweep)").</summary>
</member>
<member name="F:Midi.Instrument.FX1Rain">
<summary>General MIDI instrument 96 ("FX 1 (rain)").</summary>
</member>
<member name="F:Midi.Instrument.FX2Soundtrack">
<summary>General MIDI instrument 97 ("FX 2 (soundtrack)").</summary>
</member>
<member name="F:Midi.Instrument.FX3Crystal">
<summary>General MIDI instrument 98 ("FX 3 (crystal)").</summary>
</member>
<member name="F:Midi.Instrument.FX4Atmosphere">
<summary>General MIDI instrument 99 ("FX 4 (atmosphere)").</summary>
</member>
<member name="F:Midi.Instrument.FX5Brightness">
<summary>General MIDI instrument 100 ("FX 5 (brightness)").</summary>
</member>
<member name="F:Midi.Instrument.FX6Goblins">
<summary>General MIDI instrument 101 ("FX 6 (goblins)").</summary>
</member>
<member name="F:Midi.Instrument.FX7Echoes">
<summary>General MIDI instrument 102 ("FX 7 (echoes)").</summary>
</member>
<member name="F:Midi.Instrument.FX8SciFi">
<summary>General MIDI instrument 103 ("FX 8 (sci-fi)").</summary>
</member>
<member name="F:Midi.Instrument.Sitar">
<summary>General MIDI instrument 104 ("Sitar").</summary>
</member>
<member name="F:Midi.Instrument.Banjo">
<summary>General MIDI instrument 105 ("Banjo").</summary>
</member>
<member name="F:Midi.Instrument.Shamisen">
<summary>General MIDI instrument 106 ("Shamisen").</summary>
</member>
<member name="F:Midi.Instrument.Koto">
<summary>General MIDI instrument 107 ("Koto").</summary>
</member>
<member name="F:Midi.Instrument.Kalimba">
<summary>General MIDI instrument 108 ("Kalimba").</summary>
</member>
<member name="F:Midi.Instrument.Bagpipe">
<summary>General MIDI instrument 109 ("Bagpipe").</summary>
</member>
<member name="F:Midi.Instrument.Fiddle">
<summary>General MIDI instrument 110 ("Fiddle").</summary>
</member>
<member name="F:Midi.Instrument.Shanai">
<summary>General MIDI instrument 111 ("Shanai").</summary>
</member>
<member name="F:Midi.Instrument.TinkleBell">
<summary>General MIDI instrument 112 ("Tinkle Bell").</summary>
</member>
<member name="F:Midi.Instrument.Agogo">
<summary>General MIDI instrument 113 (Agogo"").</summary>
</member>
<member name="F:Midi.Instrument.SteelDrums">
<summary>General MIDI instrument 114 ("Steel Drums").</summary>
</member>
<member name="F:Midi.Instrument.Woodblock">
<summary>General MIDI instrument 115 ("Woodblock").</summary>
</member>
<member name="F:Midi.Instrument.TaikoDrum">
<summary>General MIDI instrument 116 ("Taiko Drum").</summary>
</member>
<member name="F:Midi.Instrument.MelodicTom">
<summary>General MIDI instrument 117 ("Melodic Tom").</summary>
</member>
<member name="F:Midi.Instrument.SynthDrum">
<summary>General MIDI instrument 118 ("Synth Drum").</summary>
</member>
<member name="F:Midi.Instrument.ReverseCymbal">
<summary>General MIDI instrument 119 ("Reverse Cymbal").</summary>
</member>
<member name="F:Midi.Instrument.GuitarFretNoise">
<summary>General MIDI instrument 120 ("Guitar Fret Noise").</summary>
</member>
<member name="F:Midi.Instrument.BreathNoise">
<summary>General MIDI instrument 121 ("Breath Noise").</summary>
</member>
<member name="F:Midi.Instrument.Seashore">
<summary>General MIDI instrument 122 ("Seashore").</summary>
</member>
<member name="F:Midi.Instrument.BirdTweet">
<summary>General MIDI instrument 123 ("Bird Tweet").</summary>
</member>
<member name="F:Midi.Instrument.TelephoneRing">
<summary>General MIDI instrument 124 ("Telephone Ring").</summary>
</member>
<member name="F:Midi.Instrument.Helicopter">
<summary>General MIDI instrument 125 ("Helicopter").</summary>
</member>
<member name="F:Midi.Instrument.Applause">
<summary>General MIDI instrument 126 ("Applause").</summary>
</member>
<member name="F:Midi.Instrument.Gunshot">
<summary>General MIDI instrument 127 ("Gunshot").</summary>
</member>
<member name="T:Midi.InstrumentExtensionMethods">
<summary>
Extension methods for the Instrument enum.
</summary>
</member>
<member name="M:Midi.InstrumentExtensionMethods.IsValid(Midi.Instrument)">
<summary>
Returns true if the specified instrument is valid.
</summary>
<param name="instrument">The instrument to test.</param>
</member>
<member name="M:Midi.InstrumentExtensionMethods.Validate(Midi.Instrument)">
<summary>
Throws an exception if instrument is not valid.
</summary>
<param name="instrument">The instrument to validate.</param>
<exception cref="T:System.ArgumentOutOfRangeException">The instrument is out-of-range.
</exception>
</member>
<member name="F:Midi.InstrumentExtensionMethods.InstrumentNames">
<summary>
General Midi instrument names, used by GetInstrumentName().
</summary>
</member>
<member name="M:Midi.InstrumentExtensionMethods.Name(Midi.Instrument)">
<summary>
Returns the human-readable name of a MIDI instrument.
</summary>
<param name="instrument">The instrument.</param>
<exception cref="T:System.ArgumentOutOfRangeException">The instrument is out-of-range.
</exception>
</member>
<member name="T:Midi.ShortMsg">
<summary>
Utility functions for encoding and decoding short messages.
</summary>
</member>
<member name="M:Midi.ShortMsg.IsNoteOn(System.UIntPtr,System.UIntPtr)">
<summary>
Returns true if the given short message describes a Note On message.
</summary>
<param name="dwParam1">The dwParam1 arg passed to MidiInProc.</param>
<param name="dwParam2">The dwParam2 arg passed to MidiInProc.</param>
</member>
<member name="M:Midi.ShortMsg.DecodeNoteOn(System.UIntPtr,System.UIntPtr,Midi.Channel@,Midi.Pitch@,System.Int32@,System.UInt32@)">
<summary>
Decodes a Note On short message.
</summary>
<param name="dwParam1">The dwParam1 arg passed to MidiInProc.</param>
<param name="dwParam2">The dwParam2 arg passed to MidiInProc.</param>
<param name="channel">Filled in with the channel.</param>
<param name="pitch">Filled in with the pitch.</param>
<param name="velocity">Filled in with the velocity, 0.127</param>
<param name="timestamp">Filled in with the timestamp in microseconds since
midiInStart().</param>
</member>
<member name="M:Midi.ShortMsg.EncodeNoteOn(Midi.Channel,Midi.Pitch,System.Int32)">
<summary>
Encodes a Note On short message.
</summary>
<param name="channel">The channel.</param>
<param name="pitch">The pitch.</param>
<param name="velocity">The velocity 0..127.</param>
<returns>A value that can be passed to midiOutShortMsg.</returns>
<exception cref="T:System.ArgumentOutOfRangeException">pitch is not in MIDI range.</exception>
</member>
<member name="M:Midi.ShortMsg.IsNoteOff(System.UIntPtr,System.UIntPtr)">
<summary>
Returns true if the given short message describes a Note Off message.
</summary>
<param name="dwParam1">The dwParam1 arg passed to MidiInProc.</param>
<param name="dwParam2">The dwParam2 arg passed to MidiInProc.</param>
</member>
<member name="M:Midi.ShortMsg.DecodeNoteOff(System.UIntPtr,System.UIntPtr,Midi.Channel@,Midi.Pitch@,System.Int32@,System.UInt32@)">
<summary>
Decodes a Note Off short message.
</summary>
<param name="dwParam1">The dwParam1 arg passed to MidiInProc.</param>
<param name="dwParam2">The dwParam2 arg passed to MidiInProc.</param>
<param name="channel">Filled in with the channel.</param>
<param name="pitch">Filled in with the pitch.</param>
<param name="velocity">Filled in with the velocity, 0.127</param>
<param name="timestamp">Filled in with the timestamp in microseconds since
midiInStart().</param>
</member>
<member name="M:Midi.ShortMsg.EncodeNoteOff(Midi.Channel,Midi.Pitch,System.Int32)">
<summary>
Encodes a Note Off short message.
</summary>
<param name="channel">The channel.</param>
<param name="pitch">The pitch.</param>
<param name="velocity">The velocity 0..127.</param>
<returns>A value that can be passed to midiOutShortMsg.</returns>
</member>
<member name="M:Midi.ShortMsg.IsControlChange(System.UIntPtr,System.UIntPtr)">
<summary>
Returns true if the given short message describes a Control Change message.
</summary>
<param name="dwParam1">The dwParam1 arg passed to MidiInProc.</param>
<param name="dwParam2">The dwParam2 arg passed to MidiInProc.</param>
</member>
<member name="M:Midi.ShortMsg.DecodeControlChange(System.UIntPtr,System.UIntPtr,Midi.Channel@,Midi.Control@,System.Int32@,System.UInt32@)">
<summary>
Decodes a Control Change short message.
</summary>
<param name="dwParam1">The dwParam1 arg passed to MidiInProc.</param>
<param name="dwParam2">The dwParam2 arg passed to MidiInProc.</param>
<param name="channel">Filled in with the channel.</param>
<param name="control">Filled in with the control.</param>
<param name="value">Filled in with the value, 0-127.</param>
<param name="timestamp">Filled in with the timestamp in microseconds since
midiInStart().</param>
</member>
<member name="M:Midi.ShortMsg.EncodeControlChange(Midi.Channel,Midi.Control,System.Int32)">
<summary>
Encodes a Control Change short message.
</summary>
<param name="channel">The channel.</param>
<param name="control">The control.</param>
<param name="value">The new value 0..127.</param>
<returns>A value that can be passed to midiOutShortMsg.</returns>
</member>
<member name="M:Midi.ShortMsg.IsProgramChange(System.UIntPtr,System.UIntPtr)">
<summary>
Returns true if the given short message a Program Change message.
</summary>
<param name="dwParam1">The dwParam1 arg passed to MidiInProc.</param>
<param name="dwParam2">The dwParam2 arg passed to MidiInProc.</param>
</member>
<member name="M:Midi.ShortMsg.DecodeProgramChange(System.UIntPtr,System.UIntPtr,Midi.Channel@,Midi.Instrument@,System.UInt32@)">
<summary>
Decodes a Program Change short message.
</summary>
<param name="dwParam1">The dwParam1 arg passed to MidiInProc.</param>
<param name="dwParam2">The dwParam2 arg passed to MidiInProc.</param>
<param name="channel">Filled in with the channel, 0-15.</param>
<param name="instrument">Filled in with the instrument, 0-127</param>
<param name="timestamp">Filled in with the timestamp in microseconds since
midiInStart().</param>
</member>
<member name="M:Midi.ShortMsg.EncodeProgramChange(Midi.Channel,Midi.Instrument)">
<summary>
Encodes a Program Change short message.
</summary>
<param name="channel">The channel.</param>
<param name="instrument">The instrument.</param>
<returns>A value that can be passed to midiOutShortMsg.</returns>
</member>
<member name="M:Midi.ShortMsg.IsPitchBend(System.UIntPtr,System.UIntPtr)">
<summary>
Returns true if the given MidiInProc params describe a Pitch Bend message.
</summary>
<param name="dwParam1">The dwParam1 arg passed to MidiInProc.</param>
<param name="dwParam2">The dwParam2 arg passed to MidiInProc.</param>
</member>
<member name="M:Midi.ShortMsg.DecodePitchBend(System.UIntPtr,System.UIntPtr,Midi.Channel@,System.Int32@,System.UInt32@)">
<summary>
Decodes a Pitch Bend message based on MidiInProc params.
</summary>
<param name="dwParam1">The dwParam1 arg passed to MidiInProc.</param>
<param name="dwParam2">The dwParam2 arg passed to MidiInProc.</param>
<param name="channel">Filled in with the channel, 0-15.</param>
<param name="value">Filled in with the pitch bend value, 0..16383, 8192 is centered.
</param>
<param name="timestamp">Filled in with the timestamp in microseconds since
midiInStart().</param>
</member>
<member name="M:Midi.ShortMsg.EncodePitchBend(Midi.Channel,System.Int32)">
<summary>
Encodes a Pitch Bend short message.
</summary>
<param name="channel">The channel.</param>
<param name="value">The pitch bend value, 0..16383, 8192 is centered.</param>
<returns>A value that can be passed to midiOutShortMsg.</returns>
</member>
<member name="T:Midi.Pitch">
<summary>
Pitches supported by MIDI.
</summary>
<remarks>
<para>MIDI defines 127 distinct pitches, in semitone intervals, ranging from C five octaves
below middle C, up to G five octaves above middle C. This covers several octaves above and
below the range of a normal 88-key piano.</para>
<para>These 127 pitches are the only ones directly expressible in MIDI. Precise
variations in frequency can be achieved with <see cref="M:Midi.OutputDevice.SendPitchBend(Midi.Channel,System.Int32)">Pitch
Bend</see> messages, though Pitch Bend messages apply to the whole channel at once.</para>
<para>In this enum, pitches are given C Major note names (eg "F", "GSharp") followed
by the octave number. Octaves use standard piano terminology: Middle C is in
octave 4. (Note that this is different from "MIDI octaves", which have Middle C in
octave 0.)</para>
<para>This enum has extension methods, such as
<see cref="M:Midi.PitchExtensionMethods.NotePreferringSharps(Midi.Pitch)"/> and
<see cref="M:Midi.PitchExtensionMethods.IsInMidiRange(Midi.Pitch)"/>, defined in
<see cref="T:Midi.PitchExtensionMethods"/>.
</para>
</remarks>
<seealso cref="T:Midi.Note"/>
<seealso cref="T:Midi.Interval"/>
</member>
<member name="F:Midi.Pitch.CNeg1">
<summary>C in octave -1.</summary>
</member>
<member name="F:Midi.Pitch.CSharpNeg1">
<summary>C# in octave -1.</summary>
</member>
<member name="F:Midi.Pitch.DNeg1">
<summary>D in octave -1.</summary>
</member>
<member name="F:Midi.Pitch.DSharpNeg1">
<summary>D# in octave -1.</summary>
</member>
<member name="F:Midi.Pitch.ENeg1">
<summary>E in octave -1.</summary>
</member>
<member name="F:Midi.Pitch.FNeg1">
<summary>F in octave -1.</summary>
</member>
<member name="F:Midi.Pitch.FSharpNeg1">
<summary>F# in octave -1.</summary>
</member>
<member name="F:Midi.Pitch.GNeg1">
<summary>G in octave -1.</summary>
</member>
<member name="F:Midi.Pitch.GSharpNeg1">
<summary>G# in octave -1.</summary>
</member>
<member name="F:Midi.Pitch.ANeg1">
<summary>A in octave -1.</summary>
</member>
<member name="F:Midi.Pitch.ASharpNeg1">
<summary>A# in octave -1.</summary>
</member>
<member name="F:Midi.Pitch.BNeg1">
<summary>B in octave -1.</summary>
</member>
<member name="F:Midi.Pitch.C0">
<summary>C in octave 0.</summary>
</member>
<member name="F:Midi.Pitch.CSharp0">
<summary>C# in octave 0.</summary>
</member>
<member name="F:Midi.Pitch.D0">
<summary>D in octave 0.</summary>
</member>
<member name="F:Midi.Pitch.DSharp0">
<summary>D# in octave 0.</summary>
</member>
<member name="F:Midi.Pitch.E0">
<summary>E in octave 0.</summary>
</member>
<member name="F:Midi.Pitch.F0">
<summary>F in octave 0.</summary>
</member>
<member name="F:Midi.Pitch.FSharp0">
<summary>F# in octave 0.</summary>
</member>
<member name="F:Midi.Pitch.G0">
<summary>G in octave 0.</summary>
</member>
<member name="F:Midi.Pitch.GSharp0">
<summary>G# in octave 0.</summary>
</member>
<member name="F:Midi.Pitch.A0">
<summary>A in octave 0.</summary>
</member>
<member name="F:Midi.Pitch.ASharp0">
<summary>A# in octave 0, usually the lowest key on an 88-key keyboard.</summary>
</member>
<member name="F:Midi.Pitch.B0">
<summary>B in octave 0.</summary>
</member>
<member name="F:Midi.Pitch.C1">
<summary>C in octave 1.</summary>
</member>
<member name="F:Midi.Pitch.CSharp1">
<summary>C# in octave 1.</summary>
</member>
<member name="F:Midi.Pitch.D1">
<summary>D in octave 1.</summary>
</member>
<member name="F:Midi.Pitch.DSharp1">
<summary>D# in octave 1.</summary>
</member>
<member name="F:Midi.Pitch.E1">
<summary>E in octave 1.</summary>
</member>
<member name="F:Midi.Pitch.F1">
<summary>F in octave 1.</summary>
</member>
<member name="F:Midi.Pitch.FSharp1">
<summary>F# in octave 1.</summary>
</member>
<member name="F:Midi.Pitch.G1">
<summary>G in octave 1.</summary>
</member>
<member name="F:Midi.Pitch.GSharp1">
<summary>G# in octave 1.</summary>
</member>
<member name="F:Midi.Pitch.A1">
<summary>A in octave 1.</summary>
</member>
<member name="F:Midi.Pitch.ASharp1">
<summary>A# in octave 1.</summary>
</member>
<member name="F:Midi.Pitch.B1">
<summary>B in octave 1.</summary>
</member>
<member name="F:Midi.Pitch.C2">
<summary>C in octave 2.</summary>
</member>
<member name="F:Midi.Pitch.CSharp2">
<summary>C# in octave 2.</summary>
</member>
<member name="F:Midi.Pitch.D2">
<summary>D in octave 2.</summary>
</member>
<member name="F:Midi.Pitch.DSharp2">
<summary>D# in octave 2.</summary>
</member>
<member name="F:Midi.Pitch.E2">
<summary>E in octave 2.</summary>
</member>
<member name="F:Midi.Pitch.F2">
<summary>F in octave 2.</summary>
</member>
<member name="F:Midi.Pitch.FSharp2">
<summary>F# in octave 2.</summary>
</member>
<member name="F:Midi.Pitch.G2">
<summary>G in octave 2.</summary>
</member>
<member name="F:Midi.Pitch.GSharp2">
<summary>G# in octave 2.</summary>
</member>
<member name="F:Midi.Pitch.A2">
<summary>A in octave 2.</summary>
</member>
<member name="F:Midi.Pitch.ASharp2">
<summary>A# in octave 2.</summary>
</member>
<member name="F:Midi.Pitch.B2">
<summary>B in octave 2.</summary>
</member>
<member name="F:Midi.Pitch.C3">
<summary>C in octave 3.</summary>
</member>
<member name="F:Midi.Pitch.CSharp3">
<summary>C# in octave 3.</summary>
</member>
<member name="F:Midi.Pitch.D3">
<summary>D in octave 3.</summary>
</member>
<member name="F:Midi.Pitch.DSharp3">
<summary>D# in octave 3.</summary>
</member>
<member name="F:Midi.Pitch.E3">
<summary>E in octave 3.</summary>
</member>
<member name="F:Midi.Pitch.F3">
<summary>F in octave 3.</summary>
</member>
<member name="F:Midi.Pitch.FSharp3">
<summary>F# in octave 3.</summary>
</member>
<member name="F:Midi.Pitch.G3">
<summary>G in octave 3.</summary>
</member>
<member name="F:Midi.Pitch.GSharp3">
<summary>G# in octave 3.</summary>
</member>
<member name="F:Midi.Pitch.A3">
<summary>A in octave 3.</summary>
</member>
<member name="F:Midi.Pitch.ASharp3">
<summary>A# in octave 3.</summary>
</member>
<member name="F:Midi.Pitch.B3">
<summary>B in octave 3.</summary>
</member>
<member name="F:Midi.Pitch.C4">
<summary>C in octave 4, also known as Middle C.</summary>
</member>
<member name="F:Midi.Pitch.CSharp4">
<summary>C# in octave 4.</summary>
</member>
<member name="F:Midi.Pitch.D4">
<summary>D in octave 4.</summary>
</member>
<member name="F:Midi.Pitch.DSharp4">
<summary>D# in octave 4.</summary>
</member>
<member name="F:Midi.Pitch.E4">
<summary>E in octave 4.</summary>
</member>
<member name="F:Midi.Pitch.F4">
<summary>F in octave 4.</summary>
</member>
<member name="F:Midi.Pitch.FSharp4">
<summary>F# in octave 4.</summary>
</member>
<member name="F:Midi.Pitch.G4">
<summary>G in octave 4.</summary>
</member>
<member name="F:Midi.Pitch.GSharp4">
<summary>G# in octave 4.</summary>
</member>
<member name="F:Midi.Pitch.A4">
<summary>A in octave 4.</summary>
</member>
<member name="F:Midi.Pitch.ASharp4">
<summary>A# in octave 4.</summary>
</member>
<member name="F:Midi.Pitch.B4">
<summary>B in octave 4.</summary>
</member>
<member name="F:Midi.Pitch.C5">
<summary>C in octave 5.</summary>
</member>
<member name="F:Midi.Pitch.CSharp5">
<summary>C# in octave 5.</summary>
</member>
<member name="F:Midi.Pitch.D5">
<summary>D in octave 5.</summary>
</member>
<member name="F:Midi.Pitch.DSharp5">
<summary>D# in octave 5.</summary>
</member>
<member name="F:Midi.Pitch.E5">
<summary>E in octave 5.</summary>
</member>
<member name="F:Midi.Pitch.F5">
<summary>F in octave 5.</summary>
</member>
<member name="F:Midi.Pitch.FSharp5">
<summary>F# in octave 5.</summary>
</member>
<member name="F:Midi.Pitch.G5">
<summary>G in octave 5.</summary>
</member>
<member name="F:Midi.Pitch.GSharp5">
<summary>G# in octave 5.</summary>
</member>
<member name="F:Midi.Pitch.A5">
<summary>A in octave 5.</summary>
</member>
<member name="F:Midi.Pitch.ASharp5">
<summary>A# in octave 5.</summary>
</member>
<member name="F:Midi.Pitch.B5">
<summary>B in octave 5.</summary>
</member>
<member name="F:Midi.Pitch.C6">
<summary>C in octave 6.</summary>
</member>
<member name="F:Midi.Pitch.CSharp6">
<summary>C# in octave 6.</summary>
</member>
<member name="F:Midi.Pitch.D6">
<summary>D in octave 6.</summary>
</member>
<member name="F:Midi.Pitch.DSharp6">
<summary>D# in octave 6.</summary>
</member>
<member name="F:Midi.Pitch.E6">
<summary>E in octave 6.</summary>
</member>
<member name="F:Midi.Pitch.F6">
<summary>F in octave 6.</summary>
</member>
<member name="F:Midi.Pitch.FSharp6">
<summary>F# in octave 6.</summary>
</member>
<member name="F:Midi.Pitch.G6">
<summary>G in octave 6.</summary>
</member>
<member name="F:Midi.Pitch.GSharp6">
<summary>G# in octave 6.</summary>
</member>
<member name="F:Midi.Pitch.A6">
<summary>A in octave 6.</summary>
</member>
<member name="F:Midi.Pitch.ASharp6">
<summary>A# in octave 6.</summary>
</member>
<member name="F:Midi.Pitch.B6">
<summary>B in octave 6.</summary>
</member>
<member name="F:Midi.Pitch.C7">
<summary>C in octave 7.</summary>
</member>
<member name="F:Midi.Pitch.CSharp7">
<summary>C# in octave 7.</summary>
</member>
<member name="F:Midi.Pitch.D7">
<summary>D in octave 7.</summary>
</member>
<member name="F:Midi.Pitch.DSharp7">
<summary>D# in octave 7.</summary>
</member>
<member name="F:Midi.Pitch.E7">
<summary>E in octave 7.</summary>
</member>
<member name="F:Midi.Pitch.F7">
<summary>F in octave 7.</summary>
</member>
<member name="F:Midi.Pitch.FSharp7">
<summary>F# in octave 7.</summary>
</member>
<member name="F:Midi.Pitch.G7">
<summary>G in octave 7.</summary>
</member>
<member name="F:Midi.Pitch.GSharp7">
<summary>G# in octave 7.</summary>
</member>
<member name="F:Midi.Pitch.A7">
<summary>A in octave 7.</summary>
</member>
<member name="F:Midi.Pitch.ASharp7">
<summary>A# in octave 7.</summary>
</member>
<member name="F:Midi.Pitch.B7">
<summary>B in octave 7.</summary>
</member>
<member name="F:Midi.Pitch.C8">
<summary>C in octave 8, usually the highest key on an 88-key keyboard.</summary>
</member>
<member name="F:Midi.Pitch.CSharp8">
<summary>C# in octave 8.</summary>
</member>
<member name="F:Midi.Pitch.D8">
<summary>D in octave 8.</summary>
</member>
<member name="F:Midi.Pitch.DSharp8">
<summary>D# in octave 8.</summary>
</member>
<member name="F:Midi.Pitch.E8">
<summary>E in octave 8.</summary>
</member>
<member name="F:Midi.Pitch.F8">
<summary>F in octave 8.</summary>
</member>
<member name="F:Midi.Pitch.FSharp8">
<summary>F# in octave 8.</summary>
</member>
<member name="F:Midi.Pitch.G8">
<summary>G in octave 8.</summary>
</member>
<member name="F:Midi.Pitch.GSharp8">
<summary>G# in octave 8.</summary>
</member>
<member name="F:Midi.Pitch.A8">
<summary>A in octave 8.</summary>
</member>
<member name="F:Midi.Pitch.ASharp8">
<summary>A# in octave 8.</summary>
</member>
<member name="F:Midi.Pitch.B8">
<summary>B in octave 8.</summary>
</member>
<member name="F:Midi.Pitch.C9">
<summary>C in octave 9.</summary>
</member>
<member name="F:Midi.Pitch.CSharp9">
<summary>C# in octave 9.</summary>
</member>
<member name="F:Midi.Pitch.D9">
<summary>D in octave 9.</summary>
</member>
<member name="F:Midi.Pitch.DSharp9">
<summary>D# in octave 9.</summary>
</member>
<member name="F:Midi.Pitch.E9">
<summary>E in octave 9.</summary>
</member>
<member name="F:Midi.Pitch.F9">
<summary>F in octave 9.</summary>
</member>
<member name="F:Midi.Pitch.FSharp9">
<summary>F# in octave 9.</summary>
</member>
<member name="F:Midi.Pitch.G9">
<summary>G in octave 9.</summary>
</member>
<member name="T:Midi.PitchExtensionMethods">
<summary>
Extension methods for the Pitch enum.
</summary>
</member>
<member name="M:Midi.PitchExtensionMethods.IsInMidiRange(Midi.Pitch)">
<summary>
Returns true if pitch is in the MIDI range [1..127].
</summary>
<param name="pitch">The pitch to test.</param>
<returns>True if the pitch is in [0..127].</returns>
</member>
<member name="M:Midi.PitchExtensionMethods.Octave(Midi.Pitch)">
<summary>
Returns the octave containing this pitch.
</summary>
<param name="pitch">The pitch.</param>
<returns>The octave, where octaves begin at each C, and Middle C is the first pitch in
octave 4.</returns>
</member>
<member name="M:Midi.PitchExtensionMethods.PositionInOctave(Midi.Pitch)">
<summary>
Returns the position of this pitch in its octave.
</summary>
<param name="pitch">The pitch.</param>
<returns>The pitch's position in its octave, where octaves start at each C, so C's
position is 0, C#'s position is 1, etc.</returns>
</member>
<member name="F:Midi.PitchExtensionMethods.PositionInOctaveToNotesPreferringSharps">
<summary>Maps PositionInOctave() to a Note preferring sharps.</summary>
</member>
<member name="F:Midi.PitchExtensionMethods.PositionInOctaveToNotesPreferringFlats">
<summary>Maps PositionInOctave() to a Note preferring flats.</summary>
</member>
<member name="M:Midi.PitchExtensionMethods.NotePreferringSharps(Midi.Pitch)">
<summary>
Returns the simplest note that resolves to this pitch, preferring sharps where needed.
</summary>
<param name="pitch">The pitch.</param>
<returns>The simplest note for that pitch. If that pitch is a "white key", the note
is simply a letter with no accidentals (and is the same as
<see cref="M:Midi.PitchExtensionMethods.NotePreferringFlats(Midi.Pitch)"/>). Otherwise the note has a sharp.</returns>
</member>
<member name="M:Midi.PitchExtensionMethods.NotePreferringFlats(Midi.Pitch)">
<summary>
Returns the simplest note that resolves to this pitch, preferring flats where needed.
</summary>
<param name="pitch">The pitch.</param>
<returns>The simplest note for that pitch. If that pitch is a "white key", the note
is simply a letter with no accidentals (and is the same as
<see cref="M:Midi.PitchExtensionMethods.NotePreferringSharps(Midi.Pitch)"/>). Otherwise the note has a flat.</returns>
</member>
<member name="M:Midi.PitchExtensionMethods.NoteWithLetter(Midi.Pitch,System.Char)">
<summary>
Returns the note that would name this pitch if it used the given letter.
</summary>
<param name="pitch">The pitch being named.</param>
<param name="letter">The letter to use in the name, in ['A'..'G'].</param>
<returns>The note for pitch with letter. The result may have a large number of
accidentals if pitch is not easily named by letter.</returns>
<exception cref="T:System.ArgumentOutOfRangeException">letter is out of range.</exception>
</member>
<member name="T:Midi.MessageQueue">
<summary>
A time-sorted queue of MIDI messages.
</summary>
Messages can be added in any order, and can be popped off in timestamp order.
</member>
<member name="M:Midi.MessageQueue.#ctor">
<summary>
Constructs an empty message queue.
</summary>
</member>
<member name="M:Midi.MessageQueue.AddMessage(Midi.Message)">
<summary>
Adds a message to the queue.
</summary>
<param name="message">The message to add to the queue.</param>
The message must have a valid timestamp (not MidiMessage.Now), but other than that
there is no restriction on the timestamp. For example, it is legal to add a message with
a timestamp earlier than some other message which was previously removed from the queue.
Such a message would become the new "earliest" message, and so would be be the first message
returned by PopEarliest().
</member>
<member name="M:Midi.MessageQueue.Clear">
<summary>
Discards all messages in the queue.
</summary>
</member>
<member name="M:Midi.MessageQueue.PopEarliest">
<summary>
Removes and returns the message(s) in the queue that have the earliest timestamp.
</summary>
</member>
<member name="P:Midi.MessageQueue.IsEmpty">
<summary>
True if the queue is empty.
</summary>
</member>
<member name="P:Midi.MessageQueue.EarliestTimestamp">
<summary>
The timestamp of the earliest messsage(s) in the queue.
</summary>
Throws an exception if the queue is empty.
</member>
<member name="T:Midi.Percussion">
<summary>
General MIDI percussion note.
</summary>
<remarks>
<para>
In General MIDI, notes played on <see cref="F:Midi.Channel.Channel10"/> make the following
percussion sounds, regardless of any <see cref="M:Midi.OutputDevice.SendProgramChange(Midi.Channel,Midi.Instrument)">Program
Change</see> messages on that channel.
</para>
<para>
This enum is used with <see cref="M:Midi.OutputDevice.SendPercussion(Midi.Percussion,System.Int32)">OutputDevice.SendPercussion
</see> and <see cref="T:Midi.PercussionMessage"/>. Equivalently, when cast to <see cref="T:Midi.Note"/>
it can be used with <see cref="M:Midi.OutputDevice.SendNoteOn(Midi.Channel,Midi.Pitch,System.Int32)">OutputDevice.SendNoteOn</see> and
<see cref="T:Midi.NoteOnMessage"/> on <see cref="F:Midi.Channel.Channel10"/>.</para>
<para>This enum has extension methods, such as <see cref="M:Midi.PercussionExtensionMethods.Name(Midi.Percussion)"/>
and <see cref="M:Midi.PercussionExtensionMethods.IsValid(Midi.Percussion)"/>, defined in
<see cref="T:Midi.PercussionExtensionMethods"/>. </para>
</remarks>
</member>
<member name="F:Midi.Percussion.BassDrum2">
<summary>General MIDI percussion 35 ("Bass Drum 2").</summary>
</member>
<member name="F:Midi.Percussion.BassDrum1">
<summary>General MIDI percussion 36 ("Bass Drum 1").</summary>
</member>
<member name="F:Midi.Percussion.SideStick">
<summary>General MIDI percussion 37 ("Side Stick").</summary>
</member>
<member name="F:Midi.Percussion.SnareDrum1">
<summary>General MIDI percussion 38 ("Snare Drum 1").</summary>
</member>
<member name="F:Midi.Percussion.HandClap">
<summary>General MIDI percussion 39 ("Hand Clap").</summary>
</member>
<member name="F:Midi.Percussion.SnareDrum2">
<summary>General MIDI percussion 40 ("Snare Drum 2").</summary>
</member>
<member name="F:Midi.Percussion.LowTom2">
<summary>General MIDI percussion 41 ("Low Tom 2").</summary>
</member>
<member name="F:Midi.Percussion.ClosedHiHat">
<summary>General MIDI percussion 42 ("Closed Hi-hat").</summary>
</member>
<member name="F:Midi.Percussion.LowTom1">
<summary>General MIDI percussion 43 ("Low Tom 1").</summary>
</member>
<member name="F:Midi.Percussion.PedalHiHat">
<summary>General MIDI percussion 44 ("Pedal Hi-hat").</summary>
</member>
<member name="F:Midi.Percussion.MidTom2">
<summary>General MIDI percussion 45 ("Mid Tom 2").</summary>
</member>
<member name="F:Midi.Percussion.OpenHiHat">
<summary>General MIDI percussion 46 ("Open Hi-hat").</summary>
</member>
<member name="F:Midi.Percussion.MidTom1">
<summary>General MIDI percussion 47 ("Mid Tom 1").</summary>
</member>
<member name="F:Midi.Percussion.HighTom2">
<summary>General MIDI percussion 48 ("High Tom 2").</summary>
</member>
<member name="F:Midi.Percussion.CrashCymbal1">
<summary>General MIDI percussion 49 ("Crash Cymbal 1").</summary>
</member>
<member name="F:Midi.Percussion.HighTom1">
<summary>General MIDI percussion 50 ("High Tom 1").</summary>
</member>
<member name="F:Midi.Percussion.RideCymbal1">
<summary>General MIDI percussion 51 ("Ride Cymbal 1").</summary>
</member>
<member name="F:Midi.Percussion.ChineseCymbal">
<summary>General MIDI percussion 52 ("Chinese Cymbal").</summary>
</member>
<member name="F:Midi.Percussion.RideBell">
<summary>General MIDI percussion 53 ("Ride Bell").</summary>
</member>
<member name="F:Midi.Percussion.Tambourine">
<summary>General MIDI percussion 54 ("Tambourine").</summary>
</member>
<member name="F:Midi.Percussion.SplashCymbal">
<summary>General MIDI percussion 55 ("Splash Cymbal").</summary>
</member>
<member name="F:Midi.Percussion.Cowbell">
<summary>General MIDI percussion 56 ("Cowbell").</summary>
</member>
<member name="F:Midi.Percussion.CrashCymbal2">
<summary>General MIDI percussion 57 ("Crash Cymbal 2").</summary>
</member>
<member name="F:Midi.Percussion.VibraSlap">
<summary>General MIDI percussion 58 ("Vibra Slap").</summary>
</member>
<member name="F:Midi.Percussion.RideCymbal2">
<summary>General MIDI percussion 59 ("Ride Cymbal 2").</summary>
</member>
<member name="F:Midi.Percussion.HighBongo">
<summary>General MIDI percussion 60 ("High Bongo").</summary>
</member>
<member name="F:Midi.Percussion.LowBongo">
<summary>General MIDI percussion 61 ("Low Bongo").</summary>
</member>
<member name="F:Midi.Percussion.MuteHighConga">
<summary>General MIDI percussion 62 ("Mute High Conga").</summary>
</member>
<member name="F:Midi.Percussion.OpenHighConga">
<summary>General MIDI percussion 63 ("Open High Conga").</summary>
</member>
<member name="F:Midi.Percussion.LowConga">
<summary>General MIDI percussion 64 ("Low Conga").</summary>
</member>
<member name="F:Midi.Percussion.HighTimbale">
<summary>General MIDI percussion 65 ("High Timbale").</summary>
</member>
<member name="F:Midi.Percussion.LowTimbale">
<summary>General MIDI percussion 66 ("Low Timbale").</summary>
</member>
<member name="F:Midi.Percussion.HighAgogo">
<summary>General MIDI percussion 67 ("High Agogo").</summary>
</member>
<member name="F:Midi.Percussion.LowAgogo">
<summary>General MIDI percussion 68 ("Low Agogo").</summary>
</member>
<member name="F:Midi.Percussion.Cabasa">
<summary>General MIDI percussion 69 ("Cabasa").</summary>
</member>
<member name="F:Midi.Percussion.Maracas">
<summary>General MIDI percussion 70 ("Maracas").</summary>
</member>
<member name="F:Midi.Percussion.ShortWhistle">
<summary>General MIDI percussion 71 ("Short Whistle").</summary>
</member>
<member name="F:Midi.Percussion.LongWhistle">
<summary>General MIDI percussion 72 ("Long Whistle").</summary>
</member>
<member name="F:Midi.Percussion.ShortGuiro">
<summary>General MIDI percussion 73 ("Short Guiro").</summary>
</member>
<member name="F:Midi.Percussion.LongGuiro">
<summary>General MIDI percussion 74 ("Long Guiro").</summary>
</member>
<member name="F:Midi.Percussion.Claves">
<summary>General MIDI percussion 75 ("Claves").</summary>
</member>
<member name="F:Midi.Percussion.HighWoodBlock">
<summary>General MIDI percussion 76 ("High Wood Block").</summary>
</member>
<member name="F:Midi.Percussion.LowWoodBlock">
<summary>General MIDI percussion 77 ("Low Wood Block").</summary>
</member>
<member name="F:Midi.Percussion.MuteCuica">
<summary>General MIDI percussion 78 ("Mute Cuica").</summary>
</member>
<member name="F:Midi.Percussion.OpenCuica">
<summary>General MIDI percussion 79 ("Open Cuica").</summary>
</member>
<member name="F:Midi.Percussion.MuteTriangle">
<summary>General MIDI percussion 80 ("Mute Triangle").</summary>
</member>
<member name="F:Midi.Percussion.OpenTriangle">
<summary>General MIDI percussion 81 ("Open Triangle").</summary>
</member>
<member name="T:Midi.PercussionExtensionMethods">
<summary>
Extension methods for the Percussion enum.
</summary>
Be sure to "using midi" if you want to use these as extension methods.
</member>
<member name="M:Midi.PercussionExtensionMethods.IsValid(Midi.Percussion)">
<summary>
Returns true if the specified percussion is valid.
</summary>
<param name="percussion">The percussion to test.</param>
</member>
<member name="M:Midi.PercussionExtensionMethods.Validate(Midi.Percussion)">
<summary>
Throws an exception if percussion is not valid.
</summary>
<param name="percussion">The percussion to validate.</param>
<exception cref="T:System.ArgumentOutOfRangeException">The percussion is out-of-range.
</exception>
</member>
<member name="M:Midi.PercussionExtensionMethods.Name(Midi.Percussion)">
<summary>
Returns the human-readable name of a MIDI percussion.
</summary>
<param name="percussion">The percussion.</param>
</member>
<member name="T:Midi.Note">
<summary>
A letter and accidental, which together form an octave-independent note.
</summary>
<remarks>
<para>This class lets you define a note by combining a letters A-G with accidentals
(sharps and flats). Examples of notes are D, B#, and Gbb. This is the conventional
way to refer to notes in an octave independent way.</para>
<para>Each note unambiguously identifies a pitch (modulo octave), but each pitch has
potentially many notes. For example, the notes F, E#, D###, and Gbb all resolve to the
same pitch, though the last two names are unlikely to be used in practice.</para>
</remarks>
</member>
<member name="F:Midi.Note.DoubleFlat">
<summary>Double-flat accidental value.</summary>
</member>
<member name="F:Midi.Note.Flat">
<summary>Flat accidental value.</summary>
</member>
<member name="F:Midi.Note.Natural">
<summary>Natural accidental value.</summary>
</member>
<member name="F:Midi.Note.Sharp">
<summary>Sharp accidental value.</summary>
</member>
<member name="F:Midi.Note.DoubleSharp">
<summary>Double-sharp accidental value.</summary>
</member>
<member name="M:Midi.Note.#ctor(System.Char)">
<summary>
Constructs a note from a letter.
</summary>
<param name="letter">The letter, which must be in ['A'..'G'].</param>
<exception cref="T:System.ArgumentOutOfRangeException">letter is out of range.</exception>
</member>
<member name="M:Midi.Note.#ctor(System.String)">
<summary>
Constructs a note from a string.
</summary>
<param name="name">The name to parse. Must begin with a letter in ['A'..'G'],
then optionally be followed by a series of '#' (sharps) or a series of 'b' (flats).
</param>
<exception cref="T:System.ArgumentNullException">name is null.</exception>
<exception cref="T:System.ArgumentException">name cannot be parsed.</exception>
</member>
<member name="M:Midi.Note.#ctor(System.Char,System.Int32)">
<summary>
Constructs a note name from a letter and accidental.
</summary>
<param name="letter">The letter, which must be in ['A'..'G'].</param>
<param name="accidental">The accidental. Zero means natural, positive values are
sharp by that many semitones, and negative values are flat by that many semitones.
Likely values are <see cref="F:Midi.Note.Natural"/> (0), <see cref="F:Midi.Note.Sharp"/> (1),
<see cref="F:Midi.Note.DoubleSharp"/> (2), <see cref="F:Midi.Note.Flat"/> (-1), and <see cref="F:Midi.Note.DoubleFlat"/>
(-2).</param>
<exception cref="T:System.ArgumentOutOfRangeException">letter is out of range.</exception>
</member>
<member name="M:Midi.Note.ToString">
<summary>
ToString returns the note name.
</summary>
<returns>The note name with '#' for sharp and 'b' for flat. For example, "G", "A#",
"Cb", "Fbb".</returns>
</member>
<member name="M:Midi.Note.ParseNote(System.String,System.Int32@)">
<summary>
Parses a Note from s, starting at position pos.
</summary>
<param name="s">The string to parse from.</param>
<param name="pos">The position to start at. On success, advances pos to after the
end of the note.</param>
<returns>The note.</returns>
<exception cref="T:System.ArgumentException">A note cannot be parsed.</exception>
<remarks>
<para>This function must find a valid letter at s[pos], and then optionally a
sequence of '#' (sharps) or 'b' (flats). It finds as many of the accidental as it can
and then stops at the first character that can't be part of the accidental.</para>
</remarks>
</member>
<member name="M:Midi.Note.IsEharmonicWith(Midi.Note)">
<summary>
Returns true if this note name is enharmonic with otherNote.
</summary>
<param name="otherNote">Another note.</param>
<returns>True if the names can refer to the same pitch.</returns>
</member>
<member name="M:Midi.Note.PitchInOctave(System.Int32)">
<summary>
Returns the pitch for this note in the specified octave.
</summary>
<param name="octave">The octave, where octaves begin at each C and Middle C is the
first note in octave 4.</param>
<returns>The pitch with this name in the specified octave.</returns>
</member>
<member name="M:Midi.Note.PitchAtOrAbove(Midi.Pitch)">
<summary>
Returns the pitch for this note that is at or above nearPitch.
</summary>
<param name="nearPitch">The pitch from which the search is based.</param>
<returns>The pitch for this note at or above nearPitch.</returns>
</member>
<member name="M:Midi.Note.PitchAtOrBelow(Midi.Pitch)">
<summary>
Returns the pitch for this note that is at or below nearPitch.
</summary>
<param name="nearPitch">The pitch from which the search is based.</param>
<returns>The pitch for this note at or below nearPitch.</returns>
</member>
<member name="M:Midi.Note.SemitonesUpTo(Midi.Note)">
<summary>
Returns the number of semitones it takes to move up to the next otherNote.
</summary>
<param name="otherNote">The other note.</param>
<returns>The number of semitones.</returns>
</member>
<member name="M:Midi.Note.SemitonesDownTo(Midi.Note)">
<summary>
Returns the number of semitones it takes to move down to the next otherNote.
</summary>
<param name="otherNote">The other note.</param>
<returns>The number of semitones.</returns>
</member>
<member name="M:Midi.Note.op_Equality(Midi.Note,Midi.Note)">
<summary>Equality operator does value comparison.</summary>
</member>
<member name="M:Midi.Note.op_Inequality(Midi.Note,Midi.Note)">
<summary>Inequality operator does value comparison.</summary>
</member>
<member name="M:Midi.Note.Equals(System.Object)">
<summary>
Value equality for Note.
</summary>
</member>
<member name="M:Midi.Note.GetHashCode">
<summary>
Hash code.
</summary>
</member>
<member name="F:Midi.Note.LetterToNote">
<summary>
Table mapping (letter-'A') to the Note in octave -1, used to compute positionInOctave.
</summary>
</member>
<member name="P:Midi.Note.Letter">
<summary>The letter for this note name, in ['A'..'G'].</summary>
</member>
<member name="P:Midi.Note.Accidental">
<summary>The accidental for this note name.</summary>
<remarks>
<para>Zero means natural, positive values are
sharp by that many semitones, and negative values are flat by that many semitones.
Likely values are <see cref="F:Midi.Note.Natural"/> (0), <see cref="F:Midi.Note.Sharp"/> (1),
<see cref="F:Midi.Note.DoubleSharp"/> (2), <see cref="F:Midi.Note.Flat"/> (-1), and <see cref="F:Midi.Note.DoubleFlat"/>
(-2).</para>
</remarks>
</member>
<member name="P:Midi.Note.PositionInOctave">
<summary>This note's position in the octave, where octaves start at each C.</summary>
</member>
<member name="T:Midi.OutputDevice">
<summary>
A MIDI output device.
</summary>
<remarks>
<para>Each instance of this class describes a MIDI output device installed on the system.
You cannot create your own instances, but instead must go through the
<see cref="P:Midi.OutputDevice.InstalledDevices"/> property to find which devices are available. You may wish
to examine the <see cref="P:Midi.DeviceBase.Name"/> property of each one and present the user with
a choice of which device to use.
</para>
<para>Open an output device with <see cref="M:Midi.OutputDevice.Open"/> and close it with <see cref="M:Midi.OutputDevice.Close"/>.
While it is open, you may send MIDI messages with functions such as
<see cref="M:Midi.OutputDevice.SendNoteOn(Midi.Channel,Midi.Pitch,System.Int32)"/>, <see cref="M:Midi.OutputDevice.SendNoteOff(Midi.Channel,Midi.Pitch,System.Int32)"/> and <see cref="M:Midi.OutputDevice.SendProgramChange(Midi.Channel,Midi.Instrument)"/>.
All notes may be silenced on the device by calling <see cref="M:Midi.OutputDevice.SilenceAllNotes"/>.</para>
<para>Note that the above methods send their messages immediately. If you wish to arrange
for a message to be sent at a specific future time, you'll need to instantiate some subclass
of <see cref="T:Midi.Message"/> (eg <see cref="T:Midi.NoteOnMessage"/>) and then pass it to
<see cref="M:Midi.Clock.Schedule(Midi.Message)">Clock.Schedule</see>.
</para>
</remarks>
<threadsafety static="true" instance="true"/>
<seealso cref="T:Midi.Clock"/>
<seealso cref="T:Midi.InputDevice"/>
</member>
<member name="M:Midi.OutputDevice.Open">
<summary>
Opens this output device.
</summary>
<exception cref="T:System.InvalidOperationException">The device is already open.</exception>
<exception cref="T:Midi.DeviceException">The device cannot be opened.</exception>
</member>
<member name="M:Midi.OutputDevice.Close">
<summary>
Closes this output device.
</summary>
<exception cref="T:System.InvalidOperationException">The device is not open.</exception>
<exception cref="T:Midi.DeviceException">The device cannot be closed.</exception>
</member>
<member name="M:Midi.OutputDevice.SilenceAllNotes">
<summary>
Silences all notes on this output device.
</summary>
<exception cref="T:System.InvalidOperationException">The device is not open.</exception>
<exception cref="T:Midi.DeviceException">The message cannot be sent.</exception>
</member>
<member name="M:Midi.OutputDevice.SendNoteOn(Midi.Channel,Midi.Pitch,System.Int32)">
<summary>
Sends a Note On message to this MIDI output device.
</summary>
<param name="channel">The channel.</param>
<param name="pitch">The pitch.</param>
<param name="velocity">The velocity 0..127.</param>
<exception cref="T:System.ArgumentOutOfRangeException">channel, pitch, or velocity is
out-of-range.</exception>
<exception cref="T:System.InvalidOperationException">The device is not open.</exception>
<exception cref="T:Midi.DeviceException">The message cannot be sent.</exception>
</member>
<member name="M:Midi.OutputDevice.SendNoteOff(Midi.Channel,Midi.Pitch,System.Int32)">
<summary>
Sends a Note Off message to this MIDI output device.
</summary>
<param name="channel">The channel.</param>
<param name="pitch">The pitch.</param>
<param name="velocity">The velocity 0..127.</param>
<exception cref="T:System.ArgumentOutOfRangeException">channel, note, or velocity is
out-of-range.</exception>
<exception cref="T:System.InvalidOperationException">The device is not open.</exception>
<exception cref="T:Midi.DeviceException">The message cannot be sent.</exception>
</member>
<member name="M:Midi.OutputDevice.SendPercussion(Midi.Percussion,System.Int32)">
<summary>
Sends a Note On message to Channel10 of this MIDI output device.
</summary>
<param name="percussion">The percussion.</param>
<param name="velocity">The velocity 0..127.</param>
<remarks>This is simply shorthand for a Note On message on Channel10 with a
percussion-specific note, so there is no corresponding message to receive from an input
device.</remarks>
<exception cref="T:System.ArgumentOutOfRangeException">percussion or velocity is out-of-range.
</exception>
<exception cref="T:System.InvalidOperationException">The device is not open.</exception>
<exception cref="T:Midi.DeviceException">The message cannot be sent.</exception>
</member>
<member name="M:Midi.OutputDevice.SendControlChange(Midi.Channel,Midi.Control,System.Int32)">
<summary>
Sends a Control Change message to this MIDI output device.
</summary>
<param name="channel">The channel.</param>
<param name="control">The control.</param>
<param name="value">The new value 0..127.</param>
<exception cref="T:System.ArgumentOutOfRangeException">channel, control, or value is
out-of-range.</exception>
<exception cref="T:System.InvalidOperationException">The device is not open.</exception>
<exception cref="T:Midi.DeviceException">The message cannot be sent.</exception>
</member>
<member name="M:Midi.OutputDevice.SendPitchBend(Midi.Channel,System.Int32)">
<summary>
Sends a Pitch Bend message to this MIDI output device.
</summary>
<param name="channel">The channel.</param>
<param name="value">The pitch bend value, 0..16383, 8192 is centered.</param>
<exception cref="T:System.ArgumentOutOfRangeException">channel or value is out-of-range.
</exception>
<exception cref="T:System.InvalidOperationException">The device is not open.</exception>
<exception cref="T:Midi.DeviceException">The message cannot be sent.</exception>
</member>
<member name="M:Midi.OutputDevice.SendProgramChange(Midi.Channel,Midi.Instrument)">
<summary>
Sends a Program Change message to this MIDI output device.
</summary>
<param name="channel">The channel.</param>
<param name="instrument">The instrument.</param>
<exception cref="T:System.ArgumentOutOfRangeException">channel or instrument is out-of-range.
</exception>
<exception cref="T:System.InvalidOperationException">The device is not open.</exception>
<exception cref="T:Midi.DeviceException">The message cannot be sent.</exception>
<remarks>
A Program Change message is used to switch among instrument settings, generally
instrument voices. An instrument conforming to General Midi 1 will have the
instruments described in the <see cref="T:Midi.Instrument"/> enum; other instruments
may have different instrument sets.
</remarks>
</member>
<member name="M:Midi.OutputDevice.CheckReturnCode(Midi.Win32API.MMRESULT)">
<summary>
Makes sure rc is MidiWin32Wrapper.MMSYSERR_NOERROR. If not, throws an exception with an
appropriate error message.
</summary>
<param name="rc"></param>
</member>
<member name="M:Midi.OutputDevice.CheckOpen">
<summary>
Throws a MidiDeviceException if this device is not open.
</summary>
</member>
<member name="M:Midi.OutputDevice.CheckNotOpen">
<summary>
Throws a MidiDeviceException if this device is open.
</summary>
</member>
<member name="M:Midi.OutputDevice.#ctor(System.UIntPtr,Midi.Win32API.MIDIOUTCAPS)">
<summary>
Private Constructor, only called by the getter for the InstalledDevices property.
</summary>
<param name="deviceId">Position of this device in the list of all devices.</param>
<param name="caps">Win32 Struct with device metadata</param>
</member>
<member name="M:Midi.OutputDevice.MakeDeviceList">
<summary>
Private method for constructing the array of MidiOutputDevices by calling the Win32 api.
</summary>
<returns></returns>
</member>
<member name="P:Midi.OutputDevice.InstalledDevices">
<summary>
List of devices installed on this system.
</summary>
</member>
<member name="P:Midi.OutputDevice.IsOpen">
<summary>
True if this device is open.
</summary>
</member>
<member name="T:Midi.Control">
<summary>
MIDI Control, used in Control Change messages.
</summary>
<remarks>
<para>In MIDI, Control Change messages are used to influence various auxiliary "controls"
on a device, such as knobs, levers, and pedals. Controls are specified with
integers in [0..127]. This enum provides an incomplete list of controls, because
most controls are too obscure to document effetively here. Even for the ones listed
here, the details of how the value is interpreted are arcane. Please see the MIDI spec for
details.</para>
<para>The most commonly used control is SustainPedal, which is considered off when &lt; 64,
on when &gt; 64.</para>
<para>This enum has extension methods, such as <see cref="M:Midi.ControlExtensionMethods.Name(Midi.Control)"/>
and <see cref="M:Midi.ControlExtensionMethods.IsValid(Midi.Control)"/>, defined in
<see cref="T:Midi.ControlExtensionMethods"/>.</para>
</remarks>
</member>
<member name="F:Midi.Control.ModulationWheel">
<summary>General MIDI Control--See MIDI spec for details.</summary>
</member>
<member name="F:Midi.Control.DataEntryMSB">
<summary>General MIDI Control--See MIDI spec for details.</summary>
</member>
<member name="F:Midi.Control.Volume">
<summary>General MIDI Control--See MIDI spec for details.</summary>
</member>
<member name="F:Midi.Control.Pan">
<summary>General MIDI Control--See MIDI spec for details.</summary>
</member>
<member name="F:Midi.Control.Expression">
<summary>General MIDI Control--See MIDI spec for details.</summary>
</member>
<member name="F:Midi.Control.DataEntryLSB">
<summary>General MIDI Control--See MIDI spec for details.</summary>
</member>
<member name="F:Midi.Control.SustainPedal">
<summary>General MIDI Control--See MIDI spec for details.</summary>
</member>
<member name="F:Midi.Control.ReverbLevel">
<summary>General MIDI Control--See MIDI spec for details.</summary>
</member>
<member name="F:Midi.Control.TremoloLevel">
<summary>General MIDI Control--See MIDI spec for details.</summary>
</member>
<member name="F:Midi.Control.ChorusLevel">
<summary>General MIDI Control--See MIDI spec for details.</summary>
</member>
<member name="F:Midi.Control.CelesteLevel">
<summary>General MIDI Control--See MIDI spec for details.</summary>
</member>
<member name="F:Midi.Control.PhaserLevel">
<summary>General MIDI Control--See MIDI spec for details.</summary>
</member>
<member name="F:Midi.Control.NonRegisteredParameterLSB">
<summary>General MIDI Control--See MIDI spec for details.</summary>
</member>
<member name="F:Midi.Control.NonRegisteredParameterMSB">
<summary>General MIDI Control--See MIDI spec for details.</summary>
</member>
<member name="F:Midi.Control.RegisteredParameterNumberLSB">
<summary>General MIDI Control--See MIDI spec for details.</summary>
</member>
<member name="F:Midi.Control.RegisteredParameterNumberMSB">
<summary>General MIDI Control--See MIDI spec for details.</summary>
</member>
<member name="F:Midi.Control.AllControllersOff">
<summary>General MIDI Control--See MIDI spec for details.</summary>
</member>
<member name="F:Midi.Control.AllNotesOff">
<summary>General MIDI Control--See MIDI spec for details.</summary>
</member>
<member name="T:Midi.ControlExtensionMethods">
<summary>
Extension methods for the Control enum.
</summary>
Be sure to "using midi" if you want to use these as extension methods.
</member>
<member name="M:Midi.ControlExtensionMethods.IsValid(Midi.Control)">
<summary>
Returns true if the specified control is valid.
</summary>
<param name="control">The Control to test.</param>
</member>
<member name="M:Midi.ControlExtensionMethods.Validate(Midi.Control)">
<summary>
Throws an exception if control is not valid.
</summary>
<param name="control">The control to validate.</param>
<exception cref="T:System.ArgumentOutOfRangeException">The control is out-of-range.</exception>
</member>
<member name="F:Midi.ControlExtensionMethods.ControlNames">
<summary>
Table of control names.
</summary>
</member>
<member name="M:Midi.ControlExtensionMethods.Name(Midi.Control)">
<summary>
Returns the human-readable name of a MIDI control.
</summary>
<param name="control">The control.</param>
<exception cref="T:System.ArgumentOutOfRangeException">The control is out-of-range.</exception>
</member>
<member name="T:Midi.Win32API">
<summary>
C# wrappers for the Win32 MIDI API.
</summary>
Because .NET does not provide MIDI support itself, in C# we must use P/Invoke to wrap the
Win32 API. That API consists of the MMSystem.h C header and the winmm.dll library. The API
is described in detail here: http://msdn.microsoft.com/en-us/library/ms712733(VS.85).aspx.
The P/Invoke interop mechanism is described here:
http://msdn.microsoft.com/en-us/library/aa288468(VS.71).aspx.
This file covers the subset of the MIDI protocol needed to manage input and output devices
and send and receive Note On/Off, Control Change, Pitch Bend and Program Change messages.
Other portions of the MIDI protocol (such as sysex events) are supported in the Win32 API
but are not wrapped here.
Some of the C functions are not typesafe when wrapped, so those wrappers are made private
and typesafe variants are provided.
</member>
<member name="F:Midi.Win32API.MAXPNAMELEN">
<summary>
Max length of a manufacturer name in the Win32 API.
</summary>
</member>
<member name="M:Midi.Win32API.midiOutGetNumDevs">
<summary>
Returns the number of MIDI output devices on this system.
</summary>
Win32 docs: http://msdn.microsoft.com/en-us/library/ms711627(VS.85).aspx
</member>
<member name="M:Midi.Win32API.midiOutGetDevCaps(System.UIntPtr,Midi.Win32API.MIDIOUTCAPS@)">
<summary>
Fills in the capabilities struct for a specific output device.
</summary>
NOTE: This is adapted from the original Win32 function in order to make it typesafe.
Win32 docs: http://msdn.microsoft.com/en-us/library/ms711621(VS.85).aspx
</member>
<member name="M:Midi.Win32API.midiOutOpen(Midi.Win32API.HMIDIOUT@,System.UIntPtr,Midi.Win32API.MidiOutProc,System.UIntPtr)">
<summary>
Opens a MIDI output device.
</summary>
NOTE: This is adapted from the original Win32 function in order to make it typesafe.
Win32 docs: http://msdn.microsoft.com/en-us/library/ms711632(VS.85).aspx
</member>
<member name="M:Midi.Win32API.midiOutReset(Midi.Win32API.HMIDIOUT)">
<summary>
Turns off all notes and sustains on a MIDI output device.
</summary>
Win32 docs: http://msdn.microsoft.com/en-us/library/dd798479(VS.85).aspx
</member>
<member name="M:Midi.Win32API.midiOutClose(Midi.Win32API.HMIDIOUT)">
<summary>
Closes a MIDI output device.
</summary>
Win32 docs: http://msdn.microsoft.com/en-us/library/ms711620(VS.85).aspx
</member>
<member name="M:Midi.Win32API.midiOutShortMsg(Midi.Win32API.HMIDIOUT,System.UInt32)">
<summary>
Sends a short MIDI message (anything but sysex or stream).
</summary>
Win32 docs: http://msdn.microsoft.com/en-us/library/ms711640(VS.85).aspx
</member>
<member name="M:Midi.Win32API.midiOutGetErrorText(Midi.Win32API.MMRESULT,System.Text.StringBuilder)">
<summary>
Gets the error text for a return code related to an output device.
</summary>
NOTE: This is adapted from the original Win32 function in order to make it typesafe.
Win32 docs: http://msdn.microsoft.com/en-us/library/ms711622(VS.85).aspx
</member>
<member name="M:Midi.Win32API.midiInGetNumDevs">
<summary>
Returns the number of MIDI input devices on this system.
</summary>
Win32 docs: http://msdn.microsoft.com/en-us/library/ms711608(VS.85).aspx
</member>
<member name="M:Midi.Win32API.midiInGetDevCaps(System.UIntPtr,Midi.Win32API.MIDIINCAPS@)">
<summary>
Fills in the capabilities struct for a specific input device.
</summary>
NOTE: This is adapted from the original Win32 function in order to make it typesafe.
Win32 docs: http://msdn.microsoft.com/en-us/library/ms711604(VS.85).aspx
</member>
<member name="M:Midi.Win32API.midiInOpen(Midi.Win32API.HMIDIIN@,System.UIntPtr,Midi.Win32API.MidiInProc,System.UIntPtr)">
<summary>
Opens a MIDI input device.
</summary>
NOTE: This is adapted from the original Win32 function in order to make it typesafe.
Win32 docs: http://msdn.microsoft.com/en-us/library/ms711610(VS.85).aspx
</member>
<member name="M:Midi.Win32API.midiInStart(Midi.Win32API.HMIDIIN)">
<summary>
Starts input on a MIDI input device.
</summary>
Win32 docs: http://msdn.microsoft.com/en-us/library/ms711614(VS.85).aspx
</member>
<member name="M:Midi.Win32API.midiInStop(Midi.Win32API.HMIDIIN)">
<summary>
Stops input on a MIDI input device.
</summary>
Win32 docs: http://msdn.microsoft.com/en-us/library/ms711615(VS.85).aspx
</member>
<member name="M:Midi.Win32API.midiInReset(Midi.Win32API.HMIDIIN)">
<summary>
Resets input on a MIDI input device.
</summary>
Win32 docs: http://msdn.microsoft.com/en-us/library/ms711613(VS.85).aspx
</member>
<member name="M:Midi.Win32API.midiInClose(Midi.Win32API.HMIDIIN)">
<summary>
Closes a MIDI input device.
</summary>
Win32 docs: http://msdn.microsoft.com/en-us/library/ms711602(VS.85).aspx
</member>
<member name="M:Midi.Win32API.midiInGetErrorText(Midi.Win32API.MMRESULT,System.Text.StringBuilder)">
<summary>
Gets the error text for a return code related to an input device.
</summary>
NOTE: This is adapted from the original Win32 function in order to make it typesafe.
Win32 docs: http://msdn.microsoft.com/en-us/library/ms711605(VS.85).aspx
</member>
<member name="T:Midi.Win32API.MMRESULT">
<summary>
Status type returned from most functions in the Win32 API.
</summary>
</member>
<member name="T:Midi.Win32API.MidiOpenFlags">
<summary>
Flags passed to midiInOpen() and midiOutOpen().
</summary>
</member>
<member name="T:Midi.Win32API.MidiDeviceType">
<summary>
Values for wTechnology field of MIDIOUTCAPS structure.
</summary>
</member>
<member name="T:Midi.Win32API.MidiExtraFeatures">
<summary>
Flags for dwSupport field of MIDIOUTCAPS structure.
</summary>
</member>
<member name="T:Midi.Win32API.MidiOutMessage">
<summary>
"Midi Out Messages", passed to wMsg param of MidiOutProc.
</summary>
</member>
<member name="T:Midi.Win32API.MidiInMessage">
<summary>
"Midi In Messages", passed to wMsg param of MidiInProc.
</summary>
</member>
<member name="T:Midi.Win32API.HMIDIOUT">
<summary>
Win32 handle for a MIDI output device.
</summary>
</member>
<member name="T:Midi.Win32API.HMIDIIN">
<summary>
Win32 handle for a MIDI input device.
</summary>
</member>
<member name="T:Midi.Win32API.MIDIOUTCAPS">
<summary>
Struct representing the capabilities of an output device.
</summary>
Win32 docs: http://msdn.microsoft.com/en-us/library/ms711619(VS.85).aspx
</member>
<member name="T:Midi.Win32API.MIDIINCAPS">
<summary>
Struct representing the capabilities of an input device.
</summary>
Win32 docs: http://msdn.microsoft.com/en-us/library/ms711596(VS.85).aspx
</member>
<member name="T:Midi.Win32API.MidiOutProc">
<summary>
Callback invoked when a MIDI output device is opened, closed, or finished with a buffer.
</summary>
Win32 docs: http://msdn.microsoft.com/en-us/library/ms711637(VS.85).aspx
</member>
<member name="T:Midi.Win32API.MidiInProc">
<summary>
Callback invoked when a MIDI event is received from an input device.
</summary>
Win32 docs: http://msdn.microsoft.com/en-us/library/ms711612(VS.85).aspx
</member>
<member name="T:Midi.Interval">
<summary>
Interval measuring the relationship between pitches.
</summary>
<remarks>
<para>This enum is simply for making interval operations more explicit. When adding to or
subtracting from the <see cref="T:Midi.Pitch"/> enum, one can either use ints...</para>
<code>Pitch p = Pitch.C4 + 5;</code>
<para>...or use the Interval enum, cast to int...</para>
<code>Pitch p = Pitch.C4 + (int)Interval.PerfectFourth;</code>
<para>These two examples are equivalent. The benefit of the latter is simply that it makes
the intention more explicit.</para>
<para>This enum has extension methods, such as <see cref="M:Midi.IntervalExtensionMethods.Name(Midi.Interval)"/>,
defined in <see cref="T:Midi.IntervalExtensionMethods"/>.</para>
</remarks>
<seealso cref="T:Midi.Note"/>
</member>
<member name="F:Midi.Interval.Unison">
<summary>Unison interval, 0 semitones</summary>
</member>
<member name="F:Midi.Interval.Semitone">
<summary>Semitone interval, 1 semitone</summary>
</member>
<member name="F:Midi.Interval.WholeTone">
<summary>Whole Tone interval, 2 semitones</summary>
</member>
<member name="F:Midi.Interval.MinorThird">
<summary>Minor Third interval, 3 semitones</summary>
</member>
<member name="F:Midi.Interval.MajorThird">
<summary>Major Third interval, 4 semitones</summary>
</member>
<member name="F:Midi.Interval.PerfectFourth">
<summary>Perfect Fourth interval, 5 semitones</summary>
</member>
<member name="F:Midi.Interval.Tritone">
<summary>Tritone interval, 6 semitones</summary>
</member>
<member name="F:Midi.Interval.PerfectFifth">
<summary>Perfect Fifth interval, 7 semitones</summary>
</member>
<member name="F:Midi.Interval.MinorSixth">
<summary>Minor Sixth interval, 8 semitones</summary>
</member>
<member name="F:Midi.Interval.MajorSixth">
<summary>Major Sixth interval, 9 semitones</summary>
</member>
<member name="F:Midi.Interval.MinorSeventh">
<summary>Minor seventh interval, 10 semitones</summary>
</member>
<member name="F:Midi.Interval.MajorSeventh">
<summary>Major Seventh interval, 11 semitones</summary>
</member>
<member name="F:Midi.Interval.Octave">
<summary>Octave interval, 12 semitones</summary>
</member>
<member name="T:Midi.IntervalExtensionMethods">
<summary>
Extension methods for the Interval enum.
</summary>
</member>
<member name="F:Midi.IntervalExtensionMethods.IntervalNames">
<summary>
Table of interval names.
</summary>
</member>
<member name="M:Midi.IntervalExtensionMethods.Name(Midi.Interval)">
<summary>
Returns the human-readable name of an interval.
</summary>
<param name="interval">The interval.</param>
<returns>The human-readable name. If the interval is less than an octave, it gives
the standard term (eg, "Major third"). If the interval is more than an octave, it
gives the number of semitones in the interval.</returns>
</member>
<member name="T:Midi.InputDevice">
<summary>
A MIDI input device.
</summary>
<remarks>
<para>Each instance of this class describes a MIDI input device installed on the system.
You cannot create your own instances, but instead must go through the
<see cref="P:Midi.InputDevice.InstalledDevices"/> property to find which devices are available. You may wish
to examine the <see cref="P:Midi.DeviceBase.Name"/> property of each one and present the user with
a choice of which device(s) to use.</para>
<para>Open an input device with <see cref="M:Midi.InputDevice.Open"/> and close it with <see cref="M:Midi.InputDevice.Close"/>.
While it is open, you may arrange to start receiving messages with
<see cref="M:Midi.InputDevice.StartReceiving(Midi.Clock)"/> and then stop receiving them with <see cref="M:Midi.InputDevice.StopReceiving"/>.
An input device can only receive messages when it is both open and started.</para>
<para>Incoming messages are routed to the corresponding events, such as <see cref="E:Midi.InputDevice.NoteOn"/>
and <see cref="E:Midi.InputDevice.ProgramChange"/>. The event handlers are invoked on a background thread
which is started in <see cref="M:Midi.InputDevice.StartReceiving(Midi.Clock)"/> and stopped in <see cref="M:Midi.InputDevice.StopReceiving"/>.
</para>
<para>As each message is received, it is assigned a timestamp in one of two ways. If
<see cref="M:Midi.InputDevice.StartReceiving(Midi.Clock)"/> is called with a <see cref="T:Midi.Clock"/>, then each message is
assigned a time by querying the clock's <see cref="P:Midi.Clock.Time"/> property. If
<see cref="M:Midi.InputDevice.StartReceiving(Midi.Clock)"/> is called with null, then each message is assigned a time
based on the number of seconds since <see cref="M:Midi.InputDevice.StartReceiving(Midi.Clock)"/> was called.</para>
</remarks>
<threadsafety static="true" instance="true"/>
<seealso cref="T:Midi.Clock"/>
<seealso cref="T:Midi.InputDevice"/>
</member>
<member name="M:Midi.InputDevice.RemoveAllEventHandlers">
<summary>
Removes all event handlers from the input events on this device.
</summary>
</member>
<member name="M:Midi.InputDevice.Open">
<summary>
Opens this input device.
</summary>
<exception cref="T:System.InvalidOperationException">The device is already open.</exception>
<exception cref="T:Midi.DeviceException">The device cannot be opened.</exception>
<remarks>Note that Open() establishes a connection to the device, but no messages will
be received until <see cref="M:Midi.InputDevice.StartReceiving(Midi.Clock)"/> is called.</remarks>
</member>
<member name="M:Midi.InputDevice.Close">
<summary>
Closes this input device.
</summary>
<exception cref="T:System.InvalidOperationException">The device is not open or is still
receiving.</exception>
<exception cref="T:Midi.DeviceException">The device cannot be closed.</exception>
</member>
<member name="M:Midi.InputDevice.StartReceiving(Midi.Clock)">
<summary>
Starts this input device receiving messages.
</summary>
<param name="clock">If non-null, the clock's <see cref="P:Midi.Clock.Time"/> property will
be used to assign a timestamp to each incoming message. If null, timestamps will be in
seconds since StartReceiving() was called.</param>
<exception cref="T:System.InvalidOperationException">The device is not open or is already
receiving.
</exception>
<exception cref="T:Midi.DeviceException">The device cannot start receiving.</exception>
<remarks>
<para>This method launches a background thread to listen for input events, and as events
are received, the event handlers are invoked on that background thread. Event handlers
should be written to work from a background thread. (For example, if they want to
update the GUI, they may need to BeginInvoke to arrange for GUI updates to happen on
the correct thread.)</para>
<para>The background thread which is created by this method is joined (shut down) in
<see cref="M:Midi.InputDevice.StopReceiving"/>.</para>
</remarks>
</member>
<member name="M:Midi.InputDevice.StopReceiving">
<summary>
Stops this input device from receiving messages.
</summary>
<remarks>
<para>This method waits for all in-progress input event handlers to finish, and then
joins (shuts down) the background thread that was created in
<see cref="M:Midi.InputDevice.StartReceiving(Midi.Clock)"/>. Thus, when this function returns you can be sure that no
more event handlers will be invoked.</para>
<para>It is illegal to call this method from an input event handler (ie, from the
background thread), and doing so throws an exception. If an event handler really needs
to call this method, consider using BeginInvoke to schedule it on another thread.</para>
</remarks>
<exception cref="T:System.InvalidOperationException">The device is not open; is not receiving;
or called from within an event handler (ie, from the background thread).</exception>
<exception cref="T:Midi.DeviceException">The device cannot start receiving.</exception>
</member>
<member name="M:Midi.InputDevice.CheckReturnCode(Midi.Win32API.MMRESULT)">
<summary>
Makes sure rc is MidiWin32Wrapper.MMSYSERR_NOERROR. If not, throws an exception with an
appropriate error message.
</summary>
<param name="rc"></param>
</member>
<member name="M:Midi.InputDevice.CheckOpen">
<summary>
Throws a MidiDeviceException if this device is not open.
</summary>
</member>
<member name="M:Midi.InputDevice.CheckNotOpen">
<summary>
Throws a MidiDeviceException if this device is open.
</summary>
</member>
<member name="M:Midi.InputDevice.CheckReceiving">
<summary>
Throws a MidiDeviceException if this device is not receiving.
</summary>
</member>
<member name="M:Midi.InputDevice.CheckNotReceiving">
<summary>
Throws a MidiDeviceException if this device is receiving.
</summary>
</member>
<member name="M:Midi.InputDevice.#ctor(System.UIntPtr,Midi.Win32API.MIDIINCAPS)">
<summary>
Private Constructor, only called by the getter for the InstalledDevices property.
</summary>
<param name="deviceId">Position of this device in the list of all devices.</param>
<param name="caps">Win32 Struct with device metadata</param>
</member>
<member name="M:Midi.InputDevice.MakeDeviceList">
<summary>
Private method for constructing the array of MidiInputDevices by calling the Win32 api.
</summary>
<returns></returns>
</member>
<member name="M:Midi.InputDevice.InputCallback(Midi.Win32API.HMIDIIN,Midi.Win32API.MidiInMessage,System.UIntPtr,System.UIntPtr,System.UIntPtr)">
<summary>
The input callback for midiOutOpen.
</summary>
</member>
<member name="F:Midi.InputDevice.isInsideInputHandler">
<summary>
Thread-local, set to true when called by an input handler, false in all other threads.
</summary>
</member>
<member name="E:Midi.InputDevice.NoteOn">
<summary>
Event called when an input device receives a Note On message.
</summary>
</member>
<member name="E:Midi.InputDevice.NoteOff">
<summary>
Event called when an input device receives a Note Off message.
</summary>
</member>
<member name="E:Midi.InputDevice.ControlChange">
<summary>
Event called when an input device receives a Control Change message.
</summary>
</member>
<member name="E:Midi.InputDevice.ProgramChange">
<summary>
Event called when an input device receives a Program Change message.
</summary>
</member>
<member name="E:Midi.InputDevice.PitchBend">
<summary>
Event called when an input device receives a Pitch Bend message.
</summary>
</member>
<member name="P:Midi.InputDevice.InstalledDevices">
<summary>
List of input devices installed on this system.
</summary>
</member>
<member name="P:Midi.InputDevice.IsOpen">
<summary>
True if this device has been successfully opened.
</summary>
</member>
<member name="P:Midi.InputDevice.IsReceiving">
<summary>
True if this device is receiving messages.
</summary>
</member>
<member name="T:Midi.InputDevice.NoteOnHandler">
<summary>
Delegate called when an input device receives a Note On message.
</summary>
</member>
<member name="T:Midi.InputDevice.NoteOffHandler">
<summary>
Delegate called when an input device receives a Note Off message.
</summary>
</member>
<member name="T:Midi.InputDevice.ControlChangeHandler">
<summary>
Delegate called when an input device receives a Control Change message.
</summary>
</member>
<member name="T:Midi.InputDevice.ProgramChangeHandler">
<summary>
Delegate called when an input device receives a Program Change message.
</summary>
</member>
<member name="T:Midi.InputDevice.PitchBendHandler">
<summary>
Delegate called when an input device receives a Pitch Bend message.
</summary>
</member>
<member name="T:Midi.Channel">
<summary>
A MIDI Channel.
</summary>
<remarks>
<para>Each MIDI device has 16 independent channels. Channels are named starting at 1, but
are encoded programmatically starting at 0.</para>
<para>All of the channels are general-purpose except for Channel10, which is the
dedicated percussion channel. Any notes sent to that channel will play
<see cref="T:Midi.Percussion">percussion notes</see>, regardless of any
<see cref="M:Midi.OutputDevice.SendProgramChange(Midi.Channel,Midi.Instrument)">Program Change</see> messages sent on that
channel.</para>
<para>This enum has extension methods, such as <see cref="M:Midi.ChannelExtensionMethods.Name(Midi.Channel)"/>
and <see cref="M:Midi.ChannelExtensionMethods.IsValid(Midi.Channel)"/>, defined in
<see cref="T:Midi.ChannelExtensionMethods"/>. </para>
</remarks>
</member>
<member name="F:Midi.Channel.Channel1">
<summary> MIDI Channel 1. </summary>
</member>
<member name="F:Midi.Channel.Channel2">
<summary> MIDI Channel 2. </summary>
</member>
<member name="F:Midi.Channel.Channel3">
<summary> MIDI Channel 3. </summary>
</member>
<member name="F:Midi.Channel.Channel4">
<summary> MIDI Channel 4. </summary>
</member>
<member name="F:Midi.Channel.Channel5">
<summary> MIDI Channel 5. </summary>
</member>
<member name="F:Midi.Channel.Channel6">
<summary> MIDI Channel 6. </summary>
</member>
<member name="F:Midi.Channel.Channel7">
<summary> MIDI Channel 7. </summary>
</member>
<member name="F:Midi.Channel.Channel8">
<summary> MIDI Channel 8. </summary>
</member>
<member name="F:Midi.Channel.Channel9">
<summary> MIDI Channel 9. </summary>
</member>
<member name="F:Midi.Channel.Channel10">
<summary> MIDI Channel 10, the dedicated percussion channel. </summary>
</member>
<member name="F:Midi.Channel.Channel11">
<summary> MIDI Channel 11. </summary>
</member>
<member name="F:Midi.Channel.Channel12">
<summary> MIDI Channel 12. </summary>
</member>
<member name="F:Midi.Channel.Channel13">
<summary> MIDI Channel 13. </summary>
</member>
<member name="F:Midi.Channel.Channel14">
<summary> MIDI Channel 14. </summary>
</member>
<member name="F:Midi.Channel.Channel15">
<summary> MIDI Channel 15. </summary>
</member>
<member name="F:Midi.Channel.Channel16">
<summary> MIDI Channel 16. </summary>
</member>
<member name="T:Midi.ChannelExtensionMethods">
<summary>
Extension methods for the Channel enum.
</summary>
</member>
<member name="M:Midi.ChannelExtensionMethods.IsValid(Midi.Channel)">
<summary>
Returns true if the specified channel is valid.
</summary>
<param name="channel">The channel to test.</param>
</member>
<member name="M:Midi.ChannelExtensionMethods.Validate(Midi.Channel)">
<summary>
Throws an exception if channel is not valid.
</summary>
<param name="channel">The channel to validate.</param>
<exception cref="T:System.ArgumentOutOfRangeException">The channel is out-of-range.</exception>
</member>
<member name="F:Midi.ChannelExtensionMethods.ChannelNames">
<summary>
Table of channel names.
</summary>
</member>
<member name="M:Midi.ChannelExtensionMethods.Name(Midi.Channel)">
<summary>
Returns the human-readable name of a MIDI channel.
</summary>
<param name="channel">The channel.</param>
<exception cref="T:System.ArgumentOutOfRangeException">The channel is out-of-range.</exception>
</member>
<member name="T:Midi.Clock">
<summary>
A clock for scheduling MIDI messages in a rate-adjustable, pausable timeline.
</summary>
<remarks>
<para>Clock is used for scheduling MIDI messages. Though you can always send messages
synchronously with the various <see cref="T:Midi.OutputDevice"/>.Send* methods, doing so
requires your code to be "ready" at the precise moment each message needs to
be sent. In most cases, and especially in interactive programs, it's more convenient
to describe messages that <i>will</i> be sent at specified points in the future, and then
rely on a scheduler to make it happen. Clock is such a scheduler.</para>
<h3>Basic usage</h3>
<para> In the simplest case, Clock can be used to schedule a sequence of messages which is
known in its entirety ahead of time. For example, this code snippet schedules two notes to
play one after the other:</para>
<code>
Clock clock(120); // beatsPerMinute=120
OutputDevice outputDevice = ...;
clock.Schedule(new NoteOnMessage(outputDevice, Channel.Channel1, Note.E4, 80, 0));
clock.Schedule(new NoteOffMessage(outputDevice, Channel.Channel1, Note.E4, 80, 1));
clock.Schedule(new NoteOnMessage(outputDevice, Channel.Channel1, Note.D4, 80, 1));
clock.Schedule(new NoteOffMessage(outputDevice, Channel.Channel1, Note.D4, 80, 2));
</code>
<para>At this point, four messages have been scheduled, but they haven't been sent because
the clock has not started. We can start the clock with <see cref="M:Midi.Clock.Start"/>, pause it with
<see cref="M:Midi.Clock.Stop"/>, and reset it with <see cref="M:Midi.Clock.Reset"/>. We can change the
beats-per-minute at any time, even as the sequence is playing. And the playing happens
in a background thread, so your client code can focus on arranging the notes and controlling
the clock.</para>
<para>You can even schedule new notes as the clock is playing. Generally you should
schedule messages for times in the future; scheduling a message with a time in the past
simply causes it to play immediately, which is probably not what you wanted.</para>
<h3>NoteOnOffMessage and Self-Propagating Messages</h3>
<para>In the above example, we wanted to play two notes but had to schedule four messages.
This case is so common that we provide a convenience class, <see cref="T:Midi.NoteOnOffMessage"/>,
which encapsulates a Note On message and its corresponding Note Off message in a single
unit. We could rewrite the above example as follows:</para>
<code>
Clock clock(120); // beatsPerMinute=120
OutputDevice outputDevice = ...;
clock.Schedule(new NoteOnOffMessage(outputDevice, Channel.Channel1, Note.E4, 80, 0, 1));
clock.Schedule(new NoteOnOffMessage(outputDevice, Channel.Channel1, Note.D4, 80, 1, 1));
</code>
<para>This works because each NoteOnOffMessage, when it is actually sent, does two things:
it sends the Note On message to the output device, and <i>also</i> schedules the
correponding Note Off message for the appropriate time in the future. This is an example
of a <i>self-propagating message</i>: a message which, when triggered, schedules additional
events for the future.</para>
<para>You can design your own self-propagating messages by subclassing from
<see cref="T:Midi.Message"/>. For example, you could make a self-propagating MetronomeMessage
which keeps a steady beat by always scheduling the <i>next</i> MetronomeMessage when it
plays the current beat. However, subclassing can be tedious, and it is usually preferable
to use <see cref="T:Midi.CallbackMessage"/> to call-out to your own code instead.</para>
</remarks>
<threadsafety static="true" instance="true"/>
</member>
<member name="M:Midi.Clock.#ctor(System.Single)">
<summary>
Constructs a midi clock with a given beats-per-minute.
</summary>
<param name="beatsPerMinute">The initial beats-per-minute, which can be changed later.
</param>
<remarks>
<para>When constructed, the clock is not running, and so <see cref="P:Midi.Clock.Time"/> will
return zero. Call <see cref="M:Midi.Clock.Start"/> when you are ready for the clock to start
progressing (and scheduled messages to actually trigger).
</para>
</remarks>
<exception cref="T:System.ArgumentOutOfRangeException">beatsPerMinute is non-positive</exception>
</member>
<member name="M:Midi.Clock.Start">
<summary>
Starts or resumes the clock.
</summary>
<remarks>
<para>This method causes the clock to start progressing at the rate given in the
<see cref="P:Midi.Clock.BeatsPerMinute"/> property. It may only be called when the clock is
not yet rnuning.</para>
<para>If this is the first time Start is called,
the clock starts at time zero and progresses from there. If the clock was previously
started, stopped, and not reset, then Start effectively "unpauses" the clock, picking up
at the left-off time, and resuming scheduling of any as-yet-unsent messages.</para>
<para>This method creates a new thread which runs in the background and sends
messages at the appropriate times. All
<see cref="M:Midi.Message.SendNow">Message.SendNow</see> methods and
<see cref="T:Midi.CallbackMessage"/>s will be called in that thread.</para>
<para>The scheduler thread is joined (shut down) in <see cref="M:Midi.Clock.Stop"/>.</para>
</remarks>
<exception cref="T:System.InvalidOperationException">Clock is already running.</exception>
<seealso cref="M:Midi.Clock.Stop"/>
<seealso cref="M:Midi.Clock.Reset"/>
</member>
<member name="M:Midi.Clock.Stop">
<summary>
Stops the clock (but does not reset its time or discard pending events).
</summary>
<remarks>
<para>This method stops the progression of the clock. It may only be called when
the clock is running.</para>
<para>Any scheduled but as-yet-unsent messages remain in the queue. A consecutive call
to <see cref="M:Midi.Clock.Start"/> can re-start the progress of the clock, or <see cref="M:Midi.Clock.Reset"/>
can discard pending messages and reset the clock to zero.</para>
<para>This method waits for any in-progress messages to be processed and joins
(shuts down) the scheduler thread before returning, so when it returns you can be sure
that no more messages will be sent or callbacks invoked.</para>
<para>It is illegal to call Stop from the scheduler thread (ie, from any
<see cref="M:Midi.Message.SendNow">Message.SendNow</see> method or
<see cref="T:Midi.CallbackMessage"/>. If a callback really needs to stop the clock,
consider using BeginInvoke to arrange for it to happen in another thread.</para>
</remarks>
<exception cref="T:System.InvalidOperationException">Clock is not running or Stop was invoked
from the scheduler thread.</exception>
<seealso cref="M:Midi.Clock.Start"/>
<seealso cref="M:Midi.Clock.Reset"/>
</member>
<member name="M:Midi.Clock.Reset">
<summary>
Resets the clock to zero and discards pending messages.
</summary>
<remarks>
<para>This method resets the clock to zero and discards any scheduled but
as-yet-unsent messages. It may only be called when the clock is not running.</para>
</remarks>
<exception cref="T:System.InvalidOperationException">Clock is running.</exception>
<seealso cref="M:Midi.Clock.Start"/>
<seealso cref="M:Midi.Clock.Stop"/>
</member>
<member name="M:Midi.Clock.Schedule(Midi.Message)">
<summary>
Schedules a single message based on its beatTime.
</summary>
<param name="message">The message to schedule.</param>
<remarks>
<para>This method schedules a message to be sent at the time indicated in the message's
<see cref="P:Midi.Message.Time"/> property. It may be called at any time, whether
the clock is running or not. The message will not be sent until the clock progresses
to the specified time. (If the clock is never started, or is paused before that time
and not re-started, then the message will never be sent.)</para>
<para>If a message is scheduled for a time that has already passed, then the scheduler
will send the message at the first opportunity.</para>
</remarks>
</member>
<member name="M:Midi.Clock.Schedule(System.Collections.Generic.List{Midi.Message},System.Single)">
<summary>
Schedules a collection of messages, applying an optional time delta to the scheduled
beatTime.
</summary>
<param name="messages">The message to send</param>
<param name="beatTimeDelta">The delta to apply (or zero).</param>
</member>
<member name="M:Midi.Clock.MillisecondsUntil(System.Single)">
<summary>
Returns the number of milliseconds from now until the specified beat time.
</summary>
<param name="beatTime">The beat time.</param>
<returns>The positive number of milliseconds, or 0 if beatTime is in the past.</returns>
</member>
<member name="M:Midi.Clock.ThreadRun">
<summary>
Worker thread function.
</summary>
</member>
<member name="F:Midi.Clock.isSchedulerThread">
<summary>
Thread-local, set to true in the scheduler thread, false in all other threads.
</summary>
</member>
<member name="P:Midi.Clock.Time">
<summary>
This clock's current time in beats.
</summary>
<remarks>
<para>Normally, this method polls the clock's current time, and thus changes from
moment to moment as long as the clock is running. However, when called from the
scheduler thread (that is, from a <see cref="M:Midi.Message.SendNow">Message.SendNow</see>
method or a <see cref="T:Midi.CallbackMessage"/>), it returns the precise time at which the
message was scheduled.</para>
<para>For example, suppose a callback was scheduled for time T, and the scheduler
managed to call that callback at time T+delta. In the callback, Time will
return T for the duration of the callback. In any other thread, Time would
return approximately T+delta.</para>
</remarks>
</member>
<member name="P:Midi.Clock.BeatsPerMinute">
<summary>
Beats per minute property.
</summary>
<remarks>
<para>Setting this property changes the rate at which the clock progresses. If the
clock is currently running, the new rate is effectively immediately.</para>
</remarks>
</member>
<member name="P:Midi.Clock.IsRunning">
<summary>
Returns true if this clock is currently running.
</summary>
</member>
</members>
</doc>