{"id":50677130,"url":"https://github.com/groupmm/synctoolbox","last_synced_at":"2026-06-08T16:05:36.354Z","repository":{"id":41280271,"uuid":"372789579","full_name":"groupmm/synctoolbox","owner":"groupmm","description":"A Python toolbox with reference implementations for efficient, robust, and accurate music synchronization based on dynamic time warping (DTW)","archived":false,"fork":false,"pushed_at":"2026-05-28T08:01:08.000Z","size":97090,"stargazers_count":137,"open_issues_count":1,"forks_count":19,"subscribers_count":7,"default_branch":"master","last_synced_at":"2026-06-06T14:04:20.820Z","etag":null,"topics":["chromagram","dtw","music","onset","python","synchronization"],"latest_commit_sha":null,"homepage":"https://groupmm.github.io/synctoolbox/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/groupmm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2021-06-01T10:26:35.000Z","updated_at":"2026-06-04T02:38:56.000Z","dependencies_parsed_at":"2025-04-14T16:01:39.039Z","dependency_job_id":"78c1685d-f30f-4688-9730-38f92958ad8c","html_url":"https://github.com/groupmm/synctoolbox","commit_stats":{"total_commits":110,"total_committers":5,"mean_commits":22.0,"dds":0.3727272727272727,"last_synced_commit":"ec05a3245f76c40bca8449217d8cc59f208d3770"},"previous_names":["groupmm/synctoolbox"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/groupmm/synctoolbox","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/groupmm%2Fsynctoolbox","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/groupmm%2Fsynctoolbox/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/groupmm%2Fsynctoolbox/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/groupmm%2Fsynctoolbox/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/groupmm","download_url":"https://codeload.github.com/groupmm/synctoolbox/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/groupmm%2Fsynctoolbox/sbom","scorecard":{"id":635510,"data":{"date":"2025-08-11","repo":{"name":"github.com/meinardmueller/synctoolbox","commit":"cf4c471f232d510849b77491720dd19f8441340c"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/test_conda.yml:1","Warn: no topLevel permission defined: .github/workflows/test_pip.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":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"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":0,"reason":"Found 0/9 approved changesets -- score normalized to 0","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":"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":"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":"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":"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":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"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":9,"reason":"license file detected","details":["Info: project has a license file: LICENCE:0","Warn: project license file does not contain an FSF or OSI license."],"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":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v1.2.0 not signed: https://api.github.com/repos/meinardmueller/synctoolbox/releases/52517743","Warn: release artifact v1.1.0 not signed: https://api.github.com/repos/meinardmueller/synctoolbox/releases/49755575","Warn: release artifact v1.0.2 not signed: https://api.github.com/repos/meinardmueller/synctoolbox/releases/48567104","Warn: release artifact v1.2.0 does not have provenance: https://api.github.com/repos/meinardmueller/synctoolbox/releases/52517743","Warn: release artifact v1.1.0 does not have provenance: https://api.github.com/repos/meinardmueller/synctoolbox/releases/49755575","Warn: release artifact v1.0.2 does not have provenance: https://api.github.com/repos/meinardmueller/synctoolbox/releases/48567104"],"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 'master'"],"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":"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_conda.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/meinardmueller/synctoolbox/test_conda.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test_conda.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/meinardmueller/synctoolbox/test_conda.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test_pip.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/meinardmueller/synctoolbox/test_pip.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test_pip.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/meinardmueller/synctoolbox/test_pip.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/test_conda.yml:30","Warn: pipCommand not pinned by hash: .github/workflows/test_pip.yml:39","Warn: pipCommand not pinned by hash: .github/workflows/test_pip.yml:40","Warn: pipCommand not pinned by hash: .github/workflows/test_pip.yml:41","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 pipCommand 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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 27 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"}}]},"last_synced_at":"2025-08-21T09:03:29.393Z","repository_id":41280271,"created_at":"2025-08-21T09:03:29.393Z","updated_at":"2025-08-21T09:03:29.393Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34067353,"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-06-08T02:00:07.615Z","response_time":111,"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":["chromagram","dtw","music","onset","python","synchronization"],"created_at":"2026-06-08T16:05:35.506Z","updated_at":"2026-06-08T16:05:36.348Z","avatar_url":"https://github.com/groupmm.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Python Package using Conda](https://github.com/meinardmueller/synctoolbox/actions/workflows/test_conda.yml/badge.svg)](https://github.com/meinardmueller/synctoolbox/actions/workflows/test_conda.yml)\n[![Python package](https://github.com/meinardmueller/synctoolbox/actions/workflows/test_pip.yml/badge.svg)](https://github.com/meinardmueller/synctoolbox/actions/workflows/test_pip.yml)\n\n\n# Sync Toolbox\n\nThis repository contains a Python package called Sync Toolbox, which provides open-source reference implementations for full-fledged music synchronization pipelines and yields state-of-the-art alignment results for a wide range of Western music. \n\nUsing suitable feature representations and cost measures, the toolbox's core technology is based on dynamic time warping (DTW), which brings the feature sequences into temporal correspondence. To account for efficiency, robustness and, accuracy, our toolbox integrates and combines techniques such as [multiscale DTW (MsDTW)](https://www.audiolabs-erlangen.de/fau/professor/mueller/publications/2006_MuellerMattesKurth_MultiscaleAudioSynchronization_ISMIR.pdf), [memory-restricted MsDTW (MrMsDTW)](https://www.audiolabs-erlangen.de/fau/professor/mueller/publications/2016_PraetzlichDriedgerMueller_MrMsDTW_ICASSP.pdf), and [high-resolution music synchronization](https://www.audiolabs-erlangen.de/fau/professor/mueller/publications/2009_EwertMuellerGrosche_HighResAudioSync_ICASSP.pdf). \n\nIf you use the Sync Toolbox in your research, please consider the following references.\n\n## References\n\nMeinard Müller, Yigitcan Özer, Michael Krause, Thomas Prätzlich, and Jonathan Driedger. [Sync Toolbox: A Python Package for Efficient, Robust, and Accurate Music Synchronization.](https://joss.theoj.org/papers/10.21105/joss.03434) Journal of Open Source Software (JOSS), 6(64), 2021.\n\nMeinard Müller, Henning Mattes, and Frank Kurth.\n[An Efficient Multiscale Approach to Audio Synchronization](https://www.audiolabs-erlangen.de/fau/professor/mueller/publications/2006_MuellerMattesKurth_MultiscaleAudioSynchronization_ISMIR.pdf).\nIn Proceedings of the International Society for Music Information Retrieval Conference (ISMIR): 192–197, 2006.\n\nSebastian Ewert, Meinard Müller, and Peter Grosche.\n[High Resolution Audio Synchronization Using Chroma Onset Features](https://www.audiolabs-erlangen.de/fau/professor/mueller/publications/2009_EwertMuellerGrosche_HighResAudioSync_ICASSP.pdf).\nIn Proceedings of IEEE International Conference on Acoustics, Speech, and Signal Processing (ICASSP): 1869–1872, 2009.\n\nThomas Prätzlich, Jonathan Driedger, and Meinard Müller\n[Memory-Restricted Multiscale Dynamic Time Warping](https://www.audiolabs-erlangen.de/fau/professor/mueller/publications/2016_PraetzlichDriedgerMueller_MrMsDTW_ICASSP.pdf).\nIn Proceedings of the IEEE International Conference on Acoustics, Speech, and Signal Processing (ICASSP): 569–573, 2016. \n\n## Installing\n\nIf you just want to try our example notebooks, you can run them using Binder directly in your browser: [![Binder](https://mybinder.org/badge_logo.svg)](https://notebooks.gesis.org/binder/v2/gh/meinardmueller/synctoolbox/master)\n\nTo install the Sync Toolbox locally, you can use the Python package manager pip:\n\n```\npip install synctoolbox\n```\n\nWe recommend to do this inside a conda or virtual environment (requiring at least Python 3.7). As an alternative, you may also create the environment ``synctoolbox`` as provided by the file ``environment.yml`` (which includes the synctoolbox package as well as the jupyter package to run the demo files):\n\n```\nconda env create -f environment.yml\n```\n\n**Note:** On some systems, you may see errors related with ``soundfile`` when calling some functions or executing our example notebooks. ``soundfile`` is a dependency of ``librosa``, which is used by the Sync Toolbox. In case of errors, you may have to install libsndfile using your package manager, e.g., ``sudo apt install libsndfile1``. Alternatively, you may create a conda environment, install ``librosa`` using conda and then install the Sync Toolbox with the pip command from above. See [here](https://github.com/librosa/librosa#hints-for-the-installation) for further information if you are experiencing these issues.\n\n\nIf you want to run the example notebooks locally, you **must** first install the Sync Toolbox to resolve all dependencies. Then, you can clone this repository using\n\n```\ngit clone https://github.com/meinardmueller/synctoolbox.git\n```\ninstall Jupyter using\n\n```\npip install jupyter\n```\n\nand then start the notebook server via\n\n```\njupyter notebook\n```\n\nFinally, HTML exports of the example notebooks are provided under \"[Releases](https://github.com/meinardmueller/synctoolbox/releases)\".\n\n\n## Usage\n\nFully worked examples for using the sync toolbox are provided in the accompanying Jupyter notebooks. In ``sync_audio_audio_simple.ipynb``, we show how to use the toolbox to synchronize two recordings of the same piece of music using standard chroma features. We also compare runtimes for standard DTW and MrMsDTW. In ``sync_audio_audio_full.ipynb``, we expand this example and demonstrate how to build a full synchronization pipeline that yields state-of-the-art results. Finally, ``sync_audio_score_full.ipynb`` shows a similar pipeline for synchronizing a music recording with the corresponding score.\n\nThere is also an API documentation for the Sync Toolbox:\n\nhttps://groupmm.github.io/synctoolbox\n\n## Contributing\n\nWe are happy for suggestions and contributions. We would be grateful for either directly contacting us via email (meinard.mueller@audiolabs-erlangen.de) or for creating an issue in our Github repository. Please do not submit a pull request without prior consultation with us.\n\n## Tests\n\nWe provide automated tests for each feature and different variants of MrMsDTW. These ensure that the outputs match the ground truth matrices provided in the **tests/data** folder.\n\nTo execute the test script, you will need to install extra requirements for testing:\n\n```\npip install 'synctoolbox[tests]'\npytest tests\n```\n\n## Licence\n\nThe code for this toolbox is published under an MIT licence. This does not apply to the data files. Schubert songs are taken from the [Schubert Winterreise Dataset](https://zenodo.org/record/4122060). The Chopin prelude example files are taken from the [FMP notebooks](https://www.audiolabs-erlangen.de/resources/MIR/FMP/C0/C0.html).\n\n## Acknowledgements\n\nThe synctoolbox package builds on results, material, and insights that have been obtained in close collaboration with different people. We would like to express our gratitude to former and current students, collaborators, and colleagues who have influenced and supported us in creating this package, including Vlora Arifi-Müller, Michael Clausen, Sebastian Ewert, Christian Fremerey, and Frank Kurth. The main authors of Sync Toolbox are associated with the International Audio Laboratories Erlangen, which are a joint institution of the Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) and Fraunhofer Institute for Integrated Circuits IIS. We also thank the German Research Foundation (DFG) for various research grants that allowed us for conducting fundamental research in music processing (in particular, MU 2686/7-2, DFG-MU 2686/14-1).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgroupmm%2Fsynctoolbox","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgroupmm%2Fsynctoolbox","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgroupmm%2Fsynctoolbox/lists"}