{"id":38004208,"url":"https://github.com/infojunkie/ireal-musicxml","last_synced_at":"2026-01-16T19:15:31.570Z","repository":{"id":42510347,"uuid":"311147508","full_name":"infojunkie/ireal-musicxml","owner":"infojunkie","description":"iReal Pro to MusicXML converter.","archived":false,"fork":false,"pushed_at":"2025-09-20T21:58:34.000Z","size":391437,"stargazers_count":42,"open_issues_count":4,"forks_count":11,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-10-23T20:50:55.952Z","etag":null,"topics":["irealpro","music-i18n","musicxml"],"latest_commit_sha":null,"homepage":"https://blog.karimratib.me/demos/chirp/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/infojunkie.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"infojunkie"}},"created_at":"2020-11-08T20:22:47.000Z","updated_at":"2025-10-05T22:00:25.000Z","dependencies_parsed_at":"2025-09-05T20:26:35.251Z","dependency_job_id":"d543d4a8-83fd-4d8b-9e9a-f4c6ee7fd9b9","html_url":"https://github.com/infojunkie/ireal-musicxml","commit_stats":{"total_commits":228,"total_committers":1,"mean_commits":228.0,"dds":0.0,"last_synced_commit":"ad4520e17cc1928e6810c6fc197f54dbee8f26cd"},"previous_names":[],"tags_count":47,"template":false,"template_full_name":null,"purl":"pkg:github/infojunkie/ireal-musicxml","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/infojunkie%2Fireal-musicxml","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/infojunkie%2Fireal-musicxml/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/infojunkie%2Fireal-musicxml/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/infojunkie%2Fireal-musicxml/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/infojunkie","download_url":"https://codeload.github.com/infojunkie/ireal-musicxml/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/infojunkie%2Fireal-musicxml/sbom","scorecard":{"id":488273,"data":{"date":"2025-08-11","repo":{"name":"github.com/infojunkie/ireal-musicxml","commit":"b6b7c316f3a11a325cbc4be7576ea07799b06f60"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"name":"Maintained","score":5,"reason":"6 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":1,"reason":"Found 3/28 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/infojunkie/ireal-musicxml/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/infojunkie/ireal-musicxml/test.yml/main?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/test.yml:23","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: GNU General Public License v3.0: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 6 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":8,"reason":"2 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-xffm-g5w8-qvg7","Warn: Project is vulnerable to: GHSA-67mh-4wv8-2f99"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T18:23:00.458Z","repository_id":42510347,"created_at":"2025-08-19T18:23:00.458Z","updated_at":"2025-08-19T18:23:00.458Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28481628,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["irealpro","music-i18n","musicxml"],"created_at":"2026-01-16T19:15:30.811Z","updated_at":"2026-01-16T19:15:31.564Z","avatar_url":"https://github.com/infojunkie.png","language":"JavaScript","funding_links":["https://github.com/sponsors/infojunkie"],"categories":[],"sub_categories":[],"readme":"# ireal-musicxml\niReal Pro to MusicXML converter.\n\n[![npm](https://img.shields.io/npm/v/%40music-i18n%2Fireal-musicxml)](https://www.npmjs.com/package/@music-i18n/ireal-musicxml)\n[![build](https://github.com/infojunkie/ireal-musicxml/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/infojunkie/ireal-musicxml/actions/workflows/test.yml)\n\n# Demo\n[Check out the demo!](https://blog.karimratib.me/demos/chirp/) You can upload one of the [iReal Pro main playlists](https://www.irealpro.com/main-playlists/) as a test.\n\n# Getting started\n- Install `xmllint` (included in [libxml2](http://www.xmlsoft.org/) on most platforms) - only needed for validation\n- `npm install \u0026\u0026 npm run build`\n- `npm test`\n\n# Usage\n```javascript\nimport {\n  convertSync,\n  convert,\n  Playlist,\n  Converter\n} from 'ireal-musicxml'\nconst ireal = // Content of HTML file generated by iReal Pro or irealb:// URI\nconst playlistSync = convertSync(ireal)\nconst playlistAsync = await convert(ireal)\n// =\u003e {\n//   name:              // Playlist name\n//   songs: [{\n//     title:           // Title\n//     composer:        // Composer\n//     style:           // Song style for display\n//     groove:          // Song style for playback\n//     key:             // Key signature\n//     transpose:       // Transposition in semitones\n//     bpm:             // Beats per minute\n//     repeats:         // Repeat count\n//     music:           // Raw song encoding\n//     cells: [ Cell ]  // Array of parsed cells\n//     musicXml:        // MusicXML output\n//   }]\n// }\n\nconst playlistManual = new Playlist(ireal)\n// =\u003e Same as above minus `musicXml` attribute.\n\nconst musicXml = Converter.convert(playlistManual.songs[0])\n// =\u003e MusicXML output of the first song in the above playlist.\n```\n\n```bash\n$ ireal-musicxml test/data/jazz1460.txt --songs=Blues --validate\n```\n\n# Theory of operation\nThis module parses an iReal Pro URI or playlist file, and transforms each song it finds to a MusicXML lead sheet. The conversion process tries to produce a high-fidelity replica of the source sheet by recreating the following aspects of the [iReal Pro format](doc/irealpro.md):\n\n## Harmonic information\nThe chords found in the iReal Pro song are translated to their MusicXML representation. Because the chords supported by iReal Pro are a subset of the [harmonic expressivity of MusicXML](https://www.w3.org/2021/06/musicxml40/musicxml-reference/elements/harmony/), this translation is exact. [More information can be found in this blog post](https://blog.karimratib.me/2020/11/30/ireal-musicxml.html#emitting-correct-chord-information).\n\nAn additional detail is the handling of \"alternate chords\" that can be specified in iReal Pro - these also [will be handled in this converter eventually](https://github.com/infojunkie/ireal-musicxml/issues/2).\n\n## Rhythmic information\nBecause iReal Pro uses a fixed grid for each bar, timing assumptions need to be made about chord onsets, [both in the iReal Pro app itself](https://www.irealb.com/forums/showthread.php?25161-Using-empty-cells-to-control-chord-duration) and in this converter. The [timing algorithm is described in this blog post](https://blog.karimratib.me/2020/11/30/ireal-musicxml.html#emulating-the-ireal-pro-playback-model).\n\n## Layout and styling information\niReal Pro has a distinctive visual sheet style that aims to enhance readability. This converter attempts to recreate this visual style:\n- Using rhythmic notation or slash notation to display the chords\n- Increasing the size of noteheads and chord names\n- Removing uneeded elements from the score, such as clef and staff lines\n- Respecting the original positioning of measures to best reflect the structure of the song\n- Fitting the score on one page where at all possible\n\nMusicXML support for layout and style is expressive enough to represent all these customizations. Unfortunately, existing engraving software do not support the full set of MusicXML directives, thus recreating the intended style only partially. The (heavy-handed) solution is to go one additional step and [convert the MusicXML output from this present converter to the native format of the desired engraving software](https://github.com/infojunkie/ireal-musicxml/issues/16).\n\n## Backing track information\nThe backing track patterns of the iReal Pro styles are not documented. Therefore, a mapping is done to support playing back the converted MusicXML scores that replicates or approximates the original iReal Pro playback. This is achieved in 2 phases:\n\n  - First, the MusicXML `sound/play/other-play[@type = 'groove']` element is used to capture the playback style as specified in the iReal Pro song. Because MusicXML does not currently feature a dedicated element to specify the performance style, the generic `other-play` element was [selected to capture this information](https://github.com/w3c/musicxml/discussions/449).\n\n  - Next, the downstream playback component interprets the above MusicXML element to generate a backing track for the score. This is done in [`musicxml-midi`](https://github.com/infojunkie/musicxml-midi) which utilizes an extensive library of \"grooves\" to map the incoming iReal Pro style to MIDI accompaniment tracks.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finfojunkie%2Fireal-musicxml","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finfojunkie%2Fireal-musicxml","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finfojunkie%2Fireal-musicxml/lists"}