{"id":51319393,"url":"https://github.com/bkazez/reaproj","last_synced_at":"2026-07-01T11:04:14.837Z","repository":{"id":363920095,"uuid":"1264597771","full_name":"bkazez/reaproj","owner":"bkazez","description":"Parse and edit REAPER .RPP project files in Python: tracks, items, markers, regions, render settings","archived":false,"fork":false,"pushed_at":"2026-06-10T03:28:54.000Z","size":9,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-11T00:10:47.187Z","etag":null,"topics":["audio","daw","music-production","parser","python","reaper","reaper-daw","rpp"],"latest_commit_sha":null,"homepage":null,"language":"Python","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/bkazez.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,"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}},"created_at":"2026-06-10T02:53:30.000Z","updated_at":"2026-06-10T03:28:58.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bkazez/reaproj","commit_stats":null,"previous_names":["bkazez/reaproj"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/bkazez/reaproj","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bkazez%2Freaproj","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bkazez%2Freaproj/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bkazez%2Freaproj/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bkazez%2Freaproj/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bkazez","download_url":"https://codeload.github.com/bkazez/reaproj/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bkazez%2Freaproj/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35003466,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-01T02:00:05.325Z","response_time":130,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["audio","daw","music-production","parser","python","reaper","reaper-daw","rpp"],"created_at":"2026-07-01T11:04:14.135Z","updated_at":"2026-07-01T11:04:14.831Z","avatar_url":"https://github.com/bkazez.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# reaproj\n\nParse and edit REAPER `.RPP` project files in Python: tracks, items, markers,\nregions, and render settings as objects, instead of hand-editing chunk text.\n\nTypical uses: add regions to a project programmatically, batch-change render\nsettings (output directory, `$region` naming, format) before a headless\n`-renderproject` render, read item positions and source files for analysis,\nor save versioned copies of a session.\n\nBuilt on [rpp](https://github.com/Perlence/rpp) (the tokenizer/emitter);\nreaproj adds the object model on top.\n\n## Install\n\n```\npip install reaproj\n```\n\n## Read a project\n\n```python\nfrom reaproj import Project\n\nproject = Project.load(\"Session.RPP\")\n\nfor track in project.tracks:\n    for item in track.items:\n        print(item.position, item.length, item.soffs, item.source_path)\n\nfor region in project.regions:\n    print(region.name, region.start, region.end)\n```\n\n## Add regions\n\n```python\nproject.add_region(12.5, 95.0, \"Take 1\")   # id and GUID handled for you\n```\n\n## Configure rendering\n\n```python\nfrom reaproj import RenderBounds\n\nproject.render.directory = \"Takes\"\nproject.render.pattern = \"$region\"\nproject.render.bounds = RenderBounds.ALL_REGIONS\nproject.render.stems = 0                    # master mix\nproject.render.normalize_enabled = False\nproject.render.format = \"wav24\"             # or \"mp3\", or a raw RENDER_CFG base64 payload\n```\n\n## Save\n\n```python\nproject.save()                  # in place\nproject.save(\"Other.RPP\")       # elsewhere\nproject.save_next_version()     # \"Session v2.RPP\", \"Session v3.RPP\", ...\n```\n\nThen render headlessly:\n\n```\nREAPER -renderproject \"Session v2.RPP\"\n```\n\n## Alternatives\n\n- [rpp](https://github.com/Perlence/rpp): the underlying low-level\n  parser/emitter; gives you an ElementTree-like view of raw chunks. Use it\n  directly when you need something reaproj doesn't model yet.\n- [reathon](https://github.com/jamesb93/reathon): constructs new REAPER\n  projects from scratch; not aimed at editing existing ones.\n- [rppxml](https://github.com/IcEarthlight/rppxml): RPP parsing via the WDL\n  implementation.\n- [reapy](https://github.com/RomeoDespres/reapy): controls a running REAPER\n  instance through the ReaScript API; requires REAPER to be open. reaproj\n  works on the files themselves, no REAPER required.\n\n## Fidelity\n\nreaproj never touches content it doesn't understand; everything round-trips\nthrough the element tree, and numeric values are preserved as strings, never\nreformatted. Verified on real REAPER 7 projects:\n\n- Emission is idempotent, and the only differences from REAPER's own formatting\n  are cosmetic quoting (quotes dropped on space-free strings; both forms appear\n  in REAPER-authored files).\n- REAPER itself loads and headlessly renders reaproj-emitted projects: in an\n  A/B against the original project file, all rendered regions matched in name,\n  count, and byte-identical file size, and the audio difference between the two\n  renders was the same as between two renders of the untouched original (i.e.\n  REAPER's own render-to-render variance from modulated plugins, not a file\n  difference).\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbkazez%2Freaproj","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbkazez%2Freaproj","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbkazez%2Freaproj/lists"}