fpc/packages/libndsfpc/examples/audio/maxmod/reverb/reverb.pp
Legolas d2dabe9a33 * updated nds/gba linker scripts and reverted some changes for 2.2.4a release
- Removed unused/outdated stuff from libndsfpc
+ Added new examples for libndsfpc
+ Added working (I hope so...) makefile.fpc for all libndsfpc/libgbafpc examples

git-svn-id: trunk@13217 -
2009-05-31 12:15:24 +00:00

162 lines
4.6 KiB
ObjectPascal

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.