audio/maxmod/reverb/source/main.c

/*********************************************
 * this example demonstrates hardware reverb *
 *********************************************/

#include <nds.h>
#include <stdio.h>

#include <maxmod9.h>            // maxmod reference
#include "soundbank_bin.h"      // soundbank binary reference
#include "soundbank.h"          // generated soundbank definitions

//---------------------------------------------------------------------------------
const char *SCREEN_TEXT = "\n"

" Maxmod Reverb Example\n\n"

" Press A to toggle reverb. \n\n"
;
//---------------------------------------------

enum {
    rv_delay_left = 500,        // milliseconds
    rv_delay_right = 520,
    rv_rate = 32768,            // Hertz
    rv_format = 16              // 16-bit
};

//---------------------------------------------------------------------------------
void setupReverb( void ) {
//---------------------------------------------------------------------------------

    //---------------------------------------------------------
    // Enable reverb system
    //---------------------------------------------------------
    mmReverbEnable();
    
    //---------------------------------------------------------
    // Calculate amount required and allocate memory
    // for both reverb channels
    //---------------------------------------------------------
    void* rv_buffer_left;
    void* rv_buffer_right;

    int rv_size_left;
    int rv_size_right;
    rv_size_left = mmReverbBufferSize( rv_format, rv_rate, rv_delay_left );
    rv_size_right = mmReverbBufferSize( rv_format, rv_rate, rv_delay_right );
    
    rv_buffer_left  = malloc( rv_size_left * 4 );
    rv_buffer_right = malloc( rv_size_right * 4 );
    
    //---------------------------------------------------------
    // Configure reverb settings
    //---------------------------------------------------------
    mm_reverb_cfg config;
    
    config.flags = MMRF_MEMORY | MMRF_DELAY | MMRF_FEEDBACK |
                   MMRF_PANNING | MMRF_DRYLEFT | MMRF_DRYRIGHT |
                   MMRF_RATE | MMRF_16BITLEFT | MMRF_16BITRIGHT |
                   MMRF_INVERSEPAN | MMRF_BOTH;

    config.memory = rv_buffer_left;     // Set memory target (for left)
    config.delay = rv_size_left;        // Set delay (for left)
    config.feedback = 1024;             // Set feedback to 50% (for both)
    config.panning = 0;                 // Set panning to 0% (and inversed (100%) for right channel)
    config.rate = 16777216 / rv_rate;   // Set sampling rate for both channels
    mmReverbConfigure( &config );       // Run configuration...

    //---------------------------------------------------------
    // Configure remaining parameters (right channel memory
    // and delay)
    //---------------------------------------------------------
    config.flags = MMRF_MEMORY | MMRF_DELAY | MMRF_RIGHT;
    
    config.delay = rv_size_right;
    config.memory = rv_buffer_right;
    
    mmReverbConfigure( &config );
    
}

//---------------------------------------------------------------------------------
// program entry point
//---------------------------------------------------------------------------------
int main(void) {
//---------------------------------------------------------------------------------

    //---------------------------------------------------------
    // setup console
    //---------------------------------------------------------
    consoleDemoInit();
    
    // give it a dark blue backdrop
    BG_PALETTE_SUB[0] = RGB15( 0, 0, 13 );

    //---------------------------------------------------------
    // init maxmod with default settings
    //---------------------------------------------------------
    mmInitDefaultMem( (mm_addr)soundbank_bin );
    
    //---------------------------------------------------------
    // setup and configure the reverb system
    //---------------------------------------------------------
    setupReverb();
    
    //---------------------------------------------------------
    // load and play test module
    //---------------------------------------------------------
    mmLoad( MOD_TEMPEST_ZEN_BOWLING );
    mmStart( MOD_TEMPEST_ZEN_BOWLING, MM_PLAY_LOOP );
    
    //---------------------------------------------------------
    // display screen info
    //---------------------------------------------------------
    iprintf( SCREEN_TEXT );
    
    int reverb_is_started = 0;
    
    //---------------------------------------------------------
    // main loop
    //---------------------------------------------------------
    while(1) {
        //-----------------------------------------------------
        // get new keypad input
        //-----------------------------------------------------
        scanKeys();
        int keys = keysDown();

        //-----------------------------------------------------
        // A: toggle reverb
        //-----------------------------------------------------
        if( keys & KEY_A ) {
            if( !reverb_is_started ) {
                // start reverb
                mmReverbStart( MMRC_BOTH );
                
                // lower module volume & tempo
                // this creates a cool atmosphere
                mmSetModuleVolume( 550 );
                mmSetModuleTempo( 800 );
                
                reverb_is_started = 1;
            } else {
                // stop reverb and restore volume and tempo
                mmReverbStop( MMRC_BOTH );
                mmSetModuleVolume( 0x400 );
                mmSetModuleTempo( 0x400 );
                
                reverb_is_started = 0;
            }
        }
        
        //-----------------------------------------------------
        // wait until next frame
        //-----------------------------------------------------
        swiWaitForVBlank();
    }
    
    return 0;
}
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines
Generated on Sat Oct 2 12:55:11 2010 for libnds by  doxygen 1.6.3