• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
Aucun tag

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

MIDITrail をピカピカにする。鍵盤方向自動切替・多ポート・歌詞対応等


Commit MetaInfo

Révision20576ea56ba8bb740850f57a37aa4c1dc5ba0c11 (tree)
l'heure2016-10-30 12:39:33
Auteuryoshy <yoshy@user...>
Commiteryoshy

Message de Log

[UPDATE] 2D/3D ビューの鍵盤を動くようにした
[UPDATE] 時間をミリ秒表示に修正
[FIX] ウィンドウ背景のブラシを黒固定に変更(背景が時々真っ白になるので)

Change Summary

Modification

--- a/MIDITrail/MIDITrail.rc
+++ b/MIDITrail/MIDITrail.rc
@@ -120,7 +120,7 @@ FONT 8, "MS Shell Dlg", 400, 0, 0x1
120120 BEGIN
121121 ICON IDI_MIDITRAIL,IDC_STATIC,74,12,20,20
122122 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
124124 CTEXT "Copyright (C) 2010-2012 WADA Masashi",IDC_STATIC,1,84,168,8
125125 DEFPUSHBUTTON "OK",IDOK,58,108,53,14,WS_GROUP
126126 END
@@ -294,7 +294,7 @@ END
294294
295295 STRINGTABLE
296296 BEGIN
297- IDS_APP_TITLE "MIDITrail"
297+ IDS_APP_TITLE "MIDITrail 1.2.0 mod. yossiepon_20120318"
298298 IDC_MIDITRAIL "MIDITRAIL"
299299 END
300300
--- a/MIDITrail/MIDITrailApp.cpp
+++ b/MIDITrail/MIDITrailApp.cpp
@@ -284,7 +284,7 @@ int MIDITrailApp::_RegisterClass(
284284 wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MIDITRAIL));
285285 //アイコンリソースハンドル
286286 wcex.hCursor = LoadCursor(NULL, IDC_ARROW); //カーソルリソースハンドル
287- wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //背景用ブラシハンドル
287+ wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); //(COLOR_WINDOW+1); //背景用ブラシハンドル
288288 wcex.lpszMenuName = MAKEINTRESOURCE(IDC_MIDITRAIL); //メニューリソース名称
289289 wcex.lpszClassName = m_WndClassName; //ウィンドウクラス名称
290290 wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
@@ -1866,7 +1866,7 @@ int MIDITrailApp::_ChangeMenuStyle()
18661866 { MF_GRAYED, MF_GRAYED, MF_GRAYED, MF_GRAYED, MF_GRAYED, MF_ENABLED }, //IDM_STOP_MONITORING
18671867 { MF_ENABLED, MF_ENABLED, MF_GRAYED, MF_GRAYED, MF_ENABLED, MF_GRAYED }, //IDM_VIEW_3DPIAMF_GRAYEDROLL
18681868 { 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
18701870 { MF_GRAYED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_RESET_VIEWPOINT
18711871 { MF_GRAYED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_SAVE_VIEWPOINT
18721872 { MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_ENABLE_PIAMF_GRAYEDKEYBOAR
--- a/MIDITrail/MTDashboard.cpp
+++ b/MIDITrail/MTDashboard.cpp
@@ -111,7 +111,7 @@ int MTDashboard::Create(
111111 m_Counter.SetColor(m_CaptionColor);
112112
113113 //全体演奏時間
114- SetTotalPlayTimeSec(pSeqData->GetTotalPlayTime()/1000);
114+ SetTotalPlayTimeSec(pSeqData->GetTotalPlayTime());
115115
116116 //テンポ(BPM)
117117 SetTempoBPM(pSeqData->GetTempoBPM());
@@ -365,11 +365,13 @@ int MTDashboard::_GetCounterStr(
365365 eresult = _stprintf_s(
366366 pStr,
367367 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,
373375 m_TempoBPM,
374376 m_BeatNumerator,
375377 m_BeatDenominator,
--- a/MIDITrail/MTDashboard.h
+++ b/MIDITrail/MTDashboard.h
@@ -30,13 +30,13 @@ using namespace SMIDILib;
3030 #define MTDASHBOARD_FONTSIZE (40)
3131
3232 //カウンタキャプション文字列
33-#define MTDASHBOARD_COUNTER_CHARS _T("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:/% ")
33+#define MTDASHBOARD_COUNTER_CHARS _T("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:./% ")
3434
3535 //カウンタキャプションサイズ
3636 // 12345678901234567890123456789012345678901234567890123456789012345678901234 (74)
3737 // "TIME:00:00/00:00 BPM:000 BEAT:4/4 BAR:000/000 NOTES:00000/00000 SPEED:000%"
3838 // 余裕をみて80にしておく
39-#define MTDASHBOARD_COUNTER_SIZE (80)
39+#define MTDASHBOARD_COUNTER_SIZE (92)
4040
4141 //枠サイズ(ピクセル)
4242 #define MTDASHBOARD_FRAMESIZE (5.0f)
--- a/MIDITrail/MTPianoKeyboard.cpp
+++ b/MIDITrail/MTPianoKeyboard.cpp
@@ -1540,32 +1540,58 @@ void MTPianoKeyboard::_MakeMaterial(
15401540 //******************************************************************************
15411541 int MTPianoKeyboard::Transform(
15421542 LPDIRECT3DDEVICE9 pD3DDevice,
1543- D3DXVECTOR3 moveVector,
1543+ D3DXVECTOR3 moveVector1,
1544+ D3DXVECTOR3 moveVector2,
1545+ float scale,
1546+ float z,
15441547 float rollAngle
15451548 )
15461549 {
15471550 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;
15511560
15521561 //行列初期化
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);
15561570
15571571 //回転行列
1558- D3DXMatrixRotationY(&rotateMatrix, D3DXToRadian(rollAngle));
1572+ D3DXMatrixRotationX(&rotateMatrix1, D3DXToRadian(-90.0f));
1573+ D3DXMatrixRotationZ(&rotateMatrix2, D3DXToRadian(90.0f));
1574+ D3DXMatrixRotationX(&rotateMatrix3, D3DXToRadian(rollAngle));
15591575
15601576 //移動行列
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);
15621580
1563- //行列の合成:移動→回転
1581+ //スケール行列
1582+ D3DXMatrixScaling(&scaleMatrix, scale, scale, scale);
1583+
1584+ //行列の合成:ピッチベンド移動1→鍵盤向き補正回転1・2→ホイール回転3→スケール→再生面追従移動2
15641585 //ピッチベンドによるシフトを先に適用してから回転する
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);
15661592
15671593 //変換行列設定
1568- m_PrimitiveKeyboard.Transform(worldMatrix);
1594+ m_PrimitiveKeyboard.Transform(worldMatrix2);
15691595
15701596 //EXIT:;
15711597 return result;
@@ -1596,6 +1622,7 @@ EXIT:;
15961622 // キーの押し込み
15971623 //******************************************************************************
15981624 int MTPianoKeyboard::PushKey(
1625+ unsigned char chNo,
15991626 unsigned char noteNo,
16001627 float keyDownRate,
16011628 unsigned long elapsedTime
@@ -1618,7 +1645,7 @@ int MTPianoKeyboard::PushKey(
16181645 }
16191646 else {
16201647 //キーが押下状態の場合は色を変更して回転させる
1621- color = m_KeyboardDesign.GetActiveKeyColor(noteNo, elapsedTime);
1648+ color = m_KeyboardDesign.GetActiveKeyColor(chNo, noteNo, elapsedTime);
16221649 _RotateKey(noteNo, angle, &color);
16231650 }
16241651
--- a/MIDITrail/MTPianoKeyboard.h
+++ b/MIDITrail/MTPianoKeyboard.h
@@ -43,7 +43,7 @@ public:
4343 );
4444
4545 //更新
46- int Transform(LPDIRECT3DDEVICE9 pD3DDevice, D3DXVECTOR3 moveVector, float rollAngle);
46+ int Transform(LPDIRECT3DDEVICE9 pD3DDevice, D3DXVECTOR3 moveVector1, D3DXVECTOR3 moveVector2, float scale, float z, float rollAngle);
4747
4848 //描画
4949 int Draw(LPDIRECT3DDEVICE9 pD3DDevice);
@@ -53,7 +53,7 @@ public:
5353
5454 //キー状態変更
5555 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);
5757
5858 //共有用テクスチャ取得
5959 LPDIRECT3DTEXTURE9 GetTexture();
--- a/MIDITrail/MTPianoKeyboardCtrl.cpp
+++ b/MIDITrail/MTPianoKeyboardCtrl.cpp
@@ -173,26 +173,44 @@ int MTPianoKeyboardCtrl::Transform(
173173 int result = 0;
174174 unsigned char portNo = 0;
175175 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;
177182
178183 //現在発音中ノートの頂点更新
179184 result = _TransformActiveNotes(pD3DDevice);
180185 if (result != 0) goto EXIT;
181186
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+
182199 //各キーボードの移動
183200 for (chNo = 0; chNo < SM_MAX_CH_NUM; chNo++) {
184201
185202 //移動ベクトル:キーボード基準座標
186- moveVector = m_KeyboardDesign.GetKeyboardBasePos(portNo, chNo);
203+ moveVector1 = m_KeyboardDesign.GetKeyboardBasePos(portNo, chNo);
187204
188205 //移動ベクトル:ピッチベンドシフトを反映
189- moveVector.x += _GetPichBendShiftPosX(portNo, chNo);
206+ moveVector1.x += _GetPichBendShiftPosX(portNo, chNo);
190207
191208 //移動ベクトル:再生面に追従する
192- moveVector.y += m_NoteDesign.GetPlayPosX(m_CurTickTime);
209+ moveVector2 = m_NoteDesign.GetWorldMoveVector();
210+ moveVector2.x += m_NoteDesign.GetPlayPosX(m_CurTickTime);
193211
194212 //キーボード移動
195- result = m_pPianoKeyboard[chNo]->Transform(pD3DDevice, moveVector, rollAngle);
213+ result = m_pPianoKeyboard[chNo]->Transform(pD3DDevice, moveVector1, moveVector2, boardHeight / keyboardWidth, vectorLU.z, rollAngle);
196214 if (result != 0) goto EXIT;
197215 }
198216
@@ -368,7 +386,7 @@ int MTPianoKeyboardCtrl::_UpdateNoteStatus(
368386 //ノート情報を破棄
369387 //TODO: 複数ポート対応
370388 if (note.portNo == 0) {
371- result = m_pPianoKeyboard[note.chNo]->ResetKey(note.noteNo);
389+ result = m_pPianoKeyboard[0]->ResetKey(note.noteNo);
372390 if (result != 0) goto EXIT;
373391 }
374392 pNoteStatus->isActive = false;
@@ -414,7 +432,8 @@ int MTPianoKeyboardCtrl::_UpdateVertexOfActiveNotes(
414432 // TODO: 複数ポート対応
415433 if ((note.portNo == 0)
416434 && (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,
418437 note.noteNo,
419438 m_pNoteStatus[i].keyDownRate,
420439 elapsedTime
@@ -444,7 +463,7 @@ int MTPianoKeyboardCtrl::Draw(
444463 if (!m_isEnable) goto EXIT;
445464
446465 //キーボード最大表示数
447- dispNum = SM_MAX_CH_NUM;
466+ dispNum = 1; //SM_MAX_CH_NUM;
448467 if (m_KeyboardDesign.GetKeyboardMaxDispNum() < dispNum) {
449468 dispNum = m_KeyboardDesign.GetKeyboardMaxDispNum();
450469 }
@@ -544,7 +563,7 @@ void MTPianoKeyboardCtrl::Reset()
544563
545564 //TODO: 複数ポート対応
546565 if (note.portNo == 0) {
547- result = m_pPianoKeyboard[note.chNo]->ResetKey(note.noteNo);
566+ result = m_pPianoKeyboard[0]->ResetKey(note.noteNo);
548567 //if (result != 0) goto EXIT;
549568 }
550569 }
--- a/MIDITrail/MTPianoKeyboardCtrlLive.cpp
+++ b/MIDITrail/MTPianoKeyboardCtrlLive.cpp
@@ -141,26 +141,44 @@ int MTPianoKeyboardCtrlLive::Transform(
141141 int result = 0;
142142 unsigned char portNo = 0;
143143 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;
145150
146151 //現在発音中ノートの頂点更新
147152 result = _TransformActiveNotes(pD3DDevice);
148153 if (result != 0) goto EXIT;
149154
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+
150167 //各キーボードの移動
151168 for (chNo = 0; chNo < SM_MAX_CH_NUM; chNo++) {
152169
153170 //移動ベクトル:キーボード基準座標
154- moveVector = m_KeyboardDesign.GetKeyboardBasePos(portNo, chNo);
171+ moveVector1 = m_KeyboardDesign.GetKeyboardBasePos(portNo, chNo);
155172
156173 //移動ベクトル:ピッチベンドシフトを反映
157- moveVector.x += _GetPichBendShiftPosX(portNo, chNo);
174+ moveVector1.x += _GetPichBendShiftPosX(portNo, chNo);
158175
159176 //移動ベクトル:再生面に追従する
160- //moveVector.y += m_NoteDesign.GetPlayPosX(m_CurTickTime);
177+ moveVector2 = m_NoteDesign.GetWorldMoveVector();
178+ //moveVector2.x += m_NoteDesign.GetPlayPosX(m_CurTickTime);
161179
162180 //キーボード移動
163- result = m_pPianoKeyboard[chNo]->Transform(pD3DDevice, moveVector, rollAngle);
181+ result = m_pPianoKeyboard[chNo]->Transform(pD3DDevice, moveVector1, moveVector2, boardHeight / keyboardWidth, vectorLU.z, rollAngle);
164182 if (result != 0) goto EXIT;
165183 }
166184
@@ -218,12 +236,12 @@ int MTPianoKeyboardCtrlLive::_UpdateStatusOfActiveNotes(
218236 m_NoteStatus[chNo][noteNo].startTime = 0;
219237 m_NoteStatus[chNo][noteNo].endTime = 0;
220238 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);
222240 if (result != 0) goto EXIT;
223241 }
224242 //キー押下率を更新
225243 else {
226- m_NoteStatus[chNo][noteNo].keyDownRate
244+ m_NoteStatus[0][noteNo].keyDownRate
227245 = 1.0f - ((float)(curTime - m_NoteStatus[chNo][noteNo].endTime) / (float)keyUpDuration);
228246 }
229247 }
@@ -257,7 +275,8 @@ int MTPianoKeyboardCtrlLive::_UpdateVertexOfActiveNotes(
257275 elapsedTime = curTime - m_NoteStatus[chNo][noteNo].startTime;
258276
259277 //発音対象キーを回転
260- result = m_pPianoKeyboard[chNo]->PushKey(
278+ result = m_pPianoKeyboard[0]->PushKey(
279+ (unsigned char)chNo,
261280 (unsigned char)noteNo,
262281 m_NoteStatus[chNo][noteNo].keyDownRate,
263282 elapsedTime
@@ -286,7 +305,7 @@ int MTPianoKeyboardCtrlLive::Draw(
286305 if (!m_isEnable) goto EXIT;
287306
288307 //キーボード最大表示数
289- dispNum = SM_MAX_CH_NUM;
308+ dispNum = 1; //SM_MAX_CH_NUM;
290309 if (m_KeyboardDesign.GetKeyboardMaxDispNum() < dispNum) {
291310 dispNum = m_KeyboardDesign.GetKeyboardMaxDispNum();
292311 }
--- a/MIDITrail/MTPianoKeyboardDesign.cpp
+++ b/MIDITrail/MTPianoKeyboardDesign.cpp
@@ -326,7 +326,7 @@ float MTPianoKeyboardDesign::GetPortOriginY(
326326 totalHeight = portHeight * ((float)chNum / (float)SM_MAX_CH_NUM);
327327 originY = (portHeight * portIndex) - (totalHeight / 2.0f);
328328
329- return originY;
329+ return 0; //originY;
330330 }
331331
332332 //******************************************************************************
@@ -378,7 +378,7 @@ float MTPianoKeyboardDesign::GetPortOriginZ(
378378 totalLen = portLen * ((float)chNum / (float)SM_MAX_CH_NUM);
379379 originZ = (portLen * portIndex) - (totalLen / 2.0f);
380380
381- return originZ;
381+ return 0; //originZ;
382382 }
383383
384384 //******************************************************************************
@@ -583,6 +583,7 @@ D3DXCOLOR MTPianoKeyboardDesign::GetBlackKeyColor()
583583 // 発音中キーカラー取得
584584 //******************************************************************************
585585 D3DXCOLOR MTPianoKeyboardDesign::GetActiveKeyColor(
586+ unsigned char chNo,
586587 unsigned char noteNo,
587588 unsigned long elapsedTime
588589 )
@@ -608,7 +609,7 @@ D3DXCOLOR MTPianoKeyboardDesign::GetActiveKeyColor(
608609 // | on : off
609610 // <-->duration
610611
611- color = m_ActiveKeyColor;
612+ color = m_NoteColor[chNo];
612613 duration = (unsigned long)m_ActiveKeyColorDuration;
613614 rate = m_ActiveKeyColorTailRate;
614615
@@ -845,9 +846,9 @@ D3DXVECTOR3 MTPianoKeyboardDesign::GetKeyboardBasePos(
845846 oz = GetPortOriginZ(portNo);
846847
847848 //チャンネルを考慮した配置座標
848- moveVector.x = ox + 0.0f;
849+ moveVector.x = ox + GetWhiteKeyStep() / 2.0f;
849850 moveVector.y = oy + ((float)chNo * m_KeyboardStepY);
850- moveVector.z = oz + ((float)chNo * m_KeyboardStepZ);
851+ moveVector.z = oz; // + ((float)chNo * m_KeyboardStepZ);
851852
852853 return moveVector;
853854 }
@@ -868,7 +869,9 @@ int MTPianoKeyboardDesign::_LoadConfFile(
868869 )
869870 {
870871 int result = 0;
872+ TCHAR key[16] = {_T('\0')};
871873 TCHAR hexColor[16] = {_T('\0')};
874+ unsigned long i = 0;
872875 MTConfFile confFile;
873876
874877 result = confFile.Initialize(pSceneName);
@@ -915,6 +918,18 @@ int MTPianoKeyboardDesign::_LoadConfFile(
915918 m_KeyboardMaxDispNum = 0;
916919 }
917920
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+
918933 EXIT:;
919934 return result;
920935 }
--- a/MIDITrail/MTPianoKeyboardDesign.h
+++ b/MIDITrail/MTPianoKeyboardDesign.h
@@ -120,7 +120,7 @@ public:
120120 D3DXCOLOR GetBlackKeyColor();
121121
122122 //発音中キーカラー取得
123- D3DXCOLOR GetActiveKeyColor(unsigned char noteNo, unsigned long elapsedTime);
123+ D3DXCOLOR GetActiveKeyColor(unsigned char chNo, unsigned char noteNo, unsigned long elapsedTime);
124124
125125 //白鍵テクスチャ座標取得
126126 void GetWhiteKeyTexturePosTop(
@@ -221,6 +221,7 @@ private:
221221 D3DXCOLOR m_BlackKeyColor;
222222
223223 //発音中キー色情報
224+ D3DXCOLOR m_NoteColor[16];
224225 D3DXCOLOR m_ActiveKeyColor;
225226 int m_ActiveKeyColorDuration;
226227 float m_ActiveKeyColorTailRate;
--- a/MIDITrail/MTScenePianoRoll3D.cpp
+++ b/MIDITrail/MTScenePianoRoll3D.cpp
@@ -104,6 +104,10 @@ int MTScenePianoRoll3D::Create(
104104 result = m_NotePitchBend.Initialize();
105105 if (result != 0) goto EXIT;
106106
107+ //ピアノキーボード制御
108+ result = m_PianoKeyboardCtrl.Create(pD3DDevice, GetName(), pSeqData, &m_NotePitchBend);
109+ if (result != 0) goto EXIT;
110+
107111 //ノートボックス生成
108112 result = m_NoteBox.Create(pD3DDevice, GetName(), pSeqData, &m_NotePitchBend);
109113 if (result != 0) goto EXIT;
@@ -119,6 +123,7 @@ int MTScenePianoRoll3D::Create(
119123 //ピクチャボード生成
120124 result = m_PictBoard.Create(pD3DDevice, GetName(), pSeqData);
121125 if (result != 0) goto EXIT;
126+ m_PictBoard.SetEnable(false);
122127
123128 //ダッシュボード生成
124129 result = m_Dashboard.Create(pD3DDevice, GetName(), pSeqData, hWnd);
@@ -182,6 +187,10 @@ int MTScenePianoRoll3D::Transform(
182187 //回転角度取得
183188 rollAngle = m_FirstPersonCam.GetManualRollAngle();
184189
190+ //ピアノキーボード更新
191+ result = m_PianoKeyboardCtrl.Transform(pD3DDevice, rollAngle);
192+ if (result != 0) goto EXIT;
193+
185194 //ノートボックス更新
186195 result = m_NoteBox.Transform(pD3DDevice, rollAngle);
187196 if (result != 0) goto EXIT;
@@ -244,6 +253,10 @@ int MTScenePianoRoll3D::Draw(
244253 result = m_PictBoard.Draw(pD3DDevice);
245254 if (result != 0) goto EXIT;
246255
256+ //ピアノキーボード描画
257+ result = m_PianoKeyboardCtrl.Draw(pD3DDevice);
258+ if (result != 0) goto EXIT;
259+
247260 //星描画
248261 result = m_Stars.Draw(pD3DDevice);
249262 if (result != 0) goto EXIT;
@@ -269,6 +282,7 @@ EXIT:;
269282 //******************************************************************************
270283 void MTScenePianoRoll3D::Release()
271284 {
285+ m_PianoKeyboardCtrl.Release();
272286 m_NoteBox.Release();
273287 m_GridBox.Release();
274288 m_PictBoard.Release();
@@ -369,7 +383,9 @@ int MTScenePianoRoll3D::OnRecvSequencerMsg(
369383 }
370384 //演奏チックタイム通知
371385 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());
373389 m_FirstPersonCam.SetCurTickTime(parser.GetPlayTickTime());
374390 m_TimeIndicator.SetCurTickTime(parser.GetPlayTickTime());
375391 m_NoteRipple.SetCurTickTime(parser.GetPlayTickTime());
@@ -406,6 +422,8 @@ int MTScenePianoRoll3D::OnRecvSequencerMsg(
406422 if (parser.GetSkipStartDirection() == SMMsgParser::SkipBack) {
407423 m_NotePitchBend.Reset();
408424 }
425+ m_PianoKeyboardCtrl.Reset();
426+ m_PianoKeyboardCtrl.SetSkipStatus(true);
409427 m_NoteBox.Reset();
410428 m_NoteBox.SetSkipStatus(true);
411429 m_NoteRipple.Reset();
@@ -415,6 +433,7 @@ int MTScenePianoRoll3D::OnRecvSequencerMsg(
415433 //スキップ終了通知
416434 else if (parser.GetMsg() == SMMsgParser::MsgSkipEnd) {
417435 m_Dashboard.SetNotesCount(parser.GetSkipEndNotesCount());
436+ m_PianoKeyboardCtrl.SetSkipStatus(false);
418437 m_NoteBox.SetSkipStatus(false);
419438 m_NoteRipple.SetSkipStatus(false);
420439 m_IsSkipping = false;
@@ -446,6 +465,7 @@ void MTScenePianoRoll3D::_Reset()
446465 {
447466 m_Dashboard.Reset();
448467 m_FirstPersonCam.Reset();
468+ m_PianoKeyboardCtrl.Reset();
449469 m_TimeIndicator.Reset();
450470 m_PictBoard.Reset();
451471 m_NoteBox.Reset();
@@ -627,7 +647,8 @@ void MTScenePianoRoll3D::SetEffect(
627647 {
628648 switch (type) {
629649 case EffectPianoKeyboard:
630- m_PictBoard.SetEnable(isEnable);
650+ m_PianoKeyboardCtrl.SetEnable(isEnable);
651+ //m_PictBoard.SetEnable(isEnable);
631652 break;
632653 case EffectRipple:
633654 m_NoteRipple.SetEnable(isEnable);
--- a/MIDITrail/MTScenePianoRoll3D.h
+++ b/MIDITrail/MTScenePianoRoll3D.h
@@ -23,6 +23,7 @@
2323 #include "MTPictBoard.h"
2424 #include "MTDashboard.h"
2525 #include "MTStars.h"
26+#include "MTPianoKeyboardCtrl.h"
2627 #include "MTTimeIndicator.h"
2728 #include "SMIDILib.h"
2829
@@ -118,6 +119,8 @@ private:
118119 MTStars m_Stars;
119120 MTTimeIndicator m_TimeIndicator;
120121
122+ MTPianoKeyboardCtrl m_PianoKeyboardCtrl;
123+
121124 //マウス視線移動モード
122125 bool m_IsMouseCamMode;
123126
--- a/MIDITrail/MTScenePianoRollRain.cpp
+++ b/MIDITrail/MTScenePianoRollRain.cpp
@@ -326,7 +326,7 @@ int MTScenePianoRollRain::OnRecvSequencerMsg(
326326 }
327327 //演奏チックタイム通知
328328 else if (parser.GetMsg() == SMMsgParser::MsgPlayTime) {
329- m_Dashboard.SetPlayTimeSec(parser.GetPlayTimeSec());
329+ m_Dashboard.SetPlayTimeSec(parser.GetPlayTimeMSec());
330330 m_PianoKeyboardCtrl.SetPlayTimeMSec(parser.GetPlayTimeMSec());
331331 m_NoteRain.SetCurTickTime(parser.GetPlayTickTime());
332332 m_CurTickTime = parser.GetPlayTickTime();
--- a/SMIDILib/SMSequencer.cpp
+++ b/SMIDILib/SMSequencer.cpp
@@ -578,7 +578,7 @@ int SMSequencer::_UpdatePlayPosition()
578578 m_MsgTrans.PostPlayTime((unsigned long)(m_CurPlayTime/1000000), m_TotalTickTimeTemp);
579579 //通知間隔は60FPS表示を考慮して0.01秒(10msec = 10000000nanosec)とする
580580 //TODO: 外部から間隔を指定できるようにする
581- ntcSpan = 10 * 1000000;;
581+ ntcSpan = (unsigned long long)((double)10 * 1000000 * m_PlaySpeedRatio);
582582 m_NextNtcTime = m_CurPlayTime - (m_CurPlayTime % ntcSpan) + ntcSpan;
583583 }
584584