{"id":15651386,"url":"https://github.com/0x2b3bfa0/python-blobopera","last_synced_at":"2025-09-10T04:33:52.847Z","repository":{"id":45272624,"uuid":"324615827","full_name":"0x2b3bfa0/python-blobopera","owner":"0x2b3bfa0","description":"Toolkit to convert MusicXML files into Blob Opera scores with real lyrics.","archived":false,"fork":false,"pushed_at":"2025-02-06T21:15:54.000Z","size":1116,"stargazers_count":34,"open_issues_count":2,"forks_count":5,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-04-02T13:55:49.317Z","etag":null,"topics":["blob-opera","lyrics","musescore","music","music21","musicxml","score","singing-voice-synthesis"],"latest_commit_sha":null,"homepage":"https://artsandculture.google.com/experiment/blob-opera/AAHWrq360NcGbw","language":"Python","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/0x2b3bfa0.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}},"created_at":"2020-12-26T18:48:32.000Z","updated_at":"2025-02-08T07:10:47.000Z","dependencies_parsed_at":"2024-03-02T14:29:54.011Z","dependency_job_id":"10107b84-822f-4c36-9495-3fecc0c7490f","html_url":"https://github.com/0x2b3bfa0/python-blobopera","commit_stats":{"total_commits":29,"total_committers":3,"mean_commits":9.666666666666666,"dds":0.06896551724137934,"last_synced_commit":"576eb4a4674285d7f857d11921ceaccfe78cf5d5"},"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0x2b3bfa0%2Fpython-blobopera","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0x2b3bfa0%2Fpython-blobopera/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0x2b3bfa0%2Fpython-blobopera/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0x2b3bfa0%2Fpython-blobopera/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/0x2b3bfa0","download_url":"https://codeload.github.com/0x2b3bfa0/python-blobopera/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248618225,"owners_count":21134200,"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":["blob-opera","lyrics","musescore","music","music21","musicxml","score","singing-voice-synthesis"],"created_at":"2024-10-03T12:38:11.717Z","updated_at":"2025-04-12T18:51:57.730Z","avatar_url":"https://github.com/0x2b3bfa0.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eBlob Opera Toolkit\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/0x2b3bfa0/python-blobopera/actions/workflows/test.yml\"\u003e\n        \u003cimg alt=\"test\" src=\"https://github.com/0x2b3bfa0/python-blobopera/actions/workflows/test.yml/badge.svg?branch=main\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://pypi.org/project/blobopera\"\u003e\n        \u003cimg alt=\"package\" src=\"https://badge.fury.io/py/blobopera.svg\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://www.gnu.org/licenses/gpl-3.0\"\u003e\n        \u003cimg alt=\"license\" src=\"https://img.shields.io/badge/license-GPL3-blue.svg\"\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n## Description\n\nUnofficial toolkit to convert MusicXML files into [Blob Opera][1] scores with\nreal lyrics, loosely inspired by [OverlappingElvis/blob-opera-midi][2].\n\n## Documentation\n\n* Full [command documentation][12].\n* Generated [module documentation][19].\n\n## Samples\n\n* **[Adeste Fideles][5]** ([_source_][7], [_information_][6])\n* **[Symphony No. 9 (Beethoven)][13]** ([_source_][15], [_information_][14])\n* **[Ave Maria (Schubert)][20]** ([_source_][21], [_information_][22])\n* **[O Magnum Mysterium (Brian Schmidt)][25]** ([_contributed sample_][26])\n* **[Ave Verum Corpus (Mozart)][27]** ([_contributed sample_][28])\n* **[Cum Sancto Spiritu - Gloria (Vivaldi)][29]** ([_contributed sample_][30])\n* **[Bohemian Rhapsody (Queen)][31]** ([_contributed sample_][32])\n\n\n:book:\u0026nbsp;\u0026nbsp;**Want to contribute a new sample? Click [here][24]!**\n\n## Usage\n\n1. Create a score file:\n   Use [MuseScore][3] or similar to create a four-part score\n   (soprano, alto, tenor and bass) with a single line of lyrics and export it\n   to [MusicXML][4]. You can download MusicXML files from MuseScore\n   by using [this tool][8].\n\n2. Install the tool:\n   ```bash\n   pip install blobopera\n   ```\n\n3. Convert the score file:\n   ```bash\n   blobopera recording import input.musicxml output.binary\n   ```\n   _[(Take a look at the command-line options)][23]_\n\n4. Upload the recording:\n   ```bash\n   blobopera recording upload output.binary\n   ```\n\n5. Visit the generated link with your browser.\n\n## Roadmap\n\n* [X] Publish the package\n* [ ] Add language-specific phoneme translators\n* [ ] Improve the phoneme relocation logic\n* [ ] Write granular unit tests\n* [ ] Extend the documentation\n\n## Contributing\n\n1. Clone this repository:\n   ```console\n   $ git clone https://github.com/0x2b3bfa0/python-blobopera\n   $ cd python-blobopera\n   ```\n\n2. Install the dependencies with [poetry][11]:\n   ```console\n   $ poetry install\n   ```\n\n4. Run the command-line tool:\n   ```console\n   $ poetry run blobopera\n   ```\n\n3. Run the module tests:\n   ```console\n   $ poetry run poe all\n   ```\n\n[1]: https://artsandculture.google.com/experiment/blob-opera/AAHWrq360NcGbw\n[2]: https://github.com/OverlappingElvis/blob-opera-midi\n[3]: https://musescore.org/en\n[4]: https://en.wikipedia.org/wiki/MusicXML\n[5]: https://g.co/arts/hrjRDrpL5G7LrjRx7\n[6]: https://en.wikipedia.org/wiki/O_Come,_All_Ye_Faithful\n[7]: https://musescore.com/user/29729/scores/416701\n[8]: https://github.com/Xmader/musescore-downloader\n[11]: https://python-poetry.org/docs/\n[12]: ./documentation/command\n[13]: https://g.co/arts/vFxPVuuTATXNvX9F8\n[14]: https://en.wikipedia.org/wiki/Symphony_No._9_(Beethoven)#IV._Finale\n[15]: https://musescore.com/user/34418260/scores/6430537\n[16]: https://artsandculture.google.com/experiment/blob-opera/AAHWrq360NcGbw?cp=eyJyIjoiNVNxb0RhRlB1VnRuIn0.\n[17]: https://en.wikipedia.org/wiki/Mateo_Flecha\n[18]: https://musescore.com/user/28092/scores/85307\n[19]: https://0x2b3bfa0.github.io/python-blobopera\n[20]: https://g.co/arts/xQGR5aWBwuDeGqTq8\n[21]: http://www.cafe-puccini.dk/Schubert_GdurMesse.aspx\n[22]: https://en.wikipedia.org/wiki/Ave_Maria_(Schubert)\n[23]: ./documentation/command#blobopera-recording-import\n[24]: https://github.com/0x2b3bfa0/python-blobopera/issues/new?labels=recording\u0026template=new-recording.md\u0026title=New+recording%3A+%7Btitle%7D\n[25]: https://g.co/arts/8VGdX1SGjm2Tzyee7\n[26]: https://github.com/0x2b3bfa0/python-blobopera/issues/4\n[27]: https://g.co/arts/FqjgC2WJ6HyC2otv9\n[28]: https://github.com/0x2b3bfa0/python-blobopera/issues/7\n[29]: https://g.co/arts/77abQGtdkV72N3oW7\n[30]: https://github.com/0x2b3bfa0/python-blobopera/issues/8\n[31]: https://g.co/arts/NTkrPLNfAwpRQejY7\n[32]: mailto:rogercloud10@gmail.com\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F0x2b3bfa0%2Fpython-blobopera","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F0x2b3bfa0%2Fpython-blobopera","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F0x2b3bfa0%2Fpython-blobopera/lists"}