Teknidermy Editor's Notes The Future of Tek Cornering Garoo The Cephalopod Lover Federal Arrest Working in Groups Descending into WinAmp3 Whodunnit? Table of Contents
Teknidermy Nine
Descending into WinAmp3

In this article annex tutorial I will prove two things:

  1. that the so-called “hard” XML is easy
  2. that the so-called “hard” WinAmp3 is easy

One follows the other so to speak. I've noticed that whenever either XML or WinAmp3 is mentioned, the flock instantly reacts with cries like “oh, that's too difficult for me”, which sometimes makes me wonder: either I am really intelligent, or this community/scene (whatever you prefer) consists of idiots.


So time for a brief intro on WinAmp3 skinning. I'll start off with some words on XML, the language WinAmp3 skins are written in; then I'll discuss a very very basic skin. Phase three will be to get that very basic skin to function and I'll finish with some (general) pointers on how to continue.

phase one: the basics of XML

XML, short for eXtended Markup Language, is a simplified form of SGML, Standard Generalised Markup Language, which has been an industry standard in desktop publishing for over a decade now. Another simplified form of SGML is HTML, the language in which websites are written.

Many find HTML complex already and that's just a simplified form of SGML, so the complexity of that must be enormous to them (note that I have never ever encountered SGML, so I'm might be making all this up). It's what the World Wide Web Committee though anyway, and they come up with all these standards. In order to make pure data more accessible, they've created XML.

It's a very interesting language in that it consists of very little rules which allow for a lot of diversity. Where in HTML you have predefined tags which are supposed to do predefined things (for example: this is <i>italic</i> text will display in a browser as this is italic text), XML is completely open. In XML you don't have predefined tags, you (or rather, the developer) define them yourselve. This means it's a bit of building castles in the sky; unlike HTML, it isn't fixed what an XML file does. It depends on the app that handles it.


Confusing? Let me get on with some examples then. An XML-file consists of two things: a declaration of all elements in the file and the elemements themselve. The declaration (or Document Type Declaration, as the formal term is) defines what kind of elements there are in an XML-file of that type, how they are structured and what kind of data they can contain. Or in other words, it's a sort of template. This DTD-thing is the only “hard” part of XML. I myself have yet to figure out how it exactly works. Luckily, you can omit it, and so I will.


The second thing an XML-file is made up off, are the actual elements and the data they contain. XML is a container format, it does nothing besides packaging data in a readable form. How these elements work is best explained through a sample XML-file:

   <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <article>
     <title>Descending into the Depths of WinAmp3</title>
     <author>craeonics</author>
     <description>
       A look at the inner workings of both XML and WinAmp3's skin format, both
       of which are considered hard by the masses, and neither of which actually 
        are.
     </description>
   </article>

The above could be a way of storing information about tek articles. The first line is what declares the file as an XML-file. version indicates the XML-version (which is usually 1.0), encoding defines the character set used. Encoding is usually of no interest to English speaking people, because it has to do with how special characters like á, è and so on, are encoded in the file. UTF-8 means it's Unicode. I have no idea what standalone means (I have yet to read the XML-specification), but it doesn't really matter, 'cos this is a line you just copy from file to file without changing it.


The rest of the file is more interesting and demonstrates the basic principles of XML. Everything within angled brackets (< and >) defines an element. An element is a container that can contain data. It starts with <element_name> and ends with </element_name>. Everything in between is data in that element. So in the above example, we have an element article, containing an element title, author and description.


For comparison, if this were an .ini-file, it would look like this:

   [article]
   title = Descending into the Depths of WinAmp3
   author = craeonics
   description = A look at the inner workings of both XML and WinAmp3's skin 
     format, both of which are considered hard by the masses, and neither
     of which actually are.

The difference with an .ini-file, however, is that elements in XML-file can be nested (placed inside each other, like title is placed inside article) forever, which is impossible in an .ini-file (well, it can be done, but it will be a big mess because of the lack of a hierarchy in the file).


Alternatively, the above example can also be written as:

   <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <article
     title="Descending into the Depths of WinAmp3" 
     author="craeonics"
     description="A look at the inner workings of both XML and WinAmp3's
         skin format, both of which are considered hard by the masses, and
         neither of which actually are." />

So the elements of article in the first example, have become parameters of article (and are thus placed inside the article tag). There is little difference between an element inside an element and a parameter. Just that an element can only have one parameter of the same kind, while you can have as much elements of the same name as you wish. If I wanted, I could've put in six title elements and it would have caused no problems, but doing so as a parameter would. Thereotically speaking ofcourse. The interchangeablility of parameters and elements all depend on the app that will handle the file.

Two things to note here. First of notice how all parameter values are placed between quotes (highly obnoxious, but required) and secondly, notice the /> at the end. An empty element (meaning: an element with no data (not counting parameters)) can be written as either <element_name></element_name> or <element_name/>.


That's basically all there is to XML (aside from DTD's, which I'll skip). Let's move on to WinAmp3.


phase two: a very basic WinAmp3 skin

The reason for that long and winding story on XML is that WinAmp3 uses XML as its skin format. About time too I'd say. Now take a look at this very basic WinAmp3 skin. It doesn't do anything yet, but you can move it around (and notice how WinAmp3 correctly handles PNG-transparency, you can see through the wings *drool*).



In order to create a WinAmp3 skin, you first hop over to its skin folder and create a new directory. The name of the directory is the name of the skin (in this case beast). Now make an image of how you want your skin to look and save it into this directory. In my case, I drew this insect/beast in Flash and exported it as .png so I could get a nice opaque bitmap without all the Photoshop antialiasing nonsense. I named this image beast.png.


