//======================================================== // Multiple musical lines played at the same time: public class CCompoundMusicLine // Hungarian: cml { // Members CStanza m_pstzParent; boolean m_bCadence; CMusicLine m_arrpMusicLines[]; int m_iNumLines; int m_iNumAllocatedLines; // Memoization: int iMemoizedBeatNum = -1; int iMemoizedNumLines = -1; int bMemoizedAnswer = -1; CCompoundMusicLine pcmlMemoized = null; public void assert(boolean b) { if (!b) m_arrpMusicLines[-1] = null; } // Operations //------------------------------- public CNote pNoteToPlay (int iCurrBeatNum) { assert(m_iNumLines > 0); CSection sec = m_pstzParent.m_psecParent; for (int C=0; C= m_iNumLines); m_arrpMusicLines[m_iNumLines-1] = new CMusicLine(this, m_pstzParent.plyrGetLayer(m_iNumLines-1)); assert(m_arrpMusicLines[m_iNumLines-1]!=null); m_arrpMusicLines[m_iNumLines-1].SetCenterNote((char)iCenterNote); } //------------------------------- public CMusicLine pmlnGetLine (int index) { assert(0<=index); if (m_iNumLines <= index) return null; return m_arrpMusicLines[index]; } //------------------------------- public boolean bDonePlaying (int iCurrBeatNum) { // This line's not over until the beat number is outside // all my sub-lines. if (iMemoizedNumLines == m_iNumLines && iMemoizedBeatNum == iCurrBeatNum && pcmlMemoized == this) { //tw.spr("Memo'ed %d from %d %d %x\r", bMemoizedAnswer, m_iNumLines, iCurrBeatNum, this); return (bMemoizedAnswer != 0); } iMemoizedBeatNum = iCurrBeatNum; iMemoizedNumLines = m_iNumLines; pcmlMemoized = this; // Ignore subsequent changes in line rhythms. for (int C=0; C 0); for (int C=0; C