SvOrbis: OggVorbis Player for GP32

This page is intended to grow as the project grows.


Current version is 0.9e


My domain got hijacked by a domainshark. So I moved the SvOrbis homepage to So, again, please update your links and bookmarks.
I'm rearranging my webserver. Due to that the URL of the SvOrbis homepage will move from to Please update your links and bookmarks.
It's been a while, but I decided to put something under the christmas tree for you:
Version 0.9e has been released. Changes include:

Now SvOrbis is able to print also out characters from 0x80 to 0xff, in addition to the characters from 0x20 to 0x7f, of cause. The default charset is now ISO-Latin1 hand pixeled by me.

Since I only got one submission on my call for a new logo and icon this one will be used for now. If anyone sends me another one in, I'll set up a poll.

Special thanks to Steffen Böhme from for providing me with a professional logo.

Right now I'm working on an online gif-to-charset converter and a small utility to convert/upload a standard playlist to SvOrbis.

Version 0.9d has been released. Bug fixes include:
Version 0.9c has been released. Bug fixes include: (Version 0.9b was internal only, since all fixes except for the rewritten sounddriver were minimal.)
Since a key component has been rewritten, please test this version an report your experiences, bad and good!

Sometime since release of Version 0.9a I got honored by the GP32Xtreme team with this:
GP32 guru   Thanks.
Version 0.9a has been released. Bug fixes include:
Version 0.9 has been released. New features include: This is next next step to the V1.0 release. Until then no new features will be included, only bugs will be fixed. For each bug fixed there will be a release like V0.9a, V0.9b, etc. So keep on testing and reporting bugs.
Change of plans. I found a rather nasty bug in GpTremor, that occurs on my q=-1 mono test OGGs. Every ~10 seconds there's an error in decoding. This doesn't happen on X86, so it seems to be ARM related, since it's in Yogg also. So I'm switching the release schedule of GpTremor and SvOrbis. SvOrbis Version 0.9 will be released before the first official release of GpTremor. I also have still to decide between two different incarnation of GpTremor, one based upon the version that's in Yogg, the other one from the Subversion checkout 7111.

By the way: I got several todos from my list done this weekend (look below) and also a new color scheme for default. There's also a decision been made on what will be included in SvOrbis Version 0.9.
A rough roadmap has been plotted. Version 0.9 will be the last release before 1.0, which itself will be the first version declared stable. Between 0.9 and 1.0 there will be a feature freeze. So anything that didn't make it in version 0.9 won't be in 1.0. This means: send in your feature requests now!. How to request a feature? First choice is the mailing list. You can also go for this thread on
Version 0.8 has been released. New features include:
A faq section has been included.
A first homepage has been hacked up and Version 0.7 has been released.



Hello Mr. Piracyhunter, all OGGs in the Screenshot above have been encoded from my own CDs.

Known bugs:

Bugverified workaround
Sound cracksnot possible Please be a bit more specific when reporting that kind of bug. There are several things I need to know. Most important: on what song and how's the song encoded? (Quality or bitrate setting, rate, mono/stereo) (If you've got anything better than modem, it would be nice if you could provide me with your Ogg file triggering the problem). When does the noise appear? (Always, at specific time, when writing to SMC) If only during write to SMC: How many Oggs are on the SMC?
GpTremor will not work 100% all the time on some mono files verified
This bug also occurs in Yogg, which means that this one is burried deep down in the port of the library. That one will be hard to pin down, but I'll try. The bug was in not in GpTremor, but in the sound driver I adopted from Yogg. It's now been replaced with new one done from scratch implemented in Version 0.9c.
The voltage detection always shows "0.00V"not verifiedThere are very few modded GP32s available. Mr.Spiv has one of them and let me know, that the voltage display didn't work on his. I'll need to mod mine to test this.
The logo looks bad-Yes, I know. I'm waiting for someone to provide me with a better one. (Scheduled for V1.0)

Requests made for Version 0.9

requeststatus comment
Scheduled for Version 0.9
Switch to GpTremorswitch is done
Tremor release postponed after SvOrbis V0.9
First of all there needs to be an official release of GpTremor before the SvOrbis V1.0 release, right now there are two version I have. The older version used by Yogg, and a port of the current subversion snapshot 7111.
playlist shuffle instead of random playdone shuffle or random is selectable via svorbis.ini now.
pause buttondone -
rewrite input codedone so a key combo will wait till release and a key customization via svorbis.ini is possible.
error message if no oggs are founddone Done for now. It might get a rework in bug-fixing phase.
include a help screendone -
move file over playlist borderdone -
logo and iconin production That's something that also needs to be done. A friend of mine is working on a suggestion. Any other volunteers?
Won't make it in Version 0.9
playlist generator for windows and unix sometime soon No big problem, but right now I'm rather hacking on the GP32.
equalizer / bass boosternot in V1.0
maybe later
For that I need some example code or at least the algorithms. If someone can provide me with this, I'll hack it in. If it doesn't slow down the system too much, it stays in.
a simple bar graphnot in V1.0 just an idea: a simple bar graph that shows the kbps of the last seconds.
mods, sidsnot likely
to happen
OggVorbis has one standard, MOD has many, so there's no "this can play it all" library. SID is similar, except compatibilty is better. But I wrote this software as a walkman replacement, and most MODs & SIDs aren't just the quality. If you really want them, why not convert them to 22KHz mono Ogg? Sizes will get reasonable, and the mono bug will definitely out in the next version.
skins, visualization, slideshownot likely
to happen
Again, I need to note, that SvOrbis is intended to be a walkman replacement for listening to music. Colors and charset can be configured, that should be enough. If not, wait for GpTremor (that'll be out after SvOrbis V0.9) and code your own. Or take the SvOrbis sources and put the changes in yourself, submit them to me, and I'll merge them in. Or GpTremor will be included in a graphic viewer program.
edit svorbis.ini on gp32not likely
to happen
I think that's too much effort for a rather little gain. Come on, you'll set up your system once and after that you'll just use it. At least that's what I usually do. And a one time setup can be done much easier (on both coding and the setup itself) on the host machine, don't you think?


up:previous track
down:next track
left / right:move artist / title border
select + up:move current track up
select + down:move current track down
start + select:toggle lock
start + A:toggle random
R:fast forward

Parameters for the config file (gp:\GPETC\SVORBIS.INI)

The config file is optional, defaults have been compiled in. (This is the supplied SVORBIS.INI)

   # configuration file for svorbis v0.9
   # OggVorbis Player for GP32
   # comments start with a "#" or a ";"
   # file and dir options
   # where to save the playlist
   #file.playlist = gp:\ogg\playlist.bin
   # which font to use
   #file.charset = (use internal)
   # where to look for oggs
   #file.ogg.dir = gp:\ogg
   # colors
   # colors are RGB323. some examples:
   # 00000000 is black
   # 11100000 is bright red
   # 00011000 is bright green
   # 00000111 is bright blue
   # 00000001 is dark blue
   # 11111111 is white
   #color.background = 11111111
   #color.text = 00000010
   #color.highlight = 10010111
   #color.outline = 10010111
   #color.lines = 00000111
   # position of highlight bar
   #position.highlight = 8
   # display end of playlist?
   # 0 = no; 1 = default; 0x20-0x7f = use the ASCII char as marker
   #playlist.end.marker = 1
   # Ogg Info to use
   #comment.info1 = ARTIST=
   #comment.info2 = TITLE=
   # identify this version of SvOrbis as you own :)
   #version = Loaded Config
   # parameter for Rob's voltage detection mod
   # usually 3, default is no detection
   #voltage.detection = -1
   # set cpu clock
   #cpu.mclk = 136000000
   #cpu.divfactor = 0x3c011
   #cpu.clkmode = 3
   # how fast should fast forward and rewind go
   # in seconds, if > 500 in milliseconds
   #wind.step = 10000
   # which random mode should be used?
   # random or shuffle
   #random.mode = random
   # key layout
   # key values are:
   # left:   0x0001
   # down:   0x0002
   # right:  0x0004
   # up:     0x0008
   # L:      0x0010
   # B:      0x0020
   # A:      0x0040
   # R:      0x0080
   # start:  0x0100
   # select: 0x0200
   # add     0x1000 if the key should also work in locked mode
   #key.previous.track = 0x0008 = 0x0002
   #key.rewind = 0x0010 = 0x0080
   #key.separator.left = 0x0001
   #key.separator.right = 0x0004
   #key.move.track.up = 0x0208
   #key.move.track.down = 0x0202
   #key.random = 0x0140
   #key.pause = 0x0120
   #key.lock = 0x1300 = 0x1040 = 0x0020

The color format "binary" is an 8 bit binary number.

The format "number" is a plain decimal number, a hex number is prefixed with "0x".

All files and folders must start with "gp:\"

The parameter for voltage.detections states which adc channel to use. If you modded your GP32 according to Rob's description, use "voltage.detection = 3".

Good to know (aka some views behind the scene):

The mailing list

Format of Charset:

Short: The format is the same as in the C64/C128, only sorted in ascii.
Each char is 8 pixels wide and stored in a byte, highest bit left, as you would read them as a binary number. The first 8 bytes are the space character; the second 8 bytes are the "!" sign, and so on, till ascii character 127 (see the table for an example of an 8x8 font). That sums it up to 768 bytes per 8 lines charset. If a charset is only 512 bytes in size the area from 0x100-0x1ff is copied to 0x200-0x2ff, giving you only uppercase letters.

byte no.dataremark
0%00000000"space" char 1st row
1%00000000"space" char 2nd row
2%00000000"space" char 3rd row
3%00000000"space" char 4th row
4%00000000"space" char 5th row
5%00000000"space" char 6th row
6%00000000"space" char 7th row
7%00000000"space" char 8th row
8%00011000"!" char 1st row
9%00011000"!" char 2nd row
10%00011000"!" char 3rd row
11%00011000"!" char 4th row
12%00000000"!" char 5th row
13%00000000"!" char 6th row
14%00011000"!" char 7th row
15%00000000"!" char 8th row
264%00011000"A" char 1st row
265%00111100"A" char 2nd row
266%01100110"A" char 3rd row
267%01111110"A" char 4th row
268%01100110"A" char 5th row
269%01100110"A" char 6th row
270%01100110"A" char 7th row
271%00000000"A" char 8th row
520%00000000"a" char 1st row
521%00000000"a" char 2nd row
522%00111100"a" char 3rd row
523%00000110"a" char 4th row
524%00111110"a" char 5th row
525%01100110"a" char 6th row
526%00111110"a" char 7th row
527%00000000"a" char 8th row
760%00000000ascii char #127 1st row
761%00000000ascii char #127 2nd row
762%00000000ascii char #127 3rd row
763%00000000ascii char #127 4th row
764%00000000ascii char #127 5th row
765%00000000ascii char #127 6th row
766%00000000ascii char #127 7th row
767%00000000ascii char #127 8th row

Frequently Asked Questions:

What is OggVorbis?
From Ogg Vorbis is a fully open, non-proprietary, patent-and-royalty-free, general-purpose compressed audio format for mid to high quality (8kHz-48.0kHz, 16+ bit, polyphonic) audio and music at fixed and variable bitrates from 16 to 128 kbps/channel. This places Vorbis in the same competitive class as audio representations such as MPEG-4 (AAC), and similar to, but higher performance than MPEG-1/2 audio layer 3, MPEG-4 audio (TwinVQ), WMA and PAC.

Are there any OggVorbis player for Windows?
There sure are, a lot of them. WinAMP can play OggVorbis using a plugin, foobar 2000 can play them natively, and there's even a DirectShow Filter, so that you can use the ugly Windows Media Player.

What should I use to encode OggVorbis?
I don't know what you should use, but I can tell you what I'm using. For ripping I'm using CDex. For converting I'm using foobar 2000 and oggenc.exe from vorbis-tools.

What settings should I use?
I don't know that either, but I'm using "quality q=2" or "q=1". This way I get slightly over 3 hours on one 128MB SMC (q=2) or about 3 hours 45 minutes (q=1). If you know any better setting, let me know and I'll put it here.

What is better a constant bitrate or a variable bitrate?
I'm using variable. There are some passages in the audio data that can be better compressed than others, so using constant can result in wasting space, because there's "not enough" data to fit in one block, or wasting quality because there's "too much" data to fit in one block.

But if a song has a lower kbps can I then lower the clockspeed, or only if the khz is lower?
I did a quick test with a ~43MB 44100Hz wave file on my host pc.

Time needed to decode:
-q8 (6974409 bytes) : ~8.0 seconds
-q5 (4588576 bytes) : ~7.0 seconds
-q2 (2662463 bytes) : ~5.6 seconds

so one can say: "the lower the bitrate, the lower the cpu usage during decompression."

But: cpu usage is not everything on the GP32, you also gotta watch the usage of cpu bus (the one that's responsable for transfer of data between CPU and RAM). If the bus is clocked to slow for the amount of data transfered the gp32 sound bug tends to appear (the noise you heared up to version 0.7, if you push the stick left/right).

Anyway, I don't see the big hassle about lowering the cpu clock speed. I always keep a second pair of rechargeable batteries with me. If the first pair is down, I'll switch and the second pair will keep me entertained 'til the end of the day, at least. So I rather prefer sound quality over battery lifetime. Don't forget: if you disagree with this you can lower the CPU speed to 114MHz just by setting "cpu.mclk = 114" in SVORBIS.INI.

Why SvOrbis?
Besides playing games, I wanted to use the GP32 as a walkman replacement. So I checked different MP3 and OggVorbis players, but after using them for a short time, each one I tried had disadvantages that disqualified them as a real alternative. So at some point I got fed up, said "if you want something done properly, you've got to do it yourself", and started to do my own, based on some awesome work Yoyo did with his player called Yogg. And - with the Euro beta firmware - all I wanted was a player that started playback once I turned the GP32 on.

Why make a player who read only ogg files?
Why not a mp3/wav/mod/ogg player?
Because an ~96kBit OggVorbis sounds better than an 128kBit mp3 and I want to how the player as small as possible. This way I'm getting 3 hours of music (44100Hz, stereo) on one smc. The other cause is that the OggVorbis decoder Tremor runs better that libmad as far as I can tell from my experiments. And converting from mp3 to ogg is easy: take five minutes to install foobar2000 and oggenc.exe from vorbistools. After a onetime configuration on the "recode" option, I'll take just a click on the right mouse button and selecting "conversion" from the menu (I suggest using the "quality q=2" option), and voila, you've got an ogg file that fits the gp32 better than the mp3 ever could.

In the picture on your site I saw they were in a folder called ogg, but in what folder is that?
Just rename the folder mp3 to ogg, or create a folder called ogg in the root directory. You can also use the option "file.ogg.dir", to set the directory the files come from.

The layout sucks, can't you do better?
No, I don't want to. The player is intended to be a walkman replacement, so I tried to put as many info on screen as possible. The most time I'm using it, I'm not looking at it anyway. If you also want spiffy effects grab yourself the GpTremor library (ask for a prerelease, official release should be soon) and code something yourself. With the GP32 sound bug, it's not as easy as it looks ;).

will there be unifont support? (kor)
i wanna see titles on my own language.
Nope, ASCII only (Characters from 32 to 127). Hey, I'm German, and I can't see my umlauts either. On the other hand... you've got the source, you can do it. And I'm taking contributions. I'm also willing to help to extend the design for something like UTF-8.

You might also call this my revenge: I'd like to see more english on I don't get this either ;)