Then create a textfile in this directory named skin.xml. This is the file WinAmp3 will be looking for. Open skin.xml in Notepad and enter the following (replacing the name of the image file (beast.png) with how you named it ofcourse):

   <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <WinampAbstractionLayer version="0.7">
     <skininfo>
       <name>beast</name>
     </skininfo>

     <include file="../default/xml/studio.xml"/>
     <include file="../default/xml/gamma-presets.xml"/>
     <include file="../default/xml/thinger.xml"/>
     <include file="../default/xml/minibrowser.xml"/>
     <include file="../default/xml/components.xml"/>

     <elements>
       <bitmap id="beast.background" file="beast.png"/>
     </elements>

     <container id="main" name="Shadow of the Beast">
       <layout id="normal" background="beast.background">

       </layout>
     </container>
   </WinampAbstractionLayer>

I'll this discuss it line by line, but first save this and fire up WinAmp3. Right-click on it and got to the skins menu. You'll see your own skin listed. Load it and marvel! In my case, I got the above screenshot and was amazed to see an app properly dealing with .png transparency (I already said that, but I am still baffled). You can't really do anything with it, other than move it around, but it's a good first start. Note that this is the first time I ever made a WinAmp3 skin, so if I get this far with no mistakes whatsoever on my first go, it can't be hard, right?


Okay, so how does it work? The first line: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> defines this file as an XML-file. The XML-standard requires it. No need to modify it, just copy-paste. Now look at the second and last line, <WinampAbstractionLayer version="0.7"> and </WinampAbstractionLayer>. These define the so-called root element, the element in te file which contains all other elements. WinampAbstractionLayer just means WinAmp3 skin. The version="0.7" parameter is there to keep WinAmp happy. I omitted it first, which resulted in WinAmp complaining about this being “a skin in an old format, which might crash this WinAmp3 build”.

Next up is an element called skininfo, containing another element called name. These define information on the skin, in this case its name. Other elements which can be put inside skininfo, are version (version of the skin), comment (a short description), author, email, homepage and screenshot, which is the name of the file to be displayed as preview of the skin.

Then follows something interesting. Seeing WinAmp3 is a menacing task to skin, with loads and loads of windows, controls and what not, you can split things up into separate files to keep it manageable. The include element lets you include another .xml file, which defines a particulart part of the skin. In this case, I opt only to skin the main window and to use the default skin for the other bits. So I include all these default .xml files, which will ensure the rest is skinned as well, be it not by me. Good for lazy skinners like me. The main window is the most flexible one anyway, as far as I can see, other windows are much more restricted to rectangles.


We're still not at the actual layout definition, the placement of all elements. First we define all bitmaps, cursors, colours and what not. This is done in this piece of code:

   <elements>
     <bitmap id="beast.background" file="beast.png"/>
   </elements>

It basically means we can now point to the file beast.png by using the name beast.background. Whatever you name your elements is entirely up to you. I could've called it banana.split and it would still have worked. To define multiple bitmaps (or to define colours, fonts or cursors), you can add multiple <bitmap> elements (or <cursor>, <font> or <color>, but I'll limit this article to what's in this skin).


Finally we reach the part where all the magic happens:

   <container id="main" name="Shadow of the Beast">
     <layout id="normal" background="beast.background">

     </layout>
   </container>

This is the part in which the main window is defined. A container is a grouping mechanism for multiple layouts. Here we have a (required) container with the id main, containing a (required) layout with the id normal. WinAmp will look for a container with the id main, containing a layout element with the id normal in order to draw its main window. A layout is the skin of a window, meaning you can have multiple skins for a window (by having multiple layout elements) by putting them in the same container. For example, a normal mode and a windowshade mode.

See the name of the container? That's the name of window, which WinAmp will display in the context menu if you right-click on it.


