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

📄 mac_trace.c

📁 linux上播放midi音乐,但是要一些设置.可网上查找. 软件名称: TiMidity++-2.13.0.tar
💻 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	Macintosh interface for TiMidity	by T.Nogami	<t-nogami@happy.email.ne.jp>		    mac_trace.c    Macintosh trace window*/// includs#ifdef HAVE_CONFIG_H#include "config.h"#endif /* HAVE_CONFIG_H */#include "string.h"#include "timidity.h"#include "common.h"#include "output.h"#include "controls.h"#include "instrum.h"#include "playmidi.h"#include "miditrace.h"#include "bitset.h"#include "mfnode.h"//#include "aq.h"#include "mac_main.h"#include "mac_util.h"#include "mac_c.h"// macros & const#define UPPER_MERGIN 40#define LEFT_MERGIN  130#define CHANNEL_HIGHT 12#define CHANNEL_WIDTH 4#define win mac_TraceWindow#define COLS 80const RGBColor	black={0,0,0};// globalstatic int selected_channel = -1;static int current_voices=0;static Bitset channel_program_flags[MAX_CHANNELS];static int scr_modified_flag = 1; /* delay flush for trace mode */static int display_velocity_flag = 0;static const char note_name_char[12] ={    'c', 'C', 'd', 'D', 'e', 'f', 'F', 'g', 'G', 'a', 'A', 'b'};// static functionstatic int open_TraceWin();static void click_TraceWin(Point local, short modifiers);static void update_TraceWin();static void goaway_TraceWin();static void close_TraceWin();static int	message_TraceWin(int message, long param);// ****************************************************static void init_trace_window_chan(int /*ch*/){	}static void DrawInstrumentName(int ch, char *comm){	char		buf[80];	RGBColor	black={0,0,0};	Rect		box;	SetPortWindowPort(win.ref);	RGBForeColor(&black);			//channel number	MoveTo(2, UPPER_MERGIN+CHANNEL_HIGHT*(ch+1)-1);	snprintf(buf, 80,"%2d", ch+1);	DrawText(buf, 0, strlen(buf));				//InstrumentName	box.top=UPPER_MERGIN+CHANNEL_HIGHT*ch;	box.left=20;	box.bottom=box.top+12;	box.right=LEFT_MERGIN-10;	if( !comm || !*comm )		EraseRect(&box);	else		TETextBox(comm, strlen(comm), &box, teFlushDefault);}static void mac_ctl_refresh_trc(){	int		i;	Rect	r;	RGBColor	black={0,0,0},				darkGray={0x2000,0x2000,0x2000};	if( !win.show ) return;	SetPortWindowPort(win.ref);	for( i=0; i<16; i++ ){		DrawInstrumentName(i, instr_comment[i].comm);	}	#define MAX_NOTE_NUM 120	r.top=		UPPER_MERGIN;	r.left=		LEFT_MERGIN;	r.bottom=	r.top+CHANNEL_HIGHT*16;	r.right=	r.left+CHANNEL_WIDTH*MAX_NOTE_NUM;	RGBForeColor(&darkGray);	PaintRect(&r);			//draw separater line	RGBForeColor(&black);	for(i=1; i<16; i++){	//horizontal		MoveTo(LEFT_MERGIN, UPPER_MERGIN+CHANNEL_HIGHT*i-1);		Line(CHANNEL_WIDTH*MAX_NOTE_NUM-1, 0);	}	for(i=12; i<MAX_NOTE_NUM; i+=12){	//vertical		MoveTo(LEFT_MERGIN+CHANNEL_WIDTH*i-1, UPPER_MERGIN);		Line(0, CHANNEL_HIGHT*16-1);	}}void mac_ctl_reset_trc(){	int i;	    for(i = 0; i < MAX_CHANNELS; i++)    {		instr_comment[i].last_note_on = 0.0;		instr_comment[i].comm =""; // channel_instrum_name(i);		clear_bitset(channel_program_flags + i, 0, 128);    }	SetPortWindowPort(win.ref);	TextMode(srcCopy);	TextSize(9);	mac_ctl_refresh_trc();	current_voices=0;}void mac_ctl_program(int ch, int val, void *comm){    int pr;    if(ch >= 16)	return;    if(!ctl->trace_playing)	return;    if(IS_CURRENT_MOD_FILE)		pr = val;    else		pr = val + progbase;    //if(ctl_ncurs_mode == NCURS_MODE_TRACE)    {		if(ch == selected_channel)			init_trace_window_chan(ch);		else		{			//wmove(dftwin, NOTE_LINE+ch, COLS-21);			if(ISDRUMCHANNEL(ch))			{				//wattron(dftwin, A_BOLD);				//wprintw(dftwin, " %03d", pr);				//wattroff(dftwin, A_BOLD);		    }		    else			//wprintw(dftwin, " %03d", pr);			;		}    }    //if(comm != NULL)	indicator_set_prog(ch, val, (char *)comm);    //scr_modified_flag = 1;	instr_comment[ch].last_note_on = 0.0;	instr_comment[ch].comm = channel_instrum_name(ch);	DrawInstrumentName(ch, instr_comment[ch].comm);}// ****************************************************#pragma mark -static void update_channel(int /*ch*/){	}static void update_filename(){	char	buf[256]="";	if( !mac_TraceWindow.show ) return;	SetPortWindowPort(win.ref);		if( mac_n_files>0 && nPlaying<=mac_n_files && fileList[nPlaying].mfn &&										fileList[nPlaying].mfn->file )		snprintf(buf, 256,"File: %s", fileList[nPlaying].mfn->file);	RGBForeColor(&black);	MoveTo(2,12); DrawText(buf, 0, strlen(buf));}static void update_title(){	char	buf[256]="";	if( !mac_TraceWindow.show ) return;	SetPortWindowPort(win.ref);	if( mac_n_files>0 && nPlaying<=mac_n_files && fileList[nPlaying].mfn &&										fileList[nPlaying].mfn->title )		snprintf(buf, 256, "Title: %s", fileList[nPlaying].mfn->title);	RGBForeColor(&black);	MoveTo(2,24); DrawText(buf, 0, strlen(buf));}void mac_trc_update_time( int cur_sec, int tot_sec ){	static int	save_tot_sec=0, save_cur_sec;	//int rate;	char		buf[80];		if( cur_sec!=-1 ) save_cur_sec=tot_sec;	if( tot_sec!=-1 ) save_tot_sec=tot_sec;	if( cur_sec==-1 ) cur_sec=0;	if( cur_sec > save_tot_sec ) cur_sec=save_tot_sec;		if( !win.show ) return;	//rate = (int)(aq_filled_ratio() * 100 + 0.5);	SetPortWindowPort(win.ref);	snprintf(buf, 80," %3d:%02d /%3d:%02d   " /*"buffering=%3d %% "*/ "buffer %d/256  ",		cur_sec/60, cur_sec%60, save_tot_sec/60,save_tot_sec%60,		/*rate,*/ mac_buf_using_num );	RGBForeColor(&black);	MoveTo(400,12); DrawText(buf, 0, strlen(buf));}void mac_trc_update_voices(){	char	buf[20];	static	int	prev=-1;	if( !mac_TraceWindow.show ) return;	SetPortWindowPort(win.ref);		snprintf(buf, 20, "Voice %3d/%3d   ", current_voices, voices);	RGBForeColor(&black);	MoveTo(450,24); DrawText(buf, 0, strlen(buf));}void mac_trc_update_all_info(){	Rect r;		SetPortWindowPort(win.ref);	SetRect(&r, 0,0, win.ref->portRect.right,UPPER_MERGIN);	EraseRect(&r);		mac_trc_update_voices();	update_filename();	update_title();	mac_trc_update_time(-1,-1);}// *****************************************************#pragma mark -MacWindow win={	0,	//WindowRef	open_TraceWin,	click_TraceWin,	update_TraceWin,	goaway_default,	close_default,	message_TraceWin,	0, 120,120};static int open_TraceWin()		/*success-> return 0;*/{	int		i;	open_window(&win, kTraceWinID);	position_window(&win);		mac_ctl_reset_trc();	for(i = 0; i < 16; i++)	    init_bitset(channel_program_flags + i, 128);	return 0;}static void click_TraceWin(Point /*local*/, short /*modifiers*/){}static void update_TraceWin(){	SetPortWindowPort(win.ref);	mac_ctl_refresh_trc();	mac_trc_update_all_info();}static int	message_TraceWin(int /*message*/, long /*param*/){	//Rect rect;		//switch(message){		//}	return -1;  //not supported}const RGBColor	vel_color[10]={					{0x0000, 0x0000, 0xFFFF},	//0:blue					{0x0000, 0xFFFF, 0x0000},	//6;green					{0x0000, 0x6666, 0xFFFF},	//1;					{0x0000, 0xFFFF, 0x6666},	//5;					{0x6666, 0xFFFF, 0x0000},	//7;					{0x0000, 0x9999, 0xFFFF},	//2;					{0x0000, 0xFFFF, 0x9999},	//4;					{0x9999, 0xFFFF, 0x0000},	//8;					{0x0000, 0xFFFF, 0xFFFF},	//3;					{0xFFFF, 0xFFFF, 0x0000},	//9;yellow				};#define DARKEN2(c) (c.red/=2,c.green/=2,c.blue/=2)#define DARKEN4(c) (c.red/=4,c.green/=4,c.blue/=4)static unsigned int UpdateNote(int status, int ch, int note, int vel){	//int	vel;	Rect r1,r2;    unsigned int onoff=0 /*, check, prev_check*/;	const RGBColor	dieColor=	{0x3000,0x3000,0x3000},	//dark gray					freeColor=	{0x3000,0x3000,0x3000},	//dark gray			onColor=	{0xffff,0xffff,0}, 	//yellow					sustainedColor={0x8000,0x8000,0},	//dark yellow			offColor=	{0x4000,0x4000,0},	//dark yellow			noColor=	{0x2000,0x2000,0x2000};	RGBColor	color;		vel=(10 * vel) / 128; /* 0-9 */	if( vel>9 ) vel=9;		r1.left=r2.left=	LEFT_MERGIN+CHANNEL_WIDTH* note;	r1.right=r2.right=	r1.left+CHANNEL_WIDTH-1;	r1.top=		UPPER_MERGIN+CHANNEL_HIGHT* ch;	r1.bottom= 	r1.top+(9-vel);	r2.top=		r1.bottom;	r2.bottom=	r1.top+CHANNEL_HIGHT-1;		SetPortWindowPort(win.ref);        color=vel_color[vel];    switch(status){	case VOICE_DIE:	 DARKEN2(color);  onoff = 1;	break;	case VOICE_FREE: color=freeColor; onoff = 0;	break;	case VOICE_SUSTAINED:DARKEN2(color); onoff = 1;	break;	case VOICE_OFF:	DARKEN4(color); onoff = 1;		break;	case VOICE_ON:			onoff = 1;		break;	default:	color= noColor; break;    }    RGBForeColor(&freeColor);    PaintRect(&r1);        RGBForeColor(&color);    PaintRect(&r2);    return onoff;}//void v_ctl_note(struct MidiTraceNote v)void v_ctl_note(int status, int ch, int note, int vel){    int xl, n, c;    unsigned int onoff=0, prev_onoff, check;    Bitset *bitset;	    if( !mac_TraceWindow.show || ch >= 16)	return;    if( /*ctl_ncurs_mode != NCURS_MODE_TRACE ||*/ selected_channel == ch)		return;    scr_modified_flag = 1;    if(display_velocity_flag)		n = '0' + (10 * vel) / 128;    else		n = note_name_char[note % 12];    c = (COLS - 24) / 12 * 12;    if(c <= 0)		c = 1;    xl=note % c;    if( note>=MAX_NOTE_NUM ) return;		onoff= UpdateNote( status, ch, note, vel);   //draw at first    bitset = channel_program_flags + ch;	get_bitset(bitset, &prev_onoff, note, 1);    onoff <<= (8 * sizeof(onoff) - 1);    set_bitset(bitset, &onoff, note, 1);    check = has_bitset(bitset);            	if( prev_onoff && !onoff ) current_voices--;	if( !prev_onoff && onoff ){		current_voices++;		mac_trc_update_voices();	}	}#undef win

⌨️ 快捷键说明

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