transpose_chords 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
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: