WEBVTT 00:00:01.360 --> 00:00:04.480 Hello, my name is Grant Shangreaux. 00:00:04.480 --> 00:00:07.279 This is my talk titled Bard Bivou(m)acs: 00:00:07.279 --> 00:00:07.919 Publishing Music 00:00:07.919 --> 00:00:10.719 with Emacs. I'm a software 00:00:10.719 --> 00:00:12.799 developer with Unabridged Software in 00:00:12.799 --> 00:00:14.400 Lincoln, Nebraska. 00:00:14.400 --> 00:00:16.800 Long time Emacs user, relatively new 00:00:16.800 --> 00:00:18.720 Emacs hacker. 00:00:18.720 --> 00:00:20.480 Hopefully, I'll be able to show 00:00:20.480 --> 00:00:22.960 you my workflow, with 00:00:22.960 --> 00:00:30.480 how I publish music with Emacs. 00:00:30.480 --> 00:00:33.440 All right. So as a musician, I would like 00:00:33.440 --> 00:00:35.520 to publish my music online. 00:00:35.520 --> 00:00:37.200 I could publish with popular 00:00:37.200 --> 00:00:39.040 online music services, 00:00:39.040 --> 00:00:42.000 but I'm more of a DIY-type, so I chose to 00:00:42.000 --> 00:00:44.719 go ahead and publish with Emacs. 00:00:44.719 --> 00:00:48.160 What's the motivation behind this? 00:00:48.160 --> 00:00:49.760 A lot of it comes down to some 00:00:49.760 --> 00:00:51.600 fundamental freedoms 00:00:51.600 --> 00:00:54.960 that Emacs and GNU software 00:00:54.960 --> 00:00:59.120 represent to me, as well as my 00:00:59.120 --> 00:01:01.840 ideas on culture and my background. 00:01:01.840 --> 00:01:04.080 I don't believe that music is a consumer good. 00:01:04.080 --> 00:01:06.080 It's a form of knowledge, 00:01:06.080 --> 00:01:08.320 like an algorithm. 00:01:08.320 --> 00:01:10.479 And it's just such a part of 00:01:10.479 --> 00:01:13.119 culture, like in tribal cultures, music 00:01:13.119 --> 00:01:16.640 was seen as a gift from the cosmos or 00:01:16.640 --> 00:01:18.000 the gods. It was 00:01:18.000 --> 00:01:19.920 a gift maybe through an individual 00:01:19.920 --> 00:01:21.920 vessel, but was shared with the people 00:01:21.920 --> 00:01:23.520 and shared with everyone, 00:01:23.520 --> 00:01:26.799 kept alive by the culture itself. 00:01:26.799 --> 00:01:29.840 So to me, music is something that 00:01:29.840 --> 00:01:31.520 should be shared and should be 00:01:31.520 --> 00:01:34.640 freely enjoyed by everyone. Of course, 00:01:34.640 --> 00:01:36.560 artists should be compensated as well, 00:01:36.560 --> 00:01:39.040 but that's a whole different topic. 00:01:39.040 --> 00:01:41.040 So when I want to share my music, 00:01:41.040 --> 00:01:42.720 I want to do it without impacting 00:01:42.720 --> 00:01:43.520 anyone's freedom. 00:01:43.520 --> 00:01:45.680 Using GNU software like Emacs is a 00:01:45.680 --> 00:01:49.200 good way that I can ensure that 00:01:49.200 --> 00:01:52.840 I won't be requiring people to 00:01:52.840 --> 00:01:55.840 sign away their freedoms for anything. 00:01:55.840 --> 00:01:57.119 There's a lot more I could say about 00:01:57.119 --> 00:01:58.799 this but I don't have time. 00:01:58.799 --> 00:02:03.439 Feel free to reach out to me by email or IRC. 00:02:03.439 --> 00:02:06.479 Part of the motivation for me, 00:02:06.479 --> 00:02:08.239 personally, is that Emacs is super 00:02:08.239 --> 00:02:10.720 magical. It's an all-in-one solution. 00:02:10.720 --> 00:02:12.720 Like I said, the GNU software aligns with 00:02:12.720 --> 00:02:14.480 Creative Commons' ideas. 00:02:14.480 --> 00:02:16.800 I can do file management. I can author 00:02:16.800 --> 00:02:18.879 HTML, all the web stuff I need even, 00:02:18.879 --> 00:02:20.239 literate-style. 00:02:20.239 --> 00:02:22.640 I can handle media and metadata. I've got 00:02:22.640 --> 00:02:24.640 version control, remote server access... 00:02:24.640 --> 00:02:26.800 All the tools I need are right under my 00:02:26.800 --> 00:02:28.080 fingertips with this tool 00:02:28.080 --> 00:02:30.000 that I use every day for a long time. 00:02:30.000 --> 00:02:31.440 I don't need to look elsewhere. 00:02:31.440 --> 00:02:34.319 It was a challenge. 00:02:34.319 --> 00:02:36.319 I wanted to see if I could do this 00:02:36.319 --> 00:02:39.440 all within Emacs itself. 00:02:39.440 --> 00:02:41.680 So, how do you use Emacs to publish music? 00:02:41.680 --> 00:02:43.440 Well, for me, I needed 00:02:43.440 --> 00:02:45.120 a couple of things. I needed to be able 00:02:45.120 --> 00:02:46.480 to audition and label 00:02:46.480 --> 00:02:48.319 unlabeled audio tracks. I have a lot of 00:02:48.319 --> 00:02:50.000 files that I don't know where they 00:02:50.000 --> 00:02:51.280 came from. I don't know what they are. I 00:02:51.280 --> 00:02:53.840 need to be able to listen to them, 00:02:53.840 --> 00:02:56.800 and I need to be able to add metadata to 00:02:56.800 --> 00:02:58.480 whatever audio format it is 00:02:58.480 --> 00:03:00.800 and rename the files based on that 00:03:00.800 --> 00:03:03.200 metadata, potentially. 00:03:03.200 --> 00:03:05.120 And in the end, I wanted to take those 00:03:05.120 --> 00:03:08.319 files and programmatically produce a web page 00:03:08.319 --> 00:03:11.920 for people to consume. I found out that 00:03:11.920 --> 00:03:14.879 Emacs scores a hundred percent on all of 00:03:14.879 --> 00:03:18.000 these requirements that I had for this, and 00:03:18.000 --> 00:03:20.720 a lot of that came from EMMS, the Emacs 00:03:20.720 --> 00:03:22.640 multimedia system. 00:03:22.640 --> 00:03:26.080 EMMS is great. 00:03:26.080 --> 00:03:27.760 If you haven't checked it out, please do. 00:03:27.760 --> 00:03:30.000 It's a little bit unintuitive, but 00:03:30.000 --> 00:03:34.000 once you get into it, you know it works. 00:03:34.000 --> 00:03:36.640 Basically, what EMMS gave me was the 00:03:36.640 --> 00:03:38.720 ability to listen to the tracks, 00:03:38.720 --> 00:03:39.680 organize playlists. 00:03:39.680 --> 00:03:41.280 On top of that, it gave me 00:03:41.280 --> 00:03:42.959 super-powered metadata authoring. 00:03:42.959 --> 00:03:45.040 I'm going to demonstrate that to you. 00:03:45.040 --> 00:03:47.200 So in order to do this, 00:03:47.200 --> 00:03:50.879 you have to require markable playlists, 00:03:50.879 --> 00:03:54.879 so (require 'emms-mark). I'm going to 00:03:54.879 --> 00:03:59.680 go through, and I'm going to open the red... 00:03:59.680 --> 00:04:02.319 I've got this. These files here. So 00:04:02.319 --> 00:04:04.480 you can see these files are mp3s. 00:04:04.480 --> 00:04:06.080 They're recorded on a 00:04:06.080 --> 00:04:07.599 digital recorder. 00:04:07.599 --> 00:04:09.920 If I had the choice, I would have a 00:04:09.920 --> 00:04:12.319 recorder that used a different format, 00:04:12.319 --> 00:04:14.640 but so be it. I can mark all these files 00:04:14.640 --> 00:04:16.160 and I can do EMMS 00:04:16.160 --> 00:04:20.000 add to .., and now they've been loaded 00:04:20.000 --> 00:04:27.040 into a playlist. 00:04:27.040 --> 00:04:29.040 So you can see the playlist here. There's 00:04:29.040 --> 00:04:30.400 some leftover files. 00:04:30.400 --> 00:04:32.000 So I've got these three files in my 00:04:32.000 --> 00:04:33.759 playlist, and as you can see, it's just 00:04:33.759 --> 00:04:34.639 the file name, 00:04:34.639 --> 00:04:36.800 the path. I don't have any metadata 00:04:36.800 --> 00:04:38.560 associated with them. 00:04:38.560 --> 00:04:41.360 In this playlist, I can hit E, 00:04:41.360 --> 00:04:43.440 and it'll bring up a buffer showing 00:04:43.440 --> 00:04:47.360 the tag information that I have. 00:04:47.360 --> 00:04:49.840 I could edit these here. 00:04:49.840 --> 00:04:51.520 I could edit them one at a time, but that's 00:04:51.520 --> 00:04:53.919 not really great. I want superpower 00:04:53.919 --> 00:05:04.479 metadata authoring. So, 00:05:04.479 --> 00:05:07.680 by marking them, I can then hit E, and I 00:05:07.680 --> 00:05:10.479 have all three of the tracks loaded up in 00:05:10.479 --> 00:05:12.639 this tags buffer. 00:05:12.639 --> 00:05:15.759 On top of that, I can do EMMS 00:05:15.759 --> 00:05:18.800 tag editor, set all, C-c C-r, 00:05:18.800 --> 00:05:22.840 and I want to set the artist. 00:05:22.840 --> 00:05:25.680 so these are some recordings of my 00:05:25.680 --> 00:05:26.320 family. 00:05:26.320 --> 00:05:31.039 So, Shangreaux, set all three of them. 00:05:31.039 --> 00:05:35.600 I want to set the album: 00:05:35.600 --> 00:05:40.160 Spring Walk with Lap Harp. 00:05:40.160 --> 00:05:45.520 I want to set the year. 00:05:45.520 --> 00:05:48.960 And then I'm going to go ahead and put 00:05:48.960 --> 00:05:53.759 these in manually, 00:05:53.759 --> 00:05:55.840 but with the power of Emacs keyboard 00:05:55.840 --> 00:05:57.039 macros and 00:05:57.039 --> 00:05:59.600 registers and so on. I could do this 00:05:59.600 --> 00:06:02.319 programmatically as well, 00:06:02.319 --> 00:06:04.000 which would make it a lot easier if I 00:06:04.000 --> 00:06:06.000 had much more than three files to 00:06:06.000 --> 00:06:07.440 do this with. 00:06:07.440 --> 00:06:09.919 Submit the changes with C-c C-c, 00:06:09.919 --> 00:06:11.520 and now we've got the playlist. You can 00:06:11.520 --> 00:06:13.120 see the artist and track number have 00:06:13.120 --> 00:06:15.039 been updated here. 00:06:15.039 --> 00:06:17.360 And then the final piece of this is that 00:06:17.360 --> 00:06:19.039 if you look at this, you can see that the 00:06:19.039 --> 00:06:20.479 file name is still the same. 00:06:20.479 --> 00:06:22.639 So if I were looking at the directory, 00:06:22.639 --> 00:06:24.560 I would still have this file name. 00:06:24.560 --> 00:06:26.479 When packaging these up for a release, 00:06:26.479 --> 00:06:28.000 for people to download, 00:06:28.000 --> 00:06:30.319 it's nice to be able to have that 00:06:30.319 --> 00:06:32.400 filename reflect the track number and the 00:06:32.400 --> 00:06:34.800 artist and so on. So there's another 00:06:34.800 --> 00:06:41.199 command, EMMS 00:06:41.199 --> 00:06:44.160 rename tag editor, rename, so it could be 00:06:44.160 --> 00:06:45.120 just capital R. 00:06:45.120 --> 00:06:47.199 I think I need to mark all of these, hit 00:06:47.199 --> 00:06:48.880 capital R, and then it's going to ask me 00:06:48.880 --> 00:06:50.000 to confirm 00:06:50.000 --> 00:06:54.400 and say yes to all of them. 00:06:54.400 --> 00:07:02.720 And now, if you look in the-- 00:07:02.720 --> 00:07:04.319 whoops I have to update it--you'll see 00:07:04.319 --> 00:07:06.319 it's been updated with the artist, 00:07:06.319 --> 00:07:09.840 track number and 00:07:09.840 --> 00:07:11.120 track name. 00:07:11.120 --> 00:07:14.639 This format is a format string, so 00:07:14.639 --> 00:07:17.360 it's customizable of course. 00:07:17.360 --> 00:07:21.039 I just decided to go with the default. 00:07:21.039 --> 00:07:24.160 So that's pretty great, this workflow 00:07:24.160 --> 00:07:26.000 just with EMMS. I didn't have to do 00:07:26.000 --> 00:07:28.080 anything. This is all there. It's all 00:07:28.080 --> 00:07:30.960 built in. It gave me exactly what 00:07:30.960 --> 00:07:32.639 I was looking for in terms of being able 00:07:32.639 --> 00:07:35.599 to process a lot of raw audio files 00:07:35.599 --> 00:07:37.599 add metadata to them and get them ready 00:07:37.599 --> 00:07:39.280 for publishing. 00:07:39.280 --> 00:07:41.599 And this is for publishing for playback 00:07:41.599 --> 00:07:43.520 in any media player. It'll be 00:07:43.520 --> 00:07:46.560 useful. Not just for the web page that I'm 00:07:46.560 --> 00:07:48.479 building. So the 00:07:48.479 --> 00:07:50.560 final part, of course, is to build the 00:07:50.560 --> 00:07:54.960 web page. Emacs makes authoring HTML trivial. 00:07:54.960 --> 00:07:57.440 As I was going through this, I 00:07:57.440 --> 00:07:59.039 wanted to challenge myself and just be, 00:07:59.039 --> 00:08:00.400 like, can I do this 00:08:00.400 --> 00:08:03.520 just all with Emacs? Can I just make this? 00:08:03.520 --> 00:08:05.440 I don't need a... I don't need Ruby. I don't 00:08:05.440 --> 00:08:07.039 need Rails. I don't need Node. I don't 00:08:07.039 --> 00:08:08.960 need any of this other stuff. I have my 00:08:08.960 --> 00:08:10.560 tool right here. It's a fully... 00:08:10.560 --> 00:08:12.560 It's a whole operating system, basically, 00:08:12.560 --> 00:08:15.039 plus programming languages. 00:08:15.039 --> 00:08:17.360 So the first thing I started with was 00:08:17.360 --> 00:08:19.919 buffer scripting for manipulating text. 00:08:19.919 --> 00:08:22.560 That's kind of the easiest way to do it. 00:08:22.560 --> 00:08:24.319 Basically, anything you can do in a 00:08:24.319 --> 00:08:25.280 buffer, you can do 00:08:25.280 --> 00:08:28.479 programmatically with Elisp. So this 00:08:28.479 --> 00:08:30.319 might be a good example for beginners. If 00:08:30.319 --> 00:08:33.919 you haven't done any Elisp yet, 00:08:33.919 --> 00:08:36.000 a simple example is to create this 00:08:36.000 --> 00:08:36.959 this div 00:08:36.959 --> 00:08:40.000 output here. You 00:08:40.000 --> 00:08:41.760 can use this with-temp-buffer, so 00:08:41.760 --> 00:08:44.240 basically creating an imaginary buffer. 00:08:44.240 --> 00:08:46.640 insert is just like typing, so you put 00:08:46.640 --> 00:08:48.800 strings in, you put new lines in, 00:08:48.800 --> 00:08:50.959 you can build some strings together. 00:08:50.959 --> 00:08:52.080 Here you can see 00:08:52.080 --> 00:08:54.000 I'm doing a random number, so every time 00:08:54.000 --> 00:08:55.360 I execute this, 00:08:55.360 --> 00:08:57.920 my content changes. I can generate 00:08:57.920 --> 00:09:01.040 dynamic content in HTML blocks 00:09:01.040 --> 00:09:04.399 with Elisp. For my 00:09:04.399 --> 00:09:05.920 web page builder, It's a little more 00:09:05.920 --> 00:09:08.000 complex. I'm pulling data out 00:09:08.000 --> 00:09:12.080 using EMMS data structures, 00:09:12.080 --> 00:09:16.080 so it's pulling that out from the track data. 00:09:16.080 --> 00:09:19.440 And then I'm using some program to 00:09:19.440 --> 00:09:21.440 generate list elements, so each track is 00:09:21.440 --> 00:09:23.200 going to have the title 00:09:23.200 --> 00:09:25.120 and track number, and then a button for 00:09:25.120 --> 00:09:26.959 playing it, plus the source 00:09:26.959 --> 00:09:29.519 of the audio file, which will get added 00:09:29.519 --> 00:09:30.480 here. 00:09:30.480 --> 00:09:32.640 Right now, this is hard coded for Opus, so 00:09:32.640 --> 00:09:37.200 it won't work for my MP3s. 00:09:37.200 --> 00:09:39.120 I'm going to skip over snippets. Turns 00:09:39.120 --> 00:09:41.200 out format strings were good enough 00:09:41.200 --> 00:09:45.519 for me. Snippets could be useful, but 00:09:45.519 --> 00:09:48.160 format is super powerful, and I didn't 00:09:48.160 --> 00:09:49.839 really even need all that much power, 00:09:49.839 --> 00:09:51.279 basically, just doing string 00:09:51.279 --> 00:09:53.519 interpolation. So if you haven't seen 00:09:53.519 --> 00:09:54.560 format before, 00:09:54.560 --> 00:09:56.720 you basically put these control strings 00:09:56.720 --> 00:09:59.120 or control characters inside of a string, 00:09:59.120 --> 00:10:03.120 and you can generate an 00:10:03.120 --> 00:10:05.040 output string that you want. 00:10:05.040 --> 00:10:07.600 So in my generator code, basically, it's 00:10:07.600 --> 00:10:08.720 down here, 00:10:08.720 --> 00:10:10.959 I'm calling format with this Bard 00:10:10.959 --> 00:10:12.800 Bivou(m)acs template, 00:10:12.800 --> 00:10:15.920 and that's basically a big 00:10:15.920 --> 00:10:18.240 a big string of HTML. It's just 00:10:18.240 --> 00:10:21.200 my whole page of HTML 00:10:21.200 --> 00:10:22.959 with those control characters in just 00:10:22.959 --> 00:10:24.399 four places. 00:10:24.399 --> 00:10:26.399 One of them populates the track list. 00:10:26.399 --> 00:10:29.760 That's really the meat of the program. 00:10:29.760 --> 00:10:32.079 Again, this is a combination of using 00:10:32.079 --> 00:10:33.440 buffer scripting, 00:10:33.440 --> 00:10:37.279 using HTML mode, inserting text format strings, 00:10:37.279 --> 00:10:40.000 and then I can indent-region so the HTML 00:10:40.000 --> 00:10:41.920 actually looks pretty 00:10:41.920 --> 00:10:45.200 when it comes out of it as well. 00:10:45.200 --> 00:10:50.160 I will show that, just really quick 00:10:50.160 --> 00:10:54.000 actually. 00:10:54.000 --> 00:10:56.880 So you can see, this is the HTML that got 00:10:56.880 --> 00:10:58.800 generated. I've got my template. 00:10:58.800 --> 00:11:02.560 I inserted the title here, the style, the 00:11:02.560 --> 00:11:05.760 font was all inserted, 00:11:05.760 --> 00:11:07.920 and then this whole list of of tracks here. 00:11:07.920 --> 00:11:11.200 It's kind of messy to look at, 00:11:11.200 --> 00:11:14.399 but this track list, this whole div here, 00:11:14.399 --> 00:11:15.920 is all generated by 00:11:15.920 --> 00:11:22.480 my generator code, and it works. It's great. 00:11:22.480 --> 00:11:27.120 Okay, moving on. 00:11:27.120 --> 00:11:30.240 So the other thing was that as I was 00:11:30.240 --> 00:11:32.079 developing this, I decided to use 00:11:32.079 --> 00:11:33.200 Org Babel and some of his 00:11:33.200 --> 00:11:35.360 its features for multi-language 00:11:35.360 --> 00:11:36.880 things because I needed to style it with 00:11:36.880 --> 00:11:37.839 CSS and 00:11:37.839 --> 00:11:40.480 and put actions in Javascript, and also I 00:11:40.480 --> 00:11:42.480 used SVG for authoring stuff. 00:11:42.480 --> 00:11:46.079 It was a little bit complicated. 00:11:46.079 --> 00:11:47.680 It probably would have been simpler had I 00:11:47.680 --> 00:11:49.600 not used Org Babel, but it's also really 00:11:49.600 --> 00:11:51.440 fun. I think it's a cool, 00:11:51.440 --> 00:11:53.839 cool idea to use literate programming. My 00:11:53.839 --> 00:11:55.839 idea was to create HTML 00:11:55.839 --> 00:11:59.519 components. I could name it like this, 00:11:59.519 --> 00:12:01.440 put a format string inside it, and build 00:12:01.440 --> 00:12:02.800 a function 00:12:02.800 --> 00:12:05.519 in Elisp to format it and spit out the 00:12:05.519 --> 00:12:07.120 HTML that I want. 00:12:07.120 --> 00:12:10.320 By doing this, then, I can 00:12:10.320 --> 00:12:12.880 just change things in my Org file which, 00:12:12.880 --> 00:12:14.320 not getting a whole lot of time to work 00:12:14.320 --> 00:12:16.959 on it, I can come back to it and 00:12:16.959 --> 00:12:19.839 I have a lot of notes. I can 00:12:19.839 --> 00:12:21.920 kind of generate things as I'm going and 00:12:21.920 --> 00:12:24.399 keep notes for myself, and keep the... 00:12:24.399 --> 00:12:25.600 I don't know. It's cool. Literate 00:12:25.600 --> 00:12:27.519 programming is fun. So I don't need to 00:12:27.519 --> 00:12:29.279 go into that too much, but you can see if 00:12:29.279 --> 00:12:31.040 I execute this here, 00:12:31.040 --> 00:12:33.360 I get the the div that I want. It's a 00:12:33.360 --> 00:12:34.880 little bit funny. You'll see I have the 00:12:34.880 --> 00:12:36.480 string like this, the way that 00:12:36.480 --> 00:12:39.200 noweb expands, I can't do this on a 00:12:39.200 --> 00:12:40.000 single line. 00:12:40.000 --> 00:12:43.839 It looks funny when you do that, 00:12:43.839 --> 00:12:45.440 so that might be something to work out 00:12:45.440 --> 00:12:48.959 later. CSS blocks can either be tangled out 00:12:48.959 --> 00:12:52.639 and referenced in the HTML source or inlined. 00:12:52.639 --> 00:12:54.639 Here's an example I have of inlining it. 00:12:54.639 --> 00:12:56.959 So I've got my little CSS block named 00:12:56.959 --> 00:13:00.320 style, Javascript named script, 00:13:00.320 --> 00:13:03.040 and then I've got this HTML source block 00:13:03.040 --> 00:13:04.839 with noweb expansion. 00:13:04.839 --> 00:13:07.920 These double angle brackets here 00:13:07.920 --> 00:13:09.839 are where I'm going to expand the block 00:13:09.839 --> 00:13:12.639 named style. I'm actually calling a function, 00:13:12.639 --> 00:13:14.399 so I want the result of the function 00:13:14.399 --> 00:13:17.040 here, and then the script will just get 00:13:17.040 --> 00:13:22.959 expanded here. So org-babel-expand-src-block, 00:13:22.959 --> 00:13:25.360 you can see what it looks like. 00:13:25.360 --> 00:13:28.160 I've got my style here. I've got my title. 00:13:28.160 --> 00:13:29.920 I've got that main content class 00:13:29.920 --> 00:13:31.279 I showed before, 00:13:31.279 --> 00:13:34.480 and the script as well. So that's kind of cool. 00:13:34.480 --> 00:13:36.320 I could just run org-babel-tangle and 00:13:36.320 --> 00:13:38.160 get my thing out and just 00:13:38.160 --> 00:13:40.480 edit one file instead of multiple files. 00:13:40.480 --> 00:13:41.600 Not for everyone, 00:13:41.600 --> 00:13:45.839 but I thought it was kind of fun. 00:13:45.839 --> 00:13:47.760 All right. Oh, and the final thing is that 00:13:47.760 --> 00:13:49.199 in Emacs, you can 00:13:49.199 --> 00:13:52.880 author and view SVG. So this is just an 00:13:52.880 --> 00:13:57.199 Org. This SVG, I used to make the play 00:13:57.199 --> 00:13:59.519 and pause buttons. I didn't know this, 00:13:59.519 --> 00:14:02.800 but if you edit an SVG file, you can 00:14:02.800 --> 00:14:08.800 toggle back and forth 00:14:08.800 --> 00:14:13.199 between the code and the image. 00:14:13.199 --> 00:14:17.360 It's pretty sweet. So I can iteratively 00:14:17.360 --> 00:14:19.680 work through this because of how 00:14:19.680 --> 00:14:20.560 Emacs is. 00:14:20.560 --> 00:14:24.959 Final considerations here, 00:14:24.959 --> 00:14:27.360 like when doing this, I want it to be all 00:14:27.360 --> 00:14:29.279 free, so I want to use fonts that use a 00:14:29.279 --> 00:14:30.079 free license. 00:14:30.079 --> 00:14:32.800 I found GNU Unifont. It's kind of cool. 00:14:32.800 --> 00:14:34.800 The content license... I chose 00:14:34.800 --> 00:14:37.600 Creative Commons Attribution ShareAlike, 00:14:37.600 --> 00:14:39.920 which is kind of like the GPL. 00:14:39.920 --> 00:14:42.880 Ideally, I could serve it with Emacs. I'd 00:14:42.880 --> 00:14:44.800 like to remove idiosyncrasy so other 00:14:44.800 --> 00:14:46.320 people can use it. 00:14:46.320 --> 00:14:48.720 It's pretty much just my tool right now. 00:14:48.720 --> 00:14:51.040 Not requiring the web browser... I can 00:14:51.040 --> 00:14:54.079 ship playlists so that you can just 00:14:54.079 --> 00:14:58.000 click or link to a playlist on your favorite 00:14:58.000 --> 00:15:00.639 player, even EMMS if you want, and then 00:15:00.639 --> 00:15:02.639 packing up those albums in like a ZIP or 00:15:02.639 --> 00:15:04.320 .tar file. 00:15:04.320 --> 00:15:08.639 So you can go to churls.world . 00:15:08.639 --> 00:15:10.880 It just has a link to this album. I'll 00:15:10.880 --> 00:15:14.000 display it here in just a second. 00:15:14.000 --> 00:15:17.519 You can contact me. I'm shoshin on #emacs 00:15:17.519 --> 00:15:21.040 in IRC and on sourcehut. You can email me 00:15:21.040 --> 00:15:23.680 grant@churls.world, personal, or 00:15:23.680 --> 00:15:26.800 grant@unabridgedsoftware.com. All right, now. 00:15:26.800 --> 00:15:32.079 Let's see about this... 00:15:32.079 --> 00:15:33.680 This is up online, so if you want to 00:15:33.680 --> 00:15:35.120 listen to my 00:15:35.120 --> 00:15:39.199 college band's album from 20 years ago, 00:15:39.199 --> 00:15:43.040 here it is: Cassiopeia Basement Days. 00:15:43.040 --> 00:15:47.680 Whoops. I made this art in Krita. You can 00:15:47.680 --> 00:15:51.199 press play. You can skip around. 00:15:51.199 --> 00:15:55.040 I do have the playlist up here too. 00:15:55.040 --> 00:15:58.560 So yeah, thanks for listening. 00:15:58.560 --> 00:16:00.880 I hope you enjoyed it, and enjoy the rest 00:16:00.880 --> 00:16:07.360 of EmacsConf. Goodbye!