Subscribe to GameFromScratch on YouTube Support GameFromScratch on Patreon

Blender Book Round-up



With the recent (limited time) release of Unity Android and iOS for free, there is bound to be an increase in interest. One starting point is books, of which there are now a few dozen available. This post puts together as much information on a single page as possible to make your selection process as easy as possible. If I missed a book, please let me know as I want this list to be as comprehensive as possible. Coincidentally, things are in alphabetical order… initially.  Books I’ve missed will be added at the end.



 

3D for iPhone Apps with Blender and SIO2: Your Guide to Creating 3D Games and More with Open-Source Software

Author: Tony Mullen
Blender # 2.49
Publisher: Sybex
ISBN: 978-0470574925
Publish Date: Feb 15/2010
Avg Review Score: 3
Pages: 328
Links:
Amazon.com
Safari Books Online
Sybex/Wiley
book1
 
Table of Contents:
  • Introduction
  • Chapter 1: Getting Started with 3D Development for the iPhone
  • Chapter 2: Introducing Graphics Programming in SIO2
  • Chapter 3: Saying Hello to the Blender/SIO2/iPhone World
  • Chapter 4: Going Mobile with SIO2
  • Chapter 5: Extending Interactive Feedback with Picking and Text
  • Chapter 6: Creating an Immersive Environment in SIO2
  • Chapter 7: Props and Physical Objects
  • Chapter 8: Animating a Character
  • Chapter 9: Working with Widgets
  • Appendix A: Blender Basics
  • Appendix B: Key Concepts for Graphics Programming
  • Appendix C: SIO2 Reference
Publishers Description:

Create exciting, interactive 3D apps for the iPhone and iPod Touch

What a combination-using free, open-source Blender software and the SI02 game engine to create very cool 3D characters and games for the very hot devices of the moment, the iPhone and iPod Touch. Whether you're coming to this as an iPhone developer or as a Blender artist, this book is for you. Learn how to create 3D content using Blender's WYSIWYG approach, find helpful information on Xcode and other iPhone SDK topics, master physical collisions, and acquire the skills you need to bridge both worlds with fun, compelling content.

  • Shows you what you need to know to use Blender software, the SI02 game engine, and iPhone SDK to create interactive 3D content for the iPhone and iPod Touch
  • Walks you through a series of tutorials that you can use as starting points for your own creations
  • Provides enough information on the iPhone software developer kit (SDK) to get you started quickly
  • Covers Blender's physics simulation library, Bullet, and Blender's robust collision functionality

Bridge the exciting worlds of Blender and iPhone app development in an easy-to-follow pipeline with this one-of-a-kind guide.


Animacion de personajes con Blender ( Spanish )

Author: Tony Mullen
Blender # 2.4x
Publisher: Anaya Multimedia
ISBN: 978-8441523050
Publish Date: Nov 2007
Avg Review Score: N/A
Pages: 542
Links:
Amazon.com
Not on Safari
Anaya
book2
 
Table of Contents:
  • Introducción
  • Parte I. Crear un personaje con Blender
  • Capítulo 1. Fundamentos básicos de Blender: Interfaz y objetos
  • Capítulo 2. Trabajar con mallas
  • Capítulo 3. Completar el modelo con materiales, texturas y partículas
  • Capítulo 4. Esqueletos y montaje de personajes
  • Capítulo 5. Claves de forma y montaje facial
  • Capítulo 6. Fundamentos básicos de animación
  • Capítulo 7. Animación de esqueleto
  • Capítulo 8. Animación facial y sincronización de audio
  • Capítulo 9. Animación no lineal
  • Capítulo 10. Otros aspectos de la animación de personajes
  • Capítulo 11. Iluminar, renderizar y editar su animación
  • Capítulo 12. Utilizar scripts Python
  • Capítulo 13. Producciones a gran escala: Elephants Dream y Plumíferos
  • Capítulo 14. Elephants Dream
  • Capítulo 15. Feifi el canario: los Plumíferos remontan el vuelo
  • Capítulo 16. Blender en el proceso de trabajo
  • Capítulo 17. Otros software y formatos
  • Capítulo 18. Recursos para aprender más
  • Apéndice. Contenido del DVD
Publishers Description:

