EW S8E5 Transcript EPISODE 5 [INTRODUCTION]  [00:00:06] OB: Welcome to Elixir Wizards, a podcast brought to you by SmartLogic, a custom web and mobile development shop based in Baltimore. My name is Owen Bickford, and I’ll be your host. I’m joined by my producer, Bonnie Lander. This season's theme is Elixir in a Polyglot Environment, where we talk about Elixir works with other languages. Today, we are joined by a special guest, Nathan Willson from Linkers. [EPISODE] [00:00:29] NW: Hey. [00:00:31] OB: How are you, Nathan? [00:00:32] NW: Yeah, I'm good. We're in very different time zones. But I'm glad we could talk. [00:00:36] OB: Yes, you're 13 hours ahead, I think. [00:00:39] NW: Yeah, I'm based in Tokyo, and yeah, we're kind of creeping up on the late evening here. [00:00:44] OB: Right. I'm in Michigan on the, I guess, the western edge of the Eastern Time Zone, which is confusing to say, but fun nonetheless. So yeah, let's start off with if anyone has not heard of Nathan Willson, who is Nathan Willson? [00:00:59] NW: Yeah, I guess people who know me, know that I'm Canadian. I'm from Vancouver, actually, from the west coast of Canada. But I moved to Japan, kind of three years ago to connect with my ancestry. I'm half Japanese and while my family's still here, when my grandma's still alive, I kind of want to connect with her. So, I moved here, I learned the language, and now I work actually as a Rails developer, but I'm obsessed with Elixir. People who might know me in the Elixir community would maybe know me for, I did a couple of libraries related to Japanese. But also, more recently, I did a sort of a music experiment or app, let's say, called GEMS, which maybe we'll talk about in a bit. But yeah, that's been the kind of the latest thing I've been kind of doing with Elixir, I guess, in addition to some of the other projects I have.  [00:01:42] OB: Awesome. So yeah, so everything you just said is interesting. We're definitely going to be digging into GEMS and talking about making kind of unusual apps in a moment. I'm curious, so we've been thinking of the season as polyglot, Elixir working with other languages. You are also a spoken language polyglot. Or would you consider yourself a spoken language polyglot? [00:02:06] NW: Same question. I work in Japanese now. I guess I work in a polyglot environment. If you're talking to me three years ago, I wouldn't be able to have this conversation in Japanese. Now, I could probably get away with it. And then I'm also from Canada, so there's – yes, I've learned French and German and try to learn Tamil once for some reason, and Chinese, Mandarin, I guess. But yeah, the one I really use the most of is Japanese because it just has the most value to me. But it's an interesting that I am, I guess, able to speak multiple languages. But with programming, maybe my value as a programmer in Japan, is because I speak English because no matter what you do, all the documentation is in English, all the tooling is in English. We write all of our code in English, and we try to use English variable names and all that stuff. I think the Japanese programmers here are very – this gets into sort of language learning and we can talk about that as well. But passive language abilities. You can also extend this to programming too. But Japanese people are very good at reading and listening, I would say. It has led me to less practice with spoken speaking or writing, which I would say is similar for me. I don't have much practice with writing in Japanese either. But they are competent enough that we can communicate in English, when it comes down to programming, if that's really necessary, as well. So, it is actually kind of, in a way, a job where all of our meetings are in Japanese. But the links we share and the blog posts we share are usually in English. There's that multi-language kind of requirement as soon as you're outside of the English world. [00:03:31] OB: When did you start learning Japanese, a couple years ago, or has it been longer than that? [00:03:36] NW: It's been a long time. I went to aJapanese school when I was a kid and then I forgot it all. I always wanted to move to Japan. It’s like my dream as a kid and my parents wouldn't let me. So, I gave up on that and I learned German instead. I lived in Germany for a little bit and I gave up on that. I learned French and I still really liked French and I still sometimes use it. But Japanese was always kind of the end goal for me. So, I kind of made a goal for myself. In three years, I'm going to move to Japan and I saved money for those three years and I got here and I did a year of intensive schooling and it kind of – I mean, you can learn a language as much as you want through memorization off your phone, off your apps, whatever. But like what really knowing a language and mastering a language are very different things and probably that gap is learning a language is memorizing all the verbs and all the grammar rules. But mastering language is like understanding the cultural sort of thing. You can't really do that until you live there. So, coming to Japan, I know the word for thank you, but they actually use a different word or it's like when do I use this word, thank you, and how polite am I being? How polite am I not being? Those things are just, you have to be here to kind of learn those things. Coming here was the only way to really actually learn the language, for me at least. [00:04:44] OB: Just being like surrounded by it all day, all night. [00:04:47] NW: Yeah, exactly. [00:04:49] OB: Yeah, that's interesting. I was going to ask you like, what's the approach of learning all these languages? So Japanese must be like the, I wouldn't say the easiest to learn but because you're there, you're surrounded by it all day. Maybe you're picking it up faster than you would have with French or German. Is that true? [00:05:05] NW: I would say analogous to programming, learning spoken language gets easier and easier, the more you learn them. Just because some of the basic concepts are consistent throughout, meaning like you have to focus as much on grammar, you don't have to focus as much on reading. You just get familiar with what the basic blocks of a language are. Because you never really think about that. Growing up as an English native speaker, you don't think of, “Oh, well, how does an adjective complement this noun? And why am I conjugating this verb a certain way?” You just do that naturally. Once you have that tool in your mind that you need to start thinking about conjugation and all that stuff, it gets easier and easier. I don't know that there's a like, necessarily easier language or harder language, maybe. I mean, certainly, grammatically, Japanese is quite far from English. But there's a lot of really cool features about Japanese too, that actually make it easier to learn. I've noticed that for me, when I started learning Japanese was a lot harder than where I'm at now, because I've memorized so many of these Japanese symbols that it's actually now I can – there are so many times where I can see a word, I know the meaning of the word, but actually don't have to read it, or I don't know how you would actually – or I can make a word, just I can guess, based on the symbols and stuff like that. That stuff doesn't really come to later. Also, just a feature that did wasn't in English. It's kind of hard to say, Yeah, I don't know. It's definitely changed the way I thought I had an idea of how Japanese worked, Japanese culture worked growing up half Japanese, but learning the language has totally changed that. [00:06:29] OB: So, aside from learning the language, what's the biggest surprise or maybe the hardest adjustment from moving to Japan? [00:06:36] NW: Hardest adjustment from moving to Japan? It's a good question. I mean, I guess I had really high expectations for myself to become fluent as possible. I was very strict about not making any friends who are foreigners. I guess my identity is half Canadian, say Irish or something and half Japanese. I have such a tie to that, that ancestry that I really wanted to blend in here. I guess that has been the hardest part as a – when I’m in Canada, I want to stand out because I'm half Japanese. Let's say that's my part of my identity. When I'm here, I want to be Japanese and being Japanese is like being in the background. It’s not sticking out. Culturally, it's the opposite that way. Someone who sticks out, they get shot down really quickly. So, you want to just blend in the background, but I always stick out, I guess, just due to my appearance as a foreigner. Maybe the biggest struggle for me has been trying to like – I mean, I literally would buy – I have a red Patagonia jacket. I have like blue pants, and I moved here and I got black pants, a black shirt, really dark jacket, plain colors just to blend in, I guess. That's always kind of in the back of my mind. [00:07:39] OB: Yeah, that would be tough for me, too. Anyone here at SmartLogic can tell you I'm the shirts guy, I guess. I'll just try to find the loudest shirts, whatever jumps out from the rack at me. So, I had to like live in a special zone of Japan to blend in there. [00:07:55] NW: It's very much like just a personal identity crisis in a certain way. I want to be treated like a Japanese person. But am I Japanese? Am I not? I wrestle with that sometimes. But yeah, it is what it is. [00:08:09] OB: It's a struggle. It's hard to fit in anywhere, sometimes, but I'll say this, the place I feel like I fit in the most is around the looks for people, going to Elixir Conf and Big Elixir. Those were a blast for me and have you had a chance to go to an Elixir Conference, or a tech conference in general? [00:08:26] NW: I mean, my introduction to Elixir was through my previous job where we had one app that was in Elixir. We were mostly Rails, but we had an app that’s in Elixir, so we went to Elixir Conf two times. I think I went on my own and other time in Seattle, those two times where – I actually thought about going in Japan as well. But Corona and all that stuff. But the community has been great and I've actually made a lot of really good friends that way. It was small enough when I started that I could kind of have an impact. I don't know if that makes sense. But just like the things that you weren't just like a single person in a sea of a million people. You can actually meet people who are also getting started in the language. So, I definitely have. I haven't in a while. I did attend Elixir Conf this year, virtually. But yeah, it's totally not as fun. So hopefully, going again soon. [00:09:12] OB: The hallway track is not quite the same online. So, before Elixir, I don't think this was your first language. What other languages or how did you kind of get into programming? [00:09:22] NW: Yeah, I mean, the reason Owen and I connected is through music and that's been a big part of my life. I think my entry into programming was through Arduinos and electronics. I used to have an electrical engineering background. So, I was always wanting to make LEDs that syncs with MIDI or my friend Drew and I did have various projects where we would try to do that, do different visual projects or audio processing projects. But I did that in university and I did MATLAB and I did all the things that engineers do. But it wasn't actually what I wanted to do in the end. I thought about even doing even lower-level stuff like VHDL and Verilog like forget the acronym. But much lower-level gate logic stuff, going into audio plugins and all that stuff. What I ended up kind of being the most rewarding for me was making like web apps because you have such a direct immediate impact on your end user. But yeah, my entry was through music, so Arduinos, and then eventually kind of ended up really getting into Ruby, and that's where maybe my biggest jump into programming has been. But I mean, the theme of this podcast is polyglots, I guess. I would say, although my entry had been Ruby, maybe getting more into Elixir, after that, trying other languages is extremely important. I mean, you could try other high-level languages, there's Python, there's lots. But I think, if you enter as a Ruby programmer, and you don't necessarily have the technical background, I don't have a computer science degree or anything. Having that lower-level counterpart is also really important. Why is Ruby the way it works the way it does? What optimizations were made or not made or whatever? I guess, I've also just always tried to invest my time in a lower-level language as well, just for my own personal benefit, whether it's Golang, or I'm not really a C or C++ person, I'm not just that level of skill, but like Rust has been something I've been getting into a lot lately. You got to, in my opinion, as someone who enjoys programming, not as just a job, I want to understand the full picture and understand multiple languages in different domains as well, not just web domain, not just JavaScript, and whatever backend language you have, I think it's really important. [00:11:13] OB: Right. I haven't quite ventured that deep into the stack. I have way back in the day, so long before I was doing any coding. I was using Reaper and I was in a band. So, I was a drummer, and I was the guy who cared about recording stuff. Thus, this obsession with gear, it's expensive. [00:11:29] NW: I have a question for you. Have you ever tried like a Maximus P or any of those, like, sort of programming related things that are out there? They're more of the visual programming tools, I guess. [00:11:40] OB: So, I had glanced at like – so in Reaper, there's free plugins that come along with Reaper. They're called JS – I forget what it stands for. It's not JavaScript. I think they're written in Python. None of that made sense to me back in the day. When I would open up the plugins, I would think, “Okay, I'm a smart guy. I can hack away do something in here.” None of it made sense to me. I was not a computer science major either. So, I kind of like, looked into the abyss and closed it very quickly. But I think when I really did start to at least kind of scratch the surface of becoming a – trying to code was processing. There's a little Windows app, I think that works on Mac and Linux as well called Processing and I would download – there was like a premade template or something, some kind of patch. I don't remember what – I don't know the terminology anymore. But it was like a webcam thing where it would take your webcam and kind of like, sketch outlines and things. I would kind of sit there for hours and kind of try changing little different numbers and variables and things before I knew at all what I was doing. But I was starting to see that I can predict what would change if I changed some numbers somewhere. That was my first foray into like coding without knowing what I was doing. [00:12:54] NW: Yeah, having that visual feedback, I think really helps. I don't know, I mentioned Maximus, because it is like, it's kind of an audio focus thing. But it's also one of those, you literally, if you want to add something, you have to drag wires into like a plus box sort of thing. But yeah, I've also met people just because we're on the topic of music. I've also met people who started that way, and tried to become programmers as well. But I've never – programming audio is just really difficult. There's a lot of either conceptually, or tooling, or there just isn't the perfect solution out there. I think everyone's still kind of catching up to that. There's a lot of tools for recording and editing by effects and real signal processing. The really cool stuff is still kind of far reaching. I mean, you talked about Reaper and stuff like that. Myself as well, opening those files is all gibberish to me. [00:13:47] OB: That's good to hear. So yeah, these are all native apps, like they run on your laptop. They're not web based. I think there are some like internet connected features for Reaper and I'm sure Logic and Pro Tools have some internet features nowadays. But yeah, you're not typically recording of a session, I don't think, across state lines, or across the country unless you've got some really high-end equipment and, a strong internet connection, and everything's got to be perfect, and just right to work for that. But we've mentioned MIDI a couple times, and that's also one way that I started to actually piece together. As I was learning to program and to code a few years ago, I wanted to understand how data flows through. I was learning JavaScript at the time. So, I was trying to understand how to use functions on data and coming from music, not being like a professional musician, but understanding a little bit about making music, that helped me kind of approaching MIDI and using MIDI and code because there was a new Web MIDI API, I think just around 2014, 2015 was whenever it became available. So, perfect timing for me. I think you're actually using Web MIDI and to some degree, possibly on GEMS. But is MIDI kind of something you were looking at early on when you were learning to code or is that something you've kind of approached later? [00:15:07] NW: It's just a necessary – this is a personal – I mean, this is a hot take. You guys were asking about hot takes earlier, but like, MIDI is just so – it's like a necessary evil. But when it came out, it was maybe the greatest thing ever and we still use it. And there's Web MIDI API's, but you're actually so limited in what you can actually do with the protocol. I mean, something like, what is it, OSC, I guess is, am I saying that right? [00:15:33] OB: For oscillators? [00:15:34] NW: OSC is open something, something. But it’s an alternative to MIDI. I wish some of those tools were supported. But yeah, I definitely delved into MIDI with a web browser just because it was only on Chrome for a long time. But that's actually like, I think it's been expanded to, I don't know Firefox has it. But it's getting there. [00:15:53] OB: This is one of the rare like browser developer threads that I've looked at, it seems. A few months ago when I was looking at this, because I was working on an app we'll talk about, Web MIDI seems to be only be supported in Chromium browsers, on Chrome and Edge is chromium based now and there may be some others. But Safari and Firefox are the holdouts. The reasoning was because of security, because you can send like system execution events to a device if you support the full spec. Do you really need to put that in there? But I'm not a browser developer. [00:16:28] NW: It is like one of those entry tools that is a great way for people who want to learn about music and somehow program because you basically treat your MIDI controller via a piano or whatever, it's just like a switchboard. [00:16:38] OB: Just a bunch of buttons, basically. [00:16:41] NW: Just a bunch of buttons. Exactly. And you get really like – I mean, you only get zero to 128. So maybe that's either a great thing or because you get 128 values, or it's like you only get 128 values. It’s something like – I just looked it up, it's Open Sound Control, but there are other protocols out there. But I think MIDI is here to stay, that's fine. But it’s really good., I'm really glad that the browser supports it, because it just opens up so many cool little plugins out there that people have written for tuning. Tuning is a little bit different, but like playing MIDI files, piano lessons, all that stuff, it's really great. [00:17:12] OB: I know, there's work being done on MIDI 2.0 spec that I think provides a lot more flexibility and probably larger range of values and things. I have not read up on that lately. So, I don't know the status of whether that's finalized or in progress still. But it seems like that opens new doors for things you can do with digital music. But I think that kind of leads us right into talking a little bit about your audio project using Phoenix, called GEMS, which was why I reached out to you a few months ago to start with. So, what is GEMS for anyone who's not seeing this amazing piece of software? [00:17:48] NW: Well, thanks. GEMS stands for Globally Editable Matrix Sequencer, or another word for M. But anyway, let's just go with that, Globally Editable Matrix Sequencer. It's a sequencer. Basically, you can imagine a grid of squares, and the rows of the grid are different notes. In a scale, let's say the scale of C, and then we have, I guess, a clock that iterates through the columns of the grid, and it plays the notes as the hit, I guess. It's really much easier to understand when you see it. I bet anyone who opens it will immediately just – it's very intuitive and it makes sense once you just start playing around with it. You've probably seen one before. But I guess what makes Phoenix or Elixir even a good fit for it was I really wanted to make it shareable globally across the world, distributed if possible, so that anyone could use it at the same time. Well, hundreds, however many people I guess, but people could all edit the same grid at the same time, not necessarily share the same audio. So, every person's browser session, I guess he has control over what synth they're using or what attack and decay and all these, they can control the tempo even. But the actual editability of the grid is something I wanted to make distributed. In this case, anyway, Elixir is a perfect place for that just because of how Phoenix works out of the box with distributed and services like file, have made that much, much easier that even just someone not an expert necessarily, like myself, could very, very quickly just distribute or deploy 10 plus servers across the world and they just connect immediately. I mean, I'm really relying on Bitwalker and a couple other people who have really put in the work to get these libraries working. But it was so crazy how easy it was. The distributed part what I was most afraid of and most excited for and that required the least amount of effort in the end. [00:19:40] OB: Wow, that's amazing to hear. Because that will be a challenge for me potentially a little bit further in my future. So yeah, this is interesting. I liked how you talked about before I listen to your conversation with thinking Elixir, awesome conversation. I liked how you talk about everyone is able to edit this grid of notes, but you were also concerned about the potential of abuse, like setting all the faders all the way up to 100% and kind of causing distortion and kind of madness on everyone who's listening. So how did you kind of approach solving problems like that? [00:20:13] NW: Yeah, maybe the purest form of the app would be everyone literally controls the same volume knob and that same synth and all that stuff. But there's just too much opportunity for trolls to kind of play with that. So, you have the grid and which notes are being triggered, is globally editable. But everything other than that, for now, anyway is I've left it up to each individual user. Also, you run into the issue of, depending how important latency matters to you, or what part of the interaction matters to you. In my case, the notes are consistent, but the latency might not be. Your delay is just going to be 30 seconds to Seattle, and mine is going to be five seconds to the server in Tokyo. And then there's some delay between me sending – my Tokyo server sending it straight to Seattle server or whatever. I had to prioritize that. I really hoped that maybe I could have the same clock. I actually originally built the tool where the clock itself came from Phoenix, came from the counter. I believe the Phoenix docks themselves, give an example of a timer using Live View and that works locally fine, because there's zero latency. But as soon as you put it on a server, everything is off by 30 milliseconds, or jumps just plus or minus 30 milliseconds. So, it's actually kind of a weird example to maybe for them to give even as a Live View example. But in practice, there are latency issues with WebSockets that you just have to be aware of, and then multiply that by making it distributed and all that stuff. [00:21:37] OB: What kind of latencies are you seeing with your – so, A, how many regions are you deployed to with GEMS? What kind of latencies are you seeing from different regions? [00:21:46] NW: Yeah, so I mean, I deployed to, I believe, I deployed to 10, some in Asia, one in Australia because I had a coworker there and mostly in the United States, and that in Europe, because I just assumed that's where most of the Elixir programmers would be. We're talking, I guess, the servers that file offers, this is all just deployed on their services. But yeah, I had friends saying they had – I mean, your latency is really your latency. I mean, what latency are we talking about? We're talking latency to the closest server to you, then that's actually really low. It could be 10, 20 milliseconds, which is great for audio. But if you change a note, that note has to propagate to me in Tokyo and I don't know what that latency is. It's almost impossible to measure. But yeah, it's got to be at least 90 milliseconds, at least, I've never been able to play a video game with my brother, under 90 milliseconds. [00:22:34] OB: Latency fluctuates. It's not a fixed number. It's not constant, it can fluctuate because of internet connection issues, or maybe the weather depending on your service provider. So many complications here. [00:22:48] NW: I mean, I thought about all the servers are on UTC. So maybe I could somehow link myself to that clock and be really consistent, like really nailed down latency that way, where I timecode every single button click, and then I tried to mimic that exactly. Not only, if there was a plus or minus 30 millisecond delay, I would at least be able to tell you and give everything an equal amount of delay by the time I reached your screen. So, you would get it in that same order. Yeah, that's like totally an upper optimization that I didn't make, but it's definitely something you could probably try. [00:23:21] OB: Awesome. So, GEMS, people can find it, they can access it. It's free, there's no paywall here. How would they find GEMS online? [00:23:30] NW: Yeah, I'm sure we'll put a link in the podcast, but it's GEMS.nathanwillson.com. But my last name has two L's in it. Just find me on Twitter. I got a decent amount of retweets. So, I'm sure it'll appear in the top my feed. But yeah, it's out there. [00:23:44] OB: The code is open source or close source? [00:23:47] NW: Oh, yeah, the code is open source. Welcome to contributions. I don't know where I would take it in next level at this point, I want to keep it at a place where anyone could interact with anyone who had any musical level. But definitely the more musical side of me wants to make it more interesting. Upload your own samples. Chris McCord did live beats recently, where they created kind of a Spotify clone-ish thing where you could upload your own wav files. That's a great like skeleton for how to upload samples using Live View. All that stuff is supported now. There's definitely room for expanding it that way. But I always wonder as soon as you allow those options, who are you alienating and who are you really supporting in that specific instance? [00:24:27] OB: Right. Uploads make me nervous because of copyright issues. But I feel like I'm just a little bit gun shy on that kind of stuff anyway. Then the code is on GitHub. Is that right?  [00:24:38] NW: Yes. [00:24:38] OB: Okay, cool. So yeah, we'll put links in the show notes for the GEMS online application, as well as the source code because there's some really cool stuff there. I think you introduced me to Tone.js which is an amazing free open-source library for generating sounds through code. The way you generate the sounds, using the same terms you would normally use if you're familiar with a synthesizer, setting attack and decay, and sustain and release. So, if you want to nerd out – if you're not nerding out enough with like modular synths, and you need to get even deeper and nerdier, then Tone.js is a fun way to play with audio. [00:25:14] NW: It’s a really good entry point. It's all written in JavaScript, or TypeScript amazingly. I mean, it relies on a lot of tools that are I guess, in browser, but I mean, this is, since the team is polyglot, if you really want to get into these audio tools, then NIFS are a thing. I tried kind of doing that a little bit with Rustler, as well. It's as not as user friendly. It definitely feels more like, “Oh, I'm going back into the embedded days where I have to really worry about specific types and I'm dealing with samples.” It's a much more expert level game you're playing. But there's definitely that bridge as well. If you want to do audio, I think nowadays, you kind of have to know multiple programming languages if you're going to do it effectively. Because the UI and the actual audio itself are never going to be in the same language. [00:26:01] OB: Right. You were talking about how difficult it was to synchronize users across regions, when you're sending events from the server, and I'm thinking – now I'm thinking about my – I created a gen server for like a metronome, which works well enough. So, I demoed an app at Big Elixir as of recording about a month ago. I think the video for that will be out in the next week or two. So, by the time this episode is released, that video should be on the Big Elixir channel. It's a Live View app where everyone in the same room, on the same network can like play notes through their phone or their laptop. If you brought a MIDI controller, you could press your keys and we would hear all the notes come through the server running on my laptop, and it would produce sound through the PA. That was really fun. It worked well enough. It worked. There was a couple of glitches and it also worked decently well, for a virtual meetup in February. I think the latency we were seeing there was around 40 milliseconds for someone across the country. In the room, though, on the same network, we were seeing zero milliseconds. I'm not sure if I believe it. But for playing rhythmic music, the lower the latency, the better. [00:27:07] NW: Did people feel like they were playing in real time? I mean, whether or not zero latency, you have some room there. [00:27:13] OB: Yes. It seemed to be the case. The demo didn't work at first. Towards the end, it worked. Someone in the audience was saying, “Oh, it says zero milliseconds.” I said, “Does it feel like you're pressing the key, and you're hearing the sound immediately?” It seemed to be the case. I want to do some actual testing on that. It's really hard to test that up without 100 people in the same room, but yeah, that'll be interesting to kind of keep hacking on. [00:27:36] NW: I'm sure you could cheat your way through it, like percussion and stuff like that, you're going to notice the latency immediately. But if you use more orchestral or synth sounds equal – yeah, I don't know. I mean, you can make – it will be really cool to make something almost super ambient or maybe every person got their own instrument. Because everyone has their own instruments, latency is, I guess, it's an issue. But it's also localized to – I mean, yes, where’s the collaboration in that. I guess everyone's just playing their own instrument, their own computer, something that defeats the concept. But yeah, there's definitely ways you could fight the latency issue if it was really a thing. I would be curious if like, what would be the number of people where the system would also break where like 100 people is a lot. That’s more than I thought you'd be able to do easily. I mean, 200,000, what is that limit? I would also be really curious as to what impact that has on latency? [00:28:27] OB: Right. So, there's an article from earlier in the Phoenix days about getting two million concurrent connections on a single machine. That machine was, if you read that article, that was a big machine with a lot of memory, and a lot of cores, probably not cheap. The machines you actually would be able to spend money on or like the free machines, you get on a fly or AWS. I don't think those are going to support two million connections, but they could probably support dozens or hundreds, at least, I would think. For MIDI events – this is the other thing. It kind of depends on like, the actual music that's being played. If it's like ambient or people are kind of playing slow notes or slow chords, you're sending a message, like when those notes are pressed, and released, and that's it. So, with some exceptions, like you're not sending messages repeatedly. Unless you're talking about someone playing like a rhythmic pattern or something. Someone in New York could potentially play and collaborate with someone in California, through the internet, using MIDI, if they're playing something kind of ambient or slower. But yeah, I do think the physics of light and time crossing that distance would make it difficult for faster music to be played through that type of app. [00:29:47] NW: We're talking about absolutely latency as well. I mean, relative latency is maybe almost more important in that situation to where it feels like you get the same – I don't know, if you could almost take the average of everyone's latency and then, or play the notes on each person's computer relative to their latency, basically. So, make it locally seem like it synced is plenty. I don't know how hard that problem would be. I'm sure there are things that I'm not thinking of. But yeah, when doing GEMS anyway, there are so many debates I had with myself about what was the latency that I was actually trying to solve, basically. [00:30:19] OB: Yeah. So that's something I'm kind of thinking through is how to message. If I'm making live showy, my app, if I'm making it a web-based app, where it's not just for like local in the same room, performances, then I would need to communicate to the user, “Hey, based on your connection right now, you will be able to play this type of instrument competently or this type of music or this type of instrument.” It might not work on a higher latency connection. So those user interface, like how to tell user, like, what's going to work and what's not going to work? That's an interesting challenge. [00:30:52] NW: This is a crazy idea. But what if you record everyone's location, and even though someone lives in Seattle, they're really close to the Seattle server, the other person's in the middle of Utah, or something, that closest server to that – there's a little bit more distance there. You could try to also find servers that were actually equidistant to each individual, so that every person, even though it's not – maybe not the closest server to you, it's the same distance as your friend who's also on there. So, you have to match their distance. You have to go to actually more inconvenient server and it’s like a crazy over optimization, but I wonder if that would work. [00:31:27] OB: It's an interesting idea. So, I'm going to kick that around. You're not going to find a solution immediately. Interesting. Now, of course, music isn't the only thing you've used. You've done a lot more than make GEMS. So, are there other projects that you've worked on? Or created that kind of stand out that you're really proud of? [00:31:45] NW: It's a good question. My job is Linkers, but I actually run a separate like company with five friends called Biddy, and it's an Elixir app. And that's something I've been really kind of motivated, I guess. Their downtime, I draw recently, I've been motivated by that. We do auctions on Instagram, because we manage – people as it turns out, lo and behold, there's a bunch of people who do like to sell all sorts of things, from vases, to clothes, to cars, or whatever on Instagram. And so, we help with that and that's been really rewarding, because there was such a need for that in the community when we started. The other thing I kind of want to highlight or mention is this other side that I did with my dad called TreeLib. My dad is a dendrologist. I mean, he studies trees, or he was in the logging industry, I guess. And now he's retired and kind of in his retirement, he's taken tens and thousands of photos of trees, scientific photos, as well, where we’re talking about proper measurements. I mean, it's all over the place, I guess. But I've been able to sort of spin up an app for him to document his trees. Now, he's been introducing it to universities and there's professors that have been using it and we're starting on QR codes now, or putting them in parks in Vancouver, and a couple other places, just as experiments to see if it would be useful to people. But that's been sort of the one long lasting – that was originally a Sinatra app, now an Elixir app. Now, I feel like rewriting it sort of app. But it's kind of like stood the test of time, and actually kind of had an useful educational purpose. I mean, all these GEMS and other music projects that I've worked on have been really fun. But as soon as I have an idea, I do it as much as I can, I get into it. And then it's kind of done from there unless I have another creative burst. But if I can make something that people are actually using regularly, as educational, or helps my dad or whatever, that's definitely what keeps me motivated. [00:33:23] OB: We've got to talk about when to chat, because you're making some extremely useful apps. TreeLib, I'm going to keep that tab open for a little while. But When to Chat is super useful, we started talking about how you're in Tokyo, I'm in Michigan. But yeah, so we were in three different time zones, we had to coordinate when's the best time to record and turns out our guest, Nathan, has created a super handy time zone tool where you can kind of see like – each party can set their preferred time window, and it creates a chart of optimal times you can pick from. It just kind of simplified things for us quite a bit. [00:34:01] NW: It's a good tool for visualizing what everyone's time zones are. I feel like that seems to be a problem that everyone has the known has solved, especially now that Corona has happened, and everyone wants to talk to each other. There are so many tools out there that are – you still have to guess, or if you say a specific time, like I want to meet at 2 PM. What does that for you? What does that for you? Okay, that doesn't work. Let's readjust that and do the calculation again. I'd rather just see a column map of like what are overlapping times visually, and then I can just draw the line for myself. It's not synced to your calendar, anything crazy, but it's pretty. It’s again, kind of an excuse to – I wrote it once in Gatsby and I wrote it in next.js, and it's kind of a way for me to learn another language in a sense, and it's statically rendered, so I don't have to pay for any hosting or anything like that. It's on Netlify. So, I welcome anyone to use this. It's something I actually use regularly and it supports more than two people. There is like a plus person button if you're looking for that, and you can create, I guess a map of time zones and you can share a link and that person can also see that link and so it's handy, for sure. [00:35:00] OB: I've got to say like the user interface, the design, it's like simple, it's stripped down. But it's immediate. You see it and you understand how to use it. Same thing with GEMS, I think like having seen a synthesizer once or twice before, and being a drummer snob. I still got it and saw it, and it was like, “Oh, you click a couple things, you slide some faders and things start happening.” There's not always that crossover of strong back-end engineering and strong front-end design. Where do you feel like you picked up those design skills? [00:35:36] NW: That's a good question. I always wanted to be – when I originally applied for university, I was going to enter into the fine arts program. I've always wanted to sort of – I've been really good at Photoshop and Illustrator. I'm not a good musician, but I enjoy music, let's say. But I've always had that side, where I've paid attention to design and I really wanted to be a front-end developer. But then I think I found back-end problems more interesting for me personally. I've always kind of wanted to still stay in that world. So, if you just made UIs, for apps that I was never actually going to make, using – I guess you would use Figma these days, but it used to be Sketch and it used to be Photoshop and stuff like that. I have notebooks of just like – I have this app idea for this podcast thing, when to be creative UI, could listen to the same podcast the same time, I'm going to just make the UI for that and I would spend the time doing that. But always trying to distill it down to its simplest parts. The apps I appreciate the most are usually the ones that are the least noisy directed straight to the point, but not to engineering, crud, admin page-y, have some personality to it. But it’s definitely a skill that I wish I was better at. I think when we made, I previously mentioned this thing called Biddy and it started with three of us. We envisioned this app ourselves, how it looked and how it would function. Once we brought on designers, it was like a complete rewrite. If it's simple, I can do it. But yeah, getting that attention to detail is really, really difficult. It is in itself its own skill.  [00:37:00] OB: Not easy all the time. But the final product looks great. We've talked about music, we've talked about coding, we've even talked a little bit about design, when you're not listening to Elixir Wizards and you're coding, what are you listening to? [00:37:13] NW: Music questions. That's a good question. I mean, I'm a Bandcamp person. I don't know how people feel about who deserves to be paid for their music. But Bandcamp for me has been always the place where I – if you imagine listening to – I've made music, and you can find on Spotify. I'm not going to mention the name of it. But if you listen to something I made a thousand times on Spotify, I would get, I don't know, a cent for that or something. But if you didn't have a coffee for a day, and you bought my album, instead, I get so much more of that in my pocket. So, this is kind of turning into like advocacy for Bandcamp. But that's kind of always been my place to go and there's so much instrumental stuff. There's so much experimental stuff that you just you would never – some guy in his basement made like some weird Friday. The album art is – I mean, all the vaporwave stuff and all the crazy – it's really great. If you really want to want to have fun on Bandcamp just like, look for funny, or just search tags for things you don't think would be genres but always there. Just things that – yeah, I mean, there’s everything. There's breakfast music, there's whatever you want. People from all places around the world have like tag their things with random tags, and so it was a really fun way to just find something. [00:38:17] OB: So, I could go into Bandcamp. I could go to the search and type in biscuits and gravy, and I would find something, is what you're saying? [00:38:24] NW: Probably, yeah. Probably would not be the genre that you're imagining. If there is one. [00:38:28] OB: Alright, I'll be surprised. Okay. I got to start trying to – I'm shocked how many times I will click on an instrumental playlist and like words start coming out of the speakers. When I'm trying to focus, not using Bandcamps. So yeah, maybe I'm just using the wrong service. [00:38:46] NW: It's definitely, I think maybe somebody you can appreciate someone who does music too. But it's important how you consume everything, and who you support. If you want music to continue to exist, then you somehow have to put money in those artist's pockets. So yeah, I don't know. It's something I try to think about anyway. [00:39:03] OB: We're starting to get near the end here. I'm curious, what are some language pairings that you like, if you're like saying, cheese and wine, Elixir and X. What's your favorite language to combine with Elixir? [00:39:17] NW: That's a good question. I mean, I guess how many languages can you combine with Elixir? There's always going to be that web stack. All of them, I suppose. What I've been dealing with recently has been the Rust, NIF Elixir bridge. And mostly because I was wanting to try for a long time. I've been wanting to learn Rust for a long time. But Jose’s team at Dashbit, they released precompiled rustler recently, and that's been a kind of – that was when the light switch went off for me. It was like, “Oh, this is definitely the best way to, I don't know.” I'm going to try and figure it out. But this could be the best way to make an actual library that you could use in Elixir and people don't have to have Rust on their system. So, that's like a bridge that I would love to see more. I mean, with the walls and philosophy, it would be nice if there just wasn't a language that you had to necessarily – if it was language agnostic, necessarily. But Elixir does such a good job of all the high-level stuff that I would never see a way to reason to pair with. I don't even know if you could, well, what is there, I guess, really? But it does everything I need to do from the most – from the way I understand web programming, and it's usually the system's level stuff that I'm trying to interact with the most. Rust is the new hotness right now, for whatever reason. Everything is made with Rust, or whatever as you see on Hacker News needlessly. Yeah, it's also I'm kind of just educating myself on how types work and some of the things that I never really thought about in terms of memory management and concurrency, that you have to worry about how long a variable lives and who can borrow it and all that stuff in Rust, that you take for granted, the beams is going to take care for you, or take care of for you, or whatever. I think it's just a really great – if you were to pair a language, I would pair a level one as a way to educate yourself for the things you take for granted for the high level one. I don't know. Hopefully, that'll turn into something. Maybe it'll turn into something audio wise as well. I've been working my way through a Rust tutorial recently. So, there are tons of tools out there, especially for music. I think a lot of browser, web based, like Ableton/whatever tools are now written using Wasm in the browser. So, there's a huge market. But there's an industry that's kind of going around that. For people who want to do audio and web at the same time, it's got to be in C or it's got to be in Rust, I’m guessing. [00:41:34] OB: Awesome. If someone is, let's say, so enthusiastic about Elixir as the only language they know, is there like benefits to learning additional languages? I think you've kind of touched on this in the last answer. But if someone's 100% Elixir, why would they want to spend a bit of time on another language? [00:41:51] NW: I've changed the way that I code Ruby because of Elixir. I definitely code Ruby better and I write things more functionally and I believe that's better, because it has cleaned up so many messes. If you just want to be a better programmer, or isn't it just cool to learn new stuff and make things that you didn't think of? I'm also a little worried that my job as a web programmer is going to go away one day, it's because there's so many web programmers and also what is the web going to really do anyway? I mean, will web apps be around 20 years from now? And the way they are now, I do the same thing over and over again, for different pages and different models. I'm sure, that'll be automated one day. So, it was kind of just looking for something else as well to kind of expand what I know, and maybe help me think of an idea for something that I haven't creatively thought of yet, as well. [00:42:37] OB: Awesome. That’s the theme we keep hearing, as we talked about using Elixir with other languages. When you use more than one language, you learn lessons from each one, and you can take those and apply them throughout all of your code. That's really great to hear. It matches with my experience working in JavaScript and PHP, and then finally having the luxury of working in Elixir on a daily basis. So yeah, it's hard to imagine something like GEMS or Live Showy or some of the apps that we see nowadays, working in another language. But some really cool fun stuff being done. [00:43:09] NW: That's definitely true. I don't want to run over time here or anything, but like that project would have been a hundred times more –I don't know how I would have done it in another language. So, it really benefited from – I was using the work of so many other people, and the language and all the concurrency stuff that just wouldn't have been possible. You should use the best tool for whatever problem you're solving. And Elixir was the best tool for that, in my opinion, whether or not it was Live View, maybe not important or not, whatever. But it was really easy. And more than just being easy, it was really suited for solving that problem. [00:43:38] OB: Awesome. Now, I do want to let you go before the sun rises there in Tokyo. Do you have any final plugs or asks for the audience? [00:43:46] NW: Not, especially. If people want to contact me, they can reach out to me on Twitter, Elon Musk’s Twitter. Other than that, not on the ionic bugs. I mean, if people want to collaborate on audio stuff, or talk shop and stuff like that, I'd be really interested. If anyone has any, like nerves, audio projects, I would love to get into that. I have a high zero here and I'm trying to get some JPEGs rendering on it. But it's kind of getting harder than I thought it was going to be originally. But yeah, it'd be cool to see all the audio stuff is just for fun. And if people want to have fun playing with Elixir and trying to make a synth or something like that, hit me up. I'd be interested to just at least share ideas and collaborate on that. [00:44:19] OB: Awesome. Well, it's been a pleasure speaking with you, talking about Elixir and music early in the morning or late at night, depending on where you are in the world. That's it for today's episode of Elixir Wizards. Thanks again to our guest, Nathan Willson for joining us. I'm Owen Bickford. Our producer is Bonnie Lander and our executive producer is Rose Burt.  Elixir Wizards is the SmartLogic production. Here at SmartLogic, we build custom web and mobile software. We work in Elixir, Rails, React, Flutter and more. Need a piece of custom software built? Hit us up. Don't forget to like, subscribe, and leave a review. Your reviews help us reach new listeners. You can find us on Twitter @SmartLogic or join us at the Elixir Wizards discord. The link is on the podcast page. See you next week for more on Elixir in a Polyglot Environment. [END]