coltrane 2.1.5 → 2.2.1

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.
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Coltrane
4
5
  # Musical scale creation and manipulation
@@ -10,19 +11,25 @@ module Coltrane
10
11
 
11
12
  attr_reader :interval_sequence, :tone
12
13
 
13
- def initialize(*distances, tone: 'C', mode: 1, name: nil, notes: nil)
14
+ def initialize(*relative_intervals, tone: 'C',
15
+ mode: 1,
16
+ name: nil,
17
+ notes: nil)
14
18
  @name = name
15
- if distances.any? && tone
19
+ if relative_intervals.any? && tone
16
20
  @tone = Note[tone]
17
- distances = distances.rotate(mode - 1)
18
- @interval_sequence = IntervalSequence.new(distances: distances)
21
+ relative_intervals = relative_intervals.rotate(mode - 1)
22
+ @interval_sequence = IntervalSequence.new(
23
+ relative_intervals: relative_intervals
24
+ )
19
25
  elsif notes
20
26
  @notes = NoteSet[*notes]
21
27
  @tone = @notes.first
22
- ds = @notes.interval_sequence.distances
23
- @interval_sequence = IntervalSequence.new(distances: ds)
28
+ ds = @notes.interval_sequence.relative_intervals
29
+ @interval_sequence = IntervalSequence.new(relative_intervals: ds)
24
30
  else
25
- raise WrongKeywordsError, '[*distances, tone: "C", mode: 1] || [notes:]'
31
+ raise WrongKeywordsError,
32
+ '[*relative_intervals, tone: "C", mode: 1] || [notes:]'
26
33
  end
27
34
  end
28
35
 
@@ -32,7 +39,7 @@ module Coltrane
32
39
 
33
40
  def name
34
41
  @name = begin
35
- is = interval_sequence.distances
42
+ is = interval_sequence.relative_intervals
36
43
  (0...is.size).each do |i|
37
44
  if (scale_name = Coltrane::ClassicScales::SCALES.key(is.rotate(i)))
38
45
  return scale_name
@@ -132,13 +139,13 @@ module Coltrane
132
139
  next memo1 unless size.include?(qintervals.size)
133
140
  memo1 + scale_rotations.each_with_index
134
141
  .reduce([]) do |memo2, (rot, index)|
135
- if (rot & qintervals).size == qintervals.size
136
- memo2 + [Chord.new(root_note: degree(index + 1),
137
- quality: ChordQuality.new(name: qname))]
138
- else
139
- memo2
140
- end
141
- end
142
+ if (rot & qintervals).size == qintervals.size
143
+ memo2 + [Chord.new(root_note: degree(index + 1),
144
+ quality: ChordQuality.new(name: qname))]
145
+ else
146
+ memo2
147
+ end
148
+ end
142
149
  end
143
150
  end
144
151
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Coltrane
4
- VERSION = '2.1.5'
4
+ VERSION = '2.2.1'
5
5
  end
@@ -1,5 +1,6 @@
1
- module Coltrane
1
+ # frozen_string_literal: true
2
2
 
3
+ module Coltrane
3
4
  # This class describes an actual implementation of a Chord, being aware
4
5
  # of exact octaves of each pitch and even repeating pitches across octaves.
5
6
  class Voicing
@@ -35,4 +36,4 @@ module Coltrane
35
36
  pitches.map(&:frequency)
36
37
  end
37
38
  end
38
- end
39
+ end
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ColtraneGame
2
4
  class Question
3
- def generate
4
- end
5
+ def generate; end
5
6
  end
6
- end
7
+ end
@@ -7,4 +7,4 @@ module ColtraneInstruments
7
7
  autoload :Note, 'coltrane_instruments/guitar/note'
8
8
  autoload :String, 'coltrane_instruments/guitar/string'
9
9
  end
10
- end
10
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module ColtraneInstruments
4
4
  module Guitar
5
- DEFAULT_TUNING = %w[E2 A2 D3 G3 B3 E4]
5
+ DEFAULT_TUNING = %w[E2 A2 D3 G3 B3 E4].freeze
6
6
  DEFAULT_FRETS = 23
7
7
  # A base class for operations involving Guitars
8
8
  class Base
@@ -27,23 +27,23 @@ module ColtraneInstruments
27
27
  end
28
28
 
29
29
  def <=>(other)
