Boredom, is the mother of invention.

Hi, I’m Victor. I’ve been coding in various languages for about 2 years now (in my spare time). I wanted to share my latest project with you, but before I start I need to let you know that prior to this point, I knew nothing about design and GUIs… Well not of this type or scale.

Preface

I don’t know if it’s a good thing but I get bored of languages quickly. I chose to learn Java the very second the “beginner” JavaScript course was starting to drag. The main reason I did this was because I wanted to be able to make my own play-style and plugins within the popular game Minecraft (using the mod and API — Spigot).

I can still remember how the concept of instantiation and inheritance looked like these massive terms that only rocket scientists could understand

It started with simple projects like automatic chat messages, menus and eventually moved on to more complex forms. I can still remember how the concept of instantiation and inheritance looked like these massive terms that only rocket scientists could understand. But after countless hours of trial and error, I finally managed to teach myself the basics of programming through Java and Google. Trust me, once it clicked in my head, I went crazy like a wildfire, developing plugin after plugin after plugin.

The crazy list of plugins

I would develop plugins for myself, my online friends, and after I released my most successful project — Custom Shop — I was invited to join a dev-team for 2 months working with actual clients. This was the first time I had ever gotten paid for my work. Before then, I would simply upload my plugins to Spigot and hope people liked them enough to contact me.

As I gained traction in my understanding of Java and Spigot, I released my first ever paid plugin which didn’t work out very well (it got a mere 3.53% of the average downloads). It was then that I decided the next best thing to do was create something that would allow server owners to create what I had previously created.

The one that got away

That project stood out of the heck ton of other projects that I did — to the alpha-testers at least, it was never released. I attempted to make my own sort of programming language within the game using config files and basic YAML scripts:

One of the first scripts I made

The plugin is called MakeAMinigame, you can find it on GitHub (along with my other open source projects), and although, this may sound interesting, understand this was me desperately trying to find something new to do for the game within the bounds of Java. Creating Twitter API wrappers, implementing basic Server access to update plugins, and even tried to make my own game in Java (but that failed so bad I was too embarrassed to continue with it).


All of this was really just a distraction from my main goal; to learn as much as I can about coding. And eventually, I realised that if I continued to restrict myself to Java and especially another person’s work, I won’t truly be learning as much as I can. So I decided to pursue something new. I wanted to choose an area that I had never touched, with a programming language that I could understand but was still fairly new to. I came up with a .NET music player and called it PurePlayer.

Who, what what what where, PurePlayer?

When I asked for my friends’ opinions they weren’t hesitant to tell me how terrible the colours were.

The reason I chose PurePlayer as the name, I don’t quite know. I guess I just wanted to make something that looked clean and could play music. But the problem was, I had no experience with how sound on Windows works (don’t know if you got my vibe, but I’m not really an Apple guy), and little designing ability. Regardless, I still thought this was a good idea.

The backbone

The first issue and I think maybe the same for everyone that designs stuff was deciding the sizes of everything and which colours to use. Eventually, I chose the colours: red and indigo/blue, on a form that could barely fit itself.

The earliest build.

Before you, design and UX savvies start cringing like you just ate a sour pineapple, let me remind you that I had no prior experience, and believe me you are not alone. When I asked for my friends’ opinions they weren’t hesitant to tell me how terrible the colours were. So I went back *secretly cried for a bit*, then redesigned my entire project. This the only picture I have of the next build.

#I did not see this coming

To get the look that I had above, took me almost 2 weeks. Line after line, the project would just get bigger and bigger. The worst part was that I couldn’t stop because the entire thing would break if I did. So I kept on coding, making custom controls along the way and the fact that I had to do that for so many things made me want to re-evaluate how annoying and useless VB can be at times.

Last.fm

To get more precise information about the tracks that users had “uploaded” (had to give it a cool name). I hooked unto the last.fm API. Which required me to learn a whole lot of JSON super fast — again mentioning how useless VB can be when handling web requests — resulting in the code that allowed me to query tracks and their albums for data being a monstrosity.

The monstrosity

The “Decline”

I expected everything to be smooth from this point forward, and for the most part it was. Implementing tiles (blocks of text that sit on the sidebar) was so easy I thought I had discovered magic.

Remember previously when I said inheritance and instantiation were for rocket scientists? Well, turns out I might be one because I figured out a way to link every single page and component of the project that uses external data together.

Spiderweb method

I’d like to call what I did the Spiderweb method, even though it most likely already has an alternative name. Each class I created that uses data from external (secondary storage) sources, links itself to the main ‘mesh’ with argument classes passed every time a new one is made. Take for example;

The TrackList

I designed the TrackList to allow myself to easily provide a collection of Tracks (the class that holds data for a particular song), the base control, and size, to display a responsive and interactive list of such Tracks in a specified Panel. The great thing about this is that in one line (of one class) I can do what would have taken me hundreds of lines. The TrackList knows where it is and what it is — talk about breaking particle physics. I can click on a TrackListItem and it can show me the album or playlist it is in, start playing from its location within the list and notify the Queue of the specific source of the TrackPlaying.

So where is this going, Victor?

My plan (if I don’t get bored of the project) is to continue to fine tune PurePlayer and eventually add streaming capabilities, where you can play music from GooglePlayMusic, Spotify, and SoundCloud.

The numbers

Time Spent: I don’t know, but ~ 600 hrs
Lines Coded: ~ 3749
Classes Used: 16

Before you go

I will continue to tweet about my progress on my Twitter page and if you want to contribute to PurePlayer, I have made the code open source on Git Hub, so go check them out.

And if you like my project, please consider recommending it to your followers by clicking the like button 💜

Album page
Playlist page
Queue page