MIDITrail をピカピカにする。鍵盤方向自動切替・多ポート・歌詞対応等
修订版 | 00a3959409870e880cd041c6feb6e87c2e238612 (tree) |
---|---|
时间 | 2018-04-12 08:44:04 |
作者 | yoshy <yoshy@user...> |
Commiter | yoshy |
[FIX] 多ポートのシーケンスでPianoRoll2Dのキーボードが1つに集約されない不具合を修正
@@ -365,15 +365,11 @@ int MTNoteBoxMod::_UpdateVertexOfActiveNotes( | ||
365 | 365 | ); |
366 | 366 | if (result != 0) goto EXIT; |
367 | 367 | |
368 | - //発音中ノートがピッチベンドで移動する場合 | |
369 | 368 | //発音終了までオリジナルのノートを非表示にする |
370 | 369 | if (!(m_pNoteStatusMod[i].isHide)) { |
371 | - if ((m_pNotePitchBend->GetValue(note.portNo, note.chNo) != 0) | |
372 | - && (m_pNotePitchBend->GetSensitivity(note.portNo, note.chNo) != 0)) { | |
373 | - result = _HideNoteBox(m_pNoteStatusMod[i].index); | |
374 | - if (result != 0) goto EXIT; | |
375 | - m_pNoteStatusMod[i].isHide = true; | |
376 | - } | |
370 | + result = _HideNoteBox(m_pNoteStatusMod[i].index); | |
371 | + if (result != 0) goto EXIT; | |
372 | + m_pNoteStatusMod[i].isHide = true; | |
377 | 373 | } |
378 | 374 | |
379 | 375 | activeNoteNum++; |
@@ -29,7 +29,7 @@ using namespace YNBaseLib; | ||
29 | 29 | //****************************************************************************** |
30 | 30 | MTPianoKeyboardCtrlMod::MTPianoKeyboardCtrlMod(void) |
31 | 31 | { |
32 | - m_MaxPortIndex = 0; | |
32 | + m_MaxKeyboardIndex = 0; | |
33 | 33 | ZeroMemory(m_KeyDownRateMod, sizeof(float) * SM_MAX_CH_NUM* SM_MAX_CH_NUM * SM_MAX_NOTE_NUM); |
34 | 34 | } |
35 | 35 |
@@ -54,7 +54,7 @@ int MTPianoKeyboardCtrlMod::Create( | ||
54 | 54 | { |
55 | 55 | int result = 0; |
56 | 56 | unsigned long index = 0; |
57 | - unsigned long portIndex = 0; | |
57 | + unsigned long keyboardIndex = 0; | |
58 | 58 | unsigned char portNo = 0; |
59 | 59 | SMTrack track; |
60 | 60 |
@@ -77,20 +77,32 @@ int MTPianoKeyboardCtrlMod::Create( | ||
77 | 77 | result = pSeqData->GetPortList(&m_PortList); |
78 | 78 | if (result != 0) goto EXIT; |
79 | 79 | |
80 | - //ポート番号に昇順のインデックスを振る | |
81 | - //ポート 0番 3番 5番 に出力する場合のインデックスはそれぞれ 0, 1, 2 | |
82 | 80 | for (index = 0; index < SM_MAX_PORT_NUM; index++) { |
83 | - m_PortIndex[index] = -1; | |
81 | + m_KeyboardIndex[index] = -1; | |
84 | 82 | } |
85 | - for (index = 0; index < m_PortList.GetSize(); index++) { | |
86 | - m_PortList.GetPort(index, &portNo); | |
87 | - m_PortIndex[portNo] = portIndex; | |
88 | - portIndex++; | |
89 | - if(portIndex == m_KeyboardDesignMod.GetKeyboardMaxDispNum()){ | |
90 | - break; | |
83 | + | |
84 | + //シングルキーボードでない場合 | |
85 | + if (!isSingleKeyboard) { | |
86 | + //ポート番号に昇順のキーボードインデックスを振る | |
87 | + //ポート 0番 3番 5番 に出力する場合のインデックスはそれぞれ 0, 1, 2 | |
88 | + for (index = 0; index < m_PortList.GetSize(); index++) { | |
89 | + m_PortList.GetPort(index, &portNo); | |
90 | + m_KeyboardIndex[portNo] = keyboardIndex; | |
91 | + keyboardIndex++; | |
92 | + if(keyboardIndex == m_KeyboardDesignMod.GetKeyboardMaxDispNum()){ | |
93 | + break; | |
94 | + } | |
91 | 95 | } |
96 | + m_MaxKeyboardIndex = (unsigned char)keyboardIndex; | |
97 | + } | |
98 | + //シングルキーボードの場合 | |
99 | + else { | |
100 | + //キーボードデザインをシングルモードに設定 | |
101 | + m_KeyboardDesignMod.SetKeyboardSingle(); | |
102 | + //ポートとキーボードの対応を1:1に固定 | |
103 | + m_KeyboardIndex[0] = 0; | |
104 | + m_MaxKeyboardIndex = 1; | |
92 | 105 | } |
93 | - m_MaxPortIndex = (unsigned char)portIndex; | |
94 | 106 | |
95 | 107 | //トラック取得 |
96 | 108 | result = pSeqData->GetMergedTrack(&track); |
@@ -112,7 +124,6 @@ int MTPianoKeyboardCtrlMod::Create( | ||
112 | 124 | m_pNotePitchBend = pNotePitchBend; |
113 | 125 | |
114 | 126 | //シングルキーボードフラグ |
115 | - //※フラグを受け取っても使用しない。ポート別シングルキーボードで常に動作する | |
116 | 127 | m_isSingleKeyboard = isSingleKeyboard; |
117 | 128 | |
118 | 129 | EXIT:; |
@@ -129,23 +140,23 @@ int MTPianoKeyboardCtrlMod::_CreateKeyboards( | ||
129 | 140 | ) |
130 | 141 | { |
131 | 142 | int result = 0; |
132 | - unsigned char portIndex = 0; | |
143 | + unsigned char index = 0; | |
133 | 144 | LPDIRECT3DTEXTURE9 pTexture = NULL; |
134 | 145 | |
135 | - for (portIndex = 0; portIndex < m_MaxPortIndex; portIndex++) { | |
146 | + for (index = 0; index < m_MaxKeyboardIndex; index++) { | |
136 | 147 | try { |
137 | - m_pPianoKeyboard[portIndex] = new MTPianoKeyboardMod; | |
148 | + m_pPianoKeyboard[index] = new MTPianoKeyboardMod; | |
138 | 149 | } |
139 | 150 | catch (std::bad_alloc) { |
140 | 151 | result = YN_SET_ERR("Could not allocate memory.", 0, 0); |
141 | 152 | goto EXIT; |
142 | 153 | } |
143 | 154 | |
144 | - result = m_pPianoKeyboard[portIndex]->Create(pD3DDevice, pSceneName, pSeqData, pTexture); | |
155 | + result = m_pPianoKeyboard[index]->Create(pD3DDevice, pSceneName, pSeqData, pTexture); | |
145 | 156 | if (result != 0) goto EXIT; |
146 | 157 | |
147 | 158 | //先頭オブジェクトで作成したテクスチャを再利用する |
148 | - pTexture = m_pPianoKeyboard[portIndex]->GetTexture(); | |
159 | + pTexture = m_pPianoKeyboard[index]->GetTexture(); | |
149 | 160 | } |
150 | 161 | |
151 | 162 | EXIT:; |
@@ -163,12 +174,18 @@ int MTPianoKeyboardCtrlMod::Transform( | ||
163 | 174 | int result = 0; |
164 | 175 | unsigned char portNo = 0; |
165 | 176 | unsigned char chNo = 0; |
166 | - D3DXVECTOR3 vectorLU; | |
167 | - D3DXVECTOR3 vectorRU; | |
168 | - D3DXVECTOR3 vectorLD; | |
169 | - D3DXVECTOR3 vectorRD; | |
170 | - D3DXVECTOR3 moveVector1; | |
171 | - D3DXVECTOR3 moveVector2; | |
177 | + int index; | |
178 | + D3DXVECTOR3 portWindowLU; | |
179 | + D3DXVECTOR3 portWindowRU; | |
180 | + D3DXVECTOR3 portWindowLD; | |
181 | + D3DXVECTOR3 portWindowRD; | |
182 | + D3DXVECTOR3 transformVector; | |
183 | + D3DXVECTOR3 playbackPosVector; | |
184 | + | |
185 | + //アクティブポートフラグクリア | |
186 | + for (index = 0; index < SM_MAX_PORT_NUM; index++) { | |
187 | + m_isActivePort[index] = false; | |
188 | + } | |
172 | 189 | |
173 | 190 | //現在発音中ノートの頂点更新 |
174 | 191 | result = _TransformActiveNotes(pD3DDevice); |
@@ -177,93 +194,87 @@ int MTPianoKeyboardCtrlMod::Transform( | ||
177 | 194 | //再生面頂点座標取得 |
178 | 195 | m_NoteDesignMod.GetPlaybackSectionVirtexPos( |
179 | 196 | 0, |
180 | - &vectorLU, | |
181 | - &vectorRU, | |
182 | - &vectorLD, | |
183 | - &vectorRD | |
197 | + &portWindowLU, | |
198 | + &portWindowRU, | |
199 | + &portWindowLD, | |
200 | + &portWindowRD | |
184 | 201 | ); |
185 | 202 | |
186 | - float boardHeight = vectorLU.y - vectorLD.y; | |
203 | + float boardHeight = portWindowLU.y - portWindowLD.y; | |
187 | 204 | float keyboardWidth = m_KeyboardDesignMod.GetPortOriginX(0) * -2.0f; |
205 | + float portWidth = m_KeyboardDesignMod.GetChStep() * 16.0f; | |
206 | + | |
207 | + float resizeSacle = boardHeight / keyboardWidth; | |
208 | + float antiResizeScale = keyboardWidth / boardHeight; | |
188 | 209 | |
189 | 210 | float rippleSpacing = m_NoteDesignMod.GetRippleSpacing(); |
211 | + float rippleMargin = rippleSpacing * (MTNOTELYRICS_MAX_LYRICS_NUM + MTNOTERIPPLE_MAX_RIPPLE_NUM) * antiResizeScale; | |
190 | 212 | |
191 | 213 | //移動ベクトル:再生面に追従する |
192 | - moveVector2 = m_NoteDesignMod.GetWorldMoveVector(); | |
193 | - moveVector2.x += m_NoteDesignMod.GetPlayPosX(m_CurTickTime); | |
214 | + playbackPosVector = m_NoteDesignMod.GetWorldMoveVector(); | |
215 | + playbackPosVector.x += m_NoteDesignMod.GetPlayPosX(m_CurTickTime); | |
194 | 216 | |
195 | 217 | unsigned char lastPortNo = 0; |
196 | 218 | |
197 | - m_PortList.GetPort(m_PortList.GetSize()-1, &lastPortNo); | |
219 | + if (!m_isSingleKeyboard) { | |
220 | + //シングルキーボードでない場合、最終ポート番号を取得 | |
221 | + m_PortList.GetPort(m_PortList.GetSize()-1, &lastPortNo); | |
222 | + } | |
223 | + else { | |
224 | + //シングルキーボードの場合、最終ポート番号は0固定 | |
225 | + lastPortNo = 0; | |
226 | + } | |
198 | 227 | |
199 | 228 | for(portNo = 0; portNo <= lastPortNo; portNo ++) { |
200 | 229 | |
201 | - int portIndex = m_PortIndex[portNo]; | |
230 | + //ポート番号からキーボードインデックスを取得 | |
231 | + //シングルキーボードの場合、インデックスは0固定 | |
232 | + int keyboardIndex = !m_isSingleKeyboard ? m_KeyboardIndex[portNo] : 0; | |
202 | 233 | |
203 | - if(portIndex == -1) { | |
234 | + if(keyboardIndex == -1) { | |
204 | 235 | continue; |
205 | 236 | } |
206 | 237 | |
207 | - //ピッチベンドシフトの最大量を求める | |
208 | - float maxAbsPitchBendShift = 0.0f; | |
209 | - float curMaxPitchBendShift = 0.0f; | |
210 | - | |
211 | - for (chNo = 0; chNo < SM_MAX_CH_NUM; chNo++) { | |
212 | - | |
213 | - float pitchBendShift = _GetPichBendShiftPosX(portNo, chNo); | |
214 | - if(maxAbsPitchBendShift < fabs(pitchBendShift)) { | |
215 | - | |
216 | - curMaxPitchBendShift = pitchBendShift; | |
217 | - maxAbsPitchBendShift = fabs(pitchBendShift); | |
218 | - } | |
219 | - } | |
220 | - | |
221 | 238 | //移動ベクトル:キーボード基準座標 |
222 | - moveVector1 = m_KeyboardDesignMod.GetKeyboardBasePos(portIndex, 0, keyboardWidth / boardHeight); | |
239 | + transformVector = m_KeyboardDesignMod.GetKeyboardBasePos(keyboardIndex, 0, antiResizeScale); | |
223 | 240 | |
224 | 241 | //移動ベクトル:ピッチベンドシフトを反映 |
225 | - moveVector1.x += curMaxPitchBendShift; | |
242 | + transformVector.x += GetMaxPitchBendShift(portNo); | |
226 | 243 | |
227 | 244 | if(rollAngle < 0.0f) { |
228 | 245 | rollAngle += 360.0f; |
229 | 246 | } |
230 | 247 | |
231 | - float portWidth = m_KeyboardDesignMod.GetChStep() * 16.0f; | |
248 | + float portOriginY = portWidth * (m_PortList.GetSize() - keyboardIndex - 1) * antiResizeScale; | |
232 | 249 | |
233 | - if((rollAngle > 120.0f) && (rollAngle < 300.0f)) { | |
250 | + //鍵盤の1/2の幅だけ高音側に | |
251 | + transformVector.x += m_KeyboardDesignMod.GetWhiteKeyStep() / 2.0f; | |
234 | 252 | |
235 | - //鍵盤の1/2の幅だけ高音側に | |
236 | - moveVector1.x += m_KeyboardDesignMod.GetWhiteKeyStep() / 2.0f; | |
253 | + //鍵盤の1/4の高さだけ下に | |
254 | + transformVector.y -= m_KeyboardDesignMod.GetWhiteKeyHeight() / 4.0f; | |
255 | + | |
256 | + if((rollAngle > 120.0f) && (rollAngle < 300.0f)) { | |
237 | 257 | |
238 | 258 | //ポート原点Y |
239 | - moveVector1.y -= portWidth * (m_PortList.GetSize() - portIndex - 1) * (keyboardWidth / boardHeight); | |
259 | + transformVector.y -= portOriginY; | |
240 | 260 | |
241 | 261 | //鍵盤の原点をCh15に |
242 | - moveVector1.y -= m_KeyboardDesignMod.GetChStep() * (keyboardWidth / boardHeight) * 15.0f; | |
243 | - | |
244 | - //鍵盤の1/4の高さだけ下に | |
245 | - moveVector1.y -= m_KeyboardDesignMod.GetWhiteKeyHeight() / 4.0f; | |
262 | + transformVector.y -= m_KeyboardDesignMod.GetChStep() * 15.0f * antiResizeScale; | |
246 | 263 | |
247 | 264 | //鍵盤の長さ+リップルマージン+歌詞マージンだけ手前に |
248 | - moveVector1.z -= m_KeyboardDesignMod.GetWhiteKeyLen() + rippleSpacing * (MTNOTELYRICS_MAX_LYRICS_NUM + MTNOTERIPPLE_MAX_RIPPLE_NUM) * (keyboardWidth / boardHeight); | |
265 | + transformVector.z -= m_KeyboardDesignMod.GetWhiteKeyLen() + rippleMargin; | |
249 | 266 | |
250 | 267 | } else { |
251 | 268 | |
252 | - //鍵盤の1/2の幅だけ高音側に | |
253 | - moveVector1.x += m_KeyboardDesignMod.GetWhiteKeyStep() / 2.0f; | |
254 | - | |
255 | 269 | //ポート原点Y |
256 | - moveVector1.y += portWidth * (m_PortList.GetSize() - portIndex - 1) * (keyboardWidth / boardHeight); | |
257 | - | |
258 | - //鍵盤の1/4の高さだけ下に | |
259 | - moveVector1.y -= m_KeyboardDesignMod.GetWhiteKeyHeight() / 4.0f; | |
270 | + transformVector.y += portOriginY; | |
260 | 271 | |
261 | 272 | //リップルマージン+歌詞マージンだけ奥に |
262 | - moveVector1.z += 0.002f * (MTNOTELYRICS_MAX_LYRICS_NUM + MTNOTERIPPLE_MAX_RIPPLE_NUM) * (keyboardWidth / boardHeight); | |
273 | + transformVector.z += rippleMargin; | |
263 | 274 | } |
264 | 275 | |
265 | 276 | //キーボード移動 |
266 | - result = m_pPianoKeyboard[portIndex]->Transform(pD3DDevice, moveVector1, moveVector2, boardHeight / keyboardWidth, vectorLU.z, rollAngle); | |
277 | + result = m_pPianoKeyboard[keyboardIndex]->Transform(pD3DDevice, transformVector, playbackPosVector, resizeSacle, portWindowLU.z, rollAngle); | |
267 | 278 | if (result != 0) goto EXIT; |
268 | 279 | } |
269 | 280 |
@@ -312,8 +323,8 @@ int MTPianoKeyboardCtrlMod::_UpdateNoteStatus( | ||
312 | 323 | //ノートOFF後(キー復帰済み) |
313 | 324 | else { |
314 | 325 | //ノート情報を破棄 |
315 | - //複数チャンネルのキー状態をポート別に集約する | |
316 | - result = m_pPianoKeyboard[m_PortIndex[note.portNo]]->ResetKey(note.noteNo); | |
326 | + //発音中のキーをリセットする | |
327 | + result = m_pPianoKeyboard[_GetKeyboardIndexFromNote(note)]->ResetKey(note.noteNo); | |
317 | 328 | if (result != 0) goto EXIT; |
318 | 329 | |
319 | 330 | pNoteStatus->isActive = false; |
@@ -322,6 +333,12 @@ int MTPianoKeyboardCtrlMod::_UpdateNoteStatus( | ||
322 | 333 | pNoteStatus->keyDownRate = 0.0f; |
323 | 334 | } |
324 | 335 | |
336 | + //状態更新後、発音中であれば | |
337 | + if (pNoteStatus->isActive) { | |
338 | + //アクティブポートフラグを立てる | |
339 | + m_isActivePort[note.portNo] = true; | |
340 | + } | |
341 | + | |
325 | 342 | EXIT:; |
326 | 343 | return result; |
327 | 344 | } |
@@ -338,6 +355,7 @@ int MTPianoKeyboardCtrlMod::_UpdateVertexOfActiveNotes( | ||
338 | 355 | unsigned long elapsedTime = 0; |
339 | 356 | SMNote note; |
340 | 357 | D3DXCOLOR noteColor; |
358 | + unsigned char notePortNo; | |
341 | 359 | |
342 | 360 | ZeroMemory(m_KeyDownRateMod, sizeof(float) * SM_MAX_CH_NUM* SM_MAX_CH_NUM * SM_MAX_NOTE_NUM); |
343 | 361 |
@@ -358,21 +376,32 @@ int MTPianoKeyboardCtrlMod::_UpdateVertexOfActiveNotes( | ||
358 | 376 | |
359 | 377 | //ノートの色 |
360 | 378 | noteColor = m_NoteDesignMod.GetNoteBoxColor(note.portNo, note.chNo, note.noteNo); |
361 | - | |
379 | + | |
380 | + //シングルキーボードでない場合 | |
381 | + if (!m_isSingleKeyboard) { | |
382 | + //ノートのポート番号を取得 | |
383 | + notePortNo = note.portNo; | |
384 | + } | |
385 | + //シングルキーボードの場合 | |
386 | + else { | |
387 | + //ノートのポート番号を0固定に | |
388 | + notePortNo = 0; | |
389 | + } | |
390 | + | |
362 | 391 | //発音対象キーを回転 |
363 | 392 | // すでに同一ノートに対して頂点を更新している場合 |
364 | 393 | // 押下率が前回よりも上回る場合に限り頂点を更新する |
365 | - if (m_KeyDownRateMod[note.portNo][note.chNo][note.noteNo] < m_pNoteStatus[i].keyDownRate) { | |
394 | + if (m_KeyDownRateMod[notePortNo][note.chNo][note.noteNo] < m_pNoteStatus[i].keyDownRate) { | |
366 | 395 | //複数チャンネルのキー状態をポート別に集約する |
367 | - result = m_pPianoKeyboard[m_PortIndex[note.portNo]]->PushKey( | |
368 | - note.chNo, | |
369 | - note.noteNo, | |
370 | - m_pNoteStatus[i].keyDownRate, | |
371 | - elapsedTime, | |
372 | - ¬eColor | |
373 | - ); | |
396 | + result = m_pPianoKeyboard[_GetKeyboardIndexFromNote(note)]->PushKey( | |
397 | + note.chNo, | |
398 | + note.noteNo, | |
399 | + m_pNoteStatus[i].keyDownRate, | |
400 | + elapsedTime, | |
401 | + ¬eColor | |
402 | + ); | |
374 | 403 | if (result != 0) goto EXIT; |
375 | - m_KeyDownRateMod[note.portNo][note.chNo][note.noteNo] = m_pNoteStatus[i].keyDownRate; | |
404 | + m_KeyDownRateMod[notePortNo][note.chNo][note.noteNo] = m_pNoteStatus[i].keyDownRate; | |
376 | 405 | } |
377 | 406 | } |
378 | 407 |
@@ -388,19 +417,25 @@ int MTPianoKeyboardCtrlMod::Draw( | ||
388 | 417 | ) |
389 | 418 | { |
390 | 419 | int result = 0; |
391 | - unsigned char portIndex = 0; | |
420 | + unsigned char index = 0; | |
392 | 421 | unsigned long count = 0; |
393 | 422 | unsigned long dispNum = 0; |
394 | 423 | |
395 | 424 | if (!m_isEnable) goto EXIT; |
396 | 425 | |
426 | + //レンダリングステート設定:Zバッファへの書き込みオフ | |
427 | +// pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); | |
428 | + | |
397 | 429 | //キーボードの描画 |
398 | - for (portIndex = 0; portIndex < m_MaxPortIndex; portIndex++) { | |
430 | + for (index = 0; index < m_MaxKeyboardIndex; index++) { | |
399 | 431 | |
400 | - result = m_pPianoKeyboard[portIndex]->Draw(pD3DDevice); | |
432 | + result = m_pPianoKeyboard[index]->Draw(pD3DDevice); | |
401 | 433 | if (result != 0) goto EXIT; |
402 | 434 | } |
403 | 435 | |
436 | + //レンダリングステート設定:Zバッファへの書き込みオン | |
437 | +// pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); | |
438 | + | |
404 | 439 | EXIT:; |
405 | 440 | return result; |
406 | 441 | } |
@@ -423,8 +458,8 @@ void MTPianoKeyboardCtrlMod::Reset() | ||
423 | 458 | result = m_NoteListRT.GetNote(m_pNoteStatus[i].index, ¬e); |
424 | 459 | //if (result != 0) goto EXIT; |
425 | 460 | |
426 | - //複数チャンネルのキー状態をポート別に集約する | |
427 | - result = m_pPianoKeyboard[m_PortIndex[note.portNo]]->ResetKey(note.noteNo); | |
461 | + //発音中のキーをリセットする | |
462 | + result = m_pPianoKeyboard[_GetKeyboardIndexFromNote(note)]->ResetKey(note.noteNo); | |
428 | 463 | //if (result != 0) goto EXIT; |
429 | 464 | } |
430 | 465 | m_pNoteStatus[i].isActive = false; |
@@ -435,3 +470,53 @@ void MTPianoKeyboardCtrlMod::Reset() | ||
435 | 470 | |
436 | 471 | return; |
437 | 472 | } |
473 | + | |
474 | +int MTPianoKeyboardCtrlMod::_GetKeyboardIndexFromNote(const SMNote ¬e) | |
475 | +{ | |
476 | + //シングルキーボードでない場合 | |
477 | + if (!m_isSingleKeyboard) { | |
478 | + //ノートのピアノ番号を取得 | |
479 | + return m_KeyboardIndex[note.portNo]; | |
480 | + } | |
481 | + //シングルキーボードの場合 | |
482 | + else { | |
483 | + //ノートのピアノ番号を0固定に | |
484 | + return 0; | |
485 | + } | |
486 | +} | |
487 | + | |
488 | +//****************************************************************************** | |
489 | +// ピッチベンドシフトの最大量を求める | |
490 | +//****************************************************************************** | |
491 | +float MTPianoKeyboardCtrlMod::GetMaxPitchBendShift(unsigned char portNo) { | |
492 | + | |
493 | + float max = 0.0f; | |
494 | + float cur = 0.0f; | |
495 | + | |
496 | + //シングルキーボードでない場合、指定のポート番号から求める | |
497 | + //シングルキーボードの場合、シーケンスに含まれるポート番号すべてから求める | |
498 | + int portListSize = !m_isSingleKeyboard ? 1 : m_PortList.GetSize(); | |
499 | + | |
500 | + for (int i = 0; i < portListSize; i++) { | |
501 | + | |
502 | + if (m_isSingleKeyboard) { | |
503 | + m_PortList.GetPort(i, &portNo); | |
504 | + } | |
505 | + | |
506 | + if (!m_isActivePort[portNo]) { | |
507 | + continue; | |
508 | + } | |
509 | + | |
510 | + for (unsigned char chNo = 0; chNo < SM_MAX_CH_NUM; chNo++) { | |
511 | + | |
512 | + float pitchBendShift = _GetPichBendShiftPosX(portNo, chNo); | |
513 | + if(max < fabs(pitchBendShift)) { | |
514 | + | |
515 | + cur = pitchBendShift; | |
516 | + max = fabs(pitchBendShift); | |
517 | + } | |
518 | + } | |
519 | + } | |
520 | + | |
521 | + return cur; | |
522 | +} | |
\ No newline at end of file |
@@ -58,8 +58,13 @@ private: | ||
58 | 58 | |
59 | 59 | //ポートリスト |
60 | 60 | SMPortList m_PortList; |
61 | - int m_PortIndex[SM_MAX_PORT_NUM]; | |
62 | - unsigned char m_MaxPortIndex; | |
61 | + | |
62 | + //アクティブポートフラグ | |
63 | + bool m_isActivePort[SM_MAX_PORT_NUM]; | |
64 | + | |
65 | + //キーボードインデックス | |
66 | + int m_KeyboardIndex[SM_MAX_PORT_NUM]; | |
67 | + unsigned char m_MaxKeyboardIndex; | |
63 | 68 | |
64 | 69 | //キー押下率配列 |
65 | 70 | float m_KeyDownRateMod[SM_MAX_CH_NUM][SM_MAX_CH_NUM][SM_MAX_NOTE_NUM]; |
@@ -73,6 +78,9 @@ private: | ||
73 | 78 | ); |
74 | 79 | virtual int _UpdateVertexOfActiveNotes(LPDIRECT3DDEVICE9 pD3DDevice); |
75 | 80 | |
81 | + int _GetKeyboardIndexFromNote(const SMNote ¬e); | |
82 | + | |
83 | + float GetMaxPitchBendShift(unsigned char portNo); | |
76 | 84 | }; |
77 | 85 | |
78 | 86 |
@@ -916,6 +916,16 @@ unsigned long MTPianoKeyboardDesign::GetKeyboardMaxDispNum() | ||
916 | 916 | return (unsigned long)m_KeyboardMaxDispNum; |
917 | 917 | } |
918 | 918 | |
919 | +// >>> add 20180404 yossiepon begin | |
920 | +//****************************************************************************** | |
921 | +// キーボード表示数設定 | |
922 | +//****************************************************************************** | |
923 | +void MTPianoKeyboardDesign::SetKeyboardSingle() | |
924 | +{ | |
925 | + m_KeyboardMaxDispNum = 1; | |
926 | +} | |
927 | +// <<< add 20180404 yossiepon end | |
928 | + | |
919 | 929 | //****************************************************************************** |
920 | 930 | // キー表示範囲:開始 |
921 | 931 | //****************************************************************************** |
@@ -189,6 +189,10 @@ public: | ||
189 | 189 | //キーボード最大表示数取得 |
190 | 190 | unsigned long GetKeyboardMaxDispNum(); |
191 | 191 | |
192 | +// >>> add 20180404 yossiepon begin | |
193 | + void SetKeyboardSingle(); | |
194 | +// <<< add 20180404 yossiepon end | |
195 | + | |
192 | 196 | //キー表示範囲取得 |
193 | 197 | unsigned char GetKeyDispRangeStart(); |
194 | 198 | unsigned char GetKeyDispRangeEnd(); |
@@ -17,6 +17,7 @@ | ||
17 | 17 | //****************************************************************************** |
18 | 18 | MTScenePianoRoll2DMod::MTScenePianoRoll2DMod(void) |
19 | 19 | { |
20 | + m_IsSingleKeyboard = true; | |
20 | 21 | } |
21 | 22 | |
22 | 23 | //****************************************************************************** |
@@ -7,6 +7,7 @@ mail: yoshy@users.sourceforge.jp | ||
7 | 7 | ・[UPDATE] 1.2.3をマージ |
8 | 8 | ・[ADD] リップルと背景画像のブレンド方法を指定できる設定を追加 |
9 | 9 | →INIファイル中のRippleセクション SrcBlendおよびDestBlend |
10 | +・[FIX] 多ポートのシーケンスでPianoRoll2Dのキーボードが1つに集約されない不具合を修正 | |
10 | 11 | |
11 | 12 | 改造点 20170528: |
12 | 13 | ・[FIX] タイトル(シーケンス名)が空の場合、ファイル名を代替表示するよう修正 |