 And welcome to John Park's Workshop 2022 edition. Well, I'll do more than one this year, but this is the first one of this year. Wow, here we are. And I want to say hi to the people in our Discord chat and YouTube chat. Look, let's see if I can get this to show up. Oh gosh, we have technical difficulties already. What happened to the Discord chat? That one just blew up. Weird. I've had some technical issues with the setup this morning that are concerning, so I'm not gonna push it. When things don't show up, they may just stay not showed up. Let me see if, yeah, asking politely even doesn't seem to work, okay. But our Discord chat is where you'll find a lot of the good chat going on if you're wondering over in other broadcast platforms where people are talking, that's gonna be the place. Also our YouTube chat. So over in our chat here on Discord, I wanna say hello to Jim Hendrickson and okay, you're on, Steve Siegrover, Mike P. Hello, everyone. And Larry, Jim, Dave, Thomas, Dale, Josh over in YouTube, hello. If, let's see. If we wanna get going with this thing, why don't we cross our fingers and get all technical things work? But let me know. I'm watching those chats. It looks like YouTube stream health is okay so far. So first off, I showed this on social media, but I'm very excited about this shirt that I got for Christmas from my son, which is my favorite cereal, Boo Berry. Very cool shirt. And proud to represent. So let's see. First of all, we'll mention, let's see if this works. Hey, that showed up. We've got a jobs board and that is over on, let's see if this, hey, that capture worked too, good. Some things are working. Over here on jobs.adafruit.com, you can see there are some positions where people are looking to fill or get contract work done. Here's one, Audio Circuit by Righteous Reels in Dalton, Pennsylvania. And they are looking for a circuit to plug into a stereo amplifier headphone jack and power set of VU meters that I would build into a classy enclosure. Very interesting. That's not me, that's someone named John, but not me looking for that contract work. So head on over to jobs.adafruit.com if you're looking for work or if you are looking to post your resume and information, it's entirely free, it's free to post. If you're looking for work, it's free to post if you're looking to hire someone. Let's see, what else is going on? The show I do on Tuesdays right here, this is called JP's product pick of the week. You can see the logo right there. Every week I show a new or interesting from the past a favorite product from the store. Sometimes they're brand spanking new, sometimes we go back a little ways. And I do a little demo, I talk about the specs on it, show you how to code it if it's something that has coding. And it's usually about 15, 20 minutes long. It's got a huge discount this week was 50% off on the item, which was our AT Tiny 817 breakout board slash seesaw board. And then I like to do a little one minute recap of the product pick. So this is it, check it out. It is the AT Tiny 817 seesaw breakout board. What we've developed and we use on here a lot is the seesaw framework. That is a I squared C to anything protocol. This is the RP2040 QDPI. I'm just speaking I squared C between these two things. A lot of the heavy lifting is right here on the seesaw board. So I'm reading a potentiometer and I'm taking those analog values and I'm actually converting them into PWM values to change this brightness on my yellow LED here. I'm reading this little switch here. This is actually a neopixel right over here and my potentiometer is serving double duty. When I'm in this mode, I can change the speed of a fade between a couple of colors or three colors to be precise. It's the AT Tiny 817 seesaw breakout board. Yes, it is indeed. So that is actually gonna come into play when we go into our circuit Python parsec in a moment because some of the code in there to interpolate between the colors is pretty interesting. So we're gonna look at that as like kind of a little breakout on doing some interpolation based on that extra cool Todd Bot code that I integrated into there for the color mixing. Before I do that, I know some people like to make New Year's resolutions. I don't know if this is so much of a New Year's resolution as I've decided to start drinking even more coffee this year. Why not? My dad sent me an article about the benefits of coffee. These articles come up every once in a while and it said with each cup that you add to your intake, you have these various benefits to longevity and reduced heart problems up to five cups. Usually I've been drinking two, so I'm upping it now. And one way I do that is I usually make cappuccino in the morning on my espresso machine, but now I'm also adding some drip to that. I have a nice drip machine. So this is my craft of coffee. Also bit of show and tell. This is my cool super con mug from Hackaday Super Conference a few years ago. So I'm gonna pour myself some delicious coffee there. It was nice and hot. Weather's been all over the place right now. I shouldn't talk about the weather because a lot of people are places that are super cold and it's like 70-something degrees here in LA today. It's too hot, I think, but I like hot weather. So let's see. What else have we got? Let me take a look at the comments here. So someone was asking about a floppy disk. Have you tried making a floppy disk 256 gigabytes? I'd love to know how you go about that unless maybe you're talking about some of the emulated ones. Interesting. All right, so let's jump into this circuit python. Let me get a sip of this and jump into the circuit python parsec. Dr. Jeklx said her coffee consumption lowers risk of diabetes too. Hey, drink up. I will. Okay, let me do one more thing here, which is good. Okay, we're all run smooth. So let's jump into this circuit python parsec. Why don't we? Yes, circuit python. All right, let me just get my coding window over here. Okay, for the circuit python parsec today, I want to talk about doing linear interpolation between two values. So this is useful. I'll show an example in a moment of doing some color mixing between two color values. But in its purest form, what you can see here in my little serial output here inside of Adam is I'm running this code on a little cutie pie here, our P2040 cutie pie. And if you look at that output, what's happening is I'm essentially moving a slider between two values in a linear fashion. So you can see I have the starting number. It says reset and then 123. And then I'm sliding along in these little .05 increments up to an end value of 456. So these could be any values that you are sliding between. And the way this works is you can see the most important part here is this little function called lerp, which stands for linear interpolation, and it takes an argument of a beginning value and end value. And then T is essentially the slider of where are we along this interpolation between the values. We start off with T being nothing. We have the start value of 123 here, sort of random, and this 456. Then in the function when it gets called, in this case, it's being called with start, begin at 123, end at 456, and the T initially is at zero, and then that'll increment up. What it returns is that beginning value plus where that slider is times the end value minus the beginning value. So it's a really succinct little function. But what that gives us here is it's printing out, in this case, the slider moving between those. You can see here, if I change that, let's say we'll go from 10 to 100. This'll give us some nice, easy to look at values here. So sliding along linearly, that should be increasing in amounts of five every time, and then it jumps back down to the start at the end. So if I look at a practical example of this, I'm gonna unplug that, and this is that little slider code that I have with the interpolation between, in this case, three colors, but it's using that linear interpolation to go from one color to the next in R, G, and B, so it's having multiples of those happen at the same time. And so that is how you can do some very simple linear interpolation inside of circuit Python, and that is your circuit Python Parsec. And once again, thank you so much for my friend in a long time, collaborator and community member of Adafruit and Hackerdum. In general, Todd Bot, if you wanna see more examples of code, you can head to Todd's GitHub, especially the tips and tricks page of the Todd Bot GitHub. And Todd is over in the chat, so he'll probably throw up a link to either this code from today or his general tips and tricks. So thank you, Todd. All right, so let's see. What I'll do next is get us prepared prepared for the project that I'm working on. So actually, before I move on, I can't show this again because my Discord won't show up without me probably blowing up the broadcast software, but Mike P says another way that may be better to show that T is in zero to one is T minus one multiplied by begin plus T times end. Interesting, okay, so worth checking out again, check our Discord if you wanna see the details on that conversation. Okay, so for today's project, let me give you a little bit of a background here on what I'm looking to recreate. So let me hold on one second. I'm gonna open up a browser window here and let me share this. So this was a, and I say was because it does not exist anymore. It's not being produced anymore, but this was a very limited edition of I think maybe 100 or so units were made of a musical instrument called the Piano Cade. And this came out, I wanna say maybe 2013, roughly in that timeframe. And what it was is a set of arcade buttons in the arrangement of a piano keyboard. You can see there's a one octave and a two octave version there or more, two and a half, no two, yeah, one octave, two octave. And it has arcade buttons that are arranged like piano keys, chromatic scale on piano. And then it also has some extra input devices. So there's these, I think the coin slot buttons there were actual functional buttons and then the one, two, three and four player buttons were also modifier buttons. And then you've also got a joystick that was used to modify things. But in its base form, this is a synthesizer that you can play to generate chip tunes style music. So wave forms from pulse and square. I think it maybe had a noise waveform which you find a lot in chip tunes and early game console that kind of crunchy sound that you can get. Sometimes it's pitched. And I don't know what all of the waveforms available for it were, but it also could output MIDI so you could just make it be a controller for anything. And it is open source. So you can follow the links on this page. It's just pianocade.com and go look at the source code, find out more about how it works. What I decided to do is build a version of this and I'm particularly interested in the arpeggiator. So if you're not familiar with it in arpeggiator, it is a way of sort of simulating playing a chord on a device that only plays a single note at a time. So rather than playing all three notes of a CEG major chord, it rolls them up, up, up, up, up, up, up, up, up, up, up. And arpeggios sound cool. It's a sound that you'll find in a lot of older video games. Yeah, Yanisku points out that pianocade is looking very Nintendo. I think they even had a sticker at one point that was in the Nintendo typeface type logo. And it's kind of a fascinating project. I think I wrote about it back then for Make Magazine and it was featured all over the place because it's a really attractive looking device. I think I went to buy one and they were sold out by the time I'd heard of it. So time to recreate it. But what I wanna do is use some of our sort of tried and true hardware and software solutions, let me hide this, to create both the synthesis as well as the MIDI output, use our new arcade input Stem-a-Q-T gizmo right here. It's a brand new one, let me open this up. This is sort of in the same line as our Stem-a-Q-T input devices, boards that go over I squared C that we have for sliders, as well as mechanical keyboard keys. So here's one of our keyboard key ones with the key popping off of it there. I probably bet that doesn't wanna go on. So that one is for keys. We have one for slide pots and now we have this one for arcade buttons. And the reason this is really exciting is that wiring up these arcade button types of projects can be pretty daunting. You have a lot of wires to deal with and you need to either have a ton of available GPIO pins or you need to create your own sort of multiplexer. And the arcade buttons that I wanna use are also lighted. So this board actually has two little connectors per button and it's for using these types of buttons you see here that have, if you look, they'll have four little connectors on them, two of them are the switch and two of them are the LED that's inside. So it lights up single color, these are not RGB. And by using this board you can get four arcade buttons on the board. It is I squared C, so you can daisy chain a bunch of them together just by adjusting the I squared C address. And then for the synthesis side of things I wanna use our audio library. So I may have shown this before. If you're not familiar with it, the... Oh, that's, there we go. The teensy audio library by PJRC was forked at one point to run on the M4 Adafruit Trellis M4 and it also runs on the Feather M4. It may run on other Adafruit Feather boards or Adafruit M4 boards, but those are the two I've tried it on. And so this is an Arduino. You download the library for it and then you can use the graphical interface here. This is a really cool graphical interface that lets you build your little nodes of the synthesizer and how it's gonna work. In this case, this has a bunch of waves going through envelopes and defects into a mixer and a little four tap delay. And then that's going to a stereo input or rather stereo output. So this, the cool thing about this is it generates Arduino code, oops, export. And so you can turn that GUI, that graphical interface which makes it sort of easier to design your synth stuff. And then you can copy this code and paste it into your Arduino code. So if you look at, let's jump back over to Adam here and let me show it like this. So this is the code that I copied and pasted out of the design I'm using which is a single waveform. It goes through an envelope which is essentially how it amplifies and attenuates the sound. So it's kind of an on off of the sound. I'm using a delay to create a nice little effect, sort of a stereo delay effect. And then it also gives you all of the connections. They call them patch chords here but these are all the connections between those nodes. I'll show more details about my code after we sort of get a demo of it. But let's jump over to the workbench here and have a look at what I've got going on. So let me grab my trusty coffee and head on over here and I will top that up. So you can see here, actually I need to, this is backwards, I put that on backwards, but you can see here what I've got is kind of a mockup. I'm also working on a nicer design. You know what, I'm gonna turn off this fan here for a little bit, see if I can because it's shaking that camera. The mockup here is just in some little sort of micro racks or maker beam stuff, but I'm designing a proper enclosure for it, probably be laser cut or 3D printable or you could cut it with hand tools into cardboard or wood. And so right now I just got essentially the white keys and I have two of the arcade boards here. And I've got those wired up. I'll show a little something about the wiring too in a second, but those are wired into two of these arcade one by four boards. Then those are running into the I squared C of this feather and the way I'm doing that right now, I can zoom in a bit, is since I'm using a feather M4 which right now does not have a built-in stem QT connector, hopefully one day it will. Get that focus better, sorry. So I'm just using this little spark fun board that gives us a bunch of stem QT slash quick connectors, but those I'll probably end up wiring to this little add-on circuit board here. This is my feather M4. This is my RC circuit for smoothing and taking the noise out of the audio. So it's a pair of 1K resistors and a pair of one microfarad electrolytic capacitors running to a TRS stereo output, 3.5 millimeter. And then you can see I've also got a little wiring harness here for the joystick. So the joystick has ground and then left, right, up, down I think is how those are ordered. This joystick is upside down right now, so I'm gonna have to use it backwards just because when I strapped it onto here I did it backwards. Those run into digital IO pins and I'm also, so I'm using I think 12, 11, 10, nine and I've turned pin six into a fake ground by just setting it as a output low. And that's just for the convenience of plugging this in. So one thing I'm gonna do is add to that the MIDI output as well so that I can run this to classic synth gear that wants MIDI and we can do USB MIDI over the MIDI port here as well. So let's try it out. What I'll do, I'm gonna power these up and I'm just using batteries to avoid any ground loops for right now because that can be a pain with some audio gear and let's see, I'm gonna turn on a little box to add some reverb back here so I've got my little NTS-1. That's totally unnecessary, but it just makes everything sound nicer. So let me turn on some reverb, there we go. I've got, let me zoom out a little bit here to give you the full picture. I've got my buttons going to the board, audio going to a little external effects unit and then going into this little sort of amplifier speaker and let's try it out. Power this up. Oh, I've turned on the little flashlight there, whoops. There we go. Okay, so one thing you'll notice is that these light up as soon as I get that started, these are lit now as you can see and they light brighter when I press them. I have it starting at a really low octave so what I'm gonna use is the joystick to increase the octave. So every time I tap that up or hold it right now it will jump an octave. I think I have six octaves on here or so and there's this octave of keys here, white keys only and I have it set up right now to sort of automatically arpeggiate. Like I said, instead of playing chords when I hold down keys, it's gonna loop through them at a certain tempo. This is another use I have for the joystick which is to adjust the rate of that arpeggio. So let's start with, let me just demo the arpeggio. Whoa, what did I do? Oh, I ran out of battery over here. I think that's not drawing enough current. I might have to plug that one in. Okay, so that's the arpeggio in its basic form and it'll arpeggiate as many keys as you want so we can do let's say a four key, five. Watching that, that just powered down again. So let me get a, I'm gonna grab a different power lock for this one that I know won't turn off. It's a power boost from Adafruit and these stay on. So also let me demonstrate the octave switching. So also one cool thing is that it waits through one round of arpeggiation before it reads the joystick so we can sort of run through octaves like this. The highest one gets out of tune pretty badly so I should probably drop that one. And then arpeggio speed is left and right so since I have this backwards right now I'll go left to go faster. And we can go slower, of course. Have those constraints to a certain minimum and maximum speed but that's adjustable inside of code. You could probably get the maximum speed fast enough to essentially create new waveforms. If it goes fast enough it'll sort of make its own waveform that could sound pretty cool or it could just be really noisy. So yeah, so those are the features so far and like I said I'll have extra five keys here for the black keys. So that will be two more of these boards and what I'll do is since that will leave me with three extra buttons I'll probably add three buttons that act as modifiers of some kind like change the waveform out or a shift function for the joystick so I can get a bunch more things, four more things. So let's see, let's talk about some, actually I'm gonna check the chat just because I don't have it right next to me here and I just wanna make sure we're not in need of any attention. Let's see. Mike P says this is super cool reminding me of the good old NES days. Ha, Lars have selected the keys. Minnesota Mentat, love that JP, oh good. Todd, those are white keys, those are not white keys, those are red buttons, you are correct, that's true. Let's see. So let's talk about some wiring things that I mentioned which I found to be really helpful and I'll probably put these in the guide. When you wire up these arcade buttons, let me zoom in here. Oh, okay. So when you wire up one of these arcade buttons you've got a pair of switches that are in the gray molded section, those are the switch, the contacts rather. So these two contacts are the switch. So bridging those is what happens when the button gets pressed. So if you run one of those, it doesn't matter which one. If you run one of those to a digital input and one of those to ground, then it's gonna work as a switch. So what that means is when you take one of these quick connectors, it doesn't matter which one you attach these little terminal lugs to for the switch part of this, which is like I said, the gray molded part on these arcade, lighted arcade buttons. What does matter is these two, which are for the LED. And so those, it actually says in the, it's molded into here, there's a minus pointing to this one and there's a plus pointing to that one there. And so you need to figure out the orientation of plus and minus in this board, which is indicated on here. So let's say we're gonna wire that up as the first switch here. So these connector boards say LED on this side and switch on that side. So that means I can go ahead and just plug in this switch side just to take that off the table. And these go in nice and secure, click in place. So if we plug this one in, it's, these are keyed so they can only go in the right way. And then follow the markings on here. It says minus and plus. So if I take the minus one, that's gonna go to the minus, let me get that there. That's gonna go to the minus, which is on the left here. Now you can do it like this, but it's kind of easy to get these mixed up. So what I did, you can see it on the ones I have here is I used some heat shrink tubing to mark a bunch of these cables in the proper orientation. And if you look at the switch side of things, you can see I put a little red heat shrink on the positive side, a little black heat shrink on the negative side. I didn't do it for all of them. I think there were one or two that I didn't do it yet. But most of these are like that after I did the first two I was like, I gotta have a system here. So that helps me know those are definitely the LED wires when you sort of prep them all in advance. And I also put a larger piece on the other end just so I could distinguish switch wires from LED wires. So not necessary if you're doing just a button or maybe four, but once you get into eight or 16, like I'm gonna have here, you want to, or 12, you wanna make sure that you've got some system here. So that was my tip on that. Here's one in action. So there's the minus side. I would take a little bit of black heat shrink, cut that, put that over that, heat shrink that on, pick the other one, red, and then a larger piece over here. So that's my little tip on wiring those up neatly. You can also see, let me turn down the volume here. You can also see those are lighting up brighter after they play the note. So I don't have things happening concurrently right now. So that's gotta wait for a little bit of code to tell it to play the note before it lights it up. And then it'll just stay lit until we release it. Nothing fancy, but kinda cool. You could of course use these for a lot of feedback too. You know, I'm gonna turn that AC back on before while my camera overheats. So you could do things like have it pulsing at the rate of your arpeggio. You could have it be sort of a teaching piano where it shows you notes lit up that you're supposed to play. There's a lot you can do with the feedback on there. All right, so let's jump back over to look at the code for this. And also let me know if you have any suggestions or questions in the chat. All right, in fact, I'll go to this view here. This little photo here isn't actually relevant. I'll put one of these boards here. There we go. So let's see, the code here. So audio library, amazing. This was the PJRC, teensy audio library. It got forked back when we were doing the Trellis M4. It works pretty much the same, but it just runs on the different hardware instead of on a teensy. And it's the foundation of a lot of really cool audio projects. A lot of DIY audio projects are based on that code. So it's really solid, really stable, does some amazing things. And then I'm also importing CSAW, and that's so I can use these little controllers over I squared C. And that means that my commands are really simple and some of the processing happens on the board. So it makes it a little easier to do this kind of thing. The code is pretty neat. So warning, this is code that mostly I've cobbled together just in the last couple of days to get this working. I'm sure it'll go through a lot of refinement as I get this ready for putting out there into a guide. But here's how it works right now. I've defined four switches on the CSAW pins. So the pins on this, and I think this is one of the AT Tiny 817 baseboards. It's not a SAM-D09 one, I don't think. So those are the four pins that are used for the switches and then the four PWM pins that are used for the lighting up the LED. So these can be dimmed not just on and off thanks to the PWM pins. The address that it starts on is 3A. And right now I'm telling it I have two boards on here, but eventually I'll have that go up to four boards. And then it creates an array, a CSAW called LEDArcades. And each item in that array is gonna be one of these boards. We'll get back to that setup, but here I have that code I showed before from the AudioFX Library. Then I have some variables that I've set up for my brightness values. So I'm at a PWM of 50 when it's sort of dim and 120 when it's bright. And now I have some variables that I've created that are gonna keep track of which board and which switch and then which sort of unique board switch ID that I have so I know what's being pressed. The note duration initially is 180 milliseconds. That's sort of the rate of the arpeggio. And then this code I will probably reuse some much better code out there for correlating MIDI numbers with note frequencies. But to start with, I just have my eight whole note octave values here. And I'm initially dividing those by 10 just to drop the bottom down. So the very low note base is 44, for example, for the A. Then I have a multiplier for octaves and every time I hit the joystick that multiplies by two so that jumps up an octave each time. Then I have the pin values for the joystick. So like I said, those are in 12, 11, 10, nine and then I'm using pin six as the ground and that's just cause they were all neighbors all in a row so easy to plug into. I have a state and a last state for each joystick so I know when one's been pressed. I can keep track of that and then do something when one gets pressed. I may set up a debouncer for those joystick things cause if you're using them without holding notes right now it can run really quick. Then here's the setup for the serial so that we can read stuff in the serial output. Good for testing mostly, we don't need it normally. Then we go and set up, this is a little search some cool code that Lamor put in one of the examples I think in the arcade one by four example in the Seesaw library for Arduino and this checks to see do we have a board at that address or not. If we do we proceed and here's where we create however many boards and instantiate all eight pins on each board as pull-ups for the buttons and PWM pins for the LEDs. I set up my joystick again as input pull-ups pull-up resistors are built on except for the pin six there which I'm calling essentially a fake ground I said it as an output and then I write it low which pulls that pin to ground internally. Again you can't put a ton of current through that but it'll work for switches like this really well. Now here's the setup for audio library stuff so I'm giving it a, actually that's more memory than I need to give it, I'm giving it a bunch of memory. Then I'm setting up my waveform as a pulse width modulation. You can do things like change this right here to square or sawtooth and that'll give you the different waveforms so that could be a table, a little list that I can go through with maybe shift and joystick to change what waveform. They will have values or arguments associated with them in this case pulse width only matters if I'm using a pulse waveform. Pulse waveform by the way it looks like a square wave with that setting of 0.5 so it's equal on off duty cycle but then we can start to adjust how long it's on versus how long it's off from zero to one. And then the amplitude, how loud is that wave? Then I've set up these three delays so that we create this three tap delay gives us just a little bit of that sort of echo sound. And then I have the mixer of those three going in as well as my return from the effects send. Now here's what happens when we run through the main loop of the program. This I can neaten up for sure. I'm sort of using the same code four times right now that I'll turn most of it into a function. But what happens is for each board, so board number zero and then board number one it will go through and check four buttons. So if a button is actually being pressed that means it's gone low because these start out as high. When a button goes low I set the switch number based on zero, one, two, or three. Then I get the unique ID for that which is this board number times four plus the switch number. So now I have zero, one, two, three and four, five, six, seven on my two boards and that'll go up as I get more boards. Then I set the waveform frequency to be whatever that unique number is so zero through seven in this case. The table that I set up of those frequencies multiplied by whatever this octave multiplier is. So as the joystick changes that number will change and that's how we get the different octaves. We then open up this envelope so that turns the note on, kind of like a gate. Then we delay for whatever the arpeggiation delay is and then we turn off that note. The delay is blocking and that's actually how it's probably terrible way to do this in the long run but right now at least it's how I'm getting the arpeggio because it plays each one in sequence as it runs through this array. What this also means is right now I'm always running what's called up direction arpeggio. I can't bring it down, I can't bring it random, I can't bring it in order of notes repressed. Those are all things that I may add but right now it's just gonna be lowest to highest. Then I also set the PWM value down so you can see that's why that happens after the note plays or rather bright and then drop it back down when I let go of the key. That happens four times, again this'll be code that I can substantially smallify with a function or two. And then this is the section where I'm looking at, oh we love you too Cyber Prog, thank you, over in the comments on YouTube. We appreciate it. So in the joystick here, this is where I may add some of that debouncing but right now it just reads kind of as fast as it can. When I press it to the right, it takes the note duration and subtracts 10 from it and this is kind of cool. I was mentioning my constraints on this so we don't wanna get to where it's a negative number or some number that's ridiculously high and we're waiting 10 minutes per note. So this note duration after I subtract the joystick 10 from it or add the joystick 10 to it, I then go and evaluate that variable again and say whatever that number is, constrain it. So I'm gonna constrain the note duration to a minimum of 10 and a maximum of 1000. That would be one second long, which is pretty long. So you could adjust this in code, it's probably not something you necessarily need to adjust with the interface. If you really had to, then you could make that be some button combo joystick thing to do or maybe change it during startup. Easier in code I think though. And then the down and up joystick, what those do when they're read, they set the octave multiplier to be either divided by two or multiplied by two. And same thing, I have this constraint so that it can only ever be one or 128 and these are multiplied by two each time. So that 128 represents like five octaves. Same thing going up with the multiplier. So that's the code as it is right now. And let me know if you have thoughts and comments in the chat. If you don't, let's see, why don't I give one last little demo of this thing in action and then I think we'll be ready to sign off. So you jump back over to the bench cam and let me grab a, there we, no, not that one, there's the one. I'll turn this back up and I have to turn on my little effects box there, which powered down that run out of battery now. One second and that's how it works. Pretty fun. I hope you like it. Like I mentioned, the one other thing that I haven't added onto the board yet here, you can see I'm using this quadrupler, feather quadrupler is the midi feather wing, which we'll just plonk on there. I may rearrange the order of these. And then I'll probably try to build this so that this faces the back of the case so that you can plug into these. And then I'll use some panel mounts for the USB and the stereo out. So that's it. That's the Piano K DIY. Probably what I'll do next week is some design work for this. So I've started some design. I'll show you probably inside of Rhino. I'm gonna build out a case for it that you can create the original. You can see it's gorgeous. I'm not gonna be able to touch that. I'll show that right there. That's a really nice looking sheet metal enclosure. Bent metal with some sides on it there. I won't be able to do that. I also love that angle. I will probably have to just do that with some acrylic possibly bent. Do some acrylic bending. So laser cut holes in it and then heat bend it. We'll see or ABS possibly. We'll see. See Grover says like in the 2020 keyboard frame. Yes, it's pretty good for a method of hole. I couldn't think of much I had other than boring holes in something. I'll hold all those while I'm working on it. I don't have any vise that big. Maybe some of those giant vise grip clamp things would work. All right, so thanks so much everyone for stopping by here for our first workshop show of 2022. I hope you enjoyed it and I will look forward to seeing you over in Discord. Thanks and see you next time. Bye-bye.