📄 w32g_subwin3.c
字号:
rc.right = (rc.right - rc.left) - (rc2.right - rc2.left) + w32g_tracer_wnd.width; rc.bottom = (rc.bottom - rc.top) - (rc2.bottom - rc2.top) + w32g_tracer_wnd.height; MoveWindow ( hTracerWnd, rc.left, rc.top, rc.right, rc.bottom, TRUE); MoveWindow(w32g_tracer_wnd.hwnd,0,0,w32g_tracer_wnd.width,w32g_tracer_wnd.height,TRUE); ShowWindow(w32g_tracer_wnd.hwnd,SW_SHOW); UpdateWindow(w32g_tracer_wnd.hwnd); UpdateWindow(hTracerWnd); INILoadTracerWnd(); TracerWndInfoApply();}static int notes_view_generate ( int lockflag ){ int i; if ( lockflag ) TRACER_LOCK (); for(i=0;i<12;i++) { BitBlt ( tracer_bmp.hmdc, tracer_bmp.rc_note[i].left, tracer_bmp.rc_note[i].top, tracer_bmp.rc_note[i].right - tracer_bmp.rc_note[i].left, tracer_bmp.rc_note[i].bottom - tracer_bmp.rc_note[i].top, tracer_bmp.hmdc, tracer_bmp.rc_notes_mask[i].left, tracer_bmp.rc_notes_mask[i].top, SRCINVERT ); BitBlt ( tracer_bmp.hmdc, tracer_bmp.rc_note[i].left, tracer_bmp.rc_note[i].top, tracer_bmp.rc_note[i].right - tracer_bmp.rc_note[i].left, tracer_bmp.rc_note[i].bottom - tracer_bmp.rc_note[i].top, tracer_bmp.hmdc, tracer_bmp.rc_notes.left, tracer_bmp.rc_notes.top, SRCPAINT ); BitBlt ( tracer_bmp.hmdc, tracer_bmp.rc_note_on[i].left, tracer_bmp.rc_note_on[i].top, tracer_bmp.rc_note_on[i].right - tracer_bmp.rc_note_on[i].left, tracer_bmp.rc_note_on[i].bottom - tracer_bmp.rc_note_on[i].top, tracer_bmp.hmdc, tracer_bmp.rc_notes_mask[i].left, tracer_bmp.rc_notes_mask[i].top, SRCINVERT ); BitBlt ( tracer_bmp.hmdc, tracer_bmp.rc_note_on[i].left, tracer_bmp.rc_note_on[i].top, tracer_bmp.rc_note_on[i].right - tracer_bmp.rc_note_on[i].left, tracer_bmp.rc_note_on[i].bottom - tracer_bmp.rc_note_on[i].top, tracer_bmp.hmdc, tracer_bmp.rc_notes_on.left, tracer_bmp.rc_notes_on.top, SRCPAINT ); BitBlt ( tracer_bmp.hmdc, tracer_bmp.rc_note_sustain[i].left, tracer_bmp.rc_note_sustain[i].top, tracer_bmp.rc_note_sustain[i].right - tracer_bmp.rc_note_sustain[i].left, tracer_bmp.rc_note_sustain[i].bottom - tracer_bmp.rc_note_sustain[i].top, tracer_bmp.hmdc, tracer_bmp.rc_notes_mask[i].left, tracer_bmp.rc_notes_mask[i].top, SRCINVERT ); BitBlt ( tracer_bmp.hmdc, tracer_bmp.rc_note_sustain[i].left, tracer_bmp.rc_note_sustain[i].top, tracer_bmp.rc_note_sustain[i].right - tracer_bmp.rc_note_sustain[i].left, tracer_bmp.rc_note_sustain[i].bottom - tracer_bmp.rc_note_sustain[i].top, tracer_bmp.hmdc, tracer_bmp.rc_notes_sustain.left, tracer_bmp.rc_notes_sustain.top, SRCPAINT ); } if ( lockflag ) TRACER_UNLOCK (); return 0;}#define TRACER_BMP_SIZE_X 316#define TRACER_BMP_SIZE_Y 269#define TRACER_CANVAS_SIZE_X 316#define TRACER_CANVAS_SIZE_Y 451static int init_tracer_bmp ( HDC hdc ){ int i, j; static int init = 1; HBITMAP hbmp; HDC hmdc; if ( init ) { tracer_bmp.hbmp = NULL; tracer_bmp.hmdc = NULL; init = 0; } TRACER_LOCK (); if ( tracer_bmp.hmdc != NULL ) DeleteDC ( tracer_bmp.hmdc ); if ( tracer_bmp.hbmp != NULL ) DeleteObject ( (HGDIOBJ) tracer_bmp.hbmp ); tracer_bmp.hbmp = CreateCompatibleBitmap ( hdc, TRACER_CANVAS_SIZE_X, TRACER_CANVAS_SIZE_Y ); tracer_bmp.hmdc = CreateCompatibleDC ( hdc ); SelectObject ( tracer_bmp.hmdc, w32g_tracer_wnd.hNullBrush ); /* 昁梫側偄偐傕偟傟側偄偑 */ SelectObject ( tracer_bmp.hmdc, w32g_tracer_wnd.hNullPen ); /* 昁梫側偄偐傕偟傟側偄偑 */ SelectObject ( tracer_bmp.hmdc, tracer_bmp.hbmp ); hbmp = LoadBitmap ( hInst, MAKEINTRESOURCE(IDB_BITMAP_TRACER) ); hmdc = CreateCompatibleDC ( hdc ); SelectObject ( hmdc, hbmp ); BitBlt ( tracer_bmp.hmdc, 0, 0, TRACER_CANVAS_SIZE_X, TRACER_CANVAS_SIZE_Y, hmdc, 0, 0, WHITENESS ); BitBlt ( tracer_bmp.hmdc, 0, 0, TRACER_BMP_SIZE_X, TRACER_BMP_SIZE_Y, hmdc, 0, 0, SRCCOPY ); DeleteDC(hmdc); DeleteObject(hbmp); TRACER_UNLOCK (); SetRect ( &tracer_bmp.rc_volume, 8, 16, 28, 195 ); SetRect ( &tracer_bmp.rc_expression, 32, 16, 52, 195 ); SetRect ( &tracer_bmp.rc_pan, 56, 16, 76, 195 ); SetRect ( &tracer_bmp.rc_sustain, 80, 16, 100, 195 ); SetRect ( &tracer_bmp.rc_pitch_bend, 104, 16, 124, 195 ); SetRect ( &tracer_bmp.rc_mod_wheel, 128, 16, 148, 195 ); SetRect ( &tracer_bmp.rc_chorus_effect, 152, 16, 172, 195 ); SetRect ( &tracer_bmp.rc_reverb_effect, 176, 16, 196, 195 ); SetRect ( &tracer_bmp.rc_velocity[0], 200, 16, 230, 215 ); SetRect ( &tracer_bmp.rc_velocity[1], 231, 16, 261, 215 ); SetRect ( &tracer_bmp.rc_notes, 16, 59, 58, 78 ); SetRect ( &tracer_bmp.rc_notes_sustain, 202, 59, 244, 78 ); SetRect ( &tracer_bmp.rc_notes_on, 156, 59, 198, 78 ); for(i=0;i<6;i++) { SetRect ( &tracer_bmp.rc_notes_mask[i], 16 + i * 46, 107, 58 + i * 46, 126); SetRect ( &tracer_bmp.rc_note[i], 16 + i * 46, 271, 58 + i * 46, 290); SetRect ( &tracer_bmp.rc_note_on[i], 16 + i * 46, 319, 58 + i * 46, 338); SetRect ( &tracer_bmp.rc_note_sustain[i], 16 + i * 46, 367, 58 + i * 46, 386); } for(i=0;i<6;i++) { SetRect ( &tracer_bmp.rc_notes_mask[i + 6], 16 + i * 46, 131, 58 + i * 46, 150); SetRect ( &tracer_bmp.rc_note[i + 6], 16 + i * 46, 295, 58 + i * 46, 314); SetRect ( &tracer_bmp.rc_note_on[i + 6], 16 + i * 46, 343, 58 + i * 46, 362); SetRect ( &tracer_bmp.rc_note_sustain[i + 6], 16 + i * 46, 391, 58 + i * 46, 410); } notes_view_generate(TRUE); SetRect ( &tracer_bmp.rc_gm_on, 64, 59, 88, 78 ); SetRect ( &tracer_bmp.rc_gm_off, 64, 83, 88, 102 ); SetRect ( &tracer_bmp.rc_gs_on, 96, 59, 120, 78 ); SetRect ( &tracer_bmp.rc_gs_off, 96, 83, 120, 102 ); SetRect ( &tracer_bmp.rc_xg_on, 128, 59, 152, 78 ); SetRect ( &tracer_bmp.rc_xg_off, 128, 83, 152, 102 ); for (i = 0; i < 4; i++) for (j = 0; j < 8; j++) SetRect(&tracer_bmp.rc_temper_keysig[i * 8 + j], 16 + j * 37, 155 + i * 23, 49 + j * 37, 174 + i * 23); for (i = 0; i < 8; i++) SetRect(&tracer_bmp.rc_temper_type[i], 16 + i * 23, 247, 35 + i * 23, 266); return 0;}void TracerWndReset(void){ int i, j; strcpy ( w32g_tracer_wnd.titlename, "" ); strcpy ( w32g_tracer_wnd.filename, "" );#if 0 sprintf ( w32g_tracer_wnd.current_time, "00:00:00" ); w32g_tracer_wnd.current_time_sec = 0; w32g_tracer_wnd.tempo = 0; w32g_tracer_wnd.master_volume = 0; w32g_tracer_wnd.maxvoices = 0;#endif for ( i = 0; i < TRACER_CHANNELS; i ++ ) { strcpy ( w32g_tracer_wnd.instrument[i]," ----" ); w32g_tracer_wnd.mapID[i] = INST_NO_MAP; w32g_tracer_wnd.bank[i] = 0; w32g_tracer_wnd.program[i] = 0; w32g_tracer_wnd.velocity[i] = 0; w32g_tracer_wnd.volume[i] = 0; w32g_tracer_wnd.expression[i] = 0; w32g_tracer_wnd.panning[i] = 64; w32g_tracer_wnd.sustain[i] = 0; w32g_tracer_wnd.pitch_bend[i] = 0x2000; w32g_tracer_wnd.mod_wheel[i] = 0; w32g_tracer_wnd.chorus_effect[i] = 0; w32g_tracer_wnd.reverb_effect[i] = 0; w32g_tracer_wnd.tt[i] = 0; for ( j = 0; j < 256; j ++ ) { w32g_tracer_wnd.notes[i][j] = -1; } } w32g_tracer_wnd.play_system_mode = play_system_mode; w32g_tracer_wnd.quietchannels = quietchannels; w32g_tracer_wnd.channel_mute = channel_mute; InvalidateRect(w32g_tracer_wnd.hwnd,NULL, FALSE);}void TracerWndReset2(void){ int i, j; for ( i = 0; i < TRACER_CHANNELS; i ++ ) { w32g_tracer_wnd.velocity[i] = 0; for ( j = 0; j < 128; j ++ ) { w32g_tracer_wnd.notes[i][j] = -1; } } TRACER_LOCK(); for ( i = 0; i < TRACER_CHANNELS; i ++ ) { for ( j = 0; j < 128; j ++ ) { RECT rc; if ( get_ch_rc ( i, &rc, &w32g_tracer_wnd.rc_notes ) == 0 ) notes_view_draw ( &rc, j, w32g_tracer_wnd.notes[i][j], TRUE, FALSE ); } } TRACER_UNLOCK();}// 夋柺徚嫀void TracerWndClear(int lockflag){ HPEN hPen; HBRUSH hBrush; HGDIOBJ hgdiobj_hpen, hgdiobj_hbrush; RECT rc; if ( lockflag ) TRACER_LOCK(); hPen = CreatePen(PS_SOLID,1,C_BACK); hBrush = CreateSolidBrush(C_BACK); hgdiobj_hpen = SelectObject(w32g_tracer_wnd.hmdc, hPen); hgdiobj_hbrush = SelectObject(w32g_tracer_wnd.hmdc, hBrush); GetClientRect(w32g_tracer_wnd.hwnd,&rc); Rectangle(w32g_tracer_wnd.hmdc,rc.left,rc.top,rc.right,rc.bottom); InvalidateRect( w32g_tracer_wnd.hwnd, NULL, FALSE ); SelectObject(w32g_tracer_wnd.hmdc, hgdiobj_hpen); DeleteObject(hPen); SelectObject(w32g_tracer_wnd.hmdc, hgdiobj_hbrush); DeleteObject(hBrush); if ( lockflag ) TRACER_UNLOCK();}#define TRACER_VOICE_OFF -1#define TRACER_VOICE_SUSTAINED -2void w32_tracer_ctl_event(CtlEvent *e){ RECT rc; int v1, v2; switch ( e->type ) { case CTLE_NOW_LOADING: { char * title; TracerWndReset (); TracerWndPaintAll (TRUE); strncpy ( w32g_tracer_wnd.filename, (char *)e->v1, 1000 ); w32g_tracer_wnd.filename[1000] = '\0'; title = get_midi_title(w32g_tracer_wnd.filename); if ( title == NULL ) title = w32g_tracer_wnd.filename; strcpy ( w32g_tracer_wnd.titlename, " " ); strncat ( w32g_tracer_wnd.titlename, title, 1000 ); w32g_tracer_wnd.titlename[1000] = '\0'; get_head_rc ( &rc, &w32g_tracer_wnd.rc_head_rest ); cheap_string_view_draw ( &rc, w32g_tracer_wnd.titlename, C_TEXT_FORE, C_TEXT_BACK, CSV_LEFT, TRUE ); } break; case CTLE_LOADING_DONE: break; case CTLE_PLAY_START:#if 0 { int i; for ( i = 0; i < TRACER_CHANNELS; i++ ) {// tracer_ch_program_draw ( i, -1, -1, (char *)-1, -1 ); w32g_tracer_wnd.volume[i] = channel[i].volume; w32g_tracer_wnd.expression[i] = channel[i].expression; w32g_tracer_wnd.panning[i] = channel[i].panning; w32g_tracer_wnd.sustain[i] = channel[i].sustain; w32g_tracer_wnd.pitch_bend[i] = channel[i].pitchbend; w32g_tracer_wnd.mod_wheel[i] = channel[i].mod.val; w32g_tracer_wnd.chorus_effect[i] = channel[i].chorus_level; w32g_tracer_wnd.reverb_effect[i] = channel[i].reverb_level; }#endif break; case CTLE_PLAY_END: break; case CTLE_TEMPO:#if 0 { char buff[64]; w32g_tracer_wnd.tempo = (int)e->v1; sprintf ( buff, "%08ld", w32g_tracer_wnd.current_time); cheap_string_view_draw ( &w32g_tracer_wnd.rc_tempo, buff, C_TEXT_FORE, C_TEXT_BACK, CSV_CENTER, TRUE ); }#endif break; case CTLE_METRONOME: break; case CTLE_CURRENT_TIME:#if 0 { int sec, min, hour; if(midi_trace.flush_flag) return; if(ctl->trace_playing) sec = (int)e->v1; else { sec = current_trace_samples(); if(sec < 0) sec = (int)e->v1; else sec = sec / play_mode->rate; } min = sec / 60; sec %= 60; hour = min / 60; min %= 60; sprintf ( w32g_tracer_wnd.current_time, "%02d:%02d:%02d", hour, min, sec ); w32g_tracer_wnd.current_time_sec = sec; cheap_string_view_draw ( &w32g_tracer_wnd.rc_current_time, w32g_tracer_wnd.current_time, C_TEXT_FORE, C_TEXT_BACK, CSV_CENTER, TRUE ); cheap_volume_view_draw ( &w32g_tracer_wnd.rc_maxvoices, (int)e->v2, voices, C_BAR_FORE, C_BAR_BACK, CVV_TYPE_LEFT, TRUE ); }#endif break; case CTLE_NOTE: { int vel = 0, vel_old = w32g_tracer_wnd.velocity[(int)e->v2]; switch ( (int)e->v1 ) { case VOICE_ON: w32g_tracer_wnd.velocity[(int)e->v2] += (int)e->v4; break; case VOICE_SUSTAINED: vel = TRACER_VOICE_SUSTAINED; break; case VOICE_DIE: case VOICE_FREE: case VOICE_OFF: w32g_tracer_wnd.velocity[(int)e->v2] -= (int)e->v4; vel = TRACER_VOICE_OFF; break; } if ( w32g_tracer_wnd.velocity[(int)e->v2] < 0 ) w32g_tracer_wnd.velocity[(int)e->v2] = 0; if ( get_ch_rc ( (int)e->v2, &rc, &w32g_tracer_wnd.rc_notes ) == 0 ) notes_view_draw ( &rc, (int)e->v3, vel, FALSE, TRUE ); w32g_tracer_wnd.notes[(int)e->v2][(int)e->v3] = vel; if ( get_ch_rc ( (int)e->v2, &rc, &w32g_tracer_wnd.rc_velocity ) == 0 ) tracer_velocity_draw_ex ( &rc, w32g_tracer_wnd.velocity[(int)e->v2], vel_old, VEL_MAX, TRUE ); } break; case CTLE_MASTER_VOLUME:// ctl_master_volume((int)e->v1);#if 0 w32g_tracer_wnd.master_volume = (int)e->v1; cheap_volume_view_draw ( &w32g_tracer_wnd.rc_master_volume, w32g_tracer_wnd.master_volume, 256, C_BAR_FORE, C_BAR_BACK, CVV_TYPE_LEFT, TRUE );#endif break; case CTLE_MUTE: tracer_ch_number_draw((int) e->v1, (int) e->v2, TRUE); break; case CTLE_PROGRAM: v1 = (int)e->v1; v2 = (int)e->v2; tracer_ch_program_draw ( v1, -1, v2, (char *)e->v3, -1, TRUE ); break; case CTLE_DRUMPART: break; case CTLE_VOLUME: v1 = (int)e->v1; v2 = (int)e->v2; if ( w32g_tracer_wnd.volume[v1] != v2 ) if ( get_ch_rc ( v1, &rc, &w32g_tracer_wnd.rc_volume ) == 0 ) tracer_volume_draw ( &rc, v2, 128, TRUE ); w32g_tracer_wnd.volume[v1] = v2; break; case CTLE_EXPRESSION: v1 = (int)e->v1; v2 = (int)e->v2; if ( w32g_tracer_wnd.expression[v1] != v2 ) if ( get_ch_rc ( v1, &rc, &w32g_tracer_wnd.rc_expression ) == 0 ) tracer_expression_draw ( &rc, v2, 128, TRUE ); w32g_tracer_wnd.expression[v1] = v2; break; case CTLE_PANNING: v1 = (int)e->v1; v2 = (int)e->v2; if ( w32g_tracer_wnd.panning[v1] != v2 ) if ( get_ch_rc ( v1, &rc, &w32g_tracer_wnd.rc_panning ) == 0 ) tracer_pan_draw ( &rc, v2, 128, TRUE ); w32g_tracer_wnd.panning[v1] = v2; break; case CTLE_SUSTAIN: v1 = (int)e->v1; v2 = (int)e->v2; if ( w32g_tracer_wnd.sustain[v1] != v2 ) if ( get_ch_rc ( v1, &rc, &w32g_tracer_wnd.rc_sustain ) == 0 ) tracer_sustain_draw ( &rc, v2, TRUE ); w32g_tracer_wnd.sustain[v1] = v2; break; case CTLE_PITCH_BEND: v1 = (int)e->v1; v2 = (int)e->v2; if ( w32g_tracer_wnd.pitch_bend[v1] != v2 ) if ( get_ch_rc ( v1, &rc, &w32g_tracer_wnd.rc_pitch_bend ) == 0 ) tracer_pitch_bend_draw ( &rc, v2, 0x4000, TRUE ); w32g_tracer_wnd.pitch_bend[v1] = v2; break; case CTLE_MOD_WHEEL: v1 = (int)e->v1; v2 = (int)e->v2; if ( w32g_tracer_wnd.mod_wheel[v1] != v2 ) if ( get_ch_rc ( v1, &rc, &w32g_tracer_wnd.rc_mod_wheel ) == 0 ) tracer_mod_wheel_draw ( &rc, v2, 32, TRUE ); w32g_tracer_wnd.mod_wheel[v1] = v2; break; case CTLE_CHORUS_EFFECT: v1 = (int)e->v1; v2 = (int)e->v2; if ( w32g_tracer_wnd.chorus_effect[v1] != v2 ) if ( get_ch_rc ( v1, &rc, &w32g_tracer_wnd.rc_chorus_effect ) == 0 ) tracer_chorus_effect_draw ( &rc, v2, 128, TRUE ); w32g_tracer_wnd.chorus_effect[v1] = v2; break; case CTLE_REVERB_EFFECT: v1 = (int)e->v1; v2 = (int)e->v2; if ( w32g_tracer_wnd.reverb_effect[v1] != v2 ) if ( get_ch_rc ( v1, &rc, &w32g_tracer_wnd.rc_reverb_effect ) == 0 ) tracer_reverb_effect_draw ( &rc, v2, 128, TRUE ); w32g_tracer_wnd.reverb_effect[v1] = v2; break; case CTLE_KEY_OFFSET: get_head_rc(&rc, &w32g_tracer_wnd.rc_temper_keysig); tracer_temper_keysig_draw(&rc, CTL_STATUS_UPDATE, (int) e->v1, TRUE); break; case CTLE_TEMPER_KEYSIG: get_head_rc(&rc, &w32g_tracer_wnd.rc_temper_keysig); tracer_temper_keysig_draw(&rc, (int8) e->v1, CTL_STATUS_UPDATE, TRUE); break; case CTLE_TEMPER_TYPE:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -