chordy 0.7.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.
@@ -0,0 +1,81 @@
1
+ # encoding: utf-8
2
+
3
+ require 'chord'
4
+
5
+ class B < Chord
6
+ def play_major
7
+ [2, 2, 4, 4, 4, 2]
8
+ end
9
+
10
+ def play_minor
11
+ [2, 2, 4, 4, 3, 2]
12
+ end
13
+
14
+ def play_dominant_7
15
+ [2, 2, 4, 2, 4, 2]
16
+ end
17
+
18
+ def play_dominant_7_5
19
+ [-1, 2, 1, 2, 0, 1]
20
+ end
21
+
22
+ def play_major_6
23
+ [2, 2, 4, 4, 4, 4]
24
+ end
25
+
26
+ def play_major_7
27
+ [2, 2, 4, 3, 4, 2]
28
+ end
29
+
30
+ def play_major_9
31
+ [-1, 2, 1, 2, 2, 2]
32
+ end
33
+
34
+ def play_minor_6
35
+ [-1, 2, 0, 1, 3, 2]
36
+ end
37
+
38
+ def play_minor_7
39
+ [-1, 2, 0, 2, 0, 2]
40
+ end
41
+
42
+ def play_half_diminished_7
43
+ [1, 0, 0, 2, 0, 1]
44
+ end
45
+
46
+ def play_minor_major_7
47
+ [2, 2, 4, 3, 3, 2]
48
+ end
49
+
50
+ def play_augmented_5
51
+ [3, -1, 5, 4, 4, 3]
52
+ end
53
+
54
+ def play_augmented_7
55
+ [-1, 2, 1, 2, 0, 3]
56
+ end
57
+
58
+ def play_augmented_major_7
59
+ [-1, 2, -1, 3, 4, 3]
60
+ end
61
+
62
+ def play_diminished_5
63
+ [1, -1, 3, 4, 3, 1]
64
+ end
65
+
66
+ def play_diminished_7
67
+ [-1, -1, 0, 1, 0, 1]
68
+ end
69
+
70
+ def play_diminished_9
71
+ [-1, 2, 1, 2, 1, 2]
72
+ end
73
+
74
+ def play_suspended_4
75
+ [2, 2, 4, 4, 5, 2]
76
+ end
77
+
78
+ def play_suspended_7
79
+ [2, 2, 2, 2, 5, 2]
80
+ end
81
+ end
@@ -0,0 +1,81 @@
1
+ # encoding: utf-8
2
+
3
+ require 'chord'
4
+
5
+ class C < Chord
6
+ def play_major
7
+ [3, 3, 2, 0, 1, 0]
8
+ end
9
+
10
+ def play_minor
11
+ [-1, 3, 1, 0, 4, 3]
12
+ end
13
+
14
+ def play_dominant_7
15
+ [0, 3, 2, 3, 1, 0]
16
+ end
17
+
18
+ def play_dominant_7_5
19
+ [-1, 1, 2, 3, 1, 2]
20
+ end
21
+
22
+ def play_major_6
23
+ [0, 3, 2, 1, 1, 0]
24
+ end
25
+
26
+ def play_major_7
27
+ [0, 3, 2, 0, 0, 0]
28
+ end
29
+
30
+ def play_major_9
31
+ [0, 3, 2, 3, 3, 0]
32
+ end
33
+
34
+ def play_minor_6
35
+ [-1, 3, 1, 2, 1, 3]
36
+ end
37
+
38
+ def play_minor_7
39
+ [-1, 1, 1, 3, 1, 3]
40
+ end
41
+
42
+ def play_half_diminished_7
43
+ [-1, 1, 1, 3, 1, 2]
44
+ end
45
+
46
+ def play_minor_major_7
47
+ [-1, 2, 1, 0, 0, 3]
48
+ end
49
+
50
+ def play_augmented_5
51
+ [0, 3, 2, 1, 1, 0]
52
+ end
53
+
54
+ def play_augmented_7
55
+ [-1, 1, 2, 3, 1, 4]
56
+ end
57
+
58
+ def play_augmented_major_7
59
+ [0, 3, 2, 1, 0, 0]
60
+ end
61
+
62
+ def play_diminished_5
63
+ [-1, -1, 4, 5, 4, 2]
64
+ end
65
+
66
+ def play_diminished_7
67
+ [-1, -1, 1, 2, 1, 2]
68
+ end
69
+
70
+ def play_diminished_9
71
+ [-1, 3, 2, 3, 2, 3]
72
+ end
73
+
74
+ def play_suspended_4
75
+ [3, 3, 3, 0, 1, 1]
76
+ end
77
+
78
+ def play_suspended_7
79
+ [1, 1, 3, 3, 1, 1]
80
+ end
81
+ end
@@ -0,0 +1,83 @@
1
+ # encoding: utf-8
2
+
3
+ require 'chord'
4
+
5
+ class CSharp < Chord
6
+ def play_major
7
+ [1, 4, 3, 1, 2, 1]
8
+ end
9
+
10
+ def play_minor
11
+ [0, -1, 2, 1, 2, 4]
12
+ end
13
+
14
+ def play_dominant_7
15
+ [1, 2, 3, 1, 2, 1]
16
+ end
17
+
18
+ def play_dominant_7_5
19
+ [-1, 2, 3, 4, 2, 3]
20
+ end
21
+
22
+ def play_major_6
23
+ [1, 1, 3, 1, 2, 1]
24
+ end
25
+
26
+ def play_major_7
27
+ [1, 4, 3, 1, 1, 1]
28
+ end
29
+
30
+ def play_major_9
31
+ [1, 2, 1, 1, 2, 1]
32
+ end
33
+
34
+ def play_minor_6
35
+ [0, 4, 2, 3, 2, 4]
36
+ end
37
+
38
+ def play_minor_7
39
+ [0, 2, 2, 4, 2, 4]
40
+ end
41
+
42
+ def play_half_diminished_7
43
+ [0, 2, 2, 4, 2, 3]
44
+ end
45
+
46
+ def play_minor_major_7
47
+ [0, 3, 2, 1, 1, 4]
48
+ end
49
+
50
+ def play_augmented_5
51
+ [-1, 0, 3, 2, 2, 1]
52
+ end
53
+
54
+ def play_augmented_7
55
+ [-1, 2, 3, 4, 2, 5]
56
+ end
57
+
58
+ def play_augmented_major_7
59
+ [1, 4, 3, 2, 1, 1]
60
+ end
61
+
62
+ def play_diminished_5
63
+ [0, -1, 2, 0, 2, 3]
64
+ end
65
+
66
+ def play_diminished_7
67
+ [-1, -1, 2, 3, 2, 3]
68
+ end
69
+
70
+ def play_diminished_9
71
+ [-1, 4, 3, 4, 3, 4]
72
+ end
73
+
74
+ def play_suspended_4
75
+ [4, 4, 6, 6, 7, 4]
76
+ end
77
+
78
+ def play_suspended_7
79
+ [2, 2, 4, 4, 2, 2]
80
+ end
81
+ end
82
+
83
+ DFlat = CSharp
@@ -0,0 +1,193 @@
1
+ # encoding: utf-8
2
+
3
+ class Chord
4
+ CHORD_FLAGS = %w(mute harmonic bend pull hammer_down slide_down slide_up dont_play vibrato)
5
+
6
+ def self.all_flags
7
+ CHORD_FLAGS.to_a
8
+ end
9
+
10
+ def self.start_of_strings tuning, start_delimiter
11
+ num_strings = tuning.length
12
+ (0...num_strings).map { |s| tuning[s].rjust(2) + start_delimiter.rjust(2) } + [ " " * 4 ]
13
+ end
14
+
15
+ def self.end_of_strings tuning, end_delimiter
16
+ num_strings = tuning.length
17
+ ([ end_delimiter ] * num_strings) + [ "" ]
18
+ end
19
+
20
+ def self.print_half_length_string_at string_pos, tuning, half_length_delimiter, chord_space
21
+ if string_pos == tuning.length
22
+ "".rjust(2)
23
+ else
24
+ half_length_delimiter.rjust(2, chord_space)
25
+ end
26
+ end
27
+
28
+ def self.short_chords
29
+ {
30
+ :M => :major,
31
+ :m => :minor,
32
+ :_7 => :dominant_7,
33
+ :_7_5 => :dominant_7_5,
34
+ :_9 => :diminished_9,
35
+ :M6 => :major_6,
36
+ :M7 => :major_7,
37
+ :M9 => :major_9,
38
+ :m5 => :diminished_5,
39
+ :m6 => :minor_6,
40
+ :m7 => :minor_7,
41
+ :m7_5 => :half_diminished_7,
42
+ :mM7 => :minor_major_7,
43
+ :aug5 => :augmented_5,
44
+ :aug7 => :augmented_7,
45
+ :aug7_5 => :augmented_major_7,
46
+ :dim => :diminished_7,
47
+ :dim7 => :diminished_7,
48
+ :dim5 => :diminished_5,
49
+ :dim9 => :diminished_9,
50
+ :sus => :suspended_4,
51
+ :sus4 => :suspended_4,
52
+ :sus7 => :suspended_7,
53
+ }
54
+ end
55
+
56
+ def initialize chord, strings
57
+ @strings = [-1] * strings
58
+ pad_low = false
59
+ if chord.instance_of? String or chord.instance_of? Symbol
60
+ short_chords = Chord.short_chords
61
+ if short_chords.key? chord
62
+ chord_strings = play short_chords[chord]
63
+ @type = short_chords[chord]
64
+ else
65
+ chord_strings = play chord.to_sym
66
+ @type = chord.to_sym
67
+ end
68
+ pad_low = true
69
+ elsif chord.instance_of? Array
70
+ chord_strings = chord.to_a
71
+ end
72
+
73
+ @strings = chord_strings
74
+ pad_or_trim strings, pad_low
75
+ @flags = 0
76
+ end
77
+
78
+ def pad_or_trim length, pad_low
79
+ if @strings.length > length
80
+ @strings = @strings.last length
81
+ elsif @strings.length < length
82
+ diff = length - @strings.length
83
+ if pad_low
84
+ first = @strings.first
85
+ min = @strings.min
86
+
87
+ # play as bar chord
88
+ bar_chord_string = ((first == min) and (min > 0) and (first > 0)) ? first : -1
89
+ @strings = ([bar_chord_string] * diff) + @strings
90
+ else
91
+ @strings = @strings + [-1] * diff
92
+ end
93
+
94
+ self
95
+ end
96
+ end
97
+
98
+ def play chord_type
99
+ method_for_chord_type = "play_" + chord_type.to_s
100
+ chord = eval(method_for_chord_type)
101
+ chord
102
+ end
103
+
104
+ def strings
105
+ @strings
106
+ end
107
+
108
+ def flags
109
+ @flags
110
+ end
111
+
112
+ def has_flag flag
113
+ (@flags & flag) == flag
114
+ end
115
+
116
+ def add_flag flag
117
+ @flags = @flags | flag
118
+ self
119
+ end
120
+
121
+ def print_string_at i, chord_space
122
+ to_print = chord_space
123
+ string = @strings[i]
124
+ if string != -1
125
+ to_print = string.to_s
126
+ end
127
+
128
+ to_print = to_print.rjust(3, chord_space)
129
+
130
+ if @flags != 0
131
+ to_print = print_string_with_flag_at i, to_print, chord_space
132
+ end
133
+
134
+ to_print.ljust(4, chord_space)
135
+ end
136
+
137
+ def print_string_with_flag_at i, printed_string, chord_space
138
+ to_print = printed_string
139
+ string = @strings[i]
140
+
141
+ if string != -1
142
+ if has_flag DONT_PLAY
143
+ to_print = "x".rjust(3, chord_space)
144
+ elsif has_flag BEND
145
+ to_print = to_print + "b"
146
+ elsif has_flag HAMMER_DOWN
147
+ to_print = to_print + "h"
148
+ elsif has_flag PULL
149
+ to_print = to_print + "p"
150
+ elsif has_flag SLIDE_UP
151
+ to_print = to_print + "/"
152
+ elsif has_flag SLIDE_DOWN
153
+ to_print = to_print + "\\"
154
+ elsif has_flag VIBRATO
155
+ to_print = to_print + "~"
156
+ end
157
+ end
158
+
159
+ to_print
160
+ end
161
+
162
+ # for printing flags on diff line
163
+ def print_flag
164
+ to_print = ""
165
+
166
+ if has_flag MUTE
167
+ to_print = "M"
168
+ elsif has_flag HARMONIC
169
+ to_print = "H"
170
+ end
171
+
172
+ to_print.rjust(3).ljust(4)
173
+ end
174
+ end
175
+
176
+ Chord::CHORD_FLAGS.each_with_index do |name,i|
177
+ Chord.class_eval <<-ENDOFEVAL
178
+ #{name.upcase} = #{2**i}
179
+ private
180
+ def #{name}()
181
+ add_flag #{name.upcase}
182
+ end
183
+ ENDOFEVAL
184
+ end
185
+
186
+ Chord.short_chords.values.each do |chord_type|
187
+ chord_type_str = chord_type.to_s
188
+ Chord.class_eval <<-ENDOFEVAL
189
+ def play_#{chord_type_str}
190
+ [-1] * 6
191
+ end
192
+ ENDOFEVAL
193
+ end
@@ -0,0 +1,287 @@
1
+ # encoding: utf-8
2
+
3
+ require 'chord'
4
+
5
+ require 'c_chords'
6
+ require 'c_sharp_chords'
7
+ require 'd_chords'
8
+ require 'd_sharp_chords'
9
+ require 'e_chords'
10
+ require 'f_chords'
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
23
+
24
+ module Chordy
25
+ $line_length = 8
26
+ $separator_length = 40
27
+ $chords = []
28
+ $auto = true
29
+ $tuning = tuning_6_standard.map { |e| e.capitalize }
30
+ $reverse = false
31
+
32
+ # printing delimiters
33
+ $chord_space = "-"
34
+ $half_length_delimiter = "|"
35
+ $start_delimiter = "["
36
+ $end_delimiter = "]"
37
+
38
+ def auto a=true
39
+ $auto = if a then true else false end
40
+ end
41
+
42
+ def no_auto
43
+ auto false
44
+ end
45
+
46
+ def line_length a
47
+ if a.instance_of? Fixnum
48
+ $line_length = a
49
+ do_print
50
+ else
51
+ puts "Invalid length"
52
+ end
53
+ end
54
+
55
+ def clear
56
+ $chords = []
57
+ do_print
58
+ end
59
+
60
+ # TODO document + examples
61
+
62
+ def set_tuning_with_padding tuning
63
+ longest_tuning_str_length = tuning.max.length
64
+ $tuning = tuning.map { |e| e.capitalize.rjust(longest_tuning_str_length) }
65
+
66
+ $chords = $chords.each { |e| e.pad_or_trim $tuning.length, true }
67
+ end
68
+
69
+ def tune new_tuning
70
+ to_do_print = false
71
+ strings = [6, 7, 8]
72
+
73
+ if new_tuning.is_a? Array
74
+ if strings.include? new_tuning.length
75
+ set_tuning_with_padding new_tuning
76
+ to_do_print = true
77
+ else
78
+ puts "Invalid tuning; only " + strings.join(",") + " strings are allowed"
79
+ end
80
+ else
81
+ if is_tuning? new_tuning.to_s
82
+ new_tuning = eval("#{new_tuning}")
83
+ set_tuning_with_padding new_tuning
84
+ to_do_print = true
85
+ else
86
+ puts "Unknown or invalid tuning"
87
+ end
88
+ end
89
+
90
+ if to_do_print
91
+ do_print
92
+ end
93
+ end
94
+
95
+ def check_sharp_or_flat_chord chord_name
96
+ chord = chord_name.capitalize
97
+ sharp_re = /!$/
98
+ flat_re = /_$/
99
+
100
+ if sharp_re =~ chord
101
+ chord = chord.gsub(sharp_re, "Sharp")
102
+ elsif flat_re =~ chord
103
+ chord = chord.gsub(flat_re, "Flat")
104
+ end
105
+
106
+ chord
107
+ end
108
+
109
+ def check_chord_class chord_name
110
+ eval("defined?(#{chord_name}) == 'constant' and #{chord_name}.class == Class")
111
+ end
112
+
113
+ def play chords, chord_type=:major
114
+ chord = nil
115
+ begin
116
+ if chords.instance_of? Array
117
+ chord = Chord.new(chords, $tuning.length)
118
+ else
119
+ chord_name = chords.to_s
120
+ if !check_chord_class chord_name
121
+ chord_name = check_sharp_or_flat_chord chord_name
122
+ end
123
+
124
+ chord_init = "#{chord_name}.new :#{chord_type}, #{$tuning.length}"
125
+ chord = eval(chord_init)
126
+ end
127
+
128
+ $chords.push chord
129
+ do_print
130
+ rescue NameError => ne
131
+ puts "Unknown chord or chord type"
132
+ puts ne.message
133
+ rescue Exception => e
134
+ puts e.class.to_s
135
+ puts e.message
136
+ end
137
+
138
+ chord
139
+ end
140
+
141
+ def text text
142
+ $chords.push Text.new(text)
143
+ do_print
144
+ end
145
+
146
+ def section title=""
147
+ $chords.push Section.new(title, $separator_length)
148
+ do_print
149
+ end
150
+
151
+ def separator
152
+ section
153
+ end
154
+
155
+ def do_print
156
+ if $auto
157
+ print_chords
158
+ end
159
+ end
160
+
161
+ def print_chords
162
+ lines_to_print = []
163
+ chord_index = 0
164
+ chords_in_section = 0
165
+ tuning_length = $tuning.length
166
+ is_done = false
167
+ is_new_line = true
168
+ is_even_line_length = ($line_length % 2) == 0
169
+ is_next_chord_section_or_text = false
170
+ to_print_start_chords = false
171
+ to_skip_end_strings = false
172
+
173
+ while !is_done
174
+ if is_new_line or to_print_start_chords
175
+ if $chords[chord_index].is_a? Chord
176
+ start_strings = Chord.start_of_strings $tuning, $start_delimiter
177
+ start_strings.each { |s| lines_to_print.push s }
178
+ end
179
+ to_print_start_chords = false
180
+ is_new_line = false
181
+ end
182
+
183
+ last_chord_lines = lines_to_print.last(tuning_length + 1)
184
+ curr_chord = $chords[chord_index]
185
+ if curr_chord.is_a? Chord
186
+ last_chord_lines.each_with_index do |line,i|
187
+ if i == tuning_length
188
+ line << curr_chord.print_flag
189
+ else
190
+ line << curr_chord.print_string_at(i, $chord_space)
191
+ end
192
+ end
193
+
194
+ chords_in_section = chords_in_section + 1
195
+ to_skip_end_strings = false
196
+ elsif ($chords[chord_index].is_a? Text) or ($chords[chord_index].is_a? Section)
197
+ lines_to_print.push $chords[chord_index].to_s
198
+ to_skip_end_strings = true
199
+ chords_in_section = 0
200
+
201
+ if $chords[chord_index + 1].is_a? Chord
202
+ to_print_start_chords = true
203
+ end
204
+ end
205
+
206
+ chord_index = chord_index + 1
207
+ if ($chords[chord_index].is_a? Text) or ($chords[chord_index].is_a? Section)
208
+ is_next_chord_section_or_text = true
209
+ else
210
+ is_next_chord_section_or_text = false
211
+ end
212
+
213
+ if ((chords_in_section % $line_length) == 0) or (chord_index == $chords.length) or is_next_chord_section_or_text
214
+ if to_skip_end_strings
215
+ to_skip_end_strings = false
216
+ else
217
+ end_strings = Chord.end_of_strings $tuning, $end_delimiter
218
+ last_chord_lines.each_with_index do |line, i|
219
+ line << end_strings[i]
220
+ end
221
+ end
222
+
223
+ # start the next actual line
224
+ lines_to_print.push ""
225
+ is_new_line = true
226
+ elsif (chords_in_section % $line_length) == ($line_length / 2) and is_even_line_length
227
+ last_chord_lines.each_with_index do |line, i|
228
+ line << Chord.print_half_length_string_at(i, $tuning, $half_length_delimiter, $chord_space)
229
+ end
230
+ end
231
+
232
+ if is_next_chord_section_or_text
233
+ is_new_line = false
234
+ end
235
+
236
+ if chord_index >= $chords.length
237
+ is_done = true
238
+ end
239
+ end
240
+
241
+ # print the buffer
242
+ lines_to_print.each { |l| puts l }
243
+ nil
244
+ end
245
+
246
+ Chord::CHORD_FLAGS.each_with_index do |name,i|
247
+ eval <<-ENDOFEVAL
248
+ def #{name}
249
+ saved_auto = $auto
250
+ saved_chord_index = $chords.length
251
+ $auto = false
252
+ begin
253
+ chord = yield if block_given?
254
+
255
+ num_new_chords = $chords.length - saved_chord_index
256
+ $chords.last(num_new_chords).each { |c| c.send :#{name} }
257
+ rescue Exception => e
258
+ puts e.class.to_s
259
+ puts e.message
260
+ end
261
+
262
+ $auto = saved_auto
263
+ do_print
264
+ chord
265
+ end
266
+ ENDOFEVAL
267
+
268
+ if name != "dont_play"
269
+ eval <<-ENDOFEVAL
270
+ def play_#{name} chords, chord_type=:major
271
+ #{name} { play chords, chord_type }
272
+ end
273
+ ENDOFEVAL
274
+ end
275
+ end
276
+
277
+ Chord.short_chords.values.each do |s|
278
+ short_chord_name = s.to_s
279
+ eval <<-ENDOFEVAL
280
+ def #{short_chord_name}
281
+ :#{s}
282
+ end
283
+ ENDOFEVAL
284
+ end
285
+ end
286
+
287
+ include Chordy