[00:47.140 --> 00:48.480] Hi, everybody. [00:49.180 --> 00:49.780] Welcome. [00:50.620 --> 00:52.040] How are y'all enjoying HOPE? [00:52.500 --> 00:52.960] All good? [00:53.260 --> 00:55.580] Who likes Minecraft? [00:59.000 --> 01:00.220] That was really cold. [01:00.360 --> 01:00.740] Try it again. [01:00.960 --> 01:01.160] Yes. [01:01.360 --> 01:02.320] Who likes Minecraft? [01:03.440 --> 01:04.040] Yes. [01:04.640 --> 01:05.660] That's the spirit. [01:06.340 --> 01:13.860] So, Ramon came here to show us that anything that can make noise can make cool music. [01:13.860 --> 01:19.780] And he's gonna do that today in very unexpected ways, including Minecraft. [01:20.140 --> 01:24.580] So, please round of applause and welcome our next presenter, Ramon Castillo. [01:30.760 --> 01:31.820] Thanks so much. [01:51.260 --> 01:52.500] Is there any sound? [01:52.800 --> 01:53.560] There should be sound. [02:07.690 --> 02:08.370] Yeah. [02:10.190 --> 02:12.210] Yeah, everything's all the way up. [02:16.470 --> 02:17.150] Made a clicky noise. [02:17.550 --> 02:18.470] Made a clicky noise? [02:18.690 --> 02:18.850] Yeah. [02:19.210 --> 02:19.530] Okay. [02:19.790 --> 02:20.050] All right. [02:20.310 --> 02:20.970] We'll go with that. [02:21.070 --> 02:22.070] We'll figure it out as we go. [07:31.340 --> 07:32.360] Thank you very much. [07:37.780 --> 07:41.160] The other player in the game that you see here, this is my daughter. [07:41.520 --> 07:47.880] She's at home, she's eight, and she's helped me with a lot of these different Minecraft projects. [07:48.120 --> 07:50.180] So, a round of applause for her, even though she can't hear you. [07:54.140 --> 07:55.600] Anyway, thanks so much. [07:55.960 --> 07:56.860] My name's Ramon. [07:57.080 --> 08:09.820] I'm here to talk about Minecraft and how I've been using it as a musical instrument, or at least a vehicle to create music in real time. [08:15.410 --> 08:19.530] Let me organize myself just a little bit. [08:19.890 --> 08:32.550] I've got a really quick rapid-fire slideshow here for you, but it's more just because I have some information, some background information, to get out into the world. [08:34.090 --> 08:36.050] I'm going to disconnect here so it stops making sound. [08:38.510 --> 08:40.290] So, this is not really the heart of it. [08:40.370 --> 08:48.610] I want to get back into Minecraft and show you some actual things in the game, some developments that we've had over the course of the last year and a half. [08:49.130 --> 08:54.750] But if anyone's interested in some of the links, you can scan that code and get to this exact presentation. [08:56.830 --> 09:03.670] So, I'm an associate teaching professor of music at UMass Lowell, and I've been there since 2012. [09:03.670 --> 09:15.730] I was originally hired to shake up the music theory program, basically burn it to the ground and build it back up with a more global perspective, kind of all-inclusive. [09:15.730 --> 09:19.510] We basically started from scratch. [09:19.730 --> 09:23.310] We tried to make it as non-Euro-centric as possible. [09:23.950 --> 09:28.510] And my role at UMass Lowell has morphed over the years. [09:28.850 --> 09:34.930] In the last... I guess for the last several semesters, I've taught mostly music technology courses. [09:35.790 --> 09:38.370] I've always done music technology, so it's not a new thing. [09:38.690 --> 09:40.430] But that's most of what I've been teaching. [09:40.970 --> 09:43.550] I've started to teach music and sound for games. [09:43.550 --> 09:46.890] And then in the fall, we're launching the video game ensemble. [09:47.270 --> 09:51.230] And so, a lot of these developments were born out of COVID, in fact. [09:51.450 --> 09:57.490] And so, what I wanted to do is talk about how I got here, how this happened in the first place. [09:57.490 --> 10:05.790] And so, on March 11th, 2020, like so many other places, so many other people, I got an email that said we were going full remote. [10:06.030 --> 10:07.530] And everyone was devastated. [10:07.870 --> 10:10.910] I don't really want to talk about that, but this is what happened. [10:12.090 --> 10:15.710] And we decided... they said they were going to assess the situation. [10:15.870 --> 10:22.230] Of course, everybody went full remote for a very long time, through the entire next school year. [10:23.810 --> 10:29.050] So, the classes did not return to normal on the date that they thought maybe they would. [10:29.310 --> 10:31.250] So, that's what happened. [10:32.370 --> 10:36.010] The semester ended, and we're not going to speak about that at all. [10:36.010 --> 10:37.430] It was... I know. [10:38.390 --> 10:39.590] We don't need to talk about it. [10:40.250 --> 10:45.050] But, over the course of the summer, they told us we were going to go full remote. [10:45.330 --> 10:48.570] They decided this kind of early, so we had time to prepare for it. [10:48.690 --> 10:52.710] And so, I made two big decisions about the following year. [10:52.970 --> 10:59.710] I decided, one, I was going to perform a live concert on Twitch for the students, in a thing that we have called Recital Hour. [11:00.790 --> 11:07.110] Most of the concerts were planned on Zoom, and they were pre-recorded videos and things like that, or pre-recorded audio. [11:07.410 --> 11:09.750] I wanted to do something in real time. [11:09.950 --> 11:12.710] So, that was my first decision. [11:12.930 --> 11:16.190] Second, I direct an ensemble that's called the Contemporary Electronic Ensemble. [11:16.930 --> 11:19.710] And it's full of experimentalists. [11:19.710 --> 11:23.750] We build hardware. [11:24.090 --> 11:25.390] We use software. [11:25.630 --> 11:31.350] Some people are doing kind of out-of-the-box MIDI controllerism type of things. [11:31.630 --> 11:34.330] But, it covers a huge range of things. [11:34.370 --> 11:41.190] So, I decided I'm also going to require my students in that class to do a live performance on Twitch as well. [11:41.270 --> 11:49.210] Real-time, actually happening in the moment, engaging with the audience via chat, just so that we can have a new experience out of this. [11:49.610 --> 11:50.950] So, those are my two decisions. [11:51.750 --> 11:55.150] So, the first one, I was going to perform on Twitch for the Recital Hour. [11:56.650 --> 11:57.730] There were three problems. [11:58.110 --> 12:00.730] I'm sure there were more problems than this, but three big problems. [12:00.970 --> 12:02.790] One, I knew nothing of live streaming. [12:03.010 --> 12:05.690] I knew what it was, but I didn't know anything about how to do it. [12:06.510 --> 12:08.710] Two, I had minimal streaming equipment. [12:08.870 --> 12:13.430] You know, I had a laptop, I had a webcam, things like that. [12:13.430 --> 12:21.050] But, I didn't really have streaming equipment, anything that you see in these kind of full-time Twitch music streams. [12:21.550 --> 12:22.790] I'm a maximalist. [12:22.870 --> 12:24.790] I like to use a lot of equipment on stage. [12:25.170 --> 12:33.710] And so, I wanted to see how I could put together a small streaming rig just to have more to work with. [12:34.450 --> 12:42.170] Three, I wanted to have some kind of collaboration between at least one of my students and myself during the concert. [12:42.170 --> 12:44.290] This was the hardest one of the challenges. [12:44.710 --> 12:46.590] And so, I'll get back to that in just a little bit. [12:48.690 --> 12:49.050] Solutions. [12:50.110 --> 12:57.170] Number one, I didn't know anything about live streaming, but my friend, Nick Revell, he's the violist of the public quartet, local string quartet here in New York. [12:58.910 --> 12:59.630] He did. [12:59.810 --> 13:02.510] And so, he put me in touch with some other streamers. [13:02.510 --> 13:15.950] And they educated me very rapidly on what I needed to know, software I needed to download, ways to control it live, ways to interact with the chat, and sort of general setup stuff. [13:16.310 --> 13:18.470] Number two, I had minimal streaming equipment. [13:18.730 --> 13:20.130] The solution was money. [13:21.810 --> 13:25.550] Fortunately, UMass Lowell had not cut off my professional development funds yet. [13:25.690 --> 13:28.370] And so, I was able to purchase some streaming equipment. [13:28.510 --> 13:39.370] I got a little ATEM mini switcher, black magic design, a couple of other extra webcams, stuff like that, so I could have some different camera angles, all that sort of stuff. [13:39.370 --> 13:47.250] And then three, the solution to the collaboration, not really the solution, but the student that I recruited to work with is Ryan Katz. [13:47.410 --> 13:52.470] There's a link to a really great write-up about him, a profile. [13:52.990 --> 13:59.490] He's been an amazing resource for the ensemble, and he has some great sort of live ideas. [13:59.630 --> 14:03.330] He's done some live streaming that is extraordinary as well up to this point. [14:04.910 --> 14:11.010] About three, what I decided to do with Ryan is have him control my camera streams. [14:11.270 --> 14:21.050] So, he stayed at his place, and I performed from my place, but he was able to control which camera angle was happening at any one time through a little web interface that I built. [14:21.350 --> 14:29.690] He was also able to control a little pan-tilt camera mount that I had in my basement, so he could actually move around and look at different things. [14:30.270 --> 14:33.950] And he also could control some visual effects and stuff like that. [14:34.370 --> 14:40.250] Anyway, the products of this streaming endeavor for the fall 2020 semester was the pan-tilt system. [14:40.810 --> 14:45.150] Again, I don't want to get into this too much, but you can read more about this here. [14:45.150 --> 14:54.630] It was built on a NodeMCU board, a MaxMSP control interface for the pan-tilt system, and the Blackmagic design ATEM Mini. [14:54.850 --> 14:57.630] So, MaxMSP was controlling both of these things simultaneously. [14:58.970 --> 15:02.810] This is all done with a protocol called MiroWeb that's part of MaxMSP. [15:03.530 --> 15:06.790] And he could just go to a website to control this stuff for me. [15:08.270 --> 15:12.670] For the... there's some links to some of the performances, so you can see what actually resulted. [15:12.870 --> 15:14.430] I was extremely happy with it. [15:15.150 --> 15:16.930] I'm doing... at 1 a.m. [15:17.370 --> 15:21.090] tonight, I'm doing unfiltered in 416. [15:22.530 --> 15:24.170] But there's a couple of links here. [15:24.170 --> 15:29.270] And then the contemporary electronic ensemble concerts, I required the students to do live performance. [15:29.430 --> 15:33.770] And so the products of that were a bunch of really, really terrific live performances. [15:34.110 --> 15:37.030] And two of the real big highlights for me were these two here. [15:37.630 --> 15:39.870] The piece called Night Run by Sean Levine. [15:40.370 --> 15:41.510] It's actually a video game. [15:41.510 --> 15:50.730] He coded a video game and wrote the music for it and played it live on Twitch for us so that we could experience the game. [15:51.090 --> 15:57.130] And it was part of the inspiration for building Minecraft into this curriculum. [15:58.550 --> 16:03.250] So I definitely owe him something for giving me these ideas. [16:03.530 --> 16:06.210] And then, of course, I featured a piece by Ryan. [16:06.430 --> 16:10.450] He did a live performance where he built a little drum machine and then deployed it live. [16:10.590 --> 16:14.530] So anyway, I thought I'd share a couple of those projects with you. [16:14.710 --> 16:17.310] Again, if you want to click through, by all means. [16:17.970 --> 16:18.850] Enter Minecraft. [16:20.950 --> 16:22.390] Minecraft is a popular game. [16:22.650 --> 16:24.030] A few people play it. [16:24.230 --> 16:26.350] It's relatively popular. [16:27.110 --> 16:28.790] My daughter was one of those people. [16:29.570 --> 16:32.790] And she was six at the time when we were doing this. [16:33.050 --> 16:39.230] And so at one point I saw her interacting with the game. [16:39.270 --> 16:43.950] And I realized, well, you know, when she makes interactions in the game, there's real-time sounds. [16:43.950 --> 16:49.270] And then she was playing Minecraft with a colleague of mine's son. [16:50.370 --> 16:52.910] They joined together with the education edition. [16:53.290 --> 16:55.690] And they were able to do things in real-time. [16:55.910 --> 17:03.010] And I thought, okay, well, one of the things that we lost with ensembles during COVID was real-time interaction. [17:03.230 --> 17:08.570] Everyone was recording their parts and emailing them to the next person who would record their parts. [17:08.650 --> 17:09.450] And it wasn't real-time. [17:09.690 --> 17:10.430] And it was really... [17:10.930 --> 17:13.270] It was a huge loss for ensembles. [17:13.270 --> 17:18.410] And so I had this idea that maybe Minecraft helps us get that back. [17:19.210 --> 17:19.770] Somehow. [17:20.050 --> 17:22.770] At least people are building these projects together. [17:23.250 --> 17:30.010] And then on top of that, there's all sorts of different mechanics in Minecraft that can be hacked. [17:30.250 --> 17:31.990] There's the whole redstone world. [17:32.090 --> 17:33.030] There's command blocks. [17:33.170 --> 17:34.150] There's structure blocks. [17:34.290 --> 17:38.330] There's mods and all sorts of things that you can add to the game. [17:38.330 --> 17:45.590] It's an incredibly expressive and complex piece of software. [17:46.410 --> 17:48.050] And so it was just... [17:48.050 --> 17:52.050] As an observer, I saw this game and I thought, well, it's a block game first. [17:52.370 --> 17:54.310] You know, when my daughter first started playing it. [17:54.650 --> 17:58.890] And then I came around and started to realize, wait a minute, there's something here. [17:58.890 --> 18:00.630] This is high tech. [18:00.950 --> 18:03.610] This is some powerful stuff. [18:04.070 --> 18:07.550] So that was my decision-making process. [18:07.910 --> 18:09.050] So then this is... [18:09.050 --> 18:11.830] I'm just gonna sort of go off the rails here. [18:11.950 --> 18:17.710] But what I decided for the spring semester was that I wanted to do another Twitch concert. [18:18.530 --> 18:21.470] But I wanted to perform all of my music in Minecraft. [18:22.330 --> 18:24.350] So that was the next step. [18:24.570 --> 18:25.930] How was I going to do that? [18:26.570 --> 18:30.910] So I came up with the concept. [18:31.230 --> 18:34.210] And then I came up with this kind of data flow system. [18:34.910 --> 18:36.950] So we scheduled for April 1st. [18:37.850 --> 18:39.510] This was... it wasn't a joke. [18:39.690 --> 18:40.570] It was a real thing that happened. [18:40.770 --> 18:43.150] But it was scheduled for April 1st, 2021. [18:44.310 --> 18:51.790] And what I wanted to be able to do is use the Twitch chat to control elements of my game. [18:52.750 --> 18:55.010] So maybe some basic control things. [18:55.370 --> 18:56.910] Maybe turn it on once in a while. [18:56.910 --> 19:00.910] So that people could actually feel like they're doing something in the chat. [19:01.030 --> 19:02.150] Get some actual interaction. [19:02.410 --> 19:05.530] And so what I did is I sort of devised this thing. [19:05.670 --> 19:07.030] And then I had to figure out how to do it. [19:07.170 --> 19:08.190] It took a long time. [19:08.330 --> 19:09.030] I'm not a programmer. [19:09.410 --> 19:12.390] But I decided I wanted to make this happen. [19:12.390 --> 19:14.390] And fortunately I did. [19:14.590 --> 19:23.550] So the Twitch chat is connected to Max4Live with a protocol that's called TwitchPlaysMaxMSP, I think. [19:23.610 --> 19:24.770] Or TwitchPlaysMax or something. [19:24.910 --> 19:28.390] Somebody wrote a nice Node.js script for this. [19:29.190 --> 19:32.090] So it's processing in Max4Live. [19:32.370 --> 19:34.150] Max4Live is, of course, talking to Ableton. [19:34.350 --> 19:37.510] Ableton is then doing all these other things, sending stuff to Max4Live. [19:37.510 --> 19:44.510] In order to control the game, I discovered that there were some real problems with keyboard emulation with Max4Live. [19:45.610 --> 19:55.450] And so what I ended up doing is just doing a real quick program for a TNC 3.2 MIDI in, HID controls out. [19:56.030 --> 19:57.450] It worked pretty well. [19:57.930 --> 19:59.270] It's rock solid. [19:59.810 --> 20:01.630] It hasn't failed me yet. [20:01.630 --> 20:06.030] And then, of course, Ableton Live is doing all the signal processing and stuff like that. [20:06.630 --> 20:08.910] And so that's hitting our ears. [20:09.230 --> 20:11.470] There's MIDI controlling the gameplay control. [20:11.630 --> 20:16.170] There's also envelope following that's controlling left and right movements and things like that. [20:17.070 --> 20:26.750] CliffXPro is a scripting language remote script for Ableton that is doing some of the hard, heavy lifting for the control. [20:26.750 --> 20:27.610] Stuff like that. [20:27.910 --> 20:31.490] And then, of course, I was doing things like video processing, which you can see down here. [20:31.930 --> 20:34.970] Anyway, this is the general flow of what I wanted to happen. [20:35.230 --> 20:38.590] And this is exactly what did happen with void loop. [20:41.850 --> 20:52.490] Before I show you the void loop things, I'll take a quick departure to a Twitch installation that I have running. [20:52.770 --> 20:54.450] Right now, it's running 24-7. [20:54.790 --> 20:58.530] It hasn't crashed yet in the last three or four days. [20:58.790 --> 21:01.790] It's moderately stable, if you ask me. [21:01.910 --> 21:07.110] But this uses kind of a similar setup except Ableton Live. [21:07.110 --> 21:10.030] It's using MaxMSP instead for all the signal processing. [21:10.590 --> 21:13.430] And it's using a MindFlare bot. [21:14.130 --> 21:19.950] Basically, a player bot that I can send commands to in order to do different things. [21:20.150 --> 21:21.790] And so, I have it loaded up here. [21:22.750 --> 21:29.430] I hope it doesn't crash while I'm trying to demonstrate it. [21:30.090 --> 21:31.050] Here it is. [21:37.320 --> 21:37.860] Let's see. [21:39.240 --> 21:40.240] Can I see the chat? [21:42.600 --> 21:44.720] I guess I can't see the chat while I go full screen. [21:44.840 --> 21:45.640] So, I'll just leave it like this. [21:46.500 --> 21:49.380] Anyway, so there's some sort of basic commands here. [21:49.560 --> 21:50.140] So, we can reset. [21:51.240 --> 21:52.460] There's always a little bit of lag. [21:52.660 --> 21:55.940] But here's the sort of default state of the installation. [21:56.740 --> 21:59.020] You can send sort of basic commands. [21:59.240 --> 22:06.340] So, if you want to fly up, you can type space for two seconds. [22:06.660 --> 22:11.020] It'll hold down the space bar for two seconds, which will make me fly up into the air. [22:11.020 --> 22:13.060] I can type right. [22:13.800 --> 22:16.240] And we can say right for two seconds. [22:16.500 --> 22:19.400] And then hit the W key for 10 seconds. [22:19.800 --> 22:24.740] And it'll turn right while moving forward. [22:25.740 --> 22:31.460] And so, there's some basic controls that you can use for this installation. [22:31.460 --> 22:37.800] But the idea behind this was that I wanted this to become a sort of ever-expanding collection of installations. [22:39.200 --> 22:40.880] Musical vignettes, if you will. [22:41.220 --> 22:43.300] And so, you can see some of the projects here. [22:43.860 --> 22:46.800] The first one was Solfeggio. [22:47.680 --> 22:51.780] This is a piece that I did not compose, but I put together the mechanics behind it. [22:52.480 --> 22:55.320] This is a piece by Arvo Pert called Solfeggio. [22:56.520 --> 23:00.640] And it's basically just a major scale in a quirky order. [23:01.280 --> 23:02.780] I think it happens... [23:02.780 --> 23:05.120] This major scale happens seven times. [23:05.120 --> 23:08.160] It's just one of the most beautiful pieces you'll ever hear. [23:08.560 --> 23:11.880] Maybe not my version, but his version of it. [23:12.400 --> 23:15.080] And the thunder really adds to the ambiance. [23:19.310 --> 23:21.710] There's a little bit of interactivity to this, as you can see. [23:21.830 --> 23:22.390] I can stop. [23:22.590 --> 23:23.470] I can walk backwards. [23:25.910 --> 23:27.790] I think I can add nausea. [23:38.830 --> 23:39.630] There we go. [23:46.260 --> 23:47.780] Ooh, now we got some snow. [23:48.020 --> 23:49.480] This worked out perfectly. [23:49.640 --> 23:50.460] The timing was great. [23:51.980 --> 23:52.920] Anyway, that's enough of that. [23:53.100 --> 23:56.680] If you want to experience the whole thing, then you can check out the installation on your own. [24:01.280 --> 24:09.140] One of the original... one of the void loop performances didn't quite work out to be an appropriate thing for stage performance. [24:09.140 --> 24:12.200] It was actually a piece of music that my daughter wrote. [24:12.820 --> 24:15.480] And we wanted to choreograph some dance moves to it. [24:15.560 --> 24:18.580] And so I'll share that one with you here. [24:18.760 --> 24:21.960] So she wrote the music, and then I figured out how to program the dance moves. [24:22.940 --> 24:24.680] This one's called Mind Minecraft. [24:24.900 --> 24:26.800] She was seven when she wrote the music. [24:31.200 --> 24:38.200] And there's not a ton of interaction here, but it's a piece of music that gets deployed in real time. [25:02.170 --> 25:04.210] And the dance moves are mostly randomized. [25:04.630 --> 25:06.250] There's a couple of things that happen consistently. [25:06.550 --> 25:12.170] So there's the sort of up and down movements of the head, and then the crouching and standing up. [25:12.350 --> 25:15.310] Those are specifically timed to match the beat. [25:37.110 --> 25:38.450] All right, and then... [25:39.890 --> 25:43.150] I don't know if... I don't think I'll go through all of these with you, but... [25:43.150 --> 25:44.530] Let's see, there we go. [25:46.210 --> 25:49.430] Probably the most work went into this one that's called Maze. [25:50.670 --> 25:57.530] And it is a 3D maze that people in the chat can actually solve if they really wanted to. [25:57.790 --> 25:59.410] It's super difficult. [26:00.210 --> 26:05.010] But basically, the way it works is there's music playing. [26:06.170 --> 26:12.590] And Max MSP is actually intercepting my coordinate data from the world. [26:12.790 --> 26:18.770] And so I'm able to control different parameters by moving closer to goals and things like that. [26:18.770 --> 26:22.450] And so I'll go ahead and walk forward here. [26:22.890 --> 26:25.310] And you'll probably hear a small change. [26:30.590 --> 26:34.870] So you can hear that a filter is being opened up here, just a low-pass filter. [26:36.170 --> 26:41.450] But it's trying to do this in front of an audience right now. [26:41.450 --> 26:43.530] I have so much pressure, I don't think I'm going to do very well. [26:54.200 --> 26:57.640] And I tried it out once to see how long it would take to solve the maze. [26:57.820 --> 27:01.220] It probably takes about five minutes, start to finish, if you're patient with it. [27:01.980 --> 27:04.840] That being said, I also know my way through the maze. [27:04.840 --> 27:08.140] So somebody who's trying it for the first time would probably take much longer. [27:08.560 --> 27:10.300] But it's basically that. [27:10.500 --> 27:17.240] It's a way for people to play a game, but also have something musical happen at the same time. [27:17.440 --> 27:19.820] So expressivity through gameplay. [27:19.820 --> 27:23.660] That's my sort of main charge in this case. [27:25.220 --> 27:26.340] Let's see... [27:30.050 --> 27:31.350] There's a couple more. [27:32.710 --> 27:37.350] One of the most basic ones is just a shuffle jukebox. [27:37.730 --> 27:41.370] So when you type shuffle, it'll play something for you. [27:41.510 --> 27:45.150] Oh, I can't play that one because I'm playing that tonight. [27:48.950 --> 27:53.150] So this will just play a random track from a jukebox that I put together. [27:54.910 --> 27:57.830] It doesn't do anything besides play the track. [27:58.510 --> 28:02.010] I have plans at some point to create a sort of dance option. [28:02.170 --> 28:07.710] So if somebody wanted the player to move automatically to the music, that'll happen. [28:07.850 --> 28:08.950] It just hasn't happened yet. [28:09.890 --> 28:13.330] It'll probably... a lot of the music I write is ambient or textural. [28:13.590 --> 28:21.570] So it's not going to be rhythmic dance moves, but maybe something where certain frequencies get louder, you move forward or up or down or whatever. [28:21.570 --> 28:25.030] But that's the general idea behind it. [28:26.230 --> 28:34.510] You can explore the entire world, but there's no clicking or right-clicking available. [28:34.850 --> 28:41.050] For good reason, because I don't want people in the chat to actually be able to build or tear things down. [28:41.050 --> 28:43.530] So that'll probably never be a thing. [28:45.250 --> 28:46.310] A couple of other ones. [28:46.450 --> 28:59.050] This was actually kind of a proof of concept thing, but I downloaded a whole bunch of sounds from NASA and just put them into this kind of ambient soundscape with a couple of spirals where the player is just kind of floating around in the world. [29:02.550 --> 29:04.250] And it'll start here in just a moment. [29:05.750 --> 29:09.930] There's a bit of interaction here, too, for stopping and starting, things like that. [29:10.150 --> 29:14.770] But it's a fairly basic interaction in this case. [29:18.580 --> 29:23.520] And as you see, as the character is kind of flying through, there are some command blocks. [29:23.600 --> 29:26.260] And the command blocks are basically just playing the sounds on repeat. [29:29.160 --> 29:40.540] So technically it would sound the same every single time, unless a chat user decided to stop or start it, and then it would sound a little bit different in that instance. [29:41.680 --> 29:45.140] And again, this one was more like a proof of concept, but I left it in because it worked. [29:45.340 --> 29:54.460] And then when I got to the bottom, again, the Max MSP patch is interpreting my coordinates, and so it reverses the direction and has me rise to the top. [29:57.120 --> 30:01.060] And one more, just because it was super fun to put together. [30:01.380 --> 30:03.100] This one's called the Series of Tubes. [30:04.820 --> 30:11.760] And it's... I replaced a whole bunch of game sounds with different kind of textural things. [30:12.400 --> 30:17.440] Some of the mob sounds are replaced with these kind of repeated rhythmic things. [30:18.060 --> 30:25.360] You can see the tubes here, and you can see some different NPCs just kind of dropping through the world in these tubes. [30:25.840 --> 30:30.160] There's a little bit of choreography at the beginning here, so I made a little loading screen. [30:36.960 --> 30:45.360] And then as you get down to the bottom, if anyone knows the game, what I ended up doing is I replaced the lava sounds with some of these synthetic sounds. [30:45.600 --> 30:48.280] I replaced the piglins and the piglin brute sounds. [30:49.700 --> 30:51.280] And I think that's pretty much it. [30:51.380 --> 30:52.640] So these are the sounds that you're hearing. [30:52.860 --> 30:58.260] And of course you can, you know, do our normal kind of spin moves. [30:59.580 --> 31:02.600] You can do, you know, half a second of moving the mouse up. [31:07.900 --> 31:13.180] And because the sounds are directional, you can actually, if you're using headphones, you can hear where these different things are happening. [31:13.780 --> 31:15.260] You can also fly up... [31:17.020 --> 31:18.580] Nope, that's not what I meant to do. [31:18.760 --> 31:20.560] You can fly up by using the spacebar. [31:22.880 --> 31:23.920] That was look up. [31:24.500 --> 31:27.480] Anyway, here it'll rise in just a moment. [31:31.850 --> 31:36.450] And so there's a handful of interactive controls for kind of experiencing the sound. [31:37.110 --> 31:41.350] Again, it's not designed to be a toe tapper or you're not supposed to dance to anything. [31:41.350 --> 31:43.970] It's really atmospheric, textural music. [31:51.580 --> 31:53.620] And I'll reset that. [31:54.480 --> 31:55.500] So the... [31:58.140 --> 32:05.000] A lot of these different control schemes were born out of this live performance that I put together, the void loop performance. [32:05.240 --> 32:08.030] I'll be doing a few of those pieces at 1am tonight. [32:09.640 --> 32:12.910] Not all of them, but just the last three of them. [32:12.910 --> 32:15.680] But I wanted to take things further. [32:15.840 --> 32:19.040] I wanted this to sort of grow into a longer-term project. [32:19.890 --> 32:30.180] Incidentally, I am on the lookout for collaborators, for people who want to contribute music or ideas to this. [32:30.320 --> 32:38.540] And so if anyone has some ideas or wants to just simply feature a track of yours, I can easily add tracks to the jukebox, things like that. [32:38.540 --> 32:43.930] Or we could talk about developing some kind of actual custom project. [32:44.620 --> 32:48.600] So this is meant to be a long-term kind of permanent installation. [32:49.300 --> 32:51.500] It's been running three days without a problem. [32:51.500 --> 32:54.300] So I'm hoping it continues to. [32:54.760 --> 33:04.020] I figured since we're at a Hackers conference, we should maybe take a look at some of the code, the scripts and stuff like that. [33:04.020 --> 33:13.020] So the first one, I've got to scroll down real quick before I make my authorization codes available. [33:13.450 --> 33:14.500] This is the... [33:14.500 --> 33:21.500] Again, I'm not a programmer, so please be gentle with criticisms on my script here. [33:21.500 --> 33:30.160] But this is a combination MindFlare and Node.js Twitch chat relay kind of thing. [33:30.800 --> 33:39.980] It uses my port number on the local host, so this is a computer running in my basement currently, to create a bot that I call BotBot. [33:39.980 --> 33:41.860] And then there's a... [33:42.740 --> 33:51.000] The Twitch Plays Max has this nice Max API handler, where you can have it recognize different messages and spit out different things. [33:51.000 --> 33:55.960] And so I can make the bot go into spectator mode, which is why the bot's invisible. [33:56.040 --> 33:56.720] You can't see it. [33:56.950 --> 34:02.910] It can teleport me to different places, or it can teleport to me and stuff like that. [34:02.910 --> 34:13.320] It can also send chat... bot chat commands, and so that's how I was able to do things like the nausea, basically giving me an effect and things like that. [34:13.460 --> 34:16.200] So that's one of the sort of underlying things here. [34:16.480 --> 34:19.480] There's also a number of... [34:21.480 --> 34:24.180] These are the handlers for all the different tracks. [34:24.180 --> 34:33.450] So in the jukebox, it basically will post something to the Twitch chat that tells you what the track is, who's playing on it, and all that sort of good stuff. [34:35.200 --> 34:40.740] Then I think there's probably something else worth talking about here, but that's most of what this script is doing. [34:40.860 --> 34:44.240] And it's being handled inside Max MSP. [34:45.680 --> 34:47.460] I'll show you the patch. [34:47.930 --> 34:50.410] Often I append little fixes to it. [34:53.840 --> 34:55.520] It looks a little bit like this. [34:56.780 --> 34:58.460] And I've tried to keep it organized. [34:58.600 --> 34:59.580] I'm doing an okay job. [35:00.380 --> 35:05.940] It's not running on this computer, but these three green boxes are where we would get the coordinates, the X, Y, Z, in the world. [35:06.940 --> 35:18.920] Theoretically, I can also get rotation information and other such things, other kind of world information things, but currently I'm only using the X, Y, Z for some of the projects. [35:19.100 --> 35:20.160] It's mostly working. [35:20.160 --> 35:24.100] It's a little bit clunky at times, but it does, in fact, get the job done. [35:24.320 --> 35:40.560] And so a lot of the times what I have to do is give it a little bit of fuzzy logic, get kind of close to values to do certain things, just so that I can actually trigger things at the right time. [35:41.620 --> 35:58.580] I'm running an instance of black hole, so the sound is going through black hole intercepted into the patch, and then being spit out through another, it doesn't say here, but another instance of black hole, which is then going to OBS, which is streaming 24-7. [35:58.580 --> 36:04.960] There's nothing super, super special here, except for maybe the move elements. [36:05.320 --> 36:16.640] Again, this is a TNC 3.2, and it's using MIDI CC values to control the different keyword commands and mouse commands and things like that. [36:17.420 --> 36:20.780] OBS is being controlled a couple different ways, one just through MIDI. [36:22.920 --> 36:33.040] Different scenes are being triggered with MIDI, but it's also using OSC, because MIDI proved to be unreliable for starting and stopping the stream. [36:33.040 --> 36:38.460] So you can see somewhere over here, UDP send. [36:38.540 --> 36:41.560] This is sending all the OSC messages to OBS. [36:43.960 --> 36:45.400] I don't want to get stuck on this. [36:45.600 --> 36:51.180] I want to move on to just some in-world things to talk about at the end of this. [36:51.360 --> 36:53.620] But this is basically the patch itself. [36:54.800 --> 36:59.740] I'm trying to create a different module for each of these different projects. [37:01.360 --> 37:04.640] There's probably a better way of doing it, but it's piecemeal. [37:04.880 --> 37:13.680] A new project happens, so I go and I retrofit everything to sort of work with the new project and then use some different handlers. [37:14.780 --> 37:23.400] I have a thing called message handler, which intercepts all the Twitch chat and then just formats it into a new thing that's a little bit easier for me to work with within Max. [37:23.940 --> 37:27.480] So that is that. [37:28.480 --> 37:32.940] So that's kind of the big development. [37:33.180 --> 37:35.240] That's one of the things I'm continually working on. [37:35.460 --> 37:43.720] But let's take a step back and we'll go into an actual Minecraft world here for a little bit. [37:46.000 --> 37:53.540] So this was the performance I did for you at the beginning of the session here. [37:53.740 --> 37:55.420] This is called Fi's Farewell. [37:55.920 --> 37:57.620] And it's... [37:59.220 --> 38:04.360] First of all, I've got to get rid of the birds because they're in the way. [38:06.620 --> 38:07.420] So apologies. [38:12.050 --> 38:13.010] I'm so sorry. [38:13.150 --> 38:18.310] I didn't mean for this to become so violent, but it had to happen. [38:18.310 --> 38:19.790] Otherwise, they're going to follow me the whole time. [38:19.790 --> 38:21.970] So here's... [38:24.630 --> 38:26.830] The building I work in is called Durgin Hall. [38:27.210 --> 38:34.090] And I decided kind of early on that I should build Durgin Hall. [38:34.770 --> 38:40.770] And it's a brutalist building made of lots of concrete and it's the weirdest shape thing you've ever seen. [38:40.950 --> 38:44.950] But if you ever want to take a look at UMass Lowell's Durgin Hall, it looks very similar to this. [38:45.470 --> 38:48.170] I built it so that we could build some things on the stage. [38:48.470 --> 38:56.330] And in fact, some of the first performances of these Minecraft projects took place on the stage of Durgin Hall. [38:56.650 --> 38:57.990] The virtual Durgin Hall. [38:59.190 --> 39:02.970] Originally, the idea was that I was going to make it just kind of a jumping off point. [39:03.070 --> 39:04.230] And so I used command blocks. [39:04.970 --> 39:05.410] These... [39:05.410 --> 39:10.890] I designed these command block skins myself just because I didn't like the regular ones. [39:10.890 --> 39:16.130] But they were just ways to teleport to these different projects and things like that. [39:16.510 --> 39:21.630] And then I discovered a mod that's called Waystones, which allows you to save these different places. [39:21.950 --> 39:25.370] And so this was a way... [39:25.370 --> 39:28.110] This is our UMass Lowell Music server. [39:29.090 --> 39:36.690] And I encourage creative-only projects on this for all of my students who want to do Minecraft projects in the ensemble. [39:37.470 --> 39:40.970] But also anyone in the department who wants to work on it. [39:41.070 --> 39:45.070] And so we've had a little bit of sort of extracurricular stuff happening here. [39:49.690 --> 39:51.770] Let's see if I can find it here. [39:52.010 --> 39:54.610] So this started with this right here. [39:54.670 --> 39:55.690] This is really haphazard. [39:55.830 --> 39:59.370] But what I tried to do is make it kind of educational for the students. [39:59.550 --> 40:03.490] Give them some options for how to make different sounds in the game. [40:03.730 --> 40:06.890] How to manipulate those game mechanics into something expressive. [40:06.890 --> 40:09.150] And so the easiest thing is note blocks. [40:09.370 --> 40:10.650] You see all these note block projects. [40:10.870 --> 40:13.290] So I tried to sort of lay them out here for everyone. [40:13.590 --> 40:15.390] And then the next... [40:15.810 --> 40:17.070] I don't want that to be too loud. [40:17.210 --> 40:18.550] But the next big thing is timing. [40:18.830 --> 40:20.390] How do you do timing in the game? [40:20.550 --> 40:24.730] And those of you who are familiar with Redstone know that there's easy ways to create clocks. [40:25.110 --> 40:28.110] And so I just started building a bunch of clocks just to demonstrate them. [40:28.270 --> 40:31.250] I tried to do some that weren't really out in the world. [40:31.250 --> 40:33.130] So these kind of sand timers. [40:33.550 --> 40:35.230] Falling sand and things like that. [40:36.030 --> 40:37.950] That actually turned into some other things. [40:38.470 --> 40:43.870] But this is kind of the beginnings of some ideas for different projects. [40:44.070 --> 40:46.850] Then of course you can do minecart clocks. [40:50.080 --> 40:51.840] It's not the most expressive tune. [40:52.020 --> 40:57.220] But it's a tune and you can always tweak this to something that works a little bit better. [40:59.320 --> 41:04.780] And so I linked to a piece earlier by Sean Levine. [41:05.260 --> 41:07.420] He actually created... [41:07.420 --> 41:11.480] So he wrote this video game called Night Run. [41:11.760 --> 41:18.500] But he also created one of the first really, really impressive machines inside the server. [41:18.700 --> 41:21.000] And so this is called Groovecraft. [41:21.040 --> 41:22.420] And it's a drum machine. [41:25.470 --> 41:28.170] And these are switches for different drums sounds. [41:28.610 --> 41:29.490] Sorry, this is the bass sounds. [41:35.260 --> 41:37.060] So you can change the rhythms. [41:42.290 --> 41:43.790] And so on and so forth. [41:43.850 --> 41:47.530] And so he created it as a two-player experience. [41:48.030 --> 41:52.290] It was a way for two people to kind of interact and create music. [41:52.430 --> 41:54.290] Improvise around some different parameters. [41:54.550 --> 41:56.230] And create something on the fly. [41:56.490 --> 42:00.830] And so it was really kind of the first test of real-time interactivity. [42:00.830 --> 42:03.170] Inside the game for the ensemble. [42:03.850 --> 42:08.110] So I really, really felt compelled to share this with you. [42:08.230 --> 42:11.850] It is a complex beast here in the back. [42:12.370 --> 42:16.850] Sean is now working for a boys and girls club in the Boston area. [42:17.650 --> 42:23.610] And he managed to get a really nice grant for Minecraft music projects. [42:23.750 --> 42:26.210] And so he's doing some of the same things that I'm doing now. [42:26.490 --> 42:29.110] So really, really sort of proud of the work that he's doing. [42:30.490 --> 42:35.850] So that's one of the first big projects, the big permanent projects. [42:35.990 --> 42:36.770] There were, of course, some others. [42:37.390 --> 42:40.390] But a lot of those were designed to be just kind of one-time performances. [42:40.870 --> 42:42.510] They were really hard to recreate. [42:42.530 --> 42:45.910] And they weren't something that I could really demonstrate here. [42:49.190 --> 42:49.890] Let's see. [42:51.990 --> 42:59.110] This is the latest and greatest of our mods here. [42:59.230 --> 43:01.210] And so this server is running the create mod. [43:02.270 --> 43:03.470] Some of you may have seen it. [43:03.550 --> 43:07.050] But you can create all these great mechanical machines and things like that. [43:07.050 --> 43:10.290] And so I didn't know anything about the create mods. [43:10.430 --> 43:13.030] So I decided, let's get in there and let's build some stuff. [43:13.350 --> 43:15.290] And see how it works. [43:15.490 --> 43:17.230] And so this one's a parrot sequencer. [43:18.150 --> 43:19.850] Where you can see them just teleporting. [43:20.810 --> 43:23.450] It's not the most musical thing, but it's a nice proof of concept. [43:28.330 --> 43:33.030] And so that was one of the mechanics that you saw in the Fi's Farewell performance earlier. [43:34.050 --> 43:35.930] Over here was another one. [43:36.230 --> 43:40.650] There's a mooshroom that's just being kind of hurled around in the world on these different ejector plates. [43:41.410 --> 43:45.850] And each time it hits, there's a sound. [43:47.690 --> 43:48.850] So that's fun, I guess. [43:49.150 --> 43:50.190] If you like mooshrooms. [43:53.230 --> 44:00.250] And then here's a spinning sequencer using some of these different mechanical bearings and things like that. [44:00.630 --> 44:03.030] It plays Steve Reich's piano phase. [44:03.270 --> 44:04.810] One of them is slightly faster than the other. [44:05.010 --> 44:07.150] I thought it was a nice way to test the system. [44:16.680 --> 44:17.340] It's alright. [44:18.260 --> 44:19.840] There's better things to do with it. [44:19.940 --> 44:22.300] But it was a way to sort of test things out. [44:26.520 --> 44:28.600] One more stop here. [44:28.600 --> 44:36.780] I think visuals, I think, are also kind of an important element to this. [44:37.560 --> 44:43.460] And so you saw in that performance that there were these animations of The Legend of Zelda, the original NES sprites. [44:44.200 --> 44:47.800] And so this is how I did it. [44:47.960 --> 44:52.820] So these are being animated by basically just replacing blocks. [44:53.000 --> 44:55.240] And so you can see my animation frames up here. [44:55.900 --> 44:57.820] They're all sort of in a row. [44:58.580 --> 45:02.680] And I'm just basically replacing different parts of the world with that. [45:02.900 --> 45:05.860] And so those are triggered in time and things like that. [45:06.040 --> 45:11.260] And so, again, this was really about creating a series of timing elements and things like that. [45:14.120 --> 45:20.540] So hopefully that gives you kind of a sense of some of these different elements that I've put together. [45:21.080 --> 45:25.940] One last little thing, and then I'll open it up for questions, is the... [45:26.660 --> 45:28.720] Let's see, I've got a little demo project here. [45:44.460 --> 45:46.700] I just need to make a quick little five minutes. [45:47.280 --> 45:47.500] Thank you. [45:52.470 --> 45:55.550] I don't want to give away too much because I'm performing this tonight. [45:55.850 --> 45:59.310] But this is... hopefully I got this all set up here. [45:59.570 --> 46:05.530] This is one of the Ableton Live sets that I use to process some of this stuff. [46:06.370 --> 46:11.810] If you've never heard of Clifx Pro, it's no longer being made, I don't think. [46:11.810 --> 46:14.270] I don't think there's any plans to update it, so it's really sad. [46:14.470 --> 46:17.730] But it is absolutely the most powerful scripting tool for Ableton Live. [46:18.430 --> 46:23.130] You can do all sorts of things with it, but it's got all sorts of commands in here that sort of control it. [46:24.650 --> 46:27.090] And basically what happens here... [46:27.090 --> 46:31.230] Let's see if I can find a good sound for you. [46:35.610 --> 46:36.890] Oh, I know where some sounds are. [46:41.040 --> 46:43.980] So what I did is I replaced a whole bunch of game sounds. [46:49.870 --> 46:52.490] And as you can see, the audio is routed through Ableton. [46:52.730 --> 46:56.010] And so that opens up a whole world of audio processing. [46:57.430 --> 47:01.390] Anything you can do in Ableton, you can apply to Minecraft in this case. [47:01.570 --> 47:05.170] And so this portion of the performance is... [47:06.630 --> 47:10.890] A lot of it is me controlling Ableton with a foot controller while I'm playing the game. [47:10.890 --> 47:11.870] Things like that. [47:12.410 --> 47:17.290] And so there's different things that happen at different moments based on my actual physical interactions. [47:17.910 --> 47:20.410] In some cases, they're kind of randomly happening. [47:21.150 --> 47:22.790] And there's... [47:22.790 --> 47:27.410] What I'll be doing tonight at 1am are three of the pieces from this. [47:27.550 --> 47:29.190] So I'll be doing a piece that's called... [47:29.190 --> 47:31.490] It's a long name, Pink Bats or something like it. [47:32.570 --> 47:35.190] Chicken Hero, Villager Hero, Cow Hero. [47:35.190 --> 47:39.630] And a piece by Alessandro Cortini called Everything Ends Here. [47:39.870 --> 47:43.490] So those three tunes are part of the void loop performance. [47:44.990 --> 47:48.990] They're currently the best of my performances, I think. [47:49.450 --> 47:55.170] And they're very deeply integrated into this sort of Ableton Live scripted environment. [47:56.670 --> 48:00.070] I would love to talk endlessly about this. [48:00.290 --> 48:05.110] But I would like to at least ask for questions at this point. [48:05.450 --> 48:06.950] Does anyone have any questions? [48:13.320 --> 48:13.960] Crickets? [48:17.820 --> 48:21.780] The scripting of Live is Cliff X Pro? [48:22.060 --> 48:23.400] Cliff X Pro, yes. [48:23.740 --> 48:30.740] But can you not use the Live API and access it through scripting in Macs and do whatever you want? [48:30.740 --> 48:31.180] You could. [48:31.720 --> 48:34.380] And Cliff X Pro is not compatible with Live 11. [48:34.620 --> 48:36.280] It's only compatible with Live 10. [48:36.480 --> 48:41.060] And so I've been spending a lot of time trying to do exactly that. [48:41.420 --> 48:46.560] Do some of these things that I do normally with Cliff X as Macs for Live patches. [48:46.560 --> 48:48.020] It's super daunting though. [48:48.240 --> 48:48.580] I don't know how... [48:48.580 --> 48:49.040] Oh, really? [48:49.240 --> 48:52.980] I don't know how they manage to do it, but Cliff X Pro is really elegant. [48:53.400 --> 48:56.820] It can do hundreds of operations all at the same time. [48:57.560 --> 48:57.900] Oh, wow. [48:57.900 --> 49:02.620] And Macs for Live, technically you could do hundreds of operations, but you have to program every single one. [49:03.240 --> 49:03.720] Okay. [49:04.380 --> 49:04.540] Yeah. [49:05.220 --> 49:05.560] Hmm. [49:05.900 --> 49:12.740] You can still get Cliff X regular, it's free, for Ableton Live 11. [49:12.740 --> 49:17.860] It's been updated for that, but it's missing a lot of the power of Cliff X Pro. [49:17.860 --> 49:18.580] So... [49:18.580 --> 49:22.740] But the Cliff X Free is also being discontinued? [49:22.940 --> 49:23.460] Won't be supported? [49:23.480 --> 49:24.700] Well, no, it's open source. [49:25.340 --> 49:25.600] So... [49:25.600 --> 49:26.620] Okay, so... [49:26.620 --> 49:26.640] Yeah. [49:26.640 --> 49:30.520] Cliff X regular, just called Cliff X, is open source. [49:31.480 --> 49:34.880] I believe it's maintained pretty well. [49:35.320 --> 49:35.520] Wow. [49:35.760 --> 49:37.080] Bug fixes and things like that. [49:37.380 --> 49:45.660] But the problem is Cliff X Pro is commercial software, and so it can't be retrofitted to open source software. [49:46.660 --> 49:46.740] Yeah. [49:47.580 --> 49:48.600] Okay, thanks. [49:48.860 --> 49:48.980] Yeah. [49:52.260 --> 49:52.800] Hi. [49:53.220 --> 49:58.940] So, excluding the in-game Minecraft sounds, does Minecraft have a sound? [49:59.320 --> 50:04.620] Like, if... would you be able to tell that someone was sequencing sounds through Minecraft? [50:04.900 --> 50:07.480] Like, are there any, like, distinct, you know, qualities? [50:07.480 --> 50:08.300] Probably. [50:08.460 --> 50:09.220] At least I've been told that. [50:09.440 --> 50:15.180] So, like, one of the pieces, chicken hero, villager hero, cow hero, people recognize the game sounds right away. [50:15.340 --> 50:19.360] You hear the Minecraft chickens and the villager sounds, and it's really distinctive. [50:19.960 --> 50:23.980] A lot of what I'd encourage my students to do, it's really easy to replace game sounds. [50:24.340 --> 50:25.280] Super, super easy. [50:25.740 --> 50:29.040] And so, it's basically like a really interesting sampler. [50:30.120 --> 50:30.560] Yeah. [50:31.580 --> 50:32.000] Thank you. [50:32.240 --> 50:32.480] Sure. [50:34.220 --> 50:36.600] I think we're almost out of time, so it'll have to be the last question. [50:36.600 --> 50:37.620] Yeah. [50:38.060 --> 50:43.240] Besides the Twitch integration, how hard would it be to port the max aspect to pure data? [50:43.460 --> 50:44.580] I'm sorry, I didn't hear the first part. [50:44.940 --> 50:51.460] Besides the Twitch integration, how hard would it be to port your max patches to pure data? [50:51.700 --> 50:52.240] Pure data. [50:53.640 --> 50:56.280] I don't know PD all that well. [50:56.580 --> 51:02.000] I don't think it would be super, super difficult, because it's all just... [51:02.000 --> 51:16.060] I mean, it's mostly vanilla objects, and then if there's a way to install a Node.js script into PD, then it should be the same basic idea. [51:16.380 --> 51:16.860] Okay. [51:17.100 --> 51:17.380] Cool. [51:17.380 --> 51:17.540] Thank you. [51:19.400 --> 51:19.960] All right. [51:20.180 --> 51:20.680] Thanks so much. [51:20.680 --> 51:20.840] Thank you very much.