chordy 0.7.1

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