______ / | ________ / |____ / \ / | \/ _ \ \ ___ /_\ \ \ \_/ . \ \ /\_____/ / \________/ | / |______/
Lullaby_in.c Part 1
Sooooo… 0xA is still alive I guess… :)
I’m currently working on a small GBA ROM for an upcoming net release compilation that has the lullaby for theme. The idea is to make a small software that will create lullaby-esque sequences using the 4 legacy DMG sound channels of the GBA. That’s a good excuse to get into DevkitARM, although now I’m thinking that it might have been good to learn GBDK to make a GB ROM instead. Ah well, can’t be bothered to restart and maybe I can use the opportunity to add some graphics.
So far the software is tuned for the Hungarian scale in C, which makes a very dramatic lullaby somehow, I’ll tune later on. It was quite straightforward, the most delicate part being the sound registers, but thanks to belogic everything is super well documented. In a nutshell, it’s all about bitmasking and feeding the right registers with 16bit words.
For instance a simple way to control the noise channel can be made like this:
int setSnd4(int cd, int sta, int stp, int ti, int re) { // DMG Channel 4 Noise parameters, reset and loop control // See specs: http://belogic.com/gba/registers.shtml#REG_SOUND4CNT_H // // cd -- Clock divider frequency (0-7) // sta -- Counter stages (0-1), 15 or 7 // stp -- Counter Pre-Stepper frequency (0-15) // ti -- Timed mode (0-1), continuous or timed // re -- Sound reset return (re << 15) | (ti << 14) | (stp << 4) | (sta << 3) | cd; } int playNote4(int noise) { REG_SOUND4CNT_L=0xA100; REG_SOUND4CNT_H=noise; return 0; } playNote4(setSnd4(2,1,10,0,1));
That’s just basic copypasta to get the idea. Once it is sequenced and populated with random values, it sounds like this:
Note: this is recorded from an emulator, too lazy to flash it. Yawn. Sleep. Bye.
Leave a Reply