Alright, so a layout is the point where we finally see the skin being defined. Like I've said, this is a very simple skin, it doesn't do anything. If you look at the code you'll see why: the layout element is empty. I've only defined its background parameter (which uses the id which was defined in the elements section. In the next section, we'll fill this layout with some buttons and make the skin play files.


phase three: a simple functioning skin

Alright, this will be the exact same skin, but this time functional (be sure to grab the file!). So no new screenshot. Instead, I'll spook you with the full code of the skin.xml and tackle that line by line (well sort of). See if you can make sense of it.

   <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <WinampAbstractionLayer version="0.7">
     <skininfo>
       <name>beast</name>
       <version>2</version>
       <comment>
         Very very basic skin to demonstrate some stuff for a 
         Teknidermy article
       </comment>
       <author>craeonics</author>
       <email>tek@ecliptic.dds.nl</email>
       <homepage>
         http://www.teknidermy.com/issue/9/descending_into_winamp3/
       </homepage>
       <screenshot>screenshot.png</screenshot>
     </skininfo>

     <include file="../default/xml/studio.xml"/>
     <include file="../default/xml/gamma-presets.xml"/>
     <include file="../Default/xml/thinger.xml"/>
     <include file="../default/xml/minibrowser.xml"/>
     <include file="../default/xml/components.xml"/>


     <elements>
       <bitmap id="beast.background" file="empty.png"/>

       <bitmap id="beast.wing.left" file="wing.left.png"/>

       <bitmap id="beast.claw_previous.normal" 
         file="claw_previous.normal.png"/>
       <bitmap id="beast.claw_previous.over" 
         file="claw_previous.over.png"/>
       <bitmap id="beast.claw_previous.down" 
         file="claw_previous.down.png"/>

       <bitmap id="beast.legs" file="legs.png"/>

       <bitmap id="beast.antenna.left" file="antenna.left.png"/>

       <bitmap id="beast.shield_load.normal" 
         file="shield_load.normal.png"/>
       <bitmap id="beast.shield_load.over" 
         file="shield_load.over.png"/>
       <bitmap id="beast.shield_load.down" 
         file="shield_load.down.png"/>

       <bitmap id="beast.shield_stop.normal" 
         file="shield_stop.normal.png"/>
       <bitmap id="beast.shield_stop.over" 
         file="shield_stop.over.png"/>
       <bitmap id="beast.shield_stop.down" 
         file="shield_stop.down.png"/>

       <bitmap id="beast.shield_pause.normal" 
         file="shield_pause.normal.png"/>
       <bitmap id="beast.shield_pause.over" 
         file="shield_pause.over.png"/>
       <bitmap id="beast.shield_pause.down" 
         file="shield_pause.down.png"/>

       <bitmap id="beast.shield_play.normal" 
         file="shield_play.normal.png"/>
       <bitmap id="beast.shield_play.over" 
         file="shield_play.over.png"/>
       <bitmap id="beast.shield_play.down" 
         file="shield_play.down.png"/>

       <bitmap id="beast.wing.right" file="wing.right.png"/>

       <bitmap id="beast.antenna.right" file="antenna.right.png"/>

       <bitmap id="beast.claw_next.normal" 
         file="claw_next.normal.png"/>
       <bitmap id="beast.claw_next.over" 
         file="claw_next.over.png"/>
       <bitmap id="beast.claw_next.down" 
         file="claw_next.down.png"/>
     </elements>


     <container id="main" name="Shadow of the Beast">
       <layout id="normal" background="beast.background">
         <layer x="0" y="40" ghost="0" move="1" 
           image="beast.wing.left"/>

         <button action="PREV"
           x="5" y="189" tooltip="Previous"
           image="beast.claw_previous.normal"
           hoverImage="beast.claw_previous.over"
           downImage="beast.claw_previous.down"
         />

         <layer x="27" y="62" ghost="1" move="1" 
           image="beast.antenna.left"/>

         <layer x="80" y="135" ghost="0" move="1" 
           image="beast.legs"/>

         <button action="EJECT"
           x="160" y="95" tooltip="Load file"
           image="beast.shield_load.normal"
           hoverImage="beast.shield_load.over"
           downImage="beast.shield_load.down"
         />

         <button action="STOP"
           x="35" y="172" tooltip="Stop"
           image="beast.shield_stop.normal"
           hoverImage="beast.shield_stop.over"
           downImage="beast.shield_stop.down"
         />

         <button action="PAUSE"
           x="35" y="167" tooltip="Pause"
           image="beast.shield_pause.normal"
           hoverImage="beast.shield_pause.over"
           downImage="beast.shield_pause.down"
         />

         <button action="PLAY"
           x="37" y="72" tooltip="Play"
           image="beast.shield_play.normal"
           hoverImage="beast.shield_play.over"
           downImage="beast.shield_play.down"
         />

         <layer x="80" y="0" ghost="1" move="0" 
           image="beast.antenna.right"/>

         <layer x="125" y="47" ghost="1" move="0" 
           image="beast.wing.right"/>

         <button action="NEXT"
           x="82" y="159" tooltip="Next"
           image="beast.claw_next.normal"
           hoverImage="beast.claw_next.over"
           downImage="beast.claw_next.down"
         />
       </layout>
     </container>
   </WinampAbstractionLayer>

As usual, we start off with the XML-declaration, follow by the opening tag of the WinampAbstractionLayer container. Then we get the skininfo bit, this time it;'s the full deal. Seeing I'm still way too lazy to do a full skin, I'll stick to the main window again and just include the rest from the default skin.

Then we get the element section, which is similar to the previous skin, be it much more elaborated. This version of the skins is build up of lots of images for every part and this is the section in which they are defined. Note how I try to give each image a logical id. Clear names is always a good idea. Makes the code more readable. Also note the order in which I define the elements. You can define them in every order you like, it doesn't matter, but I opt to define them in the order in which I use them, again for readability.


The container and layout bits are the same as last time, but this time the layout contains more elements. There are two new element types, as can be seen in this short snippet:

   <layer x="0" y="40" ghost="0" move="1" image="beast.wing.left"/>

   <button action="PREV"
     x="5" y="189" tooltip="Previous"
     image="beast.claw_previous.normal"
     hoverImage="beast.claw_previous.over"
     downImage="beast.claw_previous.down"
   />

All elements within a layout are stacked on top of each other when displayed. The first element (at the top of the file) will be at the bottom and each element after that will be drawn upon that. A button is an element that allows you to do thing, a layer is just an image (it can do things, but not in this article).


A layer has a number of parameters. x and y speak for themselves. Their value is the offset against the top left corner of the background image. The background image also defines the maximum area wherein subsequent elements can be displayed. So if I have a background that is 200 pixels wide and I use a layer with x='300', it won't be visible.

The parameter image points to the id of the image to use. This id was defined in the element section. ghost and move define how the layer will interact. If ghost='0' it will intercept all mouseclicks and mouseovers within the entire rectangle of the image. A bit weird, 'cos I thought it would only grab these on the non-transparent bits. What does this mean? It means that if you put a layer on top of a button (I will get to those later), the button will not respond to mouse actions because the layer is intercepting these. If you set ghost='1', the layer will let everything through and the button will function as expected.

A value of move='1' will make it possible to move the window around by clicking and dragging on this layer. And it may come as no surprise that move='0' will mean that you can't drag the skin via this layer. Note that you can't drag the window by dragging this layer if ghost='1', because since the layer is letting all mouse actions through, it won't notice someone is trying to drag. Therefore when ghost='1', move='0'.


A button is more interactive, it will respond to mouseovers and mouseclicks. hoverImage and downImage are the (id's of the) images for these states. tooltip doesn't seem to work yet, but I include it anyway. It's the help message you should get when you hover your mouse over a button for some time, just like in most apps.

All the nitty gritty happens in the action parameter. As you see I've used values of PREV, NEXT, PLAY, PAUSE, STOP and EJECT. This it what makes WinAmp go. So if you give a button the action PLAY, it will play the currently selected song. EJECT is cryptic, but just means "load file".

Some other values for action are CLOSE, MINIMIZE (guess what those do?) and SWITCH. This last one lets you swith between layouts, so you can swithc between a normal window and windowshade mode by making a button with action='SWITCH' and using the additional button parameter param='id', where id is the id of the layout you want to switch to (if you check my skin you'll see there's only one layout (called "normal"), so I didn't boither to use a switch button). So to switch to the layout with the id="shade", it would become something like this then:

   <button action="SWITCH" param="shade"
     x="5" y="189" tooltip="Previous"
     image="beast.switch.normal"
     hoverImage="beast.switch.over"
     downImage="beast.switch.down"
   />

That about all there is in this skin. Note how I've defined the layer with the left wing first, which is followed by the previous button and so on and finish with the next button. This is the stacking I've mentioned: the left wing is in the back and the next button in the front, with the rest in between in the order of their code.


phase four: figure it out yourself!

This should be enough to get you started. There are a number of other display elements other than layout and button, like togglebutton, which is a button which will stay down until you press it again (like the equalizer button and such). slider is used in volume and seek bars, while animatedlayer lets you make animated layers, cool! And there are more elements and I haven't even mentioned scripting yet!


So plenty of stuff to explore. The best way to figure things out is (as always) to disect existing skins and see how they are done. But a reference would be handy. There was such a reference (and I've stolen a lot from it), but it seems to have vanished. Too bad.

I know of two resources on this (other than Nullsoft's developer section): a simple tutorial and a scripting reference. A good skin to disect would be the Simple skin, which is really simple and demonstrates some other methods, like using a region of a bitmap as an element (so you can make one bitmap and grab all your buttons from it by specifying regions), after that take a look at the default skin and more complex one, like Boxor.


Doh, I knew I'd forgotten something. WinAmp3 skins are distributed in .wal format. This is just a renamed zipfile of all the files used in the skin. So if you want to see what's inside a skin, rename the .wal to .zip and unzip the thing. Similarly if you have a skin and want to upload, zip the lot up and change the extension to .wal.


Okay, so this article may have lead to more questions than it has given answers and WinAmp3 skinning may not be as easy as I claimed it was, but it sure as hell isn't difficult or impossible. It's a challenge and we need those if we want skinning to evolve, else we'd be stuck with basic, restricted formats like the one it originally started with.

A final note: this article may seem a bit rushed. Hey, it is. I've been wasting my Easter holiday on putting together Tek Nine and this was just about the last thing that still had to be done, so it's been quick and dirty. Let's hope I've got things ninety percent right this first time and it has been useful to you.

— craeonics, March 31st/April 1st 2002

addendum


Various people have noted that the second skin doesn't seem to work. Well, yes and no. I works fine on my machine, WinXP running WinAmp3 build 466. That screenshot up there is no fake. But I took a peek under 98 and it didn't seem to do anything. The first skin did work, but without the alpha. So it seems alpha is for 2000/XP only.

Two solutions where given (in the comments below). The first one is adding the parameter desktopalpha='1' to the <layout> element. Doesn't seem to do a thing in 98 though.

The other solution is to use the file screenshot.png as background image instead of empty.png. This still does not give you alpha transparency, but the skin will be visible (be it ugly). This is (I guess) because all the buttons and layers are drawn only on top of a visible background pixel when there is no alpha support.

Supa just gave a third solution, which is simply switching on enable desktop alpha in WinAmp's options. That should fix things on XP. I probably forgot about this, because I always switch on stuff like that on my first go and hadn't played with WinAmp3 for a while.

Uh oh, word has it, I messed up the second file (beast2.wal). According to Doreen:

"you forgot to zip up the beast.png image for the bg on that second file and it was pointing to an empty.png so I just stuck the image in there from your first file and renamed the file line to point to it,

double check it please to be sure, but I finally got it working over here..."

But it'll have to wait till I get home. *craeonics ain't got WinAmp3 here at work.

craeonics {04.02.2002|01.25}

Poor Poor crae...
well me gots it! =)
/goes off to play a tune now..... hehe

Doreen {04.02.2002|08.48}

wow, thats an awfully cool looking skin

mayor quimby {04.02.2002|10.26}

so, has anyone pointed this brill little piece out to the almighty machine at Nullsoft?

kenray {04.02.2002|13.27}

heheheheh, someone has, now.

thank you sir.

mig {04.03.2002|00.38}

They've just recently seen it. :) And they like it.

Jarsonic {04.03.2002|00.41}

Spring is in the air, the birds are tweeting, the girls are dressing up (or down) and The Almighty Machine is buying me beer!

*craeonics lays back and enjoys the ride

Oh and by the way, that second file works fine for me as it is now. Perhaps you're using an older build, Doreen? *craeonics used alpha/beta/whatsitcalled 466

craeonics {04.03.2002|01.56}

nope me is using that one too, well it would not work for me at all until I did the above and reset the skin, dunno why evil bunny...

Doreen {04.03.2002|04.15}

*shoggot thinks that w/ skills shown on tek, crae should be doing a webcomic.

That bug is pure beauty.

shoggot {04.03.2002|07.12}

Nah, it takes me more than an hour to draw just one of these graphics.

craeonics {04.03.2002|08.34}

crae you're sucha bragger! =)
and listen to Daaaaa oh shoot! I forgot after me and shog finished up the interview I promised him I would never call him Dad again... I messed up there

okay well listen to Shog =)
hehe

Doreen {04.03.2002|08.37}

Bragging? That would be: "and this done with a tablet, something which I'm really not good at (damn thing keeps slipping away)" or "nah, these are just quick sketches, the graphic for the skin was done in fifteen minutes".

craeonics {04.03.2002|09.02}

*craeonics is an arrogant bastard

craeonics {04.03.2002|09.02}

great intro here... I gotta agree with you, it is definitely not as hard as some people think... I know, I've tried myself
The hard parts is to make things that slide out and such, where you have to use scripting *shudder*

Anyways, a good thing is perhaps to define the elements in to a spesific file and add it by using an include tag...
I don't know why though... the default skin did it so I do it to :P heh...

zkreso {04.03.2002|11.07}

ok, to make the skin work, put desktopalpha="1" in the tag :P

zkreso {04.04.2002|10.03}

what the? put the desktopalpha="1" in the LAYOUT tag

zkreso {04.04.2002|10.05}

One thing: in XML all tags must be in lowercase.
I remembered this great article about XML and XHTML (the replacement for HTML using XML syntax), here: [link]

kmr {04.04.2002|12.30}

nice peice - but you didnt mention the bizarre "About" box hidden in the last Winamp3 Beta :)
Clue: use Res-hack to dig around....

integer {04.04.2002|13.55}

desktopalpha? Oi? Hmm, never heard of that (I am notirously misinformed). But it works fine without that for me. Or is that special 98/ME compatibility stuff? (skin was made in XP)

craeonics {04.05.2002|08.45}

The skin doesn't work for me, the mainscreen (The shadow of the beast) doesn't show up at all. I'm running Win XP and I have the latest beta (downloaded from the winamp.com mainpage).

supa {04.06.2002|14.52}

unzip the file and rename the "Screenshot" image to "beast"
then open the skin xml file and go down 18 lines to:


rename the file="empty.png" />

To: "beast.png"



rezip, rename the ext to .wal and throw it back into the winamp directory (skin folder)

that will get the skin running until crae does whatever he needs to do to it, I'm not sure what is the proper way to do it, I just dummied it up and got it working this way...

Doreen {04.06.2002|15.54}

Sorry some tags dissapeared that I copied for you supa out of the xml file to help you find the line but it's okay I think what it left here makes enough sense for you, if not e-mail me.

Doreen {04.06.2002|15.56}

hmm... either that or you could just add desktopalpha="1" to the layout tag...

you see, he set the background as empty.png, and unless desktopalpha is turned on (1) then the system will assume that this skin is not running with transparencies enabled... therefore the beast.png which is transparent will not be able to be put on top of empty.png, because the transparencies are not enabled...

so yes, either enable desktopalpha or change the background (as doreen said) to beast.png

the option doreen mentioned is perhaps the best, because then ti will work on other systems than winXP/win2000 - since only those two can handle the desktopalpha tag...

zkreso {04.07.2002|03.25}

Yey, thanks to zkreso and doreen I got the skin up and running! There's still something wrong with it - the wings dont show up at all. For some reason I can see the black borders around the wings, but the part which is supposed to be transparent is gone...

zkreso: I tried the desktopalpha="1" before I posted, it didn't do any good for me.

Heh, this is kinda ironic that a article posting how Winamp3 is easy to skin, has a skin which doesn't work at all. However thanks to Craeonics for posting this article, it has given me easy to understand resources to start with. I've been wanting to try out Winamp3 skinning for some time, but the amount of scripting (I though it would take) has kept me away from this.

supa {04.07.2002|06.32}

*craeonics raises hand

But, er, why does it work without that on my machine then?

Alright alright, you win, I'll add it.

craeonics {04.07.2002|06.36}

But anyway, supa, as you can see, if I can make one by just messing around, everyone can. Plenty of stuff you can do without having to script.

craeonics {04.07.2002|06.57}

Oh, nevermind. I went into winamp's options and selected "Enable desktop alpha", and then changed the desktopalpha="1" thingy, and the skin works perfectly now. So this turned out to be (at least somewhat) a pebcak* problem.. :)

*) the problem exists between the chair and keyboard

supa {04.07.2002|07.56}

Well when you add it please let me know cuz I lost my freakin wings!! =(
I don't have a clue what this is in the file but was messing around w/ it and got the thing working and went back into it messing around w/ it to experiment and changed something and now my wings are not showing up...

supa can you please send me your skin file if you got it working or crae please send me the file when your done updating it?
I must have this bug! hehe
Thanks

Doreen {04.07.2002|12.29}

I'm not going to update the file. This addendum ^^^ should suffice. 'Cos again... it works fine in XP, where do you think that screenshot comes from?

craeonics {04.07.2002|15.41}

And... it's a good way to practice WinAmp3 skinning if you can fix it yourself!

*craeonics is lazy

craeonics {04.07.2002|15.43}

okay so until I resolve this me is stuck w/ a lobster instead of a flyin bug! =(
I tried to add another line for the desktopalpha w/i the layout tag (and now I'm getting a parsing error) so I dunno what I messed up but now I've lost both my wings...
and I did have it working somehow the other day until I decided to disect this bug! why can't I leave things alone *sigh*
anyways,
*Doreen runs off to find zkreso's e-mail and beg him for the fix cuz me is now too lazy to figure out what I did =(

Doreen {04.07.2002|16.15}

If you had it running once, you could download the pre-messed up version again. Perhaps you forgot to close some tags or forgot a " somewhere?

craeonics {04.08.2002|02.15}

Zkreso to the rescue! (Thanks)
I'll make a "copy" of his file and open it up and compare it to mine and find the error I made as soon as I get the time later on...
in the mean time I got my bug back! =)
and again, great job on that bug crae it's beautiful, I love it!

Doreen {04.08.2002|07.34}

This is a really good tutorial. Thank you for taking the time to write it. :)

-Ghislain 'Aus' Lacroix
Nullsoft

Aus {04.08.2002|22.27}

Found some more tutorials/usefull links:

tutorial: [link]
WinAmp3 skin/scripting forums: [link]

craeonics {04.09.2002|04.23}

yup, I messed up on the tag (rediculous it was staring me right in the face & I did not even see it)

Doreen {04.09.2002|10.28}

Great tutorial. I'm planning to make a Futurama skin for sure. :)

Neo {04.09.2002|17.45}

fking hell what a great tutorial. This is the first one that has actually wokred for me. Thanx alot man

SGT {04.10.2002|02.06}

crae da man

amoebe boys {04.10.2002|13.05}

We are very strong

Antonio {04.11.2002|09.27}

i'm computerill-literate...lol...and i don'tknow howtospel either...:(

wahhhhh... {04.11.2002|19.46}

Im running XP and winamp3 build 466 and the files still don't work. Not to worry, as far as I'm concerned you've paid your dues to society. Excellent job!

Dave {04.12.2002|21.44}

Dave you gotta have this bug it's see through wings are sheer ecstasy!
unzip the file then open up the skin.xml file & go down to line "44" where it says:
**
and change it to:
* *
zip it back up, rename the file ext. to .wal and drop it back into the "skins" folder w/i your winamp3 directory and reset the skin, then you should be good to go =)

Doreen {04.12.2002|23.02}

shoot! where did the tags go? lemme try again here w/o those greater or lessor thingys
line 44 is: layout id="normal" background="beast.background"

but should be:

layout id="normal" background="beast.background" desktopalpha="1"

Doreen {04.12.2002|23.05}

just tag that last line up like the rest of the ones in the file and the bug will light up for you ;)

Doreen {04.12.2002|23.08}

"okay so until I resolve this me is stuck w/ a lobster instead of a flyin bug!" - ROFL

well this has got to be the longest thread in teknidermy's history... unless there's a "I'm listening to" thread here somewhere...

zkreso {04.13.2002|05.04}

I'm starting to feel like I have this "miracle machine where all skins work fine". So is there anyone for whom it does work (without modifications)?

craeonics {04.15.2002|02.38}

hmmm ???
Did I hear a pin drop?
(I tried to tellya evil_bunny from the very begining but you no listen to me)
it's okay though cuz if they buy me the plane tickets I'll go to their houses and fix the file for them so the bug will work...

Doreen {04.16.2002|18.43}

Your skins are so COOL!!

Ivan {04.17.2002|14.18}

Ja sam najveci debil koji postoji na ovom svetu, a samnom zajedno i Zojin! Nedic, bre, moze da nas prevaspita, on je pravi "diplomirani" manijak. Dakle, konstatujem da je Zojin najveci DEBILNJAK koji postoji na svetu, a ja sam odmah za njim. Hello! from Bosnia!!!!!!!!

Bosic Goran {04.17.2002|14.21}

Humm ég hef ekki hugmynd um hvaš žiš eruš aš tauta um žannig aš žiš getiš fariš ķ rass og rófu žvķ aš žiš vitiš ekkert ķ ykkar haus og vitiš ekkert hvaš žiš eruš aš gera og getiš ekki einu sinni śtskżrt žetta į manna mįli og žykist vera eithverjir proffar sem vitiš allt en nei žaš eruš žiš aldeilis ekki žiš eruš bara aumingjar meš hor og hafiš ekki hugmynd hvaš žiš eruš aš gera žannig aš takk fyrir mig og veršiš ykkur aš góšu........

Ragnheišur Karlsdóttir {04.20.2002|16.58}

Cool Winamp

Drew {04.23.2002|14.39}

a shto to nas bole kita ovde?

aftershock {04.23.2002|18.15}

uh oh! again... hehe
what's that?

Doreen {04.24.2002|09.36}

the alpha effect works fine in xp and 2k because its built into xp and 2k if you look in the wvs in the vis settings it has an enable alphablending check box and an amound slider ... its the same bit the skin uses to show the transparent wings

.
.
Penguins burn when next to the SUN...

KBZ {04.25.2002|11.19}

The sample skin does work on mine computer, i'm running win ME. It says "The skin you are trying to load is not a supported skin for Winamp 3." or smoething like that

SkInNeR {04.26.2002|18.26}

cooooool

Kebab007 {04.30.2002|08.34}

This is getting weirder and weirder.

*craeonics wonders from which asylum these loonies escaped

craeonics {05.01.2002|10.18}

In this article annex tutorial I will prove two things:.... hangon... In this article...... nope still havent got it right.... In this... ok thats it... 3am.. ill try when im like awake.. heheh ill congrats someone when i know what it does! hehe ciao from Australia

TrigZ {05.01.2002|12.01}

crae this little spot feels more International to me then the whole net when I go outside this page! hehe =)
(and what in the world are these ppl saying to you?)

