Introduction to Digital Photography: Part 3

Today we’re concluding our three-part video introduction to the fundamentals of photography. This final instalment will be investigating white balance, ISO, and the relative benefits of RAW and JPEG.


Video Outline

In this final video, we’ll be looking at White Balance, ISO, and the benefits of shooting RAW over JPEG:

  • White Balance: Investigating presets and how they work, along with when you should choose to use a particular setting over another. We’ll use one photo to see how each different White Balance setting affects the outcome.
  • ISO: What is ISO, what’s a “stop”, and how can it help you shoot in low light conditions? We’ll also investigate the trade off with ISO – noise.
  • Benefits of RAW: What are the different file formats available on your SLR, and why does RAW have an advantage over JPEG?

Watch the Video


How Has This Series Helped You?

I’d love to know how useful you’ve found this “Introduction to Digital Photography” series. Even if you’re not a “beginner”, let us know whether you’d have liked to have this guide available when you were first starting out. Your thoughts are really appreciated!

HTML5 Globals and You


Much has been written on the big ticket changes in HTML5, like forms, semantics, and media, but information on the less splashy changes is sparse. While global attributes aren’t the most sexy change of HTML5, they are the change that you will be using over and over and over as you migrate to the new specification.


Introduction: What is a Global Attribute?

While the term attribute relating to HTML might be a bit fuzzy to you, you certainly use them with almost every element that you write. HTML attributes give elements meaning. They also give context. They are both the adjective and verb for an element, if you think of the element as the noun. For instance:

    <div></div>

Doesn’t really have much meaning. It’s a division of the page, and that’s it. When we add an attribute though, it does have meaning:

    <div id="foo" class="bar" style="color: red" title="FooBar To The Rescue"  dir="rtl" lang="en-US" tabindex="1" accesskey="F"></div>

We now have a division that is “Foo” with a class of “Bar”, which has a color of red, a title of “FooBar to the Rescue”, is displayed right to left, is to be read in US English, and when you press the tab button or “F”, it’s the first element to have focus. It’s basic, I know. The attributes are all those things that give elements meaning. The difference in HTML 5 from previous versions of the specification is there are attributes that can be used on any HTML element. These are now global attributes. Beyond the ones illustrated in the example above, there are some new ones that are global as well which will expand the possibilities beyond just boring peanut butter.

“HTML attributes give elements meaning. They also give context. They are both the adjective and verb for an element, if you think of the element as the noun.”


Common Attributes: Which Ones Are Now Global?

This is a relatively minor change in HTML 5. The attributes id, class, style, title, dir, lang, accesskey and tabindex are now valid attributes to have on any HTML element. You want to give a meta tag an id, that’s valid now. It’s even valid to give that same meta element a direction, language, class or any global attribute for that matter. While they might not have meaning at first blush, it’s perfectly valid to define them in any tag that you feel necessary.

    <meta name="description" content="FooBar, making me feel like it is actually FUBAR." id="foo" class="bar" style="color: red" title="FooBar To The Rescue"  dir="rtl" lang="en-US" tabindex="1" accesskey="F">

The above example is perfectly valid in HTML5. That said, where there is no reason to use an attribute, and it looks silly, perhaps the best course of action is to not use that global attribute. A tabindex on a head element might not be the best use of time and energy. The important part to understand is not the odd case of putting a global attribute in something that doesn’t quite make sense, but rather the fact that they are available in any element.

Each of these were common attributes in the past, and while their use were restricted somewhat in the past, you probably already thought of them as global. I actually had to look up id, because I couldn’t think of an element that you couldn’t use it (base, head, html, meta, script, style, title). The old common attributes are just half of the new global attributes though.


Edit Inline: The Contenteditable and Spellcheck Attributes.

The first of the new attributes to look at are contenteditable and spellcheck. They are not mutually exclusive and you can use one without the other, but for the purposes of illustration, it makes sense to look at them at the same time. Both of these attributes do what their names imply; they allow an element to be editable (contenteditable) or allows / disallows spellcheck on content. Let’s start with contenteditable:

Let’s look at number handling first:

    <article id="id">
        <p>You can not edit this paragraph.  I am happy, and and just sit here with no regrets.</p>
        <p contenteditable="true">This paragraph you can edit.</p>
    </article>

In this snippet, we have one paragraph which is not editable, and one that is. When you click on the non-editable paragraph, it works as you would expect by highlighting a word, etc:

However, when you click in the editable portion a whole new world opens:

The paragraph now becomes editable simply by adding the contenteditable attribute. It gets even cooler when we start using the contenteditable with multiple elements. Let’s look at a larger snippet and see what happens.

    <article id="edit_test"  contenteditable="true">
        <header>
            <hgroup>
                <h1>Let's See What Happens</h1>
                <h3>Does every element become editable?</h3>
            </hgroup>
        </header>
        <p>You can edit this paragraph now.</p>
        <p>You can edit this paragraph as well.</p>
    </article>

We start with something that looks like this:

When we focus the article element though, we have the entire span editable:

Furthermore, we can style the box (for lack of better term) using the CSS3 pseudo class of :focus

    #edit_test:focus { background: #eee; padding: 1%; }

and it will look something like this:

>

Final notes about contenteditable. There are three basic conditions that it takes: true, false, inherit. You can nest contenteditable conditions with nested tags. For instance, if we do something like:

    <article id="edit_test"  contenteditable="true">
        <header>
            <hgroup contenteditable="false">
                <h1>Let's See What Happens</h1>
                <h3>Does every element become editable?</h3>
            </hgroup>
        </header>
        <p>You can edit this paragraph now.</p>
        <p>You can edit this paragraph as well.</p>
    </article>

We would be able to edit the paragraphs in the article, but not the header group. Since this is a global attribute, you could theoretically add contenteditable to your body element, and then pick and chose the elements which are not editable in the document.

The spellcheck attribute goes along with the contenteditable, but it also can be used where your user might interact with your document, for instance forms. The spellcheck attribute is assumed on, unless you say otherwise:

    <article id="edit_test">
        <header>
            <hgroup>
                <h1>Let's See What Happens</h1>
                <h3>Does spellcheck work?</h3>
            </hgroup>
        </header>
        <p spellcheck="false" contenteditable="true">Spell check off.</p>
        <p spellcheck="true" contenteditable="true">Spell check is on.</p>
    </article>

As you can see, when we have the spellcheck set to false, we do not get an indication of a misspelled word, but with it set to true, we do. Very simple functionality. From my tests, browser implementation is a bit raw, but it does work now.


Adding Behavior: The Hidden Attribute.

Another new global attribute is hidden. It basically does the same job as “display: hidden” does with CSS but within an element. The advantage to this, it gives a semantical meaning to the element that it is not relevant at this moment in time. Therefore, screen readers, etc., would not mention the element in the hidden state when it would with a style of “display: hidden,” since that is dealing with its presentation. It is a boolean attribute, therefore, false is the assumed state and you only need to add the attribute name to the element that you wish to hide.

    <article id="hide_test">
        <header>
            <hgroup>
                <h1>Let's See What Happens</h1>
                <h3>Can we hide elements?</h3>
            </hgroup>
        </header>
        <p>We can see this paragraph</p>
        <p hidden>We can't see this paragraph</p>
    </article>

Dragging Elements: The Draggable Attribute.

HTML5 implements a new “Drag and Drop” API. While the specifics of the API are a bit out of the scope of this tutorial, the attribute to allow something to be dragged is not. Any element that has draggable set to true, can be dragged:

    <article id="drag_test">
        <header>
            <hgroup>
                <h1>Let's See What Happens</h1>
                <h3>Can we drag elements?</h3>
            </hgroup>
        </header>
        <p draggable="true">We can drag this paragraph.</p>
        <p draggable="false">We can't drag this paragraph</p>
    </article>

Without any javascript you can see the difference in browsers that support draggable. When set to false, if you mousedown over the element it will begin to highlight the text; however, when set to true it does not. In Chrome you get the drag icon, whereas in Firefox you just don’t get the highlight of the element. Either way, the browsers are trying to do something with these elements.


Saving Space With Menus: The contextmenu Attribute.

The contextmenu attribute allows you to give a menu without taking up valuable UI space for the menu. It is a menu which fires on events such as mouseup or keyup providing a bubble menu which provides options and actions based on those selections.

    <article id="contextmenu_test">
        <header>
            <hgroup>
                <h1>Let's See What Happens</h1>
                <h3>Can we give a context menu?</h3>
            </hgroup>
        </header>
        <p contextmenu="foo">This paragraph has a context menu called "foo" attached.</p>
    </article>
    <menu id="foo">
        <command label="Step 1: Write Tutorial" onclick="doSomething();">
        <command label="Step 2: Edit Tutorial" onclick="doSomethingElse();">
        <command label="Step 3: ..." onclick="youGetTheDrift();">
    </menu>

