=begin
= SMF モジュール

== クラス

* Sequence <format, division, tc=nil>

* Track

* Event <offset>
  * MIDIMessage
    * ChannelMessage <..., ch>
      * VoiceMessage
        * NoteOff <..., note, vel>
        * NoteOn <..., note, vel>
        * PolyphonicKeyPressure <..., note, val>
        * ControlChange <..., num, val>
        * ProgramChange <..., num>
        * ChannelPressure <..., val>
        * PitchBendChange <..., val>
      * ChannelModeMessage
        * AllSoundOff <..., ch>
	* ResetAllControllers <..., ch>
	* LocalControl <..., ch, val>
	* AllNotesOff <..., ch>
	* OmniOff <..., ch>
	* OmniOn <..., ch>
	* MonoMode <..., ch, val>
	* PolyMode <..., ch>

  * SystemMessage
    * ExclusiveMessage
      * ExclusiveF0 <..., data>
      * ExclusiveF7 <..., data>

  * Meta
    * SequenceNumber <..., num>
    * Text <..., text>
      * GeneralPurposeText (Text01)
      * CopyrightNotice (Text02)
      * TrackName (SequenceName, Text03)
      * InstrumentName (Text04)
      * Lyric (Display, Text05)
      * Marker (Text06)
      * CuePoint (Text07)
      * ProgramName (Text08)
      * DeviceName (Text09)
      * Text0A
      * Text0B
      * Text0C
      * Text0D
      * Text0E
      * Text0F
    * ChannelPrefix <..., ch>
    * MIDIPort <..., num> (PR-001 にない)
    * EndOfTrack
    * SetTempo <..., tempo>
    * SMPTEOffset <..., hr, mn, se, fr, ff, tc>
    * TimeSignature <..., nn, dd, cc, bb>
    * KeySignature <..., sf, mi>
    * SequencerSpecific <..., data>

== Sequence

シーケンスを表現するクラスです。シーケンスはトラックをもちます。

=== スーパークラス

Object

=== インクルードしているモジュール

Enumerable

=== クラスメソッド

: decode(str)
  文字列から読みこみます。

: read(io)
  IO から読みこみます。

: load(fn)
  ファイルから読みこみます。

  上記3つのメソッドは、ヴェロシティが零のときノートオンを
  ノートオフで置き換えられます。

: new([format=1[, division=96[,tc=nil]]])
  シーケンスオブジェクトを作成します。

=== アクセサ

: format
: division
: tc

=== メソッド

ほぼ Array と同じメソッドがつかえます。
それ以外のもの、注意が必要なものを以下で説明します。

: ntrks
  nitems と同じです。

: self >> tr
  要素を除きます。

: each{|tr| ...}
  要素について繰り返します。

  nil の要素は無視されます。

: join!
  トラックをひとつにします。
  EOT は、オフセットがもっとも大きなものが採用されます。

: encode
  文字列に書きます。

  もし、トラックに EOT がなければ、
  トラックの最後にデルタ零の EOT を追加します。

: write(io)
  IO に書きます。

: save(fn)
  ファイルに書きます。

== Track

トラックを表現するクラスです。トラックはイベントをもちます。

=== スーパークラス

Object

=== インクルードしているモジュール

Enumerable

=== クラスメソッド

: new
  トラックオブジェクトを作成します。

=== メソッド

ほぼ Array と同じメソッドがつかえます。
それ以外のもの、注意が必要なものを以下で説明します。

: nevts
  nitems と同じです。

: self >> ev
  要素を除きます。

: each{|ev| ...}
  要素について繰り返します。

  nil の要素は無視されます。また、イベントはソートされます (安定)。

== Event

イベントの抽象クラスです。

=== スーパークラス

Object

=== インクルードしているモジュール

Comparable

=== アクセサ

: offset

=end