Doreen {05.01.2002|20.11}

rocking man jo

lola {05.02.2002|12.01}

jo evry bodey this rock on man

mayor quimby {05.02.2002|12.01}

The beast 2 skin does not run.
I got the alpha to work on the first one.

Do I have to do the same for all the rest in beast 2?

Paige {05.06.2002|23.18}

Yep, the second one is based on the first one. So anything you've changed in the first one should also be changed in the second one.

*craeonics 's being cryptic again

craeonics {05.07.2002|10.34}

soooo mean dutchy...
*Doreen runs back to my sexy flyin bug =)
hehe

Doreen {05.07.2002|18.53}

Just explain to me exactly what I have to do to make the second skin work.

Paige {05.07.2002|21.58}

Read the addendum, it explains all.

craeonics {05.08.2002|02.14}

I didn't read your damn addendum .. I tried something else that works, which has not been mentioned anywhere.

I deleted your ugly skin too,... graffiti-art is so summer-2001 .. get with the trends

Paige {05.08.2002|12.17}

Can someone help me create a skin that actually works?

nazbigbro {05.08.2002|17.18}

guys... the skin does work, but you need to work for things that are worth it! so go and do this...
unzip the file and open up the .xml skin file and change one simple thing in there:
line 44 is: layout id="normal" background="beast.background"
but should be:
layout id="normal" background="beast.background" desktopalpha="1"

(then save and re-zip it up and stick it in your winamp directory)

after that go into your winamp options and stick a bullet in "Enable desktop alpha" and that's it! =)
not toooo hard...

crae you're soooo summer 2001 get w/ it! hehe
hmm I won't mention when I did graffiti and still like it...

Doreen {05.08.2002|18.05}

veldi bra som sagt veldi bra

jon vegard {05.09.2002|03.41}

Ohhhhhhhhhhhhhhhhhhhhhhhhhhhhh Yeah!!

Elite {05.09.2002|13.00}

Actually, graffiti is rather 80s. Wouldn't it be a bit sheepish if I were to follow trends?

Besides, this isn't for the lazy newbie user who wants to use the skin... It's barely functional, just an example for the true skinners.

craeonics {05.10.2002|02.21}

I couldnt get any skin sutable for this winamp

rahul {05.11.2002|00.49}

can any one tell me where I can find skin for winamp 3.0 if possible plz send an email to rahulemmaty@eth.net

gangreen gang {05.11.2002|00.51}

cool xml article, really enjoyed it! - enjoyed even more reading how incompetent some people are at installing it!! :-P keep up the good work.................

tommy c {05.14.2002|11.25}

Hey! ... nice tutorial. Even for a programmer like me ;-) ...
Thanx.

