summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--2020/info/04.md118
-rw-r--r--2020/organizers-notebook.org52
2 files changed, 168 insertions, 2 deletions
diff --git a/2020/info/04.md b/2020/info/04.md
index b0cffc2d..67affc3d 100644
--- a/2020/info/04.md
+++ b/2020/info/04.md
@@ -2,7 +2,8 @@
Jonathan Gregory
[[!template id=vid src="https://mirror.csclub.uwaterloo.ca/emacsconf/2020/emacsconf-2020--04-music-in-plain-text--jonathan-gregory.webm" subtitles="/2020/subtitles/emacsconf-2020--04-music-in-plain-text--jonathan-gregory.vtt"]]
-[Download compressed .webm video (13.8M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--04-music-in-plain-text--jonathan-gregory--vp9-q56-video-original-audio.webm)
+[Download compressed .webm video (13.8M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--04-music-in-plain-text--jonathan-gregory--vp9-q56-video-original-audio.webm)
+[Transcript](#transcript)
LilyPond is an extensible program for producing high-quality sheet
music engraved with traditional layout rules. Similar to LaTeX and
@@ -61,3 +62,118 @@ No.
- The contrast between background and foreground is a little too weak.
- Uses LilyPond-mode, flycheck.
- <https://orgmode.org/worg/org-contrib/babel/languages/ob-doc-lilypond.html>
+
+
+<!-- transcript: 2020/subtitles/emacsconf-2020--04-music-in-plain-text--jonathan-gregory.vtt -->
+<a name="transcript"></a>
+
+Hello, everyone, and welcome to the EmacsConf. I am Jonathan. In this
+talk, I'm going to demonstrate ways of producing sheet music in Emacs
+using Lilypond, and maybe also convince you to use Emacs for writing
+your scores. I'll start with an overview of the syntax for those who
+are new to using text-based notation as a shallow dive into the deep
+pond of lilies and Lilypond, and move on to showcase some of its
+functionalities using Org Mode and lilypond-mode. One disclaimer,
+however: I am not a Lilypond developer.
+
+So what is Lilypond? Lilypond is a file format and music engraving
+system for producing high-quality sheet music. It translates textual
+representations of music to graphical objects. It's similar to LaTeX
+in that its input format describes the visual layouts of the score,
+using commands to define musical expressions. Commands begin with a
+backslash. For example, the formatter command, as shown on the left,
+yields its graphical equivalents on the right, the fermata symbol over
+the low B and so on and so forth. It's also fully extensible, like
+Emacs, allowing users to extend and override Lilypond's
+functionalities using the Scheme scripting language. It can be used
+for early and contemporary music tablature, vocal music lead sheets,
+and so on. Above all, it works with Emacs. In fact, Lilypond ships
+with Emacs Lisp libraries, including a major mode for editing Lilypond
+files.
+
+So the input files are similar to source files. They contain
+expressions formed with curly braces, comments that start with the
+percent sign, and the code is indented. Notes are entered using
+lowercase letters, and rests with the letter r. In this case, the
+lowercase r or r4 is the equivalence of a crotchet or quarter note
+rest. Durations are entered using numbers and dots after the note
+name. If you do not specify one, the previous duration is used. You
+can also tie notes together using the tilde symbol (~). In fact, you
+can input chords, lyrics, embellishments, and a lot more. I encourage
+you to read the manual for more information. Now let's switch to a
+terminal window. With Lilypond installed, let's create a test file
+with the extension .ly and open it in Emacs.
+
+At the top of the file is the version statement, which tells Lilypond
+which version to use when compiling the file. Here I'm using version
+2.20.0. I've added the clef and time signature. Let's add some notes.
+I'm going to close this now and compile the file by running lilypond
+followed by the file name. So now let's view the output. Okay.
+
+So here's a more complex example for randomizing note sequences. The
+idea is to create new reading materials each time the code blocks are
+evaluated. As usual, we begin with a header. I've added the title and
+composer. Then we add the note sequences to use in the composition. In
+this case, sn is a note name just like a b c d and so on, and stands
+for snare drum, the percussion instruments. Now here's a function
+that's going to shuffle the notes in the table. Finally, we expand the
+notes inside the Lilypond source block. So whatever the function
+returns is expanded inside the drums block. Now let's press C-c C-c to
+view the results. Okay. And if I run this again, it should create a
+new composition. Great. You can also audition a piece using the midi
+command, which creates a midi file of the score.
+
+Note also that the ob library-- sorry, the ob-lilypond library comes
+with two modes. The one I'm using now is called arrange mode and is
+useful for assembling complete scores. The basic mode on the other
+hand allows you to mix text and music by embedding Lilypond snippets
+and export them using typical Org Mode commands.
+
+Now to demonstrate the basic mode in action. I'm going to export this
+document to a PDF file. In this case, the :file header argument is
+required, so you have to provide one and include the file name. Again,
+you can run the code and view the results. Here it is. So now let's
+export this to a PDF file. And here it is, what it generates.
+
+Now I'm going to show you the workflow I used to produce music books
+in Emacs, combining Lilypond and LaTeX for a perfect marriage. I begin
+by sketching the first draft of the manuscript using pencil and paper.
+Then I move to Emacs to input the notes in a git repository. This is a
+typical source file. It begins with a stylesheet where I set variables
+and layout settings, although in general, there's no need for tweaking
+the layout unless you have specific requirements to do so. The easiest
+way to compile the file from Emacs is by pressing C-c C-l, so let's do
+this now, and the compilation buffer will tell you if there were any
+errors in the file. Now to automate the process of compiling several
+files and building the PDF, I use GNU Make, so all I have to do is
+open the shell and run the make command. Don't worry, I'll provide a
+link to the source code on the last slide.
+
+As I moved forward with the project, I found at least two things
+missing. One, I had no access to a metronome, at least not from the
+editor, so I built one for casual use and made it available in the
+MELPA repository. I also missed bar numbers in the source file. This
+is useful when going back and forth between input and output files
+without getting lost. So I wrote a command for toggling bar numbers,
+which I hope you can see on the left. Also, some expressions are
+difficult or slow to write on the keyboard-- accents and tuplets, for
+example--so I use template expansion extensively for this purpose,
+mainly yasnippet.
+
+So what do I think? Well, I think Lilypond can be a
+sharp paradigm shift for people used to GUI alternatives, but the
+results are impressive. You don't have to dive too deeply to start
+using Lilypond. Likewise, the ability to extend the software, I think,
+is especially appealing for music professionals, enthusiasts,
+composers, and the academic community: for example, allowing users to
+create alternative notation systems required in non-Western music
+traditions and other non-conventional requirements. Also, Lilypond and
+Emacs both have extensive and well-written manuals and active
+communities of users. But if you're still not sure where to start and
+when to wedge your feet in the deep but warm pond of lilies, Lilypond,
+and Lilypond users, I invite you to contribute to my Lilypond
+projects, which you can do so from the links on the screen. So, thank
+you all. I look forward to your comments, and I hope you enjoy the
+rest of the conference.
+
+<!-- /transcript -->
diff --git a/2020/organizers-notebook.org b/2020/organizers-notebook.org
index f2a1e707..142ac539 100644
--- a/2020/organizers-notebook.org
+++ b/2020/organizers-notebook.org
@@ -7,7 +7,8 @@
[[!toc levels=4]]
#+end_export
-[[elisp:(progn (org-md-export-to-markdown) (org-babel-tangle))][Export and tangle]]
+- [[elisp:(progn (org-md-export-to-markdown) (org-babel-tangle))][Export and tangle]]
+- [[elisp:(org-babel-execute-buffer)][Execute buffer]]
* Tasks
** Manually transcribe
@@ -802,6 +803,55 @@ Take advantage of provided scripts or autogenerated files
and run [[file:subtitles/fix.py]] like this: =fix.py
emacsconf-2020--04-music-in-plain-text--jonathan-gregory.sbv=.
+*** Add transcript sections
+
+#+begin_src emacs-lisp :eval no :tangle no
+(defvar conf/wiki-directory "~/vendor/emacsconf-wiki" "Directory that has the public conference wiki.")
+
+(defmacro conf/with-talk-info-file (talk &rest body)
+ "Evaluate BODY in the info file for TALK.
+If TALK is not specified, do it in the current buffer."
+ (declare (indent 1))
+ `(if ,talk
+ (with-current-buffer
+ (find-file-noselect
+ (expand-file-name (format "%d/info/%s.md" conf/year
+ (plist-get talk :talk-id))
+ conf/wiki-directory))
+ ,@body)
+ ,@body))
+
+(defun conf/add-transcript (&optional talk)
+ "Try to add transcript for the current talk."
+ (interactive)
+ (conf/with-talk-info-file talk
+ (goto-char (point-min))
+ (let (subtitles subed-auto-find-video all)
+ (while (re-search-forward "subtitles=\"/\\(.+?\\)\"" nil t)
+ (setq subtitles (cons (match-string 1 subtitles) subtitles)))
+ (when subtitles
+ (mapc
+ (lambda (subtitle-file)
+ (with-current-buffer (find-file-noselect (expand-file-name subtitle-file conf/wiki-directory))
+ (goto-char (point-min))
+ (subed-mode)
+ (let (text)
+ (while (subed-forward-subtitle-text)
+ (setq text (cons (subed-subtitle-text) text)))
+ (setq all (mapconcat 'identity (reverse text) "\n"))))
+ (if (re-search-forward (format "<!-- transcript: %s -->[ \t]*\n\\([.\r\n]*?\\)<!-- /transcript -->" (regexp-quote subtitle-file)) nil t)
+ (progn
+ (goto-char (match-beginning 1))
+ (delete-region (match-beginning 1) (match-end 1)))
+ (goto-char (point-max))
+ (insert (format "\n\n<!-- transcript: %s -->\n\n" subtitle-file))
+ (save-excursion (insert "\n\n<!-- /transcript -->\n")))
+ (save-excursion (insert all)))
+ (reverse subtitles))))))
+
+;; (conf/add-transcript (conf/find-talk "03"))
+
+#+end_src
* Other useful tidbits
** Restarting ikiwiki manually