reverb.pp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. program reverb;
  2. {$L build/soundbank.bin.o}
  3. {$mode objfpc}
  4. uses
  5. ctypes, nds9, maxmod9;
  6. var
  7. soundbank_bin_end: array [0..0] of cuint8; cvar; external;
  8. soundbank_bin: array [0..0] of cuint8; cvar; external;
  9. soundbank_bin_size: cuint32; cvar; external;
  10. const
  11. SFX_DAM = 0;
  12. MOD_TEMPEST_ZEN_BOWLING = 0;
  13. MSL_NSONGS = 1;
  14. MSL_NSAMPS = 31;
  15. MSL_BANKSIZE = 32;
  16. SCREEN_TEXT = #10 +
  17. ' Maxmod Reverb Example'#10#10 +
  18. ' Press A to toggle reverb. '#10#10;
  19. rv_delay_left = 500; // milliseconds
  20. rv_delay_right = 520;
  21. rv_rate = 32768; // Hertz
  22. rv_format = 16; // 16-bit
  23. procedure setupReverb();
  24. var
  25. rv_buffer_left,
  26. rv_buffer_right: pointer;
  27. rv_size_left,
  28. rv_size_right: cint;
  29. config: mm_reverb_cfg;
  30. begin
  31. //---------------------------------------------------------
  32. // Enable reverb system
  33. //---------------------------------------------------------
  34. mmReverbEnable();
  35. //---------------------------------------------------------
  36. // Calculate amount required and allocate memory
  37. // for both reverb channels
  38. //---------------------------------------------------------
  39. rv_size_left := mmReverbBufferSize( rv_format, rv_rate, rv_delay_left );
  40. rv_size_right := mmReverbBufferSize( rv_format, rv_rate, rv_delay_right );
  41. GetMem(rv_buffer_left, rv_size_left * 4);
  42. GetMem(rv_buffer_right, rv_size_right * 4);
  43. //---------------------------------------------------------
  44. // Configure reverb settings
  45. //---------------------------------------------------------
  46. config.flags := MMRF_MEMORY or MMRF_DELAY or MMRF_FEEDBACK or
  47. MMRF_PANNING or MMRF_DRYLEFT or MMRF_DRYRIGHT or
  48. MMRF_RATE or MMRF_16BITLEFT or MMRF_16BITRIGHT or
  49. MMRF_INVERSEPAN or MMRF_BOTH;
  50. config.memory := rv_buffer_left; // Set memory target (for left)
  51. config.delay := rv_size_left; // Set delay (for left)
  52. config.feedback := 1024; // Set feedback to 50% (for both)
  53. config.panning := 0; // Set panning to 0% (and inversed (100%) for right channel)
  54. config.rate := 16777216 div rv_rate; // Set sampling rate for both channels
  55. mmReverbConfigure(@config); // Run configuration...
  56. //---------------------------------------------------------
  57. // Configure remaining parameters (right channel memory
  58. // and delay)
  59. //---------------------------------------------------------
  60. config.flags := MMRF_MEMORY or MMRF_DELAY or MMRF_RIGHT;
  61. config.delay := rv_size_right;
  62. config.memory := rv_buffer_right;
  63. mmReverbConfigure( @config );
  64. end;
  65. var
  66. reverb_is_started: cint = 0;
  67. keys: cint;
  68. begin
  69. //---------------------------------------------------------
  70. // setup console
  71. //---------------------------------------------------------
  72. consoleDemoInit();
  73. // give it a dark blue backdrop
  74. BG_PALETTE_SUB[0] := RGB15( 0, 0, 13 );
  75. //---------------------------------------------------------
  76. // init maxmod with default settings
  77. //---------------------------------------------------------
  78. mmInitDefaultMem(mm_addr(@soundbank_bin));
  79. //---------------------------------------------------------
  80. // setup and configure the reverb system
  81. //---------------------------------------------------------
  82. setupReverb();
  83. //---------------------------------------------------------
  84. // load and play test module
  85. //---------------------------------------------------------
  86. mmLoad( MOD_TEMPEST_ZEN_BOWLING );
  87. mmStart( MOD_TEMPEST_ZEN_BOWLING, MM_PLAY_LOOP );
  88. //---------------------------------------------------------
  89. // display screen info
  90. //---------------------------------------------------------
  91. iprintf(SCREEN_TEXT);
  92. //---------------------------------------------------------
  93. // main loop
  94. //---------------------------------------------------------
  95. while true do
  96. begin
  97. //-----------------------------------------------------
  98. // get new keypad input
  99. //-----------------------------------------------------
  100. scanKeys();
  101. keys := keysDown();
  102. //-----------------------------------------------------
  103. // A: toggle reverb
  104. //-----------------------------------------------------
  105. if( keys and KEY_A ) <> 0 then
  106. begin
  107. if (reverb_is_started) = 0 then
  108. begin
  109. // start reverb
  110. mmReverbStart( MMRC_BOTH );
  111. // lower module volume & tempo
  112. // this creates a cool atmosphere
  113. mmSetModuleVolume( 550 );
  114. mmSetModuleTempo( 800 );
  115. reverb_is_started := 1;
  116. end else
  117. begin
  118. // stop reverb and restore volume and tempo
  119. mmReverbStop( MMRC_BOTH );
  120. mmSetModuleVolume( $400 );
  121. mmSetModuleTempo( $400 );
  122. reverb_is_started := 0;
  123. end;
  124. end;
  125. //-----------------------------------------------------
  126. // wait until next frame
  127. //-----------------------------------------------------
  128. swiWaitForVBlank();
  129. end;
  130. end.