gitara 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.markdown +5 -0
- data/README.markdown +15 -0
- data/examples/eraserheads-huling-el-bimbo/tab.ly +188 -144
- data/examples/eraserheads-huling-el-bimbo/tab.midi +0 -0
- data/examples/eraserheads-huling-el-bimbo/tab.pdf +0 -0
- data/examples/eraserheads-huling-el-bimbo/tab.rb +5 -3
- data/examples/tab-with-partial.ly +167 -0
- data/examples/tab-with-partial.rb +35 -0
- data/examples/tab.ly +29 -29
- data/lib/gitara/dsl.rb +4 -0
- data/lib/gitara/node/bar.rb +11 -1
- data/lib/gitara/template/bar.erb +3 -3
- data/lib/gitara/version.rb +1 -1
- data/spec/lib/gitara/app_spec.rb +26 -7
- data/spec/lib/gitara/dsl_spec.rb +11 -0
- data/spec/lib/gitara/node/bar_spec.rb +36 -0
- metadata +28 -26
data/CHANGELOG.markdown
CHANGED
data/README.markdown
CHANGED
@@ -52,6 +52,21 @@ Bars are the smallest expressions in Gitara, that is, a gitara file must have at
|
|
52
52
|
|
53
53
|
With Gitara, it's easier to write notes using [absolute note names](http://lilypond.org/doc/v2.12/Documentation/user/lilypond/Writing-pitches#Absolute-octave-entry) instead of relative note names. This is because we'll be reusing bars and other Gitara expressions (see Reusing bars below).
|
54
54
|
|
55
|
+
Partial measures
|
56
|
+
----------------
|
57
|
+
|
58
|
+
To indicate that a bar is a [partial measure](http://lilypond.org/doc/v2.12/Documentation/user/lilypond-learning/Advanced-rhythmic-commands#Partial-measure), call `partial <duration>`:
|
59
|
+
|
60
|
+
chords :G8, 'r8-"G"'
|
61
|
+
|
62
|
+
bar do
|
63
|
+
partial 8
|
64
|
+
notes "<g/3>8"
|
65
|
+
notes "r8"
|
66
|
+
chords :G8
|
67
|
+
end
|
68
|
+
|
69
|
+
As shown by the example, the durations of the chords and notes within the bar must also have one-eighth durations in order for the tab to render properly.
|
55
70
|
|
56
71
|
Multiple voices
|
57
72
|
---------------
|
@@ -16,6 +16,7 @@
|
|
16
16
|
% Chord Sets
|
17
17
|
|
18
18
|
cChordSetG = { r1-"G" }
|
19
|
+
cChordSetGEight = { r8-"G" }
|
19
20
|
cChordSetC = { r1-"C" }
|
20
21
|
cChordSetASeven = { r1-"A7" }
|
21
22
|
cChordSetEm = { r1-"Em" }
|
@@ -24,145 +25,180 @@ cChordSetD = { r1-"D" }
|
|
24
25
|
%-----------------------------------------------------------------------
|
25
26
|
% Bars
|
26
27
|
|
27
|
-
vOneBarVerseLineOneBarOne = {
|
28
|
-
vTwoBarVerseLineOneBarOne = {
|
29
|
-
cBarVerseLineOneBarOne = { \
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
28
|
+
vOneBarVerseLineOneBarOne = { \partial 8 <g\3>8 }
|
29
|
+
vTwoBarVerseLineOneBarOne = { \partial 8 r8 }
|
30
|
+
cBarVerseLineOneBarOne = { \partial 8 \cChordSetGEight }
|
31
|
+
sBarVerseLineOneBarOne = { \partial 8 r8^"Verse" }
|
32
|
+
|
33
|
+
vOneBarVerseLineOneBarTwo = { <a\3>16\glissando <b\3>16 <b\3>4 r16 <a\3>16\glissando <b\3>4. <a\3>16( <g\3>16) }
|
34
|
+
vTwoBarVerseLineOneBarTwo = { r1 }
|
35
|
+
cBarVerseLineOneBarTwo = { \cChordSetG }
|
36
|
+
sBarVerseLineOneBarTwo = { r1 }
|
37
|
+
|
38
|
+
vOneBarVerseLineOneBarThree = { <a\3>8( <g\3>4) <cs'\2>4 <g\3>4. }
|
39
|
+
vTwoBarVerseLineOneBarThree = { \skip 8 r8 <e\4>4 <a,\5>4 <e\4>8 <b,\5>8 }
|
40
|
+
cBarVerseLineOneBarThree = { \cChordSetASeven }
|
41
|
+
sBarVerseLineOneBarThree = { r1 }
|
42
|
+
|
43
|
+
vOneBarVerseLineOneBarFour = { r4 <g\3>8 <g\3>8 <g\3>8 <a\3>8 <c'\2>8 <b~\2>8 }
|
44
|
+
vTwoBarVerseLineOneBarFour = { <c\5>4 <e\4>4 <c\5>4 <e\4>4 }
|
45
|
+
cBarVerseLineOneBarFour = { \cChordSetC }
|
46
|
+
sBarVerseLineOneBarFour = { r1 }
|
47
|
+
|
48
|
+
vOneBarVerseLineOneBarFive = { <b\2>8 <g\3>8 <b\2>8 <b\2>16 <g\3>16 \skip 16 <b\2>16 <g\3>16 \skip 16 <b\2>16 <g\3>16 \skip 8 }
|
49
|
+
vTwoBarVerseLineOneBarFive = { <g,\6>4 <d\4>4 <d\4>16 \skip 16 \skip 16 <d\4>16 \skip 16 \skip 16 <d\4>8 }
|
50
|
+
cBarVerseLineOneBarFive = { \cChordSetG }
|
51
|
+
sBarVerseLineOneBarFive = { r1 }
|
52
|
+
|
53
|
+
vOneBarVerseLineTwoBarOne = { r8 <g\3>8 <b\2>8 <b\2>16 <b\2>8 <b\2>16( <d'\2>8) <e'\1>4 }
|
54
|
+
vTwoBarVerseLineTwoBarOne = { <g,\6>4 <d\4>4 <g,\6>4 <d\4>4 }
|
55
|
+
cBarVerseLineTwoBarOne = { \cChordSetG }
|
56
|
+
sBarVerseLineTwoBarOne = { r1 }
|
57
|
+
|
58
|
+
vOneBarVerseLineTwoBarTwo = { <a\3>16( <g\3>16)( <a\3>4) <cs'\2>4 <a\3>4 <b\2>8 }
|
59
|
+
vTwoBarVerseLineTwoBarTwo = { <a,\5>4 <e\4>4 <a,\5>4 <e\4>4 }
|
60
|
+
cBarVerseLineTwoBarTwo = { \cChordSetASeven }
|
61
|
+
sBarVerseLineTwoBarTwo = { r1 }
|
62
|
+
|
63
|
+
vOneBarVerseLineTwoBarThree = { <c'\2>4. <d'\2>4 <c'\2>4 <b~\2>8 }
|
64
|
+
vTwoBarVerseLineTwoBarThree = { <c\5>4 <e\4>4 <c\5>4 <e\4>4 }
|
65
|
+
cBarVerseLineTwoBarThree = { \cChordSetC }
|
66
|
+
sBarVerseLineTwoBarThree = { r1 }
|
67
|
+
|
68
|
+
vOneBarVerseLineTwoBarFour = { <b\2>8 <g\3>4 <g\3>4 <b\2>8 <b\2>8 <c'\2>8 }
|
69
|
+
vTwoBarVerseLineTwoBarFour = { <g,\6>4 <d\4>4 <g,\6>4 <d\4>4 }
|
70
|
+
cBarVerseLineTwoBarFour = { \cChordSetG }
|
71
|
+
sBarVerseLineTwoBarFour = { r1 }
|
72
|
+
|
73
|
+
vOneBarVerseLineThreeBarOne = { <d'\2>4. <d'\2>4 <d'\2>4 <cs'~\2>8 }
|
74
|
+
vTwoBarVerseLineThreeBarOne = { <g,\6>4 <d\4>4 <g,\6>4 <d\4>4 }
|
75
|
+
cBarVerseLineThreeBarOne = { \cChordSetG }
|
76
|
+
sBarVerseLineThreeBarOne = { r1 }
|
77
|
+
|
78
|
+
vOneBarVerseLineThreeBarTwo = { <cs'\2>8 <a\3>4 <a\3>4 <a\3>4 <b\2>8 }
|
79
|
+
vTwoBarVerseLineThreeBarTwo = { <a,\5>4 <e\4>4 <a,\5>4 <e\4>4 }
|
80
|
+
cBarVerseLineThreeBarTwo = { \cChordSetASeven }
|
81
|
+
sBarVerseLineThreeBarTwo = { r1 }
|
82
|
+
|
83
|
+
vOneBarVerseLineThreeBarThree = { <c'\2>4 <c'\2>8 <d'\2>4 <e'\1>4 <b~\2>8 }
|
84
|
+
vTwoBarVerseLineThreeBarThree = { <c\5>4 <e\4>4 <c\5>4 <e\4>4 }
|
85
|
+
cBarVerseLineThreeBarThree = { \cChordSetC }
|
86
|
+
sBarVerseLineThreeBarThree = { r1 }
|
87
|
+
|
88
|
+
vOneBarVerseLineThreeBarFour = { <b\2>8 <d'\2>4 <d'\2>4 <b\2>16 <a\3>8 <g\3>16( <a\3>8) }
|
89
|
+
vTwoBarVerseLineThreeBarFour = { <g,\6>4 <d\4>4 <g,\6>4 <d\4>4 }
|
90
|
+
cBarVerseLineThreeBarFour = { \cChordSetG }
|
91
|
+
sBarVerseLineThreeBarFour = { r1 }
|
92
|
+
|
93
|
+
vOneBarVerseLineFourBarOne = { <b\2>4. <b\2>4 <b\2>16 <b\2>16 r16 <a\3>16 <b\2>8 }
|
94
|
+
vTwoBarVerseLineFourBarOne = { <g,\6>4 <d\4>4 <g,\6>4 <d\4>4 }
|
95
|
+
cBarVerseLineFourBarOne = { \cChordSetG }
|
96
|
+
sBarVerseLineFourBarOne = { r1 }
|
97
|
+
|
98
|
+
vOneBarVerseLineFourBarTwo = { <a\3>16( <g\3>16) <e\4>4 <cs'\2>4 <g\3>16 <g\3>16 r16 <g\3>16 <g\3>8 }
|
99
|
+
vTwoBarVerseLineFourBarTwo = { <a,\5>4 <e\4>4 <a,\5>4 <e\4>4 }
|
100
|
+
cBarVerseLineFourBarTwo = { \cChordSetASeven }
|
101
|
+
sBarVerseLineFourBarTwo = { r1 }
|
102
|
+
|
103
|
+
vOneBarVerseLineFourBarThree = { <g\3>4. <g\3>4 <a\3>8 <c'\2>8 <b~\2>8 }
|
104
|
+
vTwoBarVerseLineFourBarThree = { <c\5>4 <e\4>4 <c\5>4 <e\4>4 }
|
105
|
+
cBarVerseLineFourBarThree = { \cChordSetC }
|
106
|
+
sBarVerseLineFourBarThree = { r1 }
|
107
|
+
|
108
|
+
vOneBarVerseLineFourBarFour = { <b\2>8 <g\3>4 <g\3>4 <g\3>4. }
|
109
|
+
vTwoBarVerseLineFourBarFour = { <g,\6>4 <d\4>4 <g,\6>4 <g,\6>8 <fs,\6>8 }
|
110
|
+
cBarVerseLineFourBarFour = { \cChordSetG }
|
111
|
+
sBarVerseLineFourBarFour = { r1 }
|
112
|
+
|
113
|
+
vOneBarRefrainLineOneBarOne = { r4 <g\3>8 <g\3>8 <g\3>8 <g\3>8 <e'\1>8 <d'~\2>8 }
|
114
|
+
vTwoBarRefrainLineOneBarOne = { <e,\6>4 <e\4>4 <e,\6>4 <e\4>4 }
|
115
|
+
cBarRefrainLineOneBarOne = { \cChordSetEm }
|
116
|
+
sBarRefrainLineOneBarOne = { r1^"Refrain" }
|
117
|
+
|
118
|
+
vOneBarRefrainLineOneBarTwo = { <d'\2>8 <b\2>4 <a\3>4 <a\3>4 <b\2>8 }
|
119
|
+
vTwoBarRefrainLineOneBarTwo = { <g,\6>4 <d\4>4 <g,\6>4 <d\4>4 }
|
120
|
+
cBarRefrainLineOneBarTwo = { \cChordSetG }
|
121
|
+
sBarRefrainLineOneBarTwo = { r1 }
|
122
|
+
|
123
|
+
vOneBarRefrainLineOneBarThree = { <c'\2>4 <c'\2>8 <d'\2>4 <g\3>8( <a\3>8) <b~\2>8 }
|
124
|
+
vTwoBarRefrainLineOneBarThree = { <c\5>4 <e\4>4 <c\5>4 <e\4>4 }
|
125
|
+
cBarRefrainLineOneBarThree = { \cChordSetC }
|
126
|
+
sBarRefrainLineOneBarThree = { r1 }
|
127
|
+
|
128
|
+
vOneBarRefrainLineOneBarFour = { <b\2>8 <a\3>4 <a\3>4 <a\3>4. }
|
129
|
+
vTwoBarRefrainLineOneBarFour = { <a,\5>4 <d\4>4 <a,\5>4 <g,\6>8 <fs,\6>8 }
|
130
|
+
cBarRefrainLineOneBarFour = { \cChordSetD }
|
131
|
+
sBarRefrainLineOneBarFour = { r1 }
|
132
|
+
|
133
|
+
vOneBarRefrainLineTwoBarOne = { r4 <g\3>8 <g\3>8 <g\3>8 <g\3>8 <e'\1>8 <d'~\2>8 }
|
134
|
+
vTwoBarRefrainLineTwoBarOne = { <e,\6>4 <e\4>4 <e,\6>4 <e\4>4 }
|
135
|
+
cBarRefrainLineTwoBarOne = { \cChordSetEm }
|
136
|
+
sBarRefrainLineTwoBarOne = { r1 }
|
137
|
+
|
138
|
+
vOneBarRefrainLineTwoBarTwo = { <d'\2>8 <b\2>4 <a\3>4 <a\3>4 <b\2>8 }
|
139
|
+
vTwoBarRefrainLineTwoBarTwo = { <g,\6>4 <d\4>4 <g,\6>4 <d\4>4 }
|
140
|
+
cBarRefrainLineTwoBarTwo = { \cChordSetG }
|
141
|
+
sBarRefrainLineTwoBarTwo = { r1 }
|
142
|
+
|
143
|
+
vOneBarRefrainLineTwoBarThree = { <c'\2>4 <c'\2>8 <d'\2>4 <e'\1>4 <e'~\1>8 }
|
144
|
+
vTwoBarRefrainLineTwoBarThree = { <c\5>4 <e\4>4 <c\5>4 <e\4>4 }
|
145
|
+
cBarRefrainLineTwoBarThree = { \cChordSetC }
|
146
|
+
sBarRefrainLineTwoBarThree = { r1 }
|
147
|
+
|
148
|
+
vOneBarRefrainLineTwoBarFour = { <e'\1>8 <d'\2>4 <d'\2>4 <d'\2>4 <d'\2>8 }
|
149
|
+
vTwoBarRefrainLineTwoBarFour = { <a,\5>4 <d\4>4 <a,\5>4 <d\4>4 }
|
150
|
+
cBarRefrainLineTwoBarFour = { \cChordSetD }
|
151
|
+
sBarRefrainLineTwoBarFour = { r1 }
|
152
|
+
|
153
|
+
vOneBarRefrainLineTwoBarFive = { <a\3 d'\2 >8 <a\3 d'\2 >8 <a\3 d'\2 >8 <a\3 d'\2 >8 <a\3 d'\2 >8 <b\2>8 <b\2>8 <c'\2>8 }
|
154
|
+
vTwoBarRefrainLineTwoBarFive = { <d\4>8 <d\4>8 <d\4>8 <d\4>8 <d\4>8 \skip 8 \skip 8 \skip 8 }
|
155
|
+
cBarRefrainLineTwoBarFive = { \cChordSetD }
|
156
|
+
sBarRefrainLineTwoBarFive = { r1 }
|
157
|
+
|
158
|
+
vOneBarChorusLineOneBarOne = { <d'\2>4. <g'\1>4 <d'\2>4 <cs'~\2>8 }
|
159
|
+
vTwoBarChorusLineOneBarOne = { <g,\6>4 <d\4>4 <g,\6>4 <d\4>4 }
|
160
|
+
cBarChorusLineOneBarOne = { \cChordSetG }
|
161
|
+
sBarChorusLineOneBarOne = { r1^"Chorus" }
|
162
|
+
|
163
|
+
vOneBarChorusLineOneBarTwo = { <cs'\2>4 <g'\1>8 <g'\1>4 <cs'\2>4 <c'~\2>8 }
|
164
|
+
vTwoBarChorusLineOneBarTwo = { <a,\5>4 <e\4>4 <a,\5>4 <e\4>4 }
|
165
|
+
cBarChorusLineOneBarTwo = { \cChordSetASeven }
|
166
|
+
sBarChorusLineOneBarTwo = { r1 }
|
167
|
+
|
168
|
+
vOneBarChorusLineOneBarThree = { <c'\2>4. <d'\2>4 <e'\1>4 <b~\2>8 }
|
169
|
+
vTwoBarChorusLineOneBarThree = { <c\5>4 <e\4>4 <c\5>4 <e\4>4 }
|
170
|
+
cBarChorusLineOneBarThree = { \cChordSetC }
|
171
|
+
sBarChorusLineOneBarThree = { r1 }
|
172
|
+
|
173
|
+
vOneBarChorusLineOneBarFour = { <b\2>8 <d'\2>4 <d'\2>4 <b\2>8 <b\2>8 <c'\2>8 }
|
174
|
+
vTwoBarChorusLineOneBarFour = { <g,\6>4 <d\4>4 <g,\6>4 <d\4>4 }
|
175
|
+
cBarChorusLineOneBarFour = { \cChordSetG }
|
176
|
+
sBarChorusLineOneBarFour = { r1 }
|
177
|
+
|
178
|
+
vOneBarChorusLineTwoBarOne = { <d'\2>4. <g'\1>4 <d'\2>4 <cs'~\2>8 }
|
179
|
+
vTwoBarChorusLineTwoBarOne = { <g,\6>4 <d\4>4 <g,\6>4 <d\4>4 }
|
180
|
+
cBarChorusLineTwoBarOne = { \cChordSetG }
|
181
|
+
sBarChorusLineTwoBarOne = { r1 }
|
182
|
+
|
183
|
+
vOneBarChorusLineTwoBarTwo = { <cs'\2>4 <g'\1>8 <g'\1>4 <cs'\2>4 <c'~\2>8 }
|
184
|
+
vTwoBarChorusLineTwoBarTwo = { <a,\5>4 <e\4>4 <a,\5>4 <e\4>4 }
|
185
|
+
cBarChorusLineTwoBarTwo = { \cChordSetASeven }
|
186
|
+
sBarChorusLineTwoBarTwo = { r1 }
|
187
|
+
|
188
|
+
vOneBarChorusLineTwoBarThree = { <c'\2>4. <d'\2>4 <c'\2>4 <b~\2>8 }
|
189
|
+
vTwoBarChorusLineTwoBarThree = { <c\5>4 <e\4>4 <c\5>4 <e\4>4 }
|
190
|
+
cBarChorusLineTwoBarThree = { \cChordSetC }
|
191
|
+
sBarChorusLineTwoBarThree = { r1 }
|
192
|
+
|
193
|
+
vOneBarChorusLineTwoBarFour = { <b\2>8 <g\3>4 <g\3>4 <g\3>4 <g\3>8 }
|
194
|
+
vTwoBarChorusLineTwoBarFour = { <g,\6>4 <d\4>4 <g,\6>4 <d\4>4 }
|
195
|
+
cBarChorusLineTwoBarFour = { \cChordSetG }
|
196
|
+
sBarChorusLineTwoBarFour = { r1 }
|
197
|
+
|
198
|
+
vOneBarChorusLineTwoBarFive = { <g\3 d'\2 g'\1 >1 }
|
199
|
+
vTwoBarChorusLineTwoBarFive = { <g,\6 b,\5 d\4 >1 }
|
200
|
+
cBarChorusLineTwoBarFive = { \cChordSetG }
|
201
|
+
sBarChorusLineTwoBarFive = { r1 }
|
166
202
|
|
167
203
|
|
168
204
|
%-----------------------------------------------------------------------
|
@@ -171,34 +207,42 @@ cBarChorusLineTwoBarFive = { \cChordSetG }
|
|
171
207
|
vOneLineVerseLineOne = { \vOneBarVerseLineOneBarOne \vOneBarVerseLineOneBarTwo \vOneBarVerseLineOneBarThree \vOneBarVerseLineOneBarFour \vOneBarVerseLineOneBarFive \break }
|
172
208
|
vTwoLineVerseLineOne = { \vTwoBarVerseLineOneBarOne \vTwoBarVerseLineOneBarTwo \vTwoBarVerseLineOneBarThree \vTwoBarVerseLineOneBarFour \vTwoBarVerseLineOneBarFive \break }
|
173
209
|
cLineVerseLineOne = { \cBarVerseLineOneBarOne \cBarVerseLineOneBarTwo \cBarVerseLineOneBarThree \cBarVerseLineOneBarFour \cBarVerseLineOneBarFive }
|
210
|
+
sLineVerseLineOne = { \sBarVerseLineOneBarOne \sBarVerseLineOneBarTwo \sBarVerseLineOneBarThree \sBarVerseLineOneBarFour \sBarVerseLineOneBarFive }
|
174
211
|
|
175
212
|
vOneLineVerseLineTwo = { \vOneBarVerseLineTwoBarOne \vOneBarVerseLineTwoBarTwo \vOneBarVerseLineTwoBarThree \vOneBarVerseLineTwoBarFour \break }
|
176
213
|
vTwoLineVerseLineTwo = { \vTwoBarVerseLineTwoBarOne \vTwoBarVerseLineTwoBarTwo \vTwoBarVerseLineTwoBarThree \vTwoBarVerseLineTwoBarFour \break }
|
177
214
|
cLineVerseLineTwo = { \cBarVerseLineTwoBarOne \cBarVerseLineTwoBarTwo \cBarVerseLineTwoBarThree \cBarVerseLineTwoBarFour }
|
215
|
+
sLineVerseLineTwo = { \sBarVerseLineTwoBarOne \sBarVerseLineTwoBarTwo \sBarVerseLineTwoBarThree \sBarVerseLineTwoBarFour }
|
178
216
|
|
179
217
|
vOneLineVerseLineThree = { \vOneBarVerseLineThreeBarOne \vOneBarVerseLineThreeBarTwo \vOneBarVerseLineThreeBarThree \vOneBarVerseLineThreeBarFour \break }
|
180
218
|
vTwoLineVerseLineThree = { \vTwoBarVerseLineThreeBarOne \vTwoBarVerseLineThreeBarTwo \vTwoBarVerseLineThreeBarThree \vTwoBarVerseLineThreeBarFour \break }
|
181
219
|
cLineVerseLineThree = { \cBarVerseLineThreeBarOne \cBarVerseLineThreeBarTwo \cBarVerseLineThreeBarThree \cBarVerseLineThreeBarFour }
|
220
|
+
sLineVerseLineThree = { \sBarVerseLineThreeBarOne \sBarVerseLineThreeBarTwo \sBarVerseLineThreeBarThree \sBarVerseLineThreeBarFour }
|
182
221
|
|
183
222
|
vOneLineVerseLineFour = { \vOneBarVerseLineFourBarOne \vOneBarVerseLineFourBarTwo \vOneBarVerseLineFourBarThree \vOneBarVerseLineFourBarFour \break }
|
184
223
|
vTwoLineVerseLineFour = { \vTwoBarVerseLineFourBarOne \vTwoBarVerseLineFourBarTwo \vTwoBarVerseLineFourBarThree \vTwoBarVerseLineFourBarFour \break }
|
185
224
|
cLineVerseLineFour = { \cBarVerseLineFourBarOne \cBarVerseLineFourBarTwo \cBarVerseLineFourBarThree \cBarVerseLineFourBarFour }
|
225
|
+
sLineVerseLineFour = { \sBarVerseLineFourBarOne \sBarVerseLineFourBarTwo \sBarVerseLineFourBarThree \sBarVerseLineFourBarFour }
|
186
226
|
|
187
227
|
vOneLineRefrainLineOne = { \vOneBarRefrainLineOneBarOne \vOneBarRefrainLineOneBarTwo \vOneBarRefrainLineOneBarThree \vOneBarRefrainLineOneBarFour \break }
|
188
228
|
vTwoLineRefrainLineOne = { \vTwoBarRefrainLineOneBarOne \vTwoBarRefrainLineOneBarTwo \vTwoBarRefrainLineOneBarThree \vTwoBarRefrainLineOneBarFour \break }
|
189
229
|
cLineRefrainLineOne = { \cBarRefrainLineOneBarOne \cBarRefrainLineOneBarTwo \cBarRefrainLineOneBarThree \cBarRefrainLineOneBarFour }
|
230
|
+
sLineRefrainLineOne = { \sBarRefrainLineOneBarOne \sBarRefrainLineOneBarTwo \sBarRefrainLineOneBarThree \sBarRefrainLineOneBarFour }
|
190
231
|
|
191
232
|
vOneLineRefrainLineTwo = { \vOneBarRefrainLineTwoBarOne \vOneBarRefrainLineTwoBarTwo \vOneBarRefrainLineTwoBarThree \vOneBarRefrainLineTwoBarFour \vOneBarRefrainLineTwoBarFive \break }
|
192
233
|
vTwoLineRefrainLineTwo = { \vTwoBarRefrainLineTwoBarOne \vTwoBarRefrainLineTwoBarTwo \vTwoBarRefrainLineTwoBarThree \vTwoBarRefrainLineTwoBarFour \vTwoBarRefrainLineTwoBarFive \break }
|
193
234
|
cLineRefrainLineTwo = { \cBarRefrainLineTwoBarOne \cBarRefrainLineTwoBarTwo \cBarRefrainLineTwoBarThree \cBarRefrainLineTwoBarFour \cBarRefrainLineTwoBarFive }
|
235
|
+
sLineRefrainLineTwo = { \sBarRefrainLineTwoBarOne \sBarRefrainLineTwoBarTwo \sBarRefrainLineTwoBarThree \sBarRefrainLineTwoBarFour \sBarRefrainLineTwoBarFive }
|
194
236
|
|
195
237
|
vOneLineChorusLineOne = { \vOneBarChorusLineOneBarOne \vOneBarChorusLineOneBarTwo \vOneBarChorusLineOneBarThree \vOneBarChorusLineOneBarFour \break }
|
196
238
|
vTwoLineChorusLineOne = { \vTwoBarChorusLineOneBarOne \vTwoBarChorusLineOneBarTwo \vTwoBarChorusLineOneBarThree \vTwoBarChorusLineOneBarFour \break }
|
197
239
|
cLineChorusLineOne = { \cBarChorusLineOneBarOne \cBarChorusLineOneBarTwo \cBarChorusLineOneBarThree \cBarChorusLineOneBarFour }
|
240
|
+
sLineChorusLineOne = { \sBarChorusLineOneBarOne \sBarChorusLineOneBarTwo \sBarChorusLineOneBarThree \sBarChorusLineOneBarFour }
|
198
241
|
|
199
242
|
vOneLineChorusLineTwo = { \vOneBarChorusLineTwoBarOne \vOneBarChorusLineTwoBarTwo \vOneBarChorusLineTwoBarThree \vOneBarChorusLineTwoBarFour \vOneBarChorusLineTwoBarFive \break }
|
200
243
|
vTwoLineChorusLineTwo = { \vTwoBarChorusLineTwoBarOne \vTwoBarChorusLineTwoBarTwo \vTwoBarChorusLineTwoBarThree \vTwoBarChorusLineTwoBarFour \vTwoBarChorusLineTwoBarFive \break }
|
201
244
|
cLineChorusLineTwo = { \cBarChorusLineTwoBarOne \cBarChorusLineTwoBarTwo \cBarChorusLineTwoBarThree \cBarChorusLineTwoBarFour \cBarChorusLineTwoBarFive }
|
245
|
+
sLineChorusLineTwo = { \sBarChorusLineTwoBarOne \sBarChorusLineTwoBarTwo \sBarChorusLineTwoBarThree \sBarChorusLineTwoBarFour \sBarChorusLineTwoBarFive }
|
202
246
|
|
203
247
|
|
204
248
|
%-----------------------------------------------------------------------
|
@@ -207,14 +251,17 @@ cLineChorusLineTwo = { \cBarChorusLineTwoBarOne \cBarChorusLineTwoBarTwo \cBarCh
|
|
207
251
|
vOneStanzaVerse = { \vOneLineVerseLineOne \vOneLineVerseLineTwo \vOneLineVerseLineThree \vOneLineVerseLineFour }
|
208
252
|
vTwoStanzaVerse = { \vTwoLineVerseLineOne \vTwoLineVerseLineTwo \vTwoLineVerseLineThree \vTwoLineVerseLineFour }
|
209
253
|
cStanzaVerse = { \cLineVerseLineOne \cLineVerseLineTwo \cLineVerseLineThree \cLineVerseLineFour }
|
254
|
+
sStanzaVerse = { \sLineVerseLineOne \sLineVerseLineTwo \sLineVerseLineThree \sLineVerseLineFour }
|
210
255
|
|
211
256
|
vOneStanzaRefrain = { \vOneLineRefrainLineOne \vOneLineRefrainLineTwo }
|
212
257
|
vTwoStanzaRefrain = { \vTwoLineRefrainLineOne \vTwoLineRefrainLineTwo }
|
213
258
|
cStanzaRefrain = { \cLineRefrainLineOne \cLineRefrainLineTwo }
|
259
|
+
sStanzaRefrain = { \sLineRefrainLineOne \sLineRefrainLineTwo }
|
214
260
|
|
215
261
|
vOneStanzaChorus = { \vOneLineChorusLineOne \vOneLineChorusLineTwo }
|
216
262
|
vTwoStanzaChorus = { \vTwoLineChorusLineOne \vTwoLineChorusLineTwo }
|
217
263
|
cStanzaChorus = { \cLineChorusLineOne \cLineChorusLineTwo }
|
264
|
+
sStanzaChorus = { \sLineChorusLineOne \sLineChorusLineTwo }
|
218
265
|
|
219
266
|
|
220
267
|
%-----------------------------------------------------------------------
|
@@ -223,6 +270,7 @@ cStanzaChorus = { \cLineChorusLineOne \cLineChorusLineTwo }
|
|
223
270
|
vOneScoreTabOneScoreOne = { \vOneStanzaVerse \vOneStanzaRefrain \vOneStanzaChorus }
|
224
271
|
vTwoScoreTabOneScoreOne = { \vTwoStanzaVerse \vTwoStanzaRefrain \vTwoStanzaChorus }
|
225
272
|
cScoreTabOneScoreOne = { \cStanzaVerse \cStanzaRefrain \cStanzaChorus }
|
273
|
+
sScoreTabOneScoreOne = { \sStanzaVerse \sStanzaRefrain \sStanzaChorus }
|
226
274
|
|
227
275
|
|
228
276
|
%-----------------------------------------------------------------------
|
@@ -242,11 +290,7 @@ vTwo = {
|
|
242
290
|
%-----------------------------------------------------------------------
|
243
291
|
% Stanza Headings
|
244
292
|
|
245
|
-
stanzaHeadings = {
|
246
|
-
r1^"Verse" r r r r r r r r r r r r r r r r
|
247
|
-
r1^"Refrain" r r r r r r r r
|
248
|
-
r1^"Chorus" r r r r r r r r
|
249
|
-
}
|
293
|
+
stanzaHeadings = { \sScoreTabOneScoreOne }
|
250
294
|
|
251
295
|
%-----------------------------------------------------------------------
|
252
296
|
% Chord Headings
|
Binary file
|
Binary file
|
@@ -8,6 +8,7 @@ Gitara.define do
|
|
8
8
|
tempo "4 = 90"
|
9
9
|
|
10
10
|
chords :G, 'r1-"G"'
|
11
|
+
chords :G8, 'r8-"G"'
|
11
12
|
chords :C, 'r1-"C"'
|
12
13
|
chords :A7, 'r1-"A7"'
|
13
14
|
chords :Em, 'r1-"Em"'
|
@@ -17,9 +18,10 @@ Gitara.define do
|
|
17
18
|
stanza "Verse" do
|
18
19
|
line do
|
19
20
|
bar do
|
20
|
-
|
21
|
-
notes "
|
22
|
-
|
21
|
+
partial 8
|
22
|
+
notes "<g/3>8"
|
23
|
+
notes "r8"
|
24
|
+
chords :G8
|
23
25
|
end
|
24
26
|
|
25
27
|
bar do
|
@@ -0,0 +1,167 @@
|
|
1
|
+
\version "2.12.3"
|
2
|
+
\include "english.ly"
|
3
|
+
|
4
|
+
\paper {
|
5
|
+
indent = #0
|
6
|
+
}
|
7
|
+
|
8
|
+
\header {
|
9
|
+
title = "Huling El Bimbo"
|
10
|
+
composer = "Eraserheads"
|
11
|
+
arranger = "Arranged by George Mendoza"
|
12
|
+
instrument = "Guitar (capo on first fret)"
|
13
|
+
}
|
14
|
+
|
15
|
+
%-----------------------------------------------------------------------
|
16
|
+
% Chord Sets
|
17
|
+
|
18
|
+
cChordSetG = { r1-"G" }
|
19
|
+
cChordSetGEight = { r8-"G" }
|
20
|
+
cChordSetC = { r1-"C" }
|
21
|
+
cChordSetASeven = { r1-"A7" }
|
22
|
+
cChordSetEm = { r1-"Em" }
|
23
|
+
cChordSetD = { r1-"D" }
|
24
|
+
|
25
|
+
%-----------------------------------------------------------------------
|
26
|
+
% Bars
|
27
|
+
|
28
|
+
vOneBarVerseLineOneBarOne = { \partial 8 <g\3>8 }
|
29
|
+
vTwoBarVerseLineOneBarOne = { \partial 8 r8 }
|
30
|
+
cBarVerseLineOneBarOne = { \partial 8 \cChordSetGEight }
|
31
|
+
sBarVerseLineOneBarOne = { \partial 8 r8^"Verse" }
|
32
|
+
|
33
|
+
vOneBarVerseLineOneBarTwo = { <a\3>16\glissando <b\3>16 <b\3>4 r16 <a\3>16\glissando <b\3>4. <a\3>16( <g\3>16) }
|
34
|
+
vTwoBarVerseLineOneBarTwo = { r1 }
|
35
|
+
cBarVerseLineOneBarTwo = { \cChordSetG }
|
36
|
+
sBarVerseLineOneBarTwo = { r1 }
|
37
|
+
|
38
|
+
|
39
|
+
%-----------------------------------------------------------------------
|
40
|
+
% Lines
|
41
|
+
|
42
|
+
vOneLineVerseLineOne = { \vOneBarVerseLineOneBarOne \vOneBarVerseLineOneBarTwo \break }
|
43
|
+
vTwoLineVerseLineOne = { \vTwoBarVerseLineOneBarOne \vTwoBarVerseLineOneBarTwo \break }
|
44
|
+
cLineVerseLineOne = { \cBarVerseLineOneBarOne \cBarVerseLineOneBarTwo }
|
45
|
+
sLineVerseLineOne = { \sBarVerseLineOneBarOne \sBarVerseLineOneBarTwo }
|
46
|
+
|
47
|
+
|
48
|
+
%-----------------------------------------------------------------------
|
49
|
+
% Stanzas
|
50
|
+
|
51
|
+
vOneStanzaVerse = { \vOneLineVerseLineOne }
|
52
|
+
vTwoStanzaVerse = { \vTwoLineVerseLineOne }
|
53
|
+
cStanzaVerse = { \cLineVerseLineOne }
|
54
|
+
sStanzaVerse = { \sLineVerseLineOne }
|
55
|
+
|
56
|
+
|
57
|
+
%-----------------------------------------------------------------------
|
58
|
+
% Scores
|
59
|
+
|
60
|
+
vOneScoreTabOneScoreOne = { \vOneStanzaVerse }
|
61
|
+
vTwoScoreTabOneScoreOne = { \vTwoStanzaVerse }
|
62
|
+
cScoreTabOneScoreOne = { \cStanzaVerse }
|
63
|
+
sScoreTabOneScoreOne = { \sStanzaVerse }
|
64
|
+
|
65
|
+
|
66
|
+
%-----------------------------------------------------------------------
|
67
|
+
% Voices
|
68
|
+
|
69
|
+
vOne = {
|
70
|
+
\transposition cs''
|
71
|
+
\vOneScoreTabOneScoreOne
|
72
|
+
}
|
73
|
+
|
74
|
+
vTwo = {
|
75
|
+
\transposition cs'
|
76
|
+
\vTwoScoreTabOneScoreOne
|
77
|
+
}
|
78
|
+
|
79
|
+
|
80
|
+
%-----------------------------------------------------------------------
|
81
|
+
% Stanza Headings
|
82
|
+
|
83
|
+
stanzaHeadings = { \sScoreTabOneScoreOne }
|
84
|
+
|
85
|
+
%-----------------------------------------------------------------------
|
86
|
+
% Chord Headings
|
87
|
+
|
88
|
+
chordHeadings = { \cScoreTabOneScoreOne }
|
89
|
+
|
90
|
+
%-----------------------------------------------------------------------
|
91
|
+
|
92
|
+
\score {
|
93
|
+
\new StaffGroup <<
|
94
|
+
\new Staff <<
|
95
|
+
\tempo 4 = 90
|
96
|
+
|
97
|
+
\clef "treble_8"
|
98
|
+
|
99
|
+
\new Voice \with { \remove Rest_engraver } {
|
100
|
+
\stanzaHeadings
|
101
|
+
}
|
102
|
+
|
103
|
+
\new Voice {
|
104
|
+
\voiceOne
|
105
|
+
\vOne
|
106
|
+
}
|
107
|
+
\new Voice {
|
108
|
+
\voiceTwo
|
109
|
+
\vTwo
|
110
|
+
}
|
111
|
+
>>
|
112
|
+
|
113
|
+
\new TabStaff <<
|
114
|
+
\new TabVoice {
|
115
|
+
\slurUp
|
116
|
+
\vOne
|
117
|
+
}
|
118
|
+
\new TabVoice {
|
119
|
+
\slurUp
|
120
|
+
\vTwo
|
121
|
+
}
|
122
|
+
\new TabVoice {
|
123
|
+
\chordHeadings
|
124
|
+
}
|
125
|
+
>>
|
126
|
+
>>
|
127
|
+
|
128
|
+
\layout {
|
129
|
+
\context { \Staff
|
130
|
+
\override TimeSignature #'style = #'numbered
|
131
|
+
\override StringNumber #'transparent = ##t
|
132
|
+
}
|
133
|
+
\context { \TabStaff
|
134
|
+
\override TimeSignature #'style = #'numbered
|
135
|
+
}
|
136
|
+
\context { \Voice
|
137
|
+
\remove Slur_engraver
|
138
|
+
}
|
139
|
+
\context { \TabVoice
|
140
|
+
\remove Dots_engraver
|
141
|
+
\remove Stem_engraver
|
142
|
+
\remove Rest_engraver
|
143
|
+
}
|
144
|
+
}
|
145
|
+
}
|
146
|
+
|
147
|
+
% showLastLength = R1*4
|
148
|
+
\score {
|
149
|
+
\new Staff \with {midiInstrument = #"acoustic guitar (nylon)"} <<
|
150
|
+
\tempo 4 = 90
|
151
|
+
|
152
|
+
\clef "treble_8"
|
153
|
+
|
154
|
+
\new Voice {
|
155
|
+
\unfoldRepeats {
|
156
|
+
\vOne
|
157
|
+
}
|
158
|
+
}
|
159
|
+
\new Voice {
|
160
|
+
\unfoldRepeats {
|
161
|
+
\vTwo
|
162
|
+
}
|
163
|
+
}
|
164
|
+
>>
|
165
|
+
|
166
|
+
\midi {}
|
167
|
+
}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
Gitara.define do
|
2
|
+
title "Huling El Bimbo"
|
3
|
+
composer "Eraserheads"
|
4
|
+
arranger "Arranged by George Mendoza"
|
5
|
+
instrument "Guitar (capo on first fret)"
|
6
|
+
midi_instrument "acoustic guitar (nylon)"
|
7
|
+
transposition "cs"
|
8
|
+
tempo "4 = 90"
|
9
|
+
|
10
|
+
chords :G, 'r1-"G"'
|
11
|
+
chords :G8, 'r8-"G"'
|
12
|
+
chords :C, 'r1-"C"'
|
13
|
+
chords :A7, 'r1-"A7"'
|
14
|
+
chords :Em, 'r1-"Em"'
|
15
|
+
chords :D, 'r1-"D"'
|
16
|
+
|
17
|
+
score do
|
18
|
+
stanza "Verse" do
|
19
|
+
line do
|
20
|
+
bar do
|
21
|
+
partial 8
|
22
|
+
notes "<g/3>8"
|
23
|
+
notes "r8"
|
24
|
+
chords :G8
|
25
|
+
end
|
26
|
+
|
27
|
+
bar do
|
28
|
+
notes "<a/3>16/glissando <b/3>16 <b/3>4 r16 <a/3>16/glissando <b/3>4. <a/3>16( <g/3>16)"
|
29
|
+
notes "r1"
|
30
|
+
chords :G
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/examples/tab.ly
CHANGED
@@ -26,35 +26,35 @@ cChordSetFD = { r4-"F" r r-"D" r }
|
|
26
26
|
%-----------------------------------------------------------------------
|
27
27
|
% Bars
|
28
28
|
|
29
|
-
vOneBarBeganIt = {
|
30
|
-
vTwoBarBeganIt = {
|
31
|
-
cBarBeganIt = {
|
32
|
-
sBarBeganIt = {
|
33
|
-
|
34
|
-
vOneBarItsNot = {
|
35
|
-
vTwoBarItsNot = {
|
36
|
-
cBarItsNot = {
|
37
|
-
sBarItsNot = {
|
38
|
-
|
39
|
-
vOneBarItThough = {
|
40
|
-
vTwoBarItThough = {
|
41
|
-
cBarItThough = {
|
42
|
-
sBarItThough = {
|
43
|
-
|
44
|
-
vOneBarWhatYouThought = {
|
45
|
-
vTwoBarWhatYouThought = {
|
46
|
-
cBarWhatYouThought = {
|
47
|
-
sBarWhatYouThought = {
|
48
|
-
|
49
|
-
vOneBarWhenYouFirst = {
|
50
|
-
vTwoBarWhenYouFirst = {
|
51
|
-
cBarWhenYouFirst = {
|
52
|
-
sBarWhenYouFirst = {
|
53
|
-
|
54
|
-
vOneBarYouGot = {
|
55
|
-
vTwoBarYouGot = {
|
56
|
-
cBarYouGot = {
|
57
|
-
sBarYouGot = {
|
29
|
+
vOneBarBeganIt = { \skip 4 <a\3 c'\2 >8 <g\3>8 \skip 4 <g\3 c'\2 >8 <g\3>8 }
|
30
|
+
vTwoBarBeganIt = { <f\4>4 <f\4>4 <c\5>4 <e\4>4 }
|
31
|
+
cBarBeganIt = { \cChordSetFC }
|
32
|
+
sBarBeganIt = { r1 }
|
33
|
+
|
34
|
+
vOneBarItsNot = { r8 <g'\1>4 <a\3>16 <g'\1>8 <g\3>16 <e'\1>4 <g\3>16( <a\3>16) }
|
35
|
+
vTwoBarItsNot = { <f\4>4 <f\4>4 <c\5>4 <e\4>4 }
|
36
|
+
cBarItsNot = { \cChordSetFC }
|
37
|
+
sBarItsNot = { r1 }
|
38
|
+
|
39
|
+
vOneBarItThough = { r8 <d'\2>16( <c'\2>16) r8 <a\3>16 <c'\2>16 r8 <d'\2>16( <c'\2>16) r8 <a\3>8 }
|
40
|
+
vTwoBarItThough = { <f\4>4 <f\4>4 <d\4>4 <d\4>4 }
|
41
|
+
cBarItThough = { \cChordSetFD }
|
42
|
+
sBarItThough = { r1 }
|
43
|
+
|
44
|
+
vOneBarWhatYouThought = { r8 <g'\1>4 <a\3>16 <g'\1>8 <g\3>16 <e'\1>4 <g\3>8 }
|
45
|
+
vTwoBarWhatYouThought = { <f\4>4 <f\4>4 <c\5>4 <e\4>4 }
|
46
|
+
cBarWhatYouThought = { \cChordSetFC }
|
47
|
+
sBarWhatYouThought = { r1 }
|
48
|
+
|
49
|
+
vOneBarWhenYouFirst = { <e'\1>8 <d'\2>16( <c'\2>8) <a\3>8. <c'\2>4 <a\3>8 <c'\2>8 }
|
50
|
+
vTwoBarWhenYouFirst = { <a,\5>4 <a,\5>8 <e\4>4 <a,\5>4 \skip 8 }
|
51
|
+
cBarWhenYouFirst = { \cChordSetAm }
|
52
|
+
sBarWhenYouFirst = { r1 }
|
53
|
+
|
54
|
+
vOneBarYouGot = { <g'\1>8 <a\3>8 <g'\1>8 <a\3>16 <g'\1>8 <g\3>16 <e'\1>4 <g\3>16( <a\3>16) }
|
55
|
+
vTwoBarYouGot = { <f\4>4 <f\4>4 <c\5>4 <e\4>4 }
|
56
|
+
cBarYouGot = { \cChordSetFC }
|
57
|
+
sBarYouGot = { r1 }
|
58
58
|
|
59
59
|
|
60
60
|
%-----------------------------------------------------------------------
|
data/lib/gitara/dsl.rb
CHANGED
data/lib/gitara/node/bar.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
module Gitara
|
2
2
|
module Node
|
3
3
|
class Bar < Base
|
4
|
+
has_value :specified_duration
|
5
|
+
|
6
|
+
def duration
|
7
|
+
specified_duration || 1
|
8
|
+
end
|
9
|
+
|
4
10
|
def first_bar_of_stanza?
|
5
11
|
stanza && stanza.descendants(Node::Bar)[0] == self
|
6
12
|
end
|
@@ -9,12 +15,16 @@ module Gitara
|
|
9
15
|
children.select{|child| child.is_a?(Node::NoteSet)}
|
10
16
|
end
|
11
17
|
|
18
|
+
def specified_duration_as_lilypond
|
19
|
+
specified_duration ? "\\partial #{specified_duration}" : nil
|
20
|
+
end
|
21
|
+
|
12
22
|
def stanza
|
13
23
|
self.ancestor(Node::Stanza)
|
14
24
|
end
|
15
25
|
|
16
26
|
def stanza_heading
|
17
|
-
first_bar_of_stanza? ? %Q|
|
27
|
+
first_bar_of_stanza? ? %Q|r#{duration}^"#{ancestor(Node::Stanza).name}"| : "r#{duration}"
|
18
28
|
end
|
19
29
|
end
|
20
30
|
end
|
data/lib/gitara/template/bar.erb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
<% self.voiced_as(self.root.voices).each do |voiced_bar| %>
|
2
|
-
<%= voiced_bar.definition_name %> = { <%= voiced_bar.matching_note_set.value %> }
|
2
|
+
<%= voiced_bar.definition_name %> = { <%= voiced_bar.node.specified_duration_as_lilypond %> <%= voiced_bar.matching_note_set.value %> }
|
3
3
|
<% end %>
|
4
|
-
<%= self.chorded.definition_name %> = { <%= self.chorded.value %> }
|
5
|
-
<%= self.stanza_version.definition_name %> = { <%= self.stanza_version.value %> }
|
4
|
+
<%= self.chorded.definition_name %> = { <%= self.specified_duration_as_lilypond %> <%= self.chorded.value %> }
|
5
|
+
<%= self.stanza_version.definition_name %> = { <%= self.specified_duration_as_lilypond %> <%= self.stanza_version.value %> }
|
data/lib/gitara/version.rb
CHANGED
data/spec/lib/gitara/app_spec.rb
CHANGED
@@ -1,16 +1,35 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe App do
|
4
|
-
|
5
|
-
|
4
|
+
class AppTest < Valuable
|
5
|
+
has_value :name
|
6
|
+
|
7
|
+
def run
|
6
8
|
app = FactoryGirl.build(:app)
|
7
|
-
app.invoke :export, [
|
9
|
+
app.invoke :export, ["examples/#{name}.rb"], "target-directory" => test_tmp_dir.path, "run-lilypond" => false
|
10
|
+
(Pow("tmp") / "new-#{name}.ly").write actual if self.expected != self.actual
|
11
|
+
end
|
12
|
+
|
13
|
+
def expected
|
14
|
+
@expected ||= Pow("examples/#{name}.ly").read
|
15
|
+
end
|
8
16
|
|
9
|
-
|
10
|
-
actual
|
17
|
+
def actual
|
18
|
+
@actual ||= (test_tmp_dir / "#{name}.ly").read
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "export" do
|
23
|
+
it "can convert a tab to lilypond" do
|
24
|
+
app_test = AppTest.new(:name => 'tab')
|
25
|
+
app_test.run
|
26
|
+
app_test.actual.should == app_test.expected
|
27
|
+
end
|
11
28
|
|
12
|
-
|
13
|
-
|
29
|
+
it "can convert a tab with a partial to lilypond" do
|
30
|
+
app_test = AppTest.new(:name => 'tab-with-partial')
|
31
|
+
app_test.run
|
32
|
+
app_test.actual.should == app_test.expected
|
14
33
|
end
|
15
34
|
end
|
16
35
|
end
|
data/spec/lib/gitara/dsl_spec.rb
CHANGED
@@ -244,5 +244,16 @@ describe Gitara do
|
|
244
244
|
chord_set.name.should == :Am
|
245
245
|
end
|
246
246
|
end
|
247
|
+
|
248
|
+
describe "partial(duration)" do
|
249
|
+
it "should set the specified duration of the bar node to duration" do
|
250
|
+
dsl = FactoryGirl.build(:dsl, :node => FactoryGirl.build(:bar))
|
251
|
+
dsl.node.specified_duration.should be_nil
|
252
|
+
|
253
|
+
dsl.partial 8
|
254
|
+
|
255
|
+
dsl.node.specified_duration.should == 8
|
256
|
+
end
|
257
|
+
end
|
247
258
|
end
|
248
259
|
end
|
@@ -32,6 +32,20 @@ describe 'Bar' do
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
+
describe "with a special_duration" do
|
36
|
+
subject { FactoryGirl.build(:bar, :specified_duration => 8) }
|
37
|
+
|
38
|
+
it "should be a partial with the stanza name if the bar is the first node of a stanza" do
|
39
|
+
stanza = FactoryGirl.build(:stanza, :name => 'Intro', :children => [subject])
|
40
|
+
|
41
|
+
subject.stanza_heading.should == 'r8^"Intro"'
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should be a partial with no stanza name if the subject is not the first node of a stanza" do
|
45
|
+
subject.stanza_heading.should == 'r8'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
35
49
|
describe "first_bar_of_stanza?" do
|
36
50
|
it "should be true if the bar is the first bar of a stanza" do
|
37
51
|
bar = FactoryGirl.build(:bar)
|
@@ -51,4 +65,26 @@ describe 'Bar' do
|
|
51
65
|
bar.should_not be_first_bar_of_stanza
|
52
66
|
end
|
53
67
|
end
|
68
|
+
|
69
|
+
describe "specified_duration_as_lilypond" do
|
70
|
+
it "should be \\partial specified_duration if present" do
|
71
|
+
bar = FactoryGirl.build(:bar, :specified_duration => 8)
|
72
|
+
bar.specified_duration_as_lilypond.should == '\partial 8'
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should be nil if there is no specified_duration" do
|
76
|
+
bar = FactoryGirl.build(:bar, :specified_duration => nil)
|
77
|
+
bar.specified_duration_as_lilypond.should be_nil
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "duration" do
|
82
|
+
it "should be 1 if there is no specified duration" do
|
83
|
+
FactoryGirl.build(:bar, :specified_duration => nil).duration.should == 1
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should be the specified duration if present" do
|
87
|
+
FactoryGirl.build(:bar, :specified_duration => 8).duration.should == 8
|
88
|
+
end
|
89
|
+
end
|
54
90
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitara
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-03-
|
12
|
+
date: 2012-03-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: active_support
|
16
|
-
requirement: &
|
16
|
+
requirement: &76036530 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *76036530
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: erubis
|
27
|
-
requirement: &
|
27
|
+
requirement: &76036310 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *76036310
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: linguistics
|
38
|
-
requirement: &
|
38
|
+
requirement: &76036050 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *76036050
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: pow
|
49
|
-
requirement: &
|
49
|
+
requirement: &76035840 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *76035840
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: thor
|
60
|
-
requirement: &
|
60
|
+
requirement: &76035600 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *76035600
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: valuable
|
71
|
-
requirement: &
|
71
|
+
requirement: &76035350 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *76035350
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: factory_girl
|
82
|
-
requirement: &
|
82
|
+
requirement: &76035070 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *76035070
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: guard
|
93
|
-
requirement: &
|
93
|
+
requirement: &75681160 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *75681160
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: guard-rspec
|
104
|
-
requirement: &
|
104
|
+
requirement: &75680880 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: '0'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *75680880
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: pry
|
115
|
-
requirement: &
|
115
|
+
requirement: &75680640 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ! '>='
|
@@ -120,10 +120,10 @@ dependencies:
|
|
120
120
|
version: '0'
|
121
121
|
type: :development
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *75680640
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: rb-inotify
|
126
|
-
requirement: &
|
126
|
+
requirement: &75680330 !ruby/object:Gem::Requirement
|
127
127
|
none: false
|
128
128
|
requirements:
|
129
129
|
- - ! '>='
|
@@ -131,10 +131,10 @@ dependencies:
|
|
131
131
|
version: '0'
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
|
-
version_requirements: *
|
134
|
+
version_requirements: *75680330
|
135
135
|
- !ruby/object:Gem::Dependency
|
136
136
|
name: rspec
|
137
|
-
requirement: &
|
137
|
+
requirement: &75680020 !ruby/object:Gem::Requirement
|
138
138
|
none: false
|
139
139
|
requirements:
|
140
140
|
- - ! '>='
|
@@ -142,7 +142,7 @@ dependencies:
|
|
142
142
|
version: '0'
|
143
143
|
type: :development
|
144
144
|
prerelease: false
|
145
|
-
version_requirements: *
|
145
|
+
version_requirements: *75680020
|
146
146
|
description: A Ruby DSL for generating Lilypond guitar tablatures.
|
147
147
|
email:
|
148
148
|
- gsmendoza@gmail.com
|
@@ -167,6 +167,8 @@ files:
|
|
167
167
|
- examples/eraserheads-huling-el-bimbo/tab.pdf
|
168
168
|
- examples/eraserheads-huling-el-bimbo/tab.rb
|
169
169
|
- examples/tab-with-bar.rb
|
170
|
+
- examples/tab-with-partial.ly
|
171
|
+
- examples/tab-with-partial.rb
|
170
172
|
- examples/tab-with-reused-bar.rb
|
171
173
|
- examples/tab.ly
|
172
174
|
- examples/tab.rb
|