mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-07-07 21:16:30 +02:00
212 lines
5.7 KiB
ObjectPascal
212 lines
5.7 KiB
ObjectPascal
program AudioModes;
|
|
{$L build/soundbank.bin.o}
|
|
|
|
{$mode objfpc}
|
|
uses
|
|
ctypes, nds9, maxmod9;
|
|
|
|
(***********************************************
|
|
* this example demonstrates the 3 audio modes
|
|
*
|
|
* functions used:
|
|
* mmInitDefaultMem(soundbank)
|
|
* Initialize with default settings
|
|
*
|
|
* mmLoad( module )
|
|
* Loads a module to be played
|
|
*
|
|
* mmStart( module )
|
|
* Starts playback of a module
|
|
*
|
|
* mmStop()
|
|
* Stops module playback
|
|
*
|
|
* mmSelectMode( mode )
|
|
* Selects the audio mode
|
|
* modes:
|
|
* 0: MM_MODE_A, hardware audio mode
|
|
* 1: MM_MODE_B, interpolated audio mode
|
|
* 2: MM_MODE_C, extended audio mode
|
|
*********************************************************)
|
|
|
|
|
|
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
|
|
MOD_KEYG_SUBTONAL = 0;
|
|
MOD_PURPLE_MOTION_INSPIRATION = 1;
|
|
MOD_REZ_MONDAY = 2;
|
|
MSL_NSONGS = 3;
|
|
MSL_NSAMPS = 65;
|
|
MSL_BANKSIZE = 68;
|
|
|
|
SHOW_TEXT: pchar = #10 +
|
|
' Maxmod Audio Modes Example'#10#10 +
|
|
' Song: '#10 +
|
|
' Mode: '#10#10 +
|
|
' Left/Right: Select Song'#10 +
|
|
' Up/Down: Change Audio Mode'#10 +
|
|
' A: Start Playback'#10 +
|
|
' B: Stop Playback'#10#10 +
|
|
|
|
' Tip: Play subtonal with the'#10 +
|
|
' extended mode or else it won''t'#10 +
|
|
' sound right.'#10#10 +
|
|
|
|
' Another Tip: The interpolated'#10 +
|
|
' mode doesn''t work in current'#10 +
|
|
' emulators.';
|
|
|
|
|
|
var
|
|
// song order
|
|
song_order: array [0..2] of cshort = ( MOD_KEYG_SUBTONAL, MOD_REZ_MONDAY, MOD_PURPLE_MOTION_INSPIRATION );
|
|
|
|
// rez-monday.mod is a bit loud, so we will lower the volume to 500 (normal volume is 1024)
|
|
song_volumes: array [0..2] of cshort = ( 1024, 500, 1024 );
|
|
|
|
// strings for the "Song: " display
|
|
song_titles: array [0..2] of pchar = (
|
|
'subtonal (30ch) ',
|
|
'monday (14ch) ',
|
|
'inspiration (4ch)');
|
|
|
|
// strings for the "Mode: " display
|
|
audiomode_names: array [0..2] of pchar = (
|
|
'A - Hardware (16ch) ',
|
|
'B - Interpolated (16ch)',
|
|
'C - Extended (30ch) ');
|
|
|
|
song: integer = 0;
|
|
mode: integer = 0;
|
|
keys: integer;
|
|
|
|
|
|
|
|
procedure print_song(song: cint);
|
|
begin
|
|
iprintf(#27'[3;7H%s', song_titles[song] );
|
|
end;
|
|
|
|
procedure print_mode(mode: cint);
|
|
begin
|
|
iprintf(#27'[4;7H%s', audiomode_names[mode] );
|
|
end;
|
|
|
|
|
|
begin
|
|
//---------------------------------------------------------
|
|
// setup console
|
|
//---------------------------------------------------------
|
|
consoleDemoInit();
|
|
|
|
// set a dark blue backdrop
|
|
BG_PALETTE_SUB[0] := RGB15( 0, 0, 10 );
|
|
|
|
//---------------------------------------------------------
|
|
// init maxmod with default settings
|
|
//---------------------------------------------------------
|
|
mmInitDefaultMem(mm_addr(@soundbank_bin));
|
|
|
|
//---------------------------------------------------------
|
|
// load songs (must be loaded before using with mmStart)
|
|
//---------------------------------------------------------
|
|
mmLoad( MOD_KEYG_SUBTONAL );
|
|
mmLoad( MOD_REZ_MONDAY );
|
|
mmLoad( MOD_PURPLE_MOTION_INSPIRATION );
|
|
|
|
|
|
//---------------------------------------------------------
|
|
// display screen info
|
|
//---------------------------------------------------------
|
|
iprintf( SHOW_TEXT );
|
|
print_song( song );
|
|
print_mode( mode );
|
|
|
|
//---------------------------------------------------------
|
|
// main loop
|
|
//---------------------------------------------------------
|
|
while true do
|
|
begin
|
|
//-----------------------------------------------------
|
|
// get new keypad input
|
|
//-----------------------------------------------------
|
|
scanKeys();
|
|
keys := keysDown();
|
|
|
|
//-----------------------------------------------------
|
|
// LEFT: select previous song
|
|
//-----------------------------------------------------
|
|
if( keys and KEY_LEFT ) <> 0 then
|
|
begin
|
|
dec(song);
|
|
if( song < 0 ) then song := 2;
|
|
print_song( song );
|
|
end;
|
|
|
|
//-----------------------------------------------------
|
|
// RIGHT: select next song
|
|
//-----------------------------------------------------
|
|
if( keys and KEY_RIGHT ) <> 0 then
|
|
begin
|
|
inc(song);
|
|
if( song > 2 ) then song := 0;
|
|
print_song( song );
|
|
end;
|
|
|
|
//-----------------------------------------------------
|
|
// A: start song
|
|
//-----------------------------------------------------
|
|
if( keys and KEY_A ) <> 0 then
|
|
begin
|
|
mmSetModuleVolume( song_volumes[song] );
|
|
|
|
// loop module until stopped with B keypress
|
|
mmStart( song_order[song], MM_PLAY_LOOP );
|
|
end;
|
|
|
|
//-----------------------------------------------------
|
|
// B: stop song
|
|
//-----------------------------------------------------
|
|
if( keys and KEY_B ) <> 0 then
|
|
begin
|
|
mmStop();
|
|
end;
|
|
|
|
//-----------------------------------------------------
|
|
// UP: next audio mode
|
|
//-----------------------------------------------------
|
|
if( keys and KEY_UP ) <> 0 then
|
|
begin
|
|
inc(mode);
|
|
if( mode > 2 ) then mode := 0;
|
|
print_mode( mode );
|
|
|
|
// switch audio mode
|
|
mmSelectMode( mode );
|
|
end;
|
|
|
|
//-----------------------------------------------------
|
|
// DOWN: previous audio mode
|
|
//-----------------------------------------------------
|
|
if( keys and KEY_DOWN )<> 0 then
|
|
begin
|
|
dec(mode);
|
|
if( mode < 0 ) then mode := 2;
|
|
print_mode( mode );
|
|
|
|
// switch audio mode
|
|
mmSelectMode( mode );
|
|
end;
|
|
|
|
//-----------------------------------------------------
|
|
// wait until next frame
|
|
//-----------------------------------------------------
|
|
swiWaitForVBlank();
|
|
end;
|
|
|
|
end.
|