Abhie {05.14.2002|17.16}

That's nice............... but still too complicated

Raden Mas Nggozal {05.16.2002|16.31}

thats good.but its colour is not good

waqas ahmed from pakistan {05.19.2002|05.00}

WILL SOMEONE HELP ME PLEASE! I wanna make my own skin, BUT no one will show me how! someone Has to help me! IF U CAN E-MAIL ME AT~ditzyblonde07@hotmail.com
THANKS A BUNCH!

always_luv12 {05.20.2002|13.55}

What a bunch of idiots: "HELP ME PLEASE!" What the hell do you think the article's here for!?

I hope you like spam...

spam spam spam spam spam spam spam ...

nonono {05.20.2002|20.53}

Email me and tell me in inglish how to make a skincuz i'm fucking cunfused

E-mail Holy_man10@hotmail.com

Ben {05.22.2002|21.05}

Nice article. For those of you that are confused, may I suggest XML for dummies? ;-)

SoRRoW {05.25.2002|21.12}

This article was legendary. Very useful. One question though. Have you rigged this page so that you can't view the source code or do I just have some stupid bug in my explorer??

Me {05.25.2002|23.39}

I WOULD LIKE TO MAKE AN WINAMP SKIN

#1dj {05.26.2002|17.05}

Still doesn't work for me, even after the suggested modifications. The bug shows up and everything, but the wings ain't there.

