emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: William Waites <wwaites@tardis.ed.ac.uk>
To: emacs-orgmode@gnu.org
Subject: [PATCH] babel support for ABC notation music files
Date: Wed, 25 Sep 2013 13:31:19 +0100 (BST)	[thread overview]
Message-ID: <20130925.133119.258878215.wwaites@tardis.ed.ac.uk> (raw)


[-- Attachment #1.1: Type: Text/Plain, Size: 1492 bytes --]

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

[-- Attachment #1.2: 0001-Initial-version-of-ABC-notation-handling-for-Babel.patch --]
[-- Type: Text/X-Patch, Size: 3959 bytes --]

From 1709deacfdbb6eb76edf5878df106d9e1cc676fa Mon Sep 17 00:00:00 2001
From: William Waites <wwaites@tardis.ed.ac.uk>
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


[-- Attachment #1.3: 0002-improve-handling-of-output-file-types.patch --]
[-- Type: Text/X-Patch, Size: 1931 bytes --]

From 0fb2613d7d321cd259c48e844f32df070c2f9a6f Mon Sep 17 00:00:00 2001
From: William Waites <wwaites@tardis.ed.ac.uk>
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 #2: Type: application/pgp-signature, Size: 836 bytes --]

             reply	other threads:[~2013-09-25 12:31 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-25 12:31 William Waites [this message]
2013-09-25 15:15 ` [PATCH] babel support for ABC notation music files Eric Schulte
2013-09-26  8:12   ` William Waites
2013-09-26 10:31     ` Eric Schulte

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130925.133119.258878215.wwaites@tardis.ed.ac.uk \
    --to=wwaites@tardis.ed.ac.uk \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).