emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[O] [PATCH] babel support for ABC notation music files


From: William Waites
Subject: [O] [PATCH] babel support for ABC notation music files
Date: Wed, 25 Sep 2013 13:31:19 +0100 (BST)

For example:

* John MacColl's March to Kilbowie Cottage
  #+begin_src abc :file john_maccol_kilbowie.svg :cmdline -g
   T: John MacColl's March To Kilbowie Cottage
   R: March
   M: 4/4
   L: 1/8
   K: Amix
   A>B|: c4 c>B A>c | e4 f>e c<e | A>B c<f e>c A>B | c<f e>c B2 A>B |
   c4 c>B A>c | e4 f>e c<e | f>e f>c e>A B<c |1 A2 A2 A2 A>B :|2 A2 A2 A2 f>=g 
||
   a2-a>f e>c B<c | A>c e>=g f>c e>c | a>f e<f ~A2-A>B | c<f e>c B2 f>=g |
   a2-a>f e>c B<c | A>c e>=g f>c e>c | f<a c<e e>A B<c | A2 A2 A2 f>=g |
   a2-a>f e>c B<c | A>c e>=g f>c e>c | a>f e<f ~A2-A>B | c<f e>c B2 A>B |
   c4 c>B A>c | e4 f>e c<e | f>e f>c e>A B<c | A2 A2 A2 c>B |
   | : A>c B<c A>f e<f | a>e f<a e>f c<e | A>c B<c A>f e<f | a>f e>c B2 c>B |
   A>c B<c A>f e<f | a>e f<a e>f c<e | f>e f>c e>A B<c |1 A2 A2 A2 c>B :|2 A2 
A2 A2 e>d ||
   c<e B>c A>c e>A | c<e a>e f>e c>d | e>c B<c A2 A>B | c<f e>c B2 e>d|
   c<e B>c A>c e>A | c<e a>e f>e c>d | e>f c<e e>A B<c | A2 A2 A2 e>d |
   c<e B>c A>c e>A | c<e a>e f>e c>d | e>c B<c A2 A>B | c<f e>c B2 A>B |
   c4 c>B A>c | e4 f>e c<e | f>e f>c e>A B<c | A2 A2 A4 |
   #+end_src

It supports ps, eps, svg, pdf output. In the case of eps and svg, it
renames the (first!) sequentially numbered output file to the given
babel argument -- there might well be a better way of handling that
case, but it doesn't happen to me much because the music is one page
long most of the time.

Pretty sure there is already an FSF copyright assignment for me on
file.

Happy hacking,
-w
>From 1709deacfdbb6eb76edf5878df106d9e1cc676fa Mon Sep 17 00:00:00 2001
From: William Waites <address@hidden>
Date: Wed, 25 Sep 2013 12:18:55 +0100
Subject: [PATCH 1/2] Initial version of ABC notation handling for Babel

---
 lisp/ob-abc.el |   87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 87 insertions(+)
 create mode 100644 lisp/ob-abc.el

