Add abcplay post.
authorW. Trevor King <wking@drexel.edu>
Sat, 13 Nov 2010 17:05:13 +0000 (12:05 -0500)
committerW. Trevor King <wking@drexel.edu>
Sat, 13 Nov 2010 17:05:13 +0000 (12:05 -0500)
posts/abcplay.mdwn [new file with mode: 0644]
posts/abcplay/abcplay.sh [new file with mode: 0755]

diff --git a/posts/abcplay.mdwn b/posts/abcplay.mdwn
new file mode 100644 (file)
index 0000000..b78c890
--- /dev/null
@@ -0,0 +1,33 @@
+I've got a travel-size violin (by [Bill Whipple]) that I mess around
+with.  I like a lot of traditional and celtic music, and I wanted
+something that would provide both a visual and aural rendition of a
+song to help me learn it.
+
+Looking around, I found [ABC][] (see John Chamber's [page][JC] and
+[tutorial][]), which is a simple, ASCII notation for sheet music.
+There are lots of [software tools][] for processing ABC; my favorite
+is [abcMIDI][] (which I've packaged in my [[Gentoo overlay]] and is
+also packaged in the [Sunrise overlay][]).  `abcMIDI` provides several
+useful programs:
+
+* `abc2midi`: ABC to MIDI conversion, to listen to your music.
+* `yaps`: ABC to PostScript conversion, to look at your music.
+* `midi2abc`: MIDI to ABC conversion, when you can't find ABC source.
+
+My favorite ABC tune repository is [The Session][], but there are also
+search tools and repositories listed on the [ABC homepage][ABC] and
+[JC's page][JC].
+
+To make playing ABC files as easy as possible, I've written a little
+script, [[abcplay.sh]], which uses `abc2midi` to generate a MIDI file
+for each tune and then plays them with [timidity++][].
+
+[Bill Whipple]: http://www.wiplstix.com/
+[ABC]: http://abcnotation.com/
+[JC]: http://ecf-guest.mit.edu/~jc/music/abc/
+[tutorial]: http://ecf-guest.mit.edu/~jc/music/abc/doc/ABCtutorial.html
+[software tools]: http://abcnotation.com/software
+[abcMIDI]: http://abc.sourceforge.net/abcMIDI/
+[Sunrise overlay]: http://overlays.gentoo.org/proj/sunrise
+[The Session]: http://www.thesession.org/
+[timidity++]: http://timidity.sourceforge.net/
diff --git a/posts/abcplay/abcplay.sh b/posts/abcplay/abcplay.sh
new file mode 100755 (executable)
index 0000000..ccc01e0
--- /dev/null
@@ -0,0 +1,40 @@
+#!/bin/bash
+# 
+# Copyright (C) 2009-2010 W. Trevor King <wking@drexel.edu>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program.  If not, see
+# <http://www.gnu.org/licenses/>.
+
+
+MIDI_FILE=`mktemp --tmpdir abcmidi-XXXXXX`
+
+USER_INTERRUPT=13
+LAST_SIGINT=0
+# Clean up and exit on SIGTERM (default signal from kill command)
+trap 'rm -f "$MIDI_FILE"; exit $USER_INTERRUPT' TERM HUP
+# Clean up and continue to next song on SIGINT (^C)
+# If two SIGINTS come in the same second, exit.
+trap 'rm -f "$MIDI_FILE"; TIME=`date +%s`;
+  let "DELAY = TIME - LAST_SIGINT";
+  if [ "$DELAY" -eq 0 ] || [ "$DELAY" -eq 1 ]; then exit $USER_INTERRUPT; fi
+  LAST_SIGINT="$TIME";' INT
+
+for ABC_FILE in $*; do
+    grep '^X:' "$ABC_FILE" | cut -d: -f2 | while read REFNUM
+    do
+        abc2midi "$ABC_FILE" "$REFNUM" -o "$MIDI_FILE"
+        timidity "$MIDI_FILE"
+        rm -f "$MIDI_FILE"
+    done
+done