30
- rank <=> other.rank
30
+ rank <=> other.rank
31
31
  end
32
32
 
33
33
  def rank
34
- +completeness * 10000 +
35
- +fullness * 1000 +
36
- -spreadness * 100 +
37
- +easyness * 1
34
+ +completeness * 10_000 +
35
+ +fullness * 1000 +
36
+ -spreadness * 100 +
37
+ +easyness * 1
38
38
  end
39
39
 
40
40
  def analysis
41
41
  {
42
- completeness: completeness,
43
- fullness: fullness,
44
- easyness: easyness,
45
- spreadness: spreadness
46
- }
42
+ completeness: completeness,
43
+ fullness: fullness,
44
+ easyness: easyness,
45
+ spreadness: spreadness
46
+ }
47
47
  end
48
48
 
49
49
  def spreadness
@@ -70,13 +70,13 @@ module ColtraneInstruments
70
70
  return [self] if guitar_notes.size >= guitar.strings.size
71
71
  possible_new_notes(notes_available.positive?).reduce([]) do |memo, n|
72
72
  barre = n.fret if guitar_notes.last == n.fret
73
- fingers_change = (n.fret == barre || n.fret.zero?) ? 0 : 1
73
+ fingers_change = n.fret == barre || n.fret.zero? ? 0 : 1
74
74
  next memo if (free_fingers - fingers_change).negative?
75
75
  Chord.new(target_chord, guitar_notes: guitar_notes + [n],
76
76
  free_fingers: free_fingers - fingers_change,
77
77
  guitar: guitar,
78
78
  barre: barre)
79
- .fetch_descendant_chords + memo
79
+ .fetch_descendant_chords + memo
80
80
  end
81
81
  end
82
82
 
@@ -89,12 +89,14 @@ module ColtraneInstruments
89
89
  end
90
90
 
91
91
  def notes_left
92
- @notes_left ||= (target_chord.notes - Coltrane::NoteSet[
92
+ @notes_left ||= begin
93
+ target_chord.notes - Coltrane::NoteSet[
93
94
  *guitar_notes.map do |n|
94
95
  next if n.pitch.nil?
95
96
  n.pitch.pitch_class
96
97
  end
97
- ])
98
+ ]
99
+ end
98
100
  end
99
101
 
100
102
  def target_notes
@@ -110,7 +112,7 @@ module ColtraneInstruments
110
112
  end
111
113
 
112
114
  def non_zero_frets
113
- frets.reject {|f| f.nil? || f.zero? }
115
+ frets.reject { |f| f.nil? || f.zero? }
114
116
  end
115
117
 
116
118
  def lowest_fret
@@ -139,7 +141,7 @@ module ColtraneInstruments
139
141
 
140
142
  def fret_expansion_range
141
143
  (lowest_possible_fret..highest_possible_fret).to_a +
142
- [(0 unless barre?)].compact
144
+ [(0 unless barre?)].compact
143
145
  end
144
146
 
145
147
  def to_s
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'coltrane'
2
4
  require 'coreaudio'
3
5
 
4
6
  module ColtraneSynth
5
7
  autoload :Base, 'coltrane_synth/base'
6
8
  autoload :Synth, 'coltrane_synth/synth'
7
- end
9
+ end
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ColtraneSynth
2
4
  class Base
3
5
  attr_reader :device, :buffer
4
6
 
5
- SAMPLE_RATE = 44000
7
+ SAMPLE_RATE = 44_000
6
8
 
7
- def self.play(something, duration=1.0)
9
+ def self.play(something, duration = 1.0)
8
10
  new.play(*extract_frequencies(something), duration: duration)
9
11
  end
10
12
 
@@ -17,8 +19,8 @@ module ColtraneSynth
17
19
  buffer = @device.output_loop(SAMPLE_RATE)
18
20
 
19
21
  SAMPLE_RATE.times do |i|
20
- sound = freqs.reduce(0) { |sum, freq| Math.sin(phase(freq)*i) + sum }
21
- buffer[i] = (sound * (0x6AFF/freqs.size)).round
22
+ sound = freqs.reduce(0) { |sum, freq| Math.sin(phase(freq) * i) + sum }
23
+ buffer[i] = (sound * (0x6AFF / freqs.size)).round
22
24
  end
23
25
 
24
26
  buffer.start
@@ -30,18 +32,18 @@ module ColtraneSynth
30
32
 
