transpose_chords 0.0.4 → 0.0.5

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
  SHA1:
3
- metadata.gz: 3b5db0f9f864cf7ccdd34f56ef384c658ae21a37
4
- data.tar.gz: 9710afe9db266f2f80d2c4a65c3c8531c4c7eb6b
3
+ metadata.gz: af80c5c08212d3d97b99c004e33d65eb98589bb9
4
+ data.tar.gz: 54d471886cf928dd4c28abb8791a317d1547f6c5
5
5
  SHA512:
6
- metadata.gz: f7f7c2e588922ac6f2842a4b17207ce6a18abfb02a0bd69172afce13877b59fec79a40946cd79989ee9136811c9c1caa291cbce90ab51089a7187d2d76db6fd8
7
- data.tar.gz: a9b63b73aec760412e0377c1665e534972c7e029e3c3ab6816852ab7e5092a18ea277617aca2d0c502de1bb94d232eaf5d07fc6779f74c950272672dcbd0a927
6
+ metadata.gz: da9406d89028becffd155effb830d92480febc537396df877d73b095e5f6441a3ea597ca13be1d0676957c8c6004721f7338a58e2cd46e18b75c70a43f225dc5
7
+ data.tar.gz: d43f8efdde4d548bccaa28a082ae356677bd7560cb6afbee66b1e5e138e775a220d29aae6d512236372c67f61ab23659ec3c2c87925bf39dc2c6f2012c9d2aed
@@ -1,35 +1,43 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- planvine (0.0.4)
4
+ transpose_chords (0.0.5)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
8
8
  specs:
9
- coderay (1.0.6)
10
- diff-lcs (1.1.3)
11
- method_source (0.7.1)
12
- pry (0.9.9.6)
13
- coderay (~> 1.0.5)
14
- method_source (~> 0.7.1)
15
- slop (>= 2.4.4, < 3)
16
- rake (0.9.2.2)
17
- rspec (2.10.0)
18
- rspec-core (~> 2.10.0)
19
- rspec-expectations (~> 2.10.0)
20
- rspec-mocks (~> 2.10.0)
21
- rspec-core (2.10.1)
22
- rspec-expectations (2.10.0)
23
- diff-lcs (~> 1.1.3)
24
- rspec-mocks (2.10.1)
25
- slop (2.4.4)
9
+ coderay (1.1.1)
10
+ diff-lcs (1.2.5)
11
+ method_source (0.8.2)
12
+ pry (0.10.3)
13
+ coderay (~> 1.1.0)
14
+ method_source (~> 0.8.1)
15
+ slop (~> 3.4)
16
+ rake (10.5.0)
17
+ rspec (3.4.0)
18
+ rspec-core (~> 3.4.0)
19
+ rspec-expectations (~> 3.4.0)
20
+ rspec-mocks (~> 3.4.0)
21
+ rspec-core (3.4.4)
22
+ rspec-support (~> 3.4.0)
23
+ rspec-expectations (3.4.0)
24
+ diff-lcs (>= 1.2.0, < 2.0)
25
+ rspec-support (~> 3.4.0)
26
+ rspec-mocks (3.4.1)
27
+ diff-lcs (>= 1.2.0, < 2.0)
28
+ rspec-support (~> 3.4.0)
29
+ rspec-support (3.4.1)
30
+ slop (3.6.0)
26
31
 
27
32
  PLATFORMS
28
33
  ruby
29
34
 
30
35
  DEPENDENCIES
31
- bundler (~> 1.3)
32
- planvine!
33
- pry
34
- rake
35
- rspec
36
+ bundler (~> 1.3, >= 1.3)
37
+ pry (~> 0.10.3, >= 0.10.3)
38
+ rake (~> 10.5.0, >= 10.5.0)
39
+ rspec (~> 3.4.0, >= 3.4.0)
40
+ transpose_chords!
41
+
42
+ BUNDLED WITH
43
+ 1.11.2
@@ -1,58 +1,41 @@
1
1
  module TransposeChords
2
2
  class Chord
