=begin
= SMF モジュール

== クラス

* Sequence <format, division>

* 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 <..., num, val>

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

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

== Sequence

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

=== スーパークラス

Object

=== クラスメソッド

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

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

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

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

=== アクセサ

: format
: division

=== メソッド

: length
: size
  要素数を返します。

: ntrks
  要素数を返します。

  nil の要素は勘定しません。

: self << tr
  末尾に追加します。

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

: push(tr)
  末尾に追加します。

: pop
  末尾の要素を取り除きます。

: unshift(tr)
  先頭に追加します。

: shift
  先頭の要素を取り除きます。

: self[n]
  n 番目の要素を返します。

: self[n]=tr
  n 番目の要素を変更します。

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

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

: encode
  文字列に書きます。

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

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

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

== Track

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

=== スーパークラス

Object

=== クラスメソッド

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

=== メソッド

: length
: size
  要素数を返します。

: nevts
  要素数を返します。

  nil の要素は勘定しません。

: self << ev
  末尾に追加します。

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

: push(ev)
  末尾に追加します。

: pop
  末尾の要素を取り除きます。

: unshift(ev)
  先頭に追加します。

: shift
  先頭の要素を取り除きます。

: self[n]
  n 番目の要素を返します。

: self[n]=ev
  n 番目の要素を変更します。

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

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

== Event

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

=== スーパークラス

Object

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

Comparable

=== アクセサ

: offset

=end