{"id":15209617,"url":"https://github.com/ifimust/chordless","last_synced_at":"2026-01-07T11:37:52.281Z","repository":{"id":251082291,"uuid":"830143646","full_name":"ifIMust/chordless","owner":"ifIMust","description":"Analyze MIDI notes. Display which notes/chords are played.","archived":false,"fork":false,"pushed_at":"2024-07-31T15:20:53.000Z","size":192,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-14T13:39:51.540Z","etag":null,"topics":["alsa","boost","cmake-presets","gtest","midi","music","qml","qt6"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":false,"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/ifIMust.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}},"created_at":"2024-07-17T17:18:36.000Z","updated_at":"2024-08-10T04:17:20.000Z","dependencies_parsed_at":"2024-07-31T20:49:57.812Z","dependency_job_id":null,"html_url":"https://github.com/ifIMust/chordless","commit_stats":null,"previous_names":["ifimust/chordless"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ifIMust%2Fchordless","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ifIMust%2Fchordless/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ifIMust%2Fchordless/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ifIMust%2Fchordless/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ifIMust","download_url":"https://codeload.github.com/ifIMust/chordless/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245950399,"owners_count":20699065,"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":["alsa","boost","cmake-presets","gtest","midi","music","qml","qt6"],"created_at":"2024-09-28T07:41:43.056Z","updated_at":"2026-01-07T11:37:52.276Z","avatar_url":"https://github.com/ifIMust.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# chordless\n## Description\nchordless is a MIDI note analyzer that runs on Linux.\nAny modern Linux version (i.e. with ALSA) should work.\n\nThe initial project goals are partially completed.\n\n### Project Goals\n- Display currently \"on\" notes from a MIDI instrument (DONE)\n- Display chord names matching the note structure (DONE)\n- Flesh out supported chords with all typical chord types and inversions (IN PROGRESS)\n- Customize displayed info using GUI controls (IN PROGRESS - octave display, sharp/flat preference, best chord only, bass-only matching)\n- Conform to the [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html).\n\n## Compiling\nRequirements:\n- CMake 3.25+\n- Ninja build system\n- Qt 6.3 dev files\n- OpenGL dev files required by Qt6\n- ALSA dev files\n- Boost program_options and json dev files\n- An internet connection, since gtest 1.15.0 is downloaded from github during the build\n\n### Install Dependencies\n\n**Debian/Ubuntu:**\n```bash\nsudo apt install -y cmake ninja-build qt6-base-dev qt6-declarative-dev libgl1-mesa-dev libasound2-dev libboost-json1.81-dev libboost-program-options1.81-dev\n```\n\n**Fedora:**\n```bash\nsudo dnf install -y cmake ninja-build qt6-qtbase-devel qt6-qtdeclarative-devel mesa-libGL-devel alsa-lib-devel boost-devel libstdc++-static\n```\n\n### Build Instructions\n\n**Release Build:**\n```bash\ncmake --workflow --preset release\n# Binary location: build/release/chordless\n```\n\n**Debug Build (with tests and coverage):**\n```bash\ncmake --workflow --preset debug\n# Binary location: build/debug/chordless\n# Run tests: ctest --test-dir build/debug\n# Coverage report: ./coverage_summary.sh\n```\n\n## Usage\nIn addition to compile dependencies, `qml6-module-qtquick-templates` is used at runtime.\n\nRunning `build/release/chordless` from the project root will use the provided `chords.json` config file.\nUse `chordless -c FILE_NAME` to specify a different chord configuration or path.\n\nAn ALSA MIDI input port is opened when the application launches.\nUse an ALSA utility such as `aconnectgui` to connect your MIDI instrument to chordless.\nNotes are read from all MIDI channels, and all other MIDI traffic is ignored.\n\n### Testing without MIDI Hardware\nFor testing without a physical MIDI device, see [notespew/README.md](notespew/README.md).\n\n![chordless and aconnectgui](/screenshot.png?raw=true \"Screenshot\")\n\n## Development\n\n### Testing\nThe project includes comprehensive unit tests using Google Test:\n```bash\n# Run all tests\ncmake --workflow --preset debug\n\n# Check test coverage (requires debug build)\n./coverage_summary.sh\n```\n\n### Architecture\nThe codebase is organized into several modules:\n- **note/**: Note naming, event handling, and observation\n- **chord/**: Chord matching and analysis\n- **input/**: ALSA MIDI input handling\n- **settings/**: Configuration management\n\nKey components:\n- `NoteObserver`: Base class for note change notifications\n- `ChordMatcher`: Analyzes note patterns to identify chords\n- `ScientificNoteNamer`: Converts MIDI notes to scientific notation (e.g., \"C₄\")\n\n## Planned steps\n- Deploy as portable AppImage package that includes dependencies\n- Use a config file for general program settings\n- Update project screenshot(s) to reflect current UI and features\n\n## Features\n\n### Bass-Only Matching (Relaxed Chord Recognition)\nThe \"Bass Only\" mode enables relaxed chord matching that focuses on harmony from the bass notes upward. This is useful when playing melody notes above a chord voicing.\n\n**How it works:**\n- Starting from the lowest note, analyzes ascending notes progressively\n- Stops at the first non-matching note in the pattern\n- Returns the best chord match found in the contiguous bass notes\n- Ignores non-chord tones, passing tones, and melody notes above the chord\n\n**UI Control:** Toggle the \"Bass Only\" checkbox in the application.\n\nSee [doc/CHORDS.md](doc/CHORDS.md) for detailed algorithm explanation and testing instructions.\n\n## Further work\n- Inversion notation display options\n  - Control whether and how chord inversions are displayed\n  - Options could include: Off, Classical (figured bass), Slash notation (C/E), Plain English (\"2nd Inversion\")\n  - UI widget to select display preference\n- Select key/mode, for improved chord naming/analysis\n- JACK MIDI input\n- Sustain checkbox: Keep notes on, respecting sustain pedal\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fifimust%2Fchordless","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fifimust%2Fchordless","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fifimust%2Fchordless/lists"}