⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 midi.inc

📁 著名的游戏开发库Allegro4.2.0 for DELPHI
💻 INC
字号:
{*         ______   ___    ___
 *        /\  _  \ /\_ \  /\_ \
 *        \ \ \L\ \\//\ \ \//\ \      __     __   _ __   ___
 *         \ \  __ \ \ \ \  \ \ \   /'__`\ /'_ `\/\`'__\/ __`\
 *          \ \ \/\ \ \_\ \_ \_\ \_/\  __//\ \L\ \ \ \//\ \L\ \
 *           \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/
 *            \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/
 *                                           /\____/
 *                                           \_/__/
 *
 *      MIDI music routines.
 *
 *      By Shawn Hargreaves.
 *
 *      See readme.txt for copyright information.
 *}
{$IFDEF ALLEGRO_INTERFACE}
const
                                       // Theoretical maximums:
  MIDI_VOICES          = 64;           // actual drivers may not be
  MIDI_TRACKS          = 32;           // able to handle this many

type
  P_MIDI = ^MIDI;
  MIDI = record                        // a midi file
    divisions: sint32;                 // number of ticks per quarter note
    track: array[0..MIDI_TRACKS - 1] of record
      data: p_uint8s;                  // MIDI message stream
      len: sint32;                     // length of the track data
    end;
  end;

const
  MIDI_AUTODETECT      = -1;
  MIDI_NONE            = 0;
  MIDI_DIGMID          = (ord ('D') shl 24) + (ord ('I') shl 16) + (ord ('G') shl 8) + ord ('I');

type
  P_MIDI_DRIVER = ^MIDI_DRIVER;
  MIDI_DRIVER = record                 // driver for playing midi music
    id             : sint32;           // driver ID code
    name           : PChar;            // driver name
    desc           : PChar;            // description string
    ascii_name     : PChar;            // ASCII format name string
    voices         : sint32;           // available voices
    basevoice      : sint32;           // voice number offset
    max_voices     : sint32;           // maximum voices we can support
    def_voices     : sint32;           // default number of voices to use
    xmin, xmax     : sint32;           // reserved voice range 

    // setup routines
    detect         : function(input: sint32): sint32; cdecl;
    init           : function(input, voices: sint32): sint32; cdecl;
    exit           : procedure(input: sint32); cdecl;
    mixer_volume   : function(volume: sint32): sint32; cdecl;

    // raw MIDI output to MPU-401, etc.
    raw_midi       : procedure(data: sint32); cdecl;

    // dynamic patch loading routines
    load_patches   : function(const patches, drums: PChar): sint32; cdecl;
    adjust_patches : procedure(const patches, drums: PChar); cdecl;

    // note control functions
    key_on         : procedure(inst, note, bend, vol, pan: sint32); cdecl;
    key_off        : procedure(voice: sint32); cdecl;
    set_volume     : procedure(voice, vol: sint32); cdecl;
    set_pitch      : procedure(voice, note, bend: sint32); cdecl;
    set_pan        : procedure(voice, pan: sint32); cdecl;
    set_vibrato    : procedure(voice, amount: sint32); cdecl;
  end;

type
  midi_msg_ptr = procedure(msg, byte1, byte2: sint32); cdecl;
  midi_meta_ptr = procedure(types: sint32; const data: p_uint8s; length: sint32); cdecl;
  midi_sysex_ptr = procedure(const data: p_uint8s; length: sint32); cdecl;

  midi_recorder_ptr = procedure(data: uint8); cdecl;

var
  the_midi_digmid: P_MIDI_DRIVER;
  _midi_driver_list: P_DRIVER_INFO;

  the_midi_driver: ^P_MIDI_DRIVER;
  midi_input_driver: ^P_MIDI_DRIVER;

  midi_card: p_sint32;
  midi_input_card: p_sint32;

threadvar
  midi_pos: p_sint32;                  // current position in the midi file, in beats
  midi_time: p_sint32;                 // current position in the midi file, in seconds

var
  midi_loop_start: p_sint32;           // where to loop back to at EOF
  midi_loop_end: p_sint32;             // loop when we hit this position

  detect_midi_driver: function(driver_id: sint32): sint32; cdecl;

  load_midi: function(const filename: PChar): P_MIDI; cdecl;
  destroy_midi: procedure(midi: P_MIDI); cdecl;
  play_midi: function(midi: P_MIDI; loop: sint32): sint32; cdecl;
  play_looped_midi: function(midi: P_MIDI; loop_start, loop_end: sint32): sint32; cdecl;
  stop_midi: procedure; cdecl;
  midi_pause: procedure; cdecl;
  midi_resume: procedure; cdecl;
  midi_seek: function(target: sint32): sint32; cdecl;
  get_midi_length: function(midi: P_MIDI): sint32; cdecl;
  midi_out: procedure(data: p_uint8s; length: sint32); cdecl;
  load_midi_patches: function: sint32; cdecl;

  midi_msg_callback: ^midi_msg_ptr;
  midi_meta_callback: ^midi_meta_ptr;
  midi_sysex_callback: ^midi_sysex_ptr;

  midi_recorder: ^midi_recorder_ptr;

  lock_midi: procedure(midi: P_MIDI); cdecl;
{$ENDIF ALLEGRO_INTERFACE}
{$IFDEF ALLEGRO_IMPLEMENTATION}
{$ENDIF ALLEGRO_IMPLEMENTATION}
{$IFDEF ALLEGRO_LOADVARIABLE}
  the_midi_digmid    := LoadDLL('midi_digmid');
  _midi_driver_list  := LoadDLL('_midi_driver_list');
  the_midi_driver    := LoadDLL('midi_driver');
  midi_input_driver  := LoadDLL('midi_input_driver');
  midi_card          := LoadDLL('midi_card');
  midi_input_card    := LoadDLL('midi_input_card');
  midi_pos           := LoadDLL('midi_pos');
  midi_time          := LoadDLL('midi_time');
  midi_loop_start    := LoadDLL('midi_loop_start');
  midi_loop_end      := LoadDLL('midi_loop_end');
  detect_midi_driver := LoadDLL('detect_midi_driver');
  load_midi          := LoadDLL('load_midi');
  destroy_midi       := LoadDLL('destroy_midi');
  play_midi          := LoadDLL('play_midi');
  play_looped_midi   := LoadDLL('play_looped_midi');
  stop_midi          := LoadDLL('stop_midi');
  midi_pause         := LoadDLL('midi_pause');
  midi_resume        := LoaddLL('midi_resume');
  midi_seek          := LoadDLL('midi_seek');
  get_midi_length    := LoadDLL('get_midi_length');
  midi_out           := LoadDLL('midi_out');
  load_midi_patches  := LoadDLL('load_midi_patches');
  midi_msg_callback  := LoadDLL('midi_msg_callback');
  midi_meta_callback := LoadDLL('midi_meta_callback');
  midi_sysex_callback:= LoadDLL('midi_sysex_callback');
  midi_recorder      := LoadDLL('midi_recorder');
  lock_midi          := LoadDLL('lock_midi');
{$ENDIF ALLEGRO_LOADVARIABLE}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -