123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- program reverb;
- {$L build/soundbank.bin.o}
- {$mode objfpc}
- uses
- ctypes, nds9, maxmod9;
- var
- soundbank_bin_end: array [0..0] of cuint8; cvar; external;
- soundbank_bin: array [0..0] of cuint8; cvar; external;
- soundbank_bin_size: cuint32; cvar; external;
- const
- SFX_DAM = 0;
- MOD_TEMPEST_ZEN_BOWLING = 0;
- MSL_NSONGS = 1;
- MSL_NSAMPS = 31;
- MSL_BANKSIZE = 32;
- SCREEN_TEXT = #10 +
- ' Maxmod Reverb Example'#10#10 +
- ' Press A to toggle reverb. '#10#10;
- rv_delay_left = 500; // milliseconds
- rv_delay_right = 520;
- rv_rate = 32768; // Hertz
- rv_format = 16; // 16-bit
- procedure setupReverb();
- var
- rv_buffer_left,
- rv_buffer_right: pointer;
- rv_size_left,
- rv_size_right: cint;
- config: mm_reverb_cfg;
- begin
- //---------------------------------------------------------
- // Enable reverb system
- //---------------------------------------------------------
- mmReverbEnable();
-
- //---------------------------------------------------------
- // Calculate amount required and allocate memory
- // for both reverb channels
- //---------------------------------------------------------
- rv_size_left := mmReverbBufferSize( rv_format, rv_rate, rv_delay_left );
- rv_size_right := mmReverbBufferSize( rv_format, rv_rate, rv_delay_right );
-
- GetMem(rv_buffer_left, rv_size_left * 4);
- GetMem(rv_buffer_right, rv_size_right * 4);
-
- //---------------------------------------------------------
- // Configure reverb settings
- //---------------------------------------------------------
-
- config.flags := MMRF_MEMORY or MMRF_DELAY or MMRF_FEEDBACK or
- MMRF_PANNING or MMRF_DRYLEFT or MMRF_DRYRIGHT or
- MMRF_RATE or MMRF_16BITLEFT or MMRF_16BITRIGHT or
- MMRF_INVERSEPAN or 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 div rv_rate; // Set sampling rate for both channels
- mmReverbConfigure(@config); // Run configuration...
- //---------------------------------------------------------
- // Configure remaining parameters (right channel memory
- // and delay)
- //---------------------------------------------------------
- config.flags := MMRF_MEMORY or MMRF_DELAY or MMRF_RIGHT;
- config.delay := rv_size_right;
- config.memory := rv_buffer_right;
- mmReverbConfigure( @config );
-
- end;
- var
- reverb_is_started: cint = 0;
- keys: cint;
- begin
- //---------------------------------------------------------
- // 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);
-
- //---------------------------------------------------------
- // main loop
- //---------------------------------------------------------
- while true do
- begin
- //-----------------------------------------------------
- // get new keypad input
- //-----------------------------------------------------
- scanKeys();
- keys := keysDown();
- //-----------------------------------------------------
- // A: toggle reverb
- //-----------------------------------------------------
- if( keys and KEY_A ) <> 0 then
- begin
- if (reverb_is_started) = 0 then
- begin
- // start reverb
- mmReverbStart( MMRC_BOTH );
-
- // lower module volume & tempo
- // this creates a cool atmosphere
- mmSetModuleVolume( 550 );
- mmSetModuleTempo( 800 );
-
- reverb_is_started := 1;
- end else
- begin
- // stop reverb and restore volume and tempo
- mmReverbStop( MMRC_BOTH );
- mmSetModuleVolume( $400 );
- mmSetModuleTempo( $400 );
-
- reverb_is_started := 0;
- end;
- end;
-
- //-----------------------------------------------------
- // wait until next frame
- //-----------------------------------------------------
- swiWaitForVBlank();
- end;
-
- end.
|