La animación en tres dimensiones se está utilizando cada vez más en el mundo del arte y de las nuevas tecnologías. Es una de las disciplinas con mayor futuro y progreso. Precisa no sólo de creatividad y cualidades artísticas, sino también de una técnica desarrollada. Blender es un programa libre, multiplataforma y muy potente que gana fuerza dentro de la animación 3D. Con este libro aprenderá a modelar y animar paso a paso utilizando ejemplos del mundo real, especialmente personajes. Desde los aspectos básicos de Blender hasta la creación de expresiones faciales y emociones, podrá sacarle el máximo provecho a todas las herramientas y transformar totalmente el aspecto de las películas. El libro incluye un DVD con el programa entre otros muchos recursos.


Beginning Blender: Open Source 3D Modeling, Animation, and Game Design

Author: Lance Flavell
Blender # 2.5x
Publisher: APress
ISBN: 978-1430231264
Publish Date: Dec 2010
Avg Review Score: 5/5
Pages: 448
Links:
Amazon.com
Safari Books Online
APress
book3
 
Table of Contents:
    1.   History and Installation
    2.   The Interface
    3.   Modeling
    4.   Lighting and  Procedural Textures
    5.   UV Mapping 
    6.   Curves and NURBS
    7.   Basic Rigging and Animation
    8.   Advanced Rigging
    9.   Making Movies
    10.   Particles and Physics
    11.   The Game Engine
    12.   Going Further
    13.   Companies That Use Blender
    14.   Blender and GPL Terms of Use
    15.   GNU Public License
    16.   OpenContent License
Publishers Description:

A new world of creative possibilities is opened by Blender, the most popular and powerful open source 3D and animation tool. Blender is not just free software; it is also an important professional tool used in animated shorts, television commercials, and shows, as well as in production for films like Spiderman 2. Lance Flavell's Beginning Blender will give you the skills to start shaping new worlds and virtual characters, and perhaps lead you down a new professional path.

 

Beginning Blender covers the Blender 2.5 release in-depth. The book starts with the creation of simple figures using basic modeling and sculpting. It then teaches you how to bridge from modeling to animation, and from scene setup to texture creation and rendering, lighting, rigging, and ultimately, full animation. You will create and mix your own movie scenes, and you will even learn the basics of games logic and how to deal with games physics.


Whether you are new to modeling, animation, and game design, or whether you are simply new to Blender, this book will show you everything you need to know to get your 3D projects underway.

 

What you’ll learn

 

  • How to create models using sculpt mode, extrusion modeling, and more
  • Go beyond playing with color to learn procedural texturing and UV mapping
  • How to use light and depth of focus to make are realistic-looking model
  • Adding rigging and realistic animation
  • Using the compositor for movie mixing and lip-syncing animations 
  • How to put the games engine and physics to work to create full-featured games

Blender ( Spanish )

Author: Roland Hess
Blender # ?
Publisher: Anaya
ISBN: 978-8441529038
Publish Date: Mar 2011
Avg Review Score: N/A
Pages: 384
Links:
Amazon.com
Not on Safari
Anaya
book4
 
Table of Contents:
  • INTRODUCCIÓN
  • CAPÍTULO 1. INTRODUCCIÓN AL 3D: RECREAR EL MUNDO DENTRO DE SU ORDENADOR, O NO
  • CAPÍTULO 2. LA INTERFAZ DE BLENDER
  • CAPÍTULO 3. CONCEPTOS BÁSICOS SOBRE OBJETOS Y ANIMACIÓN
  • CAPÍTULO 4. MODELAR: UN MILLÓN A UNO
  • CAPÍTULO 5. ILUMINACIÓN: UNA SENCILLA OPERACIÓN MUY COMPLEJA
  • CAPÍTULO 6. CREAR PERSONAJES
  • CAPÍTULO 7. CREAR SUPERFICIES
  • CAPÍTULO 8. ESCULPIR
  • CAPÍTULO 9. RIGGING: ORTOPEDIA DIGITAL
  • CAPÍTULO 10. FORMAS Y MORPHING
  • CAPÍTULO 11. ANIMACIÓN DE PERSONAJES: LA PARTE DIVERTIDA
  • CAPÍTULO 12. RENDERIZAR: ¡MÁS RÁPIDO, PROCESADOR!
  • CAPÍTULO 13. ANIMACIÓN AMBIENTAL
  • CAPÍTULO 14. COMPILAR EN VÍDEO Y SALIDA FINAL
Publishers Description:

