MuseScore is an open source and free music notation software. For support, contribution, bug reports, visit MuseScore.org. Fork and make pull requests!
This report summarizes scanner evidence for musescore/MuseScore, a C++ project with 15,337 GitHub stars. SynthScan examined 3,807,948 lines of code across 4530 source files, recording 1217 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 0.4 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 1167 finding(s).
Are imports declared and package/API names verified? 18 finding(s).
Are wrappers, guards, and repeated structures necessary? 38 finding(s).
Which changes need focused human review? 1217 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1217 distinct pattern matches across 11 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ninja_build.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | CMakeLists.txt | 1 | # SPDX-License-Identifier: GPL-3.0-only | COMMENT |
| LOW | CMakeLists.txt | 61 | check_compile_version("AppleClang" 21 "https://github.com/musescore/MuseScore/wiki/Set-up-developer-environment") | COMMENT |
| LOW | tools/miditools/midievent.h | 1 | //============================================================================= | COMMENT |
| LOW | tools/miditools/CMakeLists.txt | 1 | # SPDX-License-Identifier: GPL-3.0-only | COMMENT |
| LOW | tools/miditools/midifile.h | 1 | //============================================================================= | COMMENT |
| LOW | tools/miditools/tempomap.h | 1 | //============================================================================= | COMMENT |
| LOW | tools/miditools/xmlreader.h | 1 | //============================================================================= | COMMENT |
| LOW | tools/miditools/xmlwriter.h | 1 | //============================================================================= | COMMENT |
| LOW | tools/miditools/midifile.cpp | 221 | { | COMMENT |
| LOW | tools/bww2mxml/CMakeLists.txt | 1 | # SPDX-License-Identifier: GPL-3.0-only | COMMENT |
| LOW | tools/fonttools/smufl2sym.sh | 1 | #!/bin/sh | COMMENT |
| LOW | tools/fonttools/CMakeLists.txt | 1 | # SPDX-License-Identifier: GPL-3.0-only | COMMENT |
| LOW | tools/fonttools/genft.cpp | 21 | */ | COMMENT |
| LOW | tools/fonttools/genft.cpp | 41 | #include <QStringList> | COMMENT |
| LOW | tools/fonttools/genft.cpp | 101 | // { "accidentals.sharp.slashslashslash.stemstem", "accidentals.sharp.slashslashslash.stemstem" }, | COMMENT |
| LOW | tools/codestyle/cherry_pick.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | tools/checkheaders/iwyu.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | tools/translations/process_source_ts_files.py | 1 | #!/usr/bin/env python3 | COMMENT |
| LOW | tools/translations/tx_push.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | tools/translations/run_lrelease.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | tools/translations/run_lupdate.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | tools/translations/tx_pull.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | sandbox/cpad/CMakeLists.txt | 1 | # SPDX-License-Identifier: GPL-3.0-only | COMMENT |
| LOW | sandbox/web_sandbox/main.cpp | 1 | #include <QGuiApplication> | COMMENT |
| LOW | hooks/uninstall.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | hooks/install.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .github/workflows/build_windows.yml | 381 | echo "DO_PLACEHOLDER_TRANSLATIONS=$DO_PLACEHOLDER_TRANSLATIONS" | tee -a $GITHUB_ENV | COMMENT |
| LOW | .github/workflows/build_windows.yml | 461 | bash ./buildscripts/ci/tools/osuosl/publish.sh -s "${OSUOSL_SSH_ENCRYPT_SECRET}" --os windows -v 4 --arch x86_64 | COMMENT |
| LOW | .github/workflows/build_windows.yml | 481 | # path: ${{ github.workspace }}/.ccache | COMMENT |
| LOW | .github/workflows/check_visual_tests.yml | 241 | uses: actions/upload-artifact@v7 | COMMENT |
| LOW | buildscripts/packaging/Linux+BSD/mscore.1.preview.sh | 1 | #!/bin/sh | COMMENT |
| LOW | buildscripts/ci/tools/make_build_mode_env.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/tools/make_revision_env.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/tools/make_version_env.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/tools/make_release_channel_env.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/tools/make_branch_env.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/tools/checksum.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/tools/make_artifact_name_env.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/tools/make_build_number.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/tools/osuosl/publish.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/macos/setup_keychain.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/macos/build.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/macos/package.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/translation/s3_packandsend.sh | 1 | #!/bin/bash | COMMENT |
| LOW | buildscripts/ci/wasm/build.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/wasm/package.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/vtests/generate_pngs.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/vtests/build_and_pack.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/release/push_file_to_s3.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/release/make_empty_release_info_file.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/release/correct_release_info.py | 1 | #!/usr/bin/env python3 | COMMENT |
| LOW | buildscripts/ci/release/get_file_from_s3.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/release/make_previous_releases_notes.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/release/collate_release_binaries.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | …ipts/ci/release/append_release_to_previous_releases.py | 1 | #!/usr/bin/env python3 | COMMENT |
| LOW | buildscripts/ci/release/make_tag_name.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/release/make_release_info_file.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/backend/setup.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildscripts/ci/backend/check_update_config_on_s3.sh | 1 | #!/usr/bin/env bash | COMMENT |
| 1068 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | share/instruments/update_instruments_xml.py | 65 | null='[null]' # value used in TSV when attributes or tags are to be omitted in XML | CODE |
| HIGH | share/instruments/update_instruments_xml.py | 535 | if tag == null or not tag: | STRING |
| HIGH | share/instruments/generate_tsv.py | 19 | null='[null]' # value to use in TSV when data is not specified in XML | CODE |
| HIGH | share/instruments/generate_tsv.py | 50 | def find_text(element, tagName, default='[null]'): | CODE |
| HIGH | share/instruments/generate_tsv.py | 84 | name = articulation.get('name', default='[null]') | CODE |
| HIGH⚡ | share/instruments/generate_tsv.py | 128 | staffTypePreset = stafftype.get('staffTypePreset', default=null) | CODE |
| HIGH⚡ | share/instruments/generate_tsv.py | 131 | except AttributeError: minA, maxA = (null, null) | CODE |
| HIGH⚡ | share/instruments/generate_tsv.py | 134 | except AttributeError: minP, maxP = (null, null) | CODE |
| HIGH⚡ | share/instruments/generate_tsv.py | 138 | channel_name = channel.get('name', default=null) | CODE |
| HIGH⚡ | share/instruments/generate_tsv.py | 161 | 'longName_it': italian[longName] if longName in italian else null, | CODE |
| HIGH⚡ | share/instruments/generate_tsv.py | 162 | 'longName_de': german[longName] if longName in german else null, | CODE |
| HIGH⚡ | share/instruments/generate_tsv.py | 164 | 'shortName_it': italian[shortName] if shortName in italian else null, | CODE |
| HIGH⚡ | share/instruments/generate_tsv.py | 165 | 'shortName_de': german[shortName] if shortName in german else null, | CODE |
| HIGH⚡ | share/instruments/generate_tsv.py | 167 | 'trackName_it': italian[trackName] if trackName in italian else null, | CODE |
| HIGH⚡ | share/instruments/generate_tsv.py | 168 | 'trackName_de': german[trackName] if trackName in german else null, | CODE |
| HIGH | share/instruments/generate_tsv.py | 192 | 'articulations': ';'.join(articulation.get('name', default=null) for articulation in instrument.findall('Arti | CODE |
| HIGH | share/instruments/generate_tsv.py | 200 | name = articulation.get('name', default=null) | CODE |
| HIGH | share/instruments/generate_tsv.py | 215 | pitch = drum.get('pitch', default=null) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pyproject.toml | 14 | # -------------------- | COMMENT |
| MEDIUM | src/project/tests/closeprojectscenariotests.cpp | 138 | // ─── Nothing to close ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/closeprojectscenariotests.cpp | 156 | // ─── A score with no pending changes ───────────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/closeprojectscenariotests.cpp | 229 | // ─── A score with unsaved changes ──────────────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/closeprojectscenariotests.cpp | 310 | // ─── Playback ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/closeprojectscenariotests.cpp | 337 | // ─── One close at a time ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/saveprojectscenariotests.cpp | 349 | // ─── Where does the score go: ask, or save silently ────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/saveprojectscenariotests.cpp | 566 | // ─── One save at a time ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/saveprojectscenariotests.cpp | 612 | // ─── The public entry point used by the close and quit flows ───────────────── | COMMENT |
| MEDIUM | src/project/tests/saveprojectscenariotests.cpp | 679 | // ─── Writing to disk ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/saveprojectscenariotests.cpp | 780 | // ─── Saving a score that reports problems ──────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/saveprojectscenariotests.cpp | 813 | // ─── The score became corrupted while being written ────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/saveprojectscenariotests.cpp | 887 | // ─── Saving to the cloud ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/saveprojectscenariotests.cpp | 1021 | // ─── Up-to-date cloud details before uploading ─────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/saveprojectscenariotests.cpp | 1073 | // ─── Uploading ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/saveprojectscenariotests.cpp | 1267 | // ─── Whether an mp3 is generated for the cloud ─────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/saveprojectscenariotests.cpp | 1340 | // ─── Giving up on a corrupted score ────────────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/saveprojectscenariotests.cpp | 1406 | // ─── Publishing ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/openprojectscenariotests.cpp | 269 | // ─── Which kind of thing are we being asked to open ────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/openprojectscenariotests.cpp | 353 | // ─── Deciding where the score should be opened ─────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/openprojectscenariotests.cpp | 430 | // ─── Which page a score opens on ───────────────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/openprojectscenariotests.cpp | 476 | // ─── Cloud scores ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/openprojectscenariotests.cpp | 543 | // ─── One open at a time ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/openprojectscenariotests.cpp | 572 | // ─── Opening from a command ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/openprojectscenariotests.cpp | 591 | // ─── Downloading a cloud score ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/openprojectscenariotests.cpp | 731 | // ─── Opening a musescore.com link ──────────────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/openprojectscenariotests.cpp | 797 | // ─── A file that will not load on the first try ────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/openprojectscenariotests.cpp | 926 | // ─── Unsaved work from a previous session ──────────────────────────────────── | COMMENT |
| MEDIUM | src/project/tests/openprojectscenariotests.cpp | 957 | // ─── Can the app open this at all ──────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ving/automation/internal/scoreautomationcontroller.cpp | 523 | // Step 1: segment dynamics (+ tempo/pause when relevant): populates ctx.dynamicPriorities | COMMENT |
| LOW⚡ | …ving/automation/internal/scoreautomationcontroller.cpp | 580 | // Step 2: spanner points (+ gradual tempo change when relevant): | COMMENT |
| LOW⚡ | …ving/automation/internal/scoreautomationcontroller.cpp | 587 | // Step 3: resolve pending tempo resets now that noRepeatTempoCurve is fully built | COMMENT |
| LOW⚡ | …ving/automation/internal/scoreautomationcontroller.cpp | 590 | // Step 4: fill each voice curve with any points from the base (all-voice) curve it doesn't already have | COMMENT |
| LOW⚡ | …ving/automation/internal/scoreautomationcontroller.cpp | 593 | // Step 5: measure repeats | COMMENT |
| LOW⚡ | …ving/automation/internal/scoreautomationcontroller.cpp | 596 | // Step 6: Mirror directly-authored points to repeats | COMMENT |
| LOW | src/project/internal/notationproject.cpp | 679 | // Step 1: check writable | COMMENT |
| LOW | src/project/internal/notationproject.cpp | 696 | // Step 2: write project | COMMENT |
| LOW⚡ | src/project/internal/notationproject.cpp | 772 | // Step 3: create backup if need | COMMENT |
| LOW⚡ | src/project/internal/notationproject.cpp | 779 | // Step 4: replace to saved file | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ving/automation/internal/scoreautomationcontroller.cpp | 523 | // Step 1: segment dynamics (+ tempo/pause when relevant): populates ctx.dynamicPriorities | COMMENT |
| LOW⚡ | …ving/automation/internal/scoreautomationcontroller.cpp | 580 | // Step 2: spanner points (+ gradual tempo change when relevant): | COMMENT |
| LOW⚡ | …ving/automation/internal/scoreautomationcontroller.cpp | 587 | // Step 3: resolve pending tempo resets now that noRepeatTempoCurve is fully built | COMMENT |
| LOW⚡ | …ving/automation/internal/scoreautomationcontroller.cpp | 590 | // Step 4: fill each voice curve with any points from the base (all-voice) curve it doesn't already have | COMMENT |
| LOW⚡ | …ving/automation/internal/scoreautomationcontroller.cpp | 593 | // Step 5: measure repeats | COMMENT |
| LOW⚡ | …ving/automation/internal/scoreautomationcontroller.cpp | 596 | // Step 6: Mirror directly-authored points to repeats | COMMENT |
| LOW | src/project/internal/notationproject.cpp | 679 | // Step 1: check writable | COMMENT |
| LOW | src/project/internal/notationproject.cpp | 696 | // Step 2: write project | COMMENT |
| LOW⚡ | src/project/internal/notationproject.cpp | 772 | // Step 3: create backup if need | COMMENT |
| LOW⚡ | src/project/internal/notationproject.cpp | 779 | // Step 4: replace to saved file | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | share/instruments/update_instruments_xml.py | 139 | # Helper functions to facilitate building the XML tree | COMMENT |
| MEDIUM | share/instruments/update_instruments_xml.py | 388 | # Helper functions to facilitate writing instrumentsxml.h | COMMENT |
| MEDIUM | …nScene/percussionpanel/percussionpanelpadlistmodel.cpp | 179 | //! NOTE: Pitch + drum name isn't exactly the most robust identifier, but this will probably change with the new | COMMENT |
| MEDIUM | src/engraving/dom/realizedharmony.cpp | 122 | case Voicing::AUTO: //auto is close voicing for now since it is the most robust | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/harmony_to_diagram/parse_mscx.py | 5 | def extract_fret_harmony_pairs(mscx_path): | CODE |
| LOW | tools/harmony_to_diagram/parse_mscx.py | 31 | def remove_barre_overlapping_dots(fret_elem, offset): | CODE |
| LOW | tools/harmony_to_diagram/parse_mscx.py | 47 | def extract_pattern_from_fretdiagram(fret_elem): | CODE |
| LOW | share/instruments/update_instruments_xml.py | 68 | def download_google_spreadsheet(sheet): | CODE |
| LOW | share/instruments/update_instruments_xml.py | 116 | def google_spreadsheet_to_indexed_dict(sheet, headers_row, primary_index_col, secondary_index_col=None): | CODE |
| LOW | share/instruments/update_instruments_xml.py | 399 | def add_translatable_string_if_not_null(f: io.TextIOWrapper, context: str, text: str, disambiguation: str = '', comment: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/translations/process_source_ts_files.py | 65 | eprint(f'Error in translatable string: "{message.find("source").text}"') | CODE |
| MEDIUM | share/instruments/update_instruments_xml.py | 29 | eprint(f"Error: Encoding is '{encoding}': Python is not running in UTF-8 mode.") | CODE |
| MEDIUM | share/instruments/generate_tsv.py | 10 | eprint(f"Error: Encoding is '{encoding}': Python is not running in UTF-8 mode.") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | buildscripts/ci/tools/osuosl/publish.sh | 98 | : # Do nothing. zsync file is in the right place on OSUOSL, but don't forget to upload it to GitHub Releases | CODE |
| LOW | buildscripts/ci/tools/osuosl/publish.sh | 98 | : # Do nothing. zsync file is in the right place on OSUOSL, but don't forget to upload it to GitHub Releases | CODE |
| LOW | src/notationscene/inotationcommandscontroller.h | 44 | //! Don't forget to reset the current view controller when deleting, but only if it is the current one. | COMMENT |
| LOW | src/engraving/rendering/score/tlayout.cpp | 2549 | // When changing how bbox is calculated, don't forget to update the centerX and rightX methods too. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/harmony_to_diagram/parse_mscx.py | 31 | CODE | |
| LOW | tools/harmony_to_diagram/parse_mscx.py | 47 | CODE | |
| LOW | tools/harmony_to_diagram/parse_mscx.py | 139 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/translations/run_lupdate.sh | 22 | # Usage: | COMMENT |
| LOW | src/engraving/api/v1/style.h | 38 | /// Usage example: | COMMENT |