summaryrefslogtreecommitdiffstats
path: root/src/MusicalScoreFrame.h
blob: 907dcd563d460b2665b91a6921e77e5a2d5aee95 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
//******************************************************************************
// MIDIシーケンサーソフト『世界樹』
// 譜面フレームウィンドウクラス
// (C)2002-2013 おーぷんMIDIぷろじぇくと/くず
//******************************************************************************

/* This library is free software; you can redistribute it and/or */
/* modify it under the terms of the GNU Lesser General Public */
/* License as published by the Free Software Foundation; either */
/* version 2.1 of the License, or (at your option) any later version. */

/* This library 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 */
/* Lesser General Public License for more details. */

/* You should have received a copy of the GNU Lesser General Public */
/* License along with this library; if not, write to the Free Software */
/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */



// 音符情報(ひとつのおたまじゃくしにつきひとつ確保)
typedef struct tagMusicalScoreNoteInfo {
	MIDIEvent* m_pNoteOnEvent;          // ノートオンイベントへのポインタ
	MIDIEvent* m_pNoteOffEvent;         // ノートオフイベントへのポインタ
	long m_lNoteOnTime;                 // ノートオン時刻[Tick]
	long m_lNoteOnMeasure;              // ノートオン小節
	long m_lNoteOnBeat;                 // ノートオン拍
	long m_lNoteOnTick;                 // ノートオンティック
	long m_lNoteOffTime;                // ノートオフ時刻[Tick]
	long m_lNoteOffMeasure;             // ノートオフ小節
	long m_lNoteOffBeat;                // ノートオフ拍
	long m_lNoteOffTick;                // ノートオフティック
	long m_lFlags;                      // フラグ
	long m_lSelected;                   // 選択状態
	struct tagMusicalScoreNoteInfo* m_pPrevNoteInfo; // 次の音符情報へのポインタ(なければNULL)
	struct tagMusicalScoreNoteInfo* m_pNextNoteInfo; // 前の音符情報へのポインタ(なければNULL)
	void* m_pNoteGroupInfo;             // 旗グループ情報へのポインタ(なければNULL)
	void* m_pTripletGroupInfo;          // 3連符グループ情報へのポインタ(なければNULL)
} MusicalScoreNoteInfo;

// 旗グループ情報(複数の音符を旗をつなげて束ねる情報)
typedef struct tagMusicalScoreNoteGroupInfo {
	MusicalScoreNoteInfo* m_pFirstNoteInfo; // 最初の音符情報へのポインタ
	MusicalScoreNoteInfo* m_pLastNoteInfo;  // 最後の音符情報へのポインタ
	long m_lBeginTime;                  // 開始時刻
	long m_lEndTime;                    // 終了時刻
	long m_lMinKey;                     // 最低音階(0-127)
	long m_lMaxKey;                     // 最高音階(0-127)
	long m_lMinDur;                     // 最短音長さ
	long m_lMaxDur;                     // 最長音長さ
	long m_lNumNoteInfo;                // グループ内の音符数
} MusicalScoreNoteGroupInfo;

// 3連符グループ情報(複数の音符を-3-でつなげて束ねる情報)
typedef struct tagMusicalScoreTripletGroupInfo {
	MusicalScoreNoteInfo* m_pFirstNoteInfo; // 最初の音符情報へのポインタ
	MusicalScoreNoteInfo* m_pLastNoteInfo;  // 最後の音符情報へのポインタ
	long m_lBeginTime;                  // 開始時刻
	long m_lEndTime;                    // 終了時刻
	long m_lMinKey;                     // 最低音階(0-127)
	long m_lMaxKey;                     // 最高音階(0-127)
	long m_lMinDur;                     // 最短音長さ
	long m_lMaxDur;                     // 最長音長さ
	long m_lNumNoteInfo;                // グループ内の音符数
} MusicalScoreTripletGroupInfo;

// トラック情報
typedef struct {
	long m_lTop;                        // 上端座標[pixel]
	long m_lHeight;                     // 高さ[pixel]
	long m_lFlags;                      // フラグ
	long m_lMinKey;                     // トラック内最低音階(0-127)
	long m_lMaxKey;	                    // トラック内最高音階(0-127)
	CPtrArray m_theNoteInfoArray;       // 音符情報の配列
	CPtrArray m_theNoteGroupInfoArray;  // 音符グループ情報の配列
	CPtrArray m_theTripletGroupInfoArray; // 3連音符グループ情報の配列
	long m_lTopPrint;                   // 上端座標(印刷用)[*1/10mm]
	long m_lHeightPrint;                // 高さ(印刷用)[*1/10mm]
} MusicalScoreTrackInfo;

