head_music 0.23.1 → 0.23.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5df85a8374d61221a2217a55bc0766bbfde35a5040768353f8d006f53755acff
4
- data.tar.gz: 9d749a3a8def07c981019ba936a2718a2c3a89e661ab945437223e902df830f2
3
+ metadata.gz: bb1e01b3119838d06ece395586b5ba1a83d8b432f01d6bc63dfbea324f48be1c
4
+ data.tar.gz: 3f6ac1484a66455949d27fe1af7b53e7becdfddaf66093e151d89ad31b31ffa5
5
5
  SHA512:
6
- metadata.gz: 6e58ad0dd9dcb2358195aa47a59801eaae763a5c27926088318308b37c7b86ec0edc3cb0b14ffb314661209a4d7c652c5f8826c663c1f80f781e1933b3ac452a
7
- data.tar.gz: a9deabf2b150cb062a617c9439094d4328a8c5fb0b390d915b73205fe226b82f3b96fe57c4eb542f29c23c62484e2513e0a68366840ac677660b38991975dabc
6
+ metadata.gz: fa9f404bd1a24082020cf72d0daef7ac68f3b954ab692fec5b3c1f23ecb3a913786550127a9de543b8f88aa0a3370e3c321867cf453ab26cca3cf98ee5b81bfb
7
+ data.tar.gz: '08bae5514fb6dc84f35cbaf44b16e8ab001688e379a640c462769e950193fb9b1361a018ef29d8a048e256de535a71fe3796336511f65b6cc6fbad40ab1d9209'
data/.rubocop.yml CHANGED
@@ -13,12 +13,21 @@ Metrics/ClassLength:
13
13
  Metrics/LineLength:
14
14
  Max: 120
15
15
 
16
- Style/SymbolArray:
17
- Enabled: true
18
-
19
16
  Style/ClassAndModuleChildren:
20
17
  EnforcedStyle: compact
21
18
 
19
+ Style/HashEachMethods:
20
+ Enabled: false
21
+
22
+ Style/HashTransformKeys:
23
+ Enabled: false
24
+
25
+ Style/HashTransformValues:
26
+ Enabled: false
27
+
28
+ Style/SymbolArray:
29
+ Enabled: true
30
+
22
31
  Style/TrailingCommaInArrayLiteral:
23
32
  EnforcedStyleForMultiline: consistent_comma
24
33
 
@@ -26,7 +35,7 @@ Style/TrailingCommaInHashLiteral:
26
35
  EnforcedStyleForMultiline: consistent_comma
27
36
 
28
37
  AllCops:
29
- TargetRubyVersion: 2.6
38
+ TargetRubyVersion: 2.4
30
39
 
31
40
  Layout/EmptyLineAfterGuardClause:
32
41
  Enabled: false
data/Gemfile CHANGED
@@ -9,7 +9,7 @@ gemspec
9
9
 
10
10
  group :test do
11
11
  gem 'codeclimate-test-reporter', '~> 1.0.0'
12
- gem 'rubocop', '>= 0.56.0', require: false
12
+ gem 'rubocop', '>= 0.80.0', require: false
13
13
  gem 'rubocop-rspec', require: false
14
14
  gem 'simplecov'
15
15
  end
data/head_music.gemspec CHANGED
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
28
28
  spec.add_runtime_dependency 'humanize', '~> 1.3'
29
29
 
30
30
  spec.add_development_dependency 'bundler', '~> 1.13'
31
- spec.add_development_dependency 'rake', '~> 10.0'
31
+ spec.add_development_dependency 'rake', '>= 12.3.3'
32
32
  spec.add_development_dependency 'rspec', '~> 3.0'
33
33
  spec.add_development_dependency 'rspec-its', '~> 1.2'
34
34
  end
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'head_music/interval_cycle'
4
+
3
5
  # A Circle of Fifths or Fourths shows relationships between pitch classes
4
- # TODO: Replace or empower with IntervalCycle (?)
5
- # https://en.wikipedia.org/wiki/Interval_cycle
6
- class HeadMusic::Circle
6
+ class HeadMusic::Circle < HeadMusic::IntervalCycle
7
7
  def self.of_fifths
