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

📄 wrdt.c

📁 MIDI解码程序(用VC编写)
💻 C
字号:
/*    TiMidity++ -- MIDI to WAVE converter and player    Copyright (C) 1999-2002 Masanao Izumo <mo@goice.co.jp>    Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi>    This program is free software; you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation; either version 2 of the License, or    (at your option) any later version.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.    You should have received a copy of the GNU General Public License    along with this program; if not, write to the Free Software    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*/#ifdef HAVE_CONFIG_H#include "config.h"#endif /* HAVE_CONFIG_H */#include <stdio.h>#ifndef NO_STRING_H#include <string.h>#else#include <strings.h>#endif#include "timidity.h"#include "common.h"#include "wrd.h"#include "strtab.h"#include "instrum.h"#include "playmidi.h"#include "readmidi.h"#include "arc.h"#include "interface.h"/* * Remap WRD @COLOR(16)-@COLOR(23) to RGB plain number. * Usage: rgb = wrd_color_remap[color-16]; * * R G B * 1 2 4 */int wrd_color_remap[8] ={    0, /* 16 secret?, I don't know this code meaning. */    1, /* 17 red */    4, /* 18 blue */    5, /* 19 magenta */    2, /* 20 green */    3, /* 21 yellow */    6, /* 22 cyan */    7  /* 23 white */};/* Map RGB plane from MIMPI plane. * * {0,1,2,3,4,5,6,7} -- No conversion * {0,4,1,5,2,6,3,7} -- BRG to RGB * {0,1,4,5,2,3,6,7} -- GRB to RGB */int wrd_plane_remap[8] = {0,1,2,3,4,5,6,7};extern WRDTracer dumb_wrdt_mode;#ifdef __MACOS__extern WRDTracer mac_wrdt_mode;#endif/*ARGSUSED*/static int null_wrdt_open(char *wrdt_opts) { return 0; }/*ARGSUSED*/static void null_wrdt_apply(int cmd, int argc, int args[]) { }static void null_wrdt_update_events(void) { }static void null_wrdt_end(void) { }static void null_wrdt_close(void) { }WRDTracer null_wrdt_mode ={    "No WRD trace", '-',    0,    null_wrdt_open,    null_wrdt_apply,    NULL,    null_wrdt_update_events,    NULL,    null_wrdt_end,    null_wrdt_close};extern WRDTracer tty_wrdt_mode;#ifdef WRDT_Xextern WRDTracer x_wrdt_mode;#endif /* WRDT_X */#if defined(__W32__) && !defined(__BORLANDC__) && !defined(IA_W32GUI) && !defined(IA_W32G_SYN)extern WRDTracer wcon_wrdt_mode; /* wrdt_wcon.c */#endif /* __W32__ */#if defined(__W32__) && defined(IA_W32GUI)extern WRDTracer w32g_wrdt_mode; /* wrdt_w32g.c */#endif /* __W32__ */#if defined(__W32__) && defined(IA_W32G_SYN)extern WRDTracer null_wrdt_mode;#endif /* __W32__ */WRDTracer *wrdt_list[] ={#ifdef WRDT_X    &x_wrdt_mode,#endif /* WRDT_X */#if defined(__W32__) && !defined(__BORLANDC__) && !defined(IA_W32GUI) && !defined(IA_W32G_SYN)	&wcon_wrdt_mode,#endif /* __W32__ */#if defined(__W32__) && defined(IA_W32GUI)	&w32g_wrdt_mode,#endif /* __W32__ */#ifndef __MACOS__    &tty_wrdt_mode,#endif /* __MACOS__ */#ifdef __MACOS__    &mac_wrdt_mode,#endif    &dumb_wrdt_mode,    &null_wrdt_mode,    0};WRDTracer *wrdt = &null_wrdt_mode;static StringTable path_list;static StringTable default_path_list;static int wrd_add_path_one(char *path, int pathlen);void wrd_init_path(void){    StringTableNode *p;    delete_string_table(&path_list);    for(p = default_path_list.head; p; p = p->next)	wrd_add_path_one(p->string, strlen(p->string));    if(current_file_info)    {	if(strchr(current_file_info->filename, '#') != NULL)	    wrd_add_path_one(current_file_info->filename,			     strchr(current_file_info->filename, '#') -			     current_file_info->filename + 1);	if(pathsep_strrchr(current_file_info->filename) != NULL)	    wrd_add_path_one(current_file_info->filename,			     pathsep_strrchr(current_file_info->filename) -			     current_file_info->filename + 1);    }}static int wrd_add_path_one(char *path, int pathlen){    int exists;    StringTableNode *p;    exists = 0;    for(p = path_list.head; p; p = p->next)	if(strncmp(p->string, path, pathlen) == 0 &&	   p->string[pathlen] == '\0')	{	    exists = 1;	    break;	}    if(exists)	return 0;    put_string_table(&path_list, path, pathlen);    return 1;}void wrd_add_path(char *path, int pathlen){    if(pathlen == 0)	pathlen = strlen(path);    if(!wrd_add_path_one(path, pathlen))	return;    if(current_file_info &&       get_archive_type(current_file_info->filename) != -1)    {	MBlockList buf;	char *arc_path;	int baselen;	init_mblock(&buf);	baselen = strrchr(current_file_info->filename, '#') -	    current_file_info->filename + 1;	arc_path = new_segment(&buf, baselen + pathlen + 1);	strncpy(arc_path, current_file_info->filename, baselen);	strncpy(arc_path + baselen, path, pathlen);	arc_path[baselen + pathlen] = '\0';	put_string_table(&path_list, arc_path, strlen(arc_path));	reuse_mblock(&buf);    }}void wrd_add_default_path(char *path){    put_string_table(&default_path_list, path, strlen(path));}static struct timidity_file *try_wrd_open_file(char *prefix, char *fn){    MBlockList buf;    char *path;    int len1, len2;    struct timidity_file *tf;    init_mblock(&buf);    len1 = strlen(prefix);    len2 = strlen(fn);    path = (char *)new_segment(&buf, len1 + len2 + 2);    strcpy(path, prefix);    if( len1>0 && path[len1 - 1] != '#' && !IS_PATH_SEP(path[len1 - 1]))    {	path[len1++] = PATH_SEP;	path[len1] = '\0';    }    strcat(path, fn);    tf = open_file(path, 0, OF_SILENT);    reuse_mblock(&buf);    return tf;}#define CUR_DIR_PATH ""struct timidity_file *wrd_open_file(char *filename){    StringTableNode *path;    struct timidity_file *tf;    if(get_archive_type(filename) != -1)	return open_file(filename, 0, OF_SILENT);    for(path = path_list.head; path; path = path->next){	if((tf = try_wrd_open_file(path->string, filename)) != NULL)	    return tf;    }    return try_wrd_open_file(CUR_DIR_PATH, filename);}void wrd_midi_event(int cmd, int arg){    static int wrd_argc = 0;    static int wrd_args[WRD_MAXPARAM];    if(!wrdt->opened) /* Ignore any WRD command if WRD is closed */	return;    if(cmd == -1)    {	wrd_argc = 0;	return;    }    wrd_args[wrd_argc++] = arg;    if(cmd != WRD_ARG)    {	wrdt->apply(cmd, wrd_argc, wrd_args);	wrd_argc = 0;    }}void wrd_sherry_event(int addr){    if(!wrdt->opened || wrdt->sherry == NULL)	return;    wrdt->sherry(datapacket[addr].data, datapacket[addr].len);}

⌨️ 快捷键说明

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