// 小節情報
typedef struct {
	long m_lTime;                       // この小節の開始タイム[Tick][Subframe]
	long m_lDuration;                   // この小節にの長さ[Tick][Subframe]
	long m_lLeft;                       // この小節の左座標[pixel]
	long m_lSignatureWidth;             // この小節の拍子記号・調性記号用幅[pixel]
	long m_lPreWidth;                   // この小節の左余白幅[pixel]
	long m_lWidth;                      // この小節の幅[pixel]
	long m_lPostWidth;                  // この小節の右余白幅[pixel]
	long m_lFlags;                      // フラグ
	long m_lTimeSignature;              // この小節の拍子記号
	long m_lKeySignature;               // この小節の調性記号
	long m_lLeftPrint;                  // この小節の左座標(印刷用)[*1/10mm]
	long m_lSignatureWidthPrint;        // この小節の拍子記号・調性記号用幅(印刷用)[*1/10mm]
	long m_lPreWidthPrint;              // この小節の左余白幅(印刷用)[*1/10mm]
	long m_lWidthPrint;                 // この小節の幅(印刷用)[*1/10mm] 
	long m_lPostWidthPrint;             // この小節の右余白幅[pixel](印刷用)[*1/10mm]
} MusicalScoreMeasureInfo;




class CMusicalScoreFrame : public CChildFrame {
	DECLARE_DYNCREATE (CMusicalScoreFrame)

	//-------------------------------------------------------------------------
	// アトリビュート
	//-------------------------------------------------------------------------
protected:
	long m_lToolBar1Height;             // ツールバー1の高さ[pixel]
	long m_lKeyHeight;                  // トラック番号-時間ビューの高さ[pixel]
	long m_lScaleHeight;                // 上部目盛りビューの高さ[pixel]
	long m_lScaleWidth;                 // 左部目盛りビューの高さ[pixel]
	long m_lTimeWidth;                  // トラック番号ー-時間ビューの幅[pixel]
	long m_lHScrollBarHeight;           // 水平スクロールバーの高さ[pixel]
	long m_lVScrollBarWidth;            // 垂直スクロールバーの高さ[pixel]
	long m_lTrackListWidth;             // トラックリストボックスの幅[pixel]
	long m_lTrackZoom;                  // トラック方向拡大倍率[倍]
	long m_lTimeZoom;                   // 時間方向拡大倍率[倍]
	long m_lTrackScrollPos;             // トラック方向スクロール位置[pixel]
	long m_lTimeScrollPos;              // 時間方向スクロール位置[pixel]
public:
	// 描画補助情報
	CPtrArray   m_theTrackInfoArray;    // トラックごとの情報
	CPtrArray   m_theMeasureInfoArray;  // 小節ごとの情報

public:
	CFont m_theFont;                    // 譜面ウィンドウで使うフォント
	CFont m_theTimeMeasureFont;         // 拍子記号・調性記号用のフォント
	CSekaijuToolBar m_wndToolBar1;      // ツールバー1(上)
	CColorfulComboBox m_wndTrackCombo;  // ツールバー上のトラックコンボボックス
	CComboBox m_wndChannelCombo;        // ツールバー上のチャンネルコンボボックス
	CComboBox m_wndSnapCombo;           // ツールバー上のスナップコンボボックス
	CComboBox m_wndVelocityCombo;       // ツールバー上のベロシティコンボボックス
	CComboBox m_wndDurationCombo;       // ツールバー上の音長さコンボボックス
	CComboBox m_wndResolutionCombo;     // ツールバー上の表示精度コンボボックス
	CView* m_pDummyView;                // ダミービュー(Visible=FALSE)へのポインタ
	CView* m_pPrintView;                // 印刷用ビュー(Visible=FALSE)へのポインタ
	CView* m_pScaleView;                // 目盛りビューへのポインタ
	CView* m_pTimeScaleView;            // 時間目盛りビューへのポインタ
	CView* m_pTrackScaleView;           // トラック番号目盛りビューへのポインタ
	CView* m_pTrackTimeView;            // トラック番号-タイムビューへのポインタ
	CCheckListBox* m_pTrackListBox;     // トラックリストボックス
	CScrollBar m_wndTimeScroll;         // 時間方向スクロールバー
	CScrollBar m_wndTrackScroll;        // トラック方向スクロールバー
	CScrollBar m_wndSizeScroll;         // サイズ用スクロールバー
	CBitmapButton m_wndTimeZoomUp;      // 時間方向拡大ボタン
	CBitmapButton m_wndTimeZoomDown;    // 時間方向縮小ボタン
	CBitmapButton m_wndTrackZoomUp;     // トラック方向拡大ボタン
	CBitmapButton m_wndTrackZoomDown;   // トラック方向縮小ボタン

protected:
	CPoint m_ptMouseDown;               // マウスが押されたときの座標(スプリッターを動かすのに使う)
	CPoint m_ptMouseMoveOld;            // マウスが動かされたときの前回の座標(スプリッターを動かすのに使う)
	BOOL m_bSplitterMovingH;            // 現在水平スプリッターを動かしているところか?
	BOOL m_bSplitterMovingV;            // 現在垂直スプリッターを動かしているところか?

public:
	BOOL m_bAutoPageUpdate;             // 自動的にページを更新するか?
	long m_lCurTool;                    // 現在の選択されているツール(0=描画,1=線画,2=消しゴム,3=選択,4=試聴)

protected:
	BOOL m_bOnlyCurTrack;               // 現在のトラックのみを表示するか?
	BOOL m_bShowAllTrack;               // すべてのトラックを表示するか?
	BOOL m_bTrackVisible[MAXMIDITRACKNUM]; // トラック[0〜65535]は可視か?

