head_music 8.1.1 → 8.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/bug_report.md +31 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +25 -0
- data/.github/dependabot.yml +59 -0
- data/.github/pull_request_template.md +26 -0
- data/.github/workflows/ci.yml +68 -0
- data/.github/workflows/release.yml +49 -0
- data/.github/workflows/security.yml +32 -0
- data/.gitignore +16 -1
- data/.rubocop.yml +4 -1
- data/.yardopts +16 -0
- data/CHANGELOG.md +198 -0
- data/CODE_OF_CONDUCT.md +2 -0
- data/CONTRIBUTING.md +143 -0
- data/Gemfile +7 -2
- data/Gemfile.lock +147 -0
- data/README.md +100 -11
- data/Rakefile +30 -0
- data/head_music.gemspec +13 -2
- data/lib/head_music/analysis/diatonic_interval.rb +1 -1
- data/lib/head_music/rudiment/solmization.rb +1 -1
- data/lib/head_music/version.rb +1 -1
- metadata +50 -8
- data/.circleci/config.yml +0 -22
- data/.circleci/setup-rubygems.sh +0 -3
- data/.travis.yml +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 416b7cd967ad8295f84cc17ee87c66fbc1eda60a66b8987a4cbeaf7ee3165ead
|
4
|
+
data.tar.gz: 8aca723bdede512365429a9eb3e5904bbab4473e40674a39d57c3977e73e9ffb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3769150439e444f72ab9fd98b567171fb1627badf985daa32fb82aa97abbe2e0b4ef39d1052baf3dc1d890d12a86e98e6767e7e9216f110768fe5c37b47ab5f1
|
7
|
+
data.tar.gz: 9371fe711f5b1533722571e4159306eab475f404d79f835b2ee1f9afbcb7a6bde95c7d516bdbf7d274ba846ce70b0d261f6de416534e1217df691ee4dcfcdc0b
|
@@ -0,0 +1,31 @@
|
|
1
|
+
---
|
2
|
+
name: Bug report
|
3
|
+
about: Create a report to help us improve
|
4
|
+
title: ''
|
5
|
+
labels: bug
|
6
|
+
assignees: ''
|
7
|
+
|
8
|
+
---
|
9
|
+
|
10
|
+
**Describe the bug**
|
11
|
+
A clear and concise description of what the bug is.
|
12
|
+
|
13
|
+
**To Reproduce**
|
14
|
+
Steps to reproduce the behavior:
|
15
|
+
```ruby
|
16
|
+
# Example code that demonstrates the issue
|
17
|
+
```
|
18
|
+
|
19
|
+
**Expected behavior**
|
20
|
+
A clear and concise description of what you expected to happen.
|
21
|
+
|
22
|
+
**Actual behavior**
|
23
|
+
What actually happened instead.
|
24
|
+
|
25
|
+
**Environment:**
|
26
|
+
- Ruby version: [e.g. 3.3.0]
|
27
|
+
- head_music version: [e.g. 8.1.1]
|
28
|
+
- OS: [e.g. macOS 14.0]
|
29
|
+
|
30
|
+
**Additional context**
|
31
|
+
Add any other context about the problem here.
|
@@ -0,0 +1,25 @@
|
|
1
|
+
---
|
2
|
+
name: Feature request
|
3
|
+
about: Suggest an idea for this project
|
4
|
+
title: ''
|
5
|
+
labels: enhancement
|
6
|
+
assignees: ''
|
7
|
+
|
8
|
+
---
|
9
|
+
|
10
|
+
**Is your feature request related to a problem? Please describe.**
|
11
|
+
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
12
|
+
|
13
|
+
**Describe the solution you'd like**
|
14
|
+
A clear and concise description of what you want to happen.
|
15
|
+
|
16
|
+
**Describe alternatives you've considered**
|
17
|
+
A clear and concise description of any alternative solutions or features you've considered.
|
18
|
+
|
19
|
+
**Example usage**
|
20
|
+
```ruby
|
21
|
+
# Show how the feature would be used
|
22
|
+
```
|
23
|
+
|
24
|
+
**Additional context**
|
25
|
+
Add any other context or screenshots about the feature request here.
|
@@ -0,0 +1,59 @@
|
|
1
|
+
version: 2
|
2
|
+
updates:
|
3
|
+
# Enable version updates for Bundler (Ruby dependencies)
|
4
|
+
- package-ecosystem: "bundler"
|
5
|
+
directory: "/"
|
6
|
+
schedule:
|
7
|
+
interval: "weekly"
|
8
|
+
day: "monday"
|
9
|
+
time: "09:00"
|
10
|
+
timezone: "America/Los_Angeles"
|
11
|
+
open-pull-requests-limit: 5
|
12
|
+
reviewers:
|
13
|
+
- "roberthead"
|
14
|
+
assignees:
|
15
|
+
- "roberthead"
|
16
|
+
commit-message:
|
17
|
+
prefix: "deps"
|
18
|
+
prefix-development: "deps-dev"
|
19
|
+
include: "scope"
|
20
|
+
labels:
|
21
|
+
- "dependencies"
|
22
|
+
# Group minor and patch updates together to reduce noise
|
23
|
+
groups:
|
24
|
+
minor-and-patch:
|
25
|
+
patterns:
|
26
|
+
- "*"
|
27
|
+
update-types:
|
28
|
+
- "minor"
|
29
|
+
- "patch"
|
30
|
+
# Allow both direct and indirect dependencies
|
31
|
+
allow:
|
32
|
+
- dependency-type: "direct"
|
33
|
+
- dependency-type: "indirect"
|
34
|
+
# Ignore major version updates for stable dependencies
|
35
|
+
ignore:
|
36
|
+
- dependency-name: "activesupport"
|
37
|
+
update-types: ["version-update:semver-major"]
|
38
|
+
- dependency-name: "i18n"
|
39
|
+
update-types: ["version-update:semver-major"]
|
40
|
+
|
41
|
+
# Enable version updates for GitHub Actions
|
42
|
+
- package-ecosystem: "github-actions"
|
43
|
+
directory: "/"
|
44
|
+
schedule:
|
45
|
+
interval: "weekly"
|
46
|
+
day: "monday"
|
47
|
+
time: "09:00"
|
48
|
+
timezone: "America/Los_Angeles"
|
49
|
+
open-pull-requests-limit: 3
|
50
|
+
reviewers:
|
51
|
+
- "roberthead"
|
52
|
+
assignees:
|
53
|
+
- "roberthead"
|
54
|
+
commit-message:
|
55
|
+
prefix: "ci"
|
56
|
+
include: "scope"
|
57
|
+
labels:
|
58
|
+
- "ci"
|
59
|
+
- "dependencies"
|
@@ -0,0 +1,26 @@
|
|
1
|
+
## Description
|
2
|
+
<!-- Describe your changes in detail -->
|
3
|
+
|
4
|
+
## Type of Change
|
5
|
+
<!-- Mark relevant options with an "x" -->
|
6
|
+
|
7
|
+
- [ ] Bug fix (non-breaking change which fixes an issue)
|
8
|
+
- [ ] New feature (non-breaking change which adds functionality)
|
9
|
+
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
10
|
+
- [ ] Documentation update
|
11
|
+
|
12
|
+
## Testing
|
13
|
+
<!-- Describe the tests you ran to verify your changes -->
|
14
|
+
|
15
|
+
- [ ] All tests pass locally with `bundle exec rspec`
|
16
|
+
- [ ] Code follows style guidelines (`bundle exec rubocop` passes)
|
17
|
+
- [ ] I have added tests that prove my fix is effective or that my feature works
|
18
|
+
- [ ] New and existing unit tests pass locally with my changes
|
19
|
+
|
20
|
+
## Checklist
|
21
|
+
|
22
|
+
- [ ] My code follows the style guidelines of this project
|
23
|
+
- [ ] I have performed a self-review of my own code
|
24
|
+
- [ ] I have commented my code, particularly in hard-to-understand areas
|
25
|
+
- [ ] I have made corresponding changes to the documentation
|
26
|
+
- [ ] My changes generate no new warnings
|
@@ -0,0 +1,68 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ main ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ main ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
test:
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
strategy:
|
13
|
+
fail-fast: false
|
14
|
+
matrix:
|
15
|
+
ruby-version: ['3.3.0', '3.3', '3.4']
|
16
|
+
|
17
|
+
steps:
|
18
|
+
- uses: actions/checkout@v4
|
19
|
+
|
20
|
+
- name: Set up Ruby ${{ matrix.ruby-version }}
|
21
|
+
uses: ruby/setup-ruby@v1
|
22
|
+
with:
|
23
|
+
ruby-version: ${{ matrix.ruby-version }}
|
24
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems
|
25
|
+
|
26
|
+
- name: Run tests
|
27
|
+
run: bundle exec rspec
|
28
|
+
|
29
|
+
- name: Upload coverage to Codecov
|
30
|
+
if: matrix.ruby-version == '3.3.0'
|
31
|
+
uses: codecov/codecov-action@v4
|
32
|
+
with:
|
33
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
34
|
+
fail_ci_if_error: false
|
35
|
+
verbose: true
|
36
|
+
|
37
|
+
lint:
|
38
|
+
runs-on: ubuntu-latest
|
39
|
+
steps:
|
40
|
+
- uses: actions/checkout@v4
|
41
|
+
|
42
|
+
- name: Set up Ruby
|
43
|
+
uses: ruby/setup-ruby@v1
|
44
|
+
with:
|
45
|
+
ruby-version: '3.3.0'
|
46
|
+
bundler-cache: true
|
47
|
+
|
48
|
+
- name: Run RuboCop
|
49
|
+
run: bundle exec rubocop
|
50
|
+
|
51
|
+
build:
|
52
|
+
runs-on: ubuntu-latest
|
53
|
+
steps:
|
54
|
+
- uses: actions/checkout@v4
|
55
|
+
|
56
|
+
- name: Set up Ruby
|
57
|
+
uses: ruby/setup-ruby@v1
|
58
|
+
with:
|
59
|
+
ruby-version: '3.3.0'
|
60
|
+
bundler-cache: true
|
61
|
+
|
62
|
+
- name: Build gem
|
63
|
+
run: gem build *.gemspec
|
64
|
+
|
65
|
+
- name: Check gem
|
66
|
+
run: |
|
67
|
+
gem install *.gem
|
68
|
+
gem specification *.gem
|
@@ -0,0 +1,49 @@
|
|
1
|
+
name: Release
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
tags:
|
6
|
+
- 'v*'
|
7
|
+
|
8
|
+
jobs:
|
9
|
+
release:
|
10
|
+
runs-on: ubuntu-latest
|
11
|
+
permissions:
|
12
|
+
contents: write
|
13
|
+
id-token: write
|
14
|
+
|
15
|
+
steps:
|
16
|
+
- uses: actions/checkout@v4
|
17
|
+
|
18
|
+
- name: Set up Ruby
|
19
|
+
uses: ruby/setup-ruby@v1
|
20
|
+
with:
|
21
|
+
ruby-version: '3.3.0'
|
22
|
+
bundler-cache: true
|
23
|
+
|
24
|
+
- name: Run tests
|
25
|
+
run: bundle exec rspec
|
26
|
+
|
27
|
+
- name: Run linter
|
28
|
+
run: bundle exec rubocop
|
29
|
+
|
30
|
+
- name: Build gem
|
31
|
+
run: gem build *.gemspec
|
32
|
+
|
33
|
+
- name: Create GitHub Release
|
34
|
+
uses: softprops/action-gh-release@v1
|
35
|
+
with:
|
36
|
+
files: '*.gem'
|
37
|
+
generate_release_notes: true
|
38
|
+
env:
|
39
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
40
|
+
|
41
|
+
- name: Publish to RubyGems
|
42
|
+
run: |
|
43
|
+
mkdir -p $HOME/.gem
|
44
|
+
touch $HOME/.gem/credentials
|
45
|
+
chmod 0600 $HOME/.gem/credentials
|
46
|
+
printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
|
47
|
+
gem push *.gem
|
48
|
+
env:
|
49
|
+
GEM_HOST_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
name: Security
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ main ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ main ]
|
8
|
+
schedule:
|
9
|
+
# Run security checks daily at 9 AM UTC
|
10
|
+
- cron: '0 9 * * *'
|
11
|
+
|
12
|
+
jobs:
|
13
|
+
security:
|
14
|
+
runs-on: ubuntu-latest
|
15
|
+
|
16
|
+
steps:
|
17
|
+
- uses: actions/checkout@v4
|
18
|
+
|
19
|
+
- name: Set up Ruby
|
20
|
+
uses: ruby/setup-ruby@v1
|
21
|
+
with:
|
22
|
+
ruby-version: '3.3.0'
|
23
|
+
bundler-cache: true
|
24
|
+
|
25
|
+
- name: Install bundler-audit
|
26
|
+
run: gem install bundler-audit
|
27
|
+
|
28
|
+
- name: Run bundler-audit
|
29
|
+
run: bundle-audit check --update
|
30
|
+
|
31
|
+
- name: Run RuboCop Security
|
32
|
+
run: bundle exec rubocop --only Security
|
data/.gitignore
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
/.bundle/
|
2
2
|
/.yardoc
|
3
|
-
/Gemfile.lock
|
4
3
|
/_yardoc/
|
5
4
|
/coverage/
|
6
5
|
/doc/
|
@@ -9,5 +8,21 @@
|
|
9
8
|
/tmp/
|
10
9
|
/spec/examples.txt
|
11
10
|
*.gem
|
11
|
+
.DS_Store
|
12
12
|
|
13
|
+
# Editor directories and files
|
14
|
+
.idea/
|
15
|
+
.vscode/
|
16
|
+
*.swp
|
17
|
+
*.swo
|
18
|
+
*~
|
19
|
+
|
20
|
+
# RubyMine
|
21
|
+
.idea/
|
22
|
+
|
23
|
+
# Local environment
|
24
|
+
.env.local
|
25
|
+
.env.*.local
|
26
|
+
|
27
|
+
# Claude settings
|
13
28
|
**/.claude/settings.local.json
|
data/.rubocop.yml
CHANGED
@@ -13,7 +13,7 @@ AllCops:
|
|
13
13
|
Exclude:
|
14
14
|
- public/**/*
|
15
15
|
- vendor/**/*
|
16
|
-
TargetRubyVersion: 3.
|
16
|
+
TargetRubyVersion: 3.3.0
|
17
17
|
|
18
18
|
RSpec:
|
19
19
|
Enabled: true
|
@@ -33,3 +33,6 @@ RSpec/MultipleExpectations:
|
|
33
33
|
|
34
34
|
RSpec/NestedGroups:
|
35
35
|
Max: 5
|
36
|
+
|
37
|
+
RSpec/MultipleMemoizedHelpers:
|
38
|
+
Max: 12
|
data/.yardopts
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
--markup markdown
|
2
|
+
--markup-provider kramdown
|
3
|
+
--output-dir doc
|
4
|
+
--protected
|
5
|
+
--private
|
6
|
+
--embed-mixins
|
7
|
+
--hide-void-return
|
8
|
+
--no-progress
|
9
|
+
--title "HeadMusic API Documentation"
|
10
|
+
--quiet
|
11
|
+
lib/**/*.rb
|
12
|
+
-
|
13
|
+
README.md
|
14
|
+
CHANGELOG.md
|
15
|
+
CONTRIBUTING.md
|
16
|
+
LICENSE.txt
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,198 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
|
+
|
8
|
+
## [Unreleased]
|
9
|
+
|
10
|
+
## [8.2.0] - 2025-06-20
|
11
|
+
|
12
|
+
### Added
|
13
|
+
- Added comprehensive GitHub Actions CI/CD workflows (test matrix, security scanning, automated releases)
|
14
|
+
- Added security tooling with bundler-audit for vulnerability scanning
|
15
|
+
- Added YARD documentation generation with kramdown support
|
16
|
+
- Added SimpleCov coverage tracking with 90% threshold and branch coverage
|
17
|
+
- Added Dependabot configuration for automated dependency updates
|
18
|
+
- Added inclusive CONTRIBUTING.md with comprehensive contribution guidelines
|
19
|
+
- Added complete CHANGELOG.md tracking version history
|
20
|
+
- Added GitHub issue templates (bug reports, feature requests) and PR template
|
21
|
+
- Added gemspec metadata fields for better gem documentation and security
|
22
|
+
- Added rubygems_mfa_required for enhanced security
|
23
|
+
|
24
|
+
### Changed
|
25
|
+
- Standardized Ruby version requirement to 3.3.0 across all configuration files
|
26
|
+
- Updated and organized development dependencies (removed deprecated codeclimate-test-reporter)
|
27
|
+
- Enhanced .gitignore with modern patterns and restored Gemfile.lock tracking
|
28
|
+
- Improved RuboCop configuration (increased MultipleMemoizedHelpers max to 12)
|
29
|
+
- Enhanced Rakefile with quality, documentation, and coverage tasks
|
30
|
+
|
31
|
+
### Removed
|
32
|
+
- Removed outdated Travis CI and CircleCI configurations (replaced with GitHub Actions)
|
33
|
+
|
34
|
+
## [8.1.1] - 2024-12-20
|
35
|
+
|
36
|
+
### Changed
|
37
|
+
- Tweaked gemspec summary
|
38
|
+
|
39
|
+
## [8.1.0] - 2024-12-20
|
40
|
+
|
41
|
+
### Added
|
42
|
+
- Enhanced solmization support
|
43
|
+
|
44
|
+
### Changed
|
45
|
+
- Code cleanup and improvements
|
46
|
+
- Improved spec coverage
|
47
|
+
- Refactored melodic intervals to separate pitch and note concerns
|
48
|
+
|
49
|
+
## [8.0.2] - 2024-12-19
|
50
|
+
|
51
|
+
### Fixed
|
52
|
+
- RuboCop style fixes
|
53
|
+
|
54
|
+
### Changed
|
55
|
+
- Improved RuboCop configuration
|
56
|
+
|
57
|
+
## [8.0.0] - 2024-12-19
|
58
|
+
|
59
|
+
### Changed
|
60
|
+
- Major reorganization: moved specs into folders
|
61
|
+
- Organized models into modules for better structure
|
62
|
+
- **BREAKING**: Module structure changes may require updates to require statements
|
63
|
+
|
64
|
+
## [7.0.5] - 2024-01-20
|
65
|
+
|
66
|
+
### Changed
|
67
|
+
- Upgraded to Ruby 3.3.0
|
68
|
+
- Improvements to Spanish translations of recorder
|
69
|
+
|
70
|
+
## [7.0.4] - 2024-01-15
|
71
|
+
|
72
|
+
### Added
|
73
|
+
- Rudiment translations
|
74
|
+
- Instrument classification translations
|
75
|
+
- Interval translations
|
76
|
+
|
77
|
+
## [7.0.3] - 2024-01-10
|
78
|
+
|
79
|
+
### Added
|
80
|
+
- Russian instrument translations using Cyrillic characters
|
81
|
+
- Spanish translations for instruments
|
82
|
+
|
83
|
+
### Changed
|
84
|
+
- Uncapitalized languages in Italian and Spanish translations
|
85
|
+
- Spanish translation corrections and improvements
|
86
|
+
- Translation file cleanup
|
87
|
+
|
88
|
+
## [7.0.2] - 2023-12-15
|
89
|
+
|
90
|
+
### Changed
|
91
|
+
- Various improvements and bug fixes
|
92
|
+
|
93
|
+
## [7.0.1] - 2023-12-10
|
94
|
+
|
95
|
+
### Changed
|
96
|
+
- Minor improvements and bug fixes
|
97
|
+
|
98
|
+
## [7.0.0] - 2023-12-01
|
99
|
+
|
100
|
+
### Changed
|
101
|
+
- Major version bump indicating significant changes
|
102
|
+
- **BREAKING**: Check upgrade guide for migration instructions
|
103
|
+
|
104
|
+
## [6.0.1] - 2023-11-15
|
105
|
+
|
106
|
+
### Fixed
|
107
|
+
- Bug fixes and improvements
|
108
|
+
|
109
|
+
## [6.0.0] - 2023-11-01
|
110
|
+
|
111
|
+
### Changed
|
112
|
+
- Major architectural improvements
|
113
|
+
- **BREAKING**: API changes may require code updates
|
114
|
+
|
115
|
+
## [5.0.0] - 2023-10-15
|
116
|
+
|
117
|
+
### Changed
|
118
|
+
- Significant refactoring of core components
|
119
|
+
- **BREAKING**: Check documentation for new API
|
120
|
+
|
121
|
+
## [4.0.1] - 2023-09-20
|
122
|
+
|
123
|
+
### Fixed
|
124
|
+
- Minor bug fixes
|
125
|
+
|
126
|
+
## [4.0.0] - 2023-09-15
|
127
|
+
|
128
|
+
### Added
|
129
|
+
- Expanded instrument support
|
130
|
+
- Instrument data improvements
|
131
|
+
|
132
|
+
### Changed
|
133
|
+
- Enhanced Instrument class functionality
|
134
|
+
|
135
|
+
## [3.0.1] - 2023-08-20
|
136
|
+
|
137
|
+
### Fixed
|
138
|
+
- Minor improvements and fixes
|
139
|
+
|
140
|
+
## [3.0.0] - 2023-08-15
|
141
|
+
|
142
|
+
### Changed
|
143
|
+
- Major version update with architectural improvements
|
144
|
+
- **BREAKING**: Significant API changes
|
145
|
+
|
146
|
+
## [2.0.0] - 2023-07-01
|
147
|
+
|
148
|
+
### Changed
|
149
|
+
- Major refactoring of core functionality
|
150
|
+
- **BREAKING**: API redesign
|
151
|
+
|
152
|
+
## [1.0.0] - 2023-06-01
|
153
|
+
|
154
|
+
### Added
|
155
|
+
- First stable release
|
156
|
+
- Complete music theory rudiments implementation
|
157
|
+
- Comprehensive scale and interval support
|
158
|
+
- Basic composition and voice handling
|
159
|
+
|
160
|
+
## [0.29.0] - 2023-05-15
|
161
|
+
|
162
|
+
### Added
|
163
|
+
- Additional music theory features
|
164
|
+
- Improved documentation
|
165
|
+
|
166
|
+
## [0.28.0] - 2023-05-01
|
167
|
+
|
168
|
+
### Changed
|
169
|
+
- Performance improvements
|
170
|
+
- Code organization enhancements
|
171
|
+
|
172
|
+
## Earlier versions
|
173
|
+
|
174
|
+
For changes in versions prior to 0.28.0, please refer to the git history.
|
175
|
+
|
176
|
+
[Unreleased]: https://github.com/roberthead/head_music/compare/v8.2.0...HEAD
|
177
|
+
[8.2.0]: https://github.com/roberthead/head_music/compare/v8.1.1...v8.2.0
|
178
|
+
[8.1.1]: https://github.com/roberthead/head_music/compare/v8.1.0...v8.1.1
|
179
|
+
[8.1.0]: https://github.com/roberthead/head_music/compare/v8.0.2...v8.1.0
|
180
|
+
[8.0.2]: https://github.com/roberthead/head_music/compare/v8.0.0...v8.0.2
|
181
|
+
[8.0.0]: https://github.com/roberthead/head_music/compare/v7.0.5...v8.0.0
|
182
|
+
[7.0.5]: https://github.com/roberthead/head_music/compare/v7.0.4...v7.0.5
|
183
|
+
[7.0.4]: https://github.com/roberthead/head_music/compare/v7.0.3...v7.0.4
|
184
|
+
[7.0.3]: https://github.com/roberthead/head_music/compare/v7.0.2...v7.0.3
|
185
|
+
[7.0.2]: https://github.com/roberthead/head_music/compare/v7.0.1...v7.0.2
|
186
|
+
[7.0.1]: https://github.com/roberthead/head_music/compare/v7.0.0...v7.0.1
|
187
|
+
[7.0.0]: https://github.com/roberthead/head_music/compare/v6.0.1...v7.0.0
|
188
|
+
[6.0.1]: https://github.com/roberthead/head_music/compare/v6.0.0...v6.0.1
|
189
|
+
[6.0.0]: https://github.com/roberthead/head_music/compare/v5.0.0...v6.0.0
|
190
|
+
[5.0.0]: https://github.com/roberthead/head_music/compare/v4.0.1...v5.0.0
|
191
|
+
[4.0.1]: https://github.com/roberthead/head_music/compare/v4.0.0...v4.0.1
|
192
|
+
[4.0.0]: https://github.com/roberthead/head_music/compare/v3.0.1...v4.0.0
|
193
|
+
[3.0.1]: https://github.com/roberthead/head_music/compare/v3.0.0...v3.0.1
|
194
|
+
[3.0.0]: https://github.com/roberthead/head_music/compare/v2.0.0...v3.0.0
|
195
|
+
[2.0.0]: https://github.com/roberthead/head_music/compare/v1.0.0...v2.0.0
|
196
|
+
[1.0.0]: https://github.com/roberthead/head_music/compare/v0.29.0...v1.0.0
|
197
|
+
[0.29.0]: https://github.com/roberthead/head_music/compare/v0.28.0...v0.29.0
|
198
|
+
[0.28.0]: https://github.com/roberthead/head_music/releases/tag/v0.28.0
|
data/CODE_OF_CONDUCT.md
CHANGED
@@ -19,6 +19,7 @@ include:
|
|
19
19
|
* Gracefully accepting constructive criticism
|
20
20
|
* Focusing on what is best for the community
|
21
21
|
* Showing empathy towards other community members
|
22
|
+
* Using inclusive language that respects all musical traditions and genres without suggesting the supremacy of any particular style.
|
22
23
|
|
23
24
|
Examples of unacceptable behavior by participants include:
|
24
25
|
|
@@ -27,6 +28,7 @@ Examples of unacceptable behavior by participants include:
|
|
27
28
|
* Public or private harassment
|
28
29
|
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
29
30
|
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
31
|
+
* Belittling any musical genre or tradition.
|
30
32
|
|
31
33
|
## Our Responsibilities
|
32
34
|
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,143 @@
|
|
1
|
+
# Contributing to HeadMusic
|
2
|
+
|
3
|
+
Thank you for considering contributing to HeadMusic!
|
4
|
+
|
5
|
+
Following these guidelines helps to communicate that you respect the team managing and developing this open source project. In return, we should reciprocate that respect in addressing your issue, assessing changes, and facilitating your pull requests.
|
6
|
+
|
7
|
+
## Code of Conduct
|
8
|
+
|
9
|
+
This project and everyone participating in it is governed by our [Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to [robert.head@gmail.com](mailto:robert.head@gmail.com).
|
10
|
+
|
11
|
+
## What we are looking for
|
12
|
+
|
13
|
+
HeadMusic is an open source project and we love to receive contributions from our community. There are many ways to contribute, from writing tutorials or blog posts, improving the documentation, submitting bug reports and feature requests or writing code which can be incorporated into HeadMusic itself.
|
14
|
+
|
15
|
+
## How to contribute
|
16
|
+
|
17
|
+
### Reporting Bugs
|
18
|
+
|
19
|
+
Before creating bug reports, please check the existing issues as you might find out that you don't need to create one. When you are creating a bug report, please include as many details as possible. Fill out [the required template](.github/ISSUE_TEMPLATE/bug_report.md), the information it asks for helps us resolve issues faster.
|
20
|
+
|
21
|
+
**Great Bug Reports** tend to have:
|
22
|
+
|
23
|
+
- A quick summary and/or background
|
24
|
+
- Steps to reproduce
|
25
|
+
- Be specific!
|
26
|
+
- Give sample code if you can
|
27
|
+
- What you expected would happen
|
28
|
+
- What actually happens
|
29
|
+
- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work)
|
30
|
+
|
31
|
+
### Suggesting Enhancements
|
32
|
+
|
33
|
+
Before creating enhancement suggestions, please check the existing issues as you might find out that you don't need to create one. When you are creating an enhancement suggestion, please include as many details as possible. Fill in [the template](.github/ISSUE_TEMPLATE/feature_request.md), including the steps that you imagine you would take if the feature you're requesting existed.
|
34
|
+
|
35
|
+
### Pull Requests
|
36
|
+
|
37
|
+
The process described here has several goals:
|
38
|
+
|
39
|
+
- Maintain HeadMusic's quality
|
40
|
+
- Fix problems that are important to users
|
41
|
+
- Engage the community in working toward the best possible HeadMusic
|
42
|
+
- Enable a sustainable system for HeadMusic's maintainers to review contributions
|
43
|
+
|
44
|
+
Please follow these steps to have your contribution considered by the maintainers:
|
45
|
+
|
46
|
+
1. Fork the repo and create your branch from `main`.
|
47
|
+
2. If you've added code that should be tested, add tests.
|
48
|
+
3. If you've changed APIs, update the documentation.
|
49
|
+
4. Ensure the test suite passes (`bundle exec rspec`).
|
50
|
+
5. Make sure your code lints (`bundle exec rubocop`).
|
51
|
+
6. Follow the [pull request template](.github/pull_request_template.md) when creating your PR.
|
52
|
+
|
53
|
+
## Development Process
|
54
|
+
|
55
|
+
Here's how to get started with development:
|
56
|
+
|
57
|
+
1. Fork and clone the repository
|
58
|
+
2. Run `bin/setup` to install dependencies
|
59
|
+
3. Run `bundle exec rspec` to run the tests
|
60
|
+
4. Run `bundle exec rubocop` to check code style
|
61
|
+
5. Create a new branch for your feature or bug fix
|
62
|
+
6. Make your changes and add tests
|
63
|
+
7. Run the tests and linter to ensure everything passes
|
64
|
+
8. Commit your changes with a clear commit message
|
65
|
+
9. Push to your fork and submit a pull request
|
66
|
+
|
67
|
+
### Setting up your development environment
|
68
|
+
|
69
|
+
```bash
|
70
|
+
git clone https://github.com/your-username/head_music.git
|
71
|
+
cd head_music
|
72
|
+
bin/setup
|
73
|
+
```
|
74
|
+
|
75
|
+
### Running tests
|
76
|
+
|
77
|
+
```bash
|
78
|
+
# Run all tests
|
79
|
+
bundle exec rspec
|
80
|
+
|
81
|
+
# Run a specific test file
|
82
|
+
bundle exec rspec spec/head_music/rudiment/pitch_spec.rb
|
83
|
+
|
84
|
+
# Run tests matching a pattern
|
85
|
+
bundle exec rspec -e "Pitch"
|
86
|
+
```
|
87
|
+
|
88
|
+
### Code style
|
89
|
+
|
90
|
+
We use RuboCop with the Standard Ruby style guide. Before submitting a PR, please run:
|
91
|
+
|
92
|
+
```bash
|
93
|
+
bundle exec rubocop
|
94
|
+
```
|
95
|
+
|
96
|
+
To automatically fix many issues:
|
97
|
+
|
98
|
+
```bash
|
99
|
+
bundle exec rubocop --autocorrect
|
100
|
+
```
|
101
|
+
|
102
|
+
## Styleguides
|
103
|
+
|
104
|
+
### Git Commit Messages
|
105
|
+
|
106
|
+
- Use the present tense ("Add feature" not "Added feature")
|
107
|
+
- Use the imperative mood ("Move cursor to..." not "Moves cursor to...")
|
108
|
+
- Limit the first line to 72 characters or less
|
109
|
+
- Reference issues and pull requests liberally after the first line
|
110
|
+
- Consider starting the commit message with an applicable emoji:
|
111
|
+
- 🎨 `:art:` when improving the format/structure of the code
|
112
|
+
- 🐎 `:racehorse:` when improving performance
|
113
|
+
- 📝 `:memo:` when writing docs
|
114
|
+
- 🐛 `:bug:` when fixing a bug
|
115
|
+
- 🔥 `:fire:` when removing code or files
|
116
|
+
- ✅ `:white_check_mark:` when adding tests
|
117
|
+
- 🔒 `:lock:` when dealing with security
|
118
|
+
- ⬆️ `:arrow_up:` when upgrading dependencies
|
119
|
+
- ⬇️ `:arrow_down:` when downgrading dependencies
|
120
|
+
|
121
|
+
### Ruby Styleguide
|
122
|
+
|
123
|
+
All Ruby code must adhere to [Standard Ruby](https://github.com/testdouble/standard).
|
124
|
+
|
125
|
+
### Documentation Styleguide
|
126
|
+
|
127
|
+
- Use [YARD](https://yardoc.org/) for API documentation.
|
128
|
+
- Include examples in your documentation when possible.
|
129
|
+
|
130
|
+
## Community
|
131
|
+
|
132
|
+
- Join our discussions in [GitHub Discussions](https://github.com/roberthead/head_music/discussions)
|
133
|
+
- Ask questions in the [Issues](https://github.com/roberthead/head_music/issues)
|
134
|
+
|
135
|
+
## Recognition
|
136
|
+
|
137
|
+
Contributors who submit a pull request that gets merged will be added to our [Contributors list](https://github.com/roberthead/head_music/graphs/contributors).
|
138
|
+
|
139
|
+
## Questions?
|
140
|
+
|
141
|
+
Feel free to contact the project maintainer at [robert.head@gmail.com](mailto:robert.head@gmail.com) if you have any questions or concerns.
|
142
|
+
|
143
|
+
Thank you for contributing to HeadMusic! 🎵
|
data/Gemfile
CHANGED
@@ -8,9 +8,14 @@ gemspec
|
|
8
8
|
gem "standard", require: false
|
9
9
|
|
10
10
|
group :test do
|
11
|
-
gem "codeclimate-test-reporter", "~> 1.0.0"
|
12
11
|
gem "rubocop", require: false
|
13
12
|
gem "rubocop-rspec", require: false
|
14
13
|
gem "rubocop-rake", require: false
|
15
|
-
gem "simplecov"
|
14
|
+
gem "simplecov", require: false
|
15
|
+
end
|
16
|
+
|
17
|
+
group :development do
|
18
|
+
gem "bundler-audit", require: false
|
19
|
+
gem "yard", require: false
|
20
|
+
gem "kramdown", require: false
|
16
21
|
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
head_music (8.2.0)
|
5
|
+
activesupport (~> 7.0)
|
6
|
+
humanize (~> 2.0)
|
7
|
+
i18n (~> 1.8)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
activesupport (7.2.2.1)
|
13
|
+
base64
|
14
|
+
benchmark (>= 0.3)
|
15
|
+
bigdecimal
|
16
|
+
concurrent-ruby (~> 1.0, >= 1.3.1)
|
17
|
+
connection_pool (>= 2.2.5)
|
18
|
+
drb
|
19
|
+
i18n (>= 1.6, < 2)
|
20
|
+
logger (>= 1.4.2)
|
21
|
+
minitest (>= 5.1)
|
22
|
+
securerandom (>= 0.3)
|
23
|
+
tzinfo (~> 2.0, >= 2.0.5)
|
24
|
+
ast (2.4.3)
|
25
|
+
base64 (0.2.0)
|
26
|
+
benchmark (0.4.0)
|
27
|
+
bigdecimal (3.1.9)
|
28
|
+
bundler-audit (0.9.2)
|
29
|
+
bundler (>= 1.2.0, < 3)
|
30
|
+
thor (~> 1.0)
|
31
|
+
concurrent-ruby (1.3.5)
|
32
|
+
connection_pool (2.5.3)
|
33
|
+
diff-lcs (1.6.1)
|
34
|
+
docile (1.4.1)
|
35
|
+
drb (2.2.1)
|
36
|
+
humanize (2.5.1)
|
37
|
+
i18n (1.14.7)
|
38
|
+
concurrent-ruby (~> 1.0)
|
39
|
+
json (2.11.3)
|
40
|
+
kramdown (2.5.1)
|
41
|
+
rexml (>= 3.3.9)
|
42
|
+
language_server-protocol (3.17.0.4)
|
43
|
+
lint_roller (1.1.0)
|
44
|
+
logger (1.7.0)
|
45
|
+
minitest (5.25.5)
|
46
|
+
parallel (1.27.0)
|
47
|
+
parser (3.3.8.0)
|
48
|
+
ast (~> 2.4.1)
|
49
|
+
racc
|
50
|
+
prism (1.4.0)
|
51
|
+
racc (1.8.1)
|
52
|
+
rainbow (3.1.1)
|
53
|
+
rake (13.2.1)
|
54
|
+
regexp_parser (2.10.0)
|
55
|
+
rexml (3.4.1)
|
56
|
+
rspec (3.13.0)
|
57
|
+
rspec-core (~> 3.13.0)
|
58
|
+
rspec-expectations (~> 3.13.0)
|
59
|
+
rspec-mocks (~> 3.13.0)
|
60
|
+
rspec-core (3.13.3)
|
61
|
+
rspec-support (~> 3.13.0)
|
62
|
+
rspec-expectations (3.13.4)
|
63
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
64
|
+
rspec-support (~> 3.13.0)
|
65
|
+
rspec-its (1.3.1)
|
66
|
+
rspec-core (>= 3.0.0)
|
67
|
+
rspec-expectations (>= 3.0.0)
|
68
|
+
rspec-mocks (3.13.3)
|
69
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
70
|
+
rspec-support (~> 3.13.0)
|
71
|
+
rspec-support (3.13.3)
|
72
|
+
rubocop (1.75.4)
|
73
|
+
json (~> 2.3)
|
74
|
+
language_server-protocol (~> 3.17.0.2)
|
75
|
+
lint_roller (~> 1.1.0)
|
76
|
+
parallel (~> 1.10)
|
77
|
+
parser (>= 3.3.0.2)
|
78
|
+
rainbow (>= 2.2.2, < 4.0)
|
79
|
+
regexp_parser (>= 2.9.3, < 3.0)
|
80
|
+
rubocop-ast (>= 1.44.0, < 2.0)
|
81
|
+
ruby-progressbar (~> 1.7)
|
82
|
+
unicode-display_width (>= 2.4.0, < 4.0)
|
83
|
+
rubocop-ast (1.44.1)
|
84
|
+
parser (>= 3.3.7.2)
|
85
|
+
prism (~> 1.4)
|
86
|
+
rubocop-performance (1.25.0)
|
87
|
+
lint_roller (~> 1.1)
|
88
|
+
rubocop (>= 1.75.0, < 2.0)
|
89
|
+
rubocop-ast (>= 1.38.0, < 2.0)
|
90
|
+
rubocop-rake (0.7.1)
|
91
|
+
lint_roller (~> 1.1)
|
92
|
+
rubocop (>= 1.72.1)
|
93
|
+
rubocop-rspec (3.6.0)
|
94
|
+
lint_roller (~> 1.1)
|
95
|
+
rubocop (~> 1.72, >= 1.72.1)
|
96
|
+
ruby-progressbar (1.13.0)
|
97
|
+
securerandom (0.4.1)
|
98
|
+
simplecov (0.22.0)
|
99
|
+
docile (~> 1.1)
|
100
|
+
simplecov-html (~> 0.11)
|
101
|
+
simplecov_json_formatter (~> 0.1)
|
102
|
+
simplecov-html (0.13.1)
|
103
|
+
simplecov_json_formatter (0.1.4)
|
104
|
+
standard (1.49.0)
|
105
|
+
language_server-protocol (~> 3.17.0.2)
|
106
|
+
lint_roller (~> 1.0)
|
107
|
+
rubocop (~> 1.75.2)
|
108
|
+
standard-custom (~> 1.0.0)
|
109
|
+
standard-performance (~> 1.8)
|
110
|
+
standard-custom (1.0.2)
|
111
|
+
lint_roller (~> 1.0)
|
112
|
+
rubocop (~> 1.50)
|
113
|
+
standard-performance (1.8.0)
|
114
|
+
lint_roller (~> 1.1)
|
115
|
+
rubocop-performance (~> 1.25.0)
|
116
|
+
thor (1.3.2)
|
117
|
+
tzinfo (2.0.6)
|
118
|
+
concurrent-ruby (~> 1.0)
|
119
|
+
unicode-display_width (3.1.4)
|
120
|
+
unicode-emoji (~> 4.0, >= 4.0.4)
|
121
|
+
unicode-emoji (4.0.4)
|
122
|
+
yard (0.9.37)
|
123
|
+
|
124
|
+
PLATFORMS
|
125
|
+
arm64-darwin-22
|
126
|
+
arm64-darwin-23
|
127
|
+
x86_64-linux
|
128
|
+
|
129
|
+
DEPENDENCIES
|
130
|
+
bundler-audit
|
131
|
+
head_music!
|
132
|
+
kramdown
|
133
|
+
rake (~> 13.0)
|
134
|
+
rspec (~> 3.0)
|
135
|
+
rspec-its (~> 1.2)
|
136
|
+
rubocop
|
137
|
+
rubocop-rake
|
138
|
+
rubocop-rspec
|
139
|
+
simplecov
|
140
|
+
standard
|
141
|
+
yard
|
142
|
+
|
143
|
+
RUBY VERSION
|
144
|
+
ruby 3.3.0p0
|
145
|
+
|
146
|
+
BUNDLED WITH
|
147
|
+
2.4.12
|
data/README.md
CHANGED
@@ -1,10 +1,19 @@
|
|
1
1
|
# HeadMusic
|
2
2
|
|
3
|
-
](https://github.com/roberthead/head_music/actions)
|
4
|
+
[](https://github.com/roberthead/head_music/actions)
|
5
|
+
[](https://badge.fury.io/rb/head_music)
|
6
|
+
[](https://rubydoc.info/gems/head_music)
|
6
7
|
|
7
|
-
The
|
8
|
+
The **head_music** Ruby gem provides a toolkit for working with Western music theory. Model and manipulate the fundamental elements of music including pitches, scales, key signatures, intervals, and chords.
|
9
|
+
|
10
|
+
## Features
|
11
|
+
|
12
|
+
- **Western Music Theory Fundamentals**: Work with pitches, scales, intervals, chords, and key signatures
|
13
|
+
- **Musical Analysis**: Analyze harmonic progressions, voice leading, and counterpoint
|
14
|
+
- **Style Analysis**: Rules for species counterpoint and voice leading
|
15
|
+
- **Internationalization**: Support for multiple languages (English, French, German, Italian, Russian, Spanish)
|
16
|
+
- **Instrument Modeling**: Extensive database of musical instruments with ranges and properties
|
8
17
|
|
9
18
|
## Installation
|
10
19
|
|
@@ -16,27 +25,107 @@ gem 'head_music'
|
|
16
25
|
|
17
26
|
And then execute:
|
18
27
|
|
19
|
-
$ bundle
|
28
|
+
$ bundle install
|
20
29
|
|
21
30
|
Or install it yourself as:
|
22
31
|
|
23
32
|
$ gem install head_music
|
24
33
|
|
25
|
-
##
|
34
|
+
## Quick Start
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
require 'head_music'
|
38
|
+
|
39
|
+
# Work with pitches and intervals
|
40
|
+
pitch = HeadMusic::Rudiment::Pitch.get('C4')
|
41
|
+
higher_pitch = HeadMusic::Rudiment::Pitch.get('E4')
|
42
|
+
interval = HeadMusic::Analysis::DiatonicInterval.new(pitch, higher_pitch)
|
43
|
+
puts interval.name # => "major third"
|
44
|
+
|
45
|
+
# Create scales
|
46
|
+
scale = HeadMusic::Rudiment::Scale.get('C', :major)
|
47
|
+
puts scale.pitches.map(&:to_s) # => ["C4", "D4", "E4", "F4", "G4", "A4", "B4"]
|
48
|
+
|
49
|
+
# Analyze chords
|
50
|
+
pitches = %w[C4 E4 G4].map { |p| HeadMusic::Rudiment::Pitch.get(p) }
|
51
|
+
chord = HeadMusic::Analysis::PitchSet.new(pitches)
|
52
|
+
puts chord.major_triad? # => true
|
53
|
+
```
|
54
|
+
|
55
|
+
## Documentation
|
56
|
+
|
57
|
+
- **API Documentation**: [rubydoc.info/gems/head_music](https://rubydoc.info/gems/head_music)
|
58
|
+
- **Contributing Guide**: [CONTRIBUTING.md](CONTRIBUTING.md)
|
59
|
+
- **Changelog**: [CHANGELOG.md](CHANGELOG.md)
|
26
60
|
|
27
|
-
|
61
|
+
## Requirements
|
62
|
+
|
63
|
+
- Ruby 3.3.0 or higher
|
64
|
+
- ActiveSupport 7.0+
|
28
65
|
|
29
66
|
## Development
|
30
67
|
|
31
|
-
After checking out the repo, run `bin/setup` to install dependencies.
|
68
|
+
After checking out the repo, run `bin/setup` to install dependencies.
|
69
|
+
|
70
|
+
### Running Tests
|
71
|
+
|
72
|
+
```bash
|
73
|
+
# Run all tests
|
74
|
+
bundle exec rspec
|
75
|
+
|
76
|
+
# Run tests with coverage
|
77
|
+
bundle exec rake
|
78
|
+
|
79
|
+
# Run quality checks (tests + linting + security)
|
80
|
+
bundle exec rake quality
|
81
|
+
```
|
82
|
+
|
83
|
+
### Code Quality
|
84
|
+
|
85
|
+
```bash
|
86
|
+
# Run linting
|
87
|
+
bundle exec rubocop
|
32
88
|
|
33
|
-
|
89
|
+
# Run security audit
|
90
|
+
bundle exec rake bundle:audit:check
|
91
|
+
|
92
|
+
# Generate documentation
|
93
|
+
bundle exec rake doc
|
94
|
+
```
|
95
|
+
|
96
|
+
### Available Rake Tasks
|
97
|
+
|
98
|
+
- `rake spec` - Run tests
|
99
|
+
- `rake quality` - Run tests, linting, and security audit
|
100
|
+
- `rake doc` - Generate YARD documentation
|
101
|
+
- `rake doc_stats` - Show documentation coverage statistics
|
102
|
+
- `rake coverage` - Open coverage report in browser
|
34
103
|
|
35
104
|
## Contributing
|
36
105
|
|
37
|
-
|
106
|
+
We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
|
38
107
|
|
108
|
+
## Project Structure
|
109
|
+
|
110
|
+
```
|
111
|
+
lib/head_music/
|
112
|
+
├── analysis/ # Musical analysis tools (intervals, chords, etc.)
|
113
|
+
├── content/ # Musical content (compositions, voices, notes)
|
114
|
+
├── instruments/ # Instrument definitions and properties
|
115
|
+
├── rudiment/ # Basic music theory elements (pitches, scales, etc.)
|
116
|
+
└── style/ # Style analysis and composition rules
|
117
|
+
```
|
118
|
+
|
119
|
+
## Code of Conduct
|
120
|
+
|
121
|
+
This project is intended to be a safe, welcoming space for collaboration. Contributors are expected to adhere to our [Code of Conduct](CODE_OF_CONDUCT.md).
|
39
122
|
|
40
123
|
## License
|
41
124
|
|
42
|
-
The gem is available as open source under the terms of the [MIT License](
|
125
|
+
The gem is available as open source under the terms of the [MIT License](LICENSE.txt).
|
126
|
+
|
127
|
+
## Support
|
128
|
+
|
129
|
+
- **Issues**: [GitHub Issues](https://github.com/roberthead/head_music/issues)
|
130
|
+
- **Discussions**: [GitHub Discussions](https://github.com/roberthead/head_music/discussions)
|
131
|
+
- **Security**: For security issues, please email [robert.head@gmail.com](mailto:robert.head@gmail.com)
|
data/Rakefile
CHANGED
@@ -4,9 +4,39 @@ require "standard/rake"
|
|
4
4
|
|
5
5
|
RSpec::Core::RakeTask.new(:spec)
|
6
6
|
|
7
|
+
begin
|
8
|
+
require "yard"
|
9
|
+
YARD::Rake::YardocTask.new(:doc) do |t|
|
10
|
+
t.files = ["lib/**/*.rb"]
|
11
|
+
t.options = %w[--protected --private]
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Generate documentation and show stats"
|
15
|
+
task :doc_stats => :doc do
|
16
|
+
sh "yard stats --list-undoc"
|
17
|
+
end
|
18
|
+
rescue LoadError
|
19
|
+
# YARD not available
|
20
|
+
end
|
21
|
+
|
22
|
+
begin
|
23
|
+
require "bundler/audit/task"
|
24
|
+
Bundler::Audit::Task.new
|
25
|
+
rescue LoadError
|
26
|
+
# bundler-audit not available
|
27
|
+
end
|
28
|
+
|
7
29
|
task default: :spec
|
8
30
|
|
31
|
+
desc "Run all quality checks (tests, linting, security audit)"
|
32
|
+
task :quality => [:spec, :standard, "bundle:audit:check"]
|
33
|
+
|
9
34
|
desc "Open an irb session preloaded with this library"
|
10
35
|
task :console do
|
11
36
|
sh "irb -I lib -r head_music.rb"
|
12
37
|
end
|
38
|
+
|
39
|
+
desc "Open coverage report in browser"
|
40
|
+
task :coverage do
|
41
|
+
sh "open coverage/index.html" if File.exist?("coverage/index.html")
|
42
|
+
end
|
data/head_music.gemspec
CHANGED
@@ -8,11 +8,20 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ["Rob Head"]
|
9
9
|
spec.email = ["robert.head@gmail.com"]
|
10
10
|
|
11
|
-
spec.summary = "The rudiments of western music theory."
|
11
|
+
spec.summary = "The rudiments of western music theory and analysis."
|
12
12
|
spec.description = "Work with the elements of western music theory, such as pitches, scales, intervals, and chords."
|
13
13
|
spec.homepage = "https://github.com/roberthead/head_music"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
|
+
spec.metadata = {
|
17
|
+
"homepage_uri" => spec.homepage,
|
18
|
+
"source_code_uri" => "https://github.com/roberthead/head_music",
|
19
|
+
"changelog_uri" => "https://github.com/roberthead/head_music/blob/main/CHANGELOG.md",
|
20
|
+
"documentation_uri" => "https://rubydoc.info/gems/head_music",
|
21
|
+
"bug_tracker_uri" => "https://github.com/roberthead/head_music/issues",
|
22
|
+
"rubygems_mfa_required" => "true"
|
23
|
+
}
|
24
|
+
|
16
25
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
17
26
|
f.match(%r{^(test|spec|features)/}) || f.match(/\.gem$/)
|
18
27
|
end
|
@@ -21,7 +30,7 @@ Gem::Specification.new do |spec|
|
|
21
30
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
31
|
spec.require_paths = ["lib"]
|
23
32
|
|
24
|
-
spec.required_ruby_version = ">= 3.0"
|
33
|
+
spec.required_ruby_version = ">= 3.3.0"
|
25
34
|
|
26
35
|
spec.add_runtime_dependency "activesupport", "~> 7.0"
|
27
36
|
spec.add_runtime_dependency "humanize", "~> 2.0"
|
@@ -30,4 +39,6 @@ Gem::Specification.new do |spec|
|
|
30
39
|
spec.add_development_dependency "rake", "~> 13.0"
|
31
40
|
spec.add_development_dependency "rspec", "~> 3.0"
|
32
41
|
spec.add_development_dependency "rspec-its", "~> 1.2"
|
42
|
+
spec.add_development_dependency "bundler-audit", "~> 0.9"
|
43
|
+
spec.add_development_dependency "yard", "~> 0.9"
|
33
44
|
end
|
@@ -52,7 +52,7 @@ class HeadMusic::Rudiment::Solmization
|
|
52
52
|
aliases = []
|
53
53
|
I18n.config.available_locales.each do |locale|
|
54
54
|
translation = I18n.translate("head_music.rudiments.solfege", locale: locale, default: nil)
|
55
|
-
aliases << translation if translation && translation !=
|
55
|
+
aliases << translation if translation && translation != "solfege"
|
56
56
|
end
|
57
57
|
aliases.compact.uniq
|
58
58
|
end
|
data/lib/head_music/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: head_music
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 8.
|
4
|
+
version: 8.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rob Head
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-
|
11
|
+
date: 2025-06-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -94,6 +94,34 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '1.2'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: bundler-audit
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.9'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.9'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: yard
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0.9'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0.9'
|
97
125
|
description: Work with the elements of western music theory, such as pitches, scales,
|
98
126
|
intervals, and chords.
|
99
127
|
email:
|
@@ -102,16 +130,24 @@ executables: []
|
|
102
130
|
extensions: []
|
103
131
|
extra_rdoc_files: []
|
104
132
|
files:
|
105
|
-
- ".
|
106
|
-
- ".
|
133
|
+
- ".github/ISSUE_TEMPLATE/bug_report.md"
|
134
|
+
- ".github/ISSUE_TEMPLATE/feature_request.md"
|
135
|
+
- ".github/dependabot.yml"
|
136
|
+
- ".github/pull_request_template.md"
|
137
|
+
- ".github/workflows/ci.yml"
|
138
|
+
- ".github/workflows/release.yml"
|
139
|
+
- ".github/workflows/security.yml"
|
107
140
|
- ".gitignore"
|
108
141
|
- ".pairs"
|
109
142
|
- ".rspec"
|
110
143
|
- ".rubocop.yml"
|
111
144
|
- ".ruby-version"
|
112
|
-
- ".
|
145
|
+
- ".yardopts"
|
146
|
+
- CHANGELOG.md
|
113
147
|
- CODE_OF_CONDUCT.md
|
148
|
+
- CONTRIBUTING.md
|
114
149
|
- Gemfile
|
150
|
+
- Gemfile.lock
|
115
151
|
- LICENSE.txt
|
116
152
|
- README.md
|
117
153
|
- Rakefile
|
@@ -229,7 +265,13 @@ files:
|
|
229
265
|
homepage: https://github.com/roberthead/head_music
|
230
266
|
licenses:
|
231
267
|
- MIT
|
232
|
-
metadata:
|
268
|
+
metadata:
|
269
|
+
homepage_uri: https://github.com/roberthead/head_music
|
270
|
+
source_code_uri: https://github.com/roberthead/head_music
|
271
|
+
changelog_uri: https://github.com/roberthead/head_music/blob/main/CHANGELOG.md
|
272
|
+
documentation_uri: https://rubydoc.info/gems/head_music
|
273
|
+
bug_tracker_uri: https://github.com/roberthead/head_music/issues
|
274
|
+
rubygems_mfa_required: 'true'
|
233
275
|
post_install_message:
|
234
276
|
rdoc_options: []
|
235
277
|
require_paths:
|
@@ -238,7 +280,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
238
280
|
requirements:
|
239
281
|
- - ">="
|
240
282
|
- !ruby/object:Gem::Version
|
241
|
-
version:
|
283
|
+
version: 3.3.0
|
242
284
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
243
285
|
requirements:
|
244
286
|
- - ">="
|
@@ -248,5 +290,5 @@ requirements: []
|
|
248
290
|
rubygems_version: 3.5.6
|
249
291
|
signing_key:
|
250
292
|
specification_version: 4
|
251
|
-
summary: The rudiments of western music theory.
|
293
|
+
summary: The rudiments of western music theory and analysis.
|
252
294
|
test_files: []
|
data/.circleci/config.yml
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
version: 2
|
2
|
-
jobs:
|
3
|
-
build:
|
4
|
-
docker:
|
5
|
-
- image: circleci/ruby:2.6.7
|
6
|
-
steps:
|
7
|
-
- checkout
|
8
|
-
- restore_cache:
|
9
|
-
keys:
|
10
|
-
- v1-gems-{{ checksum "Gemfile.lock" }}
|
11
|
-
- v1-gems-
|
12
|
-
- run:
|
13
|
-
name: Bundle Install
|
14
|
-
command: bundle check || bundle install
|
15
|
-
- save_cache:
|
16
|
-
key: v1-gems-{{ checksum "Gemfile.lock" }}
|
17
|
-
paths:
|
18
|
-
- vendor/bundle
|
19
|
-
- run:
|
20
|
-
command: bundle exec rspec
|
21
|
-
- store_test_results:
|
22
|
-
path: test_results
|
data/.circleci/setup-rubygems.sh
DELETED