LEFT | RIGHT |
1 %%%% This file is part of LilyPond, the GNU music typesetter. | 1 %%%% This file is part of LilyPond, the GNU music typesetter. |
2 %%%% | 2 %%%% |
3 %%%% Copyright (C) 2011 Graham Percival <graham@percival-music.ca> | 3 %%%% Copyright (C) 2011 Graham Percival <graham@percival-music.ca> |
4 %%%% | 4 %%%% |
5 %%%% LilyPond is free software: you can redistribute it and/or modify | 5 %%%% LilyPond is free software: you can redistribute it and/or modify |
6 %%%% it under the terms of the GNU General Public License as published by | 6 %%%% it under the terms of the GNU General Public License as published by |
7 %%%% the Free Software Foundation, either version 3 of the License, or | 7 %%%% the Free Software Foundation, either version 3 of the License, or |
8 %%%% (at your option) any later version. | 8 %%%% (at your option) any later version. |
9 %%%% | 9 %%%% |
10 %%%% LilyPond is distributed in the hope that it will be useful, | 10 %%%% LilyPond is distributed in the hope that it will be useful, |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 (string-join | 92 (string-join |
93 (map | 93 (map |
94 (lambda (x) (ly:format "~a" x)) | 94 (lambda (x) (ly:format "~a" x)) |
95 (append | 95 (append |
96 (list (get-moment moment)) | 96 (list (get-moment moment)) |
97 values)) | 97 values)) |
98 "\t") | 98 "\t") |
99 "\n"))) | 99 "\n"))) |
100 | 100 |
101 | 101 |
102 #(define (print-line engraver values) | 102 #(define (print-line engraver . values) |
103 "Prints the list of values (plus the score time) to a file, and | 103 "Prints the list of values (plus the score time) to a file, and |
104 optionally outputs to the console as well." | 104 optionally outputs to the console as well." |
105 (let* ((p (open-file (filename-from-staffname engraver) "a"))) | 105 (let* ((p (open-file (filename-from-staffname engraver) "a"))) |
106 ;; for regtest comparison | 106 ;; for regtest comparison |
107 (if (defined? 'EVENT_LISTENER_CONSOLE_OUTPUT) | 107 (if (defined? 'EVENT_LISTENER_CONSOLE_OUTPUT) |
108 (ly:progress | 108 (ly:progress |
109 (make-output-string-line engraver values))) | 109 (make-output-string-line engraver values))) |
110 (display | 110 (display |
111 (make-output-string-line engraver values) | 111 (make-output-string-line engraver values) |
112 p) | 112 p) |
113 (close p))) | 113 (close p))) |
114 | 114 |
115 | 115 |
116 %%% main functions | 116 %%% main functions |
117 | 117 |
118 #(define (format-rest engraver event) | 118 #(define (format-rest engraver event) |
119 (print-line engraver | 119 (print-line engraver |
120 (list | 120 "rest" |
121 "rest" | 121 (ly:duration->string |
122 (ly:duration->string | 122 (ly:event-property event 'duration)))) |
123 (ly:event-property event 'duration))))) | |
124 | 123 |
125 #(define (format-note engraver event) | 124 #(define (format-note engraver event) |
126 (let* ((origin (ly:input-file-line-char-column | 125 (let* ((origin (ly:input-file-line-char-column |
127 (ly:event-property event 'origin)))) | 126 (ly:event-property event 'origin)))) |
128 (print-line engraver | 127 (print-line engraver |
129 (list | 128 "note" |
130 "note" | 129 ;; get a MIDI pitch value. |
131 ;; get a MIDI pitch value. | 130 (+ 60 (ly:pitch-semitones |
132 (+ 60 (ly:pitch-semitones | 131 (ly:event-property event 'pitch))) |
133 (ly:event-property event 'pitch))) | 132 (format-moment (ly:duration-length |
134 (format-moment (ly:duration-length | 133 (ly:event-property event 'duration))) |
135 (ly:event-property event 'duration))) | 134 ;; point and click info |
136 ;; point and click info | 135 (ly:format "point-and-click ~a ~a" |
137 (ly:format "point-and-click ~a ~a" | 136 (caddr origin) |
138 (caddr origin) | 137 (cadr origin))))) |
139 (cadr origin)))))) | |
140 | 138 |
141 #(define (format-tempo engraver event) | 139 #(define (format-tempo engraver event) |
142 (print-line engraver | 140 (print-line engraver |
143 (list | 141 "tempo" |
144 "tempo" | 142 ; get length of quarter notes, in seconds |
145 ; get length of quarter notes, in seconds | 143 (/ (ly:event-property event 'metronome-count) |
146 (/ (ly:event-property event 'metronome-count) | |
147 (format-moment (ly:duration-length (ly:event-property | 144 (format-moment (ly:duration-length (ly:event-property |
148 event | 145 event |
149 'tempo-unit))))))) | 146 'tempo-unit)))))) |
150 | 147 |
151 | 148 |
152 #(define (format-breathe engraver event) | 149 #(define (format-breathe engraver event) |
153 (print-line engraver | 150 (print-line engraver |
154 (list "breathe"))) | 151 "breathe")) |
155 | 152 |
156 #(define (format-articulation engraver event) | 153 #(define (format-articulation engraver event) |
157 (print-line engraver | 154 (print-line engraver |
158 (list | 155 "script" |
159 "script" | 156 (ly:event-property event 'articulation-type))) |
160 (ly:event-property event 'articulation-type)))) | |
161 | 157 |
162 #(define (format-text engraver event) | 158 #(define (format-text engraver event) |
163 (print-line engraver | 159 (print-line engraver |
164 (list | 160 "text" |
165 "text" | 161 (ly:event-property event 'text))) |
166 (ly:event-property event 'text)))) | |
167 | 162 |
168 #(define (format-slur engraver event) | 163 #(define (format-slur engraver event) |
169 (print-line engraver | 164 (print-line engraver |
170 (list | 165 "slur" |
171 "slur" | 166 (ly:event-property event 'span-direction))) |
172 (ly:event-property event 'span-direction)))) | |
173 | 167 |
174 #(define (format-dynamic engraver event) | 168 #(define (format-dynamic engraver event) |
175 (print-line engraver | 169 (print-line engraver |
176 (list | 170 "dynamic" |
177 "dynamic" | 171 (ly:event-property event 'text))) |
178 (ly:event-property event 'text)))) | |
179 | 172 |
180 #(define (format-cresc engraver event) | 173 #(define (format-cresc engraver event) |
181 (print-line engraver | 174 (print-line engraver |
182 (list | 175 "cresc" |
183 "cresc" | 176 (ly:event-property event 'span-direction))) |
184 (ly:event-property event 'span-direction)))) | |
185 | 177 |
186 #(define (format-decresc engraver event) | 178 #(define (format-decresc engraver event) |
187 (print-line engraver | 179 (print-line engraver |
188 (list | 180 "decresc" |
189 "decresc" | 181 (ly:event-property event 'span-direction))) |
190 (ly:event-property event 'span-direction)))) | |
191 | 182 |
192 #(define (format-textspan engraver event) | 183 #(define (format-textspan engraver event) |
193 (let* ((context (ly:translator-context engraver)) | 184 (let* ((context (ly:translator-context engraver)) |
194 (moment (ly:context-current-moment context)) | 185 (moment (ly:context-current-moment context)) |
195 (spanner-props (ly:context-property context 'TextSpanner)) | 186 (spanner-props (ly:context-property context 'TextSpanner)) |
196 (details (chain-assoc-get 'bound-details spanner-props)) | 187 (details (chain-assoc-get 'bound-details spanner-props)) |
197 (left-props (assoc-get 'left details '())) | 188 (left-props (assoc-get 'left details '())) |
198 (left-text (assoc-get 'text left-props '()))) | 189 (left-text (assoc-get 'text left-props '()))) |
199 (print-line engraver | 190 (print-line engraver |
200 (list | 191 "set_string" |
201 "set_string" | 192 (ly:event-property event 'span-direction) |
202 (ly:event-property event 'span-direction) | 193 left-text))) |
203 left-text)))) | |
204 | 194 |
205 | 195 |
206 %%%% The actual engraver definition: We just install some listeners so we | 196 %%%% The actual engraver definition: We just install some listeners so we |
207 %%%% are notified about all notes and rests. We don't create any grobs or | 197 %%%% are notified about all notes and rests. We don't create any grobs or |
208 %%%% change any settings. | 198 %%%% change any settings. |
209 | 199 |
210 \layout { | 200 \layout { |
211 \context { | 201 \context { |
212 \Voice | 202 \Voice |
213 \consists #(list | 203 \consists #(list |
214 (cons 'listeners | 204 (cons 'listeners |
215 (list | 205 (list |
216 (cons 'tempo-change-event format-tempo) | 206 (cons 'tempo-change-event format-tempo) |
217 (cons 'rest-event format-rest) | 207 (cons 'rest-event format-rest) |
218 (cons 'note-event format-note) | 208 (cons 'note-event format-note) |
219 (cons 'articulation-event format-articulation) | 209 (cons 'articulation-event format-articulation) |
220 (cons 'text-script-event format-text) | 210 (cons 'text-script-event format-text) |
221 (cons 'slur-event format-slur) | 211 (cons 'slur-event format-slur) |
222 (cons 'breathing-event format-breathe) | 212 (cons 'breathing-event format-breathe) |
223 (cons 'dynamic-event format-dynamic) | 213 (cons 'dynamic-event format-dynamic) |
224 (cons 'crescendo-event format-cresc) | 214 (cons 'crescendo-event format-cresc) |
225 (cons 'decrescendo-event format-decresc) | 215 (cons 'decrescendo-event format-decresc) |
226 (cons 'text-span-event format-textspan) | 216 (cons 'text-span-event format-textspan) |
227 ))) | 217 ))) |
228 } | 218 } |
229 } | 219 } |
LEFT | RIGHT |