\subsection{Midi-File Datatypes} \begin{verbatim}
> module Haskore.MidiFile(
>	 MidiFile(..), Division(..), Track, MFType, MEvent(..), ElapsedTime,
>	 MPitch, Velocity, ControlNum, PBRange, ProgNum, Pressure,
>	 MidiChannel, ControlVal,
>	 MidiEvent(..),
>	 MTempo, SMPTEHours, SMPTEMins, SMPTESecs, SMPTEFrames, SMPTEBits,
>	 MetaEvent(..),
>	 KeyName(..), Mode(..),
>        defST, defDurT
>	 ) where
> import Data.Ix
\end{verbatim} \begin{verbatim} The datatypes for Midi Files and Midi Events ------------------------------------------------------------------------
> data MidiFile = MidiFile MFType Division [Track] deriving (Show, Eq)
>
> data Division = Ticks Int | SMPTE Int Int
>      deriving (Show,Eq)
> 
> type Track  = [MEvent]
> type MFType = Int
> 
> data MEvent = MidiEvent ElapsedTime MidiEvent
>             | MetaEvent ElapsedTime MetaEvent
>             | NoEvent
>      deriving (Show,Eq)
> 
> type ElapsedTime  = Int
> 
> -- Midi Events
> 
> type MPitch      = Int
> type Velocity    = Int
> type ControlNum  = Int
> type PBRange     = Int
> type ProgNum     = Int
> type Pressure    = Int
> type MidiChannel = Int
> type ControlVal  = Int
> 
> data MidiEvent = NoteOff    MidiChannel MPitch Velocity
>                | NoteOn     MidiChannel MPitch Velocity
>                | PolyAfter  MidiChannel MPitch Pressure
>                | ProgChange MidiChannel ProgNum
>                | Control    MidiChannel ControlNum ControlVal
>                | PitchBend  MidiChannel PBRange
>                | MonoAfter  MidiChannel Pressure
>      deriving (Show, Eq)
> 
> -- Meta Events
> 
> type MTempo      = Int
> type SMPTEHours  = Int
> type SMPTEMins   = Int
> type SMPTESecs   = Int
> type SMPTEFrames = Int
> type SMPTEBits   = Int
> 
> data MetaEvent = SequenceNum Int
>                | TextEvent String
>                | Copyright String
>                | TrackName String
>                | InstrName String
>                | Lyric String
>                | Marker String
>                | CuePoint String
>                | MIDIPrefix MidiChannel
>                | EndOfTrack
>                | SetTempo MTempo
>                | SMPTEOffset SMPTEHours SMPTEMins SMPTESecs SMPTEFrames SMPTEBits
>                | TimeSig Int Int Int Int
>                | KeySig KeyName Mode
>                | SequencerSpecific [Int]
>                | Unknown String
>      deriving (Show, Eq)
> 
\end{verbatim} The following enumerated type lists all the keys in order of their key signatures from flats to sharps. (Cf = 7 flats, Gf = 6 flats ... F = 1 flat, C = 0 flats/sharps, G = 1 sharp, ... Cs = 7 sharps.) Useful for transposition. \begin{verbatim}
> data KeyName = KeyCf | KeyGf | KeyDf | KeyAf | KeyEf | KeyBf | KeyF
>              | KeyC | KeyG | KeyD | KeyA | KeyE | KeyB | KeyFs | KeyCs
>              deriving (Eq, Ord, Ix, Enum, Show)
\end{verbatim} The Key Signature specifies a mode, either major or minor. \begin{verbatim}
> data Mode = Major | Minor
>             deriving (Show, Eq)
\end{verbatim} Default duration of a whole note, in seconds; and the default SetTempo value, in microseconds per quarter note. Both express the default of 120 beats per minute. \begin{verbatim}
> defDurT = 2 :: Float
> defST = truncate (1000000 / defDurT) :: Int
\end{verbatim}