mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-07-12 21:47:12 +02:00

- 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 -
162 lines
4.6 KiB
ObjectPascal
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.
|