zmidi-core-0.6.0: src/ZMidi/Core/Canonical.hs
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# OPTIONS -Wall #-}
--------------------------------------------------------------------------------
-- |
-- Module : ZMidi.Core.Canonical
-- Copyright : (c) Stephen Tetley 2012
-- License : BSD3
--
-- Maintainer : Stephen Tetley <stephen.tetley@gmail.com>
-- Stability : unstable
-- Portability : GHC (at least generalized newtype deriving)
--
-- Convert a MidiFile into \"canonical\" form - i.e. expand
-- any use of Running Status and translate Running Status high,
-- NoteOn channel velocity 0 events to NoteOff events.
--
--------------------------------------------------------------------------------
module ZMidi.Core.Canonical
(
canonical
) where
import ZMidi.Core.Datatypes
-- | Convert an MidiFile into \"canonical\" form where any
-- abbreviation introduced by Running Status is expanded.
--
-- Note - even with Running Status on the syntax tree is almost
-- canonical (some expansion takes place in the Parser), so this
-- translation is quite simplistic.
--
canonical :: MidiFile -> MidiFile
canonical (MidiFile hdr trks) = MidiFile hdr (map transTrack trks)
transTrack :: MidiTrack -> MidiTrack
transTrack (MidiTrack msgs) = MidiTrack $ map transMsg msgs
transMsg :: MidiMessage -> MidiMessage
transMsg (dt,e) = (dt, transEvent e)
transEvent :: MidiEvent -> MidiEvent
transEvent (VoiceEvent rs e) = VoiceEvent RS_OFF (transVoiceEvent rs e)
transEvent evt = evt
transVoiceEvent :: MidiRunningStatus -> MidiVoiceEvent -> MidiVoiceEvent
transVoiceEvent RS_ON (NoteOn ch pch 0) = NoteOff ch pch 0
transVoiceEvent _ evt = evt