Getting ringtones on your iPhone for free

Update: Now that Apple’s updated GarageBand, you can make your own iPhone ringtones without any of the hackery below! Don’t have GarageBand? It’s part of iLife ’08. It also comes for free with any new Mac, like the all-in-one 20″ iMac.


First of all, I didn’t figure this out. I’m simply putting a few pieces together from other people. That said, here’s how I was able to get ringtones on my iPhone from my MacBook, completely free.

Clue Number 1: You can mount your iPhone as a hard drive. I don’t remember where I first learned about this, but MacFuse and iPhoneDisk makes this trivial. This allowed me to mount my iPhone and copy files directly to it.

Clue Number 2: Ringtones are stored in a user-accessible location. One place I learned about this is Erica Sadun’s article on the O’Reilly Network. Erica’s article says to put the music files in /var/root/Library/Ringtones (which, when you mount your iPhone via iPhoneDisk translates to /Volumes/Library/Ringtones); this location didn’t work for me, though.

Clue Number 3: Ringtones need a special file to point to them. I got this from a post on pastebin.com, where the author Keldegar points out that you need a specially-formatted file called a “plist” (short for “property list”, which store preferences and so on). The author also pointed to a different location from what Erica at O’Reilly pointed to; this new location (/Volumes/Media/iTunes_Control/Ringtones) worked for me.

Putting these three clues together, I’m now able to use any audio files iPhone can play as a ringtone! Here’s the step-by-step; it’s more complicated to write it out than to actually do it.

1. Download and install MacFuse. You need at least MacFuse Core 0.4.0.

2. Download and install iPhoneDisk. The latest version as of this writing is iPhoneDisk-20070826.

3. Double-click iPhoneDisk; it shows an icon iPhoneDisk menu item icon in the menubar to show it’s running.

4. Connect your iPhone. A hard-drive icon named “Media” iPhone Media hard drive icon should show up in Finder. iTunes will launch and sync if it’s set to automatically do that.

5. In Finder, open the Media drive and then the iTunes_Control folder.

7. Create a new folder inside iTunes_Control named Ringtones.

8. Copy the music you want to use as a ringtone into the Ringtones folder.

Now comes the slightly tricky part. You’ll need a text editor (not a word processor!). I’ll assume you’ll use TextEdit, but you can use BBEdit/TextWranger, TextMate, Coda, etc.

9. In TextEdit, make a new file (File > New) and convert it to plain text (Format > Make Plain Text).

10. Copy and paste the following code. You will need to change it in a couple of places to match your songs (see the next step).

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Ringtones</key>
    <dict>
       <key>SongFileName.mp3</key>
        <dict>
            <key>GUID</key>
            <string>1</string>
            <key>Name</key>
            <string>A Song Name</string>
        </dict>
   </dict>
</dict>
</plist>

11. You want to change the following sections to match your songs:

  • SongFileName.mp3 is the filename of the song (as saved in Finder).
  • A Song Name is the name you want iPhone to display.
  • The number 1 can be any number, as long as it’s unique in this file (that is, if you add a second song, that song gets 2, a third song gets 3, etc.)

This file, as is, will give you one song. Here’s an example of a file with two songs:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Ringtones</key>
    <dict>
       <key>SongFileName.mp3></key>
        <dict>
            <key>GUID</key>
            <string>1</string>
            <key>Name</key>
            <string>A Song Name</string>
        </dict>

        <key>AnotherSongFileName.mp3</key>
        <dict>
            <key>GUID</key>
            <string>2</string>
            <key>Name</key>
            <string>Another Song Name</string>
        </dict>

    </dict>
</dict>
</plist>

Hopefully it’s clear what to copy and where to paste it. Download this Ringtones.plist file as a starting point. (As an aside, if you’re a Mac developer with the Xcode tools installed, you can use /Developer/Applications/Utilties/Property List Editor to make short work of editing this file.)

12. Save this file as Ringtones.plist to /Volumes/Media/iTunes_Control/iTunes/Ringtones.plist.

Now navigate on your iPhone to Home > Settings > Sounds > Ringtones and you should see your list of ringtones!

Troubleshooting

Things don’t always go perfectly. Here are a few items that might cause some issues (usually your songs don’t show up in the Ringtones list).

The plist file is misnamed, malformed, or not in the right location.

The file is /Volumes/Media/iTunes_Control/iTunes/Ringtones.plist.

Try creating the Ringtones.plist file with only a single song to be sure that works before adding additional songs.

The Ringtones folder is in the wrong location.

I got this working by putting the Ringtones folder inside /Volumes/Media/iTunes_Control; this puts it at the same level as the Artwork, iTunes and Music folders.