Recent

Author Topic: Game Music Emulator  (Read 1917 times)

Fred vS

  • Hero Member
  • *****
  • Posts: 3454
    • StrumPract is the musicians best friend
Re: Game Music Emulator
« Reply #15 on: September 19, 2024, 01:00:26 am »
Music archive for ZX spectrum and Amstrad CPC

http://projectay.dl.spilsby.net/ProjectAY.zip

http://projectay.dl.spilsby.net/Update-06March2008.zip

Yep, other meat for next winter, many thanks!  ;)

There is a console demo for Windows amd64 and Linux amd64 here.
I use Lazarus 2.2.0 32/64 and FPC 3.2.2 32/64 on Debian 11 64 bit, Windows 10, Windows 7 32/64, Windows XP 32,  FreeBSD 64.
Widgetset: fpGUI, MSEgui, Win32, GTK2, Qt.

https://github.com/fredvs
https://gitlab.com/fredvs
https://codeberg.org/fredvs

Guva

  • Full Member
  • ***
  • Posts: 122
Re: Game Music Emulator
« Reply #16 on: December 07, 2024, 04:55:43 am »
In the latest version of GME, something broke with the Naked emulator.
Therefore, GYM, VGM/VGZ files are not played correctly.

Compile the solution with another emulator.
cmake -DGME_YM2612_EMU=MAME .. or cmake -DGME_YM2612_EMU=GENS ..