31
33
  def self.extract_frequencies(arg)
32
34
  case arg
33
- when Coltrane::Chord then arg.notes.map {|n| n.frequency.octave(4).to_f }
35
+ when Coltrane::Chord then arg.notes.map { |n| n.frequency.octave(4).to_f }
34
36
  when Coltrane::PitchClass then arg.frequency.octave(4).to_f
35
37
  when Coltrane::Voicing then arg.frequencies.map(&:to_f)
36
38
  end
37
39
  end
38
40
 
39
41
  def sine_wave(freq, i)
40
- Math.sin(phase(freq)*i)
42
+ Math.sin(phase(freq) * i)
41
43
  end
42
44
 
43
45
  def phase(freq)
44
46
  (Math::PI * 2.0 * freq) / SAMPLE_RATE.to_f
45
47
  end
46
48
  end
47
- end
49
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ColtraneSynth
2
4
  class Synth
3
5
  attr_reader :freq, :nominal_rate
@@ -21,4 +23,4 @@ module ColtraneSynth
21
23
  Math::PI * 2.0 * freq / nominal_rate
22
24
  end
23
25
  end
24
- end
26
+ end
data/lib/core_ext.rb CHANGED
@@ -22,42 +22,13 @@ class String
22
22
  !!match(*args)
23
23
  end
24
24
 
25
- def interval_quality
26
- {
27
- 'P' => 'Perfect',
28
- 'm' => 'Minor',
29
- 'M' => 'Major',
30
- 'A' => 'Augmented',
31
- 'd' => 'Diminished'
32
- }[self]
33
- end
34
-
35
25
  def symbolize
36
- self.underscore.to_sym
26
+ underscore.to_sym
37
27
  end
38
28
  end
39
29
 
40
30
  # Here we add some syntax sugar to make the code more understandable later
41
31
  class Numeric
42
- def interval_name
43
- {
44
- 1 => 'Unison',
45
- 2 => 'Second',
46
- 3 => 'Third',
47
- 4 => 'Fourth',
48
- 5 => 'Fifth',
49
- 6 => 'Sixth',
50
- 7 => 'Seventh',
51
- 8 => 'Octave',
52
- 9 => 'Ninth',
53
- 10 => 'Tenth',
54
- 11 => 'Eleventh',
55
- 12 => 'Twelfth',
56
- 13 => 'Thirteenth',
57
- 14 => 'Fourteenth',
58
- 15 => 'Double Octave'
59
- }[self % 16]
60
- end
61
32
  end
62
33
 
63
34
  # Here we add some methods better work with Tries
data/lib/os.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OS
2
4
  class << self
3
5
  def windows?
@@ -5,7 +7,7 @@ module OS
5
7
  end
6
8
 
7
9
  def mac?
8
- (/darwin/ =~ RUBY_PLATFORM) != nil
10
+ (/darwin/ =~ RUBY_PLATFORM) != nil
9
11
  end
10
12
 
11
13
  def unix?
@@ -16,4 +18,4 @@ module OS
16
18
  unix? && !mac?
17
19
  end
18
20
  end
19
- end
21
+ end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coltrane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.5
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pedro Maciel
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-03-19 00:00:00.000000000 Z
11
+ date: 2018-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dry-monads
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.4'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.4'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: paint
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -93,6 +107,7 @@ files:
93
107
  - ".rspec"
94
108
  - ".rubocop.yml"
95
109
  - ".ruby-version"
110
+ - ".travis.yml"
96
111
  - CHANGELOG.md
97
112
  - CODE_OF_CONDUCT.md
98
113
  - Gemfile
@@ -173,6 +188,7 @@ files:
173
188
  - lib/coltrane/diatonic_scale.rb
174
189
  - lib/coltrane/errors.rb
175
190
  - lib/coltrane/frequency.rb
191
+ - lib/coltrane/frequency_interval.rb
176
192
  - lib/coltrane/interval.rb
177
193
  - lib/coltrane/interval_class.rb
178
194
  - lib/coltrane/interval_sequence.rb
@@ -223,7 +239,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
223
239
  version: '0'
224
240
  requirements: []
225
241
  rubyforge_project:
226
- rubygems_version: 2.7.3
242
+ rubygems_version: 2.7.6
227
243
  signing_key:
228
244
  specification_version: 4
229
245
  summary: It deals with all sorts of calculations around music theory and allows for