WEBVTT 00:00:02.000 --> 00:00:04.799 Hello, everyone, and welcome to the EmacsConf. 00:00:04.799 --> 00:00:07.200 I am Jonathan. In this talk, I'm going 00:00:07.200 --> 00:00:09.599 to demonstrate ways of producing sheet 00:00:09.599 --> 00:00:10.880 music in Emacs 00:00:10.880 --> 00:00:14.320 using Lilypond, and maybe also convince 00:00:14.320 --> 00:00:18.640 you to use Emacs for writing your scores. 00:00:18.640 --> 00:00:20.400 I'll start with an overview of the 00:00:20.400 --> 00:00:22.240 syntax for those who are new to using 00:00:22.240 --> 00:00:24.400 text-based notation 00:00:24.400 --> 00:00:26.800 as a shallow dive into the deep pond of 00:00:26.800 --> 00:00:28.800 lilies and Lilypond, 00:00:28.800 --> 00:00:30.800 and move on to showcase some of its 00:00:30.800 --> 00:00:32.960 functionalities using Org Mode 00:00:32.960 --> 00:00:36.320 and lilypond-mode. One disclaimer, 00:00:36.320 --> 00:00:40.480 however: I am not a Lilypond developer. 00:00:40.480 --> 00:00:44.079 So what is Lilypond? Lilypond is 00:00:44.079 --> 00:00:46.800 a file format and music engraving system 00:00:46.800 --> 00:00:50.000 for producing high-quality sheet music. 00:00:50.000 --> 00:00:52.640 It translates textual representations of 00:00:52.640 --> 00:00:55.120 music to graphical objects. 00:00:55.120 --> 00:00:57.760 It's similar to LaTeX in that its 00:00:57.760 --> 00:01:00.000 input format describes the visual 00:01:00.000 --> 00:01:01.600 layouts of the score, 00:01:01.600 --> 00:01:03.520 using commands to define musical 00:01:03.520 --> 00:01:05.119 expressions. 00:01:05.119 --> 00:01:07.760 Commands begin with a backslash. 00:01:07.760 --> 00:01:08.640 For example, 00:01:08.640 --> 00:01:10.479 the formatter command, as shown on the 00:01:10.479 --> 00:01:13.040 left, yields its graphical equivalents on 00:01:13.040 --> 00:01:13.920 the right, 00:01:13.920 --> 00:01:16.640 the fermata symbol over the low B and 00:01:16.640 --> 00:01:19.119 so on and so forth. 00:01:19.119 --> 00:01:21.600 It's also fully extensible, like Emacs, 00:01:21.600 --> 00:01:23.119 allowing users to extend 00:01:23.119 --> 00:01:25.600 and override Lilypond's functionalities 00:01:25.600 --> 00:01:26.640 using the Scheme 00:01:26.640 --> 00:01:29.840 scripting language. It can be used for 00:01:29.840 --> 00:01:31.600 early and contemporary music 00:01:31.600 --> 00:01:34.479 tablature, vocal music lead sheets, 00:01:34.479 --> 00:01:35.200 and so on. 00:01:35.200 --> 00:01:38.000 Above all, it works with Emacs. 00:01:38.000 --> 00:01:38.479 In fact, 00:01:38.479 --> 00:01:41.040 Lilypond ships with Emacs Lisp libraries, 00:01:41.040 --> 00:01:43.119 including a major mode for editing 00:01:43.119 --> 00:01:47.360 Lilypond files. 00:01:47.360 --> 00:01:50.000 So the input files are similar to 00:01:50.000 --> 00:01:50.560 source files. 00:01:50.560 --> 00:01:52.560 They contain expressions formed with 00:01:52.560 --> 00:01:54.079 curly braces, 00:01:54.079 --> 00:01:55.840 comments that start with the percent 00:01:55.840 --> 00:02:00.240 sign, and the code is indented. 00:02:00.240 --> 00:02:02.159 Notes are entered using lowercase 00:02:02.159 --> 00:02:05.600 letters, and rests with the letter r. 00:02:05.600 --> 00:02:08.800 In this case, the lowercase r or r4 00:02:08.800 --> 00:02:11.039 is the equivalence of a crotchet or 00:02:11.039 --> 00:02:14.000 quarter note rest. 00:02:14.000 --> 00:02:16.160 Durations are entered using numbers and 00:02:16.160 --> 00:02:18.480 dots after the note name. 00:02:18.480 --> 00:02:20.959 If you do not specify one, the previous 00:02:20.959 --> 00:02:22.640 duration is used. 00:02:22.640 --> 00:02:24.560 You can also tie notes together using 00:02:24.560 --> 00:02:27.360 the tilde symbol (~). 00:02:27.360 --> 00:02:30.000 In fact, you can input chords, lyrics, 00:02:30.000 --> 00:02:32.080 embellishments, and a lot more. 00:02:32.080 --> 00:02:33.920 I encourage you to read the manual for 00:02:33.920 --> 00:02:36.160 more information. 00:02:36.160 --> 00:02:39.680 Now let's switch to a terminal window. 00:02:39.680 --> 00:02:42.000 With Lilypond installed, let's create 00:02:42.000 --> 00:02:43.840 a test file with the extension 00:02:43.840 --> 00:02:50.560 .ly and open it in Emacs. 00:02:50.560 --> 00:02:52.400 At the top of the file is the version 00:02:52.400 --> 00:02:54.800 statement, which tells Lilypond which 00:02:54.800 --> 00:02:57.440 version to use when compiling the file. 00:02:57.440 --> 00:03:00.959 Here I'm using version 2.20.0. 00:03:00.959 --> 00:03:04.159 I've added the clef and time signature. 00:03:04.159 --> 00:03:09.280 Let's add some notes. 00:03:09.280 --> 00:03:12.400 I'm going to close this now and 00:03:12.400 --> 00:03:14.560 compile the file by running 00:03:14.560 --> 00:03:19.760 lilypond followed by the file name. 00:03:19.760 --> 00:03:27.360 So now let's view the output. 00:03:27.360 --> 00:03:29.760 Okay. So here's a more complex example 00:03:29.760 --> 00:03:32.239 for randomizing note sequences. 00:03:32.239 --> 00:03:34.080 The idea is to create new reading 00:03:34.080 --> 00:03:36.239 materials each time the code blocks are 00:03:36.239 --> 00:03:37.760 evaluated. 00:03:37.760 --> 00:03:40.640 As usual, we begin with a header. 00:03:40.640 --> 00:03:41.840 I've added the title 00:03:41.840 --> 00:03:45.200 and composer. Then we add the note 00:03:45.200 --> 00:03:47.920 sequences to use in the composition. 00:03:47.920 --> 00:03:51.200 In this case, sn is a note name just like 00:03:51.200 --> 00:03:54.959 a b c d and so on, and stands for snare drum, 00:03:54.959 --> 00:03:58.879 the percussion instruments. 00:03:58.879 --> 00:04:00.720 Now here's a function that's going to 00:04:00.720 --> 00:04:04.080 shuffle the notes in the table. 00:04:04.080 --> 00:04:06.560 Finally, we expand the notes inside 00:04:06.560 --> 00:04:08.799 the Lilypond source block. 00:04:08.799 --> 00:04:10.799 So whatever the function returns is 00:04:10.799 --> 00:04:13.680 expanded inside the drums block. 00:04:13.680 --> 00:04:16.479 Now let's press C-c C-c to view 00:04:16.479 --> 00:04:20.079 the results. 00:04:20.079 --> 00:04:23.280 Okay. And if I run this again, it should 00:04:23.280 --> 00:04:26.840 create a new composition. 00:04:26.840 --> 00:04:29.680 Great. You can also audition a piece 00:04:29.680 --> 00:04:31.360 using the midi command, 00:04:31.360 --> 00:04:34.320 which creates a midi file of the score. 00:04:34.320 --> 00:04:36.560 Note also that the ob library-- 00:04:36.560 --> 00:04:39.040 sorry, the ob-lilypond library comes 00:04:39.040 --> 00:04:40.400 with two modes. 00:04:40.400 --> 00:04:42.560 The one I'm using now is called 00:04:42.560 --> 00:04:43.440 arrange mode 00:04:43.440 --> 00:04:45.440 and is useful for assembling 00:04:45.440 --> 00:04:47.120 complete scores. 00:04:47.120 --> 00:04:49.360 The basic mode on the other hand allows 00:04:49.360 --> 00:04:51.199 you to mix text and music 00:04:51.199 --> 00:04:53.360 by embedding Lilypond snippets and 00:04:53.360 --> 00:04:55.440 export them using typical Org Mode 00:04:55.440 --> 00:05:00.240 commands. 00:05:00.240 --> 00:05:02.320 Now to demonstrate the basic mode in 00:05:02.320 --> 00:05:04.320 action. I'm going to export this document 00:05:04.320 --> 00:05:05.120 to a PDF file. 00:05:05.120 --> 00:05:08.240 In this case, the 00:05:08.240 --> 00:05:10.639 :file header argument is required, so you 00:05:10.639 --> 00:05:11.919 have to provide one 00:05:11.919 --> 00:05:15.600 and include the file name. 00:05:15.600 --> 00:05:17.919 Again, you can run the code and view 00:05:17.919 --> 00:05:22.160 the results. 00:05:22.160 --> 00:05:25.840 Here it is. So now let's 00:05:25.840 --> 00:05:33.680 export this to a PDF file. 00:05:33.680 --> 00:05:39.680 And here it is, what it generates. 00:05:39.680 --> 00:05:41.440 Now I'm going to show you the workflow I 00:05:41.440 --> 00:05:44.000 used to produce music books in Emacs, 00:05:44.000 --> 00:05:46.160 combining Lilypond and LaTeX for a 00:05:46.160 --> 00:05:48.000 perfect marriage. 00:05:48.000 --> 00:05:50.160 I begin by sketching the first draft of the 00:05:50.160 --> 00:05:53.039 manuscript using pencil and paper. 00:05:53.039 --> 00:05:55.039 Then I move to Emacs to input the notes 00:05:55.039 --> 00:05:57.440 in a git repository. 00:05:57.440 --> 00:06:00.080 This is a typical source file. It begins 00:06:00.080 --> 00:06:01.360 with a stylesheet 00:06:01.360 --> 00:06:03.199 where I set variables and layout 00:06:03.199 --> 00:06:05.440 settings, although in general, there's no 00:06:05.440 --> 00:06:07.039 need for tweaking the layout 00:06:07.039 --> 00:06:09.280 unless you have specific requirements to 00:06:09.280 --> 00:06:11.199 do so. 00:06:11.199 --> 00:06:13.360 The easiest way to compile the file from 00:06:13.360 --> 00:06:15.520 Emacs is by pressing C-c C-l, 00:06:15.520 --> 00:06:19.280 so let's do this now, 00:06:19.280 --> 00:06:21.199 and the compilation buffer will tell you 00:06:21.199 --> 00:06:23.759 if there were any errors in the file. 00:06:23.759 --> 00:06:26.000 Now to automate the process of compiling 00:06:26.000 --> 00:06:28.560 several files and building the PDF, 00:06:28.560 --> 00:06:31.280 I use GNU Make, so all I have to do is 00:06:31.280 --> 00:06:32.560 open the shell 00:06:32.560 --> 00:06:36.000 and run the make command. Don't worry, 00:06:36.000 --> 00:06:37.840 I'll provide a link to the source code 00:06:37.840 --> 00:06:41.600 on the last slide. 00:06:41.600 --> 00:06:43.600 As I moved forward with the project, I 00:06:43.600 --> 00:06:46.000 found at least two things missing. 00:06:46.000 --> 00:06:48.720 One, I had no access to a metronome, 00:06:48.720 --> 00:06:50.479 at least not from the editor, 00:06:50.479 --> 00:06:52.960 so I built one for casual use and made 00:06:52.960 --> 00:06:55.919 it available in the MELPA repository. 00:06:55.919 --> 00:06:59.039 I also missed bar numbers in the source file. 00:06:59.039 --> 00:07:00.880 This is useful when going back and forth 00:07:00.880 --> 00:07:03.199 between input and output files without 00:07:03.199 --> 00:07:04.479 getting lost. 00:07:04.479 --> 00:07:06.720 So I wrote a command for toggling bar 00:07:06.720 --> 00:07:10.000 numbers, which I hope you can see on the left. 00:07:10.000 --> 00:07:12.080 Also, some expressions are difficult or 00:07:12.080 --> 00:07:14.160 slow to write on the keyboard-- 00:07:14.160 --> 00:07:17.039 accents and tuplets, for example--so I use 00:07:17.039 --> 00:07:20.160 template expansion extensively for this purpose, 00:07:20.160 --> 00:07:23.440 mainly yasnippet. 00:07:23.440 --> 00:07:25.680 So what do I think? Well, I think 00:07:25.680 --> 00:07:28.080 Lilypond can be a sharp paradigm shift 00:07:28.080 --> 00:07:31.039 for people used to GUI alternatives, but 00:07:31.039 --> 00:07:32.720 the results are impressive. 00:07:32.720 --> 00:07:34.639 You don't have to dive too deeply to 00:07:34.639 --> 00:07:36.960 start using Lilypond. 00:07:36.960 --> 00:07:38.880 Likewise, the ability to extend the 00:07:38.880 --> 00:07:40.720 software, I think, is especially appealing 00:07:40.720 --> 00:07:42.400 for music professionals, 00:07:42.400 --> 00:07:45.199 enthusiasts, composers, and the academic 00:07:45.199 --> 00:07:46.560 community: 00:07:46.560 --> 00:07:48.400 for example, allowing users to create 00:07:48.400 --> 00:07:50.800 alternative notation systems required in 00:07:50.800 --> 00:07:53.120 non-Western music traditions 00:07:53.120 --> 00:07:56.160 and other non-conventional requirements. 00:07:56.160 --> 00:07:58.400 Also, Lilypond and Emacs both have 00:07:58.400 --> 00:08:00.720 extensive and well-written manuals 00:08:00.720 --> 00:08:04.639 and active communities of users. 00:08:04.639 --> 00:08:06.400 But if you're still not sure where to 00:08:06.400 --> 00:08:09.599 start and when to wedge your feet in the deep 00:08:09.599 --> 00:08:12.160 but warm pond of lilies, Lilypond, and 00:08:12.160 --> 00:08:13.680 Lilypond users, 00:08:13.680 --> 00:08:15.680 I invite you to contribute to my 00:08:15.680 --> 00:08:16.960 Lilypond projects, 00:08:16.960 --> 00:08:18.800 which you can do so from the links on 00:08:18.800 --> 00:08:20.720 the screen. 00:08:20.720 --> 00:08:22.800 So, thank you all. I look forward to your 00:08:22.800 --> 00:08:24.639 comments, and I hope you enjoy the rest 00:08:24.639 --> 00:08:27.840 of the conference.