summaryrefslogblamecommitdiffstats
path: root/2020/subtitles/emacsconf-2020--04-music-in-plain-text--jonathan-gregory.vtt
blob: b2722c9988314794bd6e20c33885b836d05b3fc4 (plain) (tree)
1
2
3
4
5
6
7
8




                                              

                             
 


                                
 


                              
 

                                     
 


                             
 

                              



                             

                                    
 

                             
 

                             
 


                                 
 

                             
 

                              
 

                             
 


                                   



                                       

                                     
 

                              
 

                             
 

                             
 

                                
 
                             
                                




                                


                                   
 


                                
 

                                 
 

                             









                                       

                                    
 


                             
 

                                   



                               


                             
 
                             
                                  

               


                                        
 
                             
                                    

             


                             
 

                             
 
                             
                                 
        
 

                             









                                   

                                   
 

                             
 

                             
 

                              
 
                             
                                     







                                      
                             
                                      




                                      

                             
 


                                   
 


                             
 

                             
 


                             









                                       

                             
 

                             
 


                             









                                      

                             
 


                                        



                                 

                                  
 


                                        





















                                             

                                
 

                                   
 


                                   
 
                             
                                        

                         
                             
                                    













                                       
                             
                               

            
                             
                            

                

                                  
 

                                



                                  
                             
                                  

         
                             
                                    
       
 

                                 



                             


                                       
 

                             



                             


                                        
 


                                       



                                  


                             
 

                                






                                  

                                    
 


                             






                                       

                              
 

                             
 

                                          
 

                             
 

                                       
 
                             
                                        

      


                                   









                                        

                              
 


                             



                                      


                                        






                                      

                                    
 

                                    






                                    

                             
 


                                  

                             

                                



                                        
                             
                                      

             
                             
                                     
        
 

                                     






                                       

                                  
 


                                       

                             
                 
 

                             
 


                                     
 

                                    
 

                               






                                    
                             
                                   

         
 


                                 
 
                             
                                        




                                     

                             
 

                                        












                                        

                             
 


                                     
 

                                        
 
                             
                                

                  
                             
                                     

           


                                    
 


                                    
WEBVTT

00:00:02.000 --> 00:00:04.799
Hello, everyone, and welcome to the EmacsConf.

00:00:04.799 --> 00:00:06.631
I am Jonathan. In this talk,

00:00:06.631 --> 00:00:10.880
I'm going to demonstrate ways of
producing sheet music in Emacs

00:00:10.880 --> 00:00:14.636
using Lilypond, and maybe also
convince you

00:00:14.636 --> 00:00:18.640
to use Emacs for writing your scores.

00:00:18.640 --> 00:00:20.698
I'll start with an overview
of the syntax

00:00:20.698 --> 00:00:22.240
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.615
as a shallow dive into the deep pond

00:00:26.615 --> 00:00:28.800
of lilies and Lilypond,

00:00:28.800 --> 00:00:30.171
and move on to showcase

00:00:30.171 --> 00:00:34.723
some of its functionalities
using Org Mode and lilypond-mode.

00:00:34.723 --> 00:00:37.173
One disclaimer, however:

00:00:37.173 --> 00:00:40.480
I am not a Lilypond developer.

00:00:40.480 --> 00:00:42.841
So what is Lilypond?

00:00:42.841 --> 00:00:46.800
Lilypond is 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.442
It translates textual representations

00:00:52.442 --> 00:00:55.120
of music to graphical objects.

00:00:55.120 --> 00:00:57.520
It's similar to LaTeX in that

00:00:57.520 --> 00:00:59.329
its input format describes

00:00:59.329 --> 00:01:01.600
the visual layouts of the score,

00:01:01.600 --> 00:01:05.119
using commands to define musical
expressions.

00:01:05.119 --> 00:01:07.760
Commands begin with a backslash.

00:01:07.760 --> 00:01:10.791
For example, the formatter command,
as shown on the left,

00:01:10.791 --> 00:01:13.920
yields its graphical equivalents
on the right,

00:01:13.920 --> 00:01:16.345
the fermata symbol over the low B

00:01:16.345 --> 00:01:19.119
and 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:28.452
using the Scheme scripting language.

00:01:28.452 --> 00:01:32.422
It can be used for early and
contemporary music tablature,

00:01:32.422 --> 00:01:35.200
vocal music lead sheets, and so on.

00:01:35.200 --> 00:01:38.000
Above all, it works with Emacs.

00:01:38.000 --> 00:01:41.040
In fact, Lilypond ships with
Emacs Lisp libraries,

00:01:41.040 --> 00:01:47.360
including a major mode for editing
Lilypond files.

00:01:47.360 --> 00:01:50.560
So the input files are similar to source
files.

00:01:50.560 --> 00:01:54.079
They contain expressions formed with
curly braces,

00:01:54.079 --> 00:01:56.549
comments that start with
the percent sign,

00:01:56.549 --> 00:02:00.240
and the code is indented.

00:02:00.240 --> 00:02:02.903
Notes are entered using lowercase
letters,

00:02:02.903 --> 00:02:05.600
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:15.938
Durations are entered using numbers

00:02:15.938 --> 00:02:18.480
and dots after the note name.

00:02:18.480 --> 00:02:20.196
If you do not specify one,