headers for the latest version
Code: Pascal  [Select][+][-]
  1. unit binding.libgme;
  2.  
  3. // libgme 0.6.4 headers for fpc
  4.  
  5. {$mode objfpc}{$H+}
  6. {$packrecords c}
  7.  
  8. interface
  9.  
  10. uses
  11.   ctypes;
  12.  
  13. const
  14.   {$ifdef linux}
  15.       library_name = 'libgme.so.0.6.4';
  16.   {$endif}
  17.     {$ifdef windows}
  18.       library_name = 'gme.dll';
  19.   {$endif}
  20.  
  21. const
  22.   GME_VERSION = $000604;
  23.  
  24.  
  25. type
  26.   // Forward declarations
  27.   Pgme_type_t_ = Pointer;
  28.   PPgme_type_t_ = ^Pgme_type_t_;
  29.  
  30.   Pgme_info_t = ^gme_info_t;
  31.   PPgme_info_t = ^Pgme_info_t;
  32.  
  33.   Pgme_equalizer_t = ^gme_equalizer_t;
  34.  
  35.   gme_err_t = PUTF8Char;
  36.   PMusic_Emu = Pointer;
  37.   PPMusic_Emu = ^PMusic_Emu;
  38.  
  39.   (******** Informational ********)
  40.   _anonymous_type_1 = (
  41.     gme_info_only = -1);
  42.   P_anonymous_type_1 = ^_anonymous_type_1;
  43.  
  44.   gme_info_t = record
  45.     length: Integer;
  46.     intro_length: Integer;
  47.     loop_length: Integer;
  48.     play_length: Integer;
  49.     fade_length: Integer;
  50.     i5: Integer;
  51.     i6: Integer;
  52.     i7: Integer;
  53.     i8: Integer;
  54.     i9: Integer;
  55.     i10: Integer;
  56.     i11: Integer;
  57.     i12: Integer;
  58.     i13: Integer;
  59.     i14: Integer;
  60.     i15: Integer;
  61.     system: PUTF8Char;
  62.     game: PUTF8Char;
  63.     song: PUTF8Char;
  64.     author: PUTF8Char;
  65.     copyright: PUTF8Char;
  66.     comment: PUTF8Char;
  67.     dumper: PUTF8Char;
  68.     s7: PUTF8Char;
  69.     s8: PUTF8Char;
  70.     s9: PUTF8Char;
  71.     s10: PUTF8Char;
  72.     s11: PUTF8Char;
  73.     s12: PUTF8Char;
  74.     s13: PUTF8Char;
  75.     s14: PUTF8Char;
  76.     s15: PUTF8Char;
  77.   end;
  78.  
  79.   gme_equalizer_t = record
  80.     treble: Double;
  81.     bass: Double;
  82.     d2: Double;
  83.     d3: Double;
  84.     d4: Double;
  85.     d5: Double;
  86.     d6: Double;
  87.     d7: Double;
  88.     d8: Double;
  89.     d9: Double;
  90.   end;
  91.  
  92.   gme_type_t = Pointer;
  93.   Pgme_type_t = ^gme_type_t;
  94.  
  95.   gme_reader_t = function(your_data: Pointer; &out: Pointer; count: Integer): gme_err_t; cdecl;
  96.  
  97.   gme_user_cleanup_t = procedure(user_data: Pointer); cdecl;
  98.  
  99. var
  100. (******** Basic operations ********)
  101.   gme_open_file: function(path: PAnsiChar; &out: PPMusic_Emu; sample_rate: Integer): gme_err_t; cdecl;
  102.   gme_track_count: function(const p1: PMusic_Emu): Integer; cdecl;
  103.   gme_start_track: function(p1: PMusic_Emu; index: Integer): gme_err_t; cdecl;
  104.   gme_play: function(p1: PMusic_Emu; count: Integer; &out: PSmallint): gme_err_t; cdecl;
  105.   gme_delete: procedure(p1: PMusic_Emu); cdecl;
  106. (******** Track position/length ********)
  107.   gme_set_fade: procedure(p1: PMusic_Emu; start_msec: Integer); cdecl;
  108. (** See gme_set_fade.* @since 0.6.4*)
  109.   gme_set_fade_msecs: procedure(p1: PMusic_Emu; start_msec: Integer; length_msecs: Integer); cdecl;
  110. (**
  111.  * If do_autoload_limit is nonzero, then automatically load track length
  112.  * metadata (if present) and terminate playback once the track length has been
  113.  * reached. Otherwise playback will continue for an arbitrary period of time
  114.  * until a prolonged period of silence is detected.
  115.  *
  116.  * Not all individual emulators support this setting.
  117.  *
  118.  * By default, playback limits are loaded and applied.
  119.  *
  120.  * @since 0.6.3
  121.  *)
  122. gme_set_autoload_playback_limit: procedure(p1: PMusic_Emu; do_autoload_limit: Integer); cdecl;
  123. (** See gme_set_autoload_playback_limit.
  124.  * (This was actually added in 0.6.3, but wasn't exported because of a typo.)
  125.  * @since 0.6.4
  126.  *)
  127.   gme_autoload_playback_limit: function(const p1: PMusic_Emu): Integer; cdecl;
  128.   gme_track_ended: function(const p1: PMusic_Emu): Integer; cdecl;
  129.   gme_tell: function(const p1: PMusic_Emu): Integer; cdecl;
  130.   gme_tell_samples: function(const p1: PMusic_Emu): Integer; cdecl;
  131.   gme_seek: function(p1: PMusic_Emu; msec: Integer): gme_err_t; cdecl;
  132.   gme_seek_samples: function(p1: PMusic_Emu; n: Integer): gme_err_t; cdecl;
  133.   gme_warning: function(p1: PMusic_Emu): PUTF8Char; cdecl;
  134.   gme_load_m3u: function(p1: PMusic_Emu; path: PUTF8Char): gme_err_t; cdecl;
  135.   gme_clear_playlist: procedure(p1: PMusic_Emu); cdecl;
  136.   gme_track_info: function(const p1: PMusic_Emu; &out: PPgme_info_t; track: Integer): gme_err_t; cdecl;
  137.   gme_free_info: procedure(p1: Pgme_info_t); cdecl;
  138. (******** Advanced playback ********)
  139. gme_set_stereo_depth: procedure(p1: PMusic_Emu; depth: Double); cdecl;
  140. gme_ignore_silence: procedure(p1: PMusic_Emu; ignore: Integer); cdecl;
  141. gme_set_tempo: procedure(p1: PMusic_Emu; tempo: Double); cdecl;
  142. gme_voice_count: function(const p1: PMusic_Emu): Integer; cdecl;
  143. gme_voice_name: function(const p1: PMusic_Emu; i: Integer): PUTF8Char; cdecl;
  144. gme_mute_voice: procedure(p1: PMusic_Emu; index: Integer; mute: Integer); cdecl;
  145. gme_mute_voices: procedure(p1: PMusic_Emu; muting_mask: Integer); cdecl;
  146. gme_disable_echo: procedure(p1: PMusic_Emu; disable: Integer); cdecl;
  147. gme_equalizer: procedure(const p1: PMusic_Emu; &out: Pgme_equalizer_t); cdecl;
  148. gme_set_equalizer: procedure(p1: PMusic_Emu; const eq: Pgme_equalizer_t); cdecl;
  149. gme_enable_accuracy: procedure(p1: PMusic_Emu; enabled: Integer); cdecl;
  150. gme_type: function(const p1: PMusic_Emu): gme_type_t; cdecl;
  151. gme_type_list: function(): Pgme_type_t; cdecl;
  152. gme_type_system: function(p1: gme_type_t): PUTF8Char; cdecl;
  153. gme_type_multitrack: function(p1: gme_type_t): Integer; cdecl;
  154. gme_multi_channel: function(const p1: PMusic_Emu): Integer; cdecl;
  155. gme_open_data: function(const data: Pointer; size: Longint; &out: PPMusic_Emu; sample_rate: Integer): gme_err_t; cdecl;
  156. gme_identify_header: function(const header: Pointer): PUTF8Char; cdecl;
  157. gme_identify_extension: function(path_or_extension: PUTF8Char): gme_type_t; cdecl;
  158. (**
  159.  * Get typical file extension for a given music type.  This is not a replacement
  160.  * for a file content identification library (but see gme_identify_header).
  161.  *
  162.  * @since 0.6.3
  163.  *)
  164. gme_type_extension: function(music_type: gme_type_t): PUTF8Char; cdecl;
  165. gme_identify_file: function(path: PUTF8Char; type_out: Pgme_type_t): gme_err_t; cdecl;
  166. gme_new_emu: function(p1: gme_type_t; sample_rate: Integer): PMusic_Emu; cdecl;
  167. gme_new_emu_multi_channel: function(p1: gme_type_t; sample_rate: Integer): PMusic_Emu; cdecl;
  168. gme_load_file: function(p1: PMusic_Emu; path: PUTF8Char): gme_err_t; cdecl;
  169. gme_load_data: function(p1: PMusic_Emu; const data: Pointer; size: Longint): gme_err_t; cdecl;
  170. gme_load_tracks: function(me: PMusic_Emu; const data: Pointer; sizes: PLongint; count: Integer): gme_err_t; cdecl;
  171. gme_fixed_track_count: function(p1: gme_type_t): Integer; cdecl;
  172. gme_load_custom: function(p1: PMusic_Emu; p2: gme_reader_t; file_size: Longint; your_data: Pointer): gme_err_t; cdecl;
  173. gme_load_m3u_data: function(p1: PMusic_Emu; const data: Pointer; size: Longint): gme_err_t; cdecl;
  174. (******** User data ********)
  175. gme_set_user_data: procedure(p1: PMusic_Emu; new_user_data: Pointer); cdecl;
  176. gme_user_data: function(const p1: PMusic_Emu): Pointer; cdecl;
  177. gme_set_user_cleanup: procedure(p1: PMusic_Emu; func: gme_user_cleanup_t); cdecl;
  178.  
  179. procedure LoadLib(const aLibName: string);
  180.  
  181. implementation
  182.  
  183. uses
  184.   sysutils, dynlibs;
  185.  
  186. var
  187.   gme_handle: TLibHandle;
  188.  
  189.  
  190. procedure LoadLib(const aLibName: string);
  191. var LibName : string = '';
  192. begin
  193.   if FileExists('.' + PathDelim + aLibName)
  194.    then LibName := '.' + PathDelim + aLibName
  195.     else
  196.      if FileExists('lib' + PathDelim + aLibName)
  197.       then LibName := 'lib' + PathDelim + aLibName;
  198.  
  199.   if libName = ''
  200.     then libName := aLibName;
  201.  
  202.   gme_handle := LoadLibrary(PChar(LibName));
  203.  
  204.   if gme_handle = 0
  205.     then raise Exception.Create(Format('Could not load library: %s',[LibName]));
  206.  
  207.   //******** Basic operations ********/
  208.   pointer(gme_open_file)                   := GetProcAddress(gme_handle, 'gme_open_file');
  209.   pointer(gme_track_count)                 := GetProcAddress(gme_handle, 'gme_track_count');
  210.   pointer(gme_start_track)                 := GetProcAddress(gme_handle, 'gme_start_track');
  211.   pointer(gme_play)                        := GetProcAddress(gme_handle, 'gme_play');
  212.   pointer(gme_delete)                      := GetProcAddress(gme_handle, 'gme_delete');
  213.   //******** Track position/length ********/
  214.   pointer(gme_set_fade)                    := GetProcAddress(gme_handle, 'gme_set_fade');
  215.   pointer(gme_set_autoload_playback_limit) := GetProcAddress(gme_handle, 'gme_set_autoload_playback_limit');
  216.   pointer(gme_autoload_playback_limit)     := GetProcAddress(gme_handle, 'gme_autoload_playback_limit');
  217.   pointer(gme_track_ended)                 := GetProcAddress(gme_handle, 'gme_track_ended');
  218.   pointer(gme_tell)                        := GetProcAddress(gme_handle, 'gme_tell');
  219.   pointer(gme_tell_samples)                := GetProcAddress(gme_handle, 'gme_tell_samples');
  220.   pointer(gme_seek)                        := GetProcAddress(gme_handle, 'gme_seek');
  221.   pointer(gme_seek_samples)                := GetProcAddress(gme_handle, 'gme_seek_samples');
  222.   //******** Informational ********/
  223.   pointer(gme_warning)                     := GetProcAddress(gme_handle, 'gme_warning');
  224.   pointer(gme_load_m3u)                    := GetProcAddress(gme_handle, 'gme_load_m3u');
  225.   pointer(gme_clear_playlist)              := GetProcAddress(gme_handle, 'gme_clear_playlist');
  226.   pointer(gme_track_info)                  := GetProcAddress(gme_handle, 'gme_track_info');
  227.   pointer(gme_free_info)                   := GetProcAddress(gme_handle, 'gme_free_info');
  228.   //******** Advanced playback ********/
  229.   pointer(gme_set_stereo_depth)            := GetprocAddress(gme_handle, 'gme_set_stereo_depth');
  230.   pointer(gme_ignore_silence)              := GetprocAddress(gme_handle, 'gme_ignore_silence');
  231.   pointer(gme_set_tempo)                   := GetprocAddress(gme_handle, 'gme_set_tempo');
  232.   pointer(gme_voice_count)                 := GetprocAddress(gme_handle, 'gme_voice_count');
  233.   pointer(gme_voice_name)                  := GetprocAddress(gme_handle, 'gme_voice_name');
  234.   pointer(gme_mute_voice)                  := GetprocAddress(gme_handle, 'gme_mute_voice');
  235.   pointer(gme_mute_voices)                 := GetprocAddress(gme_handle, 'gme_mute_voices');
  236.   pointer(gme_equalizer)                   := GetprocAddress(gme_handle, 'gme_equalizer');
  237.   pointer(gme_set_equalizer)               := GetprocAddress(gme_handle, 'gme_set_equalizer');
  238.   pointer(gme_enable_accuracy)             := GetprocAddress(gme_handle, 'gme_enable_accuracy');
  239.   //******** Game music types ********/
  240.   pointer(gme_type)                        := GetProcAddress(gme_handle, 'gme_type');
  241.   pointer(gme_type_list)                   := GetProcAddress(gme_handle, 'gme_type_list');
  242.   pointer(gme_type_system)                 := GetProcAddress(gme_handle, 'gme_type_system');
  243.   pointer(gme_type_multitrack)             := GetProcAddress(gme_handle, 'gme_type_multitrack');
  244.   pointer(gme_multi_channel)               := GetProcAddress(gme_handle, 'gme_multi_channel');
  245.   //******** Advanced file loading ********/
  246.   pointer(gme_open_data)                   := GetProcAddress(gme_handle, 'gme_open_data');
  247.   pointer(gme_identify_header)             := GetProcAddress(gme_handle, 'gme_identify_header');
  248.   pointer(gme_identify_extension)          := GetProcAddress(gme_handle, 'gme_identify_extension');
  249.   pointer(gme_type_extension)              := GetProcAddress(gme_handle, 'gme_type_extension');
  250.   pointer(gme_identify_file)               := GetProcAddress(gme_handle, 'gme_identify_file');
  251.   pointer(gme_new_emu)                     := GetProcAddress(gme_handle, 'gme_new_emu');
  252.   pointer(gme_new_emu_multi_channel)       := GetProcAddress(gme_handle, 'gme_new_emu_multi_channel');
  253.   pointer(gme_load_file)                   := GetProcAddress(gme_handle, 'gme_load_file');
  254.   pointer(gme_load_data)                   := GetProcAddress(gme_handle, 'gme_load_data');
  255.   pointer(gme_load_custom)                 := GetProcAddress(gme_handle, 'gme_load_custom');
  256.   pointer(gme_load_m3u_data)               := GetProcAddress(gme_handle, 'gme_load_m3u_data');
  257.   //******** User data ********/
  258.   pointer(gme_set_user_data)               := GetProcAddress(gme_handle, 'gme_set_user_data');
  259.   pointer(gme_user_data)                   := GetProcAddress(gme_handle, 'gme_user_data');
  260.   pointer(gme_set_user_cleanup)            := GetProcAddress(gme_handle, 'gme_set_user_cleanup');
  261. end;
  262.  
  263. end.
  264.  
  265.  
« Last Edit: December 07, 2024, 05:00:01 am by Guva »

TRon

  • Hero Member
  • *****
  • Posts: 3763
Re: Game Music Emulator
« Reply #17 on: December 09, 2024, 01:23:56 am »
In the latest version of GME, something broke with the Naked emulator.
When I initially read this, I thought to myself "what the h*ll is this talk about, it works just fine here".

That was until I realized that my library loading routine had a small typo and I forgot that I installed libgme using my package manager (which includes an updated libgme) :-[

Therefor thank you Guva very much for mentioning the issue and providing a fix/workaround for it as well 👍
« Last Edit: December 09, 2024, 02:11:27 am by TRon »
I do not have to remember anything anymore thanks to total-recall.

 

TinyPortal © 2005-2018