Blender se ha convertido en una de las herramientas de animación y modelado 3D más importantes del mercado. La envergadura, resultados y poderío de sus herramientas así lo justifican. Un programa gratuito de código abierto, idóneo para todos aquellos que desean adentrarse en el mundo de las tres dimensiones con la menor inversión posible. Animadores y artistas aprenderán los aspectos básicos de la nueva interfaz del programa y las herramientas de modelado, escultura e iluminación. Podrán utilizarlas en el proceso de animación, desde el renderizado hasta la edición de vídeo. Las novedades más importantes son una renovada interfaz, el sistema de animación de personajes y fotogramas clave, y el simulador de humo. Más que una guía, este libro describe una filosofía bajo cuyos encantos han sucumbido tantos artistas 3D. Un título práctico que hurga en las tripas de Blender y sus usos. En el sitio Web de Anaya Multimedia, www.anayamultimedia.es, encontrará los archivos que acompañan y complementan cada fase del proyecto.

 


Blender - 3D Grafik  und   Animationsprogramm ( German )

Author: K Laemmermann
Blender # ??
Publisher: Sybex
ISBN: ASIN B007YLFWEM
Publish Date: April 2012
Avg Review Score: N/A
Pages: 328
Links:
Amazon.com
Not on Safari
Amazon Digital Services
book5
 
Table of Contents:

3D-Grafiksoftware
Videoschnitt
Spiel-Engine
Compositing
Python (Programmiersprache)
Polygon
Bézierkurve
Non-Uniform Rational B-Spline
Texture Mapping
Direkte Kinematik
Inverse Kinematik
Raytracing
Umgebungsverdeckung
Radiosity (Computergrafik)
Street Performer Protocol
Bankrott
YafaRay
Elephants Dream
Google Summer of Code
Big Buck Bunny
Bewegungsmessung
Easter Egg
Polygonnetz
Orang-Utans
Jay und Silent Bob schlagen zurück
Utah-Teekanne
YouTube
Linux
Mac OS X
Solaris (Betriebssystem)
FreeBSD
IRIX
C++

Publishers Description:

???

 


3D for iPhone Apps with Blender and SIO2: Your Guide to Creating 3D Games and More with Open-Source Software

Author: Tony Mullen
Blender # 2.49
Publisher: Sybex
ISBN: 978-0470574925
Publish Date: Feb 15/2010
Avg Review Score: 3
Pages: 328
Links:
Amazon.com
Safari Books Online
Sybex/Wiley
book1
 
Table of Contents:
  • Introduction
Publishers Description:

Create exciting, interactive 3D apps for the iPhone and iPod Touch

 


3D for iPhone Apps with Blender and SIO2: Your Guide to Creating 3D Games and More with Open-Source Software

Author: Tony Mullen
Blender # 2.49
Publisher: Sybex
ISBN: 978-0470574925
Publish Date: Feb 15/2010
Avg Review Score: 3
Pages: 328
Links:
Amazon.com
Safari Books Online
Sybex/Wiley
book1
 
Table of Contents:
  • Introduction
Publishers Description:

Create exciting, interactive 3D apps for the iPhone and iPod Touch

 


3D for iPhone Apps with Blender and SIO2: Your Guide to Creating 3D Games and More with Open-Source Software

Author: Tony Mullen
Blender # 2.49
Publisher: Sybex
ISBN: 978-0470574925
Publish Date: Feb 15/2010
Avg Review Score: 3
Pages: 328
Links:
Amazon.com
Safari Books Online
Sybex/Wiley
book1
 
Table of Contents:
  • Introduction
Publishers Description:

Create exciting, interactive 3D apps for the iPhone and iPod Touch

 






blog comments powered by Disqus


Month List

Popular Comments

Moai Tutorial Part 6: Who put the bomp in the Moai, Moai, Moai. Playing audio in… you guessed it… Moai
Subscribe to GameFromScratch on YouTube Support GameFromScratch on Patreon


17. September 2012

 

In this tutorial, we are going to look at how to play audio using Moai.  This is going to make heavy use of moaigui, so if you haven’t already, you may want to check the prior tutorial in this series.

 

As always, let’s jump right in to the code.  You may notice that the code order is starting to seem a little… odd. This is because I am grouping code mostly in order of newness, as opposed to how it would logically be laid out.  If you are thinking “I wouldn’t order things this way!”, well.. neither would I, normally.

 