00:02:20.196 --> 00:02:22.640
the previous duration is used.

00:02:22.640 --> 00:02:27.360
You can also tie notes together using
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:36.160
I encourage you to read the manual for
more information.

00:02:36.160 --> 00:02:39.680
Now let's switch to a terminal window.

00:02:39.680 --> 00:02:41.247
With Lilypond installed,

00:02:41.247 --> 00:02:50.560
let's create a test file with the
extension .ly and open it in Emacs.

00:02:50.560 --> 00:02:53.048
At the top of the file is
the version statement,

00:02:53.048 --> 00:02:54.395
which tells Lilypond

00:02:54.395 --> 00:02:57.440
which 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.098
I'm going to close this now

00:03:12.098 --> 00:03:13.765
and compile the file

00:03:13.765 --> 00:03:19.760
by running 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:33.410
The idea is to create

00:03:33.410 --> 00:03:37.760
new reading materials each time the code
blocks are evaluated.

00:03:37.760 --> 00:03:40.640
As usual, we begin with a header.

00:03:40.640 --> 00:03:43.541
I've added the title and composer.

00:03:43.541 --> 00:03:47.920
Then we add the note 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.684
So whatever the function returns

00:04:10.684 --> 00:04:13.680
is expanded inside the drums block.

00:04:13.680 --> 00:04:20.079
Now let's press C-c C-c to view the
results.

00:04:20.079 --> 00:04:26.840
Okay. And if I run this again, it should
create a new composition.

00:04:26.840 --> 00:04:31.360
Great. You can also audition a piece
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:43.440
The one I'm using now is called
arrange mode

00:04:43.440 --> 00:04:47.120
and is useful for assembling
complete scores.

00:04:47.120 --> 00:04:49.015
The basic mode, on the other hand,

00:04:49.015 --> 00:04:51.199
allows you to mix text and music

00:04:51.199 --> 00:04:53.360
by embedding Lilypond snippets and

00:04:53.360 --> 00:05:00.240
export them using typical Org Mode
commands.

00:05:00.240 --> 00:05:02.661
Now to demonstrate the basic mode in
action.

00:05:02.661 --> 00:05:04.320
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:10.077
In this case, the :file header argument
is required,

00:05:10.077 --> 00:05:11.919
so you have to provide one

00:05:11.919 --> 00:05:15.600
and include the file name.

00:05:15.600 --> 00:05:22.160
Again, you can run the code and view the
results.

00:05:22.160 --> 00:05:33.680
Here it is. So now let's 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.716
Now I'm going to show you
the workflow I used

00:05:41.716 --> 00:05:44.000
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:49.858
I begin by sketching the first draft

00:05:49.858 --> 00:05:53.039
of the 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:05:59.486
This is a typical source file.

00:05:59.486 --> 00:06:01.360
It begins with a stylesheet

00:06:01.360 --> 00:06:03.690
where I set variables and layout settings,

00:06:03.690 --> 00:06:04.875
although in general,

00:06:04.875 --> 00:06:07.039
there's no need for tweaking the layout

00:06:07.039 --> 00:06:11.199
unless you have specific requirements to
do so.

00:06:11.199 --> 00:06:15.520
The easiest way to compile the file
from 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:25.439
Now to automate the process of

00:06:25.439 --> 00:06:28.560
compiling 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:36.000
open the shell 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.494
As I moved forward with the project,

00:06:43.494 --> 00:06:46.000
I 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.437
so I built one for casual use

00:06:52.437 --> 00:06:55.919
and made 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:04.479
between input and output files without
getting lost.

00:07:04.479 --> 00:07:07.290
So I wrote a command for toggling bar
numbers,

00:07:07.290 --> 00:07:10.000
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:16.490
accents and tuplets, for example--

00:07:16.490 --> 00:07:20.160
so I use template expansion extensively
for this purpose,

00:07:20.160 --> 00:07:23.440
mainly yasnippet.

00:07:23.440 --> 00:07:24.797
So what do I think?

00:07:24.797 --> 00:07:28.080
Well, I think Lilypond can be a sharp
paradigm shift

00:07:28.080 --> 00:07:30.817
for people used to GUI alternatives,

00:07:30.817 --> 00:07:32.720
but 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:39.635
Likewise, the ability to extend the
software,
I think,

00:07:39.635 --> 00:07:42.400
is especially appealing for music
professionals,

00:07:42.400 --> 00:07:46.560
enthusiasts, composers, and the academic
community:

00:07:46.560 --> 00:07:48.400
for example, allowing users to create

00:07:48.400 --> 00:07:50.187
alternative notation systems

00:07:50.187 --> 00:07:53.120
required in 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:05.971
But if you're still not sure

00:08:05.971 --> 00:08:10.475
where to start and when to wedge your
feet in the deep but warm pond

00:08:10.475 --> 00:08:13.680
of lilies, Lilypond, and Lilypond users,

00:08:13.680 --> 00:08:16.960
I invite you to contribute to my
Lilypond projects,

00:08:16.960 --> 00:08:20.720
which you can do so from the links on
the screen.

00:08:20.720 --> 00:08:23.271
So, thank you all. I look forward to
your comments,

00:08:23.271 --> 00:08:27.840
and I hope you enjoy the rest of the
conference.