{"id":23520304,"url":"https://github.com/prefixaut/rconv","last_synced_at":"2026-01-25T17:02:02.443Z","repository":{"id":42717530,"uuid":"417636371","full_name":"prefixaut/rconv","owner":"prefixaut","description":"Universal Rhythm-Game File parser and converter","archived":false,"fork":false,"pushed_at":"2022-04-11T22:10:57.000Z","size":942,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-14T02:13:52.537Z","etag":null,"topics":["cli","command-line","command-line-tool","converter","fileconversion","fileconverter","parser","parser-library","rhythm","rhythm-game"],"latest_commit_sha":null,"homepage":"https://prefixaut.github.io/rconv/theindex.html","language":"Nim","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/prefixaut.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":"2021-10-15T21:07:38.000Z","updated_at":"2022-11-13T04:05:39.000Z","dependencies_parsed_at":"2022-08-23T08:30:36.196Z","dependency_job_id":null,"html_url":"https://github.com/prefixaut/rconv","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/prefixaut/rconv","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prefixaut%2Frconv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prefixaut%2Frconv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prefixaut%2Frconv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prefixaut%2Frconv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/prefixaut","download_url":"https://codeload.github.com/prefixaut/rconv/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prefixaut%2Frconv/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28755561,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T16:32:25.380Z","status":"ssl_error","status_checked_at":"2026-01-25T16:32:09.189Z","response_time":113,"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":["cli","command-line","command-line-tool","converter","fileconversion","fileconverter","parser","parser-library","rhythm","rhythm-game"],"created_at":"2024-12-25T16:12:38.064Z","updated_at":"2026-01-25T17:02:02.415Z","avatar_url":"https://github.com/prefixaut.png","language":"Nim","readme":"\u003cdiv align=\"center\"\u003e\n\n# rconv\n\n[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/prefixaut/rconv/Building%20\u0026%20Testing/master?style=for-the-badge\u0026logo=github-actions\u0026logoColor=white)](https://github.com/prefixaut/rconv/actions)\n[![Coveralls branch](https://img.shields.io/coveralls/github/prefixaut/rconv/master?style=for-the-badge\u0026logo=coveralls)](https://coveralls.io/github/prefixaut/rconv)\n\n[![GitHub release](https://img.shields.io/github/v/release/prefixaut/rconv?style=for-the-badge\u0026logo=github)](https://github.com/prefixaut/rconv/releases)\n![Nim Version](https://img.shields.io/badge/nim-%3E%3D%201.6-blue?style=for-the-badge\u0026logo=nim\u0026logoColor=white)\n[![GitHub](https://img.shields.io/github/license/prefixaut/rconv?style=for-the-badge)](https://github.com/prefixaut/rconv/blob/master/LICENSE)\n\nrconv is a library and command-line program to parse and convert various rhythm game formats\n\n\u003c/div\u003e\n\n---\n\n- [rconv](#rconv)\n  - [Installation](#installation)\n  - [Installation as CLI](#installation-as-cli)\n    - [Installtion as Library](#installtion-as-library)\n  - [Building](#building)\n  - [Documentation](#documentation)\n  - [Usage](#usage)\n    - [Usage of CLI](#usage-of-cli)\n    - [Usage of Library](#usage-of-library)\n  - [Supported Formats](#supported-formats)\n    - [Parsing](#parsing)\n    - [Convertion](#convertion)\n\n---\n\n## Installation\n\n## Installation as CLI\n\nSee the [releases](https://github.com/prefixaut/rconv/releases) for pre-build executables of your system.\n\nIf you want to build it yourself, see the [Building](#building) section for further information.\n\n### Installtion as Library\n\nCurrently not available as nimble package just yet, as it's still in an unstable phase.\n\nIf you still want to use it as library, you can do so as a Git Submodule and import the [entry](./src/entry.nim)-file.\n\n## Building\n\nThis project can be built with the regular [`nim` compiler](https://nim-lang.org/) ([Nim CLI Documentation](https://nim-lang.org/docs/nimc.html)).\nAdditionally, the following convenience tasks are defined in the [`rconv.nimble`](rconv.nimble) file:\n\n- `clib`: Builds the project as a regular library\n- `build`: Builds the project as a regular library\n- `docs`: Builds the project's documentation.\n\nThese may then be executed like this:\n\n```sh\nnimble clib\nnimble build\nnimble docs\n\n# Release Versions\nnimble clib -d:release\nnumble build -d:release\n```\n\n## Documentation\n\nFor full information of all functions, types, etc.,\nplease refer to the [documentation](https://prefixaut.github.io/rconv/theindex.html) from this repositiory.\n\n## Usage\n\n### Usage of CLI\n\nThe CLI is rather straight forward and may be used like this:\n\n```sh\nrconv [options] \u003c--to=output-type\u003e \u003cinput-files\u003e\n```\n\nThe CLI requires an output-type (`-t`/`--to`), and the file-paths to the charts you want to convert.\n\n```text\nUsage:\n   [options] [files ...]\n\nArguments:\n  [files ...]      Input-Files to convert. At least one has to be specified\n\nOptions:\n  -h, --help\n  -b, --bundle               All output files should instead be bundles (if the output type supports it).\n  -c, --color                Enable print messages to be in color.\n  -C, --clean                If it should clean (delete all contents) of the output folder. Disabled if 'preserve' is enabled.\n  -d, --delete-on-finish     Delete a processed file after handling it.\n  -e, --delay-errors         Process files even if a previous file caused an error.\n  -f, --song-folders         Enable that each song is getting placed into it's own sub-directory.\n  -j, --json-pretty          Output JSON data prettily.\n  -k, --keep                 If it should keep the original meta data when merging a file.\n  -m, --merge                Merge all possible charts into existing files.\n  -o, --output=OUTPUT        The output location for the files. If the directory doesn't exist, they will be created. (default: .)\n  -p, --preserve             Preserve the original output file (don't override it) if it already exists.\n  -P, --progress             Display the current progress.\n  -q, --quiet                Skip all stdout/stderr messages.\n  -r, --resources            Copy all neccessary resources (Sound-File, Jacket) to the output directory. Should only be used in comination with the \"song-folders\" option.\n  -s, --stats                Show stats on the end of the operation.\n  -t, --to=TO                The output type. Possible values: [fxf, malody, memo, sm]\n  -n, --normalize            Normalize the output-paths (folder/file).\n  -V, --verbose              Print verbose messages on internal operations.\n  -x, --folder-format=FOLDER_FORMAT\n                             The format for song-folders. You may use the following placeholders: '%artist%', '%title%'. (default: %title% (%artist%))\n  -z, --chart-format=CHART_FORMAT\n                             The format for the output file-name. You may use the following placeholders: '%artist%', '%title%', '%difficulty%', and '%ext%'.Defaults to '%artist% - %title%.%ext%' on type 'fxf', otherwise to '%artist% - %title%_%difficulty%.%ext%'\n```\n\nExample:\n\n```sh\nrconv -C -j -f -t malody --out output/nested /somewhere/my-input/sample.memo\n```\n\n\u003e **Note**: You can also use the same output format again to format the files.\n\n### Usage of Library\n\nAs library, you should only have to import the entry file and the file formtats you want to use.\nEach file-format should be imported in an own namespace, as types might overlap (Multiple types called `Chart` for example).\n\nParsing/Reading of the chart is done via the `parse{format}` (i.E. `parseMemo` or `parseStepMania`) procs, while writing the chart is done via the `write` procs defined in each module.\nThese `parse` and `write` procs are always implemented for streams, and usually also for strings (as long as the chart-format is not binary).\n\nConverting procs are found in the `rconv/mapper` (imported via `rconv`) and are named `to{format}`, i.E. `toFXF` or `toMalody`.\n\n```nim\nimport pkg/rconv\nimport pkg/rconv/fxf as fxf\nimport pkg/rconv/memo as memo\n\nlet rawMemo = readFile(\"/home/user/some-chart.memo\")\nlet memoChart = memo.parseMemo(rawMemo)\nlet fxfChart = memoChart.toFXF\necho fxfChart.write\n```\n\n## Supported Formats\n\n### Parsing\n\nAll listed formats are able to be parsed, have proper types (structs) and outputs setup:\n\n- Memo (`.memo`)\n- Malody (`.mc`)\n- FXF (`.fxf`)\n- StepMania (`.sm`)\n\n### Convertion\n\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eFrom / To\u003c/td\u003e\n        \u003ctd\u003eMemo\u003c/td\u003e\n        \u003ctd\u003eMemoV2\u003c/td\u003e\n        \u003ctd\u003eMalody¹\u003c/td\u003e\n        \u003ctd\u003eFXF\u003c/td\u003e\n        \u003ctd\u003eosu!¹\u003c/td\u003e\n        \u003ctd\u003eStepMania\u003c/td\u003e\n        \u003ctd\u003eStepMania 5\u003c/td\u003e\n        \u003ctd\u003eKick It Up\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd style=\"text-align: center;\"\u003eMemo\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e➖\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e✔️\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e✔️\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd style=\"text-align: center;\"\u003eMemoV2\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e➖\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd style=\"text-align: center;\"\u003eMalody\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e➖\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e✔️\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e✔️\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd style=\"text-align: center;\"\u003eFXF\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e➖\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd style=\"text-align: center;\"\u003eosu!\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e➖\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd style=\"text-align: center;\"\u003eStepMania\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e✔️\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e➖\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd style=\"text-align: center;\"\u003eStepMania 5\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e➖\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd style=\"text-align: center;\"\u003eKick It Up\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e❌\u003c/td\u003e\n        \u003ctd style=\"text-align: center;\"\u003e➖\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n**¹** Formats which support multiple different game-types.\nConvertion for these formats is only for the most relevant game-type (i.E. StepMania -\u003e osu! = StepMania -\u003e osu!mania)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprefixaut%2Frconv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprefixaut%2Frconv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprefixaut%2Frconv/lists"}