
A Reimplementation of Winamp 2.9 in HTML5 and JavaScript - tosh
https://github.com/captbaritone/winamp2-js
======
_diyu
Wow, it even has skin support! I spent way too many hours developing skins for
WinAmp and Trillian back in the late 90s as a teenager. I get why skins fell
out of style, but I also kinda wish they didn't. Choosing a skin lets you
personalize an app, creating a skin does so even more while also letting you
express your creativity, and having skins creates a community. If I ever make
an app where skinning would make sense, I would 100% go for it. Skinning
should make a come-back.

~~~
greymeister
I always used skins in Winamp/XMMS, but I'm immediately filled with nostalgia
upon seeing the default skin. I wonder if people who came to use computers in
the last decade will experience the sort of enjoyment I got out of customizing
the look and feel of applications. All of the walled gardens have intertwined
design with functionality to the point where skinning doesn't really exist in
the same way. I haven't used Windows 10, but I wonder if it's possible to
replace the Windows shell like I used to in college.

~~~
mi100hael
Honestly, skinning is probably easier today than it ever has been. With custom
client-side stylesheets, there's no reason someone couldn't roll out custom
skins for sites like Facebook, Twitter, etc.

~~~
dictum
Unfortunately, even proficient developers are having trouble due to some
misguided technical choices those websites are making:
[https://twitter.com/sindresorhus/status/900005504931438593](https://twitter.com/sindresorhus/status/900005504931438593)

~~~
JosephRedfern
If those websites don't wish to support skinning, I don't see how the
technical choices are misguided.

~~~
smadge
Originally stylesheets were meant to be recommendations. It was envisioned
that user agents, users, and web pages would have their own, separate
stylesheets, and the user agent would negotiate between the different
stylesheets to determine the final style. I would argue that Twitter is going
against the original spirit and best practices of the web with their technical
decision to use css-in-js.

~~~
zimablue
Meanwhile most people who have to use the web as a platform to build things
view it as an incredibly painful mash of half implemented ideas and couldn't
care less what the founders intended.

Let's stop using divs for presentation whilst we're at it and spend man-years
on picking the right semantically named elements with no benefit to anyone
anywhere ever.

No ajax or js either, I'm pretty sure they didn't envisage that.

~~~
smadge
To be honest, yes. The web was designed for hyperlinked documents. 90% of what
I use the web for is still following links to pages with text and images. It
is an unfortunate historical accident that people are trying to build thick
client interactive applications using a technology envisioned and designed for
sharing documents.

------
captbaritone
Author here. I wrote a Twitter thread demonstrating many of its features. You
can find it here:
[https://mobile.twitter.com/captbaritone/status/9612747140133...](https://mobile.twitter.com/captbaritone/status/961274714013319168)

~~~
CMay
This is great and brings back a lot of old memories. Something that would help
this spread (perhaps if it was hosted somewhere dedicated to it), is allowing
a URL of an MP3 or a list of other audio files to be included in the link so
people can share a song "the way it was meant to be played."

Thanks for your hard work and for making sure it wasn't broken in Edge. It was
really satisfying to pull it up on my Windows 10 Mobile without issue.

~~~
captbaritone
Alas, this is more complicated than just including a link. The mp3 needs to be
served with permissive "CORs" headers, and most are not. I made the call, that
it would be too confusing for users to try to support loading from URL.

~~~
CMay
Yeah, that makes sense. You would have to download the remote resource in the
link and re-host it which can get expensive quickly. There are probably a few
scenarios where DNS tricks would save the day, but not reliably.

------
bhauer
Amazing.

Wishful thinking: If this included something akin to Shoutcast (perhaps via
WebRTC), it would give us back the peer-to-peer listening joy we had for small
groups and teams back in the day. I miss the era when things were more
commonly/naturally peer-to-peer and decentralized.

~~~
laumars
Shoutcast and the real-time visualisations are two killer features Winamp had
that I don't think any media player since has even come close to competing
with.

I'm not saying there aren't still decent media players out there, but honestly
I think Winamp is still the best there's ever been.

~~~
jihadjihad
I completely agree, nothing came close to the awesomeness of Milkdrop 2 in
Winamp. That's one of the reasons I got into programming, by being curious
about how it "knew" how to move to the music. Still have it installed on an
ancient PC, will never delete it!

~~~
captbaritone
Have you seen [https://butterchurnviz.com](https://butterchurnviz.com) ?

~~~
Fnoord
Cool, but it depends on Soundcloud (dying platform AFAIK given the recent
exodus). How's that gonna help me if I use Spotify? Spotify can stream to my
TV using Chromecast, showing lyrics via Genius. Why can't it also do some
VJing? projectM is open source.

------
pcocko
Winamp + dialup connection. How many hours have we lost downloading a bunch of
mp3 files...

~~~
sergiotapia
23 minutes to download Usher - Yeah and Outkast - Hey Ya!.mp3 - those were the
days.

~~~
function_seven
For a brief moment of my life, I got up as soon as my alarm went off. It was
always exciting to see what MP3s were downloaded overnight from the queue.

~~~
maxxxxx
Somehow it was more fun and you felt like you had accomplished something when
you had a complete album. Things are too easy today :)

------
schappim
Yes, but does it really whips the Llama's ass?

~~~
timdiggerm
Did you visit the app
([https://jordaneldredge.com/projects/winamp2-js/](https://jordaneldredge.com/projects/winamp2-js/))
and press play?

~~~
rodolphoarruda
OMG, end of the day here and I really needed that one! Thank you. Oh, the old
days of internet right in front of me.

~~~
bouke
Same here! I mostly tried the link to see if it also ported the lama, and it
sure did deliver on that!

------
jbergknoff
Finally, a semantic use for the marquee tag.

~~~
captbaritone
Alas, I needed finer grain control over the marquee behavior (scroll character
by character, pause the scrolling, etc), so I had to implement it in JS.

------
trbn
Very cool! The sad thing is that I figured out that I didn't have a single
mp3-file on my computer. Things have changed.

------
polemic
Oh wow. If I could get this as an Electron app I'd be a happy (nostalgic)
user.

~~~
rocky1138
Why don't you just download the real Winamp 2.9 and save yourself the
potential GB of RAM usage?

~~~
slig
Probably because he is on macOS or Linux.

~~~
aidenn0
winamp 2 almost certainly runs fine under wine.

~~~
mrob
Or if you don't need a genuine Winamp, Audacious Media Player has an optional
Winamp-style interface that supports Winamp skins and looks and feels almost
identical.

------
metalliqaz
Man, that's a blast from the past. I don't know when YouTube took over as my
primary music player, but this makes me miss the good old mp3 days.

Remember when 192kbps sounded so much better than the typical 128kbps tracks?
Now 320kbps is just assumed. Yay! for 4G.

------
ilitirit
I still use Winamp 2.95 to this day. It's one of the most reliable and
practically useful pieces of software I run often.

------
sytringy05
I hope the random function is still as “random” as the original :)

~~~
thanatropism
Please elaborate?

------
dwarman
Native WinAmp has two dropin extension systems. The one everybody seemed to
use was MilkDrop, but they also had AVS (Advanced Visualization Studio), for
which I wrote a bunch of extensions about a decade ago. These included several
composition dlls (multi-lane video pipes, MIDI control, joystick control, 30
sec rolling video recorder/playback) and also a number of effects (image
animations, placers, blenders, oscillators). This made for a very engaging
interactive experience, especially flying through using the joystick to
control pretty much any set of parameters. Turns out the visualizers have
hidden strange attractors that never appear when just using passive mode. That
was in XP, I have waiting a Windows 7 build TODO.

I'm semi-guessing the browser re-implementation does not support these. Pity.

------
pier25
"Any application that can be written in JavaScript, will eventually be written
in JavaScript."

Atwood's law

~~~
tantalor
Can Winamp send email?

------
JeanMarcS
I've installed Wine on my Debian juste to use Winamp.

That's so many memories ! Thanks captbaritone !

~~~
glandium
xmms (formerly x11amp) used to fill that niche, but it's not available in
Debian anymore apparently. xmms2 apparently went with something different, but
it does look like promoe is a xmms2 frontend that takes on this legacy.

~~~
themodelplumber
I use QMMP and it's awesome.
[http://qmmp.ylsoftware.com/](http://qmmp.ylsoftware.com/)

------
sengork
Has Justin Frankel ever commented on this project?

~~~
captbaritone
Once or twice:
[https://twitter.com/JustinFrankel/status/961392277376692224](https://twitter.com/JustinFrankel/status/961392277376692224)

------
resnow
Awesome! Brings back memories.

A few things I noticed: I am trying a long live set and times over 100 minutes
are not shown properly. I shows modulo of 100.

Left and right arrows shortcuts should be jump 5 seconds not 5 minutes.

~~~
captbaritone
Thanks for the reports. I've filed a ticket for the first one:

[https://github.com/captbaritone/winamp2-js/issues/485](https://github.com/captbaritone/winamp2-js/issues/485)

I haven't been able to verify the second one.

------
captbaritone
Try it out here:
[https://jordaneldredge.com/projects/winamp2-js/](https://jordaneldredge.com/projects/winamp2-js/)

------
furiousjulius
Does it support milkdrop?

~~~
majke
My first question!

Anyway, if you want AVS, at some point they pubished sources, perhaps someone
could reimplement AVS and AVS2?

[https://github.com/majek/avs](https://github.com/majek/avs)

~~~
captbaritone
We're working on integrating something similar:
[https://github.com/azeem/webvs/](https://github.com/azeem/webvs/)

You can follow along here:
[https://gitter.im/visbot/AVS](https://gitter.im/visbot/AVS)

------
jtokoph
Previous Discussion:
[https://news.ycombinator.com/item?id=15314629](https://news.ycombinator.com/item?id=15314629)

~~~
captbaritone
Winamp2-js author here. Just a note, that since that discussion, the playlist
window, and thus support for multiple tracks at a time, has been added. As
such, the project is only just now "complete".

------
davesque
I remember when I only had enough spare space on my Centris 610's HD (it was
80MB) for two or three MP3 files. I just had my two favorite songs on my
computer that I would listen to with some MP3 player. It may have been a
version of Winamp for System 7 if there was such a thing but I can't remember.
I think the songs were Chemical Brothers and Crystal Method.

------
unixhero
Amazing work. Moving the main application window around in the open blue
workspace is so "native". It's like I just got a new OS right there in my
browser.

I wonder if I can get other things to run in the same isolated space??? To
begin with how about something symbolic like XEyes or good old, in fact
anything good old.

~~~
captbaritone
Check out [http://www.windows93.net](http://www.windows93.net) for a bonkers
take on that vision.

~~~
unixhero
I know about it. It's cool for sure.

With this we have a clean implementation tho.

------
brwsr
Amazing work. Thanks for sharing.

------
Maro
Brings back the good old days :) But I don't have any mp3s anymore. Spotify.

~~~
mortenjorck
Implementing this looks like it would be a fun project:
[https://github.com/JMPerez/spotify-web-api-
js](https://github.com/JMPerez/spotify-web-api-js)

You'd still need the Spotify desktop client open (Winamp2-js would function as
a remote), but you could do things like populating the playlist window with a
user playlist.

~~~
captbaritone
Unfortunately, you can never fully work. DRM means we can’t get raw access to
the audio stream so EQ, visualization, balance, (for example) won’t work.

~~~
Avery3R
You can use a virtual audio cable. Spotify -> virtual cable -> winamp -> real
audio out

~~~
dsl
Can you recommend a "virtual cable" javascript library that is compatible with
DRM output? I can't seem to find anything.

------
stevenicr
Loved the lama and the auto fade with winamp. When streamripper plugged into
it and worked - those were the best days.

Now if yahoo would give musicmatch jukebox 7.5 back to the world I could DJ
like it's 1999 and be happy again.

------
linkmotif
This is going to be the basis of my next startup: Winamp as a Service.

------
AJMaxwell
I'm overly excited about this. Winamp was a huge part of my early computer
experience, even went so far as to (poorly) design my own. Can't wait to start
using this!

~~~
captbaritone
If you have any js experience, or want to develop some, feel free to reach
out. I can find you an issue that aligns with your interests.

------
maherbeg
This is amazing! Brings up fond memories of my attempts at building a winamp
clone in assembly.

You really learn to love higher level abstractions when you write that much
assembly by hand...

------
Zitrax
What about running it without the browser chrome?

~~~
Zardoz84
you can run it on Firefox

------
digi_owl
Not sure if should be impressed or appalled.

These days i think i'll just use Foobar2k on Windows, and Deadbeef (or a
terminal player) on Linux.

~~~
themodelplumber
I like QMMP. It's a lot like Winamp

~~~
digi_owl
Interesting. And the dependencies seems reasonable as well. I'll gice it a
look later.

~~~
digi_owl
God damn it, this was smooth to get working. Only got some odd error regarding
the tag writer on vorbis, but not a major loss. Had it been a GTK based
project i fear the number of "esoteric" sub-sub-sub-dependencies i would have
had to track down...

------
tlrobinson
I love reimplementations (or emulators) of retro software. Is there a site
that catalogues projects like this?

------
sandos
Weird. I need to set my chrome zoom to 75% to get crisp graphics with this?
100% looks blurred.

------
j45
Very cool. I saw this and imagined the future - maybe compiled as a
webassembly binary.

------
ggm
The quad amp skin was my favourite (proud owner of a quad 22 valve stack
gathering dust)

------
cm2187
Will the implementation also include a memory leak? Part of the experience...

~~~
captbaritone
Probably :(
[https://github.com/captbaritone/winamp2-js/blob/0cf2d7292fc9...](https://github.com/captbaritone/winamp2-js/blob/0cf2d7292fc9d034a1e790651c42b9f5a5971d73/js/fileUtils.js#L33)

------
mrits
The wiki says Winamp was created in 1997. I feel like I used it in 94 or 95.

~~~
ghostcluster
It was released in late April 1997. MacAmp actually came out a little earlier
on April 13, 1997

------
pcunite
Just says "Loading ..." for me when using SlimJet? Chrome works.

~~~
mzware
Here is the same thing, the errors are:

TypeError: Object.entries is not a function(…)e.(anonymous function) @
console.js:32

Skin.js:127 Uncaught (in promise) TypeError: Object.entries is not a
function(…)

~~~
captbaritone
Could you paste a full stack trace?

~~~
mzware
I'm using Chrome by the way.

#1 - TypeError: Object.entries is not a function(…) e.(anonymous function) @
winamp.js:38

#2 - winamp.js:49 Uncaught (in promise) TypeError: Object.entries is not a
function at _
([https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:49:15179))
at Ct.beginWork
([https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:31711))
at i
([https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:44327))
at a
([https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:44648))
at s
([https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:44886))
at E
([https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:48429))
at b
([https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:48166))
at h
([https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:47294))
at p
([https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:46684))
at Object.Nt.updateContainer
([https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:50943))
at
[https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:62380)
at Object.Rt.unbatchedUpdates
([https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:49691))
at gn
([https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:62349))
at uo.render
([https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:27:29068))
at e.<anonymous>
([https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:38:169332))
at r
([https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:11:38490))
at a._invoke
([https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:11:39610))
at a.e.(anonymous function) [as next]
([https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:11:38669))
at r
([https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:38:167472))
at
[https://jordaneldredge.com/projects/winamp2-js/built/winamp....](https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:38:167566)

------
stevefan1999
My holy, how did you port that!

~~~
captbaritone
I wrote a lot of JavaScript :D

------
caffed
It Kicks the Llamas Ass!

------
moon4u
>Winamp 2.9 in HTML5 and JavaScript

[https://i.imgur.com/Br00TCn.gif](https://i.imgur.com/Br00TCn.gif)