	//-------------------------------------------------------------------------
	// 構築と破壊
	//-------------------------------------------------------------------------
public:
	CMusicalScoreFrame ();              // コンストラクタ
	virtual ~CMusicalScoreFrame ();     // デストラクタ

	//-------------------------------------------------------------------------
	// オペレーション
	//-------------------------------------------------------------------------
public:
	virtual CSekaijuDoc* GetDocument ();
	virtual long GetTimeZoom ();
	virtual long GetTrackZoom ();
	virtual long XtoTime (long x);
	virtual long TimetoX (long lTime);
	virtual long MeasuretoX (long lMeasure);
	virtual long MeasuretoX2 (long lMeasure);
	virtual long YtoTrackIndex (long y);
	virtual long TrackIndexYtoKey (long lTrackIndex, long y, long lKeySignature);
	virtual long KeytoLineNo (long lKey, long lKeySignature);
	virtual long KeytoSF (long lKey, long lKeySignature);
	virtual long TrackIndexLineNotoY (long lTrackIndex, long lLineNo);
	virtual long TrackIndexKeytoY (long lTrackIndex, long lKey, long lKeySignature);
	virtual long GetTimeScrollPos ();
	virtual long GetTrackScrollPos ();
	virtual long SetTimeScrollPos (long lTimeScrollPos);
	virtual long SetTrackScrollPos (long lTrackScrollPos);
	virtual long GetVisibleLeftTime ();
	virtual long GetVisibleRightTime ();
	virtual long GetVisibleTopTrack ();
	virtual long GetVisibleBottomTrack ();
	virtual void DrawSplitterCaptor (CDC* pDC, CPoint pt);
	virtual long GetCurTrackIndex ();
	virtual long GetCurChannel ();
	virtual long GetCurSnap ();
	virtual long GetCurVelocity ();
	virtual long GetCurDuration ();
	virtual long GetCurResolution ();
	virtual BOOL SetCurTrackIndex (long lCurTrackIndex);
	virtual BOOL SetCurChannel (long lCurChannel);
	virtual BOOL SetCurSnap (long lCurSnap);
	virtual BOOL SetCurVelocity (long lCurVelocity);
	virtual BOOL SetCurDuration (long lCurDuration);
	virtual BOOL SetCurResolution (long lCurResolution);
	virtual BOOL IsTrackVisible (long lTrackIndex);
	virtual BOOL SetTrackVisible (long lTrackIndex);
	virtual BOOL UpdateTrackCombo ();
	virtual BOOL UpdateTrackList ();
	virtual BOOL UpdateSnapCombo ();
	virtual BOOL UpdateVelocityCombo ();
	virtual BOOL UpdateDurationCombo ();
	virtual BOOL UpdateResolutionCombo ();
	virtual void RecalcTrackScrollInfo ();
	virtual void RecalcTimeScrollInfo ();


