module Music.Score.Import.Midi (
IsMidi(..),
fromMidi,
readMidi,
readMidiMaybe,
readMidiEither
) where
import Music.Pitch.Literal (IsPitch)
import Music.Score.Score
import Control.Applicative
import Control.Lens
import Codec.Midi hiding (Track)
import Music.Dynamics.Literal
import Music.Pitch.Literal
import Music.Score.Articulation
import Music.Score.Chord
import Music.Score.Combinators
import Music.Score.Dynamics
import Music.Score.Export.Common
import Music.Score.Ornaments
import Music.Score.Part
import Music.Score.Pitch
import Music.Score.Rhythm
import Music.Score.Score
import Music.Score.Ties
import Music.Score.Track
import Music.Score.Voice
import Music.Time
import qualified Codec.Midi as Midi
import qualified Data.List as List
import qualified Data.Map as Map
import qualified Music.Lilypond as Lilypond
import qualified Music.MusicXml.Simple as Xml
import qualified Text.Pretty as Pretty
import qualified Music.Pitch.Literal as Pitch
type IsMidi a = (
IsPitch a,
HasPart' a,
Enum (Part a),
Num (Pitch a),
HasTremolo a,
HasArticulation a,
Tiable a
)
fromMidi :: IsMidi a => Midi -> Score a
fromMidi = undefined
readMidi :: IsMidi a => FilePath -> IO (Score a)
readMidi path = fmap (either (\x -> error $ "Could not read MIDI file" ++ x) id) $ readMidiEither path
readMidiMaybe :: IsMidi a => FilePath -> IO (Maybe (Score a))
readMidiMaybe path = fmap (either (const Nothing) Just) $ readMidiEither path
readMidiEither :: IsMidi a => FilePath -> IO (Either String (Score a))
readMidiEither path = fmap (fmap fromMidi) $ importFile path