[Sprite_tm] is back again, and his work never fails to impress. His latest project is a Game Boy Advance MIDI synth that takes MIDI data from a keyboard or sequencer and maps that to Game Boy sound channels.
Because he seems to never do anything the normal way, [Sprite_tm] decided to run the Game Boy without a cartridge. We’ve seen this before; the GBA boots into the synth software over the link cable with multibooting.
[Sprite_tm] designed a circuit around an ATMega168 to boot the Game Boy, receive MIDI messages, then translate and send them through the link port. The main Game Boy code also has a simple interface to display graphics on the screen and a sequencer that allows him to record MIDI messages into 8 different tracks. We’re thinking that being able to sequence Game Boy chiptunes with a keyboard is a huge improvement over Little Sound DJ.
As [Sprite_tm] freely admits he’s not the best keyboard player, he gave his GBA synth to a musician friend. The resulting song is a veritable deluge of 8 bit chiptunes. The electronics behind this build are very simple (and can fit inside a MIDI cable), so we’re ready to break out the iron for this one. All the relevant code is posted [Sprite_tm]’s build page. There’s also a video walking through the features of his creation, viewable below.
[youtube=”http://www.youtube.com/watch?v=scgBbHuNVAE&w=470%5D
Nice hack to obtain retro style GB sound. But the GBA hardware is infra utilised in this hack. GBA is capable of sample based synthesis and other nice things.
The system is capable of 4-bit wave output acording to this link.
That’s why I built in the polyphonic 8-channel software synthesizer bit on MIDI channel 4. I was thinking about adding a complete wavetable synth, but I discarded it: if you want that, you’re probably better off picking any PC softsynth anyway :)
too bad the GBA sound chip sucks.. I love the GBA but the sound chip (does it even have a chip?) on that thing is the worst thing about the system
I beg to differ:
Advance Wars Game Play
Advance Wars with heavy drum beat.
Sounds even better on a real console, this must be from an emulator.
Example of an (original) GB used as instrument: http://pornophonique.de/
Just leaving this here for posterity http://knifecity.bandcamp.com/track/slam-dunk-lifestyle (This is the original gameboy’s sound chip)
Seems to me this could(and perhaps should) be expanded upon for other purposes(like running your own code). I might have to play with this myself – I’ve got a few GBA’s laying around, would be cool if you could use them as a ready to go interface w/ an Arduino or other processor.
Oh right, I’d forgotten about that. The gameboy advance can totally boot from the link cable (you can write programs for it cross-compiled with an ARM-THUMB gcc port too.) With the caveat that the programs have to be under a certain size limit (much much smaller than the carts, program basically runs from ram.)
.. Still, way simpler than building a custom rom kart (and less risky than buying one with drivers that won’t work on any OS past windows 98… or an custom interface program that has all the dialogs in chinese…)
Mikey: The limit is 256K (the size of the EWRAM in the GBA) which is actually quite huge if you’ve just finished cramming your bootloader in the 2K the AVR provides for it ;)
Hey Sprite™, Do you dump the whole ARM program using the multiboot protocol or do you use some sort of two stage boot loader which switches into regular UART mode? I have been looking at doing the same thing just recently but I have a 100kb of tables I want in GBA RAM and am worried it will take a while to start up over multiboot.
My program is only 14K, so the upload usually is done before the GBA is finished with all the animations it does. 100K probably is a bit much indeed, you may want to ‘borrow’ the 2nd stage multiboot loader from the software I mentioned somewhere in my article.
^^^ Cool thanks for that.
Awesome project by the way!
I really like this. Classic sound. Great demo too.
Wow, I remember when Brian Whitman and I did this back in like 1999. Here’s our source code:
http://code.google.com/p/pushpin/
it looks like sprite hasn’t written his own synth yet. he ought to use Pushpin. we already did all of the cycle-counting.
Sorry, I can’t really re-use Pushpin: first of all I can only upload native GBA code that way, so I can’t run Pushpins Z80 code. Secondly, the AVR that uploads the code doubles as a MIDI-to-GBA-link-port-converter, so I don’t really need to cycle-count to acquire the MIDI-signal. Thirdly, I actually /have/ written my own synth-software, it’s the bit of code that makes all the noise when I press the keyboard keys.
BTW: I have gotten a few mails from people wanting to buy one of the cables, so I may be going to whip up a small batch and sell them. Contact me if you’re interested.
cool
so it is possible to build this on my own?
Sure, if you have the means to program the ATMega168, the rest should be a cinch.
Cool
Cool for sure but…
“We’re thinking that being able to sequence Game Boy chiptunes with a keyboard is a huge improvement over Little Sound DJ.”
LSDj supports MIDI in.
Has anyone had success with building one of these? More specifically flashing the AVR?
I have a programmer and have been trying to get it to work with no luck. His readme text says to use the makefile, but I’m getting errors when I try that. prolly cause I’m not using WinAVR like he is (I’m using mac). I’ve been just using avrdude to set the fuses and upload the .hex file provided. I still can’t get any mutiboot response out of it though. I’m actually a beginner, so I don’t know anything past what I’ve been able to piece together from tutorials/forums/help texts. If anyone with actual knowledge and experience with this could tell me if I’m doing things right/wrong I would be very grateful. Here’s what I’ve been executing.
$ avrdude -c usbtiny -p m168 -u -U flash:w:gbamidi.hex -U lock:w:0x2f:m -U hfuse:w:0xdF:m -U lfuse:w:0xFf:m -U efuse:w:0x00:m
I found those fuse bit values inside his makefile.
One thing that struck me as odd is that when I use terminal mode in avrdude and ‘dump flash 0 16800’ the lines 0000 all the way through 3800 are all ‘ff’, which if I’m not mistaken, that means blank. Though it might have something to do with something else I saw in the makefile. near the top under where he declares the MCU, it says ‘BOOTLOADER_ADDRESS=0x3800’. Like I said I’m a beginner so I don’t know much about any of this stuff. All I wanted was a MIDIboy Advance :(