3
+ FLATS = %w(C Db D Eb E F Gb G Ab A Bb B)
4
+ SHARPS = %w(C C# D D# E F F# G G# A A# B)
5
+
3
6
  def self.transpose(keys)
4
7
  new(keys)
5
8
  end
6
9
 
7
10
  def initialize(keys)
8
11
  @keys = keys
9
- end
10
-
11
- def table
12
- {
13
- to_key: {
14
- c: ['C', 'Dm', 'Em', 'F', 'G', 'Am', 'Bdim'],
15
- d: ['D', 'Em', 'F#m', 'G', 'A', 'Bm', 'C#dim'],
16
- e: ['E', 'F#m', 'G#m', 'A', 'B', 'C#m', 'D#dim'],
17
- f: ['F', 'Gm', 'Am', 'Bb', 'C', 'Dm', 'Edim'],
18
- g: ['G', 'Am', 'Bm', 'C', 'D', 'Em', 'F#dim'],
19
- a: ['A', 'Bm', 'C#m', 'D', 'E', 'F#m', 'G#dim'],
20
- b: ['B', 'C#m', 'D#m', 'E', 'F#', 'G#m', 'A#dim']
21
- },
22
- to_capo: {
23
- c: ['C', 'C#/Db', 'D', 'D#/Eb', 'E', 'F', 'F#/Gb', 'G', 'G#/Ab', 'A', 'A#/Bb'],
24
- d: ['D', 'D#/Eb', 'E', 'F', 'F#/Gb', 'G', 'Gb/Ab', 'A', 'A#/Bb', 'B', 'C'],
25
- e: ['E', 'F', 'F#/Gb', 'G', 'G#/Ab', 'A', 'A#/Bb', 'B', 'C', 'C#/Db', 'D'],
26
- f: ['F', 'F#/Gb', 'G', 'G#/Ab', 'A', 'A#/Bb', 'B', 'C', 'C#/Db', 'D', 'D#/Eb'],
27
- g: ['G', 'G#/Ab', 'A', 'A#/Bb', 'B', 'C', 'C#/Db', 'D', 'D#/Eb', 'E', 'F'],
28
- a: ['A', 'A#/Bb', 'B', 'C', 'C#/Db', 'D', 'D#/Eb', 'E', 'F', 'F#/Gb', 'G'],
29
- b: ['B', 'C', 'C#/Db', 'D', 'D#/Eb', 'E', 'F', 'F#/Gb', 'G', 'G#/Ab', 'A']
30
- }
31
- }
12
+ @scale = FLATS
32
13
  end
33
14
 
34
15
  def to(key)
35
- key = table_key_for(key)
36
- key_indexes.map { |k| table[:to_key][key][k] }
16
+ @scale = key.include?('b') || key.start_with?('F') ? FLATS : SHARPS
17
+ intervals = index_of(key)
18
+ @keys.map { |k| transpose_chord(k, intervals) }
37
19
  end
38
20
 
39
21
  def capo(fret)
40
- @keys.map do |k|
41
- key = table_key_for(k)
42
- table[:to_capo][key][fret]
43
- end
22
+ @keys.map { |k| transpose_chord(k, fret) }
44
23
  end
45
24
 
46
- def table_key_for(key)
47
- key.downcase.to_sym
48
- end
25
+ private
49
26
 
50
- def key_indexes
51
- @keys.map { |k| keys_for(table_key_for(@keys.first))[k] }
27
+ def transpose_chord(chord, intervals)
28
+ chord.gsub /([A-G][#b]*)/ do
29
+ chord_name, complement = $~.captures
30
+ new_chord_name = @scale[(index_of(chord_name) + intervals) % @scale.size]
31
+ "#{new_chord_name}#{complement}"
32
+ end
52
33
  end
53
34
 
54
- def keys_for(key)
55
- Hash[table[:to_key][key].map.with_index{|*ki| ki}]
35
+ def index_of(chord_name)
36
+ index = FLATS.index(chord_name) || SHARPS.index(chord_name)
37
+ raise "Cannot recognize chord name '#{chord_name}'" unless index
38
+ index
56
39
  end
57
40
  end
58
41
  end
@@ -1,3 +1,3 @@
1
1
  module TransposeChords
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -4,13 +4,29 @@ module TransposeChords
4
4
  describe Chord do
5
5
  context 'transposing to a new key' do
6
6
  it 'transposes a chord progression' do
7
- Chord.transpose(['C','F','Am','G']).to('D').should == ['D','G','Bm','A']
7
+ expect(Chord.transpose(['C','F','Am','G']).to('D')).to match_array(['D','G','Bm','A'])
8
+ end
9
+
10
+ it 'transposes a chord progression with inverted chords' do
11
+ expect(Chord.transpose(['C/E','F/A','Am/G','G/B']).to('D')).to match_array(['D/F#','G/B','Bm/A','A/C#'])
12
+ end
13
+
14
+ it 'transposes a chord progression to a sharp note' do
15
+ expect(Chord.transpose(['C','F','Am','G']).to('D#')).to match_array(['D#','G#','Cm','A#'])
16
+ end
17
+
18
+ it 'transposes a chord progression to a flat note' do
19
+ expect(Chord.transpose(['Cm','F','Am','G']).to('Bb')).to match_array(['Bbm','Eb','Gm','F'])
20
+ end
21
+
22
+ it 'transposes a chord progression to a flat note scale (F)' do
23
+ expect(Chord.transpose(['C','F','Am','G']).to('F')).to match_array(['F','Bb','Dm','C'])
8
24
  end
9
25
  end
10
26
 
11
27
  context 'transposing with a capo' do
12
28
  it 'transposes the chords' do
13
- Chord.transpose(['C','D','G']).capo(2).should == ['D','E','A']
29
+ expect(Chord.transpose(['C','D','G']).capo(2)).to match_array(['D','E','A'])
14
30
  end
15
31
  end
16
32
  end
@@ -1,7 +1,3 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
1
  lib = File.expand_path('../lib', __FILE__)
6
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
7
3
  require 'transpose_chords/version'
@@ -21,8 +17,8 @@ Gem::Specification.new do |spec|
21
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
22
18
  spec.require_paths = ["lib"]
23
19
 
24
- spec.add_development_dependency "bundler", "~> 1.3"
25
- spec.add_development_dependency "rake"
26
- spec.add_development_dependency "rspec"
27
- spec.add_development_dependency "pry"
20
+ spec.add_development_dependency "bundler", '~> 1.3', '>= 1.3'
21
+ spec.add_development_dependency "rake", '~> 10.5.0', '>= 10.5.0'
22
+ spec.add_development_dependency "rspec", '~> 3.4.0', '>= 3.4.0'
23
+ spec.add_development_dependency "pry", '~> 0.10.3', '>= 0.10.3'
28
24
  end
metadata CHANGED
@@ -1,71 +1,95 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: transpose_chords
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Patching
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-10 00:00:00.000000000 Z
11
+ date: 2016-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ - - ">="
18
21
  - !ruby/object:Gem::Version
19
22
  version: '1.3'
20
23
  type: :development
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - ~>
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - - ">="
25
31
  - !ruby/object:Gem::Version
26
32
  version: '1.3'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: rake
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
- - - '>='
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 10.5.0
40
+ - - ">="
32
41
  - !ruby/object:Gem::Version
33
- version: '0'
42
+ version: 10.5.0
34
43
  type: :development
35
44
  prerelease: false
36
45
  version_requirements: !ruby/object:Gem::Requirement
37
46
  requirements:
38
- - - '>='
47
+ - - "~>"
39
48
  - !ruby/object:Gem::Version
40
- version: '0'
49
+ version: 10.5.0
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 10.5.0
41
53
  - !ruby/object:Gem::Dependency
42
54
  name: rspec
43
55
  requirement: !ruby/object:Gem::Requirement
44
56
  requirements:
45
- - - '>='
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: 3.4.0
60
+ - - ">="
46
61
  - !ruby/object:Gem::Version
47
- version: '0'
62
+ version: 3.4.0
48
63
  type: :development
49
64
  prerelease: false
50
65
  version_requirements: !ruby/object:Gem::Requirement
51
66
  requirements:
52
- - - '>='
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: 3.4.0
70
+ - - ">="
53
71
  - !ruby/object:Gem::Version
54
- version: '0'
72
+ version: 3.4.0
55
73
  - !ruby/object:Gem::Dependency
56
74
  name: pry
57
75
  requirement: !ruby/object:Gem::Requirement
58
76
  requirements:
59
- - - '>='
77
+ - - "~>"
60
78
  - !ruby/object:Gem::Version
61
- version: '0'
79
+ version: 0.10.3
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 0.10.3
62
83
  type: :development
63
84
  prerelease: false
64
85
  version_requirements: !ruby/object:Gem::Requirement
65
86
  requirements:
66
- - - '>='
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.10.3
90
+ - - ">="
67
91
  - !ruby/object:Gem::Version
68
- version: '0'
92
+ version: 0.10.3
69
93
  description: Ruby lib for transposing chords
70
94
  email:
71
95
  - richard@justaddpixels.com
@@ -73,8 +97,8 @@ executables: []
73
97
  extensions: []
74
98
  extra_rdoc_files: []
75
99
  files:
76
- - .document
77
- - .gitignore
100
+ - ".document"
101
+ - ".gitignore"
78
102
  - Gemfile
79
103
  - Gemfile.lock
80
104
  - LICENSE.txt
@@ -95,20 +119,19 @@ require_paths:
95
119
  - lib
96
120
  required_ruby_version: !ruby/object:Gem::Requirement
97
121
  requirements:
98
- - - '>='
122
+ - - ">="
99
123
  - !ruby/object:Gem::Version
100
124
  version: '0'
101
125
  required_rubygems_version: !ruby/object:Gem::Requirement
102
126
  requirements:
103
- - - '>='
127
+ - - ">="
104
128
  - !ruby/object:Gem::Version
105
129
  version: '0'
106
130
  requirements: []
107
131
  rubyforge_project:
108
- rubygems_version: 2.0.0
132
+ rubygems_version: 2.5.1
109
133
  signing_key:
110
134
  specification_version: 4
111
135
  summary: Ruby lib for transposing chords
112
136
  test_files:
113
137
  - spec/lib/transpose_chords_spec.rb
114
- has_rdoc: