Recording at Bobby Towers
00:00:15
Speaker
Actually, one thing I'd say is, we are welcome to to Deafen, Bobby. and Obviously, everyone knows this from a short note now, short title. But yeah, we're we're recording this in Bobby Towers.
00:00:33
Speaker
We usually record it in Deaf and Towers, but today it's Bobby Towers. So i shouldn't I shouldn't actually make such jokes about your name, Bobby.
Living Inside the Debugger
00:00:44
Speaker
tell me a little bit about yourself, Bobby.
00:00:49
Speaker
What's your name, where you're coming from? inside the debugger. You're inside the debugger. im inside the i'm inside the debugger and's where i said the neighborhood
00:01:01
Speaker
Is that why the camera isn't working?
00:01:05
Speaker
Yeah, you need to see what it looks like inside the debugger because yeah it definitely feels like that's where I live now. i know we don't tend to use debuggers so much in Clojure, but somehow can't get away from them.
00:01:22
Speaker
I'm a debugger user, actually. Maybe it's a shameful admission, but I'm a debugger user in IntelliJ. Yeah, but... You also use cursive, so that is quite shameful. Sorry, Colin.
00:01:34
Speaker
ah I don't think he listens anyway. Well, I mean, to me like, having ability, like, like you know, like Colin Fleming says, you know, you can use the REPL and you can use print lines and you can also use the debugger. Why not?
00:01:48
Speaker
and to give um have Have you used Flowstorm yet? oh ah Yeah, Flowstorm is great. um But again, you know, it's like ah a kind of like, what should say? ah Like a video replay type thing, you know?
00:02:09
Speaker
Yeah, it's pretty cool.
00:02:14
Speaker
Anyway, Bobby. you wouldn Which debugger are you living inside out of curiosity? Like is this CIDR debugger or? Oh, it's flow storm and, and also the browser debugger, uh, because uh, I'm developing JavaScript applications.
00:02:37
Speaker
Well, they're, they're closure applications, but compiled to JavaScript. And that means I get to use the block, the browser debugger, which is cool.
00:02:49
Speaker
And I also have my own, which is a 6502 assembly debugger. Oh, nice. Right. Okay. that This has gone deep very quickly.
00:03:04
Speaker
Yeah. This is great. 6502. that is because the NES sound chip is basically a pirate copy of a 6502, right?
NES Sound Chip and Emulation
00:03:17
Speaker
Yeah, yeah, it's a 2A03 chip, which is, it's exactly like the 6502, except that it doesn't have the the binary encoded decimal feature.
00:03:28
Speaker
Right, right. And also doesn't have the ah the license, the commercial license. Yeah, more importantly. yeah probably I they just kind of severed the connection on the chip. Like it the the unit is still in there. It's just inoperable.
00:03:52
Speaker
And this is they is this Nintendo themselves that made the chip, or did they buy it from someone? ah it was It was made by Rico. Right. right Who made printers or made printers? Are they still around, Rico? Printers, cameras? I don't know. Cameras, right.
00:04:11
Speaker
Yeah. But maybe you should tell us why we're talking about this stuff. I run an emulated 6.5 or 2A03 chip um in order to produce audio ah like the like the classic Nintendo games.
00:04:35
Speaker
Right. Right. i yeah I used to do it like just by um building the audio buffers with code, which is, it was really fun. Like just, ah you know, generate a triangle wave and, and then there's square waves and that is a noise generator, which ah you know, I wrote a, it's a linear feedback shift register, pseudo random generator.
00:05:04
Speaker
And so that was pretty cool. But and I started learning more about NES audio. And at some point, ah i I started getting more picky about all the intricacies.
00:05:21
Speaker
and it actually reached a point where it was easier to make an emulator than to try to get everything perfect.
00:05:36
Speaker
ah But the the other big thing was that I want to be able to output NSF files, which are really cool. okay. It's Nintendo sound format.
00:05:47
Speaker
Right. And that way, ah it's actually a binary. it's It's not a ah music format like MIDI or music XML or anything. It's actually a program that runs on the machine.
00:06:01
Speaker
Right. Hmm. And this was like a wild journey because, know, I had this, this music program that was a Mario paint oh clone, which was really fun. I had the little jumping Mario and entered notes with the mouse.
00:06:22
Speaker
ah But then at some point I i thought, hey, this so this application is written in ClojureScript. ah What if I just ah like hacked my own program and just started writing, like scripting the editor but by writing the song with Clojure functions?
Creating a NES Music Editor
00:06:44
Speaker
And it was this big turning point because I realized it was more fun than actually using the UI. Right.
00:06:56
Speaker
And because I didn't want my program to be just an island, and I started researching all the different kinds of music formats that that I could, starting with MusicXML because it's human readable.
00:07:13
Speaker
And so writing a parser for that was pretty pretty simple. um And then MIDI is the next step up from that ah because that's, and you're using like hexadecimal and it's like this weird streamed streamed format.
00:07:33
Speaker
But then i was like, how do i ah how do I get music from Nintendo games into my program? Because I'm just dying to like replace DuckTales with cat noises.
00:07:49
Speaker
And that that's ah that's when I was in for a real shock because it's not a music format at all. You can't parse it because ah right each one has its own like hoc sound driver that...
00:08:05
Speaker
That they wrote, you know, whatever, usually to fit in an incredibly tiny amount of space because, like, the composer was always, they always ah devote the the most to the graphics and gameplay and stuff.
00:08:25
Speaker
what What does it mean then? Like when you, like, because it was, it's a program that's running in a very small amount of space. Do you have more space in your, in your world or are you also are confined to a very narrow band?
00:08:42
Speaker
Um, well, I don't understand the question. mean, can you only make small programs as well, you know, or does you have more freedom? That is there is a good question.
00:08:54
Speaker
Well, if my, if my sound driver was a little bit better than, than technically
00:09:03
Speaker
Technically, there there would still be a limitation because actually the chip can only address a certain number of. ah
Optimizing Sound Driver Bytecode
00:09:12
Speaker
So like you could have, I think, something like 256 samples.
00:09:19
Speaker
Yeah. see Each one needs to. But I mean, that would be like completely ridiculous for a for a Nintendo song.
00:09:31
Speaker
I guess it wouldn't feel very authentic at that point either. Yeah, it's ah it's all about doing the most with the least. Right, right. But yeah, I've had to do quite a bit of work to actually ah even be able to to have a whole song ah in one binary.
00:09:53
Speaker
ah Because... Well, it's about making the sound driver work as efficiently as possible. Like you have a, it's a byte code format. So, you know, you have like one byte that tells the, tells the machine that it's a pitch or another byte that says that it's a volume command or, or something like that.
00:10:20
Speaker
And so then you have certain optimizations, like ah if there's a note length that's less than 25 frames, then it and doesn't need another bytecode for that.
00:10:37
Speaker
And so so that that saves a lot of space. Oh, man. This is great. Yeah.
00:10:48
Speaker
So yeah, so then I actually wrote my own assembler, which was was really, yeah that that was a really good thing because what I was having to do,
00:11:01
Speaker
i was I was building this assembly sound driver using like a 6502 assembler. and then I would have to go into a hex editor and then chop it into pieces, like find all of the subroutines.
00:11:18
Speaker
And then i would i would convert the I would convert it to like JavaScript hex bytes. And then actually define the subroutines. So you you can see this thing is just completely ridiculous.
00:11:35
Speaker
ah that it was And then you know some of them need to have the the pointers. like So it would have to be a function that would take a pointer. and so every time i modified this driver, i would have to spend like two hours reintegrating it. And it was just this huge pain in the ass.
00:11:56
Speaker
ah So now i I have my own assembler so I can modify the driver and it just assembles it on the fly. And it's great. That is great.
Flowstorm and Clojure in JavaScript
00:12:09
Speaker
escal This has escalated a lot, you know, from for for debugging it for debugging it, I would have to, um, to output a, an NSF file, which can then be opened in a Nintendo emulator.
00:12:24
Speaker
Right. I was going to ask you about that actually. Yeah. Okay, cool. And, And then I would have to um like re regenerate the, the label file.
00:12:37
Speaker
Like, so you have um a file that has all of the, the labels because otherwise he it's just a bunch of op codes and you can't really tell the, you'd have to have the source code open to the side to, to see where you actually are.
00:12:56
Speaker
And so I'd have to regenerate the label file every time. So ah adding my own debugger now is really great. And you wrote the debugger, or or you just attached it to this Flowstorm thing?
00:13:13
Speaker
Um, no full storm is a flow storm is a different thing. I use that for developing my closure interpreter because I'm actually toing porting importing Bork dudes side to JavaScript. Okay.
00:13:33
Speaker
And so, yeah, I've been, But isn't this kind of what, um yeah, okay I'm assuming that that's kind of what cherry and squint are meant for. Squint or cherry, are yeah.
00:13:44
Speaker
Yeah, well, that's that's interesting. um Sometimes I wonder if i why I don't just use his stuff. um More fun to write your own, I guess. Because it already works, and that's no fun. That's absolutely right. It's boring. It comes pre-debugged. Actually, it's been really cool. like um I found a couple of bugs in Squint, and you fixed them right away, which feels really great. to like Yeah.
00:14:12
Speaker
and And some optimizations. So I've indirectly made the compiler a little bit better. but Definitely. Yeah. I think any, any time you use something, especially in this community, you know, you use something, you're making it better. This makes sense by, you know, proving that it does work and then, know, giving feedback.
00:14:33
Speaker
So everyone appreciates that for sure. Indeed. So tell us a little bit about this, this so you just so we were clear about this. So you're you're making um a music um ah music editor, essentially, for NES games. yeah And you're doing it on the web?
00:14:58
Speaker
Yeah, it ah it runs in the browser. And ah my biggest user base is actually Blind Composers. but Which it turns out there's the more of them than I could have ever imagined.
00:15:12
Speaker
And there's a big community on Mastodon. And it turns out that they really needed something like this that because it's text-based. um Otherwise, like the applications are generally not not so accessible. You're either like writing the music in like a ah spreadsheet-like interface or like a point-and-click piano roll type thing. Okay. So what does yours, I mean, know, since we're on, this is great because it's ah it's a podcast medium. So, you know, what is it what does it what does it look like in terms of sound, you know?
00:15:53
Speaker
and In terms of sound? For the deaf, for the blind people, yeah. Yeah, yeah. Oh, well, I haven't gotten that deep into it.
00:16:09
Speaker
I've been kind of thinking what it would be like to try to make some kind of voice interface or, or voice feedback.
00:16:19
Speaker
um Cause you know, there's like there's screen readers. Right. Right. And then, But then, you know, I'd have to learn like some Python API or something to yeah yeah to integrate it with, to make it work with the screen reader. And I'm not sure how helpful that would actually be because it's closure code.
00:16:42
Speaker
ah so So basically the people, the blind community, they write closure code. Is that right? Yeah. Yeah. ah Okay. And they're, they're, they're so like, um, it's kind of,
Accessibility of the Text-Based Music Editor
00:16:55
Speaker
it's, it's, it's fun that they're so into it that they will learn closure to use your editor.
00:17:02
Speaker
Yeah. Well, there's, there's MML is like the, the biggest one. And, um, which is more like a DSL, I guess it takes the, um, it basically, um,
00:17:18
Speaker
creates a ah syntax that encapsulates the the rules of Western music theory. and so So it's like you're writing music notation, but, but in, the in code, um but my approach is like totally different because like I give you a whole programming language.
00:17:39
Speaker
and And so there's no there's no prescribed syntax. Like i I provide like a tutorial and a bunch of example tunes, but ah somebody could end up doing it some way that i never thought of.
00:17:58
Speaker
ah or just Or just write it like as a data structure. You could always do that because it it actually, the the input to the compiler is actually just a map.
00:18:12
Speaker
And each each note is is ah is a map in a sequence.
00:18:20
Speaker
Right, it makes sense. And so everything that you're doing with the Clojure is just to to make it so that you can ah write it more concisely. Mm-hmm.
00:18:34
Speaker
Yeah, this is like, ah reminds me of something we were talking to Nathan about, right? Where he he was talking about how programmers were so quick to constrain our imagination by creating some DSL.
00:18:48
Speaker
Whereas if you if you kind of stick with the programming language, especially LISP, since you can mold it, um you have this this world of possibilities that is still open to you. So i it sounds like that's kind of what you did then.
00:19:05
Speaker
So no DSLs, just have Clojure. Yeah, it's really cool. I think it's great. And um the the idea is to bring more interactivity into it because you have a REPL.
00:19:20
Speaker
ah And in my case, it's ah ah yeah it's using ah Next Journal's Clojure mode for CodeMirror 6. OK. And oh while i was while I was working ah for Exorcism, I wrote i wrote a ah plug-in it that provided inline evaluation.
00:19:44
Speaker
ah but we never actually launched it, but that was actually responsible for kind of kicking all of this in motion because then I had this editor plug-in that was really nice.
Bobby's Clojure Journey
00:19:59
Speaker
And that's when, that's what got me started working on the closure interpreter. Um, just because we have users from all around the world and some of them have like not so good internet access. And so the idea was to get the package size as small as possible.
00:20:19
Speaker
And so that's when like, originally I was using and and I just had kind of a wild thought, like, what if I could make my own interpreter that would be, like, ridiculously smaller?
00:20:41
Speaker
Right, right. And so I found, um I started with mall, the Kanaka mall project that make a list project. And ah because it has a JavaScript implementation and it's a,
00:20:59
Speaker
It is like Clojure flavored Lisp out of the box, which actually got me pretty far. know, I just, ah within like a few months, um I got it to the point where I could ah could run like, like start feeding it actually like functions from Clojure core, which was like a big milestone.
00:21:24
Speaker
um Like, yeah. ah Even stuff like destructuring works. Out of the box? or No, no i had to I had to figure out that destructure function.
00:21:40
Speaker
you i still haven't i still haven't gotten four working, which is actually what what is in the debugger right now. Okay.
00:21:52
Speaker
That's how you do the loops. Well, I actually don't use it for anything. um the The closure that I write is like remarkably, like i almost feel like ah kind of ah embarrassed about it because i just found a really nice, like happy path because i don't, I don't write code for a day job or anything. you know, I don't,
00:22:20
Speaker
I get to throw a lot of stuff out of the window. i don't even need like polymorphism or or namespaces because i'm I'm not writing applications. They're just music programs.
00:22:36
Speaker
So you you can use a subset just that much as you'll need. Yeah. So i actually don't even use four for anything, but I'm trying to, at this point, um and now that I've got like decent performance, well, that came from...
00:22:58
Speaker
Just over this past month, um I started thinking, how could i make this thing faster? Because the Make a Lisp project is it's made to be like for learning how to make a lisp.
00:23:15
Speaker
Right. So it's ah it's just a basic tree walk interpreter. ah It has tail call optimization, which is good. well and But still, if like if ah if i tell it to loop of ah like even just function calls.
00:23:35
Speaker
hundred thousand iterations and ah bork dude made a test ah and a test form it's a loopric cur with ah two function calls in the And a conditional.
00:23:50
Speaker
And ah his is does it in something like half a second ah for 10 million iterations. ah this one This one would just blow up after after a few thousand. You see it starts exponentially ah slowing down because apparently there is some memory leak somewhere.
00:24:15
Speaker
but So yeah this has been quite the quite the journey, like trying to understand psi by going through with the Flowstorm debugger.
00:24:29
Speaker
<unk> And yeah, i managed to I managed to get it working. And it's actually even a little bit faster for the test, which is I might have an advantage because I'm ah just writing it in JavaScript.
00:24:46
Speaker
Right. But it's pretty amazing that it works because it's still using the old mall interpreter because it has to bootstrap from something. Like Psy uses Clojure, I guess, has a limited subset that's available in the GraalVM.
00:25:09
Speaker
Right. And so I guess i guess that's that's still kind of like magic to me. i don't really understand how it works. But I guess so there there's some of the language available, but then ah he has to re-implement.
00:25:24
Speaker
And a lot of it's re-implemented anyway just for optimizations.
00:25:30
Speaker
Right, right. And so, yeah, it actually uses this silly little tree walk interpreter like to to set up the environment
00:25:42
Speaker
and and actually run the functions. ah But by using static analysis, you the code only has to be analyzed once.
00:25:55
Speaker
Right, right, right. Okay, because I think what the, mostly what the closure the small closure interpreter does is calls in to the closure standard libraries, actually.
00:26:06
Speaker
Because it ships with, like, In the browser, it ships with like an optimized version of ClojureScript.
00:26:18
Speaker
Yeah, I don't know how any of this stuff works. So, right, because,
00:26:26
Speaker
and so Babashka has Psy inside it. So it uses Graal to provide some Java classes, which then has some subset of Clojure core, which then Psy is built on top of.
00:26:42
Speaker
Is that how it works? Uh, well, Psy, Psy started as part of Babashka, like the great interpreter part. And then, uh, at some point it was a useful thing on its own. And so it, uh, it grew its own wings and became a sub module.
00:27:01
Speaker
Uh, but then Babashka has like a bunch of built-in libraries for, uh, To do all all sorts of stuff that you would normally need ah for writing bash scripts.
00:27:15
Speaker
Yeah. But I used it in, I used Babashka for the exorcism test runner. ah And that was actually back when, before it even supported all of Clojure. See, now it's a way we're so spoiled because like yeah he's gotten it so nice that it has like protocols and everything.
00:27:40
Speaker
So i I'm thinking here, there's so many interesting things you said, and I want to talk about all of them. But maybe we should pop a bunch of stack frames and and talk about like how you got started with this whole Clojure journey. you know what What in the world got you into this weird language and then ah got you doing all these other weird and wonderful things on top of this weird language?
00:28:05
Speaker
ah So like i I was messing around with Python a bit. And I didn't get very far. It was like like I had a little program that would help me um optimize my item production in playing because I was playing SimCity.
00:28:24
Speaker
And so it was like, a i I realize now that I could have just used a spreadsheet. ah But what's the fun in using something that already works?
00:28:36
Speaker
um But i I was reading SIGP was the main thing. And so i was like, wow, this Lisp language looks really cool.
00:28:48
Speaker
And then um I found out about Clojure actually listening to a podcast ah with Eric Normand. it was the the programming throwdown podcast. It was the first time I heard about it.
00:29:02
Speaker
Yeah, we'll have to drop that in the show notes. But okay, ah not going to let you off the hook that easy. You said you were reading structure and interpretation of computer programs. Like like why?
00:29:12
Speaker
Was that just two-hand? I don't remember. you know i i remember actually โ I was just reading a random Stack Overflow thread.
00:29:25
Speaker
and And some users said that it was like the Bible of computer programming. so I said, okay, I'll download that. And so then i i was I was traveling. I was like actually hitchhiking across the country and I had it on my e-reader.
00:29:43
Speaker
and i like I was learning Lisp like by ah but sitting out on the sidewalk, like copying it into my notebook.
00:29:55
Speaker
this is This is great. So you you basically reinvented the little schemer from first principles, think. Yeah, one time i i had all of this i had all these notes, and while I was sleeping, it started raining, and and the whole page just got all washed out.
00:30:15
Speaker
and i So I had to write that page again.
00:30:21
Speaker
Life on the road. And so, yeah, when I heard about Clojure, it was like, oh, this is interesting. and i um I found a copy of Joy of Clojure the San Jose Public Library and started reading that. Shout out to libraries.
00:30:40
Speaker
Yeah. Yeah, yeah. Love libraries. And, yeah, I wasn't โ
00:30:47
Speaker
I wasn't thrilled about it being on the JVM, but yeah I basically just kind of ignored it.
00:30:57
Speaker
And then I didn't touch Clojure script like for a while. i was actually like, I didn't even have a computer. Like I had a Raspberry Pi that I would i would go into id go into the library and just like start unplugging their shit. And if you just if you act like you know what you're doing, it turns out that like, nope, they'll just leave you alone.
00:31:23
Speaker
And so i would i would just, ah ah that actually yeah that allowed me to evade the like one hour guest time limit. No, because, but I felt really bad because every once in a while, some poor person would sign up for that computer and probably be'd be too embarrassed to like tell me and just wonder what's going on.
00:31:50
Speaker
So what was going on? So you you were basically plugging your Raspberry Pi in the back of it. and Yeah, I would i would just ah i would um unplug their their monitor and keyboard and mouse from the PC and plug in my Pi.
00:32:05
Speaker
and so I was using my computer and just their screen because there was no point in hauling around a screen when there's libraries full of screens everywhere. Wow, this is did this is genuinely great. I'm not even joking. this is like I mean, imagine what society could be if yeah if you didn't need to own screens and monitors and stuff and you could just go and and use them.
00:32:33
Speaker
And it turns out, kids, you can go to your local public library before Trump turns them into private businesses that operate for profit. Yeah, but but this ah i mean the Raspberry Pi is an amazing concept, though, because unlike like Chromium stick, Chrome sticks and this other shit, know you've actually got a real computer that you're completely free to do what the hell you want with it.
00:32:57
Speaker
So this is really amazing, Bobby. so This is the ultimate portable computer, essentially. I'd never really thought of the Raspberry Pi. as a portable computer but but you yeah did you did you have it in a little box or was it like raw in its raw state just ah um this is not really that important i thought it was interesting at at that point i might not have even had a case for it right right yeah wow so just literally the board yeah wow Yeah, the ah the only time like any ah of the the staff would, as I can recall, ever said anything would be like, hey, that's really cool.
00:33:41
Speaker
Well, they weren't wrong. Yeah, no. Game recognized game, as they say. Yeah. So, and that was your, that was what you were doing for learning closure or closure script.
First Web App Development Experience
00:33:55
Speaker
ah right Yeah. Yeah. Um, yeah, that was my main computer for like at least a couple of years.
00:34:02
Speaker
Wow. ah even Even after, even after I had a screen, um,
00:34:09
Speaker
it's not showing off, you know?
00:34:13
Speaker
So I pretty much, I didn't start like ah using browsers or making web apps until eventually I got a laptop. And then um I didn't want to, I didn't want to start like learning like Clojure script.
00:34:34
Speaker
Like that was still just like really dirty. But yeah. but But then as soon as ah as soon as I made my first web app, I was just kind of like, wow, this is it's kind of amazing. Like I can like make something and like put it on GitHub pages because Microsoft hadn't bought them yet.
00:34:55
Speaker
And anyone can just run my application. And yeah and so, yeah, yeah and I've never gone back since then. And so I'm still just coding for the web.
00:35:10
Speaker
Yeah, it's it's amazing like how, I mean, the browser is more or less like a, it is a computer these days, right? Like it's almost a virtual machine and it's, yeah, i had the same, you know, for me it's Skittle, but it's it's exactly the same reason there. You know, I just put some files and for me it's s three right? I put some files in s three they appear on a webpage and anybody can use them. I just love it. No ceremony.
00:35:40
Speaker
Yeah. So, yeah. Where did we leave off in this this wonderful swashbuckling tale? So, um at some point you said you worked for Exorcism.
Mentoring and Curriculum Development
00:35:53
Speaker
Yeah. Yeah. I was ah I was a student for a while and then I finished the closure track and they said, ah how about, how about if you think about becoming a mentor?
00:36:06
Speaker
And so I was like, what really? Like I could do that. no That was, like that was quite an experience because I was just learning closure ah But I figured, what the hell, I signed up.
00:36:20
Speaker
And I realized that these some of these students are like seasoned programmers, but they like it it teaches all sorts of different languages. And so people are like, oh, I'll try Clojure.
00:36:38
Speaker
And then they're doing silly stuff like putting a deaf inside a deafen. Right. And so, so it was like, uh, I found that I could like pick the low hanging fruit there.
00:36:49
Speaker
and, and other times i would end up learning a lot because I would, uh, find someone's solution and then start picking that apart, and figure out what, uh, what's wrong with it or whatever.
00:37:08
Speaker
And so I would learn stuff that way and it was really cool. Hopefully I didn't corrupt anyone too bad.
00:37:17
Speaker
And then they they decided to revamp the whole website and add a um an online editor. Right. And so that meant that meant they had to write like ah test runners for all the languages.
00:37:34
Speaker
Right. And so somehow I ended up being the tooling author. and um And also they wanted to write like a syllabi for each of the language tracks so that it would, because at that point it was actually just kind of a random collection of exercises from around the web.
00:37:58
Speaker
But they wanted to make more of a ah curriculum if that would you know teach ah in in more of a logical progression. Right, have a plan, yeah.
00:38:12
Speaker
And so, yeah, I actually, i was sponsored by Closures Together ah to do a bunch of that work. Shout out to the Closures Together. Yeah, thank you for anyone that contributed to them or thank you for deciding that education is important.
00:38:39
Speaker
Libraries, education, what's going on here? I love this. This is really good. yeah Yeah. Well, we're in Europe, Ray. We have an excuse for being socialists. But, you know, I don't know, Bobby, you're in the U.S., right? So it's frowned upon, I think.
00:38:56
Speaker
Oh, yeah. Yeah, we're taught from an early age that like that's like the devil. Exactly. Sharing is caring, but only until you're 10, you know, after that.
00:39:10
Speaker
Isn't it funny that I think all of the, uh, all of the sort of the industrial age, uh, billionaires, the equivalents of those people like Carnegie and, you know, and core, uh, they all, they all like gave money towards museums and libraries and research. Whereas it doesn't seem, it seems like the opposite is true now. Like the common good,
00:39:32
Speaker
was the previous bunch of bloodsuckers, where in the end, you know, gave it out to the common good, but it feels like it's being destroyed now.
00:39:44
Speaker
Anyway, that's that's a dark moment. Okay, let's just go back to Bobby. Sorry. Yeah, this is is why I spend all day coding, so that I can right escape from all that.
00:39:57
Speaker
Yeah, sorry. Yeah. It's pretty bad when the ah the guts of a 6502 are brighter than the world around you.
00:40:10
Speaker
yeah I guess you can debug that thing on your own, whereas debugging the world is quite a tricky thing. you know is yeah it's it's even It's even a breath of fresh air like from high-level languages. like and I used to hear people who would claim that assembly is easy and think that they're just like...
00:40:31
Speaker
What are you talking about? No, it's not. ah but No, it's actually, and this will make sense here, it's it's simple but not easy. Yes. yeah There you go.
00:40:44
Speaker
There you go. You don't have to deal with like you know i have to deal with like libraries and and reading API docs, you you just learn these like 40 or so op codes and then you've got your debugger and you you know everything about assembly.
00:41:05
Speaker
Except how to do anything useful.
00:41:09
Speaker
Well, you figure that out eventually. Yeah. Yeah. yeah so it's It's pretty simple, really. you're just ah You've got three registers and you just shuffle but bits and bytes around. Yeah.
00:41:23
Speaker
Does the 6502 have, it only has three registers? Yeah. Yeah, yeah there's a there's an accumulator, and then there's x and y. no all the ah the like arithmetic happens on the accumulator.
00:41:40
Speaker
Right, right, right. Yeah. but My assembly is like a lot like my closure. It's like I'm doing everything in dummy mode.
00:41:50
Speaker
And it's ah which made the it made writing an assembler. like really I got to cut a lot of corners because I only use like the most basic opcodes.
00:42:03
Speaker
Right, right, right. Yeah. So I'm actually doing the NAND to Tetris um course right now. I don't know if if you've heard of this one, but- Yeah, that's really cool. Yeah.
00:42:17
Speaker
Yeah. So I think, Ray, I also told you about it, but I can tell the listeners real quick. So this is a Coursera course, and the- the It's a two-parter. And then the first part, they give you a NAND gate. So that's the not-and logical gate.
00:42:33
Speaker
And starting with the NAND gate, you have to build um all of the other gates, like ANDOR, XOR, you know all of these things. And then you gradually build up to, you know you build half adders and full adders, and then eventually like a CPU and memory and all of this stuff.
00:42:51
Speaker
and um So I think that's the first half of the course, you build this full computer that runs in an emulator. And then the second half of the course, you build the operating system.
00:43:03
Speaker
And on top of that, you finally implement Tetris, the game. So um I did the the first part of it a few years back, and I was craving something exciting in my life. So I decided to redo that because I never got around to taking the second part. so This is the perfect time to talk to you about Assembler because I'm knee deep in implementing it right now.
00:43:28
Speaker
Oh, wow. But anyway, sorry, ah but back to you. I got too excited by this talk of you know three register chips because that's the one you build in that course is also a three register chip. And then you have ROM and stuff, of course. but Yeah.
00:43:47
Speaker
but where were we before that little diversion? where you kind of- You look at libraries and exorcism, and then, you know- Right.
Music Compiler and JSON Output
00:43:54
Speaker
Now you've- So so now you're you're realre writing the the ah sound, um the sound like the the the not the sound language. It is but is a sound language yes um so what does that what does that like look like from a from an implementation perspective, Bobby?
00:44:19
Speaker
Well, the compiler actually outputs JSON. Right. Interesting. So like you, um you create the, ah the music data structure, however you want using closure code, as long as it ends up, it's a sequence of maps and each, each map is a music pattern.
00:44:46
Speaker
And so that way you can you can have um you can repeat patterns. And ah it's ah intelligent. And I hate to use the word intelligent.
00:44:58
Speaker
um we Yeah, we'll get onto that later. it ah It knows how to it'll deduplicate them for you. So you can repeat ah music patterns. And um it will appear in the ROM only once.
00:45:16
Speaker
And so each pattern is also a map. ah Wait, you know that. it's a the The pattern is a sequence of maps.
00:45:28
Speaker
Well, hold on. I'm getting confused about my own system. yeah The map has keys for each of the music channels that are available.
00:45:39
Speaker
And each of those is a sequence of maps. Each one of those maps is is a note or other command. And that the other commands are are things like volume changes, ah volume envelopes.
00:45:58
Speaker
ah ah You've got automatic arpeggios. ah so you can Oh, really? So you can put like a ah sequence of notes, and it will it will um repeat that sequence.
00:46:12
Speaker
OK. Is that actually implemented in the silicon itself in the chip or emulated silicon? um it's ah It's a common feature of like a music driver, yeah okay so usually I didn't have it for a while and I would actually have to do arpeggios by just spamming one frame notes.
00:46:36
Speaker
ah So oh it works at a frame of audio is 60 frames a second. right And so that that that will eat through your data really fast.
00:46:47
Speaker
And so that was that's where of a lot of the optimizations came in. like So by making an arpeggio ah subroutine ah that you can call with an opcode, and then ah the compiler that is in...
00:47:07
Speaker
the JavaScript program ah will emit that. And that way um you turned like a thousand notes into just one or or three notes or whatever.
00:47:22
Speaker
so just so I understand this, Bobby, so is the um what's the actual sound engine underneath it all? Is it something in the browser or is it browser specific or cross-platform? Yeah.
00:47:35
Speaker
It's kind of interesting because I decided to use an and NSF player as my application audio pipeline. Right, right. Which that was the the biggest motivation for making the emulator besides accuracy was ah because I wanted to have ah a ah NSF export anyway.
00:47:59
Speaker
ah yeah use it It would have been potentially more confusing to have to figure out how to... um go from whatever internal format I'm using and and to create an and NSF out of that.
00:48:14
Speaker
And then I would have to worry about making the sound that the composer hears be the same as what's going to be exported. And a lot of chiptune programs work like that. Actually, probably most of them do.
00:48:29
Speaker
will have a ah parallel implementation that they have to then keep in line with the audio export. And there'll be all sorts of little idiosyncrasies. But I don't have to deal with that because the the audio engine is actually an NSF player.
00:48:47
Speaker
And that and NSF player, is that that's a browser extension or something? or it's um it's It's a Nintendo emulator that I extracted it from, actually. And I should acknowledge that because ah probably it would have been way harder for me to actually write an emulator myself. Mm-hmm.
00:49:11
Speaker
Um, but I did, come on, that's what we we, this is what you do. what's going on here you know I did port to, it I ported it to closure though. So and okay it feels like mine at this point.
00:49:23
Speaker
Um, but it at first I just took, uh, I found a JavaScript emulator that turns out was really well written. Uh, and so it actually, um, it,
00:49:36
Speaker
allowed me to to understand what's happening. And my debugger came from that also. ah and So yes, somebody else figured all of this out for me. Wow.
00:49:53
Speaker
Which emulator was this out of curiosity? It's called NestJS. Okay, yeah, yeah. the ah it's it's not the most It's not one of the more popular
Emulating NES Audio with JavaScript
00:50:05
Speaker
ones. Actually, JSNess is one of the more established ones. Oh, right. That's the one I was thinking of.
00:50:12
Speaker
Sorry. And that one's actually... a big Indian. i looked at the code for that, and that just scared me. i was like, oh, no. like And they got a lot of stuff wrong.
00:50:26
Speaker
Like, they... They're going out of their way to straighten the triangle wave. which which is actually my favorite part of the of the n NES audio, is the the way that it's a pseudo-triangle wave that is ah its a four-bit counter that just counts up to 16 and back down and makes a triangle that way. So it's stair-stepped.
00:50:55
Speaker
Ah, interesting. So it has the effect of almost like um having little saw teeth on it. Yeah, it's like that, um ah shoot, what do you call the the little whistle where you, it's the wooden whistle with the thing you pull out of it. You know what I'm talking about? Yeah.
00:51:12
Speaker
That slide whistle? so Yeah, slide whistle. yeah Yeah. Huh, I don't see the connection there. Okay, well, maybe you need to be inside my debugger in my brain.
00:51:27
Speaker
No, I was just thinking of the sound it makes and and imagining the kind of Nintendo steppy sawtooth thingy. And that's that's what I pictured it sounding like. but maybe i'm waiting It reminds me of a kitty Oh, OK. Or like a vacuum cleaner.
00:51:48
Speaker
i except That's a really nasty sound. My cats also really hate that. But like a if ah if a vacuum cleaner was really soothing instead of jarring, it has this kind of high-pitched whine the background.
00:52:10
Speaker
And that means that when you're using it for baselines, ah it it makes it a lot more audible than just a perfect mathematical triangle would be.
00:52:24
Speaker
Especially on small speakers, because it's the ah it the harmonic overtones that ah that make the bass more audible.
Creating Instruments with Code
00:52:36
Speaker
so Do you have a ah background in in music theory yourself, Bobby? about to ask the same question. Yeah, I mean, I used to play with tape when I was a child and guitars and stuff.
00:52:50
Speaker
And well, then I didn't have any instruments because I was on the road. And so then I had to start making instruments out of code. So that's kind of how this all started.
00:53:07
Speaker
But did you, oh, sorry, go ahead. All of the like um like the mathematics the the the mathematics and like signal processing stuff, that's all new. like I had to learn all of that just recently.
00:53:23
Speaker
Right, right, right. But so when you um like when you make this song, um ah the tune, don't know whether it's a song or a tune, whatever it is, ah the music.
00:53:39
Speaker
Yeah. do Is there a ah notation for it or is it something that is just the chord basically? um Well, basically, like ah like I was saying before, the notation can be ah however you want.
00:53:55
Speaker
okay But um what I typically do is encode the notes as length pitch pairs. And so they're just vectors of numbers.
00:54:08
Speaker
ryan The first number is the number of frames that the note will play for. and then the second is ah is a MIDI number, but it ah it can be a float. Right.
00:54:22
Speaker
but it which is a very important because i don't want um I don't want to be stuck to ah the equal temperament scale.
00:54:35
Speaker
I want to be able, I want a user to be able to like write like Arabic music or whatever that uses microtones. And got I messed around with that a little bit, like so that you can, you can define like quarter tones and, and do like um ah fancy microtonal scales.
00:54:56
Speaker
And it handles that really well. ah Yeah. ah there was a um ah it's It's wild, these musicians in the Clojure community or or people interested interested in music, but there was say a talk at EuroClojure, was it Berlin Ray, by a um this guy who did a presentation on a system that he wrote for ah Indian classical music.
00:55:23
Speaker
Oh, yeah. it It also has some you know kind of like ah non-Western pitching or or something. I don't remember all the details. that The talk was super interesting though.
00:55:35
Speaker
Wow, I don't know if saw that one. I'll drop it in the show notes and send you a link. I mean, it it really was fascinating. Also way over my head, but most things are, to be honest.
00:55:48
Speaker
yeah and You're limited. um it Its pitch is somewhat limited by the chip. actually, yeah because there's only 11 bits that represent the pitches.
00:56:02
Speaker
And so for the low notes, it's not a big deal because there's more. um It's a logarithmic scale. And so there's more um there's there's more space between each each period in the low frequency. But then up in the high frequency, um if you're doing a lot of high notes, that's where you'll have to have a few compromises.
00:56:28
Speaker
And so this this floating point number gets converted to NES period unit. and es period unit And what, pray tell, is an NES period unit? I didn't want to be the one to ask, but Ray was nodding sage later. 11-bit pitch.
00:56:48
Speaker
Okay, I got you. It's this weird formula that has to take and into account the um the clock rate of the CPU, which is 1.7 something megahertz.
00:57:01
Speaker
And it's... Yeah, it's... so It's kind of, i don't really and understand it that well. I just use it. I found the formula on the webpage.
00:57:18
Speaker
oh Now the, ah the, um the note lengths is kind of interesting and that's what I'm trying to make a little bit better now because it's kind of awkward having to use frames.
00:57:33
Speaker
Right, right. And so like um it would be nice to i mean, i can know my my closure interpreter supports ratios, which is kind of cool. So I can just say like one fourth or one eighth to make like an eighth note or a quarter note. But then the problem with that is that you're the ah it has to divide into an even number of frames.
00:57:59
Speaker
right And so then you you're stuck with using ah multiples of whatever would divide into would divide evenly.
00:58:10
Speaker
And that ah only gives you a certain number of tempos. And so the solution for that is to implement what they call tempo grooves. Mm-hmm.
00:58:23
Speaker
which is... ah like the sound of it. Yeah, it's groovy. yeah And so I'll probably do that at some point. um At this point, I just do the grooves manually, and I've gotten used to just the thinking in numbers of frames.
00:58:42
Speaker
ah And so if I want to to use a tempo that is ah an uneven number of frames, then I just do it. And this, you said 60 frames a second also on the audio frames. Yeah. So if like, um, say my notes are like 20, 20, 10, 10, 10, and then I find that that's a little bit too fast.
00:59:09
Speaker
Then i would just in each measure of music, I would just add a frame here and there to each one. And it's like imp imperceptible when it's just just kind of peppered in there. Right, right, right. But then you do that evenly.
00:59:29
Speaker
And um automating that is like, it's going to be ah it's going to be quite a project because you have to make it so that it adds these frames ah where nothing is happening. Right. and So like you would make, but because you don't want to,
00:59:50
Speaker
If a note is just one frame long, you obviously don't want to mess with that. And if there's just one frame of silence between the notes, you you want to leave that too.
01:00:03
Speaker
and so it'll be like... The heuristic isn't obvious then. Yeah, it's going to be like a... um kind of like a weighting system, like ah where there's a ah cost associated with...
Automating Tempo Grooves
01:00:17
Speaker
um adding notes in a given position. And then it will have to like look in each direction and figure out where's the best place.
01:00:30
Speaker
So you're going to have to break open your your copies of Knuth for that one, right? Art of computer programming or whatever. Oh, yeah yeah. I started reading that when I had COVID ah because I was i was stuck ah without internet access out in the out in the country. Yeah.
01:00:52
Speaker
And that so that was ah ah pretty interesting. I like the ah i like the sorting volume. I think that one's my favorite with all the sorting algorithms.
01:01:04
Speaker
Yeah. ah I know that I think in my CS101 class, we actually did a um we did a like ah LARPing of the sorting algorithms. So we did you know like three or four of the sorting algorithms like with the people in class. like Everybody had to stand up and sort of themselves according to various algorithms. It was fun. Oh, that's and we were like Yeah, we were like 19 at the time too. It felt like being in kindergarten, but in a good way.
01:01:35
Speaker
i bet bubble sort was really fun.
01:01:40
Speaker
Indeed. ah what a sort What's that one called? down Is it BOGO sort? Where yeah it just it just does it randomly? Random sort, yeah.
01:01:51
Speaker
Until it who is maybe eventually sorted.
01:01:59
Speaker
and But it's kind of impressive that you, um, you, you read Knuth while you had COVID. I mean, know, that, I mean, thought I mean, the there during a lockdown makes sense, but while you had COVID, that's, that's, uh, well, this was like, um, this was like reading the way that a child plays with their food. Right. Okay. Picking at it. I would, um, I, I would,
01:02:26
Speaker
I would convert it to text, which was actually kind of a problem. ah There was one of them that no matter what I tried, I could not convert this PDF to text. and They must be doing some sorcery to make it impossible.
01:02:43
Speaker
But then i would, um because I wanted my computer to be able to read it to me. Ah, Right. Because I was like in bed. An audiobook. Yeah. And so, but then like, ah that meant that I had to like, make it so that the screen reader would not choke on the code and the math formulas.
01:03:07
Speaker
So I was actually like figuring out how to transcribe the math formulas into English language. And that was so that was really interesting. So like, if you have like and like a song, like so the likeo ah this is like a for loop and and describing code with, right I thought about how it would be interesting to, how do, like, do they have code screen readers?
01:03:41
Speaker
Like, is that a thing? They must do, right? I mean, I i um i had a colleague who was, ah yeah, her vision was impaired in some way. I don't know to what extent, but I know she used a screen reader for coding. I mean, this is actually really important because like i would I'd like to be able to make a thing that would you know dictate the code for the people that can't see it.
01:04:09
Speaker
Hmm, hmm. Yeah, yeah. Well, you really don't do anything the easy way, do you, Bobby? Well, what what is the easy? the The best thing ever is when you find something that hasn't been done.
01:04:26
Speaker
Well, ah yes. I mean, we could end the show just right on that note. That that was amazing. Mic drop, walk away.
01:04:38
Speaker
Chad, GPT, make me a code screen reader. Yeah, yeah. and That's the thing, isn't it? I mean, you you kind of hit the nail on the head there that you want to find, i think everything is, I tend to argue that everything is kind of fractal and new um and that we you know we live as in such complicated environments that um yeah although there may be there may be similarities between what we're doing and what's been
Fractal Creativity and Novelty
01:05:12
Speaker
done before. There's always novelty, you know?
01:05:14
Speaker
Um, and that's what definitely what keeps life exciting. And it's definitely why I'm kind of against the LMI-ization of creativity, especially because it feels like it's, it feels like it's never going to invent anything new.
01:05:31
Speaker
Yeah. Yeah. Yeah. I mean, what are we even doing here? Like you you might think that we're solving problems, shipping products.
01:05:42
Speaker
um But like, I would say that we're participating in a tradition, a social tradition ah that is human knowledge.
01:05:53
Speaker
It's not like a knowledge isn't a noun. It's a thing that you participate in. Yeah, definitely. Yeah, it's well said. Yeah. And so then, I don't know, they might say, well, that that sounds great, but we live in a world where that depends on shipping products.
01:06:12
Speaker
But then what's that? um I tried to find the source of this, um but i I haven't been able to find it. I heard this and incredible fact that, well, it's a ah claim anyway. I'd like to find out if it's actually a fact um that if you have a group of of mixed skill levels,
01:06:36
Speaker
that they will ultimately outperform a group of experts at like pretty much any task. Yeah. Have you heard that before? Yeah. I think it was um something written up It was in the Harvard Business Review, I believe. um But yeah, I've definitely read this. ah it's It's one of those so weird...
01:07:03
Speaker
ah diversity facts, right? Where you have like a group of all experts is not the best performing group. So there' there's a better dynamic, which is what you described.
01:07:13
Speaker
I will also attempt to find that because I have read the same thing. Yeah, it'd be really cool because like ah a lot of my argument kind of hinges on that. So it better be true. that if if Suppose that's true. Like think about why that is the case.
01:07:32
Speaker
And I think it would be, because it's not just that students need to learn, it's that people, the experts need people to teach or else they end up like becoming irrelevant.
01:07:51
Speaker
And so I just really think that we need to, even in an industrial setting to preserve this environment where there is that dynamic. Yeah, I couldn't agree more.
01:08:02
Speaker
ah i think you like even some of the ah true believers in the LLM revolution have kind of acknowledged this problem that like how do we make more you know so Let me rewind the argument here. It it goes that, and even I can see that LLM coding tools, I have seen them be useful to people who are already expert programmers. um Yeah, it's... ah But like, how do you, that they're not useful to a junior because they don't understand the code that's coming out of the thing. So if all of this is true, like, how do you leap across that chasm from...
01:08:44
Speaker
you know, novice to expert ah without anybody teaching you. Right. Yeah. Yeah. but i never a question Yeah.
01:08:54
Speaker
Everything is just vibes now, Josh. Yeah, I hate that vibe coding. it really I'm not ah kidding when I say that I read some of these blog posts and ah I just want to like go and cry or something. It just makes me so sad that this is...
01:09:15
Speaker
this is what it's come to. Because I mean, Bobby, when you tell your story about messing around with all this hardware, like I just think back to you know how I learned programming. And it was just this amazing you know voyage of discovery and reading these magazines. I was reading Apple ah hobbyist magazines And um you know people like just normal users like me would write in you know a letter to share a program that they had written. And and ah you know I felt this connection you know before the internet was in my house anyway. And it it just like all of this feels so like empty. you know If we replace everybody with robots, where are those connections anymore?
01:10:00
Speaker
I think my even bigger long-term fear is like the displacement of other tools that we could be building that I just wonder if we're taking a shortcut.
01:10:18
Speaker
And at this point, like it if I search for something like, to say, like, translate code, which is something that I have to do a lot. Like, I'll find something that's written in C. And I don't understand. Or C++ plus plus is even worse. Like, it it has, like, lots of classes and stuff. And oh I'd like to be able to have something that would, you know, actually work.
01:10:45
Speaker
You know, that would. And, yeah, I'm sure that, I'm sure, yeah, they're getting so much better. You know, but the. now when I search for that, all I get is ai stuff.
01:11:00
Speaker
And it's like, I actually want that efficient and deterministic, like transpiler that, uh, now there's like no incentive for anyone to make.
01:11:13
Speaker
Cause they'll say, well, we already have that. Kind of. This is the thing that's really, I think is super concerning as well is that, you end up with this, this assumption somewhere. this' is, there's an assumption somewhere in the world that the, that we know what we're doing with computers, that but what we've got that, well, I'm not even joking. I mean, it's funny, but it's, you know, it's like, we know what we're doing with computers and what we've got so far is essentially good enough to keep us going for the rest of time.
01:11:48
Speaker
Um, because these things aren't going to make it any better. Um, That's for sure. They might make it more productive. They might make it quicker. They might make it, you know, and you can imagine for certain languages that that would definitely be the case, you know, that they can just take a whole bunch of boilerplate from Java and just like spew it in.
Learning from Diverse Experiences
01:12:07
Speaker
Even if, even if you discount, you know, cause we all, but we already have these coding tools that would help us even before that, you know? Yeah. Um, so well someone can imagine that the verbosity and can be reduced.
01:12:19
Speaker
Um, but, But like like we're all saying here, I think, is that the learning and the ability to see different things from different disciplines and from different parts of your experience, that's what that's what really makes it that's what makes it creative and not just a result of a prompt.
01:12:42
Speaker
Exactly. I mean, the the way we learn in school, well, okay, sorry, maybe that's a bad example, but I was going to say like it's kind of the difference between a um kind of traditional education where somebody explains a thing to you and you build up this mental model, like contrasted with just cramming for a test, right where all you're doing is like Here you have the answers, you've memorized them and you're going to regurgitate them. But like again, you haven't gone on that journey. So as soon as you've regurgitated these onto the test, that knowledge is just gone.
01:13:18
Speaker
So you know that I think there's something to be said for like you know going back to your chip tuning stuff. Like doing this stuff from almost first principles, you know even if it's just once, it's such an amazing learning experience because you make the connections between these steps. And you know so the computer is no longer this this black magic thing um that we think of it as. But like you can be like, well, actually, I do kind of know how every single layer in this thing works. like Could I build this myself in my lifetime? Absolutely not. But in theory, i know how all this works.
01:13:54
Speaker
Yeah, it would be nice to build a Lisp machine if we were going to do something like that. Right. It would be. Yeah. Anyway, before we get too bleak on the LLMs, is there anything else, Bobby, that we we should talk about? ah Because we've we've spent a long time on this topic.
01:14:17
Speaker
your masterwork, this ah this thison music, this NES music stuff. Are there other things that that you want to like ah discuss at this point?
01:14:30
Speaker
um I'm pretty happy with this, actually, like yeah ah because of like the all sorts of crazy things that has been my life. like Sometimes I'll go on a podcast and we'll end up just talking about like my hitchhiking stories.
01:14:50
Speaker
We'll have you back on for that. Which is really fun. There's lots of stories there. But then like at the end, ah it usually goes by so fast. And it's like, but wait, we didn't talk about anything that I wanted to.
01:15:08
Speaker
But this was great. you We hit ah all the stuff that I'm passionate about.
Creating from Scratch
01:15:18
Speaker
Well, that's wonderful. That's really wonderful. Yeah.
01:15:20
Speaker
Well, we really appreciate Bobby. And I think, um, you know, like Josh says, doing things from scratch is, is amazing. and obviously you've done. Yeah, you've done something phenomenal. Maybe we should, we'll definitely link to the some of the some of the the projects and, you know, you can maybe pick out a few tunes that that that you recommend from the catalog or whatever.
01:15:45
Speaker
Or, you know, you tell us a few sort of bits and pieces that you'd like to to link to as well. Yeah, this is like there's a YouTube channel. It's called Bobby Chips.
01:15:56
Speaker
Right, okay, yeah. And it has like 20 or so songs that I've made with this thing. like Fantastic. Which have like, it has a video export too. So i created the videos with the application.
01:16:12
Speaker
Really? Of course you did. Cool. Cool. You've got on that channel, I saw you have like a three-part screencast too of you actually composing. So I watched some of that actually as background. Yeah, it was um it was kind of aggressively edited. so like ah Because otherwise, like...
01:16:37
Speaker
if you were to see it in real time, it's like ridiculous. Like it would, uh, it would be like an hour, ah just, just to make like, um, you know, the drum part or something.
01:16:50
Speaker
Yeah. Yeah. You know, like they do this, uh, you know, well I don't know if you have the equivalent in America, like the Benny Hill thing where it goes, it's just speeds up, you know, or where, you know, where you see people doing the bricklaying and then suddenly, you see, know,
01:17:07
Speaker
be that would yeah i would like ah I would crank the speed sometimes up to a thousand percent. yeah god so you said You can tell by how fast the cursor is flashing.
01:17:22
Speaker
Awesome. Well, yeah. yeah Thanks again, Bobby. This has been really fantastic. And yeah, good luck with the the the rest of the bits and pieces that you're building.
01:17:32
Speaker
And thanks very much. Yeah, it's great to be here. Thanks. Thank you for listening to this episode of Def N. And the awesome vegetarian music or the track is Melon Hamburger by Pizzeri.
01:17:46
Speaker
And the show's audio is mixed by Wouter Dullert. I'm pretty sure I butchered his name. um Maybe you should insert your own name here, Dullert. motor If you'd like to support us, please do check out our Patreon page and you can show your appreciation to all the hard work or the lack of hard work that we're doing.
01:18:06
Speaker
And um you can also catch up with either Ray with me for some unexplainable reason. ah You want interact with us, then do check us out on Slack, Closure in Slack or Closureverse or on Zulip or just at us at Deafen Podcast on Twitter.
01:18:24
Speaker
Enjoy your day and see you in the next episode.
01:19:04
Speaker
you If you don't have a closure story, I'm not coming to your party.