screenWidth = MOAIEnvironment.screenWidth
screenHeight = MOAIEnvironment.screenHeight
if screenWidth == nil then screenWidth =1280 end
if screenHeight == nil then screenHeight = 800 end


MOAISim.openWindow("Window",screenWidth,screenHeight)

viewport = MOAIViewport.new()
viewport:setSize(screenWidth,screenHeight)
viewport:setScale(screenWidth,screenHeight)

package.path = './moaigui/?.lua;' .. package.path
require "gui/support/class"
local moaigui = require "gui/gui"
local resources = require "gui/support/resources"
local filesystem = require "gui/support/filesystem"
local inputconstants = require "gui/support/inputconstants"
local layermgr = require "layermgr"


local gui = moaigui.GUI(screenWidth,screenHeight)


gui:addToResourcePath(filesystem.pathJoin("moaigui/resources", "fonts"))
gui:addToResourcePath(filesystem.pathJoin("moaigui/resources", "gui"))
gui:addToResourcePath(filesystem.pathJoin("moaigui/resources", "media"))
gui:addToResourcePath(filesystem.pathJoin("moaigui/resources", "themes"))

layermgr.addLayer("gui",99999, gui:layer())
gui:setTheme("basetheme.lua")
gui:setCurrTextStyle("default")

function onPointerEvent(x, y)
    gui:injectMouseMove(x, y)
end

function onMouseLeftEvent(down)
    if(down) then
        gui:injectMouseButtonDown(inputconstants.LEFT_MOUSE_BUTTON)
    else
        gui:injectMouseButtonUp(inputconstants.LEFT_MOUSE_BUTTON)
    end
end

function onTouchEvent(eventType,idx,x,y,tapCount)
    --gui:injectTouch(eventType,idx,x,y,tapCount)
    onPointerEvent(x, y)
    if (MOAITouchSensor.TOUCH_DOWN == eventType) then
        onMouseLeftEvent(true)
    elseif (MOAITouchSensor.TOUCH_UP == eventType) then
        onMouseLeftEvent(false)
    end
end


if MOAIInputMgr.device.pointer then
    MOAIInputMgr.device.pointer:setCallback(onPointerEvent)
    MOAIInputMgr.device.mouseLeft:setCallback(onMouseLeftEvent)
else
    MOAIInputMgr.device.touch:setCallback(onTouchEvent)
end


function onButtonClick(event,data)
    if(string.find(buttonPlay:getText(),"Play") ==1) then
        song1:play()
        buttonPlay:setText("Stop, that's creeping me out!")

        function checkSongDone()
            local song = song1
            while song1:isPlaying() do coroutine:yield() end

            song1:stop()
            buttonPlay:setText("Play Audio File using Untz")
        end

        if not checkLoop:getChecked() then
            songPlayingThread = MOAICoroutine.new()
            songPlayingThread:run(checkSongDone)
        end
    else
        song1:stop()
        buttonPlay:setText("Play Audio File using Untz")
    end
end

function onButtonRewind(event,data)
    if song1:isPlaying() then
        local pos = song1:getPosition()
        local length = song1:getLength()
        local tenPercent = (length * 1.10) - length
        pos = pos - tenPercent
        if(pos > 0) then
            song1:setPosition(pos)
        end
    end
end

function onButtonFastForward(event,data)
    if song1:isPlaying() then
        local pos = song1:getPosition()
        local length = song1:getLength()
        local tenPercent = (length * 1.10) - length
        pos = pos + tenPercent
        if(pos < length) then
            song1:setPosition(pos)
        end
    end
end

function onCheckboxChanged()
    song1:setLooping(checkLoop:getChecked())
end

function onVolumeChanged()
    MOAIUntzSystem.setVolume(sliderVolume:getCurrValue() / 100)
end



buttonPlay = gui:createButton()
buttonPlay:setPos(0,0)
buttonPlay:setDim(100,25)
buttonPlay:setText("Play Audio File using Untz")
buttonPlay:registerEventHandler(buttonPlay.EVENT_BUTTON_CLICK,nil,onButtonClick)

checkLoop = gui:createCheckBox()
checkLoop:setPos(0,26)
checkLoop:setDim(100,10)
checkLoop:setText("Loop?")
checkLoop:registerEventHandler(checkLoop.EVENT_CHECK_BOX_STATE_CHANGE,nil,onCheckboxChanged)

labelVolume = gui:createLabel()
labelVolume:setText("Volume")
labelVolume:setPos(0,36)
labelVolume:setDim(30,10)