	virtual BOOL DeleteTrackInfoArray ();
	virtual BOOL DeleteMeasureInfoArray ();
	virtual BOOL DeleteNoteInfoArray (long lTrackIndex);
	virtual BOOL DeleteNoteGroupInfoArray (long lTrackIndex);
	virtual BOOL DeleteTripletGroupInfoArray (long lTrackIndex);
	virtual BOOL UpdateMeasureInfoArray ();
	virtual BOOL UpdateTrackInfoArray ();
	virtual BOOL UpdateNoteInfoArray (long lTrackIndex, MIDITrack* pMIDITrack);
	virtual BOOL UpdateNoteGroupInfoArray (long lTrackIndex, MIDITrack* pMIDITrack);
	virtual BOOL UpdateTripletGroupInfoArray (long lTrackIndex, MIDITrack* pMIDITrack);
	virtual MusicalScoreNoteInfo* CreateNote
		(MIDIEvent* pNoteEvent, long lNoteOnTime, long lNoteOnMeasure, long lNoteOnBeat, long lNoteOnTick, 
		long lNoteOffTime, long lNoteOffMeasure, long lNoteOffBeat, long lNoteOffTick, long lFlags);
	virtual void DeleteNoteInfo (MusicalScoreNoteInfo* pNoteInfo);
	virtual BOOL AddNoteInfo (MusicalScoreTrackInfo* pTrackInfo, MusicalScoreNoteInfo* pNoteInfo);
	MusicalScoreNoteGroupInfo* CreateNoteGroupInfo (MusicalScoreNoteInfo* pNoteInfo);
	void DeleteNoteGroupInfo (MusicalScoreNoteGroupInfo* pNoteGroupInfo);
	BOOL AddNoteGroupInfo (MusicalScoreTrackInfo* pTrackInfo, MusicalScoreNoteGroupInfo* pNoteGroupInfo);
	MusicalScoreTripletGroupInfo* CreateTripletGroupInfo (MusicalScoreNoteInfo* pNoteInfo);
	void DeleteTripletGroupInfo (MusicalScoreTripletGroupInfo* pTripletGroupInfo);
	BOOL AddTripletGroupInfo (MusicalScoreTrackInfo* pTrackInfo, MusicalScoreTripletGroupInfo* pNoteGroupInfo);

	virtual long GetTrackInfoCount ()
		{return m_theTrackInfoArray.GetSize ();} 
	virtual MusicalScoreTrackInfo* GetTrackInfo (long lTrackIndex)
		{return lTrackIndex < m_theTrackInfoArray.GetSize () ? 
		((MusicalScoreTrackInfo*)m_theTrackInfoArray.GetAt (lTrackIndex)) : NULL;}

	virtual long GetMeasureInfoCount ()
		{return m_theMeasureInfoArray.GetSize ();}
	virtual MusicalScoreMeasureInfo* GetMeasureInfo (long lMeasureIndex)
		{return lMeasureIndex < m_theMeasureInfoArray.GetSize () ?
		((MusicalScoreMeasureInfo*)m_theMeasureInfoArray.GetAt (lMeasureIndex)) : NULL;}
	virtual long GetMeasureTime (long lMeasureIndex)
		{return lMeasureIndex < m_theMeasureInfoArray.GetSize () ?
		((MusicalScoreMeasureInfo*)m_theMeasureInfoArray.GetAt (lMeasureIndex))->m_lTime : 0;}
	virtual long GetMeasureLeft (long lMeasureIndex)
		{return lMeasureIndex < m_theMeasureInfoArray.GetSize () ?
		((MusicalScoreMeasureInfo*)m_theMeasureInfoArray.GetAt (lMeasureIndex))->m_lLeft : 0;}


	//-------------------------------------------------------------------------
	// オーバーライド
	//-------------------------------------------------------------------------
protected:
	virtual BOOL PreCreateWindow (CREATESTRUCT& cs);
	virtual void OnUpdateFrameTitle (BOOL bAddToTitle);
	virtual void RecalcLayout (BOOL bNotify = TRUE);
	virtual BOOL OnCreateClient (LPCREATESTRUCT lpcs, CCreateContext* pContext);
	virtual BOOL OnCmdMsg (UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);