diff --git a/lisp/ob-abc.el b/lisp/ob-abc.el
new file mode 100644
index 0000000..5ad7409
--- /dev/null
+++ b/lisp/ob-abc.el
@@ -0,0 +1,87 @@
+;;; ob-abc.el --- org-babel functions for template evaluation
+
+;; Copyright (C) Free Software Foundation
+
+;; Author: William Waites
+;; Keywords: literate programming, music
+;; Homepage: http://www.tardis.ed.ac.uk/wwaites
+;; Version: 0.01
+
+;;; License:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; This file adds support to Org Babel for music in ABC notation.
+;;; It requires that the abcm2ps program is installed.
+;;; See http://moinejf.free.fr/
+
+(require 'ob)
+
+;; optionally define a file extension for this language
+(add-to-list 'org-babel-tangle-lang-exts '("abc" . "abc"))
+
+;; optionally declare default header arguments for this language
+(defvar org-babel-default-header-args:abc
+  '((:results . "file") (:exports . "results"))
+  "Default arguments to use when evaluating an ABC source block.")
+
+(defun org-babel-expand-body:abc (body params)
+  "Expand BODY according to PARAMS, return the expanded body."
+  (let ((vars (mapcar #'cdr (org-babel-get-header params :var))))
+    (mapc
+     (lambda (pair)
+       (let ((name (symbol-name (car pair)))
+            (value (cdr pair)))
+        (setq body
+              (replace-regexp-in-string
+               (concat "\$" (regexp-quote name))
+               (if (stringp value) value (format "%S" value))
+               body))))
+     vars)
+    body))
+
+(defun org-babel-execute:abc (body params)
+  "Execute a block of ABC code with org-babel.  This function is
+   called by `org-babel-execute-src-block'"
+  (message "executing Abc source code block")
+  (let* ((result-params (split-string (or (cdr (assoc :results params)))))
+        (cmdline (cdr (assoc :cmdline params)))
+        (out-file ((lambda (el)
+                     (or el
+                         (error "abc code block requires :file header 
argument")))
+                   ;;; For SVG or EPS output, abcm2ps will add a number for a 
particular page
+                   ;;; automatically. This needs to be specified in the :file 
argument and stripped
+                   ;;; stripped out here. There is likely a better way to do 
this.
+                   (replace-regexp-in-string "001" "" (cdr (assoc :file 
params)))))
+        (in-file (org-babel-temp-file "abc-"))
+        (cmd (concat "abcm2ps" " " cmdline
+                     " -O " (org-babel-process-file-name out-file)
+                     " " (org-babel-process-file-name in-file))))
+    (with-temp-file in-file (insert (org-babel-expand-body:abc body params)))
+    (org-babel-eval cmd "")
+    ;;; indicate that the file has been written
+    nil))
+
+;; This function should be used to assign any variables in params in
+;; the context of the session environment.
+(defun org-babel-prep-session:abc (session params)
+  "Return an error because abc does not support sessions."
+  (error "ABC does not support sessions"))
+
+(provide 'ob-abc)
+;;; ob-abc.el ends here
--
1.7.10.4

>From 0fb2613d7d321cd259c48e844f32df070c2f9a6f Mon Sep 17 00:00:00 2001
From: William Waites <address@hidden>
Date: Wed, 25 Sep 2013 13:24:42 +0100
Subject: [PATCH 2/2] improve handling of output file types

---
 lisp/ob-abc.el |   19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/lisp/ob-abc.el b/lisp/ob-abc.el
index 5ad7409..b41236d 100644
--- a/lisp/ob-abc.el
+++ b/lisp/ob-abc.el
@@ -64,16 +64,23 @@
         (out-file ((lambda (el)
                      (or el
                          (error "abc code block requires :file header 
argument")))
-                   ;;; For SVG or EPS output, abcm2ps will add a number for a 
particular page
-                   ;;; automatically. This needs to be specified in the :file 
argument and stripped
-                   ;;; stripped out here. There is likely a better way to do 
this.
-                   (replace-regexp-in-string "001" "" (cdr (assoc :file 
params)))))
+                   (replace-regexp-in-string "\.pdf$" ".ps" (cdr (assoc :file 
params)))))
         (in-file (org-babel-temp-file "abc-"))
-        (cmd (concat "abcm2ps" " " cmdline
+        (render (concat "abcm2ps" " " cmdline
                      " -O " (org-babel-process-file-name out-file)
                      " " (org-babel-process-file-name in-file))))
     (with-temp-file in-file (insert (org-babel-expand-body:abc body params)))
-    (org-babel-eval cmd "")
+    (org-babel-eval render "")
+    ;;; handle where abcm2ps changes the file name (to support multiple files
+    (when (or (string= (file-name-extension out-file) "eps")
+             (string= (file-name-extension out-file) "svg"))
+      (rename-file (concat
+                   (file-name-sans-extension out-file) "001."
+                   (file-name-extension out-file))
+                  out-file t))
+    ;;; if we were asked for a pdf...
+    (when (string= (file-name-extension (cdr (assoc :file params))) "pdf")
+      (org-babel-eval (concat "ps2pdf" " " out-file " " (cdr (assoc :file 
params))) ""))
     ;;; indicate that the file has been written
     nil))

--
1.7.10.4

Attachment: pgpct7enfIej9.pgp
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]