Storm {05.26.2002|19.58}

Me: nope, haven't done a thing.

Storm: are you on Win95/98/ME or so? Those systems don't support alpha transparency. So you can't see the wings there. Screenshot was taken on XP.

craeonics {05.27.2002|09.54}

What about the skin animations?

Josnap {05.28.2002|03.39}

hola a todo el mundo entero y parte del estrangero no tengo ni idea de que va esto pero me apetecia escribir algo y de que tu lo leyeras, muchas gracias.

xose {05.28.2002|16.58}

Animation? Where?

craeonics {05.29.2002|07.38}

Me: i can see the source...

GoRKAMoRKA {05.30.2002|22.19}

Okay, okay. Now where will I get a detailed article that explains how to skin the WHOLE winamp3???

Super Nerd {06.02.2002|20.46}

nothing special about it but somthing is there to learn frm it

valasa raju {06.04.2002|01.04}

nice tut, man!
it really rox! and now I believe that winamp3-skinning isn't as hard as it supposed to be!

Toni Tourist {06.06.2002|07.41}

landing after the show, just to tell thanks for the interesting XML explanation and the good links provided...i have yet to try the tut though :p

(although i'm a DA user you may know, i came here through Nullsoft links :))

l-courni {06.06.2002|10.52}

I know I know. Most do (which has its up and downsides).

craeonics {06.07.2002|09.23}

seems this article is the only one getting some action! hehe
(I'm jealous dutchy!) j/k
nosey and checking in to read comments =)
or should I say TRYING to read them, this is so international here wowza!

Doreen {06.11.2002|11.28}

I am satisfied, great article! must go sleep now tho....

Zarquon {06.11.2002|23.40}

craeonics: Thanks. I thought it might be a problem. Yes, I'm on WinME.

Storm {06.16.2002|19.59}

wow

jim {06.17.2002|20.28}

Any idea on why my .png graphics would be being resized when being used with Winamp3?
Ie. a 320x240 px will come out looking like 20x20 px.

I'm useing Flash to create them.
Thanks.

Bru {06.20.2002|14.03}

Hello there great site on winamp3 skinning, I've got it all working the basic button atleast, thanks to this site :o ) , whats next would love to get the seeker bar going ect, would this site be explaining any of that in the future? I hope so, if not does anyone know of a good site explaining the next steps after you have the basic play controls working, Im ready :O ).

Dean {06.23.2002|06.29}

Dean: Unlikely. This was just one article to get people started. Not really planning on any follow-ups or so. I've never even come close to the seeker and such. This skin here was my first encounter with WinAmp3. Anyway, poke around in the simple skin for seekers and such: [link]

Bru: check if your .png is right in any other app. Sounds more like a Flash quirk.

craeonics {06.24.2002|05.17}

wow. very helpful man. ill have to try skinning wa3 sometime, im still improving my skills on wa2 first though. this was REALLY helpful. thank you for making it.

siron {06.26.2002|01.41}

oh, btw, [link]

love to hear from you man!

siron {06.26.2002|01.42}

I can't help noticing...it's odd to me that XML "programmers" (I know, it's a stretch to call you that) can not know that Windows ME and previous can't do the alpha thing because, well, the OS was not built with that capability. 2000 and XP were...that's why it works in XP and 2K and not in anything else. Honestly, folks...and all *I* can program in is QBasic (which is a useless talent in XP, since we lack classic "DOS"...also precludes us from fun games such as Warcraft II [non battlenet edition])...

pepin {06.27.2002|00.07}

'Course I know that. I just didn't mention it. And it is possible to have alpha (generally speaking, not talking about WinAmp3) on 98 and such, but one would have to write one's own alpha routines for it (seen some demos).

craeonics {06.27.2002|02.58}

Indeed, and as far as I can tell, Blizzard did so with Diablo II (at least it's where I noticed it). Sorry to have sounded like a jerk...it was past my bedtime and I was getting cranky.

pepin {06.27.2002|07.34}

despues de mucho meditarlo he llegado a la conclusion de que no entiendo ni papa de esta pagina, si alguien me lo puede contar Water456@msn.com

David {06.29.2002|06.18}

I think David said something about "the conclusion" & papa means either Dad or Potatoes? sheesh have fun crae hehe =)

Doreen {06.29.2002|18.02}

David said, roughly :
"even though I thought hard about it I came to the conclusion that I don't understand anything about this page, if somebody could tell me..."

There you go.
Oh and thanks for the tutorial. Much appreciated.

Wicked Blade {07.01.2002|07.53}

Is there no support for speaker balance in winamp3 ?
I tried something like

id="Seeker"
action="BALANCE"
x="121" y="3"
w="70" h="9"
thumb="player.button.volume"
downThumb="player.button.volume.pressed"
/>

but that guess was not quite right :)
Anyone who knows?

Dennis {07.03.2002|13.16}

Goood Goooooood Guuuud

Batistuta {07.05.2002|05.30}

there is no support for play movies?

keivan amirahmadi {07.05.2002|21.31}

no support movie?

hadi arab {07.06.2002|00.55}

Ok I followed step by step. Even copy and pasted the xml code exactly and all i get from Winamp3 is the following message:
The skin your're trying to load doesn't seem to be a supported skin by Winamp3.

I'm using XP just like you. I wonder if it has to do with me using the latest "MAD" version of winamp3.

Web Hog

Web Hog {07.06.2002|17.10}

Now I moved your beast.wal file into the main \skins directory instead of the subfolder (as suggested) and now I get the following message.

"The skin you're trying to load is ment for an older Winamp3 version.
Are you sure you want to load this skin? (It might crash winamp3)"

It does not crash but the graphics are all messed up and it's hard to move the skin around the desktop, really slow on my P4 1.8Ghz... Smmes that they have changed something in Winamp3 from the last time you worked on "beast".

Web Hog

Web Hog {07.06.2002|17.22}

Possibly, it was built for use on the previous version (remember this article is three months old). I havent downloaded the new MAD-version yet.

Mind you though, I am no expert at WinAmp3. This thing up here is the first and only skin I made for it. The entire point of this article is to prove that skinning it is not that hard (if you can get your hands on some proper documentation).

That goal sort of gets screwed with it crashing everywhere ofcourse.

craeonics {07.09.2002|07.01}

the worst part is, by the time I finish any skin, it all changes... again :o\
I was interested in a complete skin that altered the shape and mapping yet still retain all of the functions like some of the spectacular skins you see on the winamp home page submitted less than a month ago, and still outdated... lol
after reading through all of this and getting anxious to get started I read all of the comments, too bad nothing stays the same long enough for it to matter... gotta love technology and advancement :o\
thx for the info, good or not :oŽ
Da-Chia

Da-Chia@Chiacasa,com {07.09.2002|23.00}

Just wondering if .......

Doesn't Dreamweaver have XML capabilities ?
Hummm,,,,, Let me look......

Yes you can ..... UltraDev4 has XML support .. so in essence I would gather alot of work could be done in DWUD4 and the source code stripped \ edited, if\where needed to be used in WinAmp3.

Just a thought .....

Anyone have UltrDev4 and the time to check it out ..... I have but not sure when I'll get around to messing with it.

Mental {07.16.2002|16.25}

Oh, I believe the XML support is an extension/ add-on.

Mental {07.16.2002|16.27}

NotePad or EditPad will be easier for those have ANY trouble already ....

Have to set up server specs and a bunch of other stuff to get XML to show working model in DWUD4 ....

Mental {07.17.2002|08.03}

non ho capito niente, č tutto in inglese, vorrei sapč una cosa ma come se fą a creare le skin?

stefano {07.21.2002|03.39}

where is 'wasabi.font.default' stored. I want to make the font black.

opt-e {07.23.2002|14.01}

crae you really do need an international translator installed on this page... (but I don't know how much it will help w/ these crazy questions) hehe

Doreen {07.24.2002|21.22}

Teknidermy Editor's Notes The Future of Tek Cornering Garoo The Cephalopod Lover Federal Arrest Working in Groups Descending into WinAmp3 Whodunnit? Table of Contents
Teknidermy Nine
©2002 Teknidermy
(deadlockin' DeskMod for about 0.00037479400634766 seconds)