sliderVolume = gui:createHorzSlider()
sliderVolume:setPos(30,36)
sliderVolume:setDim(70,10)
sliderVolume:setRange(0,100)
sliderVolume:setCurrValue(50)
sliderVolume:setValueDisplayLoc(sliderVolume.VALUE_DISPLAY_RIGHT)
sliderVolume:registerEventHandler(sliderVolume.EVENT_SLIDER_VALUE_CHANGED,nil,onVolumeChanged)

buttonRewind = gui:createButton()
buttonRewind:setPos(0,50)
buttonRewind:setDim(50,10)
buttonRewind:setText("Rewind")
buttonRewind:registerEventHandler(buttonRewind.EVENT_BUTTON_CLICK,nil,onButtonRewind)

buttonFastForward = gui:createButton()
buttonFastForward:setPos(51,50)
buttonFastForward:setDim(50,10)
buttonFastForward:setText("Fast Forward")
buttonFastForward:registerEventHandler(buttonFastForward.EVENT_BUTTON_CLICK,nil,onButtonFastForward)

MOAIUntzSystem.initialize ()
MOAIUntzSystem.setVolume(0.5)
song1 = MOAIUntzSound.new()
song1:load("demongirls.ogg")

 

If we run the application( in the Moai-untz host ), we see:

 

image

 

Click the “Play Audio File using Untz” button and the song will play, the slider increases and decreases the volume, the loop check box I bet you can guess what it does.  Rewind and Fast Forward change the playback position by 10% at a time.

 

This looks like a wall of code, but don’t worry, it’s not all that bad.  In reality, most of it is maoigui code that we covered earlier.  We use a couple of new controls ( the check box and slider ), but nothing in the UI code should be all together new.  Most of our new logic is in the click handler methods, so let’s start there.

 

function onButtonClick(event,data)
    if(string.find(buttonPlay:getText(),"Play") ==1) then
        song1:play()
        buttonPlay:setText("Stop, that's creeping me out!")

        function checkSongDone()
            local song = song1
            while song1:isPlaying() do coroutine:yield() end

            song1:stop()
            buttonPlay:setText("Play Audio File using Untz")
        end

        if not checkLoop:getChecked() then
            songPlayingThread = MOAICoroutine.new()
            songPlayingThread:run(checkSongDone)
        end
    else
        song1:stop()
        buttonPlay:setText("Play Audio File using Untz")
    end
end

This is the code that is executed if the brilliantly named buttonPlay button is clicked.  The first thing we do is check to see if the button’s text starts with “Play”, which if it does, that means we are currently not playing a song.  Therefore we start playing our song ( aptly named song1 ) with a call to the play() method.  We then update our button’s text to indicate it’s new status.  The next little bit of code might seem a bit confusing at first, but it is pretty powerful.

 

First we are declaring a nested function checkSongDone().  The next line is where the magic happens.  It’s a while loop that loops until the condition isPlaying() becomes false.  Each pass through the loop we call coroutine:yield().  So, what the heck was that all about? Well… this is going to be a bit tricky to explain, but I will do my best.

 

If you are an old fart like me, you may remember multitasking in the pre-Win95 pre-emptive multitasking days.  Essentially you ran multiple programs at the same time by giving each one a chunk of processing time and a well behaved program was supposed to yield control when it wasn’t busy.  Essentially the operating system switched between running programs and said “ok, your turn” and a well behaved program would quickly exit if it was done doing whatever it needed to do.  Well, in a nutshell that is what is happening here.

 

A coroutine is sort of the Moai version of a thread.  Using coroutines, you are able to run code in parallel, so while our game loop is still running, the function checkSongDone is blissfully churning away in the background checking to see if the song is done.  Thing is, until the song is actually done, the coroutine doesn’t really have anything else to do, so it calls yield().  It is not until that condition is true ( isSongPlaying returns false ) will the function continue execution.  Once this happens we (somewhat redundantly) call song1:stop() then update the button’s text to “Play Audio…”.  The end result of this whole chunk of code is, we essentially created an on song end handler, so when the song is done playing, the text of the button will update.

 

The next chunk of code checks the checkbox checkLoop, which if checked indicates that we want the song to loop continuously.  If it is not checked, that means we want to run our coroutine, which we create with a call to MOAICoroutine.new(), then run with the run() method, passing in the function to run.

 

