 Hey look, here we are. It's time again for John Park's workshop and that's me, I'm John Park. Thank you for stopping by today. I am excited for today's show. We got some cool stuff to show off and play around with. And let's see, I'm just bringing up some graphics there that disappeared somehow. I wanna thank people for stopping by over in the chat. We've got Dave and Anthony hanging out over in YouTube chat and then a bunch of people over in our Discord and hey, Rich, sad, nice to see you. Meep, meep. Dr. Andy Callaway, Mr. Certainly, Jim Hendrickson. And the list goes on, but my Discord is scrolling very slowly so I can't probably see everyone that's stopping by to say hi. You may notice that I've got my green screen up because I've been doing some filming for our upcoming Adabox. So that's easier to keep up than not, but I do have some fun with that sometimes. Let's see, we are looking good for audio. Thanks, Sea Grover. We're at negative 6 dB. And I'm gonna drink some delicious iced tea. Lars is on a pike. He's back there actually on a tripod or on a camera stand because I was using him for pulling focus when I'm over at the camera. And I want to focus on me over there. I stick him or Woody up on a pole and focus in. Makes it a little easier. Hello, Ferro Perro. Nice to see you. So let's see. Yeah, that is something that's exciting indeed. We have our next Adabox coming right up. Adabox 20 Unboxing is going to be next week, next Wednesday. That's October 27th. We have confirmed. I know we have some, as you can imagine, shipping concerns, global supply chain things. So it will probably be a longer period of time that we're shipping them than usual, so you may not necessarily get it before the unboxing. I'm sorry to say, but you can choose to not watch it if you want to wait for the surprise. Or you can watch it and then have some anticipation for your own Adabox coming in the mail. If you're not a subscriber currently, then go ahead and subscribe for Adabox 21. That'll be coming out in the winter, we'll say. Probably December, January timeframe. Depending on, again, the global supply frame issues that we encounter. Let's see, what else have we got? I'll mention our job board. We have over at jobs.adafruit.com. If you head on over there, you can take a look at a bunch of job openings that are available, including a whole bunch here from Light Pong over in Chicago, Illinois. They have a bunch of contract positions for software, security engineer, QA, gameplay programmer, firmware developer. What I know about Light Pong is that they call it a one-dimensional Pong, but it's, I think, I'm guessing it's a light strip type of thing, but I don't know, so I should check that out before next time. In fact, if we click on one of these here, you can learn a little bit more about it. Light Pong is the world's first one-dimensional game console, the most epic new addition to your Saturday night that you don't even know you needed, play solo or challenge a friend to one of many games, pick it up and play, whether you're six or 106, light up the room with awesome lighting effects. Cool, all right, I'm gonna go check that out after the show, I wanna see what they're up to. So those are just some of the positions that are up on the jobs.adafruit.com site, so go check those out if you're looking for work or if you wanna put your resume up, or if you're looking to hire someone, you can submit a posting there. That's jobs.adafruit.com. All right, let's see, next thing to mention is the product pick of the week. So I have a show on Tuesdays and I usually spend about 20 minutes going over a product pick, either something new or an old favorite, in this case, it was somewhat new to me. I'd only used this once before and only in a very minimal way, so it was exciting to get around to playing with this in more depth. It is the DRV20, I think it's, I think I've got the number wrong there again, 2605, not 2506, 2605, here's a one minute recap where I maybe say the name correctly, let's have a look. It is the haptic motor controller board. So I've got the DRV 2605L connected over I squared C to my QDPI, it's being sent commands to run different waveforms when I press the different buttons. There my little motor, I've actually stuck it with some blue tack onto a piezo pickup so that I can amplify it so you can hear it. Different click. Check out this one, this one's really cool, this is a ramp down. And here's the ramp up. There's a triple click. There's just a big buzz. All of the different things that you do on your device, be it capacitive touch, be it real buttons, be it some sort of controller like this, you can have the user feel them, which is really cool. So that's the product pick of the week this week. It is the DRV 2605L, it is a haptic motor controller. Yeah, and one thing I didn't mention, besides there's way too many of me up there right now, is that the product pick of the week is usually on a deep discount. So again, this week we had it for 50% off, so it's a good time to tune in and see what's gonna be the product pick and maybe grab some and throw them in your cart and get them super cheap. All right, what is after that? I think it's a good time to do our circuit Python parsec. So let me get some stuff set up for that and then we'll dive right in. Here we go. Yes, circuit guy. Hey, how about now? Now I think it might be working again. Okay, good. Let's try that again. From the top, you ready? I'm ready. Let me know. I think that fixed it. I was clicked off of the audio source. Thanks for the alert, Dave Odessa, over in the YouTube chat and I see people were trying to tell me the same thing over in the Discord, so thank you. All right, so let's, I'm just speaking in haptics. I was just here buzzing and clicking. You probably couldn't feel it. All right, here we go. Let's circuit Python. For the circuit Python parsec today, I wanted to show how we can create a random delay using the random library. So you can see here, I have some blinking neopixels on a circuit playground, blue fruit, and they are blinking and then pausing some random amount of time between the third of a second and up to five seconds. So this is a really nice thing to do for, let's say, a Halloween effect or another holiday effect or a prop where you wanna have something that blinks occasionally, but it doesn't feel like it's on a regular. So here's how we do it. In circuit Python, I'm importing the time library, board to get pin definitions, the random library and neopixel. I'm setting up my neopixels and creating a variable for the red and the off or black colors that I can use. And then in my main loop, here's what I do. I fill the pixels red, I pause for just a tenth of a second, so that's how long I'm blinking on and then I turn it back off. So the blink is regular. This is where we use random. I have a variable called pause time, which equals random.uniform. And then in parentheses, I say we can go a minimum of one third of a second and a maximum of five seconds. Then I print that to the serial port so we can see it while we're debugging and I pause the program. So I have this time, sleep, pause time, whatever the random is that time and it's gonna change every loop of the program. And so that's what gives us this really nice random effect where you see these lights blinking, they're not on a regular timer, you're not gonna know exactly when they're gonna happen. Here you can see I've turned on the serial output so we know, okay, we're gonna get a three second pause, next one also about three seconds. Now we get almost five seconds. So as each iteration of the program runs through, that pause time is gonna change because of random.uniform. Now what is random.uniform? There are a bunch of different ways you can use random. You can get integers with rand int, you can get random.random which gives you a zero to one or you can use this one, uniform, which is essentially a float value, a linear float value anywhere from your minimum that you type in to your maximum that you type in. And so that is how you can create a random blinking effect using the random library inside of circuit python. And that is your circuit python parsec. And my apologies, I probably should have said there would be a blinking lights, a little blinking lights warning, using the diffuser at least calms it down a bit, but I'm gonna actually unplug this now because that is a very blinky, blinky light. All right, and thanks again for the heads up over in the YouTube chat. I saw that one, I didn't see my discord because it was kind of buried under some other windows. Let's see, what else is going on? Oh, here's a question. A user says, I wonder how JP picks the parsec topics. So that's an excellent question. Some of them I've just outlined. Early on when I started doing it, I wrote down a bunch of ideas of things that I thought would be interesting, fundamental topics. Then I started talking to Todd Bot, our good friend Todd Kurt, who had started to create a tips and tricks page on his GitHub of some intermediate, some fundamental, some intermediate, some advanced tips. So I've shown a bunch of those on here. And some of them just occur as I'm doing Circuit Python through the week creating projects and demos and other things. I'll pick something out and say, hey, that'll make a nice discreet little segment. I think I've done stuff with random before, but not a dedicated thing. So hopefully that's interesting and useful to people. So let's see, what else have we got going on? I'm just checking my, yeah, boy, my Discord has really slowed down. I can't scroll it very easily and I don't know why. There's major battles between, I think, software and my Intel processor on this machine and the operating system. Very sad, yeah. I think I'm gonna actually grab my, where did I put it? I have an iPad in here somewhere. I just snuck it over to the side while I was filming. Where'd you go, little iPad? I've lost an iPad in here somewhere. Maybe I brought it inside. Must have. So, yeah, apologies if you are saying things to me in the Discord chat, because my Discord seems to have frozen. In fact, I will see if I can force quit it and relaunch it. See if that works. Otherwise, hop over into the YouTube chat because I'm not seeing the Discord chat. All right, I'm gonna force quit you, Discord, to can play at that game, computers. All right, let me relaunch this. Thanks for hanging out for a second while I do this. Little maintenance, checking for updates, starting. That's a good sign. And then Discord launches and comes to a screeching halt. Is it time for me to get a M1-based machine? Is that what the universe is telling me? I'm ticked off about that because this is a really powerful iMac. Let's see, Discord. All right, I see things again. Let's see, to remap it, there it is. Yeah, I wouldn't be surprised to see that's funny. That's not what I'm seeing in my real view here. It is just not updating. Okay, I'll hide that because that's confusing. I am seeing it again. All right, so by the way, hey, it's Steve. Nice to see you. Okay, you're on. I know you had something to go and do, so I'm happy to see that you're here. So next thing I wanted to do is actually a sort of a gear review product thingy, not a native fruit thing. And in fact, you can see it in action. It's kind of hidden out of the way over here. I'm gonna pull one of these bungees off of my green screen. I'm using this sort of stretched fleece green screen right here, and I'm getting a tip from Todd, says maybe using Discord inside of the browser instead of as the standalone electron app. Okay, that's a good one, I'll try that next time. So let me head on over to the workbench here. Let's throw a bench view into place there as well. And I'm gonna grab this bungee cord off of my green screen. So the green screen I'm using has some grommets built into it so you can stretch it nice and taut, which will keep you from getting shadows from wrinkles and hotspots as well as just seeing it sort of fluttering around which you may or may not see right now. Oh, and I can do something. Yeah, I won't do that. So this is this bungee here. Let's see if my camera switcher will switch this around. There we go, oh good, I'm knocked out over that background, that's fun. So I can put it right there around my head. So this is a little sort of very specific length of bungee cord, which is what I needed and kind of a medium duty, not a super strong one, just a medium duty bungee. And I made that, I made that exact size for my needs using this, this is a Planet Paracord and I'm sure there's other people who sell it but this is where I got mine, Planet Paracord. You can imagine they sell a lot of Paracord but they also sell this elastic core nylon covered shock cord, it's often called rather than bungee shock cord and they sell it I think in a few different diameters and then they sell the matching hardware that you need to make your own custom lengths of it. So all you do is cut to the length that you want and then you slip a little collar, these little collars go around and you make sure you put those on first. I can't remember, I think they can go on either way. So you slip on a collar and then you put on a bungee and then you get that to squeeze shut which can require quite a bit of force using some pliers, some channel locks is kind of helpful. You might be able to do that with a press or put it sideways in a vise and squeeze it but once you've got that collar up around it has pinched tight enough to hold quite well. I don't know what they're rating that for but it is enough for some pretty decent grip. I've never had one fail on me. I've also used these to make some tie downs for the bicycle carrier on the back of the bicycle to strap things to it. So I got fed up of not having the right length and size of bungee cords so I think this is a really neat way to do it. This one is a elastic bungee 10XPAR316SC in gold and then these are the hardware that go with it and I think they might have some different hardware. So that's my sort of gear report for this week. Go check it out if you're interested in bungee. It comes in a bazillion colors too if I'm not mistaken which is sort of a hallmark of the whole paracord community there. So go make yourself some bungees. I'm gonna put this one back on here so this green screen stops flapping around. Voila and we're back over here. All right, Yanisuku says soon I need to make some grapple for Lars like some grappling hooks or maybe some lashing tie downs, probably right. I think by the way I got that recommendation for that particular brand from a newsletter called The Prepared which is a cool sort of manufacturing newsletter, email newsletter that I think I get once a week and they usually have a gear report product recommendation in there. Let's see, we're good? Yeah, I think we're good. So now let's get to a kind of a fun project thing and this has to do with the LED glasses, Adafruit LED glasses and a guide that just got updated with some new code by our very own favorite dragon, Phil B. So let me bring up that guide first of all. So this guide here is the Adafruit I lights LED glasses and driver guide that Katni created and if you look in the projects section for circuit Python I lights starter projects, you will see the last one on here is called BMP animation and this is one of my favorite ways to deal with animation on our different LED, NeoPixel, Matrix type of devices are there's a few different examples that Phil B has created over the years of allowing you to use a raster graphic, a bitmap graphic not only to choose the colors of individual pixels but to animate them over time. And so I think the first one I remember using was for circuit playground classic. It was an Arduino program and it allowed you to animate the ring of lights using a horizontal wide image to represent time horizontally and the pixel color vertically. And so Phil has done it again and this one uses a pair of bitmaps to animate the rings on one bitmap and the matrix in the middle in the other. So this explains it pretty well and I'm gonna go and show you inside of some software some hands-on examples so you can see how this works. The matrix layout you can see here shows frame one as this little rectangle here at the top before you see that word time and then frame two is essentially the same drawing that's been moved over sideways. So this is a nice example of create a drawing and then translate it sideways and you can create the animation of this moving sideways. Each frame of animation is held vertically for the matrix. So I can talk about this more intelligently I think if I show you hands-on examples. So what I'm gonna do is shift a camera a little bit here. Let's put down shooter here. Not that one, that one. I'll put me up there and I will put a sprite here. Let me shrink that down just a little bit so you can see it. Okay, so this is some pixel art and pixel animation software that I like to use. I've shown it before, it's called asprite, A-S-E-P-R-I-T-E. No one knows how to pronounce it but I'm calling it asprite. Oh, it just disappeared. Hey, come back, there we go. Oh, why is it blinking out of existence? Stay, that's gonna be a bar. So what you see here is a template that I created to get my head around which pixels on the glasses are used in this, I think 15 by nine, or no, sorry, 15 by five, is that right, or 18 by five? This should tell me, yeah, 18 by five. So this is a 18 by five pixel grid that is what's gonna tell the matrix what to look like on here. Let me go ahead and plug these in. That way you'll be able to see what happens as I change things and adjust them. Yeah, okay, so what you're seeing here is the rings. So what I wanna do, let's make a quick example and push it up to the board and I'll show you the code and how that works as well in a bit. So what I've got here is my matrix. I'm gonna add a new layer above this and let's put some dots right in the middle like pupils here. There are ways to draw symmetrically, like force symmetrical and meet convenience, things like that, and then let's grab another color and we'll just put it up at the top like some eyebrows. And so what I've blocked out there in that gray background layer is just to tell me that those are, even though they exist in the image, they kind of, the ones on the side are mostly they belong to the ring. And while you can force this matrix to use it, it's kind of nice to leave the rings alone and show the matrix underneath it. So what I'll do is I'll add a layer of black just so we're not seeing those gray pixels. Let's create a black fill in here. Okay, so now that should serve to illustrate this pretty well, I think. So what I'll do is I'm gonna save this and I'll give it a new name. I'll be daring and save it right to the board. So let's go to volumes circuit pi and I will call this matrix.bmp. Yes, I'll overwrite that, yes, export. Okay, now what I can do is head over to my Adam, text editor, and I'll open up the code that's running on the board. We'll take a closer look at this in a little bit. But for now, I just wanna tell it about that matrix.bmp file. So it's essentially a one liner in here where I'm telling the glasses to display one or both of the BMPs. So I'll say matrix.bmp, let me put that in quotes. And hi, Roy, because it's ski first time here live, welcome. All right, let's see. I will tell it not to do the rings. I'll leave the rings alone, okay, so I'll hit save. And now it's rebooted and you can see, let's, I'm gonna put my little diffuser on top of here so we can see that a little better on the camera, at least. So now you can see my little yellow eyebrows there and my little red pupils. I'm gonna turn down the exposure a little bit as well. There we go. And it's still doing the animation of those rings. But what I wanna do now is I wanna turn off the rings and I wanna focus just on doing an animation of the matrix part of the display. So I'll say none. Now when it restarts, it's essentially animating the matrix portion, but it only has one frame. And the reason this essentially knows that it's only got one frame is that the height of my BMP file, my raster graphic file is only five pixels high, which is the height of the matrix. The way our sprite sheet animation works is very similar or the same as classic video game sprite sheets, which is to say you have one image that's five pixels high. If you wanted to do 10 frames of animation, you would have a 50 pixel high image. And so it just plays one after another of these frames just like a film strip in this case. So let's jump back over to a sprite here and we'll animate this. So I've got frame one here. I'll make a new frame, let's make a few. So let's make 10 frames, like I said. And in the way I'm doing this right now it's just duplicating the previous frames. So every frame of animation is the same right now. What I'll do is I'll have it hold for four frames and then move the pupils a little bit and then it'll loop that back. So let's go to frame five and I'll just use this move tool here. Yeah, sure, browse and all. No, we'll fix that. Let's, in fact, I will, yeah, you know what? I'll do this for every frame like this. This is not the best way to do it, but it's what I'll do. A little more than half the frames are just looking. Now I'm introducing some issues here that I'm gonna correct. Let's see, is that inherent? Yeah, I don't wanna see gray. Pixels show up in the rings in case I allow some of those pixels to show up on ring. By default they wouldn't. If this image is hidden under the rings then it won't show up. All right, so this is what my animation looks like currently, we'll play that. Okay, and we'll leave that alone, we'll say that's it. So now when I go to export this, I wanna export it as a sprite sheet. So let's, I'm gonna go to export. I don't know if you'll see this preview, I think you will. So all frames, I didn't say export sprite sheet, sorry. File, export sprite sheet. Okay, so what it's gonna do is it's gonna create a sprite sheet for us. By default it uses a horizontal one. So what I'm gonna do is change my layout to be a vertical one, which is what works for this matrix part. So now you can see, I said this is like a film strip. So there's my four frames of the eyes looking forward and then there's the six frames of it off to the side. Most of the defaults are fine, so I'll leave those as is and then I'll tell it what file to output. So again, I'll go and drop this right on the board. So I'm going to the circuit Python drive and we'll just call this matrix BMP. So I'm just gonna overwrite the existing one on there. You can give it a unique name and then change that name and code if you want. In this case, I'll be lazy about it. Okay, so now watch. You can see we've got four frames and the frames currently are, I think a tenth of a second per frame. Do I have that right? Let me check the code. So it has a little bit of a pause. Yeah, zero one. So a hundredth of a second is the brief pause in there. So we could slow that down. You could have it take twice as long. It just won't be as smooth if you're doing intermediate frames in between, that sort of thing. Also, I think I'm seeing some glitches that are just video related. It's not leaving pixels behind, but I think my stream capture sometimes shows it in a funny way. So that's the matrix and if I take a look at, I did a version of the cat eye animation. So you remember last week I was working on a little cat display there for your window and I was using some Arduino code, but I wanted to try out this where I could be a little more hands-on with the animation. So here I've created these sort of more eye, sliddy cat eye looking eyes. Let's see if that'll play back. And so you can see I'm doing some things here. Let me pause on when I head off to the side. So this is my centered frame. And again, if I turn off my fully black background, you can see my little guide there for the note don't use essentially those gray ones or the pixels that I'm not gonna use. And then I do an intermediate frame, sort of halfway one pixel over, and then the final frame. And you can see there I'm not including all the pixels. So it's almost gonna give you like a rotating orb effect because part of the eye is masked as it comes around the inner one. And then it jumps back. Whoops, jumps back to center. So that's 38 frames now for this animation. I think I already have this one on my board. Let me just check real quick. I'm just going in the finder and looking on the board. And then I have, do I have one called cat? CatEyesSheet.bmp, yeah. So I exported this one previously, so I don't need to redo that, but I'll just go in to my code and we'll set that timing back to a hundredth of a second and we'll change the matrix to be matrix. CatEyesSheet, oh, it's what I had before, isn't it? Okay, let's do just that one. So no rings animation. Okay, again, yeah, I saw like a red pixel flicker and that was camera stuff. It doesn't happen in real life. Oh, and the side frames. Okay, so those actually, it looks like when I export, I left some of that gray masking stuff on there, which I didn't notice before because I've been playing this with the ring animation. So let me turn that on and then I wanna talk about the ring animation because it actually is a little trickier to get your head around just based on the fact that we're sort of morphing a circle into a line, vertical line, and then using horizontal for the animation. So first off, let's uncomment that line there. So now you're gonna see those gray, they're showing white here, those white pixels, they're just gonna disappear because I have the glasses on top. So even though they're in the bitmap of the matrix, they're not gonna show up. So I'll save that. And now you can see I've got some little eyebrows that kinda move, they don't move lockstep with it. They kinda change their length a little bit to be a little more organic. I know cats don't have glowing red eyebrows, but mine does, I guess. I thought it looked cute. So this is, like I said, a little weirder. So let's jump back to a sprite and let's look at the rings template. So this is actually an animation all in one. So in other words, this is the sprite sheet we're looking at here. The actual, let me see if I can adjust this for you. The actual bitmap for this should just be one pixel wide. So that right there is what you can send to the rings just to have a static color thing happen to them. So let's put that on there. So I'm gonna do file, export, put that directly on the circuit, pie drive, and we'll call it rings, demo. I already have one called that rings, static. Okay, export. And now I'm gonna head back to my code, fix that. So let's do none for the matrix and rings, static, BMP as the rings image. Okay, so now you see a little pattern that I have going, looks like I got it a little backwards. Oh, I thought I had this, okay, so let's fix this. So if we look at what I'm lighting up, I'm just lighting up four pixels at the top of each of the rings. So this red pixel is the very red pixel very top pixel on what I would call the right eye, because I think of it in terms of if you're wearing it. So the right eye top pixel or essentially pixel zero in this array is red, green, blue. Then I'm skipping a whole bunch of them, there's 24 per ring. And then the last one I'm lighting up here is yellow. So that yellow, upper yellow one, that represents, in fact, let's make something a little different here. Yeah, I'm gonna make the pixel unique. Oh, I'm sorry, you're not looking at that, my bad. I didn't jump back to A-sprite. Okay, so I can do that explanation again and probably better. So the very first pixel at the top of the right ring is red, then green, then blue. Then I'm skipping 20 pixels or so. And then the 24th pixel is this yellow one right here. Then the next pixel down is the start of ring number two. And so that is a red pixel. If I re-export this right now just to make things a little clearer. I'm gonna put that magenta pixel as the next pixel in the BMP. So I'm overwriting. Okay, so they're purpley, pinky, magenta E. That's the second pixel in this row. So essentially we have two oriented in the same direction. So the right eye goes essentially clockwise to pixel 23 from zero to 23 and then pixel 24 to 47 is the next one. So they both run in the same direction. What I did in order to make these sort of visually symmetrical, actually I kind of screwed it up. If I wanted to be red on the top and then moving inwards, blue, sorry, red, green, blue, RGB, then I should have this one here be green and the one above it be blue. So this will be green, above it will be blue. And so other than the magenta one that I'm using to distinguish these, if I re-export this, you should see a symmetrical pattern on the two eyes. So doing this helped me just wrap my head around the sort of coordinate system, the local frame of reference of these two rings, if that makes sense. Now to animate these, what you can do is let's, I'm gonna do some undoing that'll get me back to before I cropped it, okay? And by the way, question over in the YouTube, I think someone said, what emulation software are you using to run classic Mac OS? It looks like that, doesn't it? It is just the UI of Asprite. It looks like it's running on an older operating system but it is just a hand-crafted pixel art beauty. I love it. Yeah, it looks like some sort of X windows kind of thing. Okay, so this, if I save this right now, it's just going to give us, and let me correct those two green and blue that I screwed up. So that one goes to blue, one goes to green and I will export it again. So this time, it's going to try animating these because in the case of the rings, the sprite sheet is a horizontal sprite sheet. This was very kind of filled to do it this way because it's already a tall, it's already a 48 pixel high one so we don't want it one pixel wide and a million miles tall one. So this is actually kind of cool because you can go in here and edit this visually. If you think of each horizontal step as being a step in time, if I take, I'm going to grab the magenta again and I will grab a line tool and I will make a new layer here real quick. I'm just going to make a diagonal line. So this is the sprite sheet again. I'll emphasize this only because the other one I animated in a single screen sort of window and then created a sprite sheet. Here I'm editing the sprite sheet manually. So I'm going to export that image. It's already a sprite sheet. I don't have to export as a sprite sheet. Let's give it a more meaningful name because it is no longer static. So I will call this rings anim export and now I'm going to change in code. I won't bring that code window to the front because then I might forget to go back to a sprite like I did before. So this is anim hit save. So now we should see the right ring has a lovely little single pixel running around it. I know the refresh rate on the broadcast is such that it looks like it's two pixels sometimes. That's not the case. It's just a single pixel running around, which is pretty cool. Now if we do a diagonal line on the other ring, the first sort of top pixel of the other ring is this red one here. So we can go all the way to the last pixel. And this is a 48 frame animation, which is convenient because it's powers of two. It allows me to use an aliased line like this. It's depending on how you adjust your time delay. It would be two seconds in animation thinking. A lot of animation is done on 12s or 24 frames per second. So I like to divide things that way. So let me just re-save this or re-export this rather. And now we should have two circles going in the same direction. One on each lens or eye. So now if we wanna go the other way, we're just gonna reverse the direction of the line on the bottom. This'll be one pixel out of phase, I think, but that's okay. It's a pain to do it without moving that line and adding one pixel up at the top. So let me re-export this. Good. All right, yes. So you can see how quick the development is here. I love this since you can just save directly the board. And there we go. Now we've got these nice two little circles moving together. Okay, I lied. I am bothered by having those out of phase sort of. So let's fix that. What we need to do is have the first frame of Magenta be on the red line, because that red line represents the very top of both of these rings. So what I can do is just grab my selection marquee tool, pick my whole line, I'm gonna move it one to the right and then I'm gonna add a single solitary Magenta pixel on frame one. Because remember, if we're moving in the opposite direction, we go from essentially pixel 24 to pixel 47 and then back around to 24. So hopefully that makes sense. I'll go ahead and export. And now we get, yay, some nice symmetrical little lines there. You can mix and match, of course, you can add in your animation. Let's do just in code, I'll tell it to run my sprite sheet for the eyes looking around. So I'll go back to Adam here for a second. So I can say, let's do the matrix cat eyes sheet for here. Matrix cat eyes sheet dot BMP and forget quotes around it. Don't forget quotes around it. Looks good. It's saved. So now we'll get, we'll shift the eyes. We'll get our rings and they essentially can be running in sort of independent time frames, which is so great. Again, for me, the type of way I think about something like animation, this is easier for me to comprehend than trying to do it purely in code as Phil mentions in his guide. The other examples we have are very code heavy and they're awesome and nothing wrong with that at all. But when I want a specific thing with very specific timing and placement of pixels, this is just really terrific for me. So much easier for me to say, hey, I just want to change the center dot of the pupils to red and do that with an image rather than trying to keep track of what number pixel that is in this matrix as it moves around. So hopefully that is a helpful guide and start for you to look at and think about how to do this type of bitmap animation. Let me know if you have questions. Looks like someone pointed out over in the YouTube chat the A Sprite, you can find it at github.com slash A Sprite. I don't know if they let you download it straight from there. You may need to pay for a compiled one, but I think you can download the code and compile it yourself if you want. I bought it, I think, from a humble bundle one time and it shows up pretty inexpensively from time to time. Oh yes, someone mentioned Cylons and Kit. So I got to do a Larson scanner. I think I did, let's see if I saved it here. Matrix one scan BMP. Matrix scan, matrix scanner, matrix only BMP. That sounds promising. Let's open it up. Let's take a look in A Sprite first. So if you're not familiar with the Larson scanner, it's the Cylon LEDI moving side to side or the front of the Kit car. I think there was one other example. They were produced, I think, by the same producer whose last name was Larson, I forget his first name, those TV shows. And so the name at some point became a Larson scanner. So in A Sprite here, I'll go ahead and open scanner matrix only. Okay, so this one, you can see I've got my background turned on on this one. I think that was a mistake. I was probably hiding this under the rings and it didn't matter. What I'll do though is I'll just quickly, since this is an indexed palette, I can go ahead and pick the color of that gray and turn it to black. Did I pick the right one? Nope. Does that change in real time? I can't remember. Sorry about that, hold on. Oh, this is a Sprite sheet. Do I have the anim file? You know what? I can just, this is all one color. I can just change it all at once. Let's pick black. There we go. So this is what the Larson scan with a little bit of a kind of fading trail looks like as a film strip. So I'll re-export this. It's not a Sprite sheet in this case. I hope that's not too confusing. And we'll call this matrix scanner two, how about? Just so I keep them straight. Matrix scanner two, that looks right. Export, okay. So now over here in code, we will go back to a no rings. Change this to matrix scanner two. Miram, miram, miram, miram. And you can see, I just ignored in my art, I didn't actually turn off pixels when they go over that nose bridge. Let me put this in front of my face, because that's fun. You can see right through this. As long as I get my diffuser on right. Miram, miram. What up? So that, if I've ever seen a ready-made Halloween costume, it's that right there. Just be kit, learn a bunch of kit lines. I am a Cylon, it's true. All right. So I hope that that was informative and entertaining. I might as well tempt fate, since I've got the green screen on back there. Let me go ahead and put the scanner behind it. Bear with me. This will surely break the live stream, but why not? Let me find out which camera that is before I add the Mwilly-Nilly down cam. Who are you? Three, all right. Behind, there we go. Did it, yeah, unbroken everything. There we go. I just bought a really big LED wall. That fun or what? By the way, I saw a question earlier in the chat from David Esar, are you still using the retro reflective green screen? Yeah, I use it actually here behind me when I'm doing green screen stuff live stream. Here, I actually have it mounted and I can just roll it down. And then this one I'm using a regular normal lighted green screen. And the issue with that is that I am close enough to it a lot of time to get a little bit of a shadow, which is something that doesn't happen with the retro reflective one, but this was easier to set up there and keep this one set up there, so. Both work well, but that's the state of that. Let's see, any other questions? Let me know. Grab the, let's see, how's the Discord doing? It's not crashed or anything this time. Hey, good, I can put that right there. Oh yeah, and it's, you know what? I think I do need to refresh it though, because I relaunched it, so yeah, my Wirecast doesn't know. Hold on. Oh, sorry, Catney, yes, LED walls are your domain. That's true. Let's see if this fixes it or not. It does, yeah, so there's the Discord chat working again. Good, now I can play Cylon animations in the background and oh yeah, someone, oh, that's cool. Someone posted a nice, Yannick's going to post a nice sort of VU animation of, I'm guessing that's Kit's voice when he's in the car, right? Yeah, look at that. Bidding, bidding, bidding, bidding, bidding, bidding, bidding, bidding, bidding, bidding, bidding. Doodly doodly doodly doodly doodly doodly doodly, did it, did it. So how many do they have there? Yeah, that's a bigger, I did I think four shades of red to do mine. They've got a trail of like seven in that one that looks nice. Yeah, look at that. That's a great triumph of man. Ooh, that's a cool one, do a Matrix. That'd be fun. All right. I think that's gonna do it. Hey, thanks everyone for stopping by. I will be busy filming for the unboxing for next Wednesday. Come on by, the first section of it is a pre-filmed video designed for your education and entertainment, edutainment if you will. And then I'll do a live section where I'll do some live demos and talk to you in the chat. I know Phil and Lamor will be in the chat so you can come on by. It's gonna be at the normally Ask an Engineer time on next Wednesday, the 27th. Ooh, and I'm seeing because my YouTube is starting to crawl, I'm gonna say goodbye. All right, that's it. I'll see y'all next week. Bye-bye.