I'd really like it if it could be made to shut the screen down to conserve the battery (i have no idea how much it would save, but it would be a nice option)
I thought of that when I started this project, but the official docs state that turning off the LCD for a longer time will result in damaging it. I also doubt that it will increase the battery lifetime by far.

Maybe have a screensaver then? Because a screen that is stuck on the same colours for too long also tends to get damaged...
I haven't seen that on an LCD, only on CRTs and a TFT once. Implementation wouldn't be hard, though. From what I know is that direct sunlight is much more harmful to the LCD as showing the same colors. If anyone can show me a photo of a burnt-in LCD I'll hack it in as soon as possible, if not it moves to the todo-later list.

and background image support will be cool.
Ain't gonna happen. A background image just slows down the redraw of the screen (and also causing a reappearance of the GP32 sound bug), and degrades the readablity of the text. This player is for listening to music and other stuff, not for watching pretty pictures. I use it as a walkman replacement, so most time it's in some pocket, unregarded. Sorry, but I'm too old for nicknacks, I want functionality. You can download the source and hack it to your own needs anyway, or build your own player with the GpTremor library that will be released soon.

At what mhz. does it run?
Right now it's 136MHz. The main problem is to find a CPU setting that gets as close to 44100 Hz for audio. I also found a 114MHz mode, but that one does suffer a bit more from the GP32 sound bug. If you know a better CPU setting than I do, you can provide is via the config file.

(Hint: the 114MHz mode can be set by putting "cpu.mclk = 114" in the svorbis.ini, or you can set all three parameter needed for the GpClockSpeedChange() call by setting cpu.mclk, cpu.divfactorand cpu.clkmode in the config file. On how to get these parameters you should search the forum. The defaults are: "cpu.mclk = 136000000", "cpu.divfactor = 0x3c011" and "cpu.clkmode = 3". Setting wrong CPU parameter can cause everything from a system crash to strange output.)

I've got a question not covered here!
Best thing in this case is to subscribe the mailing list and post your question there. I'll be reading and answering it, promise!

This software is free software and distributed under the license terms of the GPL.

Valid HTML 4.01!