In this example, there are a few more things going on with contextmenu that are new. For instance, we have to have a menu defined so that contextmenu knows where to point. In the example above, we are saying when there is a mouse event (depending on browser implementation) go out and find the menu “foo” in the DOM, and display it’s commands. The syntax is relatively simple after that. We have a menu label which will display the attribute text, and we have an onclick event which will do whatever we have defined.


The Catch-All: The data-* Attribute.

I have saved the most controversial global attribute for last. I have mixed feelings with this new attribute. On one hand, I am looking forward to the ability to connect my logic layer with my behavior layer without going through too many hoops, or using attributes and elements outside of their design specs. On the other hand, I know that when you add ambiguity to a specification, it tends to be overused and misused when there are better options available.

What this attribute is, is a catch-all. Basically, the specification is saying we can not ever think of all of the use-cases for attributes, therefore we will leave you to your own to make them up. The logic in me feels a specification should give us a set of rules to play with, and leave it at that, but the innovator in me loves having the power to define new attributes. I just know from experience when there is a chance to do something not quite right, but easier, that path generally bites you in the behind. All that said, let’s keep it positive and look at a couple of possible cases.

I think this attribute will be a wonderful addition for microformats, and might be the thing that puts them in the forefront of development. I can also see some uses where on the backend I want to give some bread crumbs to my behaivor layer in javascript to close some gaps. Another idea where you might use this attribute is to provide a location for where you are when you posted an article. That might look something like this:

    <article id="data_test" data-latitude="38.254" data-longitude="85.72">
        <header>
            <hgroup>
                <h1>Post From Louisville, KY</h1>
                <h3>Waterfront Park Concert</h3>
            </hgroup>
        </header>
        <p>I've just attached a post from Waterfront Park in Louisville, KY.</p>
    </article>

I can now take those data-* attributes and do something via Javascript or another API, such as post a map, from attributes from my application layer. It ends up opening a ton of possibilities, but don’t forget the immortal words of Ben Parker, “With great power, comes great responsibility”.


Conclusion

Like most things in HTML5 at the moment, the browser support for these changes are spotty at best. Some new attributes are supported. Some are incorrectly implemented. Some have no support at all at the moment. That said, they all appear to degrade nicely without much hoopla involved, so there isn’t a compelling case outside of not working to not begin experimenting and implementing. The specification changes are slowing, so more than likely what you see is what you will get… At some point.

Are You Quitting Facebook?

Facebook has its benefits.  It creates a connection of sorts, reconnects old friends and is an excellent social media tool.   But it is also a productivity killer when overused.  Between email, Twitter and Facebook you can seem to be doing a lot without really doing anything at all.

May 31st was designated as the day that everyone who was going to quit Facebook would band together do so.  Ideally, this would drive a point home that solidarity can make a huge impact (and some would say to get Facebook to think twice about privacy issues) on how site goes forward.  Then again, it might just be that not many people know about the significance of the day at all…

So, have you quit Facebook? Will you?  Are you going to be part of the crowd that does it en masse?  Tell us in the comments.

Create a Revolving Atom in Papervision3D

Just as the title suggests, we’re going to simulate an Atom with shells of electrons orbiting a nucleus, using Papervision 3D. Let’s get going..

This project was created purely with ActionScript 3.0 using FlashDevelop. If you want to do it the same way, FlashDevelop can be downloaded here. (Follow the configuration instructions here.) Otherwise, you can use Flash CS3 or above.


Final Result Preview

Let’s take a look at the final result we will be working towards:

Move the mouse around and the camera will orbit the Atom freely. Get the Atom in a position you like and click the mouse on the stage, this will put the Atom on a fixed ‘z’ position allowing you to rotate the camera on its x & y axes. Click the stage again to release the camera’s ‘z’ orbit.


Step 1: Create a New Project

Open FlashDevelop and click Project > New Project


Step 2: Set Up

Choose ActionScript 3 > AS3Project. For the name of the Project put in “Atoms”. For the location, click and navigate to the folder you would like to save it into. Leave the “create directory for project” checkbox selected and Click OK.

If you want to use Flash CS3/CS4, create a new flash file and set the width and height to 600×500. Set the background color to black. Name it “atoms.fla” and save it anywhere you’d like.


Step 3: Papervision 3D Installation

For Flash, copy or drag the “org’ and “nochump” folders from the source download into the folder where you have saved the atoms.fla file.

For FlashDevelop, go ahead and copy or drag Papervision3D_2.1.932.swc from the source files (downloadable above) into the lib folder for this project. For more information about PV3D, you can visit the website here.


Step 4: Assign the External Library

In FlashDevelop, click View > Project Manager. Click the ‘+’ sign to the left of the lib folder to expand it. Now right-click Papervision3D_2.1.932.swc and select Add To Library.


Step 6: The Document Class

For FlashDevelop, open the project manager again (refer to step 4), expand the src folder and double-click Main.as
Below the imports and right above the class definition, add the following metadata tag to set up the stage properties.

[SWF (width = 600, height = 500, frameRate = 30, backgroundColor = 0)]

Within the init () method after the comment “entry point”, add the following lines of code.


stage.addEventListener (Event.RESIZE, createBackground);

_backGround = new Sprite;
addChild (_backGround);

createBackground ();

var helium3:Helium3Atom = new Helium3Atom;

addChild (helium3);

Next, let’s create a simple gradient background. Add the following lines of code after the init () method:

private function createBackground (e:Event = null):void
{
	var g:Graphics = _backGround.graphics;

	g.clear ();
	var fillType:String = GradientType.RADIAL;
	var colors:Array = [0x0000FF, 0x000000];
	var alphas:Array = [1, 1];
	var ratios:Array = [0x00, 0xFF];
	var matr:Matrix = new Matrix();
	matr.createGradientBox(stage.stageWidth, stage.stageHeight, 0, 0, 0);
	var spreadMethod:String = SpreadMethod.PAD;
	g.beginGradientFill(fillType, colors, alphas, ratios, matr, spreadMethod);
	g.drawRect (0, 0, stage.stageWidth, stage.stageHeight);
}

That’s it for the Main document class, if you’re using FlashDevelop.

For Flash, create a new Main.as class in the same folder as your project. Make sure the Main.as class is in the same folder as the atoms.fla, “org” & “nochump” folders.

Add the following lines:

package
{
	import flash.display.GradientType;
	import flash.display.Graphics;
	import flash.display.SpreadMethod;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Matrix;

	public class Main extends Sprite
	{
 		private var _backGround:Sprite;

		public function Main():void
 		{
 			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
 		}

		private function init(e:Event = null):void
 		{
 			removeEventListener(Event.ADDED_TO_STAGE, init);

			stage.addEventListener (Event.RESIZE, createBackground);

			_backGround = new Sprite;
			addChild (_backGround);

			createBackground ();

			var helium3:Helium3Atom = new Helium3Atom;

			addChild (helium3);
 		}

		private function createBackground (e:Event = null):void
		{
			var g:Graphics = _backGround.graphics;

			g.clear ();
			var fillType:String = GradientType.RADIAL;
			var colors:Array = [0x0000FF, 0x000000];
			var alphas:Array = [1, 1];
			var ratios:Array = [0x00, 0xFF];
			var matr:Matrix = new Matrix();
			matr.createGradientBox(stage.stageWidth, stage.stageHeight, 0, 0, 0);
			var spreadMethod:String = SpreadMethod.PAD;
			g.beginGradientFill(fillType, colors, alphas, ratios, matr, spreadMethod);
			g.drawRect (0, 0, stage.stageWidth, stage.stageHeight);
		}
 	}
}

Open Flash and assign “Main” as the Document class. (Check out this quick introduction to document classes if you’re not sure what we’re doing.)

If you try to run this now, you will get an error since we haven’t created the Helium3Atom class yet. So just make sure to save the file and leave it for now.


Step 7: Create the Helium3Atom Class

From FlashDevelop, click View > Project Manager, right-click the src folder and choose Add > New Class.


Step 8: Setting Up the Class

Name the class Helium3Atom, click the browse button for the base class and enter “org.papervision3d.view.BasicView”. Hit OK to complete.


Step 9: Importing Required Classes

(Still in FlashDevelop) Add all the necessary imports inside the package brackets right above “import org.papervision3d.view.BasicView;” and save the file.

import flash.events.Event;
import flash.events.MouseEvent;
import org.papervision3d.lights.PointLight3D;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.materials.shadematerials.GouraudMaterial;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Cylinder;
import org.papervision3d.objects.primitives.Sphere;

For Flash, create a new ActionScript file, name it Helium3Atom and save it into the same directory you have been using. It should be right next to the atoms.fla file, the “org” & “nochump” folders, and the Main.as class. Add the following code:

package
{
	import flash.events.Event;
	import flash.events.MouseEvent;
	import org.papervision3d.lights.PointLight3D;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.materials.shadematerials.GouraudMaterial;
	import org.papervision3d.materials.WireframeMaterial;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.objects.primitives.Cylinder;
	import org.papervision3d.objects.primitives.Sphere;
	import org.papervision3d.view.BasicView;

	public class Helium3Atom extends BasicView
	{
		public function Helium3Atom ()
		{

		}

	}

}

Step 10: Instance Variables

Inside the class bracket, right before the constructor method, add the following lines of code:

private var _do3DArray:Array;//will hold all the references to all the eletrons and their rings
private var _easeOut:Number = .3;//easing strength when moving the camera
private var _reachX:Number = .1;//the lower this is set, the farther the reach towards it's x axis
private var _reachY:Number = .1;//same as reachX, but applies on the y axis
private var _reachZ:Number = .5;//used on conjunction with the -mouseY, the closer the mouseY is to the stage center, the closer the camera moves towards the atom.
private var _rotX:Number = 0.5;//the value used for the camera's rotation on the x axis
private var _rotY:Number = 0.5;//same as _rotX, but applies for the camera's y axis
private var _camPitch:Number = 0;//orbiting on the x axis calculated on the fly inside the onRenderTick () method
private var _camYaw:Number = 0;//orbiting on the y axis calculated on the fly inside the onRenderTick () method
private var _zDist:Number = 4;//controls the strength of zooming the camera in and out
private var _colorArray:Array = [0xCC490B, 0x26D965, 0xCC490B];//colors for the neutrons and protons inside the nucleus
private var _freeOrbit:Boolean = true;//switches the orbit mode of the camera

Step 11: The Constructor

Add the following lines inside the Constructor method.

if (stage) init ();
else addEventListener (Event.ADDED_TO_STAGE, init);

startRendering ();

The first two lines call the init () method. (If the stage is not yet available, it adds a listener for when the instance is added to the stage, and then calls the init () method.)

The startRendering () method is then called afterwards. This method is from BasicView’s super class, the “AbstractView”. What this method does is add an ENTER_FRAME listener that triggers the onRenderTick () method. We will need to override this protected method later to animate the atom and the move the camera.


Step 12: Instance Initialization

Inside the init () method called by the constructor, we first remove the event listener for adding the instance to the stage and then call the createAtom () method

Add the following lines of code below the constructor () method:

private function init (e:Event = null):void
{
	removeEventListener (Event.ADDED_TO_STAGE, init);

	createAtom ();
}

Step 13: Atom Elements (1st half)

Let’s just go through what’s happening in the createAtom () method. The _do3DArray is instantiated, we need to put references of all the DisplayObject3D that hold the rings and electrons into this array so we can access them later for animation.

A local variable named “light” is assigned a PointLight3D object instance and positioned on the top-right side of the scene.

Another local variable named “atom” is assigned a DisplayObject3D instance and is added into the scene. This will be the parent DisplayObject3D for all the other elements.

The “nucleus”, also a DisplayObject3D is then instantiated. It is rotated 90 degrees on its x axis to make it face the camera and then added into the “atom” DisplayObject3D instance.

The “sphere” variable, also a local variable, is then assigned a Sphere object. A Sphere is a built-in primitive of PV3D. With this particular instance, we assign “null” for it’s material parameter, “25″ for its radius parameter, and “1″ for both segmentsW and segmentsH parameters.

Add the following lines of code after their init () method:

private function createAtom ():void
{
	_do3DArray = [];

	var light:PointLight3D = new PointLight3D;
	light.x = 300; light.y = 700; light.z = 0;
	scene.addChild (light)

	var atom:DisplayObject3D = new DisplayObject3D;
	scene.addChild (atom);

	var nucleus:DisplayObject3D = new DisplayObject3D;
	nucleus.rotationX = 90;
	atom.addChild (nucleus);

	var sphere:Sphere = new Sphere (null, 25, 1, 1);
	scene.addChild (sphere);
}

Step 14: Checking the Sphere

Go ahead and hit CTRL + Enter on you keyboard. The sphere looks more like a polygon with 5 corners. This is because we assigned 1 for both the segmentsW & segmentsH. It has a total of 5 vertices.

After testing, remove the addChild method. The “sphere” will not be added to the scene, instead, it will be used as guide to position the neutrons and protons as you will see next. Add the code below inside the createAtom () method after the “sphere” declaration where you removed the addChild method.

for (var i:uint = 1; i < sphere.geometry.vertices.length-1; i++)
{
	var np:Sphere = new Sphere (new GouraudMaterial (light, _colorArray[i - 1], 0, 0), 23, 12, 9);
	np.x = sphere.geometry.vertices[i].x;
	np.y = sphere.geometry.vertices[i].y;
	np.z = sphere.geometry.vertices[i].z;

	nucleus.addChild (np);
}

What this loop does is iterate from 1 through 4 and skips 0 and 5. A local variable conveniently named “np” (neutrons & protons) is created during each loop and assigned a Sphere primitive. Each “np” Sphere is assigned a GouraudMaterial with the PointLight3D object we created earlier for its light and colorArray[i – 1] for the lightColor parameter. The “np” Sphere’s second parameter is assigned a radius of “23″ and the last 2 parameters are for the segmentsW & segmentsH which are assigned “12″ & “9″ respectively. We can afford higher amounts of segments since there are only 3 spheres inside the nucleus. The result is a more rounded Sphere..

Each “np” Sphere is then added inside the nucleus with the coordinates based from the current iteration’s vertex inside the “sphere” Sphere.


Step 15: Atom Elements (2nd half)

From here, we iterate twice to create the electrons and their corresponding rings.

We first instantiate a DisplayObject3D and assign it to “do3d”. This DisplayObject3D will house both the electron and its ring.

A Sphere primitive is then created and assigned to “electron”. This makes the off-white colored electrons that orbit the nucleus. The parameters we assigned to create each electron are as follows – a ColorMaterial with a value of 0xEFECCA with full opacity, the radius of the sphere with a value of 7. The last two optional parameters we left out defaulted with values of 8 & 6.

A Cylinder primitive is then created to make the rings. Here we just use a WireframeMaterial white in color, an alpha of .05, a thickness of 2, a radius of 300, height of 1, segmentsW of 48 to make it really round and segmentsH of 1 since the height is also 1. The topRadius value is left with -1 which is its default value and we set both topFace and bottomFace to “false”” since we don’t need them here.

The electron is then positioned on 303 so the ring is right in the middle of the electron.

We then set the doubleSided property of the ring’s material to “true” to make the ring show both its inner and outer shells.

After that, the do3d’s localRotationZ is then calculated by dividing 360 by twice the number of rings, multiplying by i, and adding 45 degrees to the result. When the ring is first created, it’s lying flat like the bottom of a cup. We multiply the number of rings by 2 to rotate its “z” axis from 0 to 90 and add 45 degrees to make a nice “X” formation for the 2 rings. We then set the do3d’s “y” rotation to a random position of a full circle so the electrons will all have a different position when they orbit the nucleus.

The rings and electrons are then added inside do3d, then a reference is added into the _do3dArray.

Finally, the do3d is added inside the atom DisplayObject3D.

Add the following lines of code right below the closing bracket of the first loop:

for (i = 0; i < 2; i++)
{
	var do3d:DisplayObject3D = new DisplayObject3D;

	var ring:Cylinder;

	var electron:Sphere;
	electron = new Sphere (new ColorMaterial (0xEFECCA, 1), 7);
	ring = new Cylinder (new WireframeMaterial (0xFFFFFF, .05, 2), 300, 1, 48, 1, -1, false, false);
	electron.x = 303;//add half size of electron

	ring.material.doubleSided = true;

	do3d.localRotationZ = 360 / 4 * i + 45;
	do3d.localRotationY = 360 * Math.random ();

	do3d.addChild (ring);

	do3d.addChild (electron);

	_do3DArray.push (do3d);

	atom.addChild (do3d);
}

Step 16: Checking Our Progress

Let’s test it and see if it worked. If everything went well, you should have an image like below:

We’re almost done, we just need to add animation now.


Step 17: Camera Orbit Mode

Inside the init () method (refer to Step 12), before the “createAtom ()” method call, add the following line of code:

stage.addEventListener (MouseEvent.CLICK, onStageClick);

This will trigger the change in the camera’s mode of orbit. Add the following code below the init () method’s closing brace:

private function onStageClick (e:MouseEvent):void
{
	_freeOrbit = ! _freeOrbit;
}

All this does is toggle _freeOrbit between true or false.


Step 18: Orbiting the Atom

The onRenderTick () method is triggered via an Event.ENTER_FRAME from BasicView’s superclass – AbstractView.

Inside this, super.onRenderTick (event) is called to render the scene.

The DisplayObject3D that holds the rings and electrons inside _do3dArray is then applied a yaw of 10. Applying yaw to a DisplayObject3D is the same as do3d.localRotationY += 10;. This is what makes the rings and electrons orbit the nucleus.

The xDist and yDist simply calculate how far the mouseX & mouseY are from the center of the stage.

Then we have the conditional that checks the current state of _freeOrbit. If _freeOrbit is true, the camera moves freely on its 3 axes. Moving the mouse to the left will cause the camera to ease towards its left, whilst moving the mouse to the right will do the opposite. The same applies for the camera’s y axis (moving up and down). When the camera is closest to the center, a zoom effect is applied.

On the other hand, if _freeOrbit is false, the camera instead, only orbits freely on it’s x and y axes and has a fixed z position. This has the effect of the camera moving around the atom. The equation is easier to understand if you play with the values of the properties. 90 degrees is applied to _camPitch so that the atom is fully facing the center of the stage when the mouse is in the middle of the stage; if not applied, the atom will be on its left side when the mouse is centered on the stage.

This is the same reason 270 degrees is applied to _camYaw; if not added, the atom will be on its top side when the mouse is in the middle of the stage. Also, we limit the orbit of the camera when you move the mouse up and down on the stage. If you remove the _camPitch’s limits, there’s a point where the camera becomes upside down and will correct itself. This has an undesirable effect. When the class is completed in the next step, try removing the limits to see what happens.

Add the following lines of code after the createAtom () method.

override protected function onRenderTick (event:Event = null):void
{
	super.onRenderTick (event);
	for (var i:uint = 0; i < _do3DArray.length; i++)
	{
		_do3DArray[i].yaw (10);
	}

	var xDist:Number = mouseX - stage.stageWidth * .5;
	var yDist:Number = mouseY - stage.stageHeight * .5;

	if (_freeOrbit)
	{
		camera.x += (xDist - camera.x * _reachX) * _easeOut;
		camera.y += (yDist - camera.y * _reachY) * _easeOut;
		camera.z += (-mouseY * _zDist - camera.z) * _reachZ;
	}
	else
	{
		_camPitch += ((-yDist * _rotX) - _camPitch + 90) * _easeOut;
		_camYaw += ((xDist * _rotY) - _camYaw + 270) * _easeOut;

		if(_camPitch < 5) _camPitch = 5;
		if(_camPitch > 175) _camPitch = 175;
		camera.orbit (_camPitch, _camYaw);
	}
}

Step 19: Testing the Completed Class

That should be all of it for the Helium3Atom class. Your class should look exactly like the following:

package
{
	import flash.events.Event;
	import flash.events.MouseEvent;
	import org.papervision3d.lights.PointLight3D;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.materials.shadematerials.GouraudMaterial;
	import org.papervision3d.materials.WireframeMaterial;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.objects.primitives.Cylinder;
	import org.papervision3d.objects.primitives.Sphere;
	import org.papervision3d.view.BasicView;

	public class Helium3Atom extends BasicView
	{
		private var _do3DArray:Array;

		private var _easeOut:Number = .3;

		private var _reachX:Number = .1;
		private var _reachY:Number = .1;
		private var _reachZ:Number = .5;

		private var _rotX:Number = 0.5;
		private var _rotY:Number = 0.5;

		private var _camPitch:Number = 0;
		private var _camYaw:Number = 0;

		private var _zDist:Number = 4;

		private var _colorArray:Array = [0xCC490B, 0x26D965, 0xCC490B];
 		private var _freeOrbit:Boolean = true;

		public function Helium3Atom ()
		{
			if (stage) init ();
			else addEventListener (Event.ADDED_TO_STAGE, init);

			startRendering ();
		}

		private function init (e:Event = null):void
		{
			removeEventListener (Event.ADDED_TO_STAGE, init);
			stage.addEventListener (MouseEvent.CLICK, onStageClick);

			createAtom ();
		}

		private function onStageClick (e:MouseEvent):void
		{
			_freeOrbit = ! _freeOrbit;
		}

		private function createAtom ():void
		{
			_do3DArray = [];

			var light:PointLight3D = new PointLight3D;
			light.x = 300; light.y = 700; light.z = 0;
			scene.addChild (light)

			var atom:DisplayObject3D = new DisplayObject3D;
			scene.addChild (atom);

			var nucleus:DisplayObject3D = new DisplayObject3D;
			nucleus.rotationX = 90;
			atom.addChild (nucleus);

			var sphere:Sphere = new Sphere (null, 25, 1, 1);//invisible guide

			for (var i:uint = 1; i < sphere.geometry.vertices.length-1; i++)
			{
				var np:Sphere = new Sphere (new GouraudMaterial (light, _colorArray[i - 1], 0, 0), 23, 12, 9);
				np.x = sphere.geometry.vertices[i].x;
				np.y = sphere.geometry.vertices[i].y;
				np.z = sphere.geometry.vertices[i].z;

				nucleus.addChild (np);
			}

			for (i = 0; i < 2; i++)
			{
				var do3d:DisplayObject3D = new DisplayObject3D;

				var ring:Cylinder;

				var electron:Sphere;
				electron = new Sphere (new ColorMaterial (0xEFECCA, 1), 7);

				ring = new Cylinder (new WireframeMaterial (0xFFFFFF, .05, 2), 300, 1, 48, 1, -1, false, false);
				electron.x = 303;//add half size of electron

				ring.material.doubleSided = true;

				do3d.localRotationZ = 360 / 4 * i + 45;
				do3d.localRotationY = 360 * Math.random ();

				do3d.addChild (ring);

				do3d.addChild (electron);

				_do3DArray.push (do3d);

				atom.addChild (do3d);
			}
		}

		override protected function onRenderTick (event:Event = null):void
		{
			super.onRenderTick (event);

			for (var i:uint = 0; i < _do3DArray.length; i++)
			{
				_do3DArray[i].yaw (10);
			}

			var xDist:Number = mouseX - stage.stageWidth * .5;
			var yDist:Number = mouseY - stage.stageHeight * .5;

			if (_freeOrbit)
			{
				camera.x += (xDist - camera.x * _reachX) * _easeOut;
				camera.y += (yDist - camera.y * _reachY) * _easeOut;
				camera.z += (-mouseY * _zDist - camera.z) * _reachZ;
			}
			else
			{
				_camPitch += ((-yDist * _rotX) - _camPitch + 90) * _easeOut;
				_camYaw += ((xDist * _rotY) - _camYaw + 270) * _easeOut;

				if(_camPitch < 5) _camPitch = 5;
				if(_camPitch > 175) _camPitch = 175;
				camera.orbit (_camPitch, _camYaw);
			}
		}

	}
}

Hit CTRL + Enter and you should get something like you see below:


Step 20: The Carbon Atom

Ok, let’s now create a slightly more complex atom. Create a new class (if you are using FlashDevelop, refer to Steps 7 & 8). The only difference should be the name, it should be “CarbonAtom”. It has pretty much the same code, with a few changes so go ahead and copy all the content of the Helium3Atom, select all the content inside the CarbonAtom and replace it with the code copied from Helium3Atom.

Let’s start modifying things from the top. Inside the class declaration where we have _colorsArray, remove the assigned array that holds the 3 colors.

Next, go into the init () method. Add the code below before the createAtom () method call:


randomizeColorArray ();

Go below the onStageClick () method and add this new method:

private function randomizeColorArray ():void
{
	_colorArray = [];

	var tempArray:Array = [];

	for (var i:uint = 0; i < 12; i++)
	{
		if (i < 6) var color:uint = 0x004080;	//shade of blue
		else color = 0xA40000;	//shade of red

		tempArray.push (color);
	}

	while (tempArray.length > 6)
	{
		_colorArray.push (tempArray.splice (uint (Math.random () * tempArray.length), 1));
	}
	_colorArray = _colorArray.concat (tempArray);
}

This method randomizes the position of 2 colors that are stored in _colorArray. This makes 6 equal parts of red & blue randomly positioned inside _colorArray.

Next, go into the createAtom () method right where “nucleus” is instantiated and remove the “nucleus.rotationX = 90″ assignment.

Go down 2 lines and change the sphere instantiation parameters to “var sphere:Sphere = new Sphere (null, 60, 4, 4);”. We need a bigger Sphere with more vertices to hold all 12 Protons and Neutrons.

Now go inside the first loop where the “np” Sphere is instantiated and remove the last 2 parameters of 12 & 9. This sets the segmentsW & segmentsH to their defaults, 8 & 6, respectively, and reduces the hit on performance.

Next, in the second loop, change the amount of loops from 2 to 6. Go right below the electron instantiation and replace the following code:

ring = new Cylinder (new WireframeMaterial (0xFFFFFF, .05, 2), 300, 1, 48, 1, -1, false, false);
electron.x = 303;

with:

if (i == 1 || i == 5)
{
	ring = new Cylinder (new WireframeMaterial (0xFFFFFF, .05, 2), 450, 1, 48, 1, -1, false, false);
	electron.x = 453;
}
else
{
	ring = new Cylinder (new WireframeMaterial (0xFFFFFF, .05, 2), 610, 1, 48, 1, -1, false, false);
	electron.x = 613;
}

This is where the two shells (rings) are created for the CarbonAtom.

Now go below where you see the “ring.material.doubleSided = true” assignment and replace the code:

do3d.localRotationZ = 360 / 4 * i + 45;

with:

do3d.localRotationZ = 360 / 12 * i + 180;

This gives the 6 electrons proper placement to fully cover the nucleus. That’s it. Save the file before testing.


Step 21: Testing the CarbonAtom

The CarbonAtom class should look exactly like this:

package
{
	import flash.display.StageQuality;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import org.papervision3d.lights.PointLight3D;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.materials.shadematerials.GouraudMaterial;
	import org.papervision3d.materials.WireframeMaterial;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.objects.primitives.Cylinder;
	import org.papervision3d.objects.primitives.Sphere;
	import org.papervision3d.view.BasicView;

	public class CarbonAtom extends BasicView
	{
		private var _do3DArray:Array;

		private var _easeOut:Number = .3;

		private var _reachX:Number = .1;
		private var _reachY:Number = .1;
		private var _reachZ:Number = .5;

		private var _rotX:Number = 0.5;
		private var _rotY:Number = 0.5;

		private var _camPitch:Number = 0;
		private var _camYaw:Number = 0;

		private var _zDist:Number = 4;

		private var _colorArray:Array;
		private var _freeOrbit:Boolean = true;

		public function CarbonAtom ()
		{
			if (stage) init ();
			else addEventListener (Event.ADDED_TO_STAGE, init);

			startRendering ();
		}
		private function init (e:Event = null):void
		{
			removeEventListener (Event.ADDED_TO_STAGE, init);
			stage.addEventListener (MouseEvent.CLICK, onStageClick);

			randomizeColorArray ();

			createAtom ();
		}

		private function onStageClick (e:MouseEvent):void
		{
			_freeOrbit = ! _freeOrbit;
		}

		private function randomizeColorArray ():void
		{
			_colorArray = [];

			var tempArray:Array = [];

			for (var i:uint = 0; i < 12; i++)
			{
				if (i < 6) var color:uint = 0x004080;
				else color = 0xA40000;

				tempArray.push (color);
			}

			while (tempArray.length > 6)
			{
				_colorArray.push (tempArray.splice (uint (Math.random () * tempArray.length), 1));
			}
			_colorArray = _colorArray.concat (tempArray);
		}

		private function createAtom ():void
		{
			_do3DArray = [];

			var light:PointLight3D = new PointLight3D;
			light.x = 300; light.y = 700; light.z = 0;
			scene.addChild (light)

			var atom:DisplayObject3D = new DisplayObject3D;
			scene.addChild (atom);

			var nucleus:DisplayObject3D = new DisplayObject3D;
			atom.addChild (nucleus);

			var sphere:Sphere = new Sphere (null, 60, 4, 4);

			for (var i:uint = 1; i < sphere.geometry.vertices.length-1; i++)
			{
				var np:Sphere = new Sphere (new GouraudMaterial (light, _colorArray[i - 1], 0, 0), 23);
				np.x = sphere.geometry.vertices[i].x;
				np.y = sphere.geometry.vertices[i].y;
				np.z = sphere.geometry.vertices[i].z;

				nucleus.addChild (np);
			}

			for (i = 0; i < 6; i++)
			{
				var do3d:DisplayObject3D = new DisplayObject3D;

				var ring:Cylinder;

				var electron:Sphere;
				electron = new Sphere (new ColorMaterial (0xEFECCA, 1), 7);

				if (i == 1 || i == 5)
				{
					ring = new Cylinder (new WireframeMaterial (0xFFFFFF, .05, 2), 450, 1, 48, 1, -1, false, false);
					electron.x = 453;
				}
				else
				{
					ring = new Cylinder (new WireframeMaterial (0xFFFFFF, .05, 2), 610, 1, 48, 1, -1, false, false);
					electron.x = 613;
				}

				ring.material.doubleSided = true;

				do3d.localRotationZ = 360 / 12 * i + 180;
				do3d.localRotationY = 360 * Math.random ();

				do3d.addChild (ring);

				do3d.addChild (electron);

				_do3DArray.push (do3d);

				atom.addChild (do3d);
			}
		}

		override protected function onRenderTick (event:Event = null):void
		{
			super.onRenderTick (event);

			for (var i:uint = 0; i < _do3DArray.length; i++)
			{
				_do3DArray[i].yaw (10);
			}

			var xDist:Number = mouseX - stage.stageWidth * .5;
			var yDist:Number = mouseY - stage.stageHeight * .5;

			if (_freeOrbit)
			{
				camera.x += (xDist - camera.x * _reachX) * _easeOut;
				camera.y += (yDist - camera.y * _reachY) * _easeOut;
				camera.z += (-mouseY * _zDist - camera.z) * _reachZ;
			}
			else
			{
				_camPitch += ((-yDist * _rotX) - _camPitch + 90) * _easeOut;
				_camYaw += ((xDist * _rotY) - _camYaw + 270) * _easeOut;

				if(_camPitch < 5) _camPitch = 5;
				if(_camPitch > 175) _camPitch = 175;

				camera.orbit (_camPitch, _camYaw);
			}
		}

	}

Open the Main document class and replace the code:

var helium3:Helium3Atom = new Helium3Atom;
addChild (helium3);

with:

var carbon:CarbonAtom = new CarbonAtom;
addChild (new CarbonAtom);

You should see something like the preview when you test the movie.


Conclusion

Papervision is a very straight forward and powerful tool. Experiment with it and you will come up with all kinds of cool 3D effects ranging from simple simulations to sophisticated interfaces.

Also, I made another version of the carbon atom named CarbonAtom2 which is also included with the source download. That one has a more realistic electron behavior, check it out! =)

As always, for any comments, suggestions or concerns, please leave a note in the comment section. Thanks for reading!

How to Compose Song Demos in GarageBand, Part 3 – Basix

This is the third and final tutorial in a series covering the basics of song demo production in Apple’s GarageBand. The aim of these tutorials is to show you the basics of recording your own song demos, covering the creative process as well as how to use the software.

In Part 2, we got as far as programming the backing track and recording the guitar parts for a song. All being well, you now have a completed rough demo recording of your song.

In this third and final part, we’re going to look at some simple steps you can take to polish up your demo and share it with your band mates. Remember, though, that we’re only making a demo; the idea is to develop and communicate a musical idea. While it’s certainly worth spending some time to make sure everything sounds clear and balanced, it definitely isn’t worth tying ourselves in knots trying to get a super-slick studio sound.

Here is a short track demonstrating what you will achieve with this tutorial:

Download audio file (audiotutsjam.mp3)

So, let’s work through some key tasks in order:

Continue reading “How to Compose Song Demos in GarageBand, Part 3 – Basix”

Quick Tip: Pan Your Reverb

Adding some extra ambience to guitars is always a good idea to enhance already awesome guitar tracks. The number of guitar mixing tricks out there is in overabundance and I learn a new trick every song I fool around with. I’m writing this on my break time from writing the next Premium tut, namely about guitar mixing, and I thought I would give you a quick tip to whet your appetite.

Whether it’s adding extra delay to solos, shimmering chorus to chords or creating automatic double tracking for a more expansive sound, there are quite a few tricks to enhance your guitar sound. One of my more favorite ones is using both panning and reverb to create a wider and more soulful soundscape for your guitar.

It’s easy. All you need is some panning knobs, a nice guitar track and some reverb.

First we have our guitar part, and since we don’t want it to compete with our imaginary vocal track that’s supposed to be in the center (work with me here…), I’m panning it a little off center to give it some room to breathe. However, I’m feeling that this guitar track needs some extra pizazz, although it does sound quite sweet by itself.

Listen to the dry guitar sound here, panned a little off center:

Download audio file (gtrdry.mp3)


Add Some Reverb

Now, although this guitar had some ample spring reverb on it when it was recorded, I want to make it sound like it was recorded in a hall. Send your guitar track to an auxiliary bus using your chosen DAW’s auxiliary sends. There, insert whatever reverb device you think sounds great. I’m using Logic’s Space Designer, and am choosing a nice medium sized (1.7s) Guitar Hall from Logic’s Impulse Response library. Make sure your aux bus and reverb is in mono. Why? You’ll see it in the next step.

As always when we’re working with reverb as a send effect, make sure it is at 100% wet and no dry sound is interfering with the reverb sound. The original track is for the dry sound, the aux bus is for our reverb. Good? Good.


Pan Your Reverb

Now, to create a nice stereo soundscape we leave the original sound panned 50% to one side while we pan the reverb itself 50% to the other side. That’s why we want the reverb to be mono, since we’re panning the original mono track to one side, we want to be able to pan the mono reverb to the other side of the spectrum.

Now listen to the nice sound we’ve accomplished with such an easy trick.

Download audio file (gtrwet.mp3)

We can use this for all sorts of audio files we want to make bigger in our mixes. Pan various backing vocals around the center and by panning their reverbs or delays to the opposite sides we can create a bigger and fuller sound.

A quick tip indeed. But a very handy mixing tip to know!


Quick Tip : Adding Decals to your MXM Materials in Maxwell Render

In this Quick Tip tutorial you’ll get a look at something I get asked about a lot – how to add decals/graphics to your materials in Maxwell Render. We’ll be covering two different ways of adding them to your material utilising weight-map textures within the layer groups themselves.

Video 1

Download

Note: click the ‘Monitor’ icon to view tutorial in full-screen HD.

Don’t miss more CG tutorials and guides, published daily – subscribe to Cgtuts+ by RSS.

Quick Tip: Capturing a Perfect Rainbow Photograph

We can all appreciate the mysterious beauty of a rainbow – they’re colourful, magical, and an uncommon occurrence. Unfortunately, they can be a tricky subject to photograph well. Today we’ll be offering a few tips on how to make sure you get the perfect rainbow image.


What is a Rainbow?

So, what exactly are we looking for? Rainbows occur when sunlight intersects with water droplets – whether that’s rain, mist, waves, or a waterfall. Anywhere that you can see bright sunlight and moisture will be a good candidate for rainbow spotting.

The most spectacular rainbow shots can be taken when half of the sky is still dark with cloud, and you are positioned at a spot with clear sky in the direction of the Sun. You’ll be able to capture a bright rainbow that stands out against a dull, rainy background.


Keep Your Background Clear

The most important thing to remember is that a rainbow isn’t a solid object – it’s a combination of light and moisture. This means that it’s often best to have a relatively clear background behind the rainbow.

This could be cloud, blue sky, the sea, or anything else similar. By all means incorporate other elements into different areas of the frame, but the background directly behind the rainbow itself is best kept clear.


The End of the Rainbow

There are generally two types of rainbow shots; those that show the arc, and those that show the point at which the rainbow intersects with the ground. I find the latter category to be more compelling and unique.

Try to find an angle that allows you to make this a prominent element in the image, and experiment with photos that show the rainbow crossing interesting subjects.


Look for the Second Arc

Whenever you can spot one rainbow, there’s usually a second arc slightly higher in the sky surrounding the main rainbow. The colours of this are reversed, and it’s a really interesting element to incorporate into your shot.


Somewhere Over The Rainbow

It’s rare and unlikely, but if you get a chance to observe a rainbow while in an aeroplane or helicopter, you’ll see something interesting. It’s possible to see the whole circle of a rainbow – not just an arc.

Obviously this is even more difficult to photograph, but it’s certainly something to keep an eye out for!


Make Your Own

If you’re wanting to experiment with this type of photography, you don’t necessarily need to wait for the environmental conditions to be perfect. A sunny day and a garden hose on the “mist” setting should give you a subject to experiment with straight away!


Share Your Images!

Have you taken a rainbow shot that you’re particularly proud of? Feel free to leave a link in the comments below – I’d love to take a look!

The CV Toolkit – Resume Templates

Keeping your credentials up-to-date is crucial.  In the ever-changing job market (and world, for that matter), it’s important to keep on top of what skills and experience you have acquired.  It may seem onerous, but there are ways to do it quickly, easily and consistently – you can maintain both your productivity and resumé with the right tools.  That’s where WorkAwesome comes in.

We’ve developed a series called The CV Toolkit that will help you do just that – keep your CV up-to-date while you keep being awesome at being productive.  Each entry in the series will be found at the beginning of the week – and while they won’t appear every week, you’ll find tips, samples and more that will help you keep your resumé in tip-top shape.

To get you started, here are a few options at your disposal when searching for great-looking resumé templates:

  1. Online services.  Sites like Pongo Resumé offer a variety of template styles that cater to different areas of interest.  They can be saved and delivered in a variety of different file formats – handy if you want to modify it yourself easily and even handier should want to submit PDFs directly, for example.  Sites such as this often allow you to create cover letters and even provide support in terms of how to land that interview, how to structure your resumé and cover letter and more.  However, these services are often subscription-based (with varying costs depending on level of services, payments terms, etc.), so give them a try first before committing.  If they don’t offer a free trial, it’s best to steer clear.
  2. Downloadable templates for your word processor of choice.  Whether you use Word, Pages or some other proprietary software you can find templates online that you cna download and use at your leisure.  The great thing about these is that they’re often lower-priced than the services mentioned above (some are even free!), and you’ll have a wider range to choose from since you’re not stuck in one service.  Quality can be an issue here, however, so you may have to search around for a while to find one that suits your needs and works well on all fronts.
  3. Existing templates on your word processor.  These accompany your software and are easily modifiable – if you know what you’re doing and have the time to do it right.  Using the pre-installed templates are useful to just keep things up to date while you search for a resumé style that is just right for you and your field.

What do you use to build your resumé?  Do you have a favorite service or product you use?  We’d love to hear about in the comments!

Next time on The CV Toolkit, we’ll discuss the popular social network for professionals, LinkedIn. Continue reading “The CV Toolkit – Resume Templates”

13 Free MP3 Players for Windows

We live in a digital age. It’s only appropriate that we listen to digital music. We want our music where we spend our time, and for many of us these days that’s on our computers.

This article was previously published on the AudioJungle blog, which has moved on to a new format in 2010. We’ll be bringing you an article from the AudioJungle archives each week.

Do you remember the good old days? Our lounge rooms would be full of racks of CDs, cassette tapes, and even records. We’d pick an album or two that we wanted to listen to, hit play, and listen to the songs in order. We were impressed with auto-reverse cassette players, and CD players that would play one album’s songs in a random order. The last CD player I bought can play three CDs at once, and play songs from any of the CDs in random order. I thought it was amazing.

Today, most of us have our entire music collections on our computer – hundreds or possibly thousands of albums. The flexibility of playing a single album, or all the songs by an artist or group of artists, or just shuffle through our entire collection, seems normal. And most of us take our music collection – or a big hunk of it – with us on portable media players.

Many of us listen to our music using fairly standard software: either Windows Media Player or iTunes. But there are literally hundreds of similar programs available for Windows, most of which are free. They all do the same basic job, but may have unique features or a different interface.

I perused many of the players that cost a bit of money, but couldn’t find any that gave me a convincing reason to pay up. So I’ve only included free software here (although some of the players have “pro” versions). However, if you paid good money for your favorite player, I’d love to hear in the comments what made it worthwhile.

Here are 13 free MP3 players for Windows.


1. Windows Media Player

Windows Media Player comes with your computer, and works pretty well, so many of us use it and enjoy it. It has all the features you’d expect, including the ability to rip songs from your CDs, a pretty good music library, and enough skins to give you a look that suits you.

Since you’re likely to be aware of WMP already, I won’t say much more about it. I’ve never really been a fan, but that’s probably because I love exploring the alternatives. If you are a fan of WMP, please let me know why in the comments. You might give me a whole new appreciation for the program!


2. iTunes

I first used iTunes after buying an iPod around five years ago. If you own an iPod, using iTunes is virtually a requirement. I was pleasantly surprised by the experience.

iTunes (like most Mac products) is attractive, easy to use, and has most of the features you need. I especially liked the way iTunes handles smart playlists, and created a handful of them, including songs I had never played, and songs in specific genres that had three or more stars.

Although the program is quite big, I have recommended it to many computer novices because it is easy to use, makes it easy to use more advanced functionality, and most of all, it is free!


3. Winamp

Winamp was my favourite for many years, and remains a favourite of many people, including a teenager I ran into yesterday. It is light, skinnable, and covers the basics very well. And you can add more features through installing plug-ins.

In the last few years Winamp has been adding features to compete better with the alternatives, including the ability to sync with iPods and import iTunes libraries, song recommendations, album art, and podcast support. The pro version includes ripping and burning CDs.


4. Songbird

Songbird is an open source music player that seems designed to look very much like iTunes. Like Winamp, you can extend its feature set using plug-ins. You can read more about Songbird from our previous article, 10 Things Songbird Does that iTunes Can’t.


5. Media Monkey

MediaMonkey is one of my favorite Windows music players. Formerly called Songs-DB, its emphasis is accessing your music through a useful tree-based database. MediaMonkey calls itself “the music organizer for the serious collector.” I agree with that description.

While it excels at organizing and tagging music, MediaMonkey can also sync with a wide range of devices, handle podcasts, and report on your statistics.


6. Foobar2000

Though I’ve never used Foobar2000 as my main media player, I’ve heard great things from its fans for many years. They strongly believe that Foobar is the best music player in existence.

Foobar2000 supports many audio formats, and is incredibly customizable, including skinning and keyboard shortcuts.


7. 1by1

1by1 is a “directory player” – basically a very simple music player that just plays all of the songs in a folder. I used to include it on the CD when I was sharing some MP3 files with friends. It is very small, very fast, and does not use databases to organize your music.


8. Aqualung

Aqualung claims to be an “advanced” music player that plays audio CDs, internet radio streams and podcasts as well as sound files in just about any audio format and has the feature of inserting no gaps between adjacent tracks. I haven’t tried it yet, but it looks very promising, playing a wide range of audio formats on a wide range of platforms.

Some of its unique features include multiple playlists (similar to tabbed browsing), command line control, use of LADSPA plug-ins, and the use of an XML-based database for storing information about your music. Looks like a great player for geeks, and possibly for the rest of us.


9. Billy

Billy is another light player. The biggest complaint about Billy is its lack of skins, but the website counts lack of skins as a feature! Like 1to1, it is designed to play an entire directory of MP3s.


10. Quintessential Music Player

The Quintessential Music Player is a highly skinnable music player that supports a wide variety of music formats. The program can be expanded with plug-ins to enhance playback, encoding, use of effects, tagging and more.


11. Zinf

Zinf is an open source Winamp clone, and was previously called “FreeAmp”. It has features very similar to Winamp, and some nice skins.


12. Spider Player

The Spider Player website calls this product “the ultimate music player”. The feature list is very long, and includes conversion between audio formats, support for a wide range of formats, a lot of customizability, support for custom MIDI soundfonts, streaming audio support, and a DSP effects manager. However, it does not support DRM-protected files.


13. dBpoweramp

dBpoweramp includes a wide range of helpful audio utilities. These include “CD ripping for those who take ripping seriously”, “audio conversion perfected”, “CD burning made easy” and “batch ripping on the Industrial Scale”. It can play music, too. The software has good audio codec support, and was one of my favorite tools a few years ago.

In writing this article I came across hundreds of other programs. Some may have been very good, many didn’t look like there were. The programs above are among the best of them, but may not include all of the best. If you have a favorite media player I haven’t included, please let us know about it in the comments.


Illustrative Lettering Creative Session Wrap

It’s a wrap. This session has covered a mix of illustrative lettering articles on theory and in depth case studies. We’ve taken a close look at various artist’s work and their various processes of constructing illustrative lettering. We’ve looked at how to derive inspiration from your imagination, the history of type, and how to create letters with an illustrative flair. This session posted across numerous Tuts+ sites: Psdtuts+, Vectortuts+, Cgtuts+, and Phototuts+. We’ll continue to expand each session as we cover new topics and integrate your feedback. Let us know what you think of this session’s material.


Illustrative Lettering CS Content

  • Developing a Passion for Illustrative Lettering

    In this article I’d like to present some thoughts and theories that I use for creating illustrative lettering. I will show samples and explain a bit of the background info to further emphasize my thoughts. The goal is to simply supply some insight and hopefully a bit of inspiration.

    Visit Article

  • Creating Typography Inspired by the Seventies and Eighties

    Typography from the 70s and 80s is inspirational to both designers and illustrators. It often takes on a storytelling role in it’s design. With the tools that you and I have available to us today, we can be inspired by the work that has been done in the past, but try to push forward into new territories. I’d like to share with you some tips and observations I have made from doing numerous retro typography illustrations.

    Visit Article

  • Developing Illustrative Type to Complement Your Style

    My name is Jonny Wan and I am a freelance illustrator based in the UK. My style is based upon shape experimentation, patterns and textures and I draw inspiration from ancient cultures and civilizations. More recently I have rekindled my love for type and now developing a way of working with type that is congruent with my illustrative style so the two can work in tandem when applied to commissions that requires both.

    Visit Article

  • Alphabetic Inspiration: A-Z Experiments with Letters, Hand-Crafted Type, and More

    This inspirational post is all about creating non-traditional type, letters, and alphabets. Some of these are made to into functional fonts and others serve as realized concepts. Consider doing some experiments with photographing objects made into full alphabets, hand crafting letters, working with 3D, trying unusual mediums, and more. Construct an image based font you can use in Photoshop, build your first pictorial font, or just have fun hand crafting some letters.

    Visit Article

  • From Paula Scher to Wilco: Illustrative Lettering as Cultural Storytelling

    Illustrative lettering, by definition, lives at the beautiful intersection of typography and illustration. It blends the aesthetic sensibility of the type designer with the creative edge of the artist and the narrative magic of the storyteller. This latter property is incredibly important, particularly in understanding the broader cultural and social relevance of illustrative lettering as a tool of self-expression and a storytelling medium.

    Visit Article

  • Wearable Letterform: a Typographic Form for Ephemeral Messages

    Say it loud: How to publicly display messages in a highly visible way, without doing anything illegal? Say it fast: Messages evolve in a perpetual flux. If you take the example of a poster or a title in a newspaper, their context is permanently shifting: who the audience is, where it is read from, what the weather is like, what the buzz of the precise moment is. How can we display a physical message while keeping it flexible enough so that it can reflect on its context? Interested, read on!

    Visit Article

  • Ace Hotel Wall Murals

    As a designer, I feel it’s always a good idea to take on new and challenging projects when the opportunities present themselves. For example, when I was approached by Ace Hotel in NYC to do a series of murals that would cover multiple walls of some of their hotel rooms, I jumped at the chance… even though at the time I had no earthly idea how I was going to do it. I figured out a way though and now I use some of the techniques I developed for this project in other design projects.

    Visit Article

  • Inspiration: 45 Examples of Illustrative Lettering in Vector

    From the very first Phoenician alphabet, through Chinese calligraphy, to illuminated manuscripts, and to desktop publishing, the written word has been one of our primary means of communication. Not content with plain text on a blank background, artists through the centuries have created beautiful, awe-inspiring designs with type. Whether its purpose is to inspire or identify, illustrative lettering communicates to the heart as well as the head.

    Visit Article

  • Finding Your Hand Drawn Lettering Voice

    Learning to letter by hand is a journey, or at least it has been for me. Starting with a passion for letters and typography, I experimented with tracing type, fitting letters into unusual spaces, and discovering how to pull words and styles together cohesively. It can take quite some time for your compositions to come together, your focus tighten, and your voice to develop.

    Visit Article

  • Creative Illustrative Lettering Challenge – Part 1

    This session we proposed a challenge to two illustrators. We asked each of them to take our own “tuts+” brand name and illustrate it with a creative lettering solution. Learn how each of them went about solving this, and the concepts they worked with to bring about the final work. In this Part 1 of this challenge, we’ll look at Wojciech Pijecki’s solution and how he combines expressive and abstract concepts, with lots of colorful elements, transforming this brief into a vibrant work of art.

    Visit Article

  • Creative Illustrative Lettering Challenge – Part 2

    This session we proposed a challenge to two illustrators. We asked each of them to take our own “tuts+” brand name and illustrate it with a creative lettering solution. Learn how each of them went about solving this, and the concepts they worked with to bring about the final work. In this Part 2 of this challenge, we’ll look at Jacob Bian’s solution and how he uses figures, motion and depth within a 3D scene, to transform this brief into a creative work of art.

    Visit Article

  • Evolving Your Illustrative Typography, Through Experiments and Techniques

    To grow and develop your illustrative typography style first involved letting go. Don’t get overly concerned with your style early on. Give yourself the time needed to experiment. Try different techniques, different mediums, different approaches. Give yourself the space to make mistakes and learn from them. By practicing your illustrative lettering with craft personal projects you’ll gain experience with your tools. Over time, you’ll develop methods and techniques that will help you to deliver consistent professional results.

    Visit Article


Your Thoughts on this Illustrative Lettering Session

We’d love to here your feedback and suggestions on how to improve Creative Sessions. We’re actively working to improve Creative Sessions, with more high quality material, and new intensive two week sessions releasing each month. We look forward to your comments.


Coming Soon, Digital Illustration Creative Sessions

Our next session will be on digital illustration. In the next session we’ll cover a wide spectrum of digital illustration topics. We’ll dive deeper into the theory in topics like digital painting, finding your illustration niche, and how to apply surrealist concepts in your work. We’ll also follow some digital artists through their working process with case studies and we’ll touch on some of the business of digital illustration. We have a great session lined up on digital illustration coming soon. Expect to see this next session post around the middle of June.

Badge

Achieving: The Over/Under

How productive you are is never about simply achieving.  Everybody achieves something sometimes.

It is the lengths to which one goes to achieve that makes them extraordinary or just plain ordinary.  Or perhaps less.

Effort is what propels achievement – and it’s often not the person with the most talent that stands out but the one who worked the hardest.  Prominent leadership expert/speaker/author John Maxwell has touched on this in many of his books, most prominently in Talent Is Never Enough.

Be honest with yourself…if you’re not getting what you want out of what you’re doing, what’s holding you back?  Are you making the most of what you’ve got or resting on your laurels?  What keeps your achievement level high – or what brings it down?

Interview with Maxim Cyr aka RecycledWax


Maxim Cyr who is also known as RecycledWax is a freelance illustrator and graphic designer from Montreal. With a college degree in multimedia he is currently working on a Bachelor’s degree in Graphic Design. Music and cinema are the main two themes that inspires him, he says, he grew up watching Disney’s animation masterpieces and continues to feel that influence with Pixar’s latest creations. He also designs t-shirts and has won numerous web t-shirt contests. Currently he is working on the sequel of his book and wants to focus more on the publishing industry, making illustrations for kids book. Read more about him in this interview.

Continue reading “Interview with Maxim Cyr aka RecycledWax”

3D Mixing Part 4: Compression

Although compressors are probably the most important element in the mixing toolbox (after equalizers), a lot of ambiguity and confusion surround them as their parameters and how they effect incoming audio are more subtle. In this segment of our ongoing series, we will try to clear up some of the mysteries surrounding compression by looking at different types of compressors, a few compression techniques, and how to implement those techniques in our project.


What is Compression?

Compression is basically the lowering of high amplitude signals of an incoming audio source to ‘compress’ the range between the high and low amplitudes of the signal. This is often done in mixing to catch attack transients on instruments such as drums and bass to even out the level of the entire instrument to ensure that it can be heard in its entirety at a fairly consistent level. (This differs from compression in mastering which is largely used to even out the level of an entire song, which we will not get into here.)

To illustrate this, imagine a single acoustic bass note which has a high amplitude attack phase and a low amplitude release phase. Placing a compressor on this signal will decrease the initial attack amplitude, thereby making the amplitude of the entire note event more consistent. In this way, the entire signal can then be raised in amplitude to increase the loudness of the overall signal.


Compressor Types

Compressors come in many different types which are designed for use in different instances. Logic comes with several different types which can be accessed through the ‘circuit type’ drop down menu in the onboard compressor. Your DAW may or may not have these circuit type options, but the circuit types modeled in Logic are based on tried and true analogue compressor types that are prevalent throughout the analogue and digital mixing worlds.

Platinum

This is the standard Logic compressor type (not a model) that is fairly straightforward and neutral. I usually use this for side-chaining (explained a bit later) as it is easy to set up and gives good pumping results without coloring the sound.

CLASSA_R & CLASSA_U

These circuit types are based on classic variable-µ compressors which use vacuum tubes and characteristically give smooth compression curves and a warm coloring. A good example of a variable-µ compressor is the Fairchild 670.

VCA: Voltage Control Amplifier

This circuit type is good for high amplitude transients as it responds quickly and can handle a high amount of level. VCA compressors are one the most flexible compression types as they can be extremely transparent. A famous example of a VCA would be the dbx 160S.

FET: Field Effect Transistor

The FET circuit type has a very fast attack and release and can not handle a high amount of level. It is similar to the variable-µ compressor, but with coloring characteristics more akin to saturation than tube warmth. This type is the go-to in many studios for drums and vocals. A good example of this is the UREI 1176.

Opto: Optical Isolator

Optical Isolator compressors are interesting in that they use a light source to control amplitude. As the input amplitude increases, the internal light source increases in brightness, shines on a photoconductive cell which in turn decreases the output. These compressors are good for bass guitar, vocals, master or whatever else you want to be fattened up. A good classic example of this is the Teletronix LA2A.

It is important to note that NONE of the above models are meant to be emulations of any one type of compressor, but are modeled after the general characteristics and limitations of that specific type of compressor. It is also important not to get too caught up in using any one type of compressor for a single type of instrument all the time. Experiment around and if it sounds good, use it.


Setting the Compressor

Although much has been written on the subject, here is a brief rundown of a good way to set the compressor’s settings:

  1. Set the threshold level so that the gain reduction meter begins to pump in time with your sound. Anywhere from 3-6 dB of reduction is probably a good place to start as you will hear the effects of the compressor on your sound without dramatically altering it.

  2. Set the attack time. Do this by starting with the fastest attack time possible (very quick reduction of transient amplitude) and then slowly back off until you have a natural sound with a clear attack .

  3. Set the release time by starting with the slowest release time possible (very slow rebound of transient amplitude) and then slowly clamp down until the sound pumps in time with the music.

  4. Set the ratio (the ratio between input amplitude and output amplitude) and knee (how harshly or gradually the signal is compressed at the threshold) to taste.

  5. Go back and tweak settings as desired to make the compressor ‘breathe’ in time with the music. A good way of making sure of this is to set the release time to a value that is in time with your music. (E.g. tempo is 120 and release is set to 500 ms to make a quarter note.)


Compressor Techniques

Once you are comfortable using the compressor, we can start to have a bit of fun with it outside of its normal usage. Here are a few techniques to try out.

Side Chain Compression

This is a commonly used trick for kick drum and bass to keep the low end sounding clear, but can be used creatively for just about anything. Basically, what is going on here is the amplitude of one signal is going to dictate how the compressor responds to a second signal. To do this you simply need to go to the side chain menu of the compressor (if available) and select the input you want to be used to dictate the compressor’s response.

A general go-to (and one that I am employing in this project) is to put a compressor on the bass and have the kick used as a side chain. With this routing, the bass will be compressed every time the kick hits, thereby reducing the level of the bass during the kick hit and allowing the kick to punch through.

Serial Compression

This is another commonly used trick when just one compressor won’t do the trick, or when using side chain compression and the signal needs to be compressed even when the side chain is not active (e.g. in bass tracks to control the attack transients). For this, you simply need to place a compressor so that it follows a first compressor in the signal path. This method is always preferable to compressing a signal with a high gain ratio once as it alleviates the stress put on a single compressor. A good rule of thumb is to compress often and with a low ratio rather than infrequently and with a high ratio.

Parallel Compression

Parallel compression is a very popular technique in which the mixing engineer takes a signal (a kick drum for example) and sends it to two different channels, one of which has heavy compression on it and the other is dry. The two signals are then recombined and mixed to create a kick with the in-your-face punch of the heavily compressed signal while retaining the dynamic information of the dry signal.

A quick way of getting parallel compression out of Logic’s compressor is to open the advanced parameters disclosure menu (the triangle in the lower left) and adjust the mix level of the compressor. Moving the slider to the left will automatically give you parallel compression as you are now mixing the wet and dry signal of the compressor.


Implementation

Here is an A/V rundown of how I implemented a few of the above ideas in our project. It’s by no means perfect, but it is definitely making things sound much better than where they were.

Kick

Download audio file (Kick.mp3)

Snare

Download audio file (Snare.mp3)

Closed Hi-Hat

Download audio file (Closed HH.mp3)

Open Hi-Hat

Download audio file (Open HH.mp3)

Clap

Download audio file (Clap.mp3)

Rim

Download audio file (Rim.mp3)

Drum Sub

Download audio file (Drum Sub.mp3)

Bass Side Chain

Bass Serial

Download audio file (Bass.mp3)

Piano

Download audio file (Piano.mp3)

Synth

Download audio file (Synth.mp3)

Vox.

Download audio file (Vox.mp3)


Before/After Compression

Download audio file (BeforeAfter.mp3)

In the next tut, we’ll start to look at some creative effects and routing ideas to help shape this track into something that is uniquely our own. See you then.