WEBVTT 00:00.000 --> 00:09.000 Yeah, next up, we have Zobia. 00:09.000 --> 00:11.000 Hey everyone. 00:11.000 --> 00:15.000 Can you hear me well enough? 00:15.000 --> 00:16.000 Yeah. 00:16.000 --> 00:18.000 So my name is Xavier. 00:18.000 --> 00:20.000 I'm a programmer and songwriter. 00:20.000 --> 00:22.000 I'm based here in Brussels. 00:22.000 --> 00:25.000 And I'm going to be presenting a software project called 00:25.000 --> 00:29.000 it's a prototype of a music production software that tries to bridge the gap between 00:29.000 --> 00:32.000 life-coding and conventional dollars. 00:32.000 --> 00:34.000 The stock is not going to be a product pitch. 00:34.000 --> 00:37.000 Power is mainly a research prototype at this point. 00:37.000 --> 00:42.000 And while it is open source, I wouldn't recommend you actually try it out. 00:42.000 --> 00:46.000 Instead, I kind of want to sell you on the ideas behind it and how I think they fit 00:46.000 --> 00:48.000 into the free software movements. 00:48.000 --> 00:51.000 I'm hoping to make you maybe curious or inspired. 00:51.000 --> 00:55.000 So to explain how I started this project, I'll give you an example from Odor. 00:55.000 --> 00:58.000 Let's say I have two different effects in Odor. 00:58.000 --> 01:01.000 And I want to sync up their settings. 01:01.000 --> 01:06.000 For example, one node that I can turn and it changes the EQ on two different tracks. 01:06.000 --> 01:08.000 It's something that you can do in some of the dots. 01:08.000 --> 01:11.000 I haven't found a way to do it in Odor. 01:11.000 --> 01:13.000 To me, it feels conceptually simple. 01:13.000 --> 01:16.000 It's basically, I declare some states for my knob. 01:16.000 --> 01:20.000 And then I use that state as the value for two different EQs. 01:20.000 --> 01:22.000 And then, you know, slap a GUI on top of it. 01:22.000 --> 01:24.000 How difficult can it be? 01:24.000 --> 01:27.000 But in reality, this requires a really good understanding. 01:27.000 --> 01:31.000 I think it's a good understanding of the codebase of Odor, which is really big, by the way. 01:31.000 --> 01:35.000 And not only that, you can't just slap a GUI on top of something. 01:35.000 --> 01:39.000 It's like you have to kind of understand how it fits into the program, 01:39.000 --> 01:42.000 how to configure the settings of the knob and everything. 01:42.000 --> 01:46.000 So even though the feature seems simple, it's not something that I can do quickly. 01:46.000 --> 01:51.000 For example, what I take a break from mixing a song that I'm working on. 01:51.000 --> 01:57.000 To me, this represents a mismatch between the ideals of free software and reality. 01:57.000 --> 02:00.000 We have the essential freedoms and they're important. 02:00.000 --> 02:04.000 But why they guarantee that we may change software that we'd use. 02:04.000 --> 02:06.000 It doesn't mean that we actually can change it. 02:06.000 --> 02:09.000 And I find that in practice, software doesn't really want to be changed. 02:09.000 --> 02:13.000 Unless you're like an actual contributor to the program you're using. 02:14.000 --> 02:16.000 And we have it pretty good. 02:16.000 --> 02:19.000 I assume most people in this room are programmers like me. 02:19.000 --> 02:26.000 Like most users, like to most users of the ideas of free software, even less accessible. 02:26.000 --> 02:31.000 And I think one of the big problems is a lack of composability. 02:31.000 --> 02:36.000 A tool is composable when it's made from simple parts that can be combined together into complex things. 02:36.000 --> 02:40.000 For example, the UNIX shell is composable. 02:40.000 --> 02:45.000 Simple tools that do one thing well, and then you pipe them together to accomplish complex tasks. 02:45.000 --> 02:48.000 Another great example is EMAX. 02:48.000 --> 02:53.000 When you're using EMAX, basically it involves learning and using a little bit of E-list. 02:53.000 --> 02:58.000 And this creates a sort of gradient between using and programming EMAX. 02:58.000 --> 03:03.000 And you can walk this gradient based on your needs and your mastery of E-list. 03:03.000 --> 03:07.000 And in comparison, most GUI applications have poor composability. 03:07.000 --> 03:08.000 There are good reasons for that. 03:08.000 --> 03:11.000 Making GUI is composable is difficult. 03:11.000 --> 03:14.000 In some ways, it's still an open problem. 03:14.000 --> 03:19.000 And composable interfaces tend to be more complex and less beginner-friendly. 03:19.000 --> 03:24.000 But the consequence is that instead of a gradient like EMAX, we have a cliff. 03:24.000 --> 03:29.000 And so sometime ago, I set out to make my own DAW with composability in mind. 03:29.000 --> 03:32.000 And to do that, I borrowed ideas from two different fields. 03:32.000 --> 03:34.000 The first is live coding. 03:34.000 --> 03:40.000 And if you don't know, live coding is the form of live music, where a performer writes a program in a domain-specific language. 03:40.000 --> 03:45.000 And then the program is continuously executed and produces sound. 03:45.000 --> 03:49.000 And because live coding is based on programming, it's inherently composable. 03:49.000 --> 03:56.000 Typically, live coding is used in electronic music to make procedural loop-based music. 03:56.000 --> 04:04.000 The part my project, it's based on live coding, but the goal is a bit different because it targets the same use cases as a traditional DAW. 04:04.000 --> 04:08.000 So things like recording, arranging, and mixing tracks. 04:08.000 --> 04:11.000 Let's look at an actual example. 04:11.000 --> 04:14.000 How do I do this? 04:14.000 --> 04:20.000 So let's pray that the sound actually works. 04:20.000 --> 04:28.000 And shout at me if it's too loud. 04:28.000 --> 04:32.000 So basically, I have this source code here on the left. 04:32.000 --> 04:38.000 And it's the source code for this music that we can hear on the right. 04:38.000 --> 04:42.000 And I'm going to show you how I can, so this is supposed to be a DAW. 04:42.000 --> 04:44.000 Imagine that it's a DAW. 04:44.000 --> 04:49.000 And I'm going to show you how I can add a track to this DAW. 04:49.000 --> 04:54.000 And so because it's a programming language, a track is going to be a data structure. 04:54.000 --> 04:56.000 I'm going to copy some code to go faster. 04:56.000 --> 04:58.000 So this is a track. 04:58.000 --> 05:02.000 And the important part is this list of clips that I have here. 05:02.000 --> 05:05.000 And so there's a single clip in my track. 05:05.000 --> 05:06.000 It's this wave file. 05:06.000 --> 05:10.000 I have a start and end that represents how the clip is trimmed. 05:10.000 --> 05:12.000 And then I have a location on the track. 05:12.000 --> 05:15.000 And I'm going to go ahead and set it at the beginning of the track. 05:15.000 --> 05:18.000 Let's rewind and let's listen it. 05:19.000 --> 05:22.000 Right, we count here anything because this is just a data structure. 05:22.000 --> 05:24.000 I actually need to sample from it. 05:24.000 --> 05:28.000 So I'm going to call this function here called track read buffer at. 05:28.000 --> 05:33.000 And basically, it reads a buffer of audio from this track at a given location. 05:33.000 --> 05:37.000 And then I'm going to mix that buffer into the master buffer, 05:37.000 --> 05:39.000 which is the one that we're actually listening to. 05:39.000 --> 05:42.000 And this is just like a vector addition. 05:42.000 --> 05:44.000 I'm like adding all the samples in those two buffers. 05:44.000 --> 05:47.000 And let's see what this sounds like. 05:48.000 --> 05:50.000 Now I can hear my track. 05:52.000 --> 05:53.000 Okay. 05:53.000 --> 05:56.000 Now maybe I want to change the volume of the track. 05:56.000 --> 05:58.000 And for this, I'm going to call this buff scale function, 05:58.000 --> 06:01.000 which multiplies every sample in a buffer with. 06:01.000 --> 06:05.000 By a constant, let's actually maybe set it to minus 10. 06:05.000 --> 06:07.000 So we can hear better. 06:08.000 --> 06:10.000 Oh yeah, it had to compile. 06:10.000 --> 06:12.000 It's a programming language. 06:12.000 --> 06:14.000 Yeah, there you go. 06:14.000 --> 06:16.000 And then another thing. 06:16.000 --> 06:17.000 Yeah. 06:17.000 --> 06:19.000 If you want to reply and effects, 06:19.000 --> 06:23.000 well, effects and like pretty much every behavior in part are functions. 06:23.000 --> 06:26.000 And so if I want to do a low pass favor, for example, 06:26.000 --> 06:28.000 I'm doing a function call here. 06:28.000 --> 06:32.000 Let's set it to maybe 200 hertz and a queue of 0.7. 06:32.000 --> 06:34.000 And let's listen to it. 06:34.000 --> 06:36.000 We can barely hear it. 06:36.000 --> 06:39.000 But yeah, you can hear the low pass filter, hopefully. 06:39.000 --> 06:41.000 Yeah, yeah. 06:42.000 --> 06:43.000 And that's basically it. 06:43.000 --> 06:45.000 And if you're kind of wondering how this works, 06:45.000 --> 06:48.000 like this is this application on the right. 06:48.000 --> 06:52.000 It's like language server for the programming language 06:52.000 --> 06:53.000 that I have here on the left. 06:53.000 --> 06:56.000 So I can actually go to like the definition of things and so on. 06:57.000 --> 06:58.000 Okay. 06:58.000 --> 07:00.000 Let's, 07:00.000 --> 07:02.000 oh, that's my notes. 07:02.000 --> 07:04.000 Let's continue. 07:04.000 --> 07:05.000 Yes. 07:07.000 --> 07:09.000 So now as you can plainly see, 07:09.000 --> 07:12.000 I'm changing a song this way is miserable. 07:12.000 --> 07:16.000 And I think this is why live coding doesn't usually target this use case. 07:16.000 --> 07:19.000 But I think the properties of this medium are still valuable. 07:19.000 --> 07:21.000 I'm using a programming language. 07:21.000 --> 07:22.000 It's during complete. 07:22.000 --> 07:24.000 I can sort of do anything. 07:24.000 --> 07:27.000 It's making easy things really difficult. 07:27.000 --> 07:30.000 But it's not making anything impossible. 07:30.000 --> 07:34.000 And something that I also really like about this is like all the data in my 07:34.000 --> 07:36.000 file is there in its raw form. 07:36.000 --> 07:37.000 I can see it. 07:37.000 --> 07:38.000 I can understand it. 07:38.000 --> 07:39.000 I can change it. 07:39.000 --> 07:41.000 You saw me like copy pasting stuff. 07:41.000 --> 07:45.000 I get like all the nice things from having this text based medium. 07:45.000 --> 07:48.000 A lot of the features that I would need in a regular DAW. 07:48.000 --> 07:51.000 I don't need to implement them directly in this because I have them in my text 07:51.000 --> 07:53.000 at it or in some way. 07:53.000 --> 07:58.000 And all the features of my DAW like the effects and everything are functions. 07:58.000 --> 08:00.000 I can compose them and I can go to the source. 08:00.000 --> 08:03.000 I can make my own version. 08:03.000 --> 08:05.000 But we have the usability issue. 08:05.000 --> 08:09.000 And so to address it, I borrowed a second idea which is bi-directional programming. 08:09.000 --> 08:14.000 It's a concept from the fields of programming language theory and human computer interaction. 08:14.000 --> 08:19.000 In bi-directional programming, you write a program that has some sort of outputs. 08:19.000 --> 08:23.000 But you can also change the output of the program by changing it directly. 08:23.000 --> 08:28.000 And this gets reflected back into the source code of the program that generated that output. 08:28.000 --> 08:32.000 A seminal work in this space is sketch and sketch. 08:32.000 --> 08:34.000 It's a vector graphics tool. 08:34.000 --> 08:37.000 And basically, you have code here on the left. 08:37.000 --> 08:42.000 And when this code is executed, it generates the drawing on the right. 08:42.000 --> 08:46.000 And then you can actually change this drawing directly like an inkscape. 08:46.000 --> 08:51.000 And it essentially runs the program backwards to change back the source code, 08:51.000 --> 08:53.000 like really cool project. 08:53.000 --> 08:57.000 In part implemented, the like simple version of this. 08:57.000 --> 09:01.000 Basically, I have these, what I call these visual macros, 09:01.000 --> 09:05.000 their special forms that wrap a value in the programming language 09:05.000 --> 09:09.000 and generates a GUI for that value specifically. 09:09.000 --> 09:13.000 And I'm going to show you a few of those. 09:13.000 --> 09:16.000 Let's go. 09:16.000 --> 09:20.000 Okay, so now I'm going to, where's my mouse here? 09:20.000 --> 09:22.000 Now I'm going to reveal this window here. 09:22.000 --> 09:25.000 And you can see a bunch of these visual macros that I talked about. 09:25.000 --> 09:30.000 So if I click on this one, I can see this checkbox here is connected to that piece of code there. 09:30.000 --> 09:31.000 I have a slider here. 09:31.000 --> 09:33.000 It's connected to that piece of code there. 09:33.000 --> 09:40.000 And to give you an example, I'm going to change this frequency that I have here in the effect that I added earlier. 09:40.000 --> 09:46.000 And make it into a slider so that I can actually adjust the frequency as I'm playing. 09:46.000 --> 09:49.000 I'm going to arrange it from 100Hz to 10,000Hz. 09:49.000 --> 09:51.000 And so I have the slider that appeared here. 09:51.000 --> 09:53.000 Now if I start playing. 09:59.000 --> 10:05.000 Yeah, you can sort of here the, you can hopefully hear the, 10:05.000 --> 10:07.000 like frequency of the loop as well as changing. 10:07.000 --> 10:11.000 And you'll notice that when I change this slider, it changes the source code. 10:11.000 --> 10:15.000 And like a slider like this, it's a pretty common thing that you'll find in a lot of life-coding systems. 10:15.000 --> 10:18.000 It's very useful to have. 10:18.000 --> 10:21.000 Another macro that I really like is the checkbox. 10:21.000 --> 10:23.000 I find it to be very versatile. 10:23.000 --> 10:27.000 So for example, a lot of this music, like all of this music here, I recorded myself. 10:27.000 --> 10:29.000 We have like some MIDI stuff. 10:29.000 --> 10:30.000 We have some audio stuff. 10:30.000 --> 10:34.000 And I recorded it with a click track, which we can listen like this. 10:34.000 --> 10:37.000 And if I uncheck the box, we don't have the click track anymore. 10:37.000 --> 10:38.000 And I check it again. 10:38.000 --> 10:40.000 And then we hear it again. 10:40.000 --> 10:42.000 And the way this works is very simple. 10:42.000 --> 10:47.000 In the source code, here I have the definition in use of my click track. 10:47.000 --> 10:50.000 And then it's wrapped in an if statement. 10:50.000 --> 10:52.000 And the condition for the if is the value of the checkbox. 10:52.000 --> 10:53.000 That's it. 10:53.000 --> 10:56.000 And I use it also to like record on tracks. 10:56.000 --> 10:59.000 I can use it to mute a track or to enable an effect. 10:59.000 --> 11:01.000 Okay, thank you. 11:01.000 --> 11:06.000 And then the final, which is that I'm going to show you the final macro. 11:06.000 --> 11:08.000 Then I'm going to show you is this track macro. 11:08.000 --> 11:10.000 So I returned to the track I had at first. 11:10.000 --> 11:13.000 I wrap it in this track macro, I save. 11:13.000 --> 11:16.000 And now we have this track that appears here. 11:16.000 --> 11:19.000 And this is the sample that I did at the start of the first demo. 11:19.000 --> 11:21.000 And I can move it around. 11:21.000 --> 11:23.000 I can resize it. 11:23.000 --> 11:25.000 And yeah, that's kind of it. 11:25.000 --> 11:28.000 And if I don't like what I did, I can undo the changes in my text editor. 11:28.000 --> 11:33.000 And there are like the things I'll back to to where they were. 11:33.000 --> 11:38.000 And yeah, that's it for the second demo. 11:38.000 --> 11:47.000 So this track editor is like the final thing that kind of makes this into a sort of usable though. 11:47.000 --> 11:50.000 Like I've used it to make actual music. 11:50.000 --> 11:55.000 But it's also maybe my least favorite macro because it kind of goes against some of the ideas in this project. 11:55.000 --> 11:56.000 Because it's not really composable. 11:56.000 --> 11:58.000 It's just this monolithic entity. 11:58.000 --> 12:00.000 I think that better ways to do it. 12:00.000 --> 12:02.000 This is what I have now. 12:02.000 --> 12:04.000 Okay. 12:04.000 --> 12:05.000 I really understood. 12:05.000 --> 12:10.000 I argued that adding a small feature to auto was a lot of work for someone who's only a user of auto. 12:10.000 --> 12:12.000 How is Pau any better? 12:12.000 --> 12:14.000 I think it improves in two ways. 12:14.000 --> 12:18.000 First, this idea of walking the gradient that I mentioned earlier. 12:18.000 --> 12:21.000 Using Pau and extending Pau are no distinct actions. 12:21.000 --> 12:23.000 They exist on a continuum. 12:23.000 --> 12:27.000 If you know how to do one, you sort of know how to do the other. 12:27.000 --> 12:33.000 And then another thing that makes that is better is how changing the GUI in Pau is less complicated than in auto. 12:33.000 --> 12:35.000 Like don't get me wrong. 12:35.000 --> 12:37.000 Overall, auto has a better GUI. 12:37.000 --> 12:39.000 It's more powerful. 12:39.000 --> 12:42.000 It's like tax more stuff into it. 12:42.000 --> 12:44.000 But it's more complex to extend. 12:44.000 --> 12:47.000 In Pau, the GUI is more modular and more composable. 12:47.000 --> 12:55.000 If you're familiar with immediate mode GUI's, it really feels like writing an immediate mode GUI for the song that I'm working on. 12:55.000 --> 13:01.000 Pau doesn't like meet all my ideals of like maliable music production tool that I would like to have. 13:01.000 --> 13:06.000 But I think it's a step in the right direction, and I think there's a lot more to explore in this space. 13:06.000 --> 13:09.000 So I'm going to wrap up now. 13:09.000 --> 13:16.000 Why did I come to first them to show you a prototype of an obstacle doll that I don't think you should use? 13:16.000 --> 13:20.000 Well, as I said, I'm hoping to make you think about how we make software. 13:20.000 --> 13:30.000 And I think we the developers of free software, and particularly free creative software like does, have an opportunity to think about this sort of stuff in different ways. 13:30.000 --> 13:33.000 And to build it differently. 13:33.000 --> 13:39.000 As I explained at the start, I think the essential freedoms of free software are not enough to uphold these principles we value. 13:39.000 --> 13:44.000 We should strive to make tools that users can actually own and shape to fit their needs. 13:44.000 --> 13:47.000 This is particularly true of creative software. 13:47.000 --> 13:50.000 Making art has always involved some degree of toolmaking. 13:50.000 --> 13:55.000 I think of painters who are like tweaking their own paint recipes. 13:56.000 --> 14:01.000 I also don't think we will see this sort of innovation from commercial actors or like big commercial actors. 14:01.000 --> 14:06.000 If you're in the business of selling creative software to a mass market, you can't make anything that's too weird. 14:06.000 --> 14:11.000 Whereas I think in this community, we have the freedom to make something different. 14:11.000 --> 14:17.000 And I think like if you're interested in creating new music production software, I suggest you try and make it weirder. 14:17.000 --> 14:19.000 And it doesn't have to be great. 14:19.000 --> 14:22.000 Creative software does not have to be great to be a value. 14:22.000 --> 14:26.000 It mainly has to be different and interesting in its own right. 14:26.000 --> 14:30.000 Because art is not about efficiency, it's not about correctness, it's about aesthetics. 14:30.000 --> 14:34.000 And aesthetics is shaped in part by the tools that we use. 14:34.000 --> 14:37.000 Tools that are different, invite their users to make art that is different. 14:37.000 --> 14:42.000 And tools that can be shaped by their users, invite them to craft their own direction. 14:42.000 --> 14:44.000 Thank you very much. 14:44.000 --> 14:51.000 Thank you. 14:51.000 --> 14:52.000 Amazing presentation. 14:52.000 --> 14:54.000 Really, really, it's very interesting. 14:54.000 --> 14:55.000 There are any questions. 14:55.000 --> 14:58.000 In the meanwhile, it's just in the room as well. 14:58.000 --> 15:00.000 No, I mean, it's just the next speaker. 15:00.000 --> 15:02.000 Okay, so if you can start preparing. 15:02.000 --> 15:07.000 So the first question was here. 15:08.000 --> 15:15.000 I don't know if our door is scriptable or not, but he's okay. 15:15.000 --> 15:17.000 So yeah. 15:17.000 --> 15:29.000 Okay, indeed the question was if it was thinkable to kind of integrate these project into an existing project to have the best of the two worlds. 15:29.000 --> 15:34.000 And for instance, I also think into LMMS. 15:34.000 --> 15:40.000 I don't know if you know LMMS is another sequencer, simpler. 15:40.000 --> 15:44.000 So maybe a good starting point for this kind of integration. 15:44.000 --> 15:47.000 If it's not scriptable, that as well, I don't know. 15:47.000 --> 15:50.000 But the idea is to take the best of the words. 15:50.000 --> 15:56.000 Yeah, so the bird question was, is it like possible to integrate this into an existing tool? 15:56.000 --> 15:57.000 What is it? 15:57.000 --> 15:58.000 I don't know. 15:58.000 --> 16:00.000 If you just put it into the MMS. 16:00.000 --> 16:04.000 So I think it is possible. 16:04.000 --> 16:05.000 Yeah, yeah. 16:05.000 --> 16:14.000 And if you've used the door like a lot more tweakable in a lot of ways. 16:14.000 --> 16:19.000 This project was more like, as I said, it's more of a research project. 16:20.000 --> 16:25.000 And I think I wanted to explore some specific ideas. 16:25.000 --> 16:32.000 I do think probably the, you might get more value by trying to like extend something that exists already. 16:32.000 --> 16:40.000 The advantage of doing something green field is that you don't, you are not limited by the thing that already exists. 16:40.000 --> 16:42.000 You can sort of do whatever you want. 16:42.000 --> 16:47.000 And there are drawbacks to this, but there's also a lot of value in that. 16:48.000 --> 16:50.000 Thank you for the presentation. 16:50.000 --> 16:51.000 I have a very basic question. 16:51.000 --> 16:54.000 What does FTL stand for? 16:54.000 --> 16:59.000 Oh, it's just the name of the programming language in the, it's just called FTL. 16:59.000 --> 17:00.000 It's called futile. 17:00.000 --> 17:02.000 It's a reference to a song that I like. 17:02.000 --> 17:03.000 That's it. 17:03.000 --> 17:07.000 So it's also available as a standalone programming. 17:07.000 --> 17:12.000 Yeah, but I mean the programming language is tightly coupled into the project. 17:12.000 --> 17:15.000 Like, it's just, I made this project without, I'm also programming language nerd. 17:15.000 --> 17:18.000 And so I was like, oh, it's an opportunity to make a programming language. 17:18.000 --> 17:19.000 So I did. 17:19.000 --> 17:20.000 Yeah. 17:20.000 --> 17:21.000 Thank you. 17:26.000 --> 17:28.000 I'm also available for questions afterwards. 17:28.000 --> 17:30.000 It's also time to get everybody. 17:30.000 --> 17:36.000 It is also easy to write, effect inside or only use the effect that is ready from the, 17:36.000 --> 17:39.000 So everything that you heard, like the, the drum and everything, 17:39.000 --> 17:42.000 I wrote everything in the programming language of the thing. 17:42.000 --> 17:46.000 For example, if you want to create an equalizer, for example, 17:46.000 --> 17:51.000 I can code it to the integralizer or I can only use the function of equalizer. 17:51.000 --> 17:54.000 No, so the equalizer that we heard, I wrote myself. 17:54.000 --> 17:57.000 The, like, not the equalizer, but the, like, the low path filter, 17:57.000 --> 18:01.000 which is sort of an equalizer if you rethink about it. 18:01.000 --> 18:07.000 They're making me run for the, to the, to the back lines, so just a second. 18:07.000 --> 18:17.000 Okay, so the question, because this is very, very interesting. 18:17.000 --> 18:20.000 I think it would fit very well in the modular approach, 18:20.000 --> 18:22.000 where you connect things to other things. 18:22.000 --> 18:25.000 Yeah. So do you see any technical problems 18:25.000 --> 18:28.000 into turning this into an audio plugin? 18:28.000 --> 18:30.000 Um, no, I don't think so. 18:30.000 --> 18:34.000 Like, here, here I'm writing buffers of audio outputs, 18:34.000 --> 18:38.000 but like, I could connect them, like, I'm, this is running on jacks, 18:38.000 --> 18:40.000 so I can connect it to auto if I want. 18:40.000 --> 18:44.000 And I could also, like, output MIDI if I wanted to, I, like, 18:44.000 --> 18:48.000 the drums I recorded with a MIDI pad, so I can input MIDI, 18:48.000 --> 18:51.000 I can also output MIDI, so I could connect it into other things. 18:51.000 --> 18:56.000 Okay, because sounds would do more than, yes, thank you. 18:56.000 --> 19:01.000 There was, yeah, one last question, and then we'll move to just. 19:01.000 --> 19:05.000 I mean, I haven't jogged much lately, so this is good for me. 19:09.000 --> 19:13.000 I'm sorry, there's something that is just begging, 19:13.000 --> 19:15.000 and I might have missed something. 19:15.000 --> 19:18.000 You have bi-directional programming, 19:18.000 --> 19:23.000 and it seems to me that AI is the best bi-directional programming ever. 19:23.000 --> 19:28.000 So, I'm expecting this question, and I'm not going to know that for that. 19:28.000 --> 19:34.000 So, I don't feel totally sold on the state of AI as it is right now, 19:34.000 --> 19:38.000 and I'm not going to talk about, like, the ethical aspects of it and anything, 19:38.000 --> 19:44.000 but the thing is, like, AI works great as, like, to generate code, 19:44.000 --> 19:46.000 but it's also good to be able to understand it. 19:46.000 --> 19:52.000 I think here, the idea is, like, if the medium of my, like, 19:52.000 --> 19:55.000 like, program Moldo is this programming language, 19:55.000 --> 19:58.000 and I can use an LM to generate the source code. 19:58.000 --> 20:01.000 I can get a lot of value through this approach as well, 20:01.000 --> 20:05.000 and so I can have an LM to generate some source code. 20:05.000 --> 20:09.000 It also generates the GUI for it, and then I can use the GUI instead of like this. 20:09.000 --> 20:12.000 I think, I don't want to talk more about LM's, 20:12.000 --> 20:15.000 but there might be some ideas there, for sure. 20:19.000 --> 20:20.000 Thank you very much. 20:20.000 --> 20:21.000 Thank you.