module AbcPlayer exposing (..) import Html exposing (..) import Html.Events exposing (onClick) import Http exposing (..) --import Task exposing (..) import List exposing (..) import Maybe exposing (..) import String exposing (..) import Result exposing (Result, mapError) import SoundFont.Ports exposing (..) import SoundFont.Types exposing (..) import Abc exposing (..) import Music.Notation exposing (..) import AbcPerformance exposing (..) import Melody exposing (..) import Notable exposing (..) import MidiNotes exposing (..) main = Html.program { init = ( init, Cmd.none ), update = update, view = view, subscriptions = \_ -> Sub.none } -- MODEL type alias Model = { fontsLoaded : Bool , performance : Result String Performance } init : Model init = { fontsLoaded = False , performance = Err "not started" } -- UPDATE type Msg = NoOp | RequestLoadFonts String | LoadFile String | FontsLoaded Bool | RawAbc (Result Error String) | Abc (Result String Performance) | Play update : Msg -> Model -> ( Model, Cmd Msg ) update msg model = case msg of NoOp -> ( model, Cmd.none ) RequestLoadFonts dir -> ( model , requestLoadPianoFonts dir ) LoadFile name -> ( model , loadAbc name ) FontsLoaded loaded -> ( { model | fontsLoaded = loaded } , Cmd.none ) RawAbc abc -> update (Abc (parseLoadedFile abc)) model Abc result -> ( { model | performance = result }, Cmd.none ) Play -> let notes = makeMIDINotes model.performance in ( model , requestPlayNoteSequence notes ) {- load an ABC file -} loadAbc : String -> Cmd Msg loadAbc url = Http.send RawAbc (getString url) parseLoadedFile : Result Error String -> Result String Performance parseLoadedFile s = case s of Ok text -> text |> parse |> melodyFromAbcResult |> mapError parseError |> toPerformance Err e -> Err (toString e) -- VIEW viewPerformanceResult : Result String Performance -> String viewPerformanceResult mr = case mr of Ok res -> "OK: " ++ (toString res) Err errs -> "Fail: " ++ (toString errs) view : Model -> Html Msg view model = div [] [ button [ onClick (RequestLoadFonts "assets/soundfonts") ] [ text "load fonts" ] , button [ onClick (LoadFile "abc/lillasystern.abc") ] [ text "load abc file" ] , div [] [ text ("parsed abc result: " ++ (viewPerformanceResult model.performance)) ] , button [ onClick Play ] [ text "play" ] ]