{"id":20577730,"url":"https://github.com/arkham/elm-rttl","last_synced_at":"2026-04-19T12:34:57.363Z","repository":{"id":52701453,"uuid":"240754662","full_name":"Arkham/elm-rttl","owner":"Arkham","description":"Parse ringtones written using RTTL and Nokia Composer in Elm","archived":false,"fork":false,"pushed_at":"2021-10-29T15:58:51.000Z","size":42,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-16T22:15:43.234Z","etag":null,"topics":["composer","elm","hacktoberfest","nokia","rttl"],"latest_commit_sha":null,"homepage":"","language":"Elm","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Arkham.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-02-15T17:06:19.000Z","updated_at":"2021-10-29T15:58:51.000Z","dependencies_parsed_at":"2022-08-21T19:00:16.072Z","dependency_job_id":null,"html_url":"https://github.com/Arkham/elm-rttl","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arkham%2Felm-rttl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arkham%2Felm-rttl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arkham%2Felm-rttl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arkham%2Felm-rttl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Arkham","download_url":"https://codeload.github.com/Arkham/elm-rttl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242199979,"owners_count":20088347,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["composer","elm","hacktoberfest","nokia","rttl"],"created_at":"2024-11-16T06:08:20.000Z","updated_at":"2026-04-19T12:34:57.329Z","avatar_url":"https://github.com/Arkham.png","language":"Elm","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Elm RTTL\n\nParse ringtones written using RTTL and Nokia Composer.\n\n## Installation\n\n`elm install Arkham/elm-rttl`\n\n## Example\n\nHere's an example of what you could do:\n\n```elm\nport module Example exposing (main)\n\nimport Browser\nimport Html exposing (Html)\nimport Html.Attributes as Attr\nimport Html.Events as Events\nimport Json.Encode as Encode\nimport RTTL\n\n\nport sendRingtone : Encode.Value -\u003e Cmd msg\n\n\ntype alias Model =\n    { userInput : String\n    , alertMessage : String\n    }\n\n\ntype Msg\n    = UserInput String\n    | Play\n\n\ninitialModel : Model\ninitialModel =\n    { userInput = \"32c2 32f2 32c2 32f2 4c2 8#g1 8#a1 4f1 8- 32c2 32f2 32c2 32f2 4c2 8#g1 8#a1 4#d2 8- 32c2 32- 32#d2 4f2 16#g2 32- 16g2 32- 32f2 32- 4#d2 8- 32c2 32f2 32c2 32f2 4c2 8#a1 4f1\"\n    , alertMessage = \"\"\n    }\n\n\nmain : Program () Model Msg\nmain =\n    Browser.element\n        { init = \\_ -\u003e ( initialModel, Cmd.none )\n        , view = view\n        , update = update\n        , subscriptions = \\_ -\u003e Sub.none\n        }\n\n\nview : Model -\u003e Html Msg\nview model =\n    Html.div []\n        [ Html.textarea\n            [ Attr.value model.userInput\n            , Events.onInput UserInput\n            ]\n            []\n        , Html.button [ Events.onClick Play ] [ Html.text \"Play\" ]\n        , Html.text model.alertMessage\n        ]\n\n\nupdate : Msg -\u003e Model -\u003e ( Model, Cmd Msg )\nupdate msg model =\n    case msg of\n        UserInput newInput -\u003e\n            ( { model | userInput = newInput }, Cmd.none )\n\n        Play -\u003e\n            case RTTL.parseComposer { tempo = 64 } model.userInput of\n                Ok value -\u003e\n                    ( { model | alertMessage = Debug.toString value }\n                    , sendRingtone (RTTL.encode value)\n                    )\n\n                Err _ -\u003e\n                    ( { model | alertMessage = \"Could not parse ringtone, sorry!\" }, Cmd.none )\n```\n\nPaired us with this HTML\n\n\n```\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n  \u003cscript src=\"app.js\"\u003e\u003c/script\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n  \u003cmain\u003e\u003c/main\u003e\n  \u003cscript\u003e\n    var app = Elm.Example.init({ node: document.querySelector('main') })\n\n    app.ports.sendRingtone.subscribe(function(data) {\n      console.log(data);\n      var context = new AudioContext();\n\n      var ac = new AudioContext();\n      var osc = ac.createOscillator();\n\n      data.reduce(function(now, elem) {\n        oscillator = context.createOscillator();\n        oscillator.connect(context.destination);\n        oscillator.frequency.value = elem.frequency;\n        oscillator.start(context.currentTime + now);\n        oscillator.stop(context.currentTime + now + elem.duration - 0.002);\n        return(now + elem.duration);\n      }, 0);\n    });\n  \u003c/script\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farkham%2Felm-rttl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farkham%2Felm-rttl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farkham%2Felm-rttl/lists"}