	//-------------------------------------------------------------------------
	// メッセージマップ
	//-------------------------------------------------------------------------
protected:
	afx_msg int OnCreate (LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnDestroy ();
	afx_msg void OnSize (UINT nType, int cx, int cy);
	afx_msg void OnTimer (UINT nIDEvent);
	afx_msg BOOL OnEraseBkgnd (CDC* pDC);

	afx_msg void OnMDIActivate (BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd);
	afx_msg void OnPaint ();
	afx_msg void OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags);
	afx_msg void OnLButtonDown (UINT nFlags, CPoint point);
	afx_msg void OnRButtonDown (UINT nFlags, CPoint point);
	afx_msg void OnLButtonUp (UINT nFlags, CPoint point);
	afx_msg void OnRButtonUp (UINT nFlags, CPoint point);
	afx_msg void OnMouseMove (UINT nFlags, CPoint point);
	afx_msg void OnTimeZoomDown ();
	afx_msg void OnTimeZoomUp ();
	afx_msg void OnTrackZoomDown ();
	afx_msg void OnTrackZoomUp ();
	afx_msg void OnVScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
	afx_msg void OnHScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
	afx_msg void OnMusicalScorePen ();
	afx_msg void OnUpdateMusicalScorePenUI (CCmdUI* pCmdUI);
	afx_msg void OnMusicalScoreLine ();
	afx_msg void OnUpdateMusicalScoreLineUI (CCmdUI* pCmdUI);
	afx_msg void OnMusicalScoreEraser ();
	afx_msg void OnUpdateMusicalScoreEraserUI (CCmdUI* pCmdUI);
	afx_msg void OnMusicalScoreSelect ();
	afx_msg void OnUpdateMusicalScoreSelectUI (CCmdUI* pCmdUI);
	afx_msg void OnMusicalScoreSpeaker ();
	afx_msg void OnUpdateMusicalScoreSpeakerUI (CCmdUI* pCmdUI);
	afx_msg void OnMusicalScoreWholeNote ();
	afx_msg void OnUpdateMusicalScoreWholeNoteUI (CCmdUI* pCmdUI);
	afx_msg void OnMusicalScoreHalfNote ();
	afx_msg void OnUpdateMusicalScoreHalfNoteUI (CCmdUI* pCmdUI);
	afx_msg void OnMusicalScoreQuarterNote ();
	afx_msg void OnUpdateMusicalScoreQuarterNoteUI (CCmdUI* pCmdUI);
	afx_msg void OnMusicalScoreQuaverNote ();
	afx_msg void OnUpdateMusicalScoreQuaverNoteUI (CCmdUI* pCmdUI);
	afx_msg void OnMusicalScoreSemiQuaverNote ();
	afx_msg void OnUpdateMusicalScoreSemiQuaverNoteUI (CCmdUI* pCmdUI);
	afx_msg void OnMusicalScoreDemiSemiQuaverNote ();
	afx_msg void OnUpdateMusicalScoreDemiSemiQuaverNoteUI (CCmdUI* pCmdUI);
	afx_msg void OnMusicalScoreDotted ();
	afx_msg void OnUpdateMusicalScoreDottedUI (CCmdUI* pCmdUI);
	afx_msg void OnMusicalScoreTriplet ();
	afx_msg void OnUpdateMusicalScoreTripletUI (CCmdUI* pCmdUI);
	afx_msg void OnMusicalScoreOnlyCurTrack ();
	afx_msg void OnUpdateMusicalScoreOnlyCurTrackUI (CCmdUI* pCmdUI);
	afx_msg void OnMusicalScoreShowAllTrack ();
	afx_msg void OnUpdateMusicalScoreShowAllTrackUI (CCmdUI* pCmdUI);
	afx_msg void OnMusicalScoreAutoPageUpdate ();
	afx_msg void OnUpdateMusicalScoreAutoPageUpdateUI (CCmdUI* pCmdUI);

	afx_msg void OnTrackComboSelEndOK ();	
	afx_msg void OnTrackListChkChange ();
	afx_msg void OnTrackListSelChange ();
	afx_msg void OnSnapComboSelEndOK ();
	afx_msg void OnResolutionComboSelEndOK ();

	afx_msg void OnPopupTrackVisibleOn ();
	afx_msg void OnUpdatePopupTrackVisibleOnUI (CCmdUI* pCmdUI);
	afx_msg void OnPopupTrackVisibleOff ();
	afx_msg void OnUpdatePopupTrackVisibleOffUI (CCmdUI* pCmdUI);
	afx_msg void OnPopupTrackVisibleAll ();
	afx_msg void OnUpdatePopupTrackVisibleAllUI (CCmdUI* pCmdUI);
	afx_msg void OnPopupEventProperty ();
	afx_msg void OnUpdatePopupEventPropertyUI (CCmdUI* pCmdUI);

	DECLARE_MESSAGE_MAP()
};