chordy 0.7.1 → 0.7.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.
- data/.travis.yml +3 -0
- data/Gemfile +3 -3
- data/README.rdoc +302 -97
- data/Rakefile +12 -5
- data/VERSION +1 -0
- data/lib/chordy.rb +96 -75
- data/lib/chordy/chord.rb +228 -0
- data/lib/chordy/chords/a.rb +84 -0
- data/lib/chordy/chords/a_sharp.rb +86 -0
- data/lib/chordy/chords/b.rb +83 -0
- data/lib/chordy/chords/c.rb +84 -0
- data/lib/chordy/chords/c_sharp.rb +86 -0
- data/lib/chordy/chords/d.rb +84 -0
- data/lib/chordy/chords/d_sharp.rb +86 -0
- data/lib/chordy/chords/e.rb +84 -0
- data/lib/chordy/chords/f.rb +84 -0
- data/lib/chordy/chords/f_sharp.rb +86 -0
- data/lib/chordy/chords/g.rb +84 -0
- data/lib/chordy/chords/g_sharp.rb +86 -0
- data/lib/chordy/util/section.rb +18 -0
- data/lib/chordy/util/text.rb +7 -0
- data/lib/chordy/util/tuning.rb +113 -0
- data/test/helper.rb +1 -1
- data/test/test_chordy.rb +16 -11
- metadata +25 -24
- data/lib/a_chords.rb +0 -81
- data/lib/a_sharp_chords.rb +0 -83
- data/lib/b_chords.rb +0 -81
- data/lib/c_chords.rb +0 -81
- data/lib/c_sharp_chords.rb +0 -83
- data/lib/chord.rb +0 -193
- data/lib/d_chords.rb +0 -81
- data/lib/d_sharp_chords.rb +0 -83
- data/lib/e_chords.rb +0 -81
- data/lib/f_chords.rb +0 -81
- data/lib/f_sharp_chords.rb +0 -83
- data/lib/g_chords.rb +0 -81
- data/lib/g_sharp_chords.rb +0 -83
- data/lib/section.rb +0 -13
- data/lib/text.rb +0 -11
- data/lib/tuning.rb +0 -109
data/Rakefile
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'bundler'
|
5
|
+
|
5
6
|
begin
|
6
7
|
Bundler.setup(:default, :development)
|
7
8
|
rescue Bundler::BundlerError => e
|
@@ -9,6 +10,14 @@ rescue Bundler::BundlerError => e
|
|
9
10
|
$stderr.puts "Run `bundle install` to install missing gems"
|
10
11
|
exit e.status_code
|
11
12
|
end
|
13
|
+
|
14
|
+
if !File.exist?('VERSION')
|
15
|
+
$stderr.puts "Could not find VERSION file"
|
16
|
+
exit 1
|
17
|
+
end
|
18
|
+
|
19
|
+
VERSION = File.read('VERSION').gsub(/\n/, '')
|
20
|
+
|
12
21
|
require 'rake/dsl_definition'
|
13
22
|
require 'rake'
|
14
23
|
|
@@ -16,11 +25,11 @@ require 'jeweler'
|
|
16
25
|
Jeweler::Tasks.new do |gem|
|
17
26
|
gem.name = "chordy"
|
18
27
|
gem.rubyforge_project = "chordy"
|
19
|
-
gem.version =
|
28
|
+
gem.version = VERSION
|
20
29
|
gem.homepage = "http://github.com/darth10/chordy"
|
21
30
|
gem.license = "MIT"
|
22
31
|
gem.summary = %Q{DSL for guitar chords}
|
23
|
-
gem.description = %Q{
|
32
|
+
gem.description = %Q{A Ruby DSL for printing guitar chords diagrams}
|
24
33
|
gem.email = "akhil.wali.10@gmail.com"
|
25
34
|
gem.authors = ["Akhil Wali"]
|
26
35
|
end
|
@@ -37,10 +46,8 @@ task :default => [:test, :build]
|
|
37
46
|
|
38
47
|
require 'rdoc/task'
|
39
48
|
Rake::RDocTask.new do |rdoc|
|
40
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
41
|
-
|
42
49
|
rdoc.rdoc_dir = 'rdoc'
|
43
|
-
rdoc.title = "chordy #{
|
50
|
+
rdoc.title = "chordy #{VERSION}"
|
44
51
|
rdoc.rdoc_files.include('README*')
|
45
52
|
rdoc.rdoc_files.include('LICENSE.rdoc')
|
46
53
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.7.2
|
data/lib/chordy.rb
CHANGED
@@ -1,51 +1,56 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
require
|
9
|
-
|
10
|
-
|
11
|
-
require 'f_sharp_chords'
|
12
|
-
require 'g_chords'
|
13
|
-
require 'g_sharp_chords'
|
14
|
-
require 'a_chords'
|
15
|
-
require 'a_sharp_chords'
|
16
|
-
require 'b_chords'
|
17
|
-
|
18
|
-
require 'text'
|
19
|
-
require 'section'
|
20
|
-
|
21
|
-
require 'tuning'
|
22
|
-
include Tuning
|
3
|
+
includes = ['chords', 'util']
|
4
|
+
|
5
|
+
include_dirs = includes.map { |dir| "chordy/#{dir}/" }
|
6
|
+
include_dirs.each do |dir|
|
7
|
+
Dir[File.join(File.dirname(__FILE__), dir + '**.rb')].each do |file|
|
8
|
+
require file
|
9
|
+
end
|
10
|
+
end
|
23
11
|
|
24
12
|
module Chordy
|
25
|
-
|
26
|
-
$separator_length = 40
|
27
|
-
$chords = []
|
28
|
-
$auto = true
|
29
|
-
$tuning = tuning_6_standard.map { |e| e.capitalize }
|
30
|
-
$reverse = false
|
13
|
+
extend self, Util, Util::Tuning
|
31
14
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
15
|
+
attr_accessor :chords, :line_length, :separator_length, :tuning, :auto, :low_to_high
|
16
|
+
attr_accessor :chord_space, :half_length_delimiter, :start_delimiter, :end_delimiter
|
17
|
+
|
18
|
+
@line_length = 8
|
19
|
+
@separator_length = 40
|
20
|
+
@chords = []
|
21
|
+
@auto = true
|
22
|
+
@tuning = tuning_6_standard
|
23
|
+
@low_to_high = false
|
37
24
|
|
38
|
-
|
39
|
-
|
25
|
+
# printing delimiters
|
26
|
+
@chord_space = "-"
|
27
|
+
@half_length_delimiter = "|"
|
28
|
+
@start_delimiter = "["
|
29
|
+
@end_delimiter = "]"
|
30
|
+
|
31
|
+
def do_auto a=true
|
32
|
+
Chordy.auto = a
|
33
|
+
Chordy.auto
|
40
34
|
end
|
41
35
|
|
42
36
|
def no_auto
|
43
|
-
auto false
|
37
|
+
Chordy.auto = false
|
38
|
+
Chordy.auto
|
44
39
|
end
|
45
40
|
|
46
|
-
def
|
41
|
+
def do_low_to_high
|
42
|
+
Chordy.low_to_high = true
|
43
|
+
do_print
|
44
|
+
end
|
45
|
+
|
46
|
+
def do_high_to_low
|
47
|
+
Chordy.low_to_high = false
|
48
|
+
do_print
|
49
|
+
end
|
50
|
+
|
51
|
+
def set_line_length a
|
47
52
|
if a.instance_of? Fixnum
|
48
|
-
|
53
|
+
Chordy.line_length = a
|
49
54
|
do_print
|
50
55
|
else
|
51
56
|
puts "Invalid length"
|
@@ -53,26 +58,30 @@ module Chordy
|
|
53
58
|
end
|
54
59
|
|
55
60
|
def clear
|
56
|
-
|
61
|
+
Chordy.chords = []
|
57
62
|
do_print
|
58
63
|
end
|
59
64
|
|
60
65
|
# TODO document + examples
|
61
66
|
|
62
|
-
def
|
67
|
+
def set_chords_to_tuning tuning
|
63
68
|
longest_tuning_str_length = tuning.max.length
|
64
|
-
|
65
|
-
|
66
|
-
|
69
|
+
Chordy.tuning = tuning.map { |e| e.rjust(longest_tuning_str_length) }
|
70
|
+
|
71
|
+
Chordy.chords.select { |c| c.is_a? Chord } .each { |e| e.pad_or_trim Chordy.tuning.length, true }
|
67
72
|
end
|
68
73
|
|
69
|
-
def tune new_tuning
|
74
|
+
def tune new_tuning, direction=:low_to_high
|
70
75
|
to_do_print = false
|
71
76
|
strings = [6, 7, 8]
|
72
77
|
|
73
78
|
if new_tuning.is_a? Array
|
74
79
|
if strings.include? new_tuning.length
|
75
|
-
|
80
|
+
if direction == :high_to_low
|
81
|
+
new_tuning = new_tuning.reverse
|
82
|
+
end
|
83
|
+
|
84
|
+
set_chords_to_tuning new_tuning
|
76
85
|
to_do_print = true
|
77
86
|
else
|
78
87
|
puts "Invalid tuning; only " + strings.join(",") + " strings are allowed"
|
@@ -80,7 +89,7 @@ module Chordy
|
|
80
89
|
else
|
81
90
|
if is_tuning? new_tuning.to_s
|
82
91
|
new_tuning = eval("#{new_tuning}")
|
83
|
-
|
92
|
+
set_chords_to_tuning new_tuning
|
84
93
|
to_do_print = true
|
85
94
|
else
|
86
95
|
puts "Unknown or invalid tuning"
|
@@ -110,41 +119,48 @@ module Chordy
|
|
110
119
|
eval("defined?(#{chord_name}) == 'constant' and #{chord_name}.class == Class")
|
111
120
|
end
|
112
121
|
|
113
|
-
def play chords,
|
122
|
+
def play chords, chord_type_or_direction=:major
|
114
123
|
chord = nil
|
115
124
|
begin
|
116
125
|
if chords.instance_of? Array
|
117
|
-
chord = Chord.new(chords,
|
126
|
+
chord = Chord.new(chords, Chordy.tuning.length)
|
127
|
+
|
128
|
+
# play high-to-low, unless :low_to_high is specified
|
129
|
+
if chord_type_or_direction != :low_to_high
|
130
|
+
chord.reverse_strings!
|
131
|
+
end
|
118
132
|
else
|
119
133
|
chord_name = chords.to_s
|
120
134
|
if !check_chord_class chord_name
|
121
135
|
chord_name = check_sharp_or_flat_chord chord_name
|
122
136
|
end
|
123
137
|
|
124
|
-
chord_init = "#{chord_name}.new :#{
|
138
|
+
chord_init = "#{chord_name}.new :#{chord_type_or_direction}, #{Chordy.tuning.length}"
|
125
139
|
chord = eval(chord_init)
|
126
140
|
end
|
127
141
|
|
128
|
-
|
142
|
+
Chordy.chords.push chord
|
129
143
|
do_print
|
130
144
|
rescue NameError => ne
|
131
145
|
puts "Unknown chord or chord type"
|
132
146
|
puts ne.message
|
147
|
+
puts ne.backtrace
|
133
148
|
rescue Exception => e
|
134
149
|
puts e.class.to_s
|
135
150
|
puts e.message
|
151
|
+
puts e.backtrace
|
136
152
|
end
|
137
153
|
|
138
154
|
chord
|
139
155
|
end
|
140
156
|
|
141
157
|
def text text
|
142
|
-
|
158
|
+
Chordy.chords.push Util::Text.new(text)
|
143
159
|
do_print
|
144
160
|
end
|
145
161
|
|
146
162
|
def section title=""
|
147
|
-
|
163
|
+
Chordy.chords.push Util::Section.new(title, Chordy.separator_length)
|
148
164
|
do_print
|
149
165
|
end
|
150
166
|
|
@@ -153,7 +169,7 @@ module Chordy
|
|
153
169
|
end
|
154
170
|
|
155
171
|
def do_print
|
156
|
-
if
|
172
|
+
if Chordy.auto
|
157
173
|
print_chords
|
158
174
|
end
|
159
175
|
end
|
@@ -162,18 +178,22 @@ module Chordy
|
|
162
178
|
lines_to_print = []
|
163
179
|
chord_index = 0
|
164
180
|
chords_in_section = 0
|
165
|
-
tuning_length =
|
181
|
+
tuning_length = Chordy.tuning.length
|
166
182
|
is_done = false
|
167
183
|
is_new_line = true
|
168
|
-
is_even_line_length = (
|
184
|
+
is_even_line_length = (Chordy.line_length % 2) == 0
|
169
185
|
is_next_chord_section_or_text = false
|
170
186
|
to_print_start_chords = false
|
171
187
|
to_skip_end_strings = false
|
172
188
|
|
189
|
+
chords = Chordy.chords.to_a
|
190
|
+
chords.select { |c| c.is_a? Util::Section } .map { |s| s.separator_length = Chordy.separator_length }
|
191
|
+
|
173
192
|
while !is_done
|
174
193
|
if is_new_line or to_print_start_chords
|
175
|
-
if
|
176
|
-
start_strings = Chord.start_of_strings
|
194
|
+
if chords[chord_index].is_a? Chord
|
195
|
+
start_strings = Chord.start_of_strings Chordy.tuning, Chordy.start_delimiter, Chordy.low_to_high
|
196
|
+
|
177
197
|
start_strings.each { |s| lines_to_print.push s }
|
178
198
|
end
|
179
199
|
to_print_start_chords = false
|
@@ -181,40 +201,40 @@ module Chordy
|
|
181
201
|
end
|
182
202
|
|
183
203
|
last_chord_lines = lines_to_print.last(tuning_length + 1)
|
184
|
-
curr_chord =
|
204
|
+
curr_chord = chords[chord_index]
|
185
205
|
if curr_chord.is_a? Chord
|
186
|
-
last_chord_lines.each_with_index do |line,i|
|
206
|
+
last_chord_lines.each_with_index do |line, i|
|
187
207
|
if i == tuning_length
|
188
208
|
line << curr_chord.print_flag
|
189
209
|
else
|
190
|
-
line << curr_chord.print_string_at(i,
|
210
|
+
line << curr_chord.print_string_at(i, Chordy.chord_space, Chordy.low_to_high)
|
191
211
|
end
|
192
212
|
end
|
193
213
|
|
194
214
|
chords_in_section = chords_in_section + 1
|
195
215
|
to_skip_end_strings = false
|
196
|
-
elsif (
|
197
|
-
lines_to_print.push
|
216
|
+
elsif (chords[chord_index].is_a? Util::Text) or (chords[chord_index].is_a? Util::Section)
|
217
|
+
lines_to_print.push chords[chord_index].to_s
|
198
218
|
to_skip_end_strings = true
|
199
219
|
chords_in_section = 0
|
200
220
|
|
201
|
-
if
|
221
|
+
if chords[chord_index + 1].is_a? Chord
|
202
222
|
to_print_start_chords = true
|
203
223
|
end
|
204
224
|
end
|
205
225
|
|
206
226
|
chord_index = chord_index + 1
|
207
|
-
if (
|
227
|
+
if (chords[chord_index].is_a? Util::Text) or (chords[chord_index].is_a? Util::Section)
|
208
228
|
is_next_chord_section_or_text = true
|
209
229
|
else
|
210
230
|
is_next_chord_section_or_text = false
|
211
231
|
end
|
212
232
|
|
213
|
-
if ((chords_in_section %
|
233
|
+
if ((chords_in_section % Chordy.line_length) == 0) or (chord_index == chords.length) or is_next_chord_section_or_text
|
214
234
|
if to_skip_end_strings
|
215
235
|
to_skip_end_strings = false
|
216
236
|
else
|
217
|
-
end_strings = Chord.end_of_strings
|
237
|
+
end_strings = Chord.end_of_strings Chordy.tuning, Chordy.end_delimiter
|
218
238
|
last_chord_lines.each_with_index do |line, i|
|
219
239
|
line << end_strings[i]
|
220
240
|
end
|
@@ -223,9 +243,9 @@ module Chordy
|
|
223
243
|
# start the next actual line
|
224
244
|
lines_to_print.push ""
|
225
245
|
is_new_line = true
|
226
|
-
elsif (chords_in_section %
|
246
|
+
elsif (chords_in_section % Chordy.line_length) == (Chordy.line_length / 2) and is_even_line_length
|
227
247
|
last_chord_lines.each_with_index do |line, i|
|
228
|
-
line << Chord.print_half_length_string_at(i,
|
248
|
+
line << Chord.print_half_length_string_at(i, Chordy.tuning, Chordy.half_length_delimiter, Chordy.chord_space)
|
229
249
|
end
|
230
250
|
end
|
231
251
|
|
@@ -233,7 +253,7 @@ module Chordy
|
|
233
253
|
is_new_line = false
|
234
254
|
end
|
235
255
|
|
236
|
-
if chord_index >=
|
256
|
+
if chord_index >= chords.length
|
237
257
|
is_done = true
|
238
258
|
end
|
239
259
|
end
|
@@ -246,20 +266,21 @@ module Chordy
|
|
246
266
|
Chord::CHORD_FLAGS.each_with_index do |name,i|
|
247
267
|
eval <<-ENDOFEVAL
|
248
268
|
def #{name}
|
249
|
-
saved_auto =
|
250
|
-
saved_chord_index =
|
251
|
-
|
269
|
+
saved_auto = Chordy.auto
|
270
|
+
saved_chord_index = Chordy.chords.length
|
271
|
+
Chordy.auto = false
|
252
272
|
begin
|
253
273
|
chord = yield if block_given?
|
254
274
|
|
255
|
-
num_new_chords =
|
256
|
-
|
275
|
+
num_new_chords = Chordy.chords.length - saved_chord_index
|
276
|
+
Chordy.chords.last(num_new_chords).each { |c| c.send :#{name} }
|
257
277
|
rescue Exception => e
|
258
278
|
puts e.class.to_s
|
259
279
|
puts e.message
|
280
|
+
puts e.backtrace
|
260
281
|
end
|
261
282
|
|
262
|
-
|
283
|
+
Chordy.auto = saved_auto
|
263
284
|
do_print
|
264
285
|
chord
|
265
286
|
end
|
@@ -267,8 +288,8 @@ module Chordy
|
|
267
288
|
|
268
289
|
if name != "dont_play"
|
269
290
|
eval <<-ENDOFEVAL
|
270
|
-
def play_#{name} chords,
|
271
|
-
#{name} { play chords,
|
291
|
+
def play_#{name} chords, chord_type_or_direction=:major
|
292
|
+
#{name} { play chords, chord_type_or_direction }
|
272
293
|
end
|
273
294
|
ENDOFEVAL
|
274
295
|
end
|
data/lib/chordy/chord.rb
ADDED
@@ -0,0 +1,228 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Chordy
|
4
|
+
|
5
|
+
class Chord
|
6
|
+
CHORD_FLAGS = %w(mute harmonic bend pull hammer_down slide_down slide_up dont_play vibrato)
|
7
|
+
|
8
|
+
def self.all_flags
|
9
|
+
CHORD_FLAGS.to_a
|
10
|
+
end
|
11
|
+
|
12
|
+
# gets number of high strings in a tuning by approximation
|
13
|
+
def self.get_num_high_strings length
|
14
|
+
(length / 3.0).ceil
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.start_of_strings tuning, start_delimiter, low_to_high
|
18
|
+
num_strings = tuning.length
|
19
|
+
num_high_strings = get_num_high_strings num_strings
|
20
|
+
|
21
|
+
strings_in_downcase = tuning.map { |s| s.downcase }
|
22
|
+
high_strings = strings_in_downcase.last(num_high_strings)
|
23
|
+
low_strings = strings_in_downcase.first(num_strings - num_high_strings).map { |s| s.capitalize }
|
24
|
+
|
25
|
+
strings_range = low_strings + high_strings
|
26
|
+
if !low_to_high
|
27
|
+
strings_range = strings_range.reverse
|
28
|
+
end
|
29
|
+
|
30
|
+
strings_to_print = strings_range.map { |s| s.rjust(2) + start_delimiter.rjust(2) }
|
31
|
+
strings_to_print + [ " " * 4 ]
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.end_of_strings tuning, end_delimiter
|
35
|
+
num_strings = tuning.length
|
36
|
+
([ end_delimiter ] * num_strings) + [ "" ]
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.print_half_length_string_at string_pos, tuning, half_length_delimiter, chord_space
|
40
|
+
if string_pos == tuning.length
|
41
|
+
"".rjust(2)
|
42
|
+
else
|
43
|
+
half_length_delimiter.rjust(2, chord_space)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.short_chords
|
48
|
+
{
|
49
|
+
:M => :major,
|
50
|
+
:m => :minor,
|
51
|
+
:_7 => :dominant_7,
|
52
|
+
:_7_5 => :dominant_7_5,
|
53
|
+
:_9 => :diminished_9,
|
54
|
+
:M6 => :major_6,
|
55
|
+
:M7 => :major_7,
|
56
|
+
:M9 => :major_9,
|
57
|
+
:m5 => :diminished_5,
|
58
|
+
:m6 => :minor_6,
|
59
|
+
:m7 => :minor_7,
|
60
|
+
:m7_5 => :half_diminished_7,
|
61
|
+
:mM7 => :minor_major_7,
|
62
|
+
:aug5 => :augmented_5,
|
63
|
+
:aug7 => :augmented_7,
|
64
|
+
:aug7_5 => :augmented_major_7,
|
65
|
+
:dim => :diminished_7,
|
66
|
+
:dim7 => :diminished_7,
|
67
|
+
:dim5 => :diminished_5,
|
68
|
+
:dim9 => :diminished_9,
|
69
|
+
:sus => :suspended_4,
|
70
|
+
:sus4 => :suspended_4,
|
71
|
+
:sus7 => :suspended_7,
|
72
|
+
}
|
73
|
+
end
|
74
|
+
|
75
|
+
def initialize chord, strings
|
76
|
+
@strings = [-1] * strings
|
77
|
+
pad_low = false
|
78
|
+
if chord.instance_of? String or chord.instance_of? Symbol
|
79
|
+
short_chords = Chord.short_chords
|
80
|
+
if short_chords.key? chord
|
81
|
+
chord_strings = play short_chords[chord]
|
82
|
+
@type = short_chords[chord]
|
83
|
+
else
|
84
|
+
chord_strings = play chord.to_sym
|
85
|
+
@type = chord.to_sym
|
86
|
+
end
|
87
|
+
pad_low = true
|
88
|
+
elsif chord.instance_of? Array
|
89
|
+
chord_strings = chord.to_a
|
90
|
+
end
|
91
|
+
|
92
|
+
@strings = chord_strings
|
93
|
+
pad_or_trim strings, pad_low
|
94
|
+
@flags = 0
|
95
|
+
end
|
96
|
+
|
97
|
+
def pad_or_trim length, pad_low
|
98
|
+
if @strings.length > length
|
99
|
+
@strings = @strings.last length
|
100
|
+
elsif @strings.length < length
|
101
|
+
diff = length - @strings.length
|
102
|
+
if pad_low
|
103
|
+
first = @strings.first
|
104
|
+
min = @strings.min
|
105
|
+
|
106
|
+
# play as bar chord
|
107
|
+
bar_chord_string = ((first == min) and (min > 0) and (first > 0)) ? first : -1
|
108
|
+
@strings = ([bar_chord_string] * diff) + @strings
|
109
|
+
else
|
110
|
+
@strings = @strings + [-1] * diff
|
111
|
+
end
|
112
|
+
|
113
|
+
self
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def play chord_type
|
118
|
+
method_for_chord_type = "play_" + chord_type.to_s
|
119
|
+
chord = eval(method_for_chord_type)
|
120
|
+
chord
|
121
|
+
end
|
122
|
+
|
123
|
+
def reverse_strings!
|
124
|
+
@strings = @strings.reverse
|
125
|
+
self
|
126
|
+
end
|
127
|
+
|
128
|
+
def strings
|
129
|
+
@strings
|
130
|
+
end
|
131
|
+
|
132
|
+
def flags
|
133
|
+
@flags
|
134
|
+
end
|
135
|
+
|
136
|
+
def has_flag flag
|
137
|
+
(@flags & flag) == flag
|
138
|
+
end
|
139
|
+
|
140
|
+
def add_flag flag
|
141
|
+
@flags = @flags | flag
|
142
|
+
self
|
143
|
+
end
|
144
|
+
|
145
|
+
def get_index_to_print i, low_to_high
|
146
|
+
if low_to_high
|
147
|
+
i
|
148
|
+
else
|
149
|
+
@strings.length - i - 1
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def print_string_at i, chord_space, low_to_high=false
|
154
|
+
to_print = chord_space
|
155
|
+
index_to_print = get_index_to_print i, low_to_high
|
156
|
+
string = @strings[index_to_print]
|
157
|
+
if string != -1
|
158
|
+
to_print = string.to_s
|
159
|
+
end
|
160
|
+
|
161
|
+
to_print = to_print.rjust(3, chord_space)
|
162
|
+
|
163
|
+
if @flags != 0
|
164
|
+
to_print = print_string_with_flag_at index_to_print, to_print, chord_space
|
165
|
+
end
|
166
|
+
|
167
|
+
to_print.ljust(4, chord_space)
|
168
|
+
end
|
169
|
+
|
170
|
+
def print_string_with_flag_at i, printed_string, chord_space
|
171
|
+
to_print = printed_string
|
172
|
+
string = @strings[i]
|
173
|
+
|
174
|
+
if string != -1
|
175
|
+
if has_flag DONT_PLAY
|
176
|
+
to_print = "x".rjust(3, chord_space)
|
177
|
+
elsif has_flag BEND
|
178
|
+
to_print = to_print + "b"
|
179
|
+
elsif has_flag HAMMER_DOWN
|
180
|
+
to_print = to_print + "h"
|
181
|
+
elsif has_flag PULL
|
182
|
+
to_print = to_print + "p"
|
183
|
+
elsif has_flag SLIDE_UP
|
184
|
+
to_print = to_print + "/"
|
185
|
+
elsif has_flag SLIDE_DOWN
|
186
|
+
to_print = to_print + "\\"
|
187
|
+
elsif has_flag VIBRATO
|
188
|
+
to_print = to_print + "~"
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
to_print
|
193
|
+
end
|
194
|
+
|
195
|
+
# for printing flags on diff line
|
196
|
+
def print_flag
|
197
|
+
to_print = ""
|
198
|
+
|
199
|
+
if has_flag MUTE
|
200
|
+
to_print = "M"
|
201
|
+
elsif has_flag HARMONIC
|
202
|
+
to_print = "H"
|
203
|
+
end
|
204
|
+
|
205
|
+
to_print.rjust(3).ljust(4)
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
Chord::CHORD_FLAGS.each_with_index do |name,i|
|
210
|
+
Chord.class_eval <<-ENDOFEVAL
|
211
|
+
#{name.upcase} = #{2**i}
|
212
|
+
|
213
|
+
def #{name}
|
214
|
+
add_flag #{name.upcase}
|
215
|
+
self
|
216
|
+
end
|
217
|
+
ENDOFEVAL
|
218
|
+
end
|
219
|
+
|
220
|
+
Chord.short_chords.values.each do |chord_type|
|
221
|
+
chord_type_str = chord_type.to_s
|
222
|
+
Chord.class_eval <<-ENDOFEVAL
|
223
|
+
def play_#{chord_type_str}
|
224
|
+
[-1] * 6
|
225
|
+
end
|
226
|
+
ENDOFEVAL
|
227
|
+
end
|
228
|
+
end
|