If the button’s text however indicates that the song is playing, in which case the button acts like a STOP button, simply stopping playback ( even if loop is checked ) and resetting back to the “Play…” text.  I encourage you to look deeper in to Coroutines, they are a very powerful feature of Lua. MOAICoroutine itself is only a thin wrapper over Lua’s coroutine abilities.

 

Also, you may have noticed MOAIThread in the examples and wondered when to using MOAIThread instead of MOAICoroutine.  The short answer is, you dont!  The more accurate and useful short answer is, MOAIThread *IS* MOAICoroutine.  It was renamed and the documentation just hasn’t caught up yet.  Well at least, it hadn’t at the point I wrote this.

 

TL;DR, coroutines are cool, learn about them, use them, love them.

 

function onButtonRewind(event,data)
    if song1:isPlaying() then
        local pos = song1:getPosition()
        local length = song1:getLength()
        local tenPercent = (length * 1.10) - length
        pos = pos - tenPercent
        if(pos > 0) then
            song1:setPosition(pos)
        end
    end
end

function onButtonFastForward(event,data)
    if song1:isPlaying() then
        local pos = song1:getPosition()
        local length = song1:getLength()
        local tenPercent = (length * 1.10) - length
        pos = pos + tenPercent
        if(pos < length) then
            song1:setPosition(pos)
        end
    end
end

This is the code that executes if you hit the Fast Forward or Rewind buttons.  Basically it gets the current position of the song ( playback-wise ) using getPosition() and the length of the song using getLength().  Next we calculate what 10% of the length is, and either add or subtract that amount from the current position depending if we are fast forwarding or rewinding.  Next we check sure to make sure the position is valid after being modified and if it is, we change the position of the song using setPosition().  End result, pressing Fast forward advances the song by 10% of it’s length, while hitting rewind moves it back 10%.

 

function onCheckboxChanged()
    song1:setLooping(checkLoop:getChecked())
end

This is the code that executes if the checkbox checkLoop is checked or unchecked.  It simply toggles the value of setLooping based off the if the checkbox is checked, using getChecked().

 

function onVolumeChanged()
    MOAIUntzSystem.setVolume(sliderVolume:getCurrValue() / 100)
end

This is the code that is executed if the slider sliderVolume is changed.  This uses the MOAIUntzSystem singleton to change the global volume level using setVolume().  setVolume takes a value from 0.0 to 1.0, while the sliders value returned by getCurrValue() is from 0 to 100, so we divide it by 100.

 

So then, what the heck is an Untz?  It’s the included cross platform audio system.  You also have the option to use FMOD, a commercial audio solution.  Untz does the trick though, works on Android and iOS.  There is a very important caveat… if you are going to be running using the UNTZ audio library you need to use the Moai-untz host!!! when running on the PC.  You will get exceptions if you try to call MOAIUntzSystem from the normal Moai host.  The Moai-untz host is in the same directory as the Moai host.

 

Most of the UI code is pretty much identical to what you’ve seen already, so I wont really go into it, that leaves:

 

MOAIUntzSystem.initialize ()
MOAIUntzSystem.setVolume(0.5)
song1 = MOAIUntzSound.new()
song1:load("demongirls.ogg")

This code first initializes the MOAIUntzSystem singleton.  Then it sets the global volume to 50%.  Next we create our song song1 with a call to MOAIUntzSound.new().  Finally load the song ( in the same directory as main.lua ) with a call to load().

 

You might be asking yourself “what sound formats does Untz support?”.  That’s a good question with a tricky answer.  Basically the safe answer is ogg and wav.  The not so safe answer is, it depends on the platform.  For example, iOS, Mac and Windows will work with mp3, but Android wont.  Beyond WAV and OGG, the file is just passed to the native system for handling, so if the platform supports it, Moai supports it.

 

But if you really want to be cross platform, just encode everything in to ogg.  In this day of increasingly wealthy lawyers, the last thing we want to do is deal with a patent encumbered format like mp3!

 

Oh yeah, and the music… it’s seriously creepy stuff and I downloaded it from here.  Obviously you can substitute any song you want from your Justin Beiber collection, just make sure it’s not an MP3 if you are running on Android.  Of course, you can convert from just about any audio format to just about any other audio format using the free and amazing Audacity.  I do get 10% of all proceeds for saying that.  I may need a new business model.

 

Programming , ,

blog comments powered by Disqus

Month List

Popular Comments