DSGM_SoundInstance *DSGM_PlaySoundAdvancedFull(DSGM_Sound *sound, u8 volume, u8 panning) { DSGM_SoundInstance *soundInstance = DSGM_AddSoundInstance(sound); if(sound->type == DSGM_SOUND_STREAM) { if(!sound->loaded) { mmLoad(sound->ID); sound->loaded = true; } mmStart(sound->ID, MM_PLAY_LOOP); } else { if(!sound->loaded) { mmLoadEffect(sound->ID - DSGM_soundStreamCount); sound->loaded = true; } mm_sound_effect effect = { { sound->ID - DSGM_soundStreamCount } , (int)(1.0f * (1<<10)), // rate 0, // handle soundInstance->volume = volume, // volume (255 = max) soundInstance->panning = panning, // panning (128 = center) }; soundInstance->effectNumber = mmEffectEx(&effect); mmEffectRelease(soundInstance->effectNumber); } return soundInstance; }
void Sound::initEffects() { int s[] = {SFX_JUMP, SFX_COIN, SFX_BRICK, SFX_PLACE, SFX_DESTROY}; for(int i = 0;i < NR_EFFECTS;i++) { effects[i].id = s[i]; effects[i].rate = (1<<10); effects[i].handle = 0; effects[i].volume = 255; effects[i].panning = 127; mmLoadEffect(s[i]); } }
DSGM_SoundInstance *DSGM_PlaySoundFull(DSGM_Sound *sound) { DSGM_SoundInstance *soundInstance = DSGM_AddSoundInstance(sound); if(sound->type == DSGM_SOUND_STREAM) { if(!sound->loaded) { mmLoad(sound->ID); sound->loaded = true; } mmStart(sound->ID, MM_PLAY_LOOP); } else { if(!sound->loaded) { mmLoadEffect(sound->ID - DSGM_soundStreamCount); sound->loaded = true; } soundInstance->effectNumber = mmEffect(sound->ID - DSGM_soundStreamCount); mmEffectRelease(soundInstance->effectNumber); } soundInstance->volume = 255; soundInstance->panning = 128; return soundInstance; }
void initSprites(mySprite * sprites) { int defaultX = (SCREEN_WIDTH/2) - 32; int defaultY = (SCREEN_HEIGHT/2) - 32; mmInitDefaultMem((mm_addr)soundbank_bin); oamInit(&oamMain, SpriteMapping_1D_64, false); mySprite leftButtonOff = {0, 0, SpriteSize_64x64, SpriteColorFormat_16Color, 0, 0, 0, defaultY}; mySprite leftButtonOn = {1, 0, SpriteSize_64x64, SpriteColorFormat_16Color, 0, 1, 0, defaultY}; mySprite rightButtonOff = {2, 0, SpriteSize_64x64, SpriteColorFormat_16Color, 0, 0, (256-64), defaultY}; mySprite rightButtonOn = {3, 0, SpriteSize_64x64, SpriteColorFormat_16Color, 0, 1, (256-64), defaultY}; leftButtonOff.gfx = oamAllocateGfx(&oamMain, SpriteSize_64x64, SpriteColorFormat_16Color); leftButtonOn.gfx = oamAllocateGfx(&oamMain, SpriteSize_64x64, SpriteColorFormat_16Color); rightButtonOff.gfx = oamAllocateGfx(&oamMain, SpriteSize_64x64, SpriteColorFormat_16Color); rightButtonOn.gfx = oamAllocateGfx(&oamMain, SpriteSize_64x64, SpriteColorFormat_16Color); dmaCopy(leftButtonOffPal, &SPRITE_PALETTE[leftButtonOff.id * 16], leftButtonOffPalLen); dmaCopy(leftButtonOnPal, &SPRITE_PALETTE[leftButtonOn.id * 16], leftButtonOnPalLen); dmaCopy((u8*)leftButtonOffTiles, leftButtonOff.gfx, 2048); dmaCopy((u8*)leftButtonOnTiles, leftButtonOn.gfx, 2048); dmaCopy((u8*)rightButtonOffTiles, rightButtonOff.gfx, 2048); dmaCopy((u8*)rightButtonOnTiles, rightButtonOn.gfx, 2048); sprites[leftButtonOff.id] = leftButtonOff; sprites[leftButtonOn.id] = leftButtonOn; sprites[rightButtonOff.id] = rightButtonOff; sprites[rightButtonOn.id] = rightButtonOn; SPRITECOUNT += 4; // mySprite {id, gfxPtr, SpriteSize, SpriteColorFormat, rotationIndex, paletteAlpha, x, y} // // gong mmLoadEffect(SFX_GONG); mm_sound_effect gongSFX = { {SFX_GONG}, (int)(1.0f * (1<<10)), 0, 255, 128, }; char gongDesc[] = "An ancient gong from the hills of China."; mySprite gong = {4, 0, SpriteSize_64x64, SpriteColorFormat_16Color, 0, 4, defaultX, defaultY, gongSFX, gongDesc}; gong.gfx = oamAllocateGfx(&oamMain, SpriteSize_64x64, SpriteColorFormat_16Color); dmaCopy(gongPal, &SPRITE_PALETTE[gong.id * 16], gongPalLen); dmaCopy((u8*)gongTiles, gong.gfx, 2048); sprites[gong.id] = gong; SPRITECOUNT++; // duck mmLoadEffect(SFX_DUCK); mm_sound_effect duckSFX = { { SFX_DUCK }, (int)(1.0f * (1<<10)), 0, 255, 128, }; char duckDesc[] = "A mild-mannered duck."; mySprite duck = {5, 0, SpriteSize_64x64, SpriteColorFormat_16Color, 0, 5, defaultX, defaultY, duckSFX, duckDesc}; duck.gfx = oamAllocateGfx(&oamMain, SpriteSize_64x64, SpriteColorFormat_16Color); dmaCopy(duckPal, &SPRITE_PALETTE[duck.id * 16], buttheadPalLen); dmaCopy((u8*)duckTiles, duck.gfx, 2048); sprites[duck.id] = duck; SPRITECOUNT++; // should be 6 now // butthead mmLoadEffect(SFX_BUTTHEAD); mm_sound_effect buttheadSFX = { { SFX_BUTTHEAD }, (int)(1.0f * (1<<10)), 0, 255, 128, }; char buttheadDesc[] = "Butt-head."; mySprite butthead = {6, 0, SpriteSize_64x64, SpriteColorFormat_16Color, 0, 6, defaultX, defaultY, buttheadSFX, buttheadDesc}; butthead.gfx = oamAllocateGfx(&oamMain, SpriteSize_64x64, SpriteColorFormat_16Color); dmaCopy(buttheadPal, &SPRITE_PALETTE[butthead.id * 16], buttheadPalLen); dmaCopy((u8*)buttheadTiles, butthead.gfx, 2048); sprites[butthead.id] = butthead; SPRITECOUNT++; //bluesbrothers mmLoadEffect(SFX_BLUESBROTHERS); mm_sound_effect bluesbrothersSFX = { { SFX_BLUESBROTHERS }, (int)(1.0f * (1<<10)), 0, 255, 128, }; char bluesbrothersDesc[] = "Jake and Elwood."; mySprite bluesbrothers = {7, 0, SpriteSize_64x64, SpriteColorFormat_16Color, 0, 7, defaultX, defaultY, bluesbrothersSFX, bluesbrothersDesc}; bluesbrothers.gfx = oamAllocateGfx(&oamMain, SpriteSize_64x64, SpriteColorFormat_16Color); dmaCopy(bluesbrothersPal, &SPRITE_PALETTE[bluesbrothers.id * 16], bluesbrothersPalLen); dmaCopy((u8*)bluesbrothersTiles, bluesbrothers.gfx, 2048); sprites[bluesbrothers.id] = bluesbrothers; SPRITECOUNT++; //bttf mmLoadEffect(SFX_BTTF); mm_sound_effect bttfSFX = { { SFX_BTTF }, (int)(1.0f * (1<<10)), 0, 255, 128, }; char bttfDesc[] = "88 mph."; mySprite bttf = {8, 0, SpriteSize_64x64, SpriteColorFormat_16Color, 0, 8, defaultX, defaultY, bttfSFX, bttfDesc}; bttf.gfx = oamAllocateGfx(&oamMain, SpriteSize_64x64, SpriteColorFormat_16Color); dmaCopy(bttfPal, &SPRITE_PALETTE[bttf.id * 16], bttfPalLen); dmaCopy((u8*)bttfTiles, bttf.gfx, 2048); sprites[bttf.id] = bttf; SPRITECOUNT++; //chewbacca mmLoadEffect(SFX_CHEWBACCA); mm_sound_effect chewbaccaSFX = { { SFX_CHEWBACCA }, (int)(1.0f * (1<<10)), 0, 255, 128, }; char chewbaccaDesc[] = "Chewie."; mySprite chewbacca = {9, 0, SpriteSize_64x64, SpriteColorFormat_16Color, 0, 9, defaultX, defaultY, chewbaccaSFX, chewbaccaDesc}; chewbacca.gfx = oamAllocateGfx(&oamMain, SpriteSize_64x64, SpriteColorFormat_16Color); dmaCopy(chewbaccaPal, &SPRITE_PALETTE[chewbacca.id * 16], chewbaccaPalLen); dmaCopy((u8*)chewbaccaTiles, chewbacca.gfx, 2048); sprites[chewbacca.id] = chewbacca; SPRITECOUNT++; //dsotm mmLoadEffect(SFX_DSOTM); mm_sound_effect dsotmSFX = { { SFX_DSOTM }, (int)(1.0f * (1<<10)), 0, 255, 128, }; char dsotmDesc[] = "1973."; mySprite dsotm = {10, 0, SpriteSize_64x64, SpriteColorFormat_16Color, 0, 10, defaultX, defaultY, dsotmSFX, dsotmDesc}; dsotm.gfx = oamAllocateGfx(&oamMain, SpriteSize_64x64, SpriteColorFormat_16Color); dmaCopy(dsotmPal, &SPRITE_PALETTE[dsotm.id * 16], dsotmPalLen); dmaCopy((u8*)dsotmTiles, dsotm.gfx, 2048); sprites[dsotm.id] = dsotm; SPRITECOUNT++; //eastwood mmLoadEffect(SFX_EASTWOOD); mm_sound_effect eastwoodSFX = { { SFX_EASTWOOD }, (int)(1.0f * (1<<10)), 0, 255, 128, }; char eastwoodDesc[] = "-_-"; mySprite eastwood = {11, 0, SpriteSize_64x64, SpriteColorFormat_16Color, 0, 11, defaultX, defaultY, eastwoodSFX, eastwoodDesc}; eastwood.gfx = oamAllocateGfx(&oamMain, SpriteSize_64x64, SpriteColorFormat_16Color); dmaCopy(eastwoodPal, &SPRITE_PALETTE[eastwood.id * 16], eastwoodPalLen); dmaCopy((u8*)eastwoodTiles, eastwood.gfx, 2048); sprites[eastwood.id] = eastwood; SPRITECOUNT++; //mario mmLoadEffect(SFX_MARIO); mm_sound_effect marioSFX = { { SFX_MARIO }, (int)(1.0f * (1<<10)), 0, 255, 128, }; char marioDesc[] = "An Italian Plumber."; mySprite mario = {12, 0, SpriteSize_64x64, SpriteColorFormat_16Color, 0, 12, defaultX, defaultY, marioSFX, marioDesc}; mario.gfx = oamAllocateGfx(&oamMain, SpriteSize_64x64, SpriteColorFormat_16Color); dmaCopy(marioPal, &SPRITE_PALETTE[mario.id * 16], marioPalLen); dmaCopy((u8*)marioTiles, mario.gfx, 2048); sprites[mario.id] = mario; SPRITECOUNT++; }
int main() { /* Turn on the 2D graphics core. */ powerOn(POWER_ALL_2D); /* * Configure the VRAM and background control registers. * * Place the main screen on the bottom physical screen. Then arrange the * VRAM banks. Next, confiure the background control registers. */ lcdMainOnBottom(); initVideo(); initBackgrounds(); /* Initialize maxmod using the memory based soundbank set up. */ mmInitDefaultMem((mm_addr)soundbank_bin); /* Set up a few sprites. */ SpriteInfo spriteInfo[SPRITE_COUNT]; OAMTable *oam = new OAMTable(); initOAM(oam); initSprites(oam, spriteInfo); /* Display the backgrounds. */ displayStarField(); displayPlanet(); displaySplash(); /*************************************************************************/ /* Keep track of the touch screen coordinates. */ touchPosition touch; /* Make the ship object. */ static const int SHUTTLE_OAM_ID = 0; SpriteEntry * shipEntry = &oam->oamBuffer[SHUTTLE_OAM_ID]; SpriteRotation * shipRotation = &oam->matrixBuffer[SHUTTLE_OAM_ID]; Ship * ship = new Ship(&spriteInfo[SHUTTLE_OAM_ID]); /* Make the moon. */ static const int MOON_OAM_ID = 1; SpriteEntry * moonEntry = &oam->oamBuffer[MOON_OAM_ID]; SpriteInfo * moonInfo = &spriteInfo[MOON_OAM_ID]; MathVector2D<int> * moonPos = new MathVector2D<int>(); moonPos->x = moonEntry->x; moonPos->y = moonEntry->y; /* Set up sound data. */ mmLoadEffect(SFX_THRUST); for (;;) { /* Update the game state. */ updateInput(&touch); handleInput(ship, moonPos, moonInfo, &touch); ship->moveShip(); /* Update ship sprite attributes. */ MathVector2D<float> position = ship->getPosition(); shipEntry->x = (int)position.x; shipEntry->y = (int)position.y; rotateSprite(shipRotation, -ship->getAngleDeg()); /* Update moon sprite attributes. */ moonEntry->x = (int)moonPos->x; moonEntry->y = (int)moonPos->y; /* * Update the OAM. * * We have to copy our copy of OAM data into the actual OAM during * VBlank (writes to it are locked during other times). */ swiWaitForVBlank(); updateOAM(oam); } return 0; }