midi- Handling of MIDI messages and files

Safe HaskellSafe-Infered



MIDI-File Datatype

Taken from Haskore.



data T Source

The datatypes for MIDI Files and MIDI Events


Cons Type Division [Track] 


data Type Source



empty :: TSource

An empty MIDI file. Tempo is set to one tick per quarter note.

explicitNoteOff :: T -> TSource

Convert all NoteOn p 0 to NoteOff p 64. The latter one is easier to process.

implicitNoteOff :: T -> TSource

Convert all NoteOff p 64 to NoteOn p 0. The latter one can be encoded more efficiently using the running status.

mergeTracks :: C time => Type -> [T time event] -> T time eventSource

Merge all tracks into a single track according to the MIDI file type.

secondsFromTicks :: Division -> T ElapsedTime T -> T Rational TSource

Process and remove all SetTempo events. The result is an event list where the times are measured in seconds.

showLines :: T -> StringSource

Show the T with one event per line, suited for comparing MIDIFiles with diff. Can this be replaced by showFile?

changeVelocity :: Double -> T -> TSource

A hack that changes the velocities by a rational factor.

resampleTime :: Double -> T -> TSource

Change the time base.

sortEvents :: T -> TSource

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.

progChangeBeforeSetTempo :: T -> TSource

Old versions of Haskore.Interface.MIDI.Write wrote ProgramChange and SetTempo once at the beginning of a file in that order. The current version supports multiple ProgramChanges in a track and thus a ProgramChange is set immediately before a note. Because of this a ProgramChange is now always after a SetTempo. For checking equivalence with old MIDI files we can switch this back.