Taken from Haskore.
- data T = Cons Type Division [Track]
- data Division
- type Track = T ElapsedTime Event
- data Type
- type SchedEvent = (ElapsedTime, Event)
- data Event
- type ElapsedTime = Integer
- type Tempo = 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 Channel
- | EndOfTrack
- | SetTempo Tempo
- | SMPTEOffset SMPTEHours SMPTEMins SMPTESecs SMPTEFrames SMPTEBits
- | TimeSig Int Int Int Int
- | KeySig Key Mode
- | SequencerSpecific ByteString
- | Unknown Int ByteString
- maybeMIDIEvent :: Event -> Maybe (Channel, T)
- maybeMetaEvent :: Event -> Maybe MetaEvent
- data Key
- data Mode
- defltST :: Tempo
- defltDurT :: ElapsedTime
- empty :: T
- showLines :: T -> String
- changeVelocity :: Double -> T -> T
- getTracks :: T -> [Track]
- resampleTime :: Double -> T -> T
- showEvent :: Event -> ShowS
- showTime :: ElapsedTime -> ShowS
- sortEvents :: T -> T
- progChangeBeforeSetTempo :: T -> T
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.
The Key Signature specifies a mode, either major or minor.
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.
T with one event per line,
suited for comparing MIDIFiles with
Can this be replaced by
Sort MIDI note events lexicographically. This is to make MIDI files unique and robust against changes in the computation. In principle Performance.merge should handle this but due to rounding errors in Float the order of note events still depends on some internal issues. The sample rate of MIDI events should be coarse enough to assert unique results.
Old versions of Haskore.Interface.MIDI.Write
once at the beginning of a file in that order.
The current version supports multiple
ProgramChanges in a track and
ProgramChange is set immediately before a note.
Because of this a
ProgramChange is now always after a
For checking equivalence with old MIDI files we can switch this back.