summaryrefslogtreecommitdiff
path: root/packages/libndsfpc/examples/audio/maxmod/reverb/reverb.pp
blob: 1b0323b7298433e5f75a4bf3e255fe3564e22c2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
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.