Advertisement
Kitomas

work for 2024-12-13 (2/2)

Dec 13th, 2024
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 28.07 KB | None | 0 0
  1. /******************************************************************************/
  2. /******************************************************************************/
  3. //"2024-12-13\kit_xmp\kit_xmp_namespace.cpp":
  4. #include <kit/misc.hpp>
  5. #include <kit/Xmp.hpp>
  6.  
  7. #define LIBXMP_STATIC
  8. #include <libxmp-lite/xmp.h>
  9.  
  10.  
  11. namespace kit {
  12.  
  13.  
  14.  
  15.  
  16.  
  17. const char* const* xmp::getFormatList(){
  18.   return xmp_get_format_list();
  19.  
  20. }
  21.  
  22.  
  23.  
  24.  
  25.  
  26. s32 xmp::getSysErrno(){
  27.   return xmp_syserrno();
  28.  
  29. }
  30.  
  31.  
  32.  
  33.  
  34.  
  35. const char* xmp::getVersionString(){
  36.   return xmp_version;
  37.  
  38. }
  39.  
  40.  
  41.  
  42.  
  43.  
  44. Xmp_version xmp::getVersionCode(){
  45.   Xmp_version ver;
  46.   ver.value = xmp_vercode;
  47.  
  48.   return ver;
  49.  
  50. }
  51.  
  52.  
  53.  
  54.  
  55.  
  56. }; /* namespace kit */
  57. /******************************************************************************/
  58. /******************************************************************************/
  59. //"2024-12-13\kit_xmp\kit_Xmp_playBuffer.cpp":
  60. #include <kit/misc.hpp>
  61. #include <kit/Xmp.hpp>
  62.  
  63. #define LIBXMP_STATIC
  64. #include <libxmp-lite/xmp.h>
  65.  
  66. #define CTX_PTR ((xmp_context)_ctx)
  67.  
  68.  
  69. namespace kit {
  70.  
  71.  
  72.  
  73.  
  74.  
  75. s32 Xmp::playBuffer(void* buffer, u31 size, bool ignoreLoopChecking){
  76.   if(!_valid || !_initModule || !_initPlayer) return -KIT_XMP_ERROR_STATE;
  77.  
  78.   if(size.s) return -KIT_XMP_ERROR_INVALID;
  79.  
  80.   return xmp_play_buffer(CTX_PTR, buffer, size.v, !ignoreLoopChecking);
  81.  
  82. }
  83.  
  84.  
  85.  
  86.  
  87.  
  88. }; /* namespace kit */
  89. /******************************************************************************/
  90. /******************************************************************************/
  91. //"2024-12-13\kit_xmp\kit_Xmp_player.cpp":
  92. #include <kit/misc.hpp>
  93. #include <kit/Xmp.hpp>
  94.  
  95. #define LIBXMP_STATIC
  96. #include <libxmp-lite/xmp.h>
  97.  
  98. #define CTX_PTR ((xmp_context)_ctx)
  99.  
  100.  
  101. namespace kit {
  102.  
  103. extern size_t numAllocations; //from kit namespace; relates to memory functions
  104.  
  105.  
  106.  
  107.  
  108.  
  109. s32 Xmp::getPlayer(s32 parameter){
  110.   if(!_valid) return -KIT_XMP_ERROR_STATE;
  111.  
  112.   return xmp_get_player(CTX_PTR, parameter);
  113.  
  114. }
  115.  
  116.  
  117.  
  118.  
  119.  
  120. s32 Xmp::setPlayer(s32 parameter, s32 value){
  121.   if(!_valid) return -KIT_XMP_ERROR_STATE;
  122.  
  123.   return xmp_set_player(CTX_PTR, parameter, value);
  124.  
  125. }
  126.  
  127.  
  128.  
  129.  
  130.  
  131. s32 Xmp::setPlayerTempoFactor(f64 multiplier){
  132.   if(!_valid) return -KIT_XMP_ERROR_STATE;
  133.  
  134.   return xmp_set_tempo_factor(CTX_PTR, multiplier);
  135.  
  136. }
  137.  
  138.  
  139.  
  140.  
  141.  
  142. s32 Xmp::setPlayerTime(u31 milliseconds){
  143.   if(!_valid || !_initPlayer) return -KIT_XMP_ERROR_STATE;
  144.  
  145.   return xmp_seek_time(CTX_PTR, milliseconds.v);
  146.  
  147. }
  148.  
  149.  
  150.  
  151.  
  152.  
  153. s32 Xmp::setPlayerRow(u31 row){
  154.   if(!_valid) return -KIT_XMP_ERROR_STATE;
  155.  
  156.   return xmp_set_row(CTX_PTR, row.v);
  157.  
  158. }
  159.  
  160.  
  161.  
  162.  
  163.  
  164. s32 Xmp::setPlayerPosition(u31 pos){
  165.   if(!_valid) return -KIT_XMP_ERROR_STATE;
  166.  
  167.   return xmp_set_position(CTX_PTR, pos.v);
  168.  
  169. }
  170.  
  171.  
  172.  
  173.  
  174.  
  175. s32 Xmp::playerPrevPosition(){
  176.   if(!_valid) return -KIT_XMP_ERROR_STATE;
  177.  
  178.   return xmp_prev_position(CTX_PTR);
  179.  
  180. }
  181.  
  182.  
  183.  
  184.  
  185.  
  186. s32 Xmp::playerNextPosition(){
  187.   if(!_valid) return -KIT_XMP_ERROR_STATE;
  188.  
  189.   return xmp_next_position(CTX_PTR);
  190.  
  191. }
  192.  
  193.  
  194.  
  195.  
  196.  
  197. s32 Xmp::playerMute(u31 channel, s32 status){
  198.   if(!_valid) return -KIT_XMP_ERROR_STATE;
  199.  
  200.   return xmp_channel_mute(CTX_PTR, channel.v, status);
  201.  
  202. }
  203.  
  204.  
  205.  
  206.  
  207.  
  208. s32 Xmp::playerVolume(u31 channel, s32 volume){
  209.   if(!_valid) return -KIT_XMP_ERROR_STATE;
  210.  
  211.   return xmp_channel_vol(CTX_PTR, channel.v, volume);
  212.  
  213. }
  214.  
  215.  
  216.  
  217.  
  218.  
  219. s32 Xmp::playerInjectEvent(u31 channel, Xmp_event* event_in){
  220.   if(!_valid) return -KIT_XMP_ERROR_STATE;
  221.  
  222.   xmp_inject_event(CTX_PTR, channel.v, (xmp_event*)event_in);
  223.  
  224.   return 0;
  225.  
  226. }
  227.  
  228.  
  229.  
  230.  
  231.  
  232. s32 Xmp::playerStart(u31 sampleRate, s32 formatFlags){
  233.   if(!_valid) return -KIT_XMP_ERROR_STATE;
  234.  
  235.   if(sampleRate.s) return -KIT_XMP_ERROR_INVALID;
  236.  
  237.   playerEnd();
  238.  
  239.   int err = xmp_start_player(CTX_PTR, sampleRate.v, formatFlags);
  240.   if(err) return err;
  241.  
  242.   _initPlayer = true;
  243.  
  244.   ++numAllocations;
  245.  
  246.   return 0;
  247.  
  248. }
  249.  
  250.  
  251.  
  252.  
  253.  
  254. s32 Xmp::playerEnd(){
  255.   if(!_valid || !_initPlayer) return -KIT_XMP_ERROR_STATE;
  256.  
  257.   xmp_end_player(CTX_PTR);
  258.  
  259.   _initPlayer = false;
  260.  
  261.   --numAllocations;
  262.  
  263.   return 0;
  264.  
  265. }
  266.  
  267.  
  268.  
  269.  
  270.  
  271. }; /* namespace kit */
  272. /******************************************************************************/
  273. /******************************************************************************/
  274. //"2024-12-13\kit_xmp\kit_Xmp_playFrame.cpp":
  275. #include <kit/misc.hpp>
  276. #include <kit/Xmp.hpp>
  277.  
  278. #define LIBXMP_STATIC
  279. #include <libxmp-lite/xmp.h>
  280.  
  281. #define CTX_PTR ((xmp_context)_ctx)
  282.  
  283.  
  284. namespace kit {
  285.  
  286.  
  287.  
  288.  
  289.  
  290. s32 Xmp::playFrame(Xmp_frameInfo* finfo_out, bool callPlayFrame){
  291.   if(!_valid || !_initModule || !_initPlayer) return -KIT_XMP_ERROR_STATE;
  292.  
  293.   int err = 0; //0 for no error
  294.   if(callPlayFrame) err = xmp_play_frame(CTX_PTR);
  295.   if(err) return err;
  296.  
  297.   if(finfo_out != nullptr) xmp_get_frame_info(CTX_PTR, (xmp_frame_info*)finfo_out);
  298.  
  299.   return err;
  300.  
  301. }
  302.  
  303.  
  304.  
  305.  
  306.  
  307. }; /* namespace kit */
  308. /******************************************************************************/
  309. /******************************************************************************/
  310. //"2024-12-13\iso_game\include_all.hpp":
  311. #ifndef _INCLUDE_ALL_HPP
  312. #define _INCLUDE_ALL_HPP
  313.  
  314. #include <kit/all.hpp>
  315. #include <kit/Xmp.hpp>
  316.  
  317. #define loghere kit_LogInfo("%s: %3i", __FILE__, __LINE__);
  318.  
  319. /********************************* "main.cpp" *********************************/
  320.  
  321. //(window is hidden initially, use setVisibility() to change that)
  322. #define WIN_TITLE "IsoZooid"
  323. #define WIN_W     1024
  324. #define WIN_H     768
  325. #define WIN_FLAGS 0
  326.  
  327. #define TEXTCOLORED_LEN 16
  328.  
  329. #define SFX_TRACKS 64
  330.  
  331. extern kit::Window*        wndw;
  332. extern kit::Renderer*      rndr;
  333. extern kit::BFont_Texture* text;
  334. extern kit::BFont_Texture* textColored[TEXTCOLORED_LEN];
  335.  
  336. //if fade delta is 1/20th, then it will take 2/20ths of a second
  337.  //for a new song to fully fade-in (unless index is <0 of course)
  338.  
  339. void music_play(kit::s32 index = -1); //<0 to stop music
  340. void music_setFadeDelta(kit::f32 fadeTimeSeconds = 1.0f/20);
  341.  
  342. kit::f64 frand  (); // 0.0f -> 1.0f
  343. kit::f64 frand2 (); //-1.0f -> 1.0f
  344. kit::f32 frandf (); // 0.0f -> 1.0f
  345. kit::f32 frandf2(); //-1.0f -> 1.0f
  346.  
  347. /****************************** "callbacks.cpp" *******************************/
  348.  
  349. extern kit::SoundEngine* sfx;
  350.  
  351. extern kit::s32        music_index;
  352. extern kit::Stereo_f32 music_vol;
  353.  
  354. /****************************** "utils_core.cpp" ******************************/
  355.  
  356. #define TILE_ID_NULL     0
  357.  
  358. #define TILE_ID_BOXSMALL 1
  359. #define TILE_ID_BOXBIG   2
  360.  
  361. #define TILE_ID_GOAL     3
  362.  
  363. #define TILE_ID_BLOCK_R  4
  364. #define TILE_ID_BLOCK_G  5
  365. #define TILE_ID_BLOCK_B  6
  366. #define TILE_ID_BLOCK_Y  7 //more orange than yellow, but whatever
  367.  
  368. //...
  369.  
  370. #define TILE_ID_PLAYER_BACK  12
  371. #define TILE_ID_PLAYER_RIGHT 13
  372. #define TILE_ID_PLAYER_LEFT  14
  373.  
  374. #define TILE_ID_HIGHLIGHT 15 //for level editor
  375.  
  376. union tile_run {
  377.   kit::u16 value;
  378.   struct { kit::u16 len:11, tile:4, opaque:1; };
  379.   tile_run(kit::u16 _value) : value(_value) {}
  380. };
  381.  
  382. extern kit::shape::fpoint tile_camera;
  383.  
  384. void draw_tile(kit::s32 x, kit::s32 y, kit::s32 z,
  385.                kit::u32 which, kit::f32 alpha = 1.0f);
  386.  
  387. static inline bool isInFront(kit::shape::point3d p_a, kit::shape::point3d p_b){
  388.   return (p_a.x < p_b.x) || (p_a.y < p_b.y) || (p_a.z > p_b.z);
  389. }
  390.  
  391. /******************************************************************************/
  392.  
  393. #endif /* _INCLUDE_ALL_HPP */
  394. /******************************************************************************/
  395. /******************************************************************************/
  396. //"2024-12-13\kit_xmp\Xmp.hpp":
  397. //THIS LIBRARY WAS MADE TO USE LIBXMP 4.6.0
  398.  
  399. #ifndef _INC_XMP_HPP
  400. #define _INC_XMP_HPP
  401.  
  402. #include <kit/commondef.hpp>
  403.  
  404.  
  405.  
  406. #define KIT_XMP_NAME_SIZE 64 //size of module name and type
  407.  
  408. #define KIT_XMP_KEY_OFF  0x81   //note number for key off event
  409. #define KIT_XMP_KEY_CUT  0x82   //note number for key cut event
  410. #define KIT_XMP_KEY_FADE 0x83   //note number for fade event
  411.  
  412. //mixer parameter macros
  413.  
  414. //sample format flags
  415. #define KIT_XMP_FORMAT_8BIT     (1 << 0) //mix to 8-bit instead of 16
  416. #define KIT_XMP_FORMAT_UNSIGNED (1 << 1) //mix to unsigned samples
  417. #define KIT_XMP_FORMAT_MONO     (1 << 2) //mix to mono instead of stereo
  418.  
  419. //player parameters
  420. #define KIT_XMP_PLAYER_AMP         0 //amplification factor
  421. #define KIT_XMP_PLAYER_MIX         1 //stereo mixing
  422. #define KIT_XMP_PLAYER_INTERP      2 //interpolation type
  423. #define KIT_XMP_PLAYER_DSP         3 //DSP effect flags
  424. #define KIT_XMP_PLAYER_FLAGS       4 //player flags
  425. #define KIT_XMP_PLAYER_CFLAGS      5 //player flags for current module
  426. #define KIT_XMP_PLAYER_SMPCTL      6 //sample control flags
  427. #define KIT_XMP_PLAYER_VOLUME      7 //player module volume
  428. #define KIT_XMP_PLAYER_STATE       8 //internal player state (read only)
  429. #define KIT_XMP_PLAYER_SMIX_VOLUME 9 //SMIX volume
  430. #define KIT_XMP_PLAYER_DEFPAN     10 //default pan setting
  431. #define KIT_XMP_PLAYER_MODE       11 //player personality
  432. #define KIT_XMP_PLAYER_MIXER_TYPE 12 //current mixer (read only)
  433. #define KIT_XMP_PLAYER_VOICES     13 //maximum number of mixer voices
  434.  
  435. //interpolation types
  436. #define KIT_XMP_INTERP_NEAREST 0 //nearest neighbor
  437. #define KIT_XMP_INTERP_LINEAR  1 //linear (default)
  438. #define KIT_XMP_INTERP_SPLINE  2 //cubic spline
  439.  
  440. //dsp effect types
  441. #define KIT_XMP_DSP_LOWPASS (1 << 0) //lowpass filter effect
  442. #define KIT_XMP_DSP_ALL     (KIT_XMP_DSP_LOWPASS)
  443.  
  444. //player state
  445. #define KIT_XMP_STATE_UNLOADED 0 //context created
  446. #define KIT_XMP_STATE_LOADED   1 //module loaded
  447. #define KIT_XMP_STATE_PLAYING  2 //module playing
  448.  
  449. //player flags
  450. #define KIT_XMP_FLAGS_VBLANK  (1 << 0) //use vblank timing
  451. #define KIT_XMP_FLAGS_FX9BUG  (1 << 1) //emulate FX9 bug
  452. #define KIT_XMP_FLAGS_FIXLOOP (1 << 2) //emulate sample loop bug
  453. #define KIT_XMP_FLAGS_A500    (1 << 3) //use Paula mixer in Amig modules
  454.  
  455. //player modes
  456. #define KIT_XMP_MODE_AUTO         0 //autodetect mode (default)
  457. #define KIT_XMP_MODE_MOD          1 //play as a generic MOD player
  458. #define KIT_XMP_MODE_NOISETRACKER 2 //play using Noisetracker quirks
  459. #define KIT_XMP_MODE_PROTRACKER   3 //play using Protracker quirks
  460. #define KIT_XMP_MODE_S3M          4 //play as a generic S3M player
  461. #define KIT_XMP_MODE_ST3          5 //play using ST3 bug emulation
  462. #define KIT_XMP_MODE_ST3GUS       6 //play using ST3+GUS quirks
  463. #define KIT_XMP_MODE_XM           7 //play as a generic XM player
  464. #define KIT_XMP_MODE_FT2          8 //play using FT2 bug emulation
  465. #define KIT_XMP_MODE_IT           9 //play using IT quirks
  466. #define KIT_XMP_MODE_ITSMP       10 //play using IT sample mode quirks
  467.  
  468. //mixer types
  469. #define KIT_XMP_MIXER_STANDARD 0 //standard mixer
  470. #define KIT_XMP_MIXER_A500     1 //amiga 500
  471. #define KIT_XMP_MIXER_A500F    2 //amiga 500 with led filter
  472.  
  473. //sample flags
  474. #define KIT_XMP_SMPCTL_SKIP (1 << 0) //don't load samples
  475.  
  476. //limits
  477. #define KIT_XMP_MAX_KEYS      121 //number of valid keys
  478. #define KIT_XMP_MAX_ENV_POINTS 32 //max number of envelope points
  479. #define KIT_XMP_MAX_MOD_LEN   256 //max number of patterns in module
  480. #define KIT_XMP_MAX_CHANNELS   64 //max number of channels in module
  481. #define KIT_XMP_MAX_SRATE   49170 //max sampling rate (Hz)
  482. #define KIT_XMP_MIN_SRATE    4000 //min sampling rate (Hz)
  483. #define KIT_XMP_MIN_BPM        20 //min BPM
  484. //frame rate = (50 * bpm / 125) Hz
  485. //frame size = (sampling rate * channels * size) / frame rate
  486. #define KIT_XMP_MAX_FRAMESIZE (5 * KIT_XMP_MAX_SRATE * 2 / KIT_XMP_MIN_BPM)
  487.  
  488. //error codes
  489. #define KIT_XMP_END            1
  490. #define KIT_XMP_ERROR_INTERNAL 2 //internal error
  491. #define KIT_XMP_ERROR_FORMAT   3 //unsupported module format
  492. #define KIT_XMP_ERROR_LOAD     4 //error loading file
  493. #define KIT_XMP_ERROR_DEPACK   5 //error depacking file
  494. #define KIT_XMP_ERROR_SYSTEM   6 //system error
  495. #define KIT_XMP_ERROR_INVALID  7 //invalid parameter
  496. #define KIT_XMP_ERROR_STATE    8 //invalid player state
  497.  
  498.  
  499.  
  500. namespace kit {
  501.  
  502.  
  503.  
  504.  
  505.  
  506. #define KIT_XMP_CHANNEL_SYNTH    (1 << 0) //channel is synthesized
  507. #define KIT_XMP_CHANNEL_MUTE     (1 << 1) //channel is muted
  508. #define KIT_XMP_CHANNEL_SPLIT    (1 << 2) //split Amiga channel in bits 5-4
  509. #define KIT_XMP_CHANNEL_SURROUND (1 << 4) //surround channel
  510.  
  511. struct Xmp_channel { //12B
  512.   s32 pan; //channel pan (0x80 is center)
  513.   s32 vol; //channel volume
  514.   s32 flg; //channel flags
  515.  
  516. };
  517.  
  518.  
  519.  
  520.  
  521.  
  522. struct Xmp_pattern { //8B
  523.   s32  rows;    //number of rows
  524.   s32 index[1]; //track index
  525.  
  526. };
  527.  
  528.  
  529.  
  530.  
  531.  
  532. struct Xmp_event { //8B
  533.   u8     note; //note number (0 means no note)
  534.   u8      ins; //patch number
  535.   u8   volume; //volume (0 to basevol)
  536.   u8   fxType; //effect type
  537.   u8  fxParam; //effect parameter
  538.   u8  fx2Type; //secondary effect type
  539.   u8 fx2Param; //secondary effect parameter
  540.   u8   _flags; //internal (reserved) flags
  541.  
  542. };
  543.  
  544.  
  545.  
  546.  
  547.  
  548. struct Xmp_track { //12B
  549.   s32        rows;    //number of rows
  550.   Xmp_event event[1]; //event data
  551. };
  552.  
  553.  
  554.  
  555.  
  556.  
  557. #define KIT_XMP_ENVELOPE_ON    (1 << 0) //envelope is enabled
  558. #define KIT_XMP_ENVELOPE_SUS   (1 << 1) //envelope has sustain point
  559. #define KIT_XMP_ENVELOPE_LOOP  (1 << 2) //envelope has loop
  560. #define KIT_XMP_ENVELOPE_FLT   (1 << 3) //envelope is used for filter
  561. #define KIT_XMP_ENVELOPE_SLOOP (1 << 4) //envelope has sustain loop
  562. #define KIT_XMP_ENVELOPE_CARRY (1 << 5) //don't reset envelope position
  563.  
  564. struct Xmp_envelope { //156B
  565.   s32 flg; //flags
  566.   s32 npt; //number of envelope points
  567.   s32 scl; //envelope scaling
  568.   s32 sus; //sustain start point
  569.   s32 sue; //sustain end point
  570.   s32 lps; //loop start point
  571.   s32 lpe; //loop end point
  572.  
  573.   s16 data[KIT_XMP_MAX_ENV_POINTS * 2];
  574.  
  575. };
  576.  
  577.  
  578.  
  579.  
  580.  
  581. #define KIT_XMP_INST_NNA_CUT    0x00
  582. #define KIT_XMP_INST_NNA_CONT   0x01
  583. #define KIT_XMP_INST_NNA_OFF    0x02
  584. #define KIT_XMP_INST_NNA_FADE   0x03
  585.  
  586. #define KIT_XMP_INST_DCT_OFF    0x00
  587. #define KIT_XMP_INST_DCT_NOTE   0x01
  588. #define KIT_XMP_INST_DCT_SMP    0x02
  589. #define KIT_XMP_INST_DCT_INST   0x03
  590.  
  591. #define KIT_XMP_INST_DCA_CUT    KIT_XMP_INST_NNA_CUT
  592. #define KIT_XMP_INST_DCA_OFF    KIT_XMP_INST_NNA_OFF
  593. #define KIT_XMP_INST_DCA_FADE   KIT_XMP_INST_NNA_FADE
  594.  
  595. struct Xmp_subInstrument { //64B
  596.   s32 vol; //default volume
  597.   s32 gvl; //global volume
  598.   s32 pan; //pan
  599.   s32 xpo; //transpose
  600.   s32 fin; //finetune
  601.   s32 vwf; //vibrato waveform
  602.   s32 vde; //vibrato depth
  603.   s32 vra; //vibrato rate
  604.   s32 vsw; //vibrato sweep
  605.   s32 rvv; //random volume/pan variation (IT)
  606.   s32 sid; //sample number
  607.   s32 nna; //new note action
  608.   s32 dct; //duplicate check type
  609.   s32 dca; //duplicate check action
  610.   s32 ifc; //initial filter cutoff
  611.   s32 ifr; //initial filter resonance
  612. };
  613.  
  614.  
  615.  
  616.  
  617.  
  618. struct Xmp_instrument { //776B
  619.   char         name[32]; //instrument name
  620.   s32          vol;      //instrument volume
  621.   s32          nsm;      //number of samples
  622.   s32          rls;      //release (fadeout)
  623.   Xmp_envelope aei;      //amplitude envelope info
  624.   Xmp_envelope pei;      //pan envelope info
  625.   Xmp_envelope fei;      //frequency envelope info
  626.  
  627.   struct {
  628.     u8 ins; //instrument number for each key
  629.     s8 xpo; //instrument transpose for each key
  630.   } map[KIT_XMP_MAX_KEYS];
  631.  
  632.   Xmp_subInstrument* sub;
  633.  
  634.   void *extra; //extra fields
  635.  
  636. };
  637.  
  638.  
  639.  
  640.  
  641.  
  642. #define KIT_XMP_SMP_16BIT        (1 <<  0) //16bit sample
  643. #define KIT_XMP_SMP_LOOP         (1 <<  1) //sample is looped
  644. #define KIT_XMP_SMP_LOOP_BIDIR   (1 <<  2) //bidirectional sample loop
  645. #define KIT_XMP_SMP_LOOP_REVERSE (1 <<  3) //backwards sample loop
  646. #define KIT_XMP_SMP_LOOP_FULL    (1 <<  4) //play full sample before looping
  647. #define KIT_XMP_SMP_SLOOP        (1 <<  5) //sample has sustain loop
  648. #define KIT_XMP_SMP_SLOOP_BIDIR  (1 <<  6) //bidirectional sustain loop
  649. #define KIT_XMP_SMP_STEREO       (1 <<  7) //interlaced stereo sample
  650. #define KIT_XMP_SMP_SYNTH        (1 << 15) //data contains synth patch
  651.  
  652. struct Xmp_sample { //56B
  653.   char name[32]; //sample name
  654.   s32   len;     //sample length
  655.   s32   lps;     //loop start
  656.   s32   lpe;     //loop end
  657.   s32   flg;     //flags
  658.   u8*  data;     //sample data
  659. };
  660.  
  661.  
  662.  
  663.  
  664.  
  665. struct Xmp_sequence { //8B
  666.   s32 entry_point;
  667.   s32 duration;
  668. };
  669.  
  670.  
  671.  
  672.  
  673.  
  674. struct Xmp_module { //1224B
  675.   char            name[KIT_XMP_NAME_SIZE];  //module title
  676.   char            type[KIT_XMP_NAME_SIZE];  //module format
  677.   s32             pat;                      //number of patterns
  678.   s32             trk;                      //number of tracks
  679.   s32             chn;                      //tracks per pattern
  680.   s32             ins;                      //number of instruments
  681.   s32             smp;                      //number of samples
  682.   s32             spd;                      //initial speed
  683.   s32             bpm;                      //initial BPM
  684.   s32             len;                      //module length in patterns
  685.   s32             rst;                      //restart position
  686.   s32             gvl;                      //global volume
  687.   Xmp_pattern**   xxp;                      //patterns
  688.   Xmp_track**     xxt;                      //tracks
  689.   Xmp_instrument* xxi;                      //instruments
  690.   Xmp_sample*     xxs;                      //samples
  691.   Xmp_channel     xxc[64];                  //channel info
  692.   u8              xxo[KIT_XMP_MAX_MOD_LEN]; //orders
  693.  
  694. };
  695.  
  696.  
  697.  
  698.  
  699.  
  700. struct Xmp_testInfo { //128B
  701.   char name[KIT_XMP_NAME_SIZE]; //module title
  702.   char type[KIT_XMP_NAME_SIZE]; //module format
  703.  
  704. };
  705.  
  706.  
  707.  
  708.  
  709.  
  710. struct Xmp_moduleInfo { //56B
  711.   u8        md5[16]; //MD5 message digest
  712.   s32      vol_base; //volume scale
  713.   Xmp_module*   mod; //pointer to module data
  714.   char*     comment; //comment text, if any
  715.   s32       seq_len; //number of valid sequences
  716.   Xmp_sequence* seq; //pointer to sequence data
  717. };
  718.  
  719.  
  720.  
  721.  
  722.  
  723. struct Xmp_channelInfo { //24B
  724.   u32      period; //sample period (* 4096)
  725.   u32    position; //sample position
  726.   s16   pitchbend; //linear bend from base note
  727.   u8         note; //current base note number
  728.   u8   instrument; //current instrument number
  729.   u8       sample; //current sample number
  730.   u8       volume; //current volume
  731.   u8          pan; //current stereo pan
  732.   u8    _reserved; //reserved
  733.   Xmp_event event; //current track event
  734. };
  735.  
  736.  
  737.  
  738.  
  739.  
  740. struct Xmp_frameInfo { //1616B; current frame information
  741.   s32           pos; //current position
  742.   s32       pattern; //current pattern
  743.   s32           row; //current row in pattern
  744.   s32      num_rows; //number of rows in current pattern
  745.   s32         frame; //current frame
  746.   s32         speed; //current replay speed
  747.   s32           bpm; //current bpm
  748.   s32          time; //current module time in ms
  749.   s32    total_time; //estimated replay time in ms
  750.   s32    frame_time; //frame replay time in us
  751.   void*      buffer; //pointer to sound buffer
  752.   s32   buffer_size; //used buffer size
  753.   s32    total_size; //total buffer size
  754.   s32        volume; //current master volume
  755.   s32    loop_count; //loop counter
  756.   s32 virt_channels; //number of virtual channels
  757.   s32     virt_used; //used virtual channels
  758.   s32      sequence; //current sequence
  759.  
  760.   Xmp_channelInfo channel_info[KIT_XMP_MAX_CHANNELS]; //current channel info
  761.  
  762. };
  763.  
  764.  
  765.  
  766.  
  767.  
  768. /* //(will probably be left unused)
  769. struct Xmp_callbacks { //32B
  770.   u32 (* read_func)(void* dst, u32 len, u32 nmemb, void* priv);
  771.   s32 (* seek_func)(void* priv, s32 offset, s32 whence);
  772.   s32 (* tell_func)(void* priv);
  773.   s32 (*close_func)(void* priv);
  774.  
  775. };
  776. */
  777.  
  778.  
  779.  
  780.  
  781.  
  782. //SMIX FUNCTIONALITY IS NOT IMPLEMENTED!
  783.  
  784. //(ALSO, ALL ERROR CODES WILL BE NEGATIVE!)
  785.  
  786. class Xmp { //16B
  787.   u32          _type;
  788.   bool        _valid = false;
  789.   bool _constructing = true;
  790.   bool   _initModule = false;
  791.   bool   _initPlayer = false;
  792.   GenOpqPtr     _ctx = nullptr;
  793.  
  794.  
  795.   s32 _test_from_memory(const void* data, u31 size, Xmp_testInfo* tinfo_out);
  796.  
  797.   s32 _module_from_memory(const void* data, u31 size);
  798.  
  799.  
  800. public:
  801.  
  802.   Xmp();
  803.  
  804.   ~Xmp();
  805.  
  806.  
  807.  
  808.   //returns 0 on success, or an error code on failure
  809.   inline s32 getTestInfo(const void* data, u31 size, Xmp_testInfo* tinfo_out)
  810.   { return _test_from_memory(data, size, tinfo_out); }
  811.  
  812.   s32 getTestInfo(const char* filePath, Xmp_testInfo* tinfo_out);
  813.  
  814.  
  815.  
  816.   //returns 0 on success or -KIT_XMP_END if the module ended or was stopped,
  817.    //or -KIT_XMP_ERROR_STATE if player is not in a playing state
  818.   s32 playBuffer(void* buffer, u31 size, bool ignoreLoopChecking = false);
  819.  
  820.   //leaving finfo_out as nullptr will result in xmp_play_frame being called,
  821.    //but not xmp_get_frame_info (though why you'd want to do this is beyond me)
  822.   //if callPlayFrame is false, then that too won't be called
  823.   s32 playFrame(Xmp_frameInfo* finfo_out = nullptr, bool callPlayFrame = true);
  824.  
  825.  
  826.  
  827. /*********************************** MODULE ***********************************/
  828.  
  829.   inline bool isModuleLoaded(){ return _initModule; }
  830.  
  831.   //get information about the currently loaded module
  832.   //returns 0 on success, or an error code on failure
  833.   s32 getModuleInfo(Xmp_moduleInfo* minfo_out);
  834.  
  835.   inline s32 moduleLoad(const void* data, u31 size)
  836.   { return _module_from_memory(data, size); }
  837.  
  838.   //returns 0 on success, or error code on failure
  839.   s32 moduleLoad(const char* filePath);
  840.  
  841.   //returns whether or not there was a loaded module to be released,
  842.    //or false if Xmp instance is invalid
  843.   bool moduleRelease();
  844.  
  845.   //returns 0 on success, or error code on failure
  846.   s32 moduleStop();
  847.  
  848.   s32 moduleRestart();
  849.  
  850.  
  851.  
  852. /*********************************** PLAYER ***********************************/
  853.  
  854.   //parameter can be one of:
  855.    //KIT_XMP_PLAYER_AMP         //amplification factor
  856.    //KIT_XMP_PLAYER_MIX         //stereo mixing
  857.    //KIT_XMP_PLAYER_INTERP      //interpolation type
  858.    //KIT_XMP_PLAYER_DSP         //DSP effect flags
  859.    //KIT_XMP_PLAYER_FLAGS       //player flags
  860.    //KIT_XMP_PLAYER_CFLAGS      //player flags for current module
  861.    //KIT_XMP_PLAYER_SMPCTL      //control sample loading
  862.    //KIT_XMP_PLAYER_VOLUME      //player master volume
  863.    //KIT_XMP_PLAYER_STATE       //current player state (read only)
  864.    //KIT_XMP_PLAYER_SMIX_VOLUME //SMIX Volume
  865.    //KIT_XMP_PLAYER_DEFPAN      //default pan separation
  866.    //KIT_XMP_PLAYER_MODE        //player personality
  867.    //KIT_XMP_PLAYER_MIXER_TYPE  //current mixer (read only)
  868.    //KIT_XMP_PLAYER_VOICES      //maximum number of mixer voices
  869.   //returns the parameter's value, or an error code on failure
  870.    //(error codes are always <0, and parameter values are >= 0!)
  871.   s32 getPlayer(s32 parameter);
  872.  
  873.  
  874.  
  875.   inline s32 setPlayerAmp(s32 value) //amplification factor; 0-3, default of 1
  876.   { return setPlayer(KIT_XMP_PLAYER_AMP, value); }
  877.  
  878.   inline s32 setPlayerMix(s32 value) //% of l/r channel sep.; default of 70
  879.   { return setPlayer(KIT_XMP_PLAYER_MIX, value); }
  880.  
  881.   //value can be one of:
  882.    //KIT_XMP_INTERP_NEAREST: nearest-neighbor
  883.    //KIT_XMP_INTERP_LINEAR:  linear (default)
  884.    //KIT_XMP_INTERP_SPLINE:  cubic spline
  885.   inline s32 setPlayerInterp(s32 value) //interpolation type
  886.   { return setPlayer(KIT_XMP_PLAYER_INTERP, value); }
  887.  
  888.   //value can be one or more of:
  889.    //KIT_XMP_DSP_LOWPASS: low-pass filter effect
  890.    //KIT_XMP_DSP_ALL:     all effects
  891.   inline s32 setPlayerDSP(s32 value) //DSP effects flags
  892.   { return setPlayer(KIT_XMP_PLAYER_DSP, value); }
  893.  
  894.   //value can be one or more of
  895.    //KIT_XMP_FLAGS_VBLANK:  //use vblank timing
  896.    //KIT_XMP_FLAGS_FX9BUG:  //emulate Protracker 2.x FX9 bug
  897.    //KIT_XMP_FLAGS_FIXLOOP: //make sample loop value / 2
  898.    //KIT_XMP_FLAGS_A500:    //use Paula mixer in Amiga modules
  899.   inline s32 setPlayerFlags(s32 value) //player flags
  900.   { return setPlayer(KIT_XMP_PLAYER_FLAGS, value); }
  901.  
  902.   //value can be one or more of the values above ^^
  903.   inline s32 setPlayerCFlags(s32 value) //player flags for current module
  904.   { return setPlayer(KIT_XMP_PLAYER_CFLAGS, value); }
  905.  
  906.   //value can be one of:
  907.    //0:                   load samples when loading module (default)
  908.    //KIT_XMP_SMPCTL_SKIP: don't load samples when loading module
  909.   inline s32 setPlayerSmpCtl(s32 value) //control sample loading
  910.   { return setPlayer(KIT_XMP_PLAYER_SMPCTL, value); }
  911.  
  912.   inline s32 setPlayerVolume(s32 value) //player master volume; 0-100
  913.   { return setPlayer(KIT_XMP_PLAYER_VOLUME, value); }
  914.  
  915.   inline s32 setPlayerSMIXVolume(s32 value) //SMIX volume; 0-100
  916.   { return setPlayer(KIT_XMP_PLAYER_SMIX_VOLUME, value); }
  917.  
  918.   inline s32 setPlayerDefPan(s32 value) //default pan sep.; %, default of 100%
  919.   { return setPlayer(KIT_XMP_PLAYER_DEFPAN, value); }
  920.  
  921.   //value can be one of:
  922.    //KIT_XMP_MODE_AUTO:         autodetect mode (default)
  923.    //KIT_XMP_MODE_MOD:          play as a generic MOD player
  924.    //KIT_XMP_MODE_NOISETRACKER: play using Noisetracker quirks
  925.    //KIT_XMP_MODE_PROTRACKER:   play using Protracker 1/2 quirks
  926.    //KIT_XMP_MODE_S3M:          play as a generic S3M player
  927.    //KIT_XMP_MODE_ST3:          play using ST3 bug emulation
  928.    //KIT_XMP_MODE_ST3GUS:       play using ST3+GUS quirks
  929.    //KIT_XMP_MODE_XM:           play as a generic XM player
  930.    //KIT_XMP_MODE_FT2:          play using FT2 bug emulation
  931.    //KIT_XMP_MODE_IT:           play using IT quirks
  932.    //KIT_XMP_MODE_ITSMP:        play using IT sample mode quirks
  933.   inline s32 setPlayerMode(s32 value) //player personality
  934.   { return setPlayer(KIT_XMP_PLAYER_MODE, value); }
  935.  
  936.   inline s32 setPlayerVoices(s32 value) //max # of mixer voices; default of 128
  937.   { return setPlayer(KIT_XMP_PLAYER_VOICES, value); }
  938.  
  939.   //parameter can be one of:
  940.    //KIT_XMP_PLAYER_AMP:         //amplification factor
  941.    //KIT_XMP_PLAYER_MIX:         //stereo mixing
  942.    //KIT_XMP_PLAYER_INTERP:      //interpolation type
  943.    //KIT_XMP_PLAYER_DSP:         //DSP effect flags
  944.    //KIT_XMP_PLAYER_FLAGS:       //player flags
  945.    //KIT_XMP_PLAYER_CFLAGS:      //player flags for current module
  946.    //KIT_XMP_PLAYER_SMPCTL:      //control sample loading
  947.    //KIT_XMP_PLAYER_VOLUME:      //clayer master volume
  948.    //KIT_XMP_PLAYER_SMIX_VOLUME: //SMIX Volume
  949.    //KIT_XMP_PLAYER_DEFPAN:      //default pan separation
  950.    //KIT_XMP_PLAYER_MODE:        //player personality
  951.    //KIT_XMP_PLAYER_VOICES:      //maximum number of mixer voices
  952.   //look at the above inline functions to see the valid values for each paramter
  953.   //returns 0 on success, or an error code on failure
  954.   s32 setPlayer(s32 parameter, s32 value);
  955.  
  956.  
  957.  
  958.   s32 setPlayerTempoFactor(f64 multiplier);
  959.  
  960.  
  961.  
  962.   //returns the new time index (in milliseconds), or an error code on failure
  963.   s32 setPlayerTime(u31 milliseconds);
  964.  
  965.   //returns the new row index, or an error code on failure
  966.   s32 setPlayerRow(u31 row);
  967.  
  968.   //returns the new position index, or an error code on failure
  969.   s32 setPlayerPosition(u31 pos);
  970.  
  971.   s32 playerPrevPosition();
  972.  
  973.   s32 playerNextPosition();
  974.  
  975.  
  976.  
  977.   //status can be one of:
  978.    //-1: query the mute status of the selected channel without changing anything
  979.    // 0: mute the selected channel
  980.    // 1: unmute the selected channel
  981.   //returns the channel's previous mute status, or an error code on failure
  982.   s32 playerMute(u31 channel, s32 status);
  983.  
  984.   //volume can be one of:
  985.    //   -1: query the volume of the selected channel without changing anything
  986.    //0-100: the desired volume percentage
  987.   //returns the channel's previous volume, or an error code on failure
  988.   s32 playerVolume(u31 channel, s32 volume);
  989.  
  990.   //returns 0 on success, or an error code on failure
  991.   s32 playerInjectEvent(u31 channel, Xmp_event* event_in);
  992.  
  993.  
  994.  
  995.   //formatFlags can use one or more of:
  996.    //KIT_XMP_FORMAT_8BIT:     Mix to 8-bit instead of 16
  997.    //KIT_XMP_FORMAT_UNSIGNED: Mix to unsigned samples
  998.    //KIT_XMP_FORMAT_MONO:     Mix to mono instead of stereo
  999.   //returns 0 on success, or an error code on failure
  1000.   s32 playerStart(u31 sampleRate, s32 formatFlags = 0);
  1001.  
  1002.   //returns 0 on success, or -KIT_XMP_ERROR_STATE if !_valid || !_initPlayer
  1003.   s32 playerEnd(); //ends module replay and releases player memory
  1004.  
  1005. };
  1006.  
  1007.  
  1008.  
  1009.  
  1010.  
  1011. union Xmp_version { //4B
  1012.   u32 value;
  1013.  
  1014.   struct {
  1015.     u8 release; //_._.X
  1016.     u8   minor; //_.X._
  1017.     u8   major; //X._._
  1018.     u8       _;
  1019.   };
  1020.  
  1021. };
  1022.  
  1023.  
  1024.  
  1025.  
  1026.  
  1027. namespace xmp {
  1028.  
  1029.  
  1030.  
  1031. const char* const* getFormatList();
  1032.  
  1033. //used to retrieve errno if -KIT_XMP_ERROR_SYSTEM was returned as an error code
  1034. s32 getSysErrno();
  1035.  
  1036. //returns a null-terminated string of a human-readable version number of
  1037.  //the current libxmp build being linked (example: "4.0.0")
  1038. const char* getVersionString();
  1039.  
  1040. Xmp_version getVersionCode();
  1041.  
  1042.  
  1043.  
  1044. }; /* namespace xmp */
  1045.  
  1046.  
  1047.  
  1048.  
  1049.  
  1050. }; /* namespace kit */
  1051.  
  1052. #endif /* _INC_XMP_HPP */
  1053.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement