MIDITrail をピカピカにする。鍵盤方向自動切替・多ポート・歌詞対応等
Révision | 20576ea56ba8bb740850f57a37aa4c1dc5ba0c11 (tree) |
---|---|
l'heure | 2016-10-30 12:39:33 |
Auteur | yoshy <yoshy@user...> |
Commiter | yoshy |
[UPDATE] 2D/3D ビューの鍵盤を動くようにした
[UPDATE] 時間をミリ秒表示に修正
[FIX] ウィンドウ背景のブラシを黒固定に変更(背景が時々真っ白になるので)
@@ -120,7 +120,7 @@ FONT 8, "MS Shell Dlg", 400, 0, 0x1 | ||
120 | 120 | BEGIN |
121 | 121 | ICON IDI_MIDITRAIL,IDC_STATIC,74,12,20,20 |
122 | 122 | CTEXT "MIDITrail",IDC_STATIC,16,42,138,8,SS_NOPREFIX |
123 | - CTEXT "Version 1.2.0",IDC_STATIC,16,63,138,8 | |
123 | + CTEXT "Version 1.2.0 mod. yossiepon_20120318",IDC_STATIC,16,63,138,8 | |
124 | 124 | CTEXT "Copyright (C) 2010-2012 WADA Masashi",IDC_STATIC,1,84,168,8 |
125 | 125 | DEFPUSHBUTTON "OK",IDOK,58,108,53,14,WS_GROUP |
126 | 126 | END |
@@ -294,7 +294,7 @@ END | ||
294 | 294 | |
295 | 295 | STRINGTABLE |
296 | 296 | BEGIN |
297 | - IDS_APP_TITLE "MIDITrail" | |
297 | + IDS_APP_TITLE "MIDITrail 1.2.0 mod. yossiepon_20120318" | |
298 | 298 | IDC_MIDITRAIL "MIDITRAIL" |
299 | 299 | END |
300 | 300 |
@@ -284,7 +284,7 @@ int MIDITrailApp::_RegisterClass( | ||
284 | 284 | wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MIDITRAIL)); |
285 | 285 | //アイコンリソースハンドル |
286 | 286 | wcex.hCursor = LoadCursor(NULL, IDC_ARROW); //カーソルリソースハンドル |
287 | - wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //背景用ブラシハンドル | |
287 | + wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); //(COLOR_WINDOW+1); //背景用ブラシハンドル | |
288 | 288 | wcex.lpszMenuName = MAKEINTRESOURCE(IDC_MIDITRAIL); //メニューリソース名称 |
289 | 289 | wcex.lpszClassName = m_WndClassName; //ウィンドウクラス名称 |
290 | 290 | wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); |
@@ -1866,7 +1866,7 @@ int MIDITrailApp::_ChangeMenuStyle() | ||
1866 | 1866 | { MF_GRAYED, MF_GRAYED, MF_GRAYED, MF_GRAYED, MF_GRAYED, MF_ENABLED }, //IDM_STOP_MONITORING |
1867 | 1867 | { MF_ENABLED, MF_ENABLED, MF_GRAYED, MF_GRAYED, MF_ENABLED, MF_GRAYED }, //IDM_VIEW_3DPIAMF_GRAYEDROLL |
1868 | 1868 | { MF_ENABLED, MF_ENABLED, MF_GRAYED, MF_GRAYED, MF_ENABLED, MF_GRAYED }, //IDM_VIEW_2DPIAMF_GRAYEDROLL |
1869 | - { MF_ENABLED, MF_ENABLED, MF_GRAYED, MF_GRAYED, MF_ENABLED, MF_GRAYED }, //IDM_VIEW_PIAMF_GRAYEDROLLRAIN | |
1869 | + { MF_GRAYED, MF_GRAYED, MF_GRAYED, MF_GRAYED, MF_GRAYED, MF_GRAYED }, //IDM_VIEW_PIAMF_GRAYEDROLLRAIN | |
1870 | 1870 | { MF_GRAYED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_RESET_VIEWPOINT |
1871 | 1871 | { MF_GRAYED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_SAVE_VIEWPOINT |
1872 | 1872 | { MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_ENABLE_PIAMF_GRAYEDKEYBOAR |
@@ -111,7 +111,7 @@ int MTDashboard::Create( | ||
111 | 111 | m_Counter.SetColor(m_CaptionColor); |
112 | 112 | |
113 | 113 | //全体演奏時間 |
114 | - SetTotalPlayTimeSec(pSeqData->GetTotalPlayTime()/1000); | |
114 | + SetTotalPlayTimeSec(pSeqData->GetTotalPlayTime()); | |
115 | 115 | |
116 | 116 | //テンポ(BPM) |
117 | 117 | SetTempoBPM(pSeqData->GetTempoBPM()); |
@@ -365,11 +365,13 @@ int MTDashboard::_GetCounterStr( | ||
365 | 365 | eresult = _stprintf_s( |
366 | 366 | pStr, |
367 | 367 | bufSize, |
368 | - _T("TIME:%02d:%02d/%02d:%02d BPM:%03d BEAT:%d/%d BAR:%03d/%03d NOTES:%05d/%05d"), | |
369 | - m_PlayTimeSec / 60, | |
370 | - m_PlayTimeSec % 60, | |
371 | - m_TotalPlayTimeSec / 60, | |
372 | - m_TotalPlayTimeSec % 60, | |
368 | + _T("TIME:%02d:%02d.%03d/%02d:%02d.%03d BPM:%03d BEAT:%d/%d BAR:%03d/%03d NOTES:%05d/%05d"), | |
369 | + m_PlayTimeSec / 60000, | |
370 | + (m_PlayTimeSec % 60000) / 1000, | |
371 | + m_PlayTimeSec % 1000, | |
372 | + m_TotalPlayTimeSec / 60000, | |
373 | + (m_TotalPlayTimeSec % 60000) / 1000, | |
374 | + m_TotalPlayTimeSec % 1000, | |
373 | 375 | m_TempoBPM, |
374 | 376 | m_BeatNumerator, |
375 | 377 | m_BeatDenominator, |
@@ -30,13 +30,13 @@ using namespace SMIDILib; | ||
30 | 30 | #define MTDASHBOARD_FONTSIZE (40) |
31 | 31 | |
32 | 32 | //カウンタキャプション文字列 |
33 | -#define MTDASHBOARD_COUNTER_CHARS _T("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:/% ") | |
33 | +#define MTDASHBOARD_COUNTER_CHARS _T("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:./% ") | |
34 | 34 | |
35 | 35 | //カウンタキャプションサイズ |
36 | 36 | // 12345678901234567890123456789012345678901234567890123456789012345678901234 (74) |
37 | 37 | // "TIME:00:00/00:00 BPM:000 BEAT:4/4 BAR:000/000 NOTES:00000/00000 SPEED:000%" |
38 | 38 | // 余裕をみて80にしておく |
39 | -#define MTDASHBOARD_COUNTER_SIZE (80) | |
39 | +#define MTDASHBOARD_COUNTER_SIZE (92) | |
40 | 40 | |
41 | 41 | //枠サイズ(ピクセル) |
42 | 42 | #define MTDASHBOARD_FRAMESIZE (5.0f) |
@@ -1540,32 +1540,58 @@ void MTPianoKeyboard::_MakeMaterial( | ||
1540 | 1540 | //****************************************************************************** |
1541 | 1541 | int MTPianoKeyboard::Transform( |
1542 | 1542 | LPDIRECT3DDEVICE9 pD3DDevice, |
1543 | - D3DXVECTOR3 moveVector, | |
1543 | + D3DXVECTOR3 moveVector1, | |
1544 | + D3DXVECTOR3 moveVector2, | |
1545 | + float scale, | |
1546 | + float z, | |
1544 | 1547 | float rollAngle |
1545 | 1548 | ) |
1546 | 1549 | { |
1547 | 1550 | int result = 0; |
1548 | - D3DXMATRIX rotateMatrix; | |
1549 | - D3DXMATRIX moveMatrix; | |
1550 | - D3DXMATRIX worldMatrix; | |
1551 | + D3DXMATRIX scaleMatrix; | |
1552 | + D3DXMATRIX rotateMatrix1; | |
1553 | + D3DXMATRIX rotateMatrix2; | |
1554 | + D3DXMATRIX rotateMatrix3; | |
1555 | + D3DXMATRIX moveMatrix1; | |
1556 | + D3DXMATRIX moveMatrix2; | |
1557 | + D3DXMATRIX moveMatrix3; | |
1558 | + D3DXMATRIX worldMatrix1; | |
1559 | + D3DXMATRIX worldMatrix2; | |
1551 | 1560 | |
1552 | 1561 | //行列初期化 |
1553 | - D3DXMatrixIdentity(&rotateMatrix); | |
1554 | - D3DXMatrixIdentity(&moveMatrix); | |
1555 | - D3DXMatrixIdentity(&worldMatrix); | |
1562 | + D3DXMatrixIdentity(&scaleMatrix); | |
1563 | + D3DXMatrixIdentity(&rotateMatrix1); | |
1564 | + D3DXMatrixIdentity(&rotateMatrix2); | |
1565 | + D3DXMatrixIdentity(&rotateMatrix3); | |
1566 | + D3DXMatrixIdentity(&moveMatrix1); | |
1567 | + D3DXMatrixIdentity(&moveMatrix2); | |
1568 | + D3DXMatrixIdentity(&worldMatrix1); | |
1569 | + D3DXMatrixIdentity(&worldMatrix2); | |
1556 | 1570 | |
1557 | 1571 | //回転行列 |
1558 | - D3DXMatrixRotationY(&rotateMatrix, D3DXToRadian(rollAngle)); | |
1572 | + D3DXMatrixRotationX(&rotateMatrix1, D3DXToRadian(-90.0f)); | |
1573 | + D3DXMatrixRotationZ(&rotateMatrix2, D3DXToRadian(90.0f)); | |
1574 | + D3DXMatrixRotationX(&rotateMatrix3, D3DXToRadian(rollAngle)); | |
1559 | 1575 | |
1560 | 1576 | //移動行列 |
1561 | - D3DXMatrixTranslation(&moveMatrix, moveVector.x, moveVector.y, moveVector.z); | |
1577 | + D3DXMatrixTranslation(&moveMatrix1, moveVector1.x, moveVector1.y, moveVector1.z); | |
1578 | + D3DXMatrixTranslation(&moveMatrix2, moveVector2.x, moveVector2.y, moveVector2.z); | |
1579 | + D3DXMatrixTranslation(&moveMatrix3, 0.0f, 0.0f, z / scale); | |
1562 | 1580 | |
1563 | - //行列の合成:移動→回転 | |
1581 | + //スケール行列 | |
1582 | + D3DXMatrixScaling(&scaleMatrix, scale, scale, scale); | |
1583 | + | |
1584 | + //行列の合成:ピッチベンド移動1→鍵盤向き補正回転1・2→ホイール回転3→スケール→再生面追従移動2 | |
1564 | 1585 | //ピッチベンドによるシフトを先に適用してから回転する |
1565 | - D3DXMatrixMultiply(&worldMatrix, &moveMatrix, &rotateMatrix); | |
1586 | + D3DXMatrixMultiply(&worldMatrix1, &moveMatrix1, &rotateMatrix1); | |
1587 | + D3DXMatrixMultiply(&worldMatrix2, &worldMatrix1, &rotateMatrix2); | |
1588 | + D3DXMatrixMultiply(&worldMatrix1, &worldMatrix2, &moveMatrix3); | |
1589 | + D3DXMatrixMultiply(&worldMatrix2, &worldMatrix1, &rotateMatrix3); | |
1590 | + D3DXMatrixMultiply(&worldMatrix1, &worldMatrix2, &scaleMatrix); | |
1591 | + D3DXMatrixMultiply(&worldMatrix2, &worldMatrix1, &moveMatrix2); | |
1566 | 1592 | |
1567 | 1593 | //変換行列設定 |
1568 | - m_PrimitiveKeyboard.Transform(worldMatrix); | |
1594 | + m_PrimitiveKeyboard.Transform(worldMatrix2); | |
1569 | 1595 | |
1570 | 1596 | //EXIT:; |
1571 | 1597 | return result; |
@@ -1596,6 +1622,7 @@ EXIT:; | ||
1596 | 1622 | // キーの押し込み |
1597 | 1623 | //****************************************************************************** |
1598 | 1624 | int MTPianoKeyboard::PushKey( |
1625 | + unsigned char chNo, | |
1599 | 1626 | unsigned char noteNo, |
1600 | 1627 | float keyDownRate, |
1601 | 1628 | unsigned long elapsedTime |
@@ -1618,7 +1645,7 @@ int MTPianoKeyboard::PushKey( | ||
1618 | 1645 | } |
1619 | 1646 | else { |
1620 | 1647 | //キーが押下状態の場合は色を変更して回転させる |
1621 | - color = m_KeyboardDesign.GetActiveKeyColor(noteNo, elapsedTime); | |
1648 | + color = m_KeyboardDesign.GetActiveKeyColor(chNo, noteNo, elapsedTime); | |
1622 | 1649 | _RotateKey(noteNo, angle, &color); |
1623 | 1650 | } |
1624 | 1651 |
@@ -43,7 +43,7 @@ public: | ||
43 | 43 | ); |
44 | 44 | |
45 | 45 | //更新 |
46 | - int Transform(LPDIRECT3DDEVICE9 pD3DDevice, D3DXVECTOR3 moveVector, float rollAngle); | |
46 | + int Transform(LPDIRECT3DDEVICE9 pD3DDevice, D3DXVECTOR3 moveVector1, D3DXVECTOR3 moveVector2, float scale, float z, float rollAngle); | |
47 | 47 | |
48 | 48 | //描画 |
49 | 49 | int Draw(LPDIRECT3DDEVICE9 pD3DDevice); |
@@ -53,7 +53,7 @@ public: | ||
53 | 53 | |
54 | 54 | //キー状態変更 |
55 | 55 | int ResetKey(unsigned char noteNo); |
56 | - int PushKey(unsigned char noteNo, float keyDownRate, unsigned long elapsedTime); | |
56 | + int PushKey(unsigned char chNo, unsigned char noteNo, float keyDownRate, unsigned long elapsedTime); | |
57 | 57 | |
58 | 58 | //共有用テクスチャ取得 |
59 | 59 | LPDIRECT3DTEXTURE9 GetTexture(); |
@@ -173,26 +173,44 @@ int MTPianoKeyboardCtrl::Transform( | ||
173 | 173 | int result = 0; |
174 | 174 | unsigned char portNo = 0; |
175 | 175 | unsigned char chNo = 0; |
176 | - D3DXVECTOR3 moveVector; | |
176 | + D3DXVECTOR3 vectorLU; | |
177 | + D3DXVECTOR3 vectorRU; | |
178 | + D3DXVECTOR3 vectorLD; | |
179 | + D3DXVECTOR3 vectorRD; | |
180 | + D3DXVECTOR3 moveVector1; | |
181 | + D3DXVECTOR3 moveVector2; | |
177 | 182 | |
178 | 183 | //現在発音中ノートの頂点更新 |
179 | 184 | result = _TransformActiveNotes(pD3DDevice); |
180 | 185 | if (result != 0) goto EXIT; |
181 | 186 | |
187 | + //再生面頂点座標取得 | |
188 | + m_NoteDesign.GetPlaybackSectionVirtexPos( | |
189 | + 0, | |
190 | + &vectorLU, | |
191 | + &vectorRU, | |
192 | + &vectorLD, | |
193 | + &vectorRD | |
194 | + ); | |
195 | + | |
196 | + float boardHeight = vectorLU.y - vectorLD.y; | |
197 | + float keyboardWidth = m_KeyboardDesign.GetPortOriginX(0) * -2.0f; | |
198 | + | |
182 | 199 | //各キーボードの移動 |
183 | 200 | for (chNo = 0; chNo < SM_MAX_CH_NUM; chNo++) { |
184 | 201 | |
185 | 202 | //移動ベクトル:キーボード基準座標 |
186 | - moveVector = m_KeyboardDesign.GetKeyboardBasePos(portNo, chNo); | |
203 | + moveVector1 = m_KeyboardDesign.GetKeyboardBasePos(portNo, chNo); | |
187 | 204 | |
188 | 205 | //移動ベクトル:ピッチベンドシフトを反映 |
189 | - moveVector.x += _GetPichBendShiftPosX(portNo, chNo); | |
206 | + moveVector1.x += _GetPichBendShiftPosX(portNo, chNo); | |
190 | 207 | |
191 | 208 | //移動ベクトル:再生面に追従する |
192 | - moveVector.y += m_NoteDesign.GetPlayPosX(m_CurTickTime); | |
209 | + moveVector2 = m_NoteDesign.GetWorldMoveVector(); | |
210 | + moveVector2.x += m_NoteDesign.GetPlayPosX(m_CurTickTime); | |
193 | 211 | |
194 | 212 | //キーボード移動 |
195 | - result = m_pPianoKeyboard[chNo]->Transform(pD3DDevice, moveVector, rollAngle); | |
213 | + result = m_pPianoKeyboard[chNo]->Transform(pD3DDevice, moveVector1, moveVector2, boardHeight / keyboardWidth, vectorLU.z, rollAngle); | |
196 | 214 | if (result != 0) goto EXIT; |
197 | 215 | } |
198 | 216 |
@@ -368,7 +386,7 @@ int MTPianoKeyboardCtrl::_UpdateNoteStatus( | ||
368 | 386 | //ノート情報を破棄 |
369 | 387 | //TODO: 複数ポート対応 |
370 | 388 | if (note.portNo == 0) { |
371 | - result = m_pPianoKeyboard[note.chNo]->ResetKey(note.noteNo); | |
389 | + result = m_pPianoKeyboard[0]->ResetKey(note.noteNo); | |
372 | 390 | if (result != 0) goto EXIT; |
373 | 391 | } |
374 | 392 | pNoteStatus->isActive = false; |
@@ -414,7 +432,8 @@ int MTPianoKeyboardCtrl::_UpdateVertexOfActiveNotes( | ||
414 | 432 | // TODO: 複数ポート対応 |
415 | 433 | if ((note.portNo == 0) |
416 | 434 | && (m_KeyDownRate[note.chNo][note.noteNo] < m_pNoteStatus[i].keyDownRate)) { |
417 | - result = m_pPianoKeyboard[note.chNo]->PushKey( | |
435 | + result = m_pPianoKeyboard[0]->PushKey( | |
436 | + note.chNo, | |
418 | 437 | note.noteNo, |
419 | 438 | m_pNoteStatus[i].keyDownRate, |
420 | 439 | elapsedTime |
@@ -444,7 +463,7 @@ int MTPianoKeyboardCtrl::Draw( | ||
444 | 463 | if (!m_isEnable) goto EXIT; |
445 | 464 | |
446 | 465 | //キーボード最大表示数 |
447 | - dispNum = SM_MAX_CH_NUM; | |
466 | + dispNum = 1; //SM_MAX_CH_NUM; | |
448 | 467 | if (m_KeyboardDesign.GetKeyboardMaxDispNum() < dispNum) { |
449 | 468 | dispNum = m_KeyboardDesign.GetKeyboardMaxDispNum(); |
450 | 469 | } |
@@ -544,7 +563,7 @@ void MTPianoKeyboardCtrl::Reset() | ||
544 | 563 | |
545 | 564 | //TODO: 複数ポート対応 |
546 | 565 | if (note.portNo == 0) { |
547 | - result = m_pPianoKeyboard[note.chNo]->ResetKey(note.noteNo); | |
566 | + result = m_pPianoKeyboard[0]->ResetKey(note.noteNo); | |
548 | 567 | //if (result != 0) goto EXIT; |
549 | 568 | } |
550 | 569 | } |
@@ -141,26 +141,44 @@ int MTPianoKeyboardCtrlLive::Transform( | ||
141 | 141 | int result = 0; |
142 | 142 | unsigned char portNo = 0; |
143 | 143 | unsigned char chNo = 0; |
144 | - D3DXVECTOR3 moveVector; | |
144 | + D3DXVECTOR3 vectorLU; | |
145 | + D3DXVECTOR3 vectorRU; | |
146 | + D3DXVECTOR3 vectorLD; | |
147 | + D3DXVECTOR3 vectorRD; | |
148 | + D3DXVECTOR3 moveVector1; | |
149 | + D3DXVECTOR3 moveVector2; | |
145 | 150 | |
146 | 151 | //現在発音中ノートの頂点更新 |
147 | 152 | result = _TransformActiveNotes(pD3DDevice); |
148 | 153 | if (result != 0) goto EXIT; |
149 | 154 | |
155 | + //再生面頂点座標取得 | |
156 | + m_NoteDesign.GetPlaybackSectionVirtexPos( | |
157 | + 0, | |
158 | + &vectorLU, | |
159 | + &vectorRU, | |
160 | + &vectorLD, | |
161 | + &vectorRD | |
162 | + ); | |
163 | + | |
164 | + float boardHeight = vectorLU.y - vectorLD.y; | |
165 | + float keyboardWidth = m_KeyboardDesign.GetPortOriginX(0) * -2.0f; | |
166 | + | |
150 | 167 | //各キーボードの移動 |
151 | 168 | for (chNo = 0; chNo < SM_MAX_CH_NUM; chNo++) { |
152 | 169 | |
153 | 170 | //移動ベクトル:キーボード基準座標 |
154 | - moveVector = m_KeyboardDesign.GetKeyboardBasePos(portNo, chNo); | |
171 | + moveVector1 = m_KeyboardDesign.GetKeyboardBasePos(portNo, chNo); | |
155 | 172 | |
156 | 173 | //移動ベクトル:ピッチベンドシフトを反映 |
157 | - moveVector.x += _GetPichBendShiftPosX(portNo, chNo); | |
174 | + moveVector1.x += _GetPichBendShiftPosX(portNo, chNo); | |
158 | 175 | |
159 | 176 | //移動ベクトル:再生面に追従する |
160 | - //moveVector.y += m_NoteDesign.GetPlayPosX(m_CurTickTime); | |
177 | + moveVector2 = m_NoteDesign.GetWorldMoveVector(); | |
178 | + //moveVector2.x += m_NoteDesign.GetPlayPosX(m_CurTickTime); | |
161 | 179 | |
162 | 180 | //キーボード移動 |
163 | - result = m_pPianoKeyboard[chNo]->Transform(pD3DDevice, moveVector, rollAngle); | |
181 | + result = m_pPianoKeyboard[chNo]->Transform(pD3DDevice, moveVector1, moveVector2, boardHeight / keyboardWidth, vectorLU.z, rollAngle); | |
164 | 182 | if (result != 0) goto EXIT; |
165 | 183 | } |
166 | 184 |
@@ -218,12 +236,12 @@ int MTPianoKeyboardCtrlLive::_UpdateStatusOfActiveNotes( | ||
218 | 236 | m_NoteStatus[chNo][noteNo].startTime = 0; |
219 | 237 | m_NoteStatus[chNo][noteNo].endTime = 0; |
220 | 238 | m_NoteStatus[chNo][noteNo].keyDownRate = 0.0f; |
221 | - result = m_pPianoKeyboard[chNo]->ResetKey((unsigned char)noteNo); | |
239 | + result = m_pPianoKeyboard[0]->ResetKey((unsigned char)noteNo); | |
222 | 240 | if (result != 0) goto EXIT; |
223 | 241 | } |
224 | 242 | //キー押下率を更新 |
225 | 243 | else { |
226 | - m_NoteStatus[chNo][noteNo].keyDownRate | |
244 | + m_NoteStatus[0][noteNo].keyDownRate | |
227 | 245 | = 1.0f - ((float)(curTime - m_NoteStatus[chNo][noteNo].endTime) / (float)keyUpDuration); |
228 | 246 | } |
229 | 247 | } |
@@ -257,7 +275,8 @@ int MTPianoKeyboardCtrlLive::_UpdateVertexOfActiveNotes( | ||
257 | 275 | elapsedTime = curTime - m_NoteStatus[chNo][noteNo].startTime; |
258 | 276 | |
259 | 277 | //発音対象キーを回転 |
260 | - result = m_pPianoKeyboard[chNo]->PushKey( | |
278 | + result = m_pPianoKeyboard[0]->PushKey( | |
279 | + (unsigned char)chNo, | |
261 | 280 | (unsigned char)noteNo, |
262 | 281 | m_NoteStatus[chNo][noteNo].keyDownRate, |
263 | 282 | elapsedTime |
@@ -286,7 +305,7 @@ int MTPianoKeyboardCtrlLive::Draw( | ||
286 | 305 | if (!m_isEnable) goto EXIT; |
287 | 306 | |
288 | 307 | //キーボード最大表示数 |
289 | - dispNum = SM_MAX_CH_NUM; | |
308 | + dispNum = 1; //SM_MAX_CH_NUM; | |
290 | 309 | if (m_KeyboardDesign.GetKeyboardMaxDispNum() < dispNum) { |
291 | 310 | dispNum = m_KeyboardDesign.GetKeyboardMaxDispNum(); |
292 | 311 | } |
@@ -326,7 +326,7 @@ float MTPianoKeyboardDesign::GetPortOriginY( | ||
326 | 326 | totalHeight = portHeight * ((float)chNum / (float)SM_MAX_CH_NUM); |
327 | 327 | originY = (portHeight * portIndex) - (totalHeight / 2.0f); |
328 | 328 | |
329 | - return originY; | |
329 | + return 0; //originY; | |
330 | 330 | } |
331 | 331 | |
332 | 332 | //****************************************************************************** |
@@ -378,7 +378,7 @@ float MTPianoKeyboardDesign::GetPortOriginZ( | ||
378 | 378 | totalLen = portLen * ((float)chNum / (float)SM_MAX_CH_NUM); |
379 | 379 | originZ = (portLen * portIndex) - (totalLen / 2.0f); |
380 | 380 | |
381 | - return originZ; | |
381 | + return 0; //originZ; | |
382 | 382 | } |
383 | 383 | |
384 | 384 | //****************************************************************************** |
@@ -583,6 +583,7 @@ D3DXCOLOR MTPianoKeyboardDesign::GetBlackKeyColor() | ||
583 | 583 | // 発音中キーカラー取得 |
584 | 584 | //****************************************************************************** |
585 | 585 | D3DXCOLOR MTPianoKeyboardDesign::GetActiveKeyColor( |
586 | + unsigned char chNo, | |
586 | 587 | unsigned char noteNo, |
587 | 588 | unsigned long elapsedTime |
588 | 589 | ) |
@@ -608,7 +609,7 @@ D3DXCOLOR MTPianoKeyboardDesign::GetActiveKeyColor( | ||
608 | 609 | // | on : off |
609 | 610 | // <-->duration |
610 | 611 | |
611 | - color = m_ActiveKeyColor; | |
612 | + color = m_NoteColor[chNo]; | |
612 | 613 | duration = (unsigned long)m_ActiveKeyColorDuration; |
613 | 614 | rate = m_ActiveKeyColorTailRate; |
614 | 615 |
@@ -845,9 +846,9 @@ D3DXVECTOR3 MTPianoKeyboardDesign::GetKeyboardBasePos( | ||
845 | 846 | oz = GetPortOriginZ(portNo); |
846 | 847 | |
847 | 848 | //チャンネルを考慮した配置座標 |
848 | - moveVector.x = ox + 0.0f; | |
849 | + moveVector.x = ox + GetWhiteKeyStep() / 2.0f; | |
849 | 850 | moveVector.y = oy + ((float)chNo * m_KeyboardStepY); |
850 | - moveVector.z = oz + ((float)chNo * m_KeyboardStepZ); | |
851 | + moveVector.z = oz; // + ((float)chNo * m_KeyboardStepZ); | |
851 | 852 | |
852 | 853 | return moveVector; |
853 | 854 | } |
@@ -868,7 +869,9 @@ int MTPianoKeyboardDesign::_LoadConfFile( | ||
868 | 869 | ) |
869 | 870 | { |
870 | 871 | int result = 0; |
872 | + TCHAR key[16] = {_T('\0')}; | |
871 | 873 | TCHAR hexColor[16] = {_T('\0')}; |
874 | + unsigned long i = 0; | |
872 | 875 | MTConfFile confFile; |
873 | 876 | |
874 | 877 | result = confFile.Initialize(pSceneName); |
@@ -915,6 +918,18 @@ int MTPianoKeyboardDesign::_LoadConfFile( | ||
915 | 918 | m_KeyboardMaxDispNum = 0; |
916 | 919 | } |
917 | 920 | |
921 | + //---------------------------------- | |
922 | + //色情報 | |
923 | + //---------------------------------- | |
924 | + //ノート色情報を取得 | |
925 | + for (i = 0; i < 16; i++) { | |
926 | + _stprintf_s(key, 16, _T("Ch-%02d-NoteRGBA"), i+1); | |
927 | + result = confFile.GetStr(key, hexColor, 16, _T("FFFFFFFF")); | |
928 | + if (result != 0) goto EXIT; | |
929 | + | |
930 | + m_NoteColor[i] = DXColorUtil::MakeColorFromHexRGBA(hexColor); | |
931 | + } | |
932 | + | |
918 | 933 | EXIT:; |
919 | 934 | return result; |
920 | 935 | } |
@@ -120,7 +120,7 @@ public: | ||
120 | 120 | D3DXCOLOR GetBlackKeyColor(); |
121 | 121 | |
122 | 122 | //発音中キーカラー取得 |
123 | - D3DXCOLOR GetActiveKeyColor(unsigned char noteNo, unsigned long elapsedTime); | |
123 | + D3DXCOLOR GetActiveKeyColor(unsigned char chNo, unsigned char noteNo, unsigned long elapsedTime); | |
124 | 124 | |
125 | 125 | //白鍵テクスチャ座標取得 |
126 | 126 | void GetWhiteKeyTexturePosTop( |
@@ -221,6 +221,7 @@ private: | ||
221 | 221 | D3DXCOLOR m_BlackKeyColor; |
222 | 222 | |
223 | 223 | //発音中キー色情報 |
224 | + D3DXCOLOR m_NoteColor[16]; | |
224 | 225 | D3DXCOLOR m_ActiveKeyColor; |
225 | 226 | int m_ActiveKeyColorDuration; |
226 | 227 | float m_ActiveKeyColorTailRate; |
@@ -104,6 +104,10 @@ int MTScenePianoRoll3D::Create( | ||
104 | 104 | result = m_NotePitchBend.Initialize(); |
105 | 105 | if (result != 0) goto EXIT; |
106 | 106 | |
107 | + //ピアノキーボード制御 | |
108 | + result = m_PianoKeyboardCtrl.Create(pD3DDevice, GetName(), pSeqData, &m_NotePitchBend); | |
109 | + if (result != 0) goto EXIT; | |
110 | + | |
107 | 111 | //ノートボックス生成 |
108 | 112 | result = m_NoteBox.Create(pD3DDevice, GetName(), pSeqData, &m_NotePitchBend); |
109 | 113 | if (result != 0) goto EXIT; |
@@ -119,6 +123,7 @@ int MTScenePianoRoll3D::Create( | ||
119 | 123 | //ピクチャボード生成 |
120 | 124 | result = m_PictBoard.Create(pD3DDevice, GetName(), pSeqData); |
121 | 125 | if (result != 0) goto EXIT; |
126 | + m_PictBoard.SetEnable(false); | |
122 | 127 | |
123 | 128 | //ダッシュボード生成 |
124 | 129 | result = m_Dashboard.Create(pD3DDevice, GetName(), pSeqData, hWnd); |
@@ -182,6 +187,10 @@ int MTScenePianoRoll3D::Transform( | ||
182 | 187 | //回転角度取得 |
183 | 188 | rollAngle = m_FirstPersonCam.GetManualRollAngle(); |
184 | 189 | |
190 | + //ピアノキーボード更新 | |
191 | + result = m_PianoKeyboardCtrl.Transform(pD3DDevice, rollAngle); | |
192 | + if (result != 0) goto EXIT; | |
193 | + | |
185 | 194 | //ノートボックス更新 |
186 | 195 | result = m_NoteBox.Transform(pD3DDevice, rollAngle); |
187 | 196 | if (result != 0) goto EXIT; |
@@ -244,6 +253,10 @@ int MTScenePianoRoll3D::Draw( | ||
244 | 253 | result = m_PictBoard.Draw(pD3DDevice); |
245 | 254 | if (result != 0) goto EXIT; |
246 | 255 | |
256 | + //ピアノキーボード描画 | |
257 | + result = m_PianoKeyboardCtrl.Draw(pD3DDevice); | |
258 | + if (result != 0) goto EXIT; | |
259 | + | |
247 | 260 | //星描画 |
248 | 261 | result = m_Stars.Draw(pD3DDevice); |
249 | 262 | if (result != 0) goto EXIT; |
@@ -269,6 +282,7 @@ EXIT:; | ||
269 | 282 | //****************************************************************************** |
270 | 283 | void MTScenePianoRoll3D::Release() |
271 | 284 | { |
285 | + m_PianoKeyboardCtrl.Release(); | |
272 | 286 | m_NoteBox.Release(); |
273 | 287 | m_GridBox.Release(); |
274 | 288 | m_PictBoard.Release(); |
@@ -369,7 +383,9 @@ int MTScenePianoRoll3D::OnRecvSequencerMsg( | ||
369 | 383 | } |
370 | 384 | //演奏チックタイム通知 |
371 | 385 | else if (parser.GetMsg() == SMMsgParser::MsgPlayTime) { |
372 | - m_Dashboard.SetPlayTimeSec(parser.GetPlayTimeSec()); | |
386 | + m_Dashboard.SetPlayTimeSec(parser.GetPlayTimeMSec()); | |
387 | + m_PianoKeyboardCtrl.SetPlayTimeMSec(parser.GetPlayTimeMSec()); | |
388 | + m_PianoKeyboardCtrl.SetCurTickTime(parser.GetPlayTickTime()); | |
373 | 389 | m_FirstPersonCam.SetCurTickTime(parser.GetPlayTickTime()); |
374 | 390 | m_TimeIndicator.SetCurTickTime(parser.GetPlayTickTime()); |
375 | 391 | m_NoteRipple.SetCurTickTime(parser.GetPlayTickTime()); |
@@ -406,6 +422,8 @@ int MTScenePianoRoll3D::OnRecvSequencerMsg( | ||
406 | 422 | if (parser.GetSkipStartDirection() == SMMsgParser::SkipBack) { |
407 | 423 | m_NotePitchBend.Reset(); |
408 | 424 | } |
425 | + m_PianoKeyboardCtrl.Reset(); | |
426 | + m_PianoKeyboardCtrl.SetSkipStatus(true); | |
409 | 427 | m_NoteBox.Reset(); |
410 | 428 | m_NoteBox.SetSkipStatus(true); |
411 | 429 | m_NoteRipple.Reset(); |
@@ -415,6 +433,7 @@ int MTScenePianoRoll3D::OnRecvSequencerMsg( | ||
415 | 433 | //スキップ終了通知 |
416 | 434 | else if (parser.GetMsg() == SMMsgParser::MsgSkipEnd) { |
417 | 435 | m_Dashboard.SetNotesCount(parser.GetSkipEndNotesCount()); |
436 | + m_PianoKeyboardCtrl.SetSkipStatus(false); | |
418 | 437 | m_NoteBox.SetSkipStatus(false); |
419 | 438 | m_NoteRipple.SetSkipStatus(false); |
420 | 439 | m_IsSkipping = false; |
@@ -446,6 +465,7 @@ void MTScenePianoRoll3D::_Reset() | ||
446 | 465 | { |
447 | 466 | m_Dashboard.Reset(); |
448 | 467 | m_FirstPersonCam.Reset(); |
468 | + m_PianoKeyboardCtrl.Reset(); | |
449 | 469 | m_TimeIndicator.Reset(); |
450 | 470 | m_PictBoard.Reset(); |
451 | 471 | m_NoteBox.Reset(); |
@@ -627,7 +647,8 @@ void MTScenePianoRoll3D::SetEffect( | ||
627 | 647 | { |
628 | 648 | switch (type) { |
629 | 649 | case EffectPianoKeyboard: |
630 | - m_PictBoard.SetEnable(isEnable); | |
650 | + m_PianoKeyboardCtrl.SetEnable(isEnable); | |
651 | + //m_PictBoard.SetEnable(isEnable); | |
631 | 652 | break; |
632 | 653 | case EffectRipple: |
633 | 654 | m_NoteRipple.SetEnable(isEnable); |
@@ -23,6 +23,7 @@ | ||
23 | 23 | #include "MTPictBoard.h" |
24 | 24 | #include "MTDashboard.h" |
25 | 25 | #include "MTStars.h" |
26 | +#include "MTPianoKeyboardCtrl.h" | |
26 | 27 | #include "MTTimeIndicator.h" |
27 | 28 | #include "SMIDILib.h" |
28 | 29 |
@@ -118,6 +119,8 @@ private: | ||
118 | 119 | MTStars m_Stars; |
119 | 120 | MTTimeIndicator m_TimeIndicator; |
120 | 121 | |
122 | + MTPianoKeyboardCtrl m_PianoKeyboardCtrl; | |
123 | + | |
121 | 124 | //マウス視線移動モード |
122 | 125 | bool m_IsMouseCamMode; |
123 | 126 |
@@ -326,7 +326,7 @@ int MTScenePianoRollRain::OnRecvSequencerMsg( | ||
326 | 326 | } |
327 | 327 | //演奏チックタイム通知 |
328 | 328 | else if (parser.GetMsg() == SMMsgParser::MsgPlayTime) { |
329 | - m_Dashboard.SetPlayTimeSec(parser.GetPlayTimeSec()); | |
329 | + m_Dashboard.SetPlayTimeSec(parser.GetPlayTimeMSec()); | |
330 | 330 | m_PianoKeyboardCtrl.SetPlayTimeMSec(parser.GetPlayTimeMSec()); |
331 | 331 | m_NoteRain.SetCurTickTime(parser.GetPlayTickTime()); |
332 | 332 | m_CurTickTime = parser.GetPlayTickTime(); |
@@ -578,7 +578,7 @@ int SMSequencer::_UpdatePlayPosition() | ||
578 | 578 | m_MsgTrans.PostPlayTime((unsigned long)(m_CurPlayTime/1000000), m_TotalTickTimeTemp); |
579 | 579 | //通知間隔は60FPS表示を考慮して0.01秒(10msec = 10000000nanosec)とする |
580 | 580 | //TODO: 外部から間隔を指定できるようにする |
581 | - ntcSpan = 10 * 1000000;; | |
581 | + ntcSpan = (unsigned long long)((double)10 * 1000000 * m_PlaySpeedRatio); | |
582 | 582 | m_NextNtcTime = m_CurPlayTime - (m_CurPlayTime % ntcSpan) + ntcSpan; |
583 | 583 | } |
584 | 584 |