📄 midi.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 + -