8
8
  get(7)
9
9
  end
@@ -19,6 +19,7 @@ class HeadMusic::Circle
19
19
 
20
20
  attr_reader :interval, :pitch_classes
21
21
 
22
+ # Accepts an interval (as an integer number of semitones)
22
23
  def initialize(interval)
23
24
  @interval = interval.to_i
24
25
  @pitch_classes = pitch_classes_by_interval
@@ -32,14 +33,11 @@ class HeadMusic::Circle
32
33
 
33
34
  private
34
35
 
36
+ def interval_cycle
37
+ @interval_cycle ||= HeadMusic::IntervalCycle.get(interval)
38
+ end
39
+
35
40
  def pitch_classes_by_interval
36
- [HeadMusic::PitchClass.get(0)].tap do |list|
37
- loop do
38
- next_pitch_class = list.last + interval
39
- break if next_pitch_class == list.first
40
-
41
- list << next_pitch_class
42
- end
43
- end
41
+ interval_cycle.send(:pitch_classes_by_interval)
44
42
  end
45
43
  end
@@ -5,17 +5,17 @@ class HeadMusic::Clef
5
5
  include HeadMusic::NamedRudiment
6
6
 
7
7
  CLEFS = [
8
- { pitch: 'G4', line: 2, names: ['treble', 'G-clef'], modern: true },
8
+ { pitch: 'G4', line: 2, names: %w[treble G-clef], modern: true },
9
9
  { pitch: 'G4', line: 1, names: ['French', 'French violin'] },
10
10
  { pitch: 'G3', line: 2, names: ['choral tenor', 'tenor', 'tenor G-clef'], modern: true },
11
11
 
12
12
  { pitch: 'F3', line: 3, names: ['baritone'] },
13
- { pitch: 'F3', line: 4, names: ['bass', 'F-clef'], modern: true },
13
+ { pitch: 'F3', line: 4, names: %w[bass F-clef], modern: true },
14
14
  { pitch: 'F3', line: 5, names: ['sub-bass'] },
15
15
 
16
16
  { pitch: 'C4', line: 1, names: ['soprano'] },
17
17
  { pitch: 'C4', line: 2, names: ['mezzo-soprano'] },
18
- { pitch: 'C4', line: 3, names: ['alto', 'viola', 'counter-tenor', 'countertenor', 'C-clef'], modern: true },
18
+ { pitch: 'C4', line: 3, names: %w[alto viola counter-tenor countertenor C-clef], modern: true },
19
19
  { pitch: 'C4', line: 4, names: ['tenor', 'tenor C-clef'], modern: true },
20
20
  { pitch: 'C4', line: 5, names: ['baritone', 'baritone C-clef'] },
21
21
 
@@ -340,6 +340,14 @@ class HeadMusic::DiatonicInterval
340
340
  HeadMusic::Pitch.from_number_and_letter(pitch - semitones, pitch.letter_name.steps_down(number - 1))
341
341
  end
342
342
 
343
+ def interval_class
344
+ [simple_semitones, 12 - simple_semitones].min
345
+ end
346
+
347
+ def interval_class_name
348
+ "ic #{interval_class}"
349
+ end
350
+
343
351
  # diatonic set theory
344
352
  alias specific_interval simple_semitones
345
353
  alias diatonic_generic_interval simple_steps
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ # An Interval Cycle is a collection of pitch classes created from a sequence of the same interval class.
4
+ class HeadMusic::IntervalCycle
5
+ def self.get(interval = 7)
6
+ @circles ||= {}
7
+ interval = interval.to_s.gsub(/^C/i, '').to_i
8
+ @circles[interval.to_i] ||= new(interval)
9
+ end
10
+
11
+ attr_reader :interval, :pitch_classes
12
+
13
+ def initialize(interval)
14
+ @interval = interval.to_i
15
+ @pitch_classes = pitch_classes_by_interval
16
+ end
17
+
18
+ def index(pitch_class)
19
+ @pitch_classes.index(HeadMusic::Spelling.get(pitch_class).pitch_class)
20
+ end
21
+
22
+ private_class_method :new
23
+
24
+ private
25
+
26
+ def pitch_classes_by_interval
27
+ [HeadMusic::PitchClass.get(0)].tap do |list|
28
+ loop do
29
+ next_pitch_class = list.last + interval
30
+ break if next_pitch_class == list.first
31
+
32
+ list << next_pitch_class
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ # A symbol is a mark or sign that signifies a particular rudiment of music
4
+ class HeadMusic::Symbol
5
+ attr_reader :ascii, :unicode, :html_entity
6
+
7
+ def initialize(ascii: nil, unicode: nil, html_entity: nil)
8
+ @ascii = ascii
9
+ @unicode = unicode
10
+ @html_entity = html_entity
11
+ end
12
+ end
@@ -67,7 +67,7 @@ class HeadMusic::ReferencePitch
67
67
  pitch.letter_name,
68
68
  format(
69
69
  '%<with_digits>g',
70
- with_digits: format('%.2f', frequency)
70
+ with_digits: format('%.2<frequency>f', frequency: frequency)
71
71
  ),
72
72
  ].join('=')
73
73
  end
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'head_music/musical_symbol'
4
+
3
5
  # A Sign is a symbol that modifies pitch, such as a sharp, flat, or natural.
4
6
  class HeadMusic::Sign
5
7
  include Comparable
6
8
 
7
- attr_reader :identifier, :ascii, :unicode, :html_entity, :cents
9
+ attr_reader :identifier, :cents, :symbol
8
10
 
9
11
  def self.all
10
12
  @all ||= [
@@ -64,14 +66,19 @@ class HeadMusic::Sign
64
66
  cents <=> other.cents
65
67
  end
66
68
 
69
+ delegate :ascii, :html_entity, :unicode, to: :symbol
70
+
67
71
  private
68
72
 
69
73
  def initialize(attributes)
70
74
  @identifier = attributes[:identifier]
71
- @ascii = attributes[:ascii]
72
- @unicode = attributes[:unicode]
73
- @html_entity = attributes[:html_entity]
74
75
  @cents = attributes[:cents]
76
+
77
+ @symbol = HeadMusic::Symbol.new(
78
+ unicode: attributes[:unicode],
79
+ ascii: attributes[:ascii],
80
+ html_entity: attributes[:html_entity]
81
+ )
75
82
  end
76
83
 
77
84
  private_class_method :new
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HeadMusic
4
- VERSION = '0.23.1'
4
+ VERSION = '0.23.2'
5
5
  end
data/lib/head_music.rb CHANGED
@@ -28,11 +28,13 @@ require 'head_music/diatonic_interval'
28
28
  require 'head_music/grand_staff'
29
29
  require 'head_music/harmonic_interval'
30
30
  require 'head_music/instrument'
31
+ require 'head_music/interval_cycle'
31
32
  require 'head_music/key_signature'
32
33
  require 'head_music/letter_name'
33
34
  require 'head_music/melodic_interval'
34
35
  require 'head_music/meter'
35
36
  require 'head_music/motion'
37
+ require 'head_music/musical_symbol'
36
38
  require 'head_music/octave'
37
39
  require 'head_music/pitch'
38
40
  require 'head_music/pitch/enharmonic_equivalence'
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: 0.23.1
4
+ version: 0.23.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Head
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-04 00:00:00.000000000 Z
11
+ date: 2020-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -56,16 +56,16 @@ dependencies:
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '10.0'
61
+ version: 12.3.3
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '10.0'
68
+ version: 12.3.3
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -135,11 +135,13 @@ files:
135
135
  - lib/head_music/grand_staff.rb
136
136
  - lib/head_music/harmonic_interval.rb
137
137
  - lib/head_music/instrument.rb
138
+ - lib/head_music/interval_cycle.rb
138
139
  - lib/head_music/key_signature.rb
139
140
  - lib/head_music/letter_name.rb
140
141
  - lib/head_music/melodic_interval.rb
141
142
  - lib/head_music/meter.rb
142
143
  - lib/head_music/motion.rb
144
+ - lib/head_music/musical_symbol.rb
143
145
  - lib/head_music/named_rudiment.rb
144
146
  - lib/head_music/octave.rb
145
147
  - lib/head_music/pitch.rb