summaryrefslogtreecommitdiff
path: root/packages/libndsfpc/examples/audio/maxmod/reverb/reverb.pp
diff options
context:
space:
mode:
Diffstat (limited to 'packages/libndsfpc/examples/audio/maxmod/reverb/reverb.pp')
-rw-r--r--packages/libndsfpc/examples/audio/maxmod/reverb/reverb.pp161
1 files changed, 161 insertions, 0 deletions
diff --git a/packages/libndsfpc/examples/audio/maxmod/reverb/reverb.pp b/packages/libndsfpc/examples/audio/maxmod/reverb/reverb.pp
new file mode 100644
index 0000000000..1b0323b729
--- /dev/null
+++ b/packages/libndsfpc/examples/audio/maxmod/reverb/reverb.pp
@@ -